Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-x.htaccess2
-rwxr-xr-x.project17
-rwxr-xr-xindex.php110
-rwxr-xr-xlibs/HTML/Common.php464
-rwxr-xr-xlibs/HTML/QuickForm.php2054
-rwxr-xr-xlibs/HTML/QuickForm/Renderer.php158
-rwxr-xr-xlibs/HTML/QuickForm/Renderer/Array.php340
-rwxr-xr-xlibs/HTML/QuickForm/Renderer/ArraySmarty.php402
-rwxr-xr-xlibs/HTML/QuickForm/Renderer/Default.php485
-rwxr-xr-xlibs/HTML/QuickForm/Renderer/ITDynamic.php300
-rwxr-xr-xlibs/HTML/QuickForm/Renderer/ITStatic.php504
-rwxr-xr-xlibs/HTML/QuickForm/Renderer/Object.php461
-rwxr-xr-xlibs/HTML/QuickForm/Renderer/ObjectFlexy.php291
-rwxr-xr-xlibs/HTML/QuickForm/Renderer/QuickHtml.php213
-rwxr-xr-xlibs/HTML/QuickForm/Rule.php82
-rwxr-xr-xlibs/HTML/QuickForm/Rule/Callback.php124
-rwxr-xr-xlibs/HTML/QuickForm/Rule/Compare.php105
-rwxr-xr-xlibs/HTML/QuickForm/Rule/Email.php73
-rwxr-xr-xlibs/HTML/QuickForm/Rule/Range.php75
-rwxr-xr-xlibs/HTML/QuickForm/Rule/Regex.php101
-rwxr-xr-xlibs/HTML/QuickForm/Rule/Required.php63
-rwxr-xr-xlibs/HTML/QuickForm/RuleRegistry.php349
-rwxr-xr-xlibs/HTML/QuickForm/advcheckbox.php286
-rwxr-xr-xlibs/HTML/QuickForm/autocomplete.php258
-rwxr-xr-xlibs/HTML/QuickForm/button.php80
-rwxr-xr-xlibs/HTML/QuickForm/checkbox.php277
-rwxr-xr-xlibs/HTML/QuickForm/date.php511
-rwxr-xr-xlibs/HTML/QuickForm/element.php494
-rwxr-xr-xlibs/HTML/QuickForm/file.php358
-rwxr-xr-xlibs/HTML/QuickForm/group.php588
-rwxr-xr-xlibs/HTML/QuickForm/header.php74
-rwxr-xr-xlibs/HTML/QuickForm/hidden.php94
-rwxr-xr-xlibs/HTML/QuickForm/hiddenselect.php118
-rwxr-xr-xlibs/HTML/QuickForm/hierselect.php593
-rwxr-xr-xlibs/HTML/QuickForm/html.php77
-rwxr-xr-xlibs/HTML/QuickForm/image.php127
-rwxr-xr-xlibs/HTML/QuickForm/input.php209
-rwxr-xr-xlibs/HTML/QuickForm/link.php200
-rwxr-xr-xlibs/HTML/QuickForm/password.php115
-rwxr-xr-xlibs/HTML/QuickForm/radio.php251
-rwxr-xr-xlibs/HTML/QuickForm/reset.php79
-rwxr-xr-xlibs/HTML/QuickForm/select.php614
-rwxr-xr-xlibs/HTML/QuickForm/static.php201
-rwxr-xr-xlibs/HTML/QuickForm/submit.php89
-rwxr-xr-xlibs/HTML/QuickForm/text.php98
-rwxr-xr-xlibs/HTML/QuickForm/textarea.php229
-rwxr-xr-xlibs/HTML/QuickForm/xbutton.php153
-rwxr-xr-xlibs/PEAR.php1108
-rwxr-xr-xlibs/Smarty/Config_File.class.php389
-rwxr-xr-xlibs/Smarty/Smarty.class.php1944
-rwxr-xr-xlibs/Smarty/Smarty_Compiler.class.php2327
-rwxr-xr-xlibs/Smarty/debug.tpl157
-rwxr-xr-xlibs/Smarty/internals/core.assemble_plugin_filepath.php67
-rwxr-xr-xlibs/Smarty/internals/core.assign_smarty_interface.php43
-rwxr-xr-xlibs/Smarty/internals/core.create_dir_structure.php79
-rwxr-xr-xlibs/Smarty/internals/core.display_debug_console.php61
-rwxr-xr-xlibs/Smarty/internals/core.get_include_path.php44
-rwxr-xr-xlibs/Smarty/internals/core.get_microtime.php23
-rwxr-xr-xlibs/Smarty/internals/core.get_php_resource.php80
-rwxr-xr-xlibs/Smarty/internals/core.is_secure.php59
-rwxr-xr-xlibs/Smarty/internals/core.is_trusted.php47
-rwxr-xr-xlibs/Smarty/internals/core.load_plugins.php125
-rwxr-xr-xlibs/Smarty/internals/core.load_resource_plugin.php74
-rwxr-xr-xlibs/Smarty/internals/core.process_cached_inserts.php71
-rwxr-xr-xlibs/Smarty/internals/core.process_compiled_include.php37
-rwxr-xr-xlibs/Smarty/internals/core.read_cache_file.php101
-rwxr-xr-xlibs/Smarty/internals/core.rm_auto.php71
-rwxr-xr-xlibs/Smarty/internals/core.rmdir.php54
-rwxr-xr-xlibs/Smarty/internals/core.run_insert_handler.php71
-rwxr-xr-xlibs/Smarty/internals/core.smarty_include_php.php50
-rwxr-xr-xlibs/Smarty/internals/core.write_cache_file.php96
-rwxr-xr-xlibs/Smarty/internals/core.write_compiled_include.php91
-rwxr-xr-xlibs/Smarty/internals/core.write_compiled_resource.php35
-rwxr-xr-xlibs/Smarty/internals/core.write_file.php54
-rwxr-xr-xlibs/Smarty/plugins/block.textformat.php103
-rwxr-xr-xlibs/Smarty/plugins/compiler.assign.php40
-rwxr-xr-xlibs/Smarty/plugins/function.assign_debug_info.php40
-rwxr-xr-xlibs/Smarty/plugins/function.config_load.php142
-rwxr-xr-xlibs/Smarty/plugins/function.counter.php80
-rwxr-xr-xlibs/Smarty/plugins/function.cycle.php102
-rwxr-xr-xlibs/Smarty/plugins/function.debug.php35
-rwxr-xr-xlibs/Smarty/plugins/function.eval.php49
-rwxr-xr-xlibs/Smarty/plugins/function.fetch.php221
-rwxr-xr-xlibs/Smarty/plugins/function.html_checkboxes.php143
-rwxr-xr-xlibs/Smarty/plugins/function.html_image.php142
-rwxr-xr-xlibs/Smarty/plugins/function.html_options.php122
-rwxr-xr-xlibs/Smarty/plugins/function.html_radios.php156
-rwxr-xr-xlibs/Smarty/plugins/function.html_select_date.php331
-rwxr-xr-xlibs/Smarty/plugins/function.html_select_time.php194
-rwxr-xr-xlibs/Smarty/plugins/function.html_table.php177
-rwxr-xr-xlibs/Smarty/plugins/function.mailto.php165
-rwxr-xr-xlibs/Smarty/plugins/function.math.php84
-rwxr-xr-xlibs/Smarty/plugins/function.popup.php119
-rwxr-xr-xlibs/Smarty/plugins/function.popup_init.php40
-rwxr-xr-xlibs/Smarty/plugins/modifier.capitalize.php43
-rwxr-xr-xlibs/Smarty/plugins/modifier.cat.php33
-rwxr-xr-xlibs/Smarty/plugins/modifier.count_characters.php32
-rwxr-xr-xlibs/Smarty/plugins/modifier.count_paragraphs.php29
-rwxr-xr-xlibs/Smarty/plugins/modifier.count_sentences.php29
-rwxr-xr-xlibs/Smarty/plugins/modifier.count_words.php33
-rwxr-xr-xlibs/Smarty/plugins/modifier.date_format.php58
-rwxr-xr-xlibs/Smarty/plugins/modifier.debug_print_var.php90
-rwxr-xr-xlibs/Smarty/plugins/modifier.default.php32
-rwxr-xr-xlibs/Smarty/plugins/modifier.escape.php93
-rwxr-xr-xlibs/Smarty/plugins/modifier.indent.php28
-rwxr-xr-xlibs/Smarty/plugins/modifier.lower.php26
-rwxr-xr-xlibs/Smarty/plugins/modifier.nl2br.php35
-rwxr-xr-xlibs/Smarty/plugins/modifier.regex_replace.php35
-rwxr-xr-xlibs/Smarty/plugins/modifier.replace.php30
-rwxr-xr-xlibs/Smarty/plugins/modifier.spacify.php30
-rwxr-xr-xlibs/Smarty/plugins/modifier.string_format.php29
-rwxr-xr-xlibs/Smarty/plugins/modifier.strip.php33
-rwxr-xr-xlibs/Smarty/plugins/modifier.strip_tags.php32
-rwxr-xr-xlibs/Smarty/plugins/modifier.truncate.php50
-rwxr-xr-xlibs/Smarty/plugins/modifier.upper.php26
-rwxr-xr-xlibs/Smarty/plugins/modifier.wordwrap.php29
-rwxr-xr-xlibs/Smarty/plugins/outputfilter.trimwhitespace.php75
-rwxr-xr-xlibs/Smarty/plugins/shared.escape_special_chars.php31
-rwxr-xr-xlibs/Smarty/plugins/shared.make_timestamp.php46
-rwxr-xr-xlibs/Zend/Acl.php1001
-rwxr-xr-xlibs/Zend/Acl/Assert/Interface.php65
-rwxr-xr-xlibs/Zend/Acl/Exception.php37
-rwxr-xr-xlibs/Zend/Acl/Resource.php66
-rwxr-xr-xlibs/Zend/Acl/Resource/Interface.php38
-rwxr-xr-xlibs/Zend/Acl/Role.php66
-rwxr-xr-xlibs/Zend/Acl/Role/Interface.php38
-rwxr-xr-xlibs/Zend/Acl/Role/Registry.php249
-rwxr-xr-xlibs/Zend/Acl/Role/Registry/Exception.php37
-rwxr-xr-xlibs/Zend/Auth.php162
-rwxr-xr-xlibs/Zend/Auth/Adapter/DbTable.php354
-rwxr-xr-xlibs/Zend/Auth/Adapter/Digest.php229
-rwxr-xr-xlibs/Zend/Auth/Adapter/Exception.php37
-rwxr-xr-xlibs/Zend/Auth/Adapter/Http.php834
-rwxr-xr-xlibs/Zend/Auth/Adapter/Http/Resolver/Exception.php41
-rwxr-xr-xlibs/Zend/Auth/Adapter/Http/Resolver/File.php168
-rwxr-xr-xlibs/Zend/Auth/Adapter/Http/Resolver/Interface.php48
-rwxr-xr-xlibs/Zend/Auth/Adapter/Interface.php45
-rwxr-xr-xlibs/Zend/Auth/Exception.php37
-rwxr-xr-xlibs/Zend/Auth/Result.php149
-rwxr-xr-xlibs/Zend/Auth/Storage/Exception.php37
-rwxr-xr-xlibs/Zend/Auth/Storage/Interface.php66
-rwxr-xr-xlibs/Zend/Auth/Storage/NonPersistent.php96
-rwxr-xr-xlibs/Zend/Auth/Storage/Session.php148
-rwxr-xr-xlibs/Zend/Cache.php119
-rwxr-xr-xlibs/Zend/Cache/Backend.php224
-rwxr-xr-xlibs/Zend/Cache/Backend/Apc.php161
-rwxr-xr-xlibs/Zend/Cache/Backend/File.php654
-rwxr-xr-xlibs/Zend/Cache/Backend/Interface.php98
-rwxr-xr-xlibs/Zend/Cache/Backend/Memcached.php225
-rwxr-xr-xlibs/Zend/Cache/Backend/Sqlite.php411
-rwxr-xr-xlibs/Zend/Cache/Backend/Test.php259
-rwxr-xr-xlibs/Zend/Cache/Backend/ZendPlatform.php295
-rwxr-xr-xlibs/Zend/Cache/Core.php474
-rwxr-xr-xlibs/Zend/Cache/EXAMPLES.txt373
-rwxr-xr-xlibs/Zend/Cache/Exception.php31
-rwxr-xr-xlibs/Zend/Cache/Frontend/Class.php190
-rwxr-xr-xlibs/Zend/Cache/Frontend/File.php115
-rwxr-xr-xlibs/Zend/Cache/Frontend/Function.php143
-rwxr-xr-xlibs/Zend/Cache/Frontend/Output.php84
-rwxr-xr-xlibs/Zend/Cache/Frontend/Page.php313
-rwxr-xr-xlibs/Zend/Cache/TODO.txt9
-rwxr-xr-xlibs/Zend/Config.php291
-rwxr-xr-xlibs/Zend/Config/Exception.php33
-rwxr-xr-xlibs/Zend/Config/Ini.php211
-rwxr-xr-xlibs/Zend/Config/Xml.php162
-rwxr-xr-xlibs/Zend/Controller/Action.php669
-rwxr-xr-xlibs/Zend/Controller/Action/Exception.php36
-rwxr-xr-xlibs/Zend/Controller/Action/Helper/Abstract.php153
-rwxr-xr-xlibs/Zend/Controller/Action/Helper/FlashMessenger.php232
-rwxr-xr-xlibs/Zend/Controller/Action/Helper/Redirector.php482
-rwxr-xr-xlibs/Zend/Controller/Action/Helper/Url.php128
-rwxr-xr-xlibs/Zend/Controller/Action/Helper/ViewRenderer.php826
-rwxr-xr-xlibs/Zend/Controller/Action/HelperBroker.php370
-rwxr-xr-xlibs/Zend/Controller/Dispatcher/Abstract.php448
-rwxr-xr-xlibs/Zend/Controller/Dispatcher/Exception.php36
-rwxr-xr-xlibs/Zend/Controller/Dispatcher/Interface.php172
-rwxr-xr-xlibs/Zend/Controller/Dispatcher/Standard.php411
-rwxr-xr-xlibs/Zend/Controller/Exception.php34
-rwxr-xr-xlibs/Zend/Controller/Front.php951
-rwxr-xr-xlibs/Zend/Controller/Plugin/Abstract.php156
-rwxr-xr-xlibs/Zend/Controller/Plugin/Broker.php361
-rwxr-xr-xlibs/Zend/Controller/Plugin/ErrorHandler.php253
-rwxr-xr-xlibs/Zend/Controller/Request/Abstract.php338
-rwxr-xr-xlibs/Zend/Controller/Request/Apache404.php80
-rwxr-xr-xlibs/Zend/Controller/Request/Exception.php36
-rwxr-xr-xlibs/Zend/Controller/Request/Http.php759
-rwxr-xr-xlibs/Zend/Controller/Response/Abstract.php739
-rwxr-xr-xlibs/Zend/Controller/Response/Cli.php67
-rwxr-xr-xlibs/Zend/Controller/Response/Exception.php34
-rwxr-xr-xlibs/Zend/Controller/Response/Http.php37
-rwxr-xr-xlibs/Zend/Controller/Router/Abstract.php184
-rwxr-xr-xlibs/Zend/Controller/Router/Exception.php35
-rwxr-xr-xlibs/Zend/Controller/Router/Interface.php89
-rwxr-xr-xlibs/Zend/Controller/Router/Rewrite.php278
-rwxr-xr-xlibs/Zend/Controller/Router/Route.php290
-rwxr-xr-xlibs/Zend/Controller/Router/Route/Interface.php38
-rwxr-xr-xlibs/Zend/Controller/Router/Route/Module.php239
-rwxr-xr-xlibs/Zend/Controller/Router/Route/Regex.php185
-rwxr-xr-xlibs/Zend/Controller/Router/Route/Static.php110
-rwxr-xr-xlibs/Zend/Controller/TODO.txt2
-rwxr-xr-xlibs/Zend/Date.php4460
-rwxr-xr-xlibs/Zend/Date/Cities.php315
-rwxr-xr-xlibs/Zend/Date/DateObject.php1013
-rwxr-xr-xlibs/Zend/Date/Exception.php49
-rwxr-xr-xlibs/Zend/Db.php177
-rwxr-xr-xlibs/Zend/Db/Adapter/Abstract.php911
-rwxr-xr-xlibs/Zend/Db/Adapter/Db2.php606
-rwxr-xr-xlibs/Zend/Db/Adapter/Db2/Exception.php45
-rwxr-xr-xlibs/Zend/Db/Adapter/Exception.php52
-rwxr-xr-xlibs/Zend/Db/Adapter/Mysqli.php432
-rwxr-xr-xlibs/Zend/Db/Adapter/Mysqli/Exception.php39
-rwxr-xr-xlibs/Zend/Db/Adapter/Oracle.php593
-rwxr-xr-xlibs/Zend/Db/Adapter/Oracle/Exception.php59
-rwxr-xr-xlibs/Zend/Db/Adapter/Pdo/Abstract.php303
-rwxr-xr-xlibs/Zend/Db/Adapter/Pdo/Mssql.php290
-rwxr-xr-xlibs/Zend/Db/Adapter/Pdo/Mysql.php200
-rwxr-xr-xlibs/Zend/Db/Adapter/Pdo/Oci.php310
-rwxr-xr-xlibs/Zend/Db/Adapter/Pdo/Pgsql.php281
-rwxr-xr-xlibs/Zend/Db/Adapter/Pdo/Sqlite.php262
-rwxr-xr-xlibs/Zend/Db/Exception.php34
-rwxr-xr-xlibs/Zend/Db/Expr.php78
-rwxr-xr-xlibs/Zend/Db/Profiler.php461
-rwxr-xr-xlibs/Zend/Db/Profiler/Exception.php41
-rwxr-xr-xlibs/Zend/Db/Profiler/Query.php190
-rwxr-xr-xlibs/Zend/Db/Select.php852
-rwxr-xr-xlibs/Zend/Db/Select/Exception.php38
-rwxr-xr-xlibs/Zend/Db/Statement.php445
-rwxr-xr-xlibs/Zend/Db/Statement/Db2.php356
-rwxr-xr-xlibs/Zend/Db/Statement/Db2/Exception.php58
-rwxr-xr-xlibs/Zend/Db/Statement/Exception.php38
-rwxr-xr-xlibs/Zend/Db/Statement/Interface.php202
-rwxr-xr-xlibs/Zend/Db/Statement/Mysqli.php344
-rwxr-xr-xlibs/Zend/Db/Statement/Mysqli/Exception.php36
-rwxr-xr-xlibs/Zend/Db/Statement/Oracle.php531
-rwxr-xr-xlibs/Zend/Db/Statement/Oracle/Exception.php58
-rwxr-xr-xlibs/Zend/Db/Statement/Pdo.php422
-rwxr-xr-xlibs/Zend/Db/Table.php39
-rwxr-xr-xlibs/Zend/Db/Table/Abstract.php1110
-rwxr-xr-xlibs/Zend/Db/Table/Exception.php37
-rwxr-xr-xlibs/Zend/Db/Table/Row.php43
-rwxr-xr-xlibs/Zend/Db/Table/Row/Abstract.php903
-rwxr-xr-xlibs/Zend/Db/Table/Row/Exception.php37
-rwxr-xr-xlibs/Zend/Db/Table/Rowset.php43
-rwxr-xr-xlibs/Zend/Db/Table/Rowset/Abstract.php308
-rwxr-xr-xlibs/Zend/Debug.php103
-rwxr-xr-xlibs/Zend/Exception.php30
-rwxr-xr-xlibs/Zend/Feed.php395
-rwxr-xr-xlibs/Zend/Feed/Abstract.php242
-rwxr-xr-xlibs/Zend/Feed/Atom.php381
-rwxr-xr-xlibs/Zend/Feed/Builder.php383
-rwxr-xr-xlibs/Zend/Feed/Builder/Entry.php283
-rwxr-xr-xlibs/Zend/Feed/Builder/Exception.php40
-rwxr-xr-xlibs/Zend/Feed/Builder/Header.php396
-rwxr-xr-xlibs/Zend/Feed/Builder/Header/Itunes.php267
-rwxr-xr-xlibs/Zend/Feed/Builder/Interface.php52
-rwxr-xr-xlibs/Zend/Feed/Element.php403
-rwxr-xr-xlibs/Zend/Feed/Entry/Abstract.php106
-rwxr-xr-xlibs/Zend/Feed/Entry/Atom.php231
-rwxr-xr-xlibs/Zend/Feed/Entry/Rss.php47
-rwxr-xr-xlibs/Zend/Feed/Exception.php42
-rwxr-xr-xlibs/Zend/Feed/Rss.php496
-rwxr-xr-xlibs/Zend/Filter.php107
-rwxr-xr-xlibs/Zend/Filter/Alnum.php87
-rwxr-xr-xlibs/Zend/Filter/Alpha.php86
-rwxr-xr-xlibs/Zend/Filter/BaseName.php50
-rwxr-xr-xlibs/Zend/Filter/Digits.php79
-rwxr-xr-xlibs/Zend/Filter/Dir.php50
-rwxr-xr-xlibs/Zend/Filter/Exception.php37
-rwxr-xr-xlibs/Zend/Filter/HtmlEntities.php121
-rwxr-xr-xlibs/Zend/Filter/Input.php833
-rwxr-xr-xlibs/Zend/Filter/Int.php50
-rwxr-xr-xlibs/Zend/Filter/Interface.php40
-rwxr-xr-xlibs/Zend/Filter/RealPath.php50
-rwxr-xr-xlibs/Zend/Filter/StringToLower.php76
-rwxr-xr-xlibs/Zend/Filter/StringToUpper.php76
-rwxr-xr-xlibs/Zend/Filter/StringTrim.php97
-rwxr-xr-xlibs/Zend/Filter/StripTags.php284
-rwxr-xr-xlibs/Zend/Gdata.php133
-rwxr-xr-xlibs/Zend/Http/Client.php1051
-rwxr-xr-xlibs/Zend/Http/Client/Adapter/Exception.php33
-rwxr-xr-xlibs/Zend/Http/Client/Adapter/Interface.php78
-rwxr-xr-xlibs/Zend/Http/Client/Adapter/Proxy.php166
-rwxr-xr-xlibs/Zend/Http/Client/Adapter/Socket.php285
-rwxr-xr-xlibs/Zend/Http/Client/Adapter/Test.php190
-rwxr-xr-xlibs/Zend/Http/Client/Exception.php33
-rwxr-xr-xlibs/Zend/Http/Cookie.php317
-rwxr-xr-xlibs/Zend/Http/CookieJar.php342
-rwxr-xr-xlibs/Zend/Http/Exception.php33
-rwxr-xr-xlibs/Zend/Http/Response.php599
-rwxr-xr-xlibs/Zend/Json.php91
-rwxr-xr-xlibs/Zend/Json/Decoder.php454
-rwxr-xr-xlibs/Zend/Json/Encoder.php413
-rwxr-xr-xlibs/Zend/Json/Exception.php36
-rwxr-xr-xlibs/Zend/Json/TODO.txt1
-rwxr-xr-xlibs/Zend/Loader.php260
-rwxr-xr-xlibs/Zend/Locale.php1172
-rwxr-xr-xlibs/Zend/Locale/Data.php741
-rwxr-xr-xlibs/Zend/Locale/Data/aa.xml221
-rwxr-xr-xlibs/Zend/Locale/Data/aa_DJ.xml20
-rwxr-xr-xlibs/Zend/Locale/Data/aa_ER.xml35
-rwxr-xr-xlibs/Zend/Locale/Data/aa_ER_SAAHO.xml40
-rwxr-xr-xlibs/Zend/Locale/Data/aa_ET.xml43
-rwxr-xr-xlibs/Zend/Locale/Data/af.xml625
-rwxr-xr-xlibs/Zend/Locale/Data/af_NA.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/af_ZA.xml83
-rwxr-xr-xlibs/Zend/Locale/Data/ak.xml112
-rwxr-xr-xlibs/Zend/Locale/Data/ak_GH.xml15
-rwxr-xr-xlibs/Zend/Locale/Data/am.xml1345
-rwxr-xr-xlibs/Zend/Locale/Data/am_ET.xml59
-rwxr-xr-xlibs/Zend/Locale/Data/ar.xml2772
-rwxr-xr-xlibs/Zend/Locale/Data/ar_AE.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ar_BH.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ar_DZ.xml16
-rwxr-xr-xlibs/Zend/Locale/Data/ar_EG.xml34
-rwxr-xr-xlibs/Zend/Locale/Data/ar_IQ.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ar_JO.xml62
-rwxr-xr-xlibs/Zend/Locale/Data/ar_KW.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ar_LB.xml68
-rwxr-xr-xlibs/Zend/Locale/Data/ar_LY.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ar_MA.xml16
-rwxr-xr-xlibs/Zend/Locale/Data/ar_OM.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ar_QA.xml46
-rwxr-xr-xlibs/Zend/Locale/Data/ar_SA.xml58
-rwxr-xr-xlibs/Zend/Locale/Data/ar_SD.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ar_SY.xml78
-rwxr-xr-xlibs/Zend/Locale/Data/ar_TN.xml55
-rwxr-xr-xlibs/Zend/Locale/Data/ar_YE.xml46
-rwxr-xr-xlibs/Zend/Locale/Data/as.xml107
-rwxr-xr-xlibs/Zend/Locale/Data/as_IN.xml92
-rwxr-xr-xlibs/Zend/Locale/Data/az.xml135
-rwxr-xr-xlibs/Zend/Locale/Data/az_AZ.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/az_Cyrl.xml86
-rwxr-xr-xlibs/Zend/Locale/Data/az_Cyrl_AZ.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/az_Latn.xml23
-rwxr-xr-xlibs/Zend/Locale/Data/az_Latn_AZ.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/be.xml252
-rwxr-xr-xlibs/Zend/Locale/Data/be_BY.xml20
-rwxr-xr-xlibs/Zend/Locale/Data/bg.xml2189
-rwxr-xr-xlibs/Zend/Locale/Data/bg_BG.xml176
-rwxr-xr-xlibs/Zend/Locale/Data/bn.xml228
-rwxr-xr-xlibs/Zend/Locale/Data/bn_BD.xml260
-rwxr-xr-xlibs/Zend/Locale/Data/bn_IN.xml91
-rwxr-xr-xlibs/Zend/Locale/Data/bs.xml126
-rwxr-xr-xlibs/Zend/Locale/Data/bs_BA.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/byn.xml425
-rwxr-xr-xlibs/Zend/Locale/Data/byn_ER.xml78
-rwxr-xr-xlibs/Zend/Locale/Data/ca.xml539
-rwxr-xr-xlibs/Zend/Locale/Data/ca_ES.xml26
-rwxr-xr-xlibs/Zend/Locale/Data/cch.xml91
-rwxr-xr-xlibs/Zend/Locale/Data/cch_NG.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/cs.xml1714
-rwxr-xr-xlibs/Zend/Locale/Data/cs_CZ.xml29
-rwxr-xr-xlibs/Zend/Locale/Data/cy.xml456
-rwxr-xr-xlibs/Zend/Locale/Data/cy_GB.xml53
-rwxr-xr-xlibs/Zend/Locale/Data/da.xml2623
-rwxr-xr-xlibs/Zend/Locale/Data/da_DK.xml72
-rwxr-xr-xlibs/Zend/Locale/Data/de.xml2017
-rwxr-xr-xlibs/Zend/Locale/Data/de_AT.xml53
-rwxr-xr-xlibs/Zend/Locale/Data/de_BE.xml86
-rwxr-xr-xlibs/Zend/Locale/Data/de_CH.xml49
-rwxr-xr-xlibs/Zend/Locale/Data/de_DE.xml20
-rwxr-xr-xlibs/Zend/Locale/Data/de_LI.xml28
-rwxr-xr-xlibs/Zend/Locale/Data/de_LU.xml38
-rwxr-xr-xlibs/Zend/Locale/Data/dv.xml54
-rwxr-xr-xlibs/Zend/Locale/Data/dv_MV.xml69
-rwxr-xr-xlibs/Zend/Locale/Data/dz.xml364
-rwxr-xr-xlibs/Zend/Locale/Data/dz_BT.xml25
-rwxr-xr-xlibs/Zend/Locale/Data/ee.xml130
-rwxr-xr-xlibs/Zend/Locale/Data/ee_GH.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ee_TG.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/el.xml1578
-rwxr-xr-xlibs/Zend/Locale/Data/el_CY.xml20
-rwxr-xr-xlibs/Zend/Locale/Data/el_GR.xml32
-rwxr-xr-xlibs/Zend/Locale/Data/el_POLYTONI.xml559
-rwxr-xr-xlibs/Zend/Locale/Data/en.xml2282
-rwxr-xr-xlibs/Zend/Locale/Data/en_AS.xml20
-rwxr-xr-xlibs/Zend/Locale/Data/en_AU.xml61
-rwxr-xr-xlibs/Zend/Locale/Data/en_BE.xml86
-rwxr-xr-xlibs/Zend/Locale/Data/en_BW.xml58
-rwxr-xr-xlibs/Zend/Locale/Data/en_BZ.xml68
-rwxr-xr-xlibs/Zend/Locale/Data/en_CA.xml49
-rwxr-xr-xlibs/Zend/Locale/Data/en_GB.xml75
-rwxr-xr-xlibs/Zend/Locale/Data/en_GU.xml20
-rwxr-xr-xlibs/Zend/Locale/Data/en_HK.xml64
-rwxr-xr-xlibs/Zend/Locale/Data/en_IE.xml82
-rwxr-xr-xlibs/Zend/Locale/Data/en_IN.xml69
-rwxr-xr-xlibs/Zend/Locale/Data/en_JM.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/en_MH.xml20
-rwxr-xr-xlibs/Zend/Locale/Data/en_MP.xml20
-rwxr-xr-xlibs/Zend/Locale/Data/en_MT.xml75
-rwxr-xr-xlibs/Zend/Locale/Data/en_NA.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/en_NZ.xml60
-rwxr-xr-xlibs/Zend/Locale/Data/en_PH.xml43
-rwxr-xr-xlibs/Zend/Locale/Data/en_PK.xml69
-rwxr-xr-xlibs/Zend/Locale/Data/en_SG.xml77
-rwxr-xr-xlibs/Zend/Locale/Data/en_TT.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/en_UM.xml20
-rwxr-xr-xlibs/Zend/Locale/Data/en_US.xml24
-rwxr-xr-xlibs/Zend/Locale/Data/en_US_POSIX.xml45
-rwxr-xr-xlibs/Zend/Locale/Data/en_VI.xml20
-rwxr-xr-xlibs/Zend/Locale/Data/en_ZA.xml62
-rwxr-xr-xlibs/Zend/Locale/Data/en_ZW.xml66
-rwxr-xr-xlibs/Zend/Locale/Data/eo.xml502
-rwxr-xr-xlibs/Zend/Locale/Data/es.xml2196
-rwxr-xr-xlibs/Zend/Locale/Data/es_AR.xml57
-rwxr-xr-xlibs/Zend/Locale/Data/es_BO.xml56
-rwxr-xr-xlibs/Zend/Locale/Data/es_CL.xml103
-rwxr-xr-xlibs/Zend/Locale/Data/es_CO.xml63
-rwxr-xr-xlibs/Zend/Locale/Data/es_CR.xml56
-rwxr-xr-xlibs/Zend/Locale/Data/es_DO.xml62
-rwxr-xr-xlibs/Zend/Locale/Data/es_EC.xml71
-rwxr-xr-xlibs/Zend/Locale/Data/es_ES.xml80
-rwxr-xr-xlibs/Zend/Locale/Data/es_GT.xml57
-rwxr-xr-xlibs/Zend/Locale/Data/es_HN.xml72
-rwxr-xr-xlibs/Zend/Locale/Data/es_MX.xml71
-rwxr-xr-xlibs/Zend/Locale/Data/es_NI.xml62
-rwxr-xr-xlibs/Zend/Locale/Data/es_PA.xml62
-rwxr-xr-xlibs/Zend/Locale/Data/es_PE.xml10
-rwxr-xr-xlibs/Zend/Locale/Data/es_PR.xml68
-rwxr-xr-xlibs/Zend/Locale/Data/es_PY.xml65
-rwxr-xr-xlibs/Zend/Locale/Data/es_SV.xml62
-rwxr-xr-xlibs/Zend/Locale/Data/es_US.xml62
-rwxr-xr-xlibs/Zend/Locale/Data/es_UY.xml70
-rwxr-xr-xlibs/Zend/Locale/Data/es_VE.xml65
-rwxr-xr-xlibs/Zend/Locale/Data/et.xml456
-rwxr-xr-xlibs/Zend/Locale/Data/et_EE.xml38
-rwxr-xr-xlibs/Zend/Locale/Data/eu.xml234
-rwxr-xr-xlibs/Zend/Locale/Data/eu_ES.xml48
-rwxr-xr-xlibs/Zend/Locale/Data/fa.xml1649
-rwxr-xr-xlibs/Zend/Locale/Data/fa_AF.xml282
-rwxr-xr-xlibs/Zend/Locale/Data/fa_IR.xml10
-rwxr-xr-xlibs/Zend/Locale/Data/fi.xml2236
-rwxr-xr-xlibs/Zend/Locale/Data/fi_FI.xml23
-rwxr-xr-xlibs/Zend/Locale/Data/fo.xml263
-rwxr-xr-xlibs/Zend/Locale/Data/fo_FO.xml26
-rwxr-xr-xlibs/Zend/Locale/Data/fr.xml2511
-rwxr-xr-xlibs/Zend/Locale/Data/fr_BE.xml49
-rwxr-xr-xlibs/Zend/Locale/Data/fr_CA.xml59
-rwxr-xr-xlibs/Zend/Locale/Data/fr_CH.xml56
-rwxr-xr-xlibs/Zend/Locale/Data/fr_FR.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/fr_LU.xml23
-rwxr-xr-xlibs/Zend/Locale/Data/fr_MC.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/fur.xml869
-rwxr-xr-xlibs/Zend/Locale/Data/fur_IT.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ga.xml1426
-rwxr-xr-xlibs/Zend/Locale/Data/ga_IE.xml64
-rwxr-xr-xlibs/Zend/Locale/Data/gaa.xml100
-rwxr-xr-xlibs/Zend/Locale/Data/gaa_GH.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/gez.xml425
-rwxr-xr-xlibs/Zend/Locale/Data/gez_ER.xml92
-rwxr-xr-xlibs/Zend/Locale/Data/gez_ET.xml86
-rwxr-xr-xlibs/Zend/Locale/Data/gl.xml111
-rwxr-xr-xlibs/Zend/Locale/Data/gl_ES.xml62
-rwxr-xr-xlibs/Zend/Locale/Data/gu.xml128
-rwxr-xr-xlibs/Zend/Locale/Data/gu_IN.xml100
-rwxr-xr-xlibs/Zend/Locale/Data/gv.xml88
-rwxr-xr-xlibs/Zend/Locale/Data/gv_GB.xml65
-rwxr-xr-xlibs/Zend/Locale/Data/ha.xml106
-rwxr-xr-xlibs/Zend/Locale/Data/ha_Arab.xml93
-rwxr-xr-xlibs/Zend/Locale/Data/ha_Arab_NG.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/ha_GH.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/ha_Latn.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ha_Latn_GH.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/ha_Latn_NE.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/ha_Latn_NG.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/ha_NE.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/ha_NG.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/haw.xml101
-rwxr-xr-xlibs/Zend/Locale/Data/haw_US.xml78
-rwxr-xr-xlibs/Zend/Locale/Data/he.xml1575
-rwxr-xr-xlibs/Zend/Locale/Data/he_IL.xml26
-rwxr-xr-xlibs/Zend/Locale/Data/hi.xml493
-rwxr-xr-xlibs/Zend/Locale/Data/hi_IN.xml98
-rwxr-xr-xlibs/Zend/Locale/Data/hr.xml1235
-rwxr-xr-xlibs/Zend/Locale/Data/hr_HR.xml16
-rwxr-xr-xlibs/Zend/Locale/Data/hu.xml2394
-rwxr-xr-xlibs/Zend/Locale/Data/hu_HU.xml26
-rwxr-xr-xlibs/Zend/Locale/Data/hy.xml356
-rwxr-xr-xlibs/Zend/Locale/Data/hy_AM.xml22
-rwxr-xr-xlibs/Zend/Locale/Data/hy_AM_REVISED.xml49
-rwxr-xr-xlibs/Zend/Locale/Data/ia.xml113
-rwxr-xr-xlibs/Zend/Locale/Data/id.xml579
-rwxr-xr-xlibs/Zend/Locale/Data/id_ID.xml76
-rwxr-xr-xlibs/Zend/Locale/Data/ig.xml99
-rwxr-xr-xlibs/Zend/Locale/Data/ig_NG.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/is.xml1538
-rwxr-xr-xlibs/Zend/Locale/Data/is_IS.xml55
-rwxr-xr-xlibs/Zend/Locale/Data/it.xml2008
-rwxr-xr-xlibs/Zend/Locale/Data/it_CH.xml70
-rwxr-xr-xlibs/Zend/Locale/Data/it_IT.xml32
-rwxr-xr-xlibs/Zend/Locale/Data/iu.xml78
-rwxr-xr-xlibs/Zend/Locale/Data/ja.xml2803
-rwxr-xr-xlibs/Zend/Locale/Data/ja_JP.xml20
-rwxr-xr-xlibs/Zend/Locale/Data/ka.xml734
-rwxr-xr-xlibs/Zend/Locale/Data/ka_GE.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/kaj.xml93
-rwxr-xr-xlibs/Zend/Locale/Data/kaj_NG.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/kam.xml91
-rwxr-xr-xlibs/Zend/Locale/Data/kam_KE.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/kcg.xml91
-rwxr-xr-xlibs/Zend/Locale/Data/kcg_NG.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/kfo.xml91
-rwxr-xr-xlibs/Zend/Locale/Data/kfo_NG.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/kk.xml127
-rwxr-xr-xlibs/Zend/Locale/Data/kk_KZ.xml19
-rwxr-xr-xlibs/Zend/Locale/Data/kl.xml92
-rwxr-xr-xlibs/Zend/Locale/Data/kl_GL.xml78
-rwxr-xr-xlibs/Zend/Locale/Data/km.xml520
-rwxr-xr-xlibs/Zend/Locale/Data/km_KH.xml26
-rwxr-xr-xlibs/Zend/Locale/Data/kn.xml122
-rwxr-xr-xlibs/Zend/Locale/Data/kn_IN.xml98
-rwxr-xr-xlibs/Zend/Locale/Data/ko.xml1959
-rwxr-xr-xlibs/Zend/Locale/Data/ko_KR.xml415
-rwxr-xr-xlibs/Zend/Locale/Data/kok.xml247
-rwxr-xr-xlibs/Zend/Locale/Data/kok_IN.xml91
-rwxr-xr-xlibs/Zend/Locale/Data/ku.xml180
-rwxr-xr-xlibs/Zend/Locale/Data/ku_Arab.xml15
-rwxr-xr-xlibs/Zend/Locale/Data/ku_IQ.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/ku_IR.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/ku_Latn.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ku_Latn_IQ.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/ku_Latn_IR.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/ku_Latn_SY.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/ku_Latn_TR.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/ku_SY.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/ku_TR.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/kw.xml88
-rwxr-xr-xlibs/Zend/Locale/Data/kw_GB.xml65
-rwxr-xr-xlibs/Zend/Locale/Data/ky.xml42
-rwxr-xr-xlibs/Zend/Locale/Data/ky_KG.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ln.xml181
-rwxr-xr-xlibs/Zend/Locale/Data/ln_CD.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ln_CG.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/lo.xml552
-rwxr-xr-xlibs/Zend/Locale/Data/lo_LA.xml26
-rwxr-xr-xlibs/Zend/Locale/Data/lt.xml608
-rwxr-xr-xlibs/Zend/Locale/Data/lt_LT.xml136
-rwxr-xr-xlibs/Zend/Locale/Data/lv.xml422
-rwxr-xr-xlibs/Zend/Locale/Data/lv_LV.xml26
-rwxr-xr-xlibs/Zend/Locale/Data/mk.xml1046
-rwxr-xr-xlibs/Zend/Locale/Data/mk_MK.xml20
-rwxr-xr-xlibs/Zend/Locale/Data/ml.xml427
-rwxr-xr-xlibs/Zend/Locale/Data/ml_IN.xml97
-rwxr-xr-xlibs/Zend/Locale/Data/mn.xml146
-rwxr-xr-xlibs/Zend/Locale/Data/mn_MN.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/mr.xml259
-rwxr-xr-xlibs/Zend/Locale/Data/mr_IN.xml97
-rwxr-xr-xlibs/Zend/Locale/Data/ms.xml354
-rwxr-xr-xlibs/Zend/Locale/Data/ms_BN.xml85
-rwxr-xr-xlibs/Zend/Locale/Data/ms_MY.xml83
-rwxr-xr-xlibs/Zend/Locale/Data/mt.xml979
-rwxr-xr-xlibs/Zend/Locale/Data/mt_MT.xml19
-rwxr-xr-xlibs/Zend/Locale/Data/nb.xml2077
-rwxr-xr-xlibs/Zend/Locale/Data/nb_NO.xml40
-rwxr-xr-xlibs/Zend/Locale/Data/ne.xml109
-rwxr-xr-xlibs/Zend/Locale/Data/ne_NP.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/nl.xml2266
-rwxr-xr-xlibs/Zend/Locale/Data/nl_BE.xml69
-rwxr-xr-xlibs/Zend/Locale/Data/nl_NL.xml20
-rwxr-xr-xlibs/Zend/Locale/Data/nn.xml1387
-rwxr-xr-xlibs/Zend/Locale/Data/nn_NO.xml26
-rwxr-xr-xlibs/Zend/Locale/Data/nr.xml96
-rwxr-xr-xlibs/Zend/Locale/Data/nr_ZA.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/nso.xml97
-rwxr-xr-xlibs/Zend/Locale/Data/nso_ZA.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ny.xml96
-rwxr-xr-xlibs/Zend/Locale/Data/ny_MW.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/om.xml172
-rwxr-xr-xlibs/Zend/Locale/Data/om_ET.xml87
-rwxr-xr-xlibs/Zend/Locale/Data/om_KE.xml79
-rwxr-xr-xlibs/Zend/Locale/Data/or.xml72
-rwxr-xr-xlibs/Zend/Locale/Data/or_IN.xml92
-rwxr-xr-xlibs/Zend/Locale/Data/pa.xml185
-rwxr-xr-xlibs/Zend/Locale/Data/pa_Arab.xml121
-rwxr-xr-xlibs/Zend/Locale/Data/pa_Arab_PK.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/pa_Guru.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/pa_Guru_IN.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/pa_IN.xml89
-rwxr-xr-xlibs/Zend/Locale/Data/pa_PK.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/pl.xml1541
-rwxr-xr-xlibs/Zend/Locale/Data/pl_PL.xml494
-rwxr-xr-xlibs/Zend/Locale/Data/ps.xml273
-rwxr-xr-xlibs/Zend/Locale/Data/ps_AF.xml27
-rwxr-xr-xlibs/Zend/Locale/Data/pt.xml1913
-rwxr-xr-xlibs/Zend/Locale/Data/pt_BR.xml301
-rwxr-xr-xlibs/Zend/Locale/Data/pt_PT.xml397
-rwxr-xr-xlibs/Zend/Locale/Data/ro.xml534
-rwxr-xr-xlibs/Zend/Locale/Data/ro_RO.xml26
-rwxr-xr-xlibs/Zend/Locale/Data/root.xml877
-rwxr-xr-xlibs/Zend/Locale/Data/ru.xml2412
-rwxr-xr-xlibs/Zend/Locale/Data/ru_RU.xml48
-rwxr-xr-xlibs/Zend/Locale/Data/ru_UA.xml71
-rwxr-xr-xlibs/Zend/Locale/Data/rw.xml106
-rwxr-xr-xlibs/Zend/Locale/Data/rw_RW.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/sa.xml53
-rwxr-xr-xlibs/Zend/Locale/Data/sa_IN.xml69
-rwxr-xr-xlibs/Zend/Locale/Data/se.xml107
-rwxr-xr-xlibs/Zend/Locale/Data/se_NO.xml266
-rwxr-xr-xlibs/Zend/Locale/Data/sh.xml10
-rwxr-xr-xlibs/Zend/Locale/Data/sh_BA.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/sh_CS.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/sh_YU.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/sid.xml224
-rwxr-xr-xlibs/Zend/Locale/Data/sid_ET.xml20
-rwxr-xr-xlibs/Zend/Locale/Data/sk.xml1413
-rwxr-xr-xlibs/Zend/Locale/Data/sk_SK.xml26
-rwxr-xr-xlibs/Zend/Locale/Data/sl.xml591
-rwxr-xr-xlibs/Zend/Locale/Data/sl_SI.xml25
-rwxr-xr-xlibs/Zend/Locale/Data/so.xml326
-rwxr-xr-xlibs/Zend/Locale/Data/so_DJ.xml27
-rwxr-xr-xlibs/Zend/Locale/Data/so_ET.xml27
-rwxr-xr-xlibs/Zend/Locale/Data/so_KE.xml19
-rwxr-xr-xlibs/Zend/Locale/Data/so_SO.xml27
-rwxr-xr-xlibs/Zend/Locale/Data/sq.xml377
-rwxr-xr-xlibs/Zend/Locale/Data/sq_AL.xml20
-rwxr-xr-xlibs/Zend/Locale/Data/sr.xml738
-rwxr-xr-xlibs/Zend/Locale/Data/sr_BA.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/sr_CS.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/sr_Cyrl.xml37
-rwxr-xr-xlibs/Zend/Locale/Data/sr_Cyrl_BA.xml102
-rwxr-xr-xlibs/Zend/Locale/Data/sr_Cyrl_CS.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/sr_Cyrl_ME.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/sr_Cyrl_RS.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/sr_Cyrl_YU.xml13
-rwxr-xr-xlibs/Zend/Locale/Data/sr_Latn.xml689
-rwxr-xr-xlibs/Zend/Locale/Data/sr_Latn_BA.xml97
-rwxr-xr-xlibs/Zend/Locale/Data/sr_Latn_CS.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/sr_Latn_ME.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/sr_Latn_RS.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/sr_Latn_YU.xml13
-rwxr-xr-xlibs/Zend/Locale/Data/sr_ME.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/sr_RS.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/sr_YU.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/ss.xml96
-rwxr-xr-xlibs/Zend/Locale/Data/ss_ZA.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/st.xml96
-rwxr-xr-xlibs/Zend/Locale/Data/st_ZA.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/supplementalData.xml1726
-rwxr-xr-xlibs/Zend/Locale/Data/sv.xml2248
-rwxr-xr-xlibs/Zend/Locale/Data/sv_FI.xml108
-rwxr-xr-xlibs/Zend/Locale/Data/sv_SE.xml92
-rwxr-xr-xlibs/Zend/Locale/Data/sw.xml217
-rwxr-xr-xlibs/Zend/Locale/Data/sw_KE.xml19
-rwxr-xr-xlibs/Zend/Locale/Data/sw_TZ.xml26
-rwxr-xr-xlibs/Zend/Locale/Data/syr.xml53
-rwxr-xr-xlibs/Zend/Locale/Data/syr_SY.xml86
-rwxr-xr-xlibs/Zend/Locale/Data/ta.xml454
-rwxr-xr-xlibs/Zend/Locale/Data/ta_IN.xml74
-rwxr-xr-xlibs/Zend/Locale/Data/te.xml199
-rwxr-xr-xlibs/Zend/Locale/Data/te_IN.xml97
-rwxr-xr-xlibs/Zend/Locale/Data/tg.xml117
-rwxr-xr-xlibs/Zend/Locale/Data/tg_TJ.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/th.xml2504
-rwxr-xr-xlibs/Zend/Locale/Data/th_TH.xml65
-rwxr-xr-xlibs/Zend/Locale/Data/ti.xml153
-rwxr-xr-xlibs/Zend/Locale/Data/ti_ER.xml133
-rwxr-xr-xlibs/Zend/Locale/Data/ti_ET.xml89
-rwxr-xr-xlibs/Zend/Locale/Data/tig.xml426
-rwxr-xr-xlibs/Zend/Locale/Data/tig_ER.xml78
-rwxr-xr-xlibs/Zend/Locale/Data/tn.xml102
-rwxr-xr-xlibs/Zend/Locale/Data/tn_ZA.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/tr.xml2009
-rwxr-xr-xlibs/Zend/Locale/Data/tr_TR.xml21
-rwxr-xr-xlibs/Zend/Locale/Data/ts.xml112
-rwxr-xr-xlibs/Zend/Locale/Data/ts_ZA.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/tt.xml32
-rwxr-xr-xlibs/Zend/Locale/Data/tt_RU.xml80
-rwxr-xr-xlibs/Zend/Locale/Data/uk.xml2982
-rwxr-xr-xlibs/Zend/Locale/Data/uk_UA.xml26
-rwxr-xr-xlibs/Zend/Locale/Data/ur.xml32
-rwxr-xr-xlibs/Zend/Locale/Data/ur_IN.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ur_PK.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/uz.xml185
-rwxr-xr-xlibs/Zend/Locale/Data/uz_AF.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/uz_Arab.xml166
-rwxr-xr-xlibs/Zend/Locale/Data/uz_Arab_AF.xml12
-rwxr-xr-xlibs/Zend/Locale/Data/uz_Cyrl.xml10
-rwxr-xr-xlibs/Zend/Locale/Data/uz_Cyrl_UZ.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/uz_Latn.xml167
-rwxr-xr-xlibs/Zend/Locale/Data/uz_Latn_UZ.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/uz_UZ.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/ve.xml113
-rwxr-xr-xlibs/Zend/Locale/Data/ve_ZA.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/vi.xml390
-rwxr-xr-xlibs/Zend/Locale/Data/vi_VN.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/wal.xml294
-rwxr-xr-xlibs/Zend/Locale/Data/wal_ET.xml81
-rwxr-xr-xlibs/Zend/Locale/Data/xh.xml115
-rwxr-xr-xlibs/Zend/Locale/Data/xh_ZA.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/yo.xml99
-rwxr-xr-xlibs/Zend/Locale/Data/yo_NG.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/zh.xml2348
-rwxr-xr-xlibs/Zend/Locale/Data/zh_CN.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/zh_HK.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/zh_Hans.xml768
-rwxr-xr-xlibs/Zend/Locale/Data/zh_Hans_CN.xml150
-rwxr-xr-xlibs/Zend/Locale/Data/zh_Hans_SG.xml102
-rwxr-xr-xlibs/Zend/Locale/Data/zh_Hant.xml2043
-rwxr-xr-xlibs/Zend/Locale/Data/zh_Hant_HK.xml427
-rwxr-xr-xlibs/Zend/Locale/Data/zh_Hant_MO.xml426
-rwxr-xr-xlibs/Zend/Locale/Data/zh_Hant_TW.xml473
-rwxr-xr-xlibs/Zend/Locale/Data/zh_MO.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/zh_SG.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/zh_TW.xml11
-rwxr-xr-xlibs/Zend/Locale/Data/zu.xml99
-rwxr-xr-xlibs/Zend/Locale/Data/zu_ZA.xml11
-rwxr-xr-xlibs/Zend/Locale/Exception.php37
-rwxr-xr-xlibs/Zend/Locale/Format.php1044
-rwxr-xr-xlibs/Zend/Locale/Math.php139
-rwxr-xr-xlibs/Zend/Locale/Math/Exception.php53
-rwxr-xr-xlibs/Zend/Locale/Math/PhpMath.php222
-rwxr-xr-xlibs/Zend/Log.php211
-rwxr-xr-xlibs/Zend/Log/Exception.php33
-rwxr-xr-xlibs/Zend/Log/Filter/Interface.php41
-rwxr-xr-xlibs/Zend/Log/Filter/Message.php66
-rwxr-xr-xlibs/Zend/Log/Filter/Priority.php75
-rwxr-xr-xlibs/Zend/Log/Filter/Suppress.php66
-rwxr-xr-xlibs/Zend/Log/Formatter/Interface.php41
-rwxr-xr-xlibs/Zend/Log/Formatter/Simple.php75
-rwxr-xr-xlibs/Zend/Log/Formatter/Xml.php87
-rwxr-xr-xlibs/Zend/Log/Writer/Abstract.php109
-rwxr-xr-xlibs/Zend/Log/Writer/Db.php111
-rwxr-xr-xlibs/Zend/Log/Writer/Mock.php66
-rwxr-xr-xlibs/Zend/Log/Writer/Null.php46
-rwxr-xr-xlibs/Zend/Log/Writer/Stream.php100
-rwxr-xr-xlibs/Zend/Mail.php649
-rwxr-xr-xlibs/Zend/Mail/Exception.php36
-rwxr-xr-xlibs/Zend/Mail/Message.php105
-rwxr-xr-xlibs/Zend/Mail/Part.php422
-rwxr-xr-xlibs/Zend/Mail/Protocol/Abstract.php358
-rwxr-xr-xlibs/Zend/Mail/Protocol/Exception.php39
-rwxr-xr-xlibs/Zend/Mail/Protocol/Imap.php770
-rwxr-xr-xlibs/Zend/Mail/Protocol/Pop3.php424
-rwxr-xr-xlibs/Zend/Mail/Protocol/Smtp.php413
-rwxr-xr-xlibs/Zend/Mail/Protocol/Smtp/Auth/Crammd5.php108
-rwxr-xr-xlibs/Zend/Mail/Protocol/Smtp/Auth/Login.php98
-rwxr-xr-xlibs/Zend/Mail/Protocol/Smtp/Auth/Plain.php96
-rwxr-xr-xlibs/Zend/Mail/Storage.php36
-rwxr-xr-xlibs/Zend/Mail/Storage/Abstract.php357
-rwxr-xr-xlibs/Zend/Mail/Storage/Exception.php39
-rwxr-xr-xlibs/Zend/Mail/Storage/Folder.php232
-rwxr-xr-xlibs/Zend/Mail/Storage/Folder/Interface.php55
-rwxr-xr-xlibs/Zend/Mail/Storage/Folder/Maildir.php226
-rwxr-xr-xlibs/Zend/Mail/Storage/Folder/Mbox.php234
-rwxr-xr-xlibs/Zend/Mail/Storage/Imap.php524
-rwxr-xr-xlibs/Zend/Mail/Storage/Maildir.php381
-rwxr-xr-xlibs/Zend/Mail/Storage/Mbox.php396
-rwxr-xr-xlibs/Zend/Mail/Storage/Pop3.php301
-rwxr-xr-xlibs/Zend/Mail/Storage/Writable/Interface.php93
-rwxr-xr-xlibs/Zend/Mail/Storage/Writable/Maildir.php524
-rwxr-xr-xlibs/Zend/Mail/TODO.txt1
-rwxr-xr-xlibs/Zend/Mail/Transport/Abstract.php335
-rwxr-xr-xlibs/Zend/Mail/Transport/Exception.php39
-rwxr-xr-xlibs/Zend/Mail/Transport/Sendmail.php153
-rwxr-xr-xlibs/Zend/Mail/Transport/Smtp.php202
-rwxr-xr-xlibs/Zend/Memory.php75
-rwxr-xr-xlibs/Zend/Memory/AccessController.php147
-rwxr-xr-xlibs/Zend/Memory/Container.php37
-rwxr-xr-xlibs/Zend/Memory/Container/Interface.php64
-rwxr-xr-xlibs/Zend/Memory/Container/Locked.php115
-rwxr-xr-xlibs/Zend/Memory/Container/Movable.php298
-rwxr-xr-xlibs/Zend/Memory/Exception.php33
-rwxr-xr-xlibs/Zend/Memory/Manager.php460
-rwxr-xr-xlibs/Zend/Memory/Value.php174
-rwxr-xr-xlibs/Zend/Mime.php251
-rwxr-xr-xlibs/Zend/Mime/Decode.php228
-rwxr-xr-xlibs/Zend/Mime/Exception.php36
-rwxr-xr-xlibs/Zend/Mime/Message.php280
-rwxr-xr-xlibs/Zend/Mime/Part.php208
-rwxr-xr-xlibs/Zend/Pdf.php685
-rwxr-xr-xlibs/Zend/Registry.php196
-rwxr-xr-xlibs/Zend/Request/Interface.php112
-rwxr-xr-xlibs/Zend/Rest/Client.php254
-rwxr-xr-xlibs/Zend/Rest/Client/Exception.php39
-rwxr-xr-xlibs/Zend/Rest/Client/Result.php201
-rwxr-xr-xlibs/Zend/Rest/Exception.php36
-rwxr-xr-xlibs/Zend/Rest/Server.php494
-rwxr-xr-xlibs/Zend/Rest/Server/Exception.php39
-rwxr-xr-xlibs/Zend/Server/Abstract.php66
-rwxr-xr-xlibs/Zend/Server/Exception.php35
-rwxr-xr-xlibs/Zend/Server/Interface.php118
-rwxr-xr-xlibs/Zend/Server/Reflection.php112
-rwxr-xr-xlibs/Zend/Server/Reflection/Class.php201
-rwxr-xr-xlibs/Zend/Server/Reflection/Exception.php38
-rwxr-xr-xlibs/Zend/Server/Reflection/Function.php39
-rwxr-xr-xlibs/Zend/Server/Reflection/Function/Abstract.php497
-rwxr-xr-xlibs/Zend/Server/Reflection/Method.php110
-rwxr-xr-xlibs/Zend/Server/Reflection/Node.php201
-rwxr-xr-xlibs/Zend/Server/Reflection/Parameter.php163
-rwxr-xr-xlibs/Zend/Server/Reflection/Prototype.php106
-rwxr-xr-xlibs/Zend/Server/Reflection/ReturnValue.php113
-rwxr-xr-xlibs/Zend/Session.php743
-rwxr-xr-xlibs/Zend/Session/Abstract.php185
-rwxr-xr-xlibs/Zend/Session/Exception.php72
-rwxr-xr-xlibs/Zend/Session/Namespace.php489
-rwxr-xr-xlibs/Zend/Session/SaveHandler/Interface.php81
-rwxr-xr-xlibs/Zend/Session/Validator/Abstract.php67
-rwxr-xr-xlibs/Zend/Session/Validator/HttpUserAgent.php69
-rwxr-xr-xlibs/Zend/Session/Validator/Interface.php48
-rwxr-xr-xlibs/Zend/Translate.php238
-rwxr-xr-xlibs/Zend/Translate/Adapter.php306
-rwxr-xr-xlibs/Zend/Translate/Adapter/Array.php79
-rwxr-xr-xlibs/Zend/Translate/Adapter/Csv.php120
-rwxr-xr-xlibs/Zend/Translate/Adapter/Gettext.php150
-rwxr-xr-xlibs/Zend/Translate/Adapter/Qt.php165
-rwxr-xr-xlibs/Zend/Translate/Adapter/Tmx.php174
-rwxr-xr-xlibs/Zend/Translate/Adapter/Xliff.php178
-rwxr-xr-xlibs/Zend/Translate/Exception.php37
-rwxr-xr-xlibs/Zend/Uri.php163
-rwxr-xr-xlibs/Zend/Uri/Exception.php36
-rwxr-xr-xlibs/Zend/Uri/Http.php630
-rwxr-xr-xlibs/Zend/Validate.php160
-rwxr-xr-xlibs/Zend/Validate/Abstract.php190
-rwxr-xr-xlibs/Zend/Validate/Alnum.php120
-rwxr-xr-xlibs/Zend/Validate/Alpha.php120
-rwxr-xr-xlibs/Zend/Validate/Between.php200
-rwxr-xr-xlibs/Zend/Validate/Ccnum.php111
-rwxr-xr-xlibs/Zend/Validate/Date.php87
-rwxr-xr-xlibs/Zend/Validate/Digits.php100
-rwxr-xr-xlibs/Zend/Validate/EmailAddress.php250
-rwxr-xr-xlibs/Zend/Validate/Exception.php37
-rwxr-xr-xlibs/Zend/Validate/Float.php75
-rwxr-xr-xlibs/Zend/Validate/GreaterThan.php114
-rwxr-xr-xlibs/Zend/Validate/Hex.php74
-rwxr-xr-xlibs/Zend/Validate/Hostname.php444
-rwxr-xr-xlibs/Zend/Validate/Hostname/At.php50
-rwxr-xr-xlibs/Zend/Validate/Hostname/Ch.php50
-rwxr-xr-xlibs/Zend/Validate/Hostname/De.php58
-rwxr-xr-xlibs/Zend/Validate/Hostname/Fi.php50
-rwxr-xr-xlibs/Zend/Validate/Hostname/Hu.php50
-rwxr-xr-xlibs/Zend/Validate/Hostname/Interface.php52
-rwxr-xr-xlibs/Zend/Validate/Hostname/Li.php50
-rwxr-xr-xlibs/Zend/Validate/Hostname/No.php52
-rwxr-xr-xlibs/Zend/Validate/Hostname/Se.php50
-rwxr-xr-xlibs/Zend/Validate/InArray.php138
-rwxr-xr-xlibs/Zend/Validate/Int.php75
-rwxr-xr-xlibs/Zend/Validate/Interface.php67
-rwxr-xr-xlibs/Zend/Validate/Ip.php70
-rwxr-xr-xlibs/Zend/Validate/LessThan.php113
-rwxr-xr-xlibs/Zend/Validate/NotEmpty.php70
-rwxr-xr-xlibs/Zend/Validate/Regex.php125
-rwxr-xr-xlibs/Zend/Validate/StringLength.php163
-rwxr-xr-xlibs/Zend/Version.php50
-rwxr-xr-xlibs/Zend/View.php48
-rwxr-xr-xlibs/Zend/View/Abstract.php1041
-rwxr-xr-xlibs/Zend/View/Exception.php51
-rwxr-xr-xlibs/Zend/View/Helper/DeclareVars.php103
-rwxr-xr-xlibs/Zend/View/Helper/FormButton.php84
-rwxr-xr-xlibs/Zend/View/Helper/FormCheckbox.php107
-rwxr-xr-xlibs/Zend/View/Helper/FormElement.php174
-rwxr-xr-xlibs/Zend/View/Helper/FormFile.php75
-rwxr-xr-xlibs/Zend/View/Helper/FormHidden.php65
-rwxr-xr-xlibs/Zend/View/Helper/FormImage.php88
-rwxr-xr-xlibs/Zend/View/Helper/FormLabel.php62
-rwxr-xr-xlibs/Zend/View/Helper/FormNote.php60
-rwxr-xr-xlibs/Zend/View/Helper/FormPassword.php77
-rwxr-xr-xlibs/Zend/View/Helper/FormRadio.php139
-rwxr-xr-xlibs/Zend/View/Helper/FormReset.php74
-rwxr-xr-xlibs/Zend/View/Helper/FormSelect.php163
-rwxr-xr-xlibs/Zend/View/Helper/FormSubmit.php74
-rwxr-xr-xlibs/Zend/View/Helper/FormText.php77
-rwxr-xr-xlibs/Zend/View/Helper/FormTextarea.php109
-rwxr-xr-xlibs/Zend/View/Helper/HtmlList.php83
-rwxr-xr-xlibs/Zend/View/Helper/TODO.txt2
-rwxr-xr-xlibs/Zend/View/Helper/Url.php70
-rwxr-xr-xlibs/Zend/View/Interface.php136
-rwxr-xr-xlibs/Zend/XmlRpc/Client.php267
-rwxr-xr-xlibs/Zend/XmlRpc/Client/Exception.php39
-rwxr-xr-xlibs/Zend/XmlRpc/Client/FaultException.php37
-rwxr-xr-xlibs/Zend/XmlRpc/Client/HttpException.php40
-rwxr-xr-xlibs/Zend/XmlRpc/Client/IntrospectException.php39
-rwxr-xr-xlibs/Zend/XmlRpc/Client/ServerIntrospection.php162
-rwxr-xr-xlibs/Zend/XmlRpc/Client/ServerProxy.php94
-rwxr-xr-xlibs/Zend/XmlRpc/Exception.php36
-rwxr-xr-xlibs/Zend/XmlRpc/Fault.php307
-rwxr-xr-xlibs/Zend/XmlRpc/Request.php381
-rwxr-xr-xlibs/Zend/XmlRpc/Request/Http.php129
-rwxr-xr-xlibs/Zend/XmlRpc/Request/Stdin.php84
-rwxr-xr-xlibs/Zend/XmlRpc/Response.php249
-rwxr-xr-xlibs/Zend/XmlRpc/Response/Http.php51
-rwxr-xr-xlibs/Zend/XmlRpc/Server.php728
-rwxr-xr-xlibs/Zend/XmlRpc/Server/Cache.php140
-rwxr-xr-xlibs/Zend/XmlRpc/Server/Exception.php40
-rwxr-xr-xlibs/Zend/XmlRpc/Server/Fault.php196
-rwxr-xr-xlibs/Zend/XmlRpc/Value.php377
-rwxr-xr-xlibs/Zend/XmlRpc/Value/Array.php77
-rwxr-xr-xlibs/Zend/XmlRpc/Value/Base64.php69
-rwxr-xr-xlibs/Zend/XmlRpc/Value/Boolean.php83
-rwxr-xr-xlibs/Zend/XmlRpc/Value/Collection.php78
-rwxr-xr-xlibs/Zend/XmlRpc/Value/DateTime.php80
-rwxr-xr-xlibs/Zend/XmlRpc/Value/Double.php61
-rwxr-xr-xlibs/Zend/XmlRpc/Value/Exception.php38
-rwxr-xr-xlibs/Zend/XmlRpc/Value/Integer.php61
-rwxr-xr-xlibs/Zend/XmlRpc/Value/Scalar.php59
-rwxr-xr-xlibs/Zend/XmlRpc/Value/String.php72
-rwxr-xr-xlibs/Zend/XmlRpc/Value/Struct.php78
-rwxr-xr-xmisc/db-schema-README11
-rwxr-xr-xmisc/db-schema.xml1589
-rwxr-xr-xmodules/Access.php167
-rwxr-xr-xmodules/Apiable.php21
-rwxr-xr-xmodules/Config.php26
-rwxr-xr-xmodules/ErrorHandler.php35
-rwxr-xr-xmodules/Log.php20
-rwxr-xr-xmodules/Piwik.php166
-rwxr-xr-xmodules/PublicApi.php217
-rwxr-xr-xmodules/SitesManager.php194
-rwxr-xr-xmodules/UsersManager.php190
-rwxr-xr-xtests/all_tests.php52
-rwxr-xr-xtests/config_test.php48
-rwxr-xr-xtests/modules/Database.test.php33
-rwxr-xr-xtests/modules/SitesManager.test.php21
-rwxr-xr-xtests/modules/blank.test.php20
-rwxr-xr-xtests/simpletest/HELP_MY_TESTS_DONT_WORK_ANYMORE348
-rwxr-xr-xtests/simpletest/LICENSE502
-rwxr-xr-xtests/simpletest/README108
-rwxr-xr-xtests/simpletest/VERSION1
-rwxr-xr-xtests/simpletest/authentication.php238
-rwxr-xr-xtests/simpletest/autorun.php63
-rwxr-xr-xtests/simpletest/browser.php1097
-rwxr-xr-xtests/simpletest/collector.php122
-rwxr-xr-xtests/simpletest/compatibility.php173
-rwxr-xr-xtests/simpletest/cookies.php380
-rwxr-xr-xtests/simpletest/default_reporter.php96
-rwxr-xr-xtests/simpletest/detached.php96
-rwxr-xr-xtests/simpletest/docs/en/authentication_documentation.html373
-rwxr-xr-xtests/simpletest/docs/en/browser_documentation.html428
-rwxr-xr-xtests/simpletest/docs/en/docs.css121
-rwxr-xr-xtests/simpletest/docs/en/expectation_documentation.html431
-rwxr-xr-xtests/simpletest/docs/en/form_testing_documentation.html316
-rwxr-xr-xtests/simpletest/docs/en/group_test_documentation.html401
-rwxr-xr-xtests/simpletest/docs/en/index.html503
-rwxr-xr-xtests/simpletest/docs/en/mock_objects_documentation.html770
-rwxr-xr-xtests/simpletest/docs/en/overview.html491
-rwxr-xr-xtests/simpletest/docs/en/partial_mocks_documentation.html465
-rwxr-xr-xtests/simpletest/docs/en/reporter_documentation.html553
-rwxr-xr-xtests/simpletest/docs/en/unit_test_documentation.html419
-rwxr-xr-xtests/simpletest/docs/en/web_tester_documentation.html552
-rwxr-xr-xtests/simpletest/docs/fr/authentication_documentation.html297
-rwxr-xr-xtests/simpletest/docs/fr/browser_documentation.html362
-rwxr-xr-xtests/simpletest/docs/fr/docs.css84
-rwxr-xr-xtests/simpletest/docs/fr/expectation_documentation.html302
-rwxr-xr-xtests/simpletest/docs/fr/form_testing_documentation.html268
-rwxr-xr-xtests/simpletest/docs/fr/group_test_documentation.html318
-rwxr-xr-xtests/simpletest/docs/fr/index.html382
-rwxr-xr-xtests/simpletest/docs/fr/mock_objects_documentation.html534
-rwxr-xr-xtests/simpletest/docs/fr/overview.html332
-rwxr-xr-xtests/simpletest/docs/fr/partial_mocks_documentation.html369
-rwxr-xr-xtests/simpletest/docs/fr/reporter_documentation.html422
-rwxr-xr-xtests/simpletest/docs/fr/server_stubs_documentation.html315
-rwxr-xr-xtests/simpletest/docs/fr/unit_test_documentation.html339
-rwxr-xr-xtests/simpletest/docs/fr/web_tester_documentation.html433
-rwxr-xr-xtests/simpletest/dumper.php360
-rwxr-xr-xtests/simpletest/eclipse.php183
-rwxr-xr-xtests/simpletest/encoding.php521
-rwxr-xr-xtests/simpletest/errors.php285
-rwxr-xr-xtests/simpletest/exceptions.php192
-rwxr-xr-xtests/simpletest/expectation.php895
-rwxr-xr-xtests/simpletest/extensions/pear_test_case.php198
-rwxr-xr-xtests/simpletest/extensions/phpunit_test_case.php96
-rwxr-xr-xtests/simpletest/extensions/testdox.php42
-rwxr-xr-xtests/simpletest/extensions/testdox/test.php106
-rwxr-xr-xtests/simpletest/form.php351
-rwxr-xr-xtests/simpletest/frames.php596
-rwxr-xr-xtests/simpletest/http.php624
-rwxr-xr-xtests/simpletest/invoker.php139
-rwxr-xr-xtests/simpletest/mock_objects.php1306
-rwxr-xr-xtests/simpletest/page.php983
-rwxr-xr-xtests/simpletest/parser.php767
-rwxr-xr-xtests/simpletest/reflection_php4.php136
-rwxr-xr-xtests/simpletest/reflection_php5.php366
-rwxr-xr-xtests/simpletest/remote.php117
-rwxr-xr-xtests/simpletest/reporter.php432
-rwxr-xr-xtests/simpletest/scorer.php863
-rwxr-xr-xtests/simpletest/selector.php133
-rwxr-xr-xtests/simpletest/shell_tester.php333
-rwxr-xr-xtests/simpletest/simpletest.php478
-rwxr-xr-xtests/simpletest/socket.php216
-rwxr-xr-xtests/simpletest/tag.php1418
-rwxr-xr-xtests/simpletest/test/acceptance_test.php1571
-rwxr-xr-xtests/simpletest/test/adapter_test.php77
-rwxr-xr-xtests/simpletest/test/all_tests.php13
-rwxr-xr-xtests/simpletest/test/authentication_test.php145
-rwxr-xr-xtests/simpletest/test/bad_test_suite.php10
-rwxr-xr-xtests/simpletest/test/browser_test.php779
-rwxr-xr-xtests/simpletest/test/collector_test.php51
-rwxr-xr-xtests/simpletest/test/command_line_test.php40
-rwxr-xr-xtests/simpletest/test/compatibility_test.php97
-rwxr-xr-xtests/simpletest/test/cookies_test.php227
-rwxr-xr-xtests/simpletest/test/detached_test.php15
-rwxr-xr-xtests/simpletest/test/dumper_test.php88
-rwxr-xr-xtests/simpletest/test/eclipse_test.php32
-rwxr-xr-xtests/simpletest/test/encoding_test.php191
-rwxr-xr-xtests/simpletest/test/errors_test.php300
-rwxr-xr-xtests/simpletest/test/exceptions_test.php120
-rwxr-xr-xtests/simpletest/test/expectation_test.php245
-rwxr-xr-xtests/simpletest/test/form_test.php309
-rwxr-xr-xtests/simpletest/test/frames_test.php549
-rwxr-xr-xtests/simpletest/test/http_test.php427
-rwxr-xr-xtests/simpletest/test/interfaces_test.php134
-rwxr-xr-xtests/simpletest/test/live_test.php47
-rwxr-xr-xtests/simpletest/test/mock_objects_test.php834
-rwxr-xr-xtests/simpletest/test/page_test.php903
-rwxr-xr-xtests/simpletest/test/parse_error_test.php9
-rwxr-xr-xtests/simpletest/test/parser_test.php520
-rwxr-xr-xtests/simpletest/test/reflection_php4_test.php61
-rwxr-xr-xtests/simpletest/test/reflection_php5_test.php271
-rwxr-xr-xtests/simpletest/test/remote_test.php20
-rwxr-xr-xtests/simpletest/test/shell_test.php38
-rwxr-xr-xtests/simpletest/test/shell_tester_test.php42
-rwxr-xr-xtests/simpletest/test/simpletest_test.php58
-rwxr-xr-xtests/simpletest/test/socket_test.php25
-rwxr-xr-xtests/simpletest/test/support/collector/collectable.10
-rwxr-xr-xtests/simpletest/test/support/collector/collectable.20
-rwxr-xr-xtests/simpletest/test/support/empty_test_file.php3
-rwxr-xr-xtests/simpletest/test/support/latin1_sample1
-rwxr-xr-xtests/simpletest/test/support/spl_examples.php15
-rwxr-xr-xtests/simpletest/test/support/supplementary_upload_sample.txt1
-rwxr-xr-xtests/simpletest/test/support/upload_sample.txt1
-rwxr-xr-xtests/simpletest/test/tag_test.php554
-rwxr-xr-xtests/simpletest/test/test_with_parse_error.php8
-rwxr-xr-xtests/simpletest/test/unit_tester_test.php55
-rwxr-xr-xtests/simpletest/test/unit_tests.php54
-rwxr-xr-xtests/simpletest/test/url_test.php415
-rwxr-xr-xtests/simpletest/test/user_agent_test.php358
-rwxr-xr-xtests/simpletest/test/visual_test.php495
-rwxr-xr-xtests/simpletest/test/web_tester_test.php156
-rwxr-xr-xtests/simpletest/test/xml_test.php187
-rwxr-xr-xtests/simpletest/test_case.php669
-rwxr-xr-xtests/simpletest/unit_tester.php417
-rwxr-xr-xtests/simpletest/url.php526
-rwxr-xr-xtests/simpletest/user_agent.php333
-rwxr-xr-xtests/simpletest/web_tester.php1541
-rwxr-xr-xtests/simpletest/xml.php647
1033 files changed, 256575 insertions, 0 deletions
diff --git a/.htaccess b/.htaccess
new file mode 100755
index 0000000000..1037c5b0bb
--- /dev/null
+++ b/.htaccess
@@ -0,0 +1,2 @@
+php_flag magic_quotes_gpc off
+php_flag register_globals off
diff --git a/.project b/.project
new file mode 100755
index 0000000000..dc0daa8d60
--- /dev/null
+++ b/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>piwiktrunk</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>net.sourceforge.phpeclipse.parserbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>net.sourceforge.phpeclipse.phpnature</nature>
+ </natures>
+</projectDescription>
diff --git a/index.php b/index.php
new file mode 100755
index 0000000000..4c02c9bdfb
--- /dev/null
+++ b/index.php
@@ -0,0 +1,110 @@
+<?php
+/*
+ * PHP Configuration init
+ */
+error_reporting(E_ALL|E_NOTICE);
+date_default_timezone_set('Europe/London');
+define('PIWIK_INCLUDE_PATH', '.');
+
+require_once PIWIK_INCLUDE_PATH . "/modules/ErrorHandler.php";
+set_error_handler('Piwik_ErrorHandler');
+
+function Piwik_ExceptionHandler(Exception $exception) {
+ echo "<div style='font-size:11pt'><pre>Uncaught exception: " , $exception->getMessage(), "\n";
+ echo $exception->__toString();
+ exit;
+}
+set_exception_handler('Piwik_ExceptionHandler');
+
+set_include_path(PIWIK_INCLUDE_PATH
+ . PATH_SEPARATOR . PIWIK_INCLUDE_PATH . '/libs/'
+ . PATH_SEPARATOR . PIWIK_INCLUDE_PATH . '/core/'
+ . PATH_SEPARATOR . PIWIK_INCLUDE_PATH . '/modules'
+ . PATH_SEPARATOR . PIWIK_INCLUDE_PATH . '/core/models'
+ . PATH_SEPARATOR . get_include_path());
+
+assert_options(ASSERT_ACTIVE, 1);
+assert_options(ASSERT_WARNING, 1);
+assert_options(ASSERT_BAIL, 1);
+
+
+/*
+ * Zend classes
+ */
+include "Zend/Exception.php";
+include "Zend/Loader.php";
+Zend_Loader::loadClass('Zend_Controller_Front');
+Zend_Loader::loadClass('Zend_Registry');
+Zend_Loader::loadClass('Zend_Config_Ini');
+Zend_Loader::loadClass('Zend_Db');
+Zend_Loader::loadClass('Zend_Db_Table');
+Zend_Loader::loadClass('Zend_Debug');
+Zend_Loader::loadClass('Zend_Auth');
+Zend_Loader::loadClass('Zend_Acl');
+Zend_Loader::loadClass('Zend_Acl_Resource');
+Zend_Loader::loadClass('Zend_Acl_Role');
+Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
+
+/*
+ * Piwik classes
+ */
+Zend_Loader::loadClass('Piwik_Access');
+Zend_Loader::loadClass('Piwik_Apiable');
+Zend_Loader::loadClass('Piwik_Log');
+Zend_Loader::loadClass('Piwik_Config');
+Zend_Loader::loadClass('Piwik_PublicApi');
+Zend_Loader::loadClass('Piwik');
+
+
+Piwik::createConfigObject();
+Piwik::createDatabaseObject();
+Piwik::createLogObject();
+
+Piwik::createTables();
+
+/*Piwik_UsersManager::deleteUser("login");
+Piwik_UsersManager::deleteUser("login2");
+Piwik_UsersManager::addUser("login","password1", "alias", "ema@i.coml");
+Piwik_UsersManager::addUser("login2","password2", "alias23", "ema2@i.coml");
+
+Piwik_SitesManager::replaceSiteUrls(1, array());
+Piwik_SitesManager::addSiteUrls(1, array("https://1", "http://2"));
+//var_dump(Piwik_SitesManager::getSiteUrlsFromId(4));
+//Piwik_SitesManager::addSite("many urls", array("https://t", "http://localhost/", "http://domain76.com/ijndex/"));
+
+Piwik_UsersManager::setUserRole("admin", "login", array(3,5));
+Piwik_UsersManager::setUserRole("admin", "login", array(6,7));
+*/
+
+// Create auth object
+$auth = Zend_Auth::getInstance();
+$authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Registry::get('db'));
+$authAdapter->setTableName(Piwik::prefixTable('user'))
+ ->setIdentityColumn('login')
+ ->setCredentialColumn('password')
+ ->setCredentialTreatment('MD5(?)');
+
+// Set the input credential values (e.g., from a login form)
+$authAdapter->setIdentity('login')
+ ->setCredential('password1');
+
+// Perform the authentication query, saving the result
+$access = new Piwik_Access($authAdapter);
+Zend_Registry::set('access', $access);
+
+main();
+//Piwik::uninstall();
+
+function main()
+{
+ Piwik::log("Start process...");
+ $api = Piwik_PublicApi::getInstance();
+ $api->registerClass("Piwik_SitesManager");
+ $api->registerClass("Piwik_UsersManager");
+
+ $api->SitesManager->getSiteUrlsFromId(1);
+ $api->SitesManager->addSite("test name site", array("http://localhost", "http://test.com"));
+ $api->UsersManager->addUser(2, "login", "password");
+}
+
+?> \ No newline at end of file
diff --git a/libs/HTML/Common.php b/libs/HTML/Common.php
new file mode 100755
index 0000000000..9b7bae4a6c
--- /dev/null
+++ b/libs/HTML/Common.php
@@ -0,0 +1,464 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Base class for all HTML classes
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_Common
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: Common.php,v 1.14 2007/05/16 20:06:44 avb Exp $
+ * @link http://pear.php.net/package/HTML_Common/
+ */
+
+/**
+ * Base class for all HTML classes
+ *
+ * @category HTML
+ * @package HTML_Common
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @version Release: 1.2.4
+ * @abstract
+ */
+class HTML_Common
+{
+ /**
+ * Associative array of attributes
+ * @var array
+ * @access private
+ */
+ var $_attributes = array();
+
+ /**
+ * Tab offset of the tag
+ * @var int
+ * @access private
+ */
+ var $_tabOffset = 0;
+
+ /**
+ * Tab string
+ * @var string
+ * @since 1.7
+ * @access private
+ */
+ var $_tab = "\11";
+
+ /**
+ * Contains the line end string
+ * @var string
+ * @since 1.7
+ * @access private
+ */
+ var $_lineEnd = "\12";
+
+ /**
+ * HTML comment on the object
+ * @var string
+ * @since 1.5
+ * @access private
+ */
+ var $_comment = '';
+
+ /**
+ * Class constructor
+ * @param mixed $attributes Associative array of table tag attributes
+ * or HTML attributes name="value" pairs
+ * @param int $tabOffset Indent offset in tabs
+ * @access public
+ */
+ function HTML_Common($attributes = null, $tabOffset = 0)
+ {
+ $this->setAttributes($attributes);
+ $this->setTabOffset($tabOffset);
+ } // end constructor
+
+ /**
+ * Returns the current API version
+ * @access public
+ * @returns double
+ */
+ function apiVersion()
+ {
+ return 1.7;
+ } // end func apiVersion
+
+ /**
+ * Returns the lineEnd
+ *
+ * @since 1.7
+ * @access private
+ * @return string
+ */
+ function _getLineEnd()
+ {
+ return $this->_lineEnd;
+ } // end func getLineEnd
+
+ /**
+ * Returns a string containing the unit for indenting HTML
+ *
+ * @since 1.7
+ * @access private
+ * @return string
+ */
+ function _getTab()
+ {
+ return $this->_tab;
+ } // end func _getTab
+
+ /**
+ * Returns a string containing the offset for the whole HTML code
+ *
+ * @return string
+ * @access private
+ */
+ function _getTabs()
+ {
+ return str_repeat($this->_getTab(), $this->_tabOffset);
+ } // end func _getTabs
+
+ /**
+ * Returns an HTML formatted attribute string
+ * @param array $attributes
+ * @return string
+ * @access private
+ */
+ function _getAttrString($attributes)
+ {
+ $strAttr = '';
+
+ if (is_array($attributes)) {
+ $charset = HTML_Common::charset();
+ foreach ($attributes as $key => $value) {
+ $strAttr .= ' ' . $key . '="' . htmlspecialchars($value, ENT_COMPAT, $charset) . '"';
+ }
+ }
+ return $strAttr;
+ } // end func _getAttrString
+
+ /**
+ * Returns a valid atrributes array from either a string or array
+ * @param mixed $attributes Either a typical HTML attribute string or an associative array
+ * @access private
+ * @return array
+ */
+ function _parseAttributes($attributes)
+ {
+ if (is_array($attributes)) {
+ $ret = array();
+ foreach ($attributes as $key => $value) {
+ if (is_int($key)) {
+ $key = $value = strtolower($value);
+ } else {
+ $key = strtolower($key);
+ }
+ $ret[$key] = $value;
+ }
+ return $ret;
+
+ } elseif (is_string($attributes)) {
+ $preg = "/(([A-Za-z_:]|[^\\x00-\\x7F])([A-Za-z0-9_:.-]|[^\\x00-\\x7F])*)" .
+ "([ \\n\\t\\r]+)?(=([ \\n\\t\\r]+)?(\"[^\"]*\"|'[^']*'|[^ \\n\\t\\r]*))?/";
+ if (preg_match_all($preg, $attributes, $regs)) {
+ for ($counter=0; $counter<count($regs[1]); $counter++) {
+ $name = $regs[1][$counter];
+ $check = $regs[0][$counter];
+ $value = $regs[7][$counter];
+ if (trim($name) == trim($check)) {
+ $arrAttr[strtolower(trim($name))] = strtolower(trim($name));
+ } else {
+ if (substr($value, 0, 1) == "\"" || substr($value, 0, 1) == "'") {
+ $value = substr($value, 1, -1);
+ }
+ $arrAttr[strtolower(trim($name))] = trim($value);
+ }
+ }
+ return $arrAttr;
+ }
+ }
+ } // end func _parseAttributes
+
+ /**
+ * Returns the array key for the given non-name-value pair attribute
+ *
+ * @param string $attr Attribute
+ * @param array $attributes Array of attribute
+ * @since 1.0
+ * @access private
+ * @return bool
+ */
+ function _getAttrKey($attr, $attributes)
+ {
+ if (isset($attributes[strtolower($attr)])) {
+ return true;
+ } else {
+ return null;
+ }
+ } //end func _getAttrKey
+
+ /**
+ * Updates the attributes in $attr1 with the values in $attr2 without changing the other existing attributes
+ * @param array $attr1 Original attributes array
+ * @param array $attr2 New attributes array
+ * @access private
+ */
+ function _updateAttrArray(&$attr1, $attr2)
+ {
+ if (!is_array($attr2)) {
+ return false;
+ }
+ foreach ($attr2 as $key => $value) {
+ $attr1[$key] = $value;
+ }
+ } // end func _updateAtrrArray
+
+ /**
+ * Removes the given attribute from the given array
+ *
+ * @param string $attr Attribute name
+ * @param array $attributes Attribute array
+ * @since 1.4
+ * @access private
+ * @return void
+ */
+ function _removeAttr($attr, &$attributes)
+ {
+ $attr = strtolower($attr);
+ if (isset($attributes[$attr])) {
+ unset($attributes[$attr]);
+ }
+ } //end func _removeAttr
+
+ /**
+ * Returns the value of the given attribute
+ *
+ * @param string $attr Attribute name
+ * @since 1.5
+ * @access public
+ * @return string|null returns null if an attribute does not exist
+ */
+ function getAttribute($attr)
+ {
+ $attr = strtolower($attr);
+ if (isset($this->_attributes[$attr])) {
+ return $this->_attributes[$attr];
+ }
+ return null;
+ } //end func getAttribute
+
+ /**
+ * Sets the value of the attribute
+ *
+ * @param string Attribute name
+ * @param string Attribute value (will be set to $name if omitted)
+ * @access public
+ */
+ function setAttribute($name, $value = null)
+ {
+ $name = strtolower($name);
+ if (is_null($value)) {
+ $value = $name;
+ }
+ $this->_attributes[$name] = $value;
+ } // end func setAttribute
+
+ /**
+ * Sets the HTML attributes
+ * @param mixed $attributes Either a typical HTML attribute string or an associative array
+ * @access public
+ */
+ function setAttributes($attributes)
+ {
+ $this->_attributes = $this->_parseAttributes($attributes);
+ } // end func setAttributes
+
+ /**
+ * Returns the assoc array (default) or string of attributes
+ *
+ * @param bool Whether to return the attributes as string
+ * @since 1.6
+ * @access public
+ * @return mixed attributes
+ */
+ function getAttributes($asString = false)
+ {
+ if ($asString) {
+ return $this->_getAttrString($this->_attributes);
+ } else {
+ return $this->_attributes;
+ }
+ } //end func getAttributes
+
+ /**
+ * Updates the passed attributes without changing the other existing attributes
+ * @param mixed $attributes Either a typical HTML attribute string or an associative array
+ * @access public
+ */
+ function updateAttributes($attributes)
+ {
+ $this->_updateAttrArray($this->_attributes, $this->_parseAttributes($attributes));
+ } // end func updateAttributes
+
+ /**
+ * Removes an attribute
+ *
+ * @param string $attr Attribute name
+ * @since 1.4
+ * @access public
+ * @return void
+ */
+ function removeAttribute($attr)
+ {
+ $this->_removeAttr($attr, $this->_attributes);
+ } //end func removeAttribute
+
+ /**
+ * Sets the line end style to Windows, Mac, Unix or a custom string.
+ *
+ * @param string $style "win", "mac", "unix" or custom string.
+ * @since 1.7
+ * @access public
+ * @return void
+ */
+ function setLineEnd($style)
+ {
+ switch ($style) {
+ case 'win':
+ $this->_lineEnd = "\15\12";
+ break;
+ case 'unix':
+ $this->_lineEnd = "\12";
+ break;
+ case 'mac':
+ $this->_lineEnd = "\15";
+ break;
+ default:
+ $this->_lineEnd = $style;
+ }
+ } // end func setLineEnd
+
+ /**
+ * Sets the tab offset
+ *
+ * @param int $offset
+ * @access public
+ */
+ function setTabOffset($offset)
+ {
+ $this->_tabOffset = $offset;
+ } // end func setTabOffset
+
+ /**
+ * Returns the tabOffset
+ *
+ * @since 1.5
+ * @access public
+ * @return int
+ */
+ function getTabOffset()
+ {
+ return $this->_tabOffset;
+ } //end func getTabOffset
+
+ /**
+ * Sets the string used to indent HTML
+ *
+ * @since 1.7
+ * @param string $string String used to indent ("\11", "\t", ' ', etc.).
+ * @access public
+ * @return void
+ */
+ function setTab($string)
+ {
+ $this->_tab = $string;
+ } // end func setTab
+
+ /**
+ * Sets the HTML comment to be displayed at the beginning of the HTML string
+ *
+ * @param string
+ * @since 1.4
+ * @access public
+ * @return void
+ */
+ function setComment($comment)
+ {
+ $this->_comment = $comment;
+ } // end func setHtmlComment
+
+ /**
+ * Returns the HTML comment
+ *
+ * @since 1.5
+ * @access public
+ * @return string
+ */
+ function getComment()
+ {
+ return $this->_comment;
+ } //end func getComment
+
+ /**
+ * Abstract method. Must be extended to return the objects HTML
+ *
+ * @access public
+ * @return string
+ * @abstract
+ */
+ function toHtml()
+ {
+ return '';
+ } // end func toHtml
+
+ /**
+ * Displays the HTML to the screen
+ *
+ * @access public
+ */
+ function display()
+ {
+ print $this->toHtml();
+ } // end func display
+
+ /**
+ * Sets the charset to use by htmlspecialchars() function
+ *
+ * Since this parameter is expected to be global, the function is designed
+ * to be called statically:
+ * <code>
+ * HTML_Common::charset('utf-8');
+ * </code>
+ * or
+ * <code>
+ * $charset = HTML_Common::charset();
+ * </code>
+ *
+ * @param string New charset to use. Omit if just getting the
+ * current value. Consult the htmlspecialchars() docs
+ * for a list of supported character sets.
+ * @return string Current charset
+ * @access public
+ * @static
+ */
+ function charset($newCharset = null)
+ {
+ static $charset = 'ISO-8859-1';
+
+ if (!is_null($newCharset)) {
+ $charset = $newCharset;
+ }
+ return $charset;
+ } // end func charset
+} // end class HTML_Common
+?>
diff --git a/libs/HTML/QuickForm.php b/libs/HTML/QuickForm.php
new file mode 100755
index 0000000000..f32ad07342
--- /dev/null
+++ b/libs/HTML/QuickForm.php
@@ -0,0 +1,2054 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Create, validate and process HTML forms
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: QuickForm.php,v 1.163 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * PEAR and PEAR_Error classes, for error handling
+ */
+require_once 'PEAR.php';
+/**
+ * Base class for all HTML classes
+ */
+require_once 'HTML/Common.php';
+
+/**
+ * Element types known to HTML_QuickForm
+ * @see HTML_QuickForm::registerElementType(), HTML_QuickForm::getRegisteredTypes(),
+ * HTML_QuickForm::isTypeRegistered()
+ * @global array $GLOBALS['HTML_QUICKFORM_ELEMENT_TYPES']
+ */
+$GLOBALS['HTML_QUICKFORM_ELEMENT_TYPES'] =
+ array(
+ 'group' =>array('HTML/QuickForm/group.php','HTML_QuickForm_group'),
+ 'hidden' =>array('HTML/QuickForm/hidden.php','HTML_QuickForm_hidden'),
+ 'reset' =>array('HTML/QuickForm/reset.php','HTML_QuickForm_reset'),
+ 'checkbox' =>array('HTML/QuickForm/checkbox.php','HTML_QuickForm_checkbox'),
+ 'file' =>array('HTML/QuickForm/file.php','HTML_QuickForm_file'),
+ 'image' =>array('HTML/QuickForm/image.php','HTML_QuickForm_image'),
+ 'password' =>array('HTML/QuickForm/password.php','HTML_QuickForm_password'),
+ 'radio' =>array('HTML/QuickForm/radio.php','HTML_QuickForm_radio'),
+ 'button' =>array('HTML/QuickForm/button.php','HTML_QuickForm_button'),
+ 'submit' =>array('HTML/QuickForm/submit.php','HTML_QuickForm_submit'),
+ 'select' =>array('HTML/QuickForm/select.php','HTML_QuickForm_select'),
+ 'hiddenselect' =>array('HTML/QuickForm/hiddenselect.php','HTML_QuickForm_hiddenselect'),
+ 'text' =>array('HTML/QuickForm/text.php','HTML_QuickForm_text'),
+ 'textarea' =>array('HTML/QuickForm/textarea.php','HTML_QuickForm_textarea'),
+ 'link' =>array('HTML/QuickForm/link.php','HTML_QuickForm_link'),
+ 'advcheckbox' =>array('HTML/QuickForm/advcheckbox.php','HTML_QuickForm_advcheckbox'),
+ 'date' =>array('HTML/QuickForm/date.php','HTML_QuickForm_date'),
+ 'static' =>array('HTML/QuickForm/static.php','HTML_QuickForm_static'),
+ 'header' =>array('HTML/QuickForm/header.php', 'HTML_QuickForm_header'),
+ 'html' =>array('HTML/QuickForm/html.php', 'HTML_QuickForm_html'),
+ 'hierselect' =>array('HTML/QuickForm/hierselect.php', 'HTML_QuickForm_hierselect'),
+ 'autocomplete' =>array('HTML/QuickForm/autocomplete.php', 'HTML_QuickForm_autocomplete'),
+ 'xbutton' =>array('HTML/QuickForm/xbutton.php','HTML_QuickForm_xbutton')
+ );
+
+/**
+ * Validation rules known to HTML_QuickForm
+ * @see HTML_QuickForm::registerRule(), HTML_QuickForm::getRegisteredRules(),
+ * HTML_QuickForm::isRuleRegistered()
+ * @global array $GLOBALS['_HTML_QuickForm_registered_rules']
+ */
+$GLOBALS['_HTML_QuickForm_registered_rules'] = array(
+ 'required' => array('html_quickform_rule_required', 'HTML/QuickForm/Rule/Required.php'),
+ 'maxlength' => array('html_quickform_rule_range', 'HTML/QuickForm/Rule/Range.php'),
+ 'minlength' => array('html_quickform_rule_range', 'HTML/QuickForm/Rule/Range.php'),
+ 'rangelength' => array('html_quickform_rule_range', 'HTML/QuickForm/Rule/Range.php'),
+ 'email' => array('html_quickform_rule_email', 'HTML/QuickForm/Rule/Email.php'),
+ 'regex' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
+ 'lettersonly' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
+ 'alphanumeric' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
+ 'numeric' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
+ 'nopunctuation' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
+ 'nonzero' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
+ 'callback' => array('html_quickform_rule_callback', 'HTML/QuickForm/Rule/Callback.php'),
+ 'compare' => array('html_quickform_rule_compare', 'HTML/QuickForm/Rule/Compare.php')
+);
+
+// {{{ error codes
+
+/**#@+
+ * Error codes for HTML_QuickForm
+ *
+ * Codes are mapped to textual messages by errorMessage() method, if you add a
+ * new code be sure to add a new message for it to errorMessage()
+ *
+ * @see HTML_QuickForm::errorMessage()
+ */
+define('QUICKFORM_OK', 1);
+define('QUICKFORM_ERROR', -1);
+define('QUICKFORM_INVALID_RULE', -2);
+define('QUICKFORM_NONEXIST_ELEMENT', -3);
+define('QUICKFORM_INVALID_FILTER', -4);
+define('QUICKFORM_UNREGISTERED_ELEMENT', -5);
+define('QUICKFORM_INVALID_ELEMENT_NAME', -6);
+define('QUICKFORM_INVALID_PROCESS', -7);
+define('QUICKFORM_DEPRECATED', -8);
+define('QUICKFORM_INVALID_DATASOURCE', -9);
+/**#@-*/
+
+// }}}
+
+/**
+ * Create, validate and process HTML forms
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ */
+class HTML_QuickForm extends HTML_Common
+{
+ // {{{ properties
+
+ /**
+ * Array containing the form fields
+ * @since 1.0
+ * @var array
+ * @access private
+ */
+ var $_elements = array();
+
+ /**
+ * Array containing element name to index map
+ * @since 1.1
+ * @var array
+ * @access private
+ */
+ var $_elementIndex = array();
+
+ /**
+ * Array containing indexes of duplicate elements
+ * @since 2.10
+ * @var array
+ * @access private
+ */
+ var $_duplicateIndex = array();
+
+ /**
+ * Array containing required field IDs
+ * @since 1.0
+ * @var array
+ * @access private
+ */
+ var $_required = array();
+
+ /**
+ * Prefix message in javascript alert if error
+ * @since 1.0
+ * @var string
+ * @access public
+ */
+ var $_jsPrefix = 'Invalid information entered.';
+
+ /**
+ * Postfix message in javascript alert if error
+ * @since 1.0
+ * @var string
+ * @access public
+ */
+ var $_jsPostfix = 'Please correct these fields.';
+
+ /**
+ * Datasource object implementing the informal
+ * datasource protocol
+ * @since 3.3
+ * @var object
+ * @access private
+ */
+ var $_datasource;
+
+ /**
+ * Array of default form values
+ * @since 2.0
+ * @var array
+ * @access private
+ */
+ var $_defaultValues = array();
+
+ /**
+ * Array of constant form values
+ * @since 2.0
+ * @var array
+ * @access private
+ */
+ var $_constantValues = array();
+
+ /**
+ * Array of submitted form values
+ * @since 1.0
+ * @var array
+ * @access private
+ */
+ var $_submitValues = array();
+
+ /**
+ * Array of submitted form files
+ * @since 1.0
+ * @var integer
+ * @access public
+ */
+ var $_submitFiles = array();
+
+ /**
+ * Value for maxfilesize hidden element if form contains file input
+ * @since 1.0
+ * @var integer
+ * @access public
+ */
+ var $_maxFileSize = 1048576; // 1 Mb = 1048576
+
+ /**
+ * Flag to know if all fields are frozen
+ * @since 1.0
+ * @var boolean
+ * @access private
+ */
+ var $_freezeAll = false;
+
+ /**
+ * Array containing the form rules
+ * @since 1.0
+ * @var array
+ * @access private
+ */
+ var $_rules = array();
+
+ /**
+ * Form rules, global variety
+ * @var array
+ * @access private
+ */
+ var $_formRules = array();
+
+ /**
+ * Array containing the validation errors
+ * @since 1.0
+ * @var array
+ * @access private
+ */
+ var $_errors = array();
+
+ /**
+ * Note for required fields in the form
+ * @var string
+ * @since 1.0
+ * @access private
+ */
+ var $_requiredNote = '<span style="font-size:80%; color:#ff0000;">*</span><span style="font-size:80%;"> denotes required field</span>';
+
+ /**
+ * Whether the form was submitted
+ * @var boolean
+ * @access private
+ */
+ var $_flagSubmitted = false;
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ * @param string $formName Form's name.
+ * @param string $method (optional)Form's method defaults to 'POST'
+ * @param string $action (optional)Form's action
+ * @param string $target (optional)Form's target defaults to '_self'
+ * @param mixed $attributes (optional)Extra attributes for <form> tag
+ * @param bool $trackSubmit (optional)Whether to track if the form was submitted by adding a special hidden field
+ * @access public
+ */
+ function HTML_QuickForm($formName='', $method='post', $action='', $target='', $attributes=null, $trackSubmit = false)
+ {
+ HTML_Common::HTML_Common($attributes);
+ $method = (strtoupper($method) == 'GET') ? 'get' : 'post';
+ $action = ($action == '') ? $_SERVER['PHP_SELF'] : $action;
+ $target = empty($target) ? array() : array('target' => $target);
+ $attributes = array('action'=>$action, 'method'=>$method, 'name'=>$formName, 'id'=>$formName) + $target;
+ $this->updateAttributes($attributes);
+ if (!$trackSubmit || isset($_REQUEST['_qf__' . $formName])) {
+ if (1 == get_magic_quotes_gpc()) {
+ $this->_submitValues = $this->_recursiveFilter('stripslashes', 'get' == $method? $_GET: $_POST);
+ foreach ($_FILES as $keyFirst => $valFirst) {
+ foreach ($valFirst as $keySecond => $valSecond) {
+ if ('name' == $keySecond) {
+ $this->_submitFiles[$keyFirst][$keySecond] = $this->_recursiveFilter('stripslashes', $valSecond);
+ } else {
+ $this->_submitFiles[$keyFirst][$keySecond] = $valSecond;
+ }
+ }
+ }
+ } else {
+ $this->_submitValues = 'get' == $method? $_GET: $_POST;
+ $this->_submitFiles = $_FILES;
+ }
+ $this->_flagSubmitted = count($this->_submitValues) > 0 || count($this->_submitFiles) > 0;
+ }
+ if ($trackSubmit) {
+ unset($this->_submitValues['_qf__' . $formName]);
+ $this->addElement('hidden', '_qf__' . $formName, null);
+ }
+ if (preg_match('/^([0-9]+)([a-zA-Z]*)$/', ini_get('upload_max_filesize'), $matches)) {
+ // see http://www.php.net/manual/en/faq.using.php#faq.using.shorthandbytes
+ switch (strtoupper($matches['2'])) {
+ case 'G':
+ $this->_maxFileSize = $matches['1'] * 1073741824;
+ break;
+ case 'M':
+ $this->_maxFileSize = $matches['1'] * 1048576;
+ break;
+ case 'K':
+ $this->_maxFileSize = $matches['1'] * 1024;
+ break;
+ default:
+ $this->_maxFileSize = $matches['1'];
+ }
+ }
+ } // end constructor
+
+ // }}}
+ // {{{ apiVersion()
+
+ /**
+ * Returns the current API version
+ *
+ * @since 1.0
+ * @access public
+ * @return float
+ */
+ function apiVersion()
+ {
+ return 3.2;
+ } // end func apiVersion
+
+ // }}}
+ // {{{ registerElementType()
+
+ /**
+ * Registers a new element type
+ *
+ * @param string $typeName Name of element type
+ * @param string $include Include path for element type
+ * @param string $className Element class name
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function registerElementType($typeName, $include, $className)
+ {
+ $GLOBALS['HTML_QUICKFORM_ELEMENT_TYPES'][strtolower($typeName)] = array($include, $className);
+ } // end func registerElementType
+
+ // }}}
+ // {{{ registerRule()
+
+ /**
+ * Registers a new validation rule
+ *
+ * @param string $ruleName Name of validation rule
+ * @param string $type Either: 'regex', 'function' or 'rule' for an HTML_QuickForm_Rule object
+ * @param string $data1 Name of function, regular expression or HTML_QuickForm_Rule classname
+ * @param string $data2 Object parent of above function or HTML_QuickForm_Rule file path
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function registerRule($ruleName, $type, $data1, $data2 = null)
+ {
+ include_once('HTML/QuickForm/RuleRegistry.php');
+ $registry =& HTML_QuickForm_RuleRegistry::singleton();
+ $registry->registerRule($ruleName, $type, $data1, $data2);
+ } // end func registerRule
+
+ // }}}
+ // {{{ elementExists()
+
+ /**
+ * Returns true if element is in the form
+ *
+ * @param string $element form name of element to check
+ * @since 1.0
+ * @access public
+ * @return boolean
+ */
+ function elementExists($element=null)
+ {
+ return isset($this->_elementIndex[$element]);
+ } // end func elementExists
+
+ // }}}
+ // {{{ setDatasource()
+
+ /**
+ * Sets a datasource object for this form object
+ *
+ * Datasource default and constant values will feed the QuickForm object if
+ * the datasource implements defaultValues() and constantValues() methods.
+ *
+ * @param object $datasource datasource object implementing the informal datasource protocol
+ * @param mixed $defaultsFilter string or array of filter(s) to apply to default values
+ * @param mixed $constantsFilter string or array of filter(s) to apply to constants values
+ * @since 3.3
+ * @access public
+ * @return void
+ * @throws HTML_QuickForm_Error
+ */
+ function setDatasource(&$datasource, $defaultsFilter = null, $constantsFilter = null)
+ {
+ if (is_object($datasource)) {
+ $this->_datasource =& $datasource;
+ if (is_callable(array($datasource, 'defaultValues'))) {
+ $this->setDefaults($datasource->defaultValues($this), $defaultsFilter);
+ }
+ if (is_callable(array($datasource, 'constantValues'))) {
+ $this->setConstants($datasource->constantValues($this), $constantsFilter);
+ }
+ } else {
+ return PEAR::raiseError(null, QUICKFORM_INVALID_DATASOURCE, null, E_USER_WARNING, "Datasource is not an object in QuickForm::setDatasource()", 'HTML_QuickForm_Error', true);
+ }
+ } // end func setDatasource
+
+ // }}}
+ // {{{ setDefaults()
+
+ /**
+ * Initializes default form values
+ *
+ * @param array $defaultValues values used to fill the form
+ * @param mixed $filter (optional) filter(s) to apply to all default values
+ * @since 1.0
+ * @access public
+ * @return void
+ * @throws HTML_QuickForm_Error
+ */
+ function setDefaults($defaultValues = null, $filter = null)
+ {
+ if (is_array($defaultValues)) {
+ if (isset($filter)) {
+ if (is_array($filter) && (2 != count($filter) || !is_callable($filter))) {
+ foreach ($filter as $val) {
+ if (!is_callable($val)) {
+ return PEAR::raiseError(null, QUICKFORM_INVALID_FILTER, null, E_USER_WARNING, "Callback function does not exist in QuickForm::setDefaults()", 'HTML_QuickForm_Error', true);
+ } else {
+ $defaultValues = $this->_recursiveFilter($val, $defaultValues);
+ }
+ }
+ } elseif (!is_callable($filter)) {
+ return PEAR::raiseError(null, QUICKFORM_INVALID_FILTER, null, E_USER_WARNING, "Callback function does not exist in QuickForm::setDefaults()", 'HTML_QuickForm_Error', true);
+ } else {
+ $defaultValues = $this->_recursiveFilter($filter, $defaultValues);
+ }
+ }
+ $this->_defaultValues = HTML_QuickForm::arrayMerge($this->_defaultValues, $defaultValues);
+ foreach (array_keys($this->_elements) as $key) {
+ $this->_elements[$key]->onQuickFormEvent('updateValue', null, $this);
+ }
+ }
+ } // end func setDefaults
+
+ // }}}
+ // {{{ setConstants()
+
+ /**
+ * Initializes constant form values.
+ * These values won't get overridden by POST or GET vars
+ *
+ * @param array $constantValues values used to fill the form
+ * @param mixed $filter (optional) filter(s) to apply to all default values
+ *
+ * @since 2.0
+ * @access public
+ * @return void
+ * @throws HTML_QuickForm_Error
+ */
+ function setConstants($constantValues = null, $filter = null)
+ {
+ if (is_array($constantValues)) {
+ if (isset($filter)) {
+ if (is_array($filter) && (2 != count($filter) || !is_callable($filter))) {
+ foreach ($filter as $val) {
+ if (!is_callable($val)) {
+ return PEAR::raiseError(null, QUICKFORM_INVALID_FILTER, null, E_USER_WARNING, "Callback function does not exist in QuickForm::setConstants()", 'HTML_QuickForm_Error', true);
+ } else {
+ $constantValues = $this->_recursiveFilter($val, $constantValues);
+ }
+ }
+ } elseif (!is_callable($filter)) {
+ return PEAR::raiseError(null, QUICKFORM_INVALID_FILTER, null, E_USER_WARNING, "Callback function does not exist in QuickForm::setConstants()", 'HTML_QuickForm_Error', true);
+ } else {
+ $constantValues = $this->_recursiveFilter($filter, $constantValues);
+ }
+ }
+ $this->_constantValues = HTML_QuickForm::arrayMerge($this->_constantValues, $constantValues);
+ foreach (array_keys($this->_elements) as $key) {
+ $this->_elements[$key]->onQuickFormEvent('updateValue', null, $this);
+ }
+ }
+ } // end func setConstants
+
+ // }}}
+ // {{{ setMaxFileSize()
+
+ /**
+ * Sets the value of MAX_FILE_SIZE hidden element
+ *
+ * @param int $bytes Size in bytes
+ * @since 3.0
+ * @access public
+ * @return void
+ */
+ function setMaxFileSize($bytes = 0)
+ {
+ if ($bytes > 0) {
+ $this->_maxFileSize = $bytes;
+ }
+ if (!$this->elementExists('MAX_FILE_SIZE')) {
+ $this->addElement('hidden', 'MAX_FILE_SIZE', $this->_maxFileSize);
+ } else {
+ $el =& $this->getElement('MAX_FILE_SIZE');
+ $el->updateAttributes(array('value' => $this->_maxFileSize));
+ }
+ } // end func setMaxFileSize
+
+ // }}}
+ // {{{ getMaxFileSize()
+
+ /**
+ * Returns the value of MAX_FILE_SIZE hidden element
+ *
+ * @since 3.0
+ * @access public
+ * @return int max file size in bytes
+ */
+ function getMaxFileSize()
+ {
+ return $this->_maxFileSize;
+ } // end func getMaxFileSize
+
+ // }}}
+ // {{{ &createElement()
+
+ /**
+ * Creates a new form element of the given type.
+ *
+ * This method accepts variable number of parameters, their
+ * meaning and count depending on $elementType
+ *
+ * @param string $elementType type of element to add (text, textarea, file...)
+ * @since 1.0
+ * @access public
+ * @return HTML_QuickForm_Element
+ * @throws HTML_QuickForm_Error
+ */
+ function &createElement($elementType)
+ {
+ $args = func_get_args();
+ $element =& HTML_QuickForm::_loadElement('createElement', $elementType, array_slice($args, 1));
+ return $element;
+ } // end func createElement
+
+ // }}}
+ // {{{ _loadElement()
+
+ /**
+ * Returns a form element of the given type
+ *
+ * @param string $event event to send to newly created element ('createElement' or 'addElement')
+ * @param string $type element type
+ * @param array $args arguments for event
+ * @since 2.0
+ * @access private
+ * @return HTML_QuickForm_Element
+ * @throws HTML_QuickForm_Error
+ */
+ function &_loadElement($event, $type, $args)
+ {
+ $type = strtolower($type);
+ if (!HTML_QuickForm::isTypeRegistered($type)) {
+ $error = PEAR::raiseError(null, QUICKFORM_UNREGISTERED_ELEMENT, null, E_USER_WARNING, "Element '$type' does not exist in HTML_QuickForm::_loadElement()", 'HTML_QuickForm_Error', true);
+ return $error;
+ }
+ $className = $GLOBALS['HTML_QUICKFORM_ELEMENT_TYPES'][$type][1];
+ $includeFile = $GLOBALS['HTML_QUICKFORM_ELEMENT_TYPES'][$type][0];
+ include_once($includeFile);
+ $elementObject =& new $className();
+ for ($i = 0; $i < 5; $i++) {
+ if (!isset($args[$i])) {
+ $args[$i] = null;
+ }
+ }
+ $err = $elementObject->onQuickFormEvent($event, $args, $this);
+ if ($err !== true) {
+ return $err;
+ }
+ return $elementObject;
+ } // end func _loadElement
+
+ // }}}
+ // {{{ addElement()
+
+ /**
+ * Adds an element into the form
+ *
+ * If $element is a string representing element type, then this
+ * method accepts variable number of parameters, their meaning
+ * and count depending on $element
+ *
+ * @param mixed $element element object or type of element to add (text, textarea, file...)
+ * @since 1.0
+ * @return HTML_QuickForm_Element a reference to newly added element
+ * @access public
+ * @throws HTML_QuickForm_Error
+ */
+ function &addElement($element)
+ {
+ if (is_object($element) && is_subclass_of($element, 'html_quickform_element')) {
+ $elementObject = &$element;
+ $elementObject->onQuickFormEvent('updateValue', null, $this);
+ } else {
+ $args = func_get_args();
+ $elementObject =& $this->_loadElement('addElement', $element, array_slice($args, 1));
+ if (PEAR::isError($elementObject)) {
+ return $elementObject;
+ }
+ }
+ $elementName = $elementObject->getName();
+
+ // Add the element if it is not an incompatible duplicate
+ if (!empty($elementName) && isset($this->_elementIndex[$elementName])) {
+ if ($this->_elements[$this->_elementIndex[$elementName]]->getType() ==
+ $elementObject->getType()) {
+ $this->_elements[] =& $elementObject;
+ $elKeys = array_keys($this->_elements);
+ $this->_duplicateIndex[$elementName][] = end($elKeys);
+ } else {
+ $error = PEAR::raiseError(null, QUICKFORM_INVALID_ELEMENT_NAME, null, E_USER_WARNING, "Element '$elementName' already exists in HTML_QuickForm::addElement()", 'HTML_QuickForm_Error', true);
+ return $error;
+ }
+ } else {
+ $this->_elements[] =& $elementObject;
+ $elKeys = array_keys($this->_elements);
+ $this->_elementIndex[$elementName] = end($elKeys);
+ }
+ if ($this->_freezeAll) {
+ $elementObject->freeze();
+ }
+
+ return $elementObject;
+ } // end func addElement
+
+ // }}}
+ // {{{ insertElementBefore()
+
+ /**
+ * Inserts a new element right before the other element
+ *
+ * Warning: it is not possible to check whether the $element is already
+ * added to the form, therefore if you want to move the existing form
+ * element to a new position, you'll have to use removeElement():
+ * $form->insertElementBefore($form->removeElement('foo', false), 'bar');
+ *
+ * @access public
+ * @since 3.2.4
+ * @param HTML_QuickForm_element Element to insert
+ * @param string Name of the element before which the new
+ * one is inserted
+ * @return HTML_QuickForm_element reference to inserted element
+ * @throws HTML_QuickForm_Error
+ */
+ function &insertElementBefore(&$element, $nameAfter)
+ {
+ if (!empty($this->_duplicateIndex[$nameAfter])) {
+ $error = PEAR::raiseError(null, QUICKFORM_INVALID_ELEMENT_NAME, null, E_USER_WARNING, 'Several elements named "' . $nameAfter . '" exist in HTML_QuickForm::insertElementBefore().', 'HTML_QuickForm_Error', true);
+ return $error;
+ } elseif (!$this->elementExists($nameAfter)) {
+ $error = PEAR::raiseError(null, QUICKFORM_NONEXIST_ELEMENT, null, E_USER_WARNING, "Element '$nameAfter' does not exist in HTML_QuickForm::insertElementBefore()", 'HTML_QuickForm_Error', true);
+ return $error;
+ }
+ $elementName = $element->getName();
+ $targetIdx = $this->_elementIndex[$nameAfter];
+ $duplicate = false;
+ // Like in addElement(), check that it's not an incompatible duplicate
+ if (!empty($elementName) && isset($this->_elementIndex[$elementName])) {
+ if ($this->_elements[$this->_elementIndex[$elementName]]->getType() != $element->getType()) {
+ $error = PEAR::raiseError(null, QUICKFORM_INVALID_ELEMENT_NAME, null, E_USER_WARNING, "Element '$elementName' already exists in HTML_QuickForm::insertElementBefore()", 'HTML_QuickForm_Error', true);
+ return $error;
+ }
+ $duplicate = true;
+ }
+ // Move all the elements after added back one place, reindex _elementIndex and/or _duplicateIndex
+ $elKeys = array_keys($this->_elements);
+ for ($i = end($elKeys); $i >= $targetIdx; $i--) {
+ if (isset($this->_elements[$i])) {
+ $currentName = $this->_elements[$i]->getName();
+ $this->_elements[$i + 1] =& $this->_elements[$i];
+ if ($this->_elementIndex[$currentName] == $i) {
+ $this->_elementIndex[$currentName] = $i + 1;
+ } else {
+ $dupIdx = array_search($i, $this->_duplicateIndex[$currentName]);
+ $this->_duplicateIndex[$currentName][$dupIdx] = $i + 1;
+ }
+ unset($this->_elements[$i]);
+ }
+ }
+ // Put the element in place finally
+ $this->_elements[$targetIdx] =& $element;
+ if (!$duplicate) {
+ $this->_elementIndex[$elementName] = $targetIdx;
+ } else {
+ $this->_duplicateIndex[$elementName][] = $targetIdx;
+ }
+ $element->onQuickFormEvent('updateValue', null, $this);
+ if ($this->_freezeAll) {
+ $element->freeze();
+ }
+ // If not done, the elements will appear in reverse order
+ ksort($this->_elements);
+ return $element;
+ }
+
+ // }}}
+ // {{{ addGroup()
+
+ /**
+ * Adds an element group
+ * @param array $elements array of elements composing the group
+ * @param string $name (optional)group name
+ * @param string $groupLabel (optional)group label
+ * @param string $separator (optional)string to separate elements
+ * @param string $appendName (optional)specify whether the group name should be
+ * used in the form element name ex: group[element]
+ * @return HTML_QuickForm_group reference to a newly added group
+ * @since 2.8
+ * @access public
+ * @throws HTML_QuickForm_Error
+ */
+ function &addGroup($elements, $name=null, $groupLabel='', $separator=null, $appendName = true)
+ {
+ static $anonGroups = 1;
+
+ if (0 == strlen($name)) {
+ $name = 'qf_group_' . $anonGroups++;
+ $appendName = false;
+ }
+ $group =& $this->addElement('group', $name, $groupLabel, $elements, $separator, $appendName);
+ return $group;
+ } // end func addGroup
+
+ // }}}
+ // {{{ &getElement()
+
+ /**
+ * Returns a reference to the element
+ *
+ * @param string $element Element name
+ * @since 2.0
+ * @access public
+ * @return HTML_QuickForm_element reference to element
+ * @throws HTML_QuickForm_Error
+ */
+ function &getElement($element)
+ {
+ if (isset($this->_elementIndex[$element])) {
+ return $this->_elements[$this->_elementIndex[$element]];
+ } else {
+ $error = PEAR::raiseError(null, QUICKFORM_NONEXIST_ELEMENT, null, E_USER_WARNING, "Element '$element' does not exist in HTML_QuickForm::getElement()", 'HTML_QuickForm_Error', true);
+ return $error;
+ }
+ } // end func getElement
+
+ // }}}
+ // {{{ &getElementValue()
+
+ /**
+ * Returns the element's raw value
+ *
+ * This returns the value as submitted by the form (not filtered)
+ * or set via setDefaults() or setConstants()
+ *
+ * @param string $element Element name
+ * @since 2.0
+ * @access public
+ * @return mixed element value
+ * @throws HTML_QuickForm_Error
+ */
+ function &getElementValue($element)
+ {
+ if (!isset($this->_elementIndex[$element])) {
+ $error = PEAR::raiseError(null, QUICKFORM_NONEXIST_ELEMENT, null, E_USER_WARNING, "Element '$element' does not exist in HTML_QuickForm::getElementValue()", 'HTML_QuickForm_Error', true);
+ return $error;
+ }
+ $value = $this->_elements[$this->_elementIndex[$element]]->getValue();
+ if (isset($this->_duplicateIndex[$element])) {
+ foreach ($this->_duplicateIndex[$element] as $index) {
+ if (null !== ($v = $this->_elements[$index]->getValue())) {
+ if (is_array($value)) {
+ $value[] = $v;
+ } else {
+ $value = (null === $value)? $v: array($value, $v);
+ }
+ }
+ }
+ }
+ return $value;
+ } // end func getElementValue
+
+ // }}}
+ // {{{ getSubmitValue()
+
+ /**
+ * Returns the elements value after submit and filter
+ *
+ * @param string Element name
+ * @since 2.0
+ * @access public
+ * @return mixed submitted element value or null if not set
+ */
+ function getSubmitValue($elementName)
+ {
+ $value = null;
+ if (isset($this->_submitValues[$elementName]) || isset($this->_submitFiles[$elementName])) {
+ $value = isset($this->_submitValues[$elementName])? $this->_submitValues[$elementName]: array();
+ if (is_array($value) && isset($this->_submitFiles[$elementName])) {
+ foreach ($this->_submitFiles[$elementName] as $k => $v) {
+ $value = HTML_QuickForm::arrayMerge($value, $this->_reindexFiles($this->_submitFiles[$elementName][$k], $k));
+ }
+ }
+
+ } elseif ('file' == $this->getElementType($elementName)) {
+ return $this->getElementValue($elementName);
+
+ } elseif (false !== ($pos = strpos($elementName, '['))) {
+ $base = str_replace(
+ array('\\', '\''), array('\\\\', '\\\''),
+ substr($elementName, 0, $pos)
+ );
+ $idx = "['" . str_replace(
+ array('\\', '\'', ']', '['), array('\\\\', '\\\'', '', "']['"),
+ substr($elementName, $pos + 1, -1)
+ ) . "']";
+ if (isset($this->_submitValues[$base])) {
+ $value = eval("return (isset(\$this->_submitValues['{$base}']{$idx})) ? \$this->_submitValues['{$base}']{$idx} : null;");
+ }
+
+ if ((is_array($value) || null === $value) && isset($this->_submitFiles[$base])) {
+ $props = array('name', 'type', 'size', 'tmp_name', 'error');
+ $code = "if (!isset(\$this->_submitFiles['{$base}']['name']{$idx})) {\n" .
+ " return null;\n" .
+ "} else {\n" .
+ " \$v = array();\n";
+ foreach ($props as $prop) {
+ $code .= " \$v = HTML_QuickForm::arrayMerge(\$v, \$this->_reindexFiles(\$this->_submitFiles['{$base}']['{$prop}']{$idx}, '{$prop}'));\n";
+ }
+ $fileValue = eval($code . " return \$v;\n}\n");
+ if (null !== $fileValue) {
+ $value = null === $value? $fileValue: HTML_QuickForm::arrayMerge($value, $fileValue);
+ }
+ }
+ }
+
+ // This is only supposed to work for groups with appendName = false
+ if (null === $value && 'group' == $this->getElementType($elementName)) {
+ $group =& $this->getElement($elementName);
+ $elements =& $group->getElements();
+ foreach (array_keys($elements) as $key) {
+ $name = $group->getElementName($key);
+ // prevent endless recursion in case of radios and such
+ if ($name != $elementName) {
+ if (null !== ($v = $this->getSubmitValue($name))) {
+ $value[$name] = $v;
+ }
+ }
+ }
+ }
+ return $value;
+ } // end func getSubmitValue
+
+ // }}}
+ // {{{ _reindexFiles()
+
+ /**
+ * A helper function to change the indexes in $_FILES array
+ *
+ * @param mixed Some value from the $_FILES array
+ * @param string The key from the $_FILES array that should be appended
+ * @return array
+ */
+ function _reindexFiles($value, $key)
+ {
+ if (!is_array($value)) {
+ return array($key => $value);
+ } else {
+ $ret = array();
+ foreach ($value as $k => $v) {
+ $ret[$k] = $this->_reindexFiles($v, $key);
+ }
+ return $ret;
+ }
+ }
+
+ // }}}
+ // {{{ getElementError()
+
+ /**
+ * Returns error corresponding to validated element
+ *
+ * @param string $element Name of form element to check
+ * @since 1.0
+ * @access public
+ * @return string error message corresponding to checked element
+ */
+ function getElementError($element)
+ {
+ if (isset($this->_errors[$element])) {
+ return $this->_errors[$element];
+ }
+ } // end func getElementError
+
+ // }}}
+ // {{{ setElementError()
+
+ /**
+ * Set error message for a form element
+ *
+ * @param string $element Name of form element to set error for
+ * @param string $message Error message, if empty then removes the current error message
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setElementError($element, $message = null)
+ {
+ if (!empty($message)) {
+ $this->_errors[$element] = $message;
+ } else {
+ unset($this->_errors[$element]);
+ }
+ } // end func setElementError
+
+ // }}}
+ // {{{ getElementType()
+
+ /**
+ * Returns the type of the given element
+ *
+ * @param string $element Name of form element
+ * @since 1.1
+ * @access public
+ * @return string Type of the element, false if the element is not found
+ */
+ function getElementType($element)
+ {
+ if (isset($this->_elementIndex[$element])) {
+ return $this->_elements[$this->_elementIndex[$element]]->getType();
+ }
+ return false;
+ } // end func getElementType
+
+ // }}}
+ // {{{ updateElementAttr()
+
+ /**
+ * Updates Attributes for one or more elements
+ *
+ * @param mixed $elements Array of element names/objects or string of elements to be updated
+ * @param mixed $attrs Array or sting of html attributes
+ * @since 2.10
+ * @access public
+ * @return void
+ */
+ function updateElementAttr($elements, $attrs)
+ {
+ if (is_string($elements)) {
+ $elements = split('[ ]?,[ ]?', $elements);
+ }
+ foreach (array_keys($elements) as $key) {
+ if (is_object($elements[$key]) && is_a($elements[$key], 'HTML_QuickForm_element')) {
+ $elements[$key]->updateAttributes($attrs);
+ } elseif (isset($this->_elementIndex[$elements[$key]])) {
+ $this->_elements[$this->_elementIndex[$elements[$key]]]->updateAttributes($attrs);
+ if (isset($this->_duplicateIndex[$elements[$key]])) {
+ foreach ($this->_duplicateIndex[$elements[$key]] as $index) {
+ $this->_elements[$index]->updateAttributes($attrs);
+ }
+ }
+ }
+ }
+ } // end func updateElementAttr
+
+ // }}}
+ // {{{ removeElement()
+
+ /**
+ * Removes an element
+ *
+ * The method "unlinks" an element from the form, returning the reference
+ * to the element object. If several elements named $elementName exist,
+ * it removes the first one, leaving the others intact.
+ *
+ * @param string $elementName The element name
+ * @param boolean $removeRules True if rules for this element are to be removed too
+ * @access public
+ * @since 2.0
+ * @return HTML_QuickForm_element a reference to the removed element
+ * @throws HTML_QuickForm_Error
+ */
+ function &removeElement($elementName, $removeRules = true)
+ {
+ if (!isset($this->_elementIndex[$elementName])) {
+ $error = PEAR::raiseError(null, QUICKFORM_NONEXIST_ELEMENT, null, E_USER_WARNING, "Element '$elementName' does not exist in HTML_QuickForm::removeElement()", 'HTML_QuickForm_Error', true);
+ return $error;
+ }
+ $el =& $this->_elements[$this->_elementIndex[$elementName]];
+ unset($this->_elements[$this->_elementIndex[$elementName]]);
+ if (empty($this->_duplicateIndex[$elementName])) {
+ unset($this->_elementIndex[$elementName]);
+ } else {
+ $this->_elementIndex[$elementName] = array_shift($this->_duplicateIndex[$elementName]);
+ }
+ if ($removeRules) {
+ unset($this->_rules[$elementName], $this->_errors[$elementName]);
+ }
+ return $el;
+ } // end func removeElement
+
+ // }}}
+ // {{{ addRule()
+
+ /**
+ * Adds a validation rule for the given field
+ *
+ * If the element is in fact a group, it will be considered as a whole.
+ * To validate grouped elements as separated entities,
+ * use addGroupRule instead of addRule.
+ *
+ * @param string $element Form element name
+ * @param string $message Message to display for invalid data
+ * @param string $type Rule type, use getRegisteredRules() to get types
+ * @param string $format (optional)Required for extra rule data
+ * @param string $validation (optional)Where to perform validation: "server", "client"
+ * @param boolean $reset Client-side validation: reset the form element to its original value if there is an error?
+ * @param boolean $force Force the rule to be applied, even if the target form element does not exist
+ * @since 1.0
+ * @access public
+ * @throws HTML_QuickForm_Error
+ */
+ function addRule($element, $message, $type, $format=null, $validation='server', $reset = false, $force = false)
+ {
+ if (!$force) {
+ if (!is_array($element) && !$this->elementExists($element)) {
+ return PEAR::raiseError(null, QUICKFORM_NONEXIST_ELEMENT, null, E_USER_WARNING, "Element '$element' does not exist in HTML_QuickForm::addRule()", 'HTML_QuickForm_Error', true);
+ } elseif (is_array($element)) {
+ foreach ($element as $el) {
+ if (!$this->elementExists($el)) {
+ return PEAR::raiseError(null, QUICKFORM_NONEXIST_ELEMENT, null, E_USER_WARNING, "Element '$el' does not exist in HTML_QuickForm::addRule()", 'HTML_QuickForm_Error', true);
+ }
+ }
+ }
+ }
+ if (false === ($newName = $this->isRuleRegistered($type, true))) {
+ return PEAR::raiseError(null, QUICKFORM_INVALID_RULE, null, E_USER_WARNING, "Rule '$type' is not registered in HTML_QuickForm::addRule()", 'HTML_QuickForm_Error', true);
+ } elseif (is_string($newName)) {
+ $type = $newName;
+ }
+ if (is_array($element)) {
+ $dependent = $element;
+ $element = array_shift($dependent);
+ } else {
+ $dependent = null;
+ }
+ if ($type == 'required' || $type == 'uploadedfile') {
+ $this->_required[] = $element;
+ }
+ if (!isset($this->_rules[$element])) {
+ $this->_rules[$element] = array();
+ }
+ if ($validation == 'client') {
+ $this->updateAttributes(array('onsubmit' => 'try { var myValidator = validate_' . $this->_attributes['id'] . '; } catch(e) { return true; } return myValidator(this);'));
+ }
+ $this->_rules[$element][] = array(
+ 'type' => $type,
+ 'format' => $format,
+ 'message' => $message,
+ 'validation' => $validation,
+ 'reset' => $reset,
+ 'dependent' => $dependent
+ );
+ } // end func addRule
+
+ // }}}
+ // {{{ addGroupRule()
+
+ /**
+ * Adds a validation rule for the given group of elements
+ *
+ * Only groups with a name can be assigned a validation rule
+ * Use addGroupRule when you need to validate elements inside the group.
+ * Use addRule if you need to validate the group as a whole. In this case,
+ * the same rule will be applied to all elements in the group.
+ * Use addRule if you need to validate the group against a function.
+ *
+ * @param string $group Form group name
+ * @param mixed $arg1 Array for multiple elements or error message string for one element
+ * @param string $type (optional)Rule type use getRegisteredRules() to get types
+ * @param string $format (optional)Required for extra rule data
+ * @param int $howmany (optional)How many valid elements should be in the group
+ * @param string $validation (optional)Where to perform validation: "server", "client"
+ * @param bool $reset Client-side: whether to reset the element's value to its original state if validation failed.
+ * @since 2.5
+ * @access public
+ * @throws HTML_QuickForm_Error
+ */
+ function addGroupRule($group, $arg1, $type='', $format=null, $howmany=0, $validation = 'server', $reset = false)
+ {
+ if (!$this->elementExists($group)) {
+ return PEAR::raiseError(null, QUICKFORM_NONEXIST_ELEMENT, null, E_USER_WARNING, "Group '$group' does not exist in HTML_QuickForm::addGroupRule()", 'HTML_QuickForm_Error', true);
+ }
+
+ $groupObj =& $this->getElement($group);
+ if (is_array($arg1)) {
+ $required = 0;
+ foreach ($arg1 as $elementIndex => $rules) {
+ $elementName = $groupObj->getElementName($elementIndex);
+ foreach ($rules as $rule) {
+ $format = (isset($rule[2])) ? $rule[2] : null;
+ $validation = (isset($rule[3]) && 'client' == $rule[3])? 'client': 'server';
+ $reset = isset($rule[4]) && $rule[4];
+ $type = $rule[1];
+ if (false === ($newName = $this->isRuleRegistered($type, true))) {
+ return PEAR::raiseError(null, QUICKFORM_INVALID_RULE, null, E_USER_WARNING, "Rule '$type' is not registered in HTML_QuickForm::addGroupRule()", 'HTML_QuickForm_Error', true);
+ } elseif (is_string($newName)) {
+ $type = $newName;
+ }
+
+ $this->_rules[$elementName][] = array(
+ 'type' => $type,
+ 'format' => $format,
+ 'message' => $rule[0],
+ 'validation' => $validation,
+ 'reset' => $reset,
+ 'group' => $group);
+
+ if ('required' == $type || 'uploadedfile' == $type) {
+ $groupObj->_required[] = $elementName;
+ $this->_required[] = $elementName;
+ $required++;
+ }
+ if ('client' == $validation) {
+ $this->updateAttributes(array('onsubmit' => 'try { var myValidator = validate_' . $this->_attributes['id'] . '; } catch(e) { return true; } return myValidator(this);'));
+ }
+ }
+ }
+ if ($required > 0 && count($groupObj->getElements()) == $required) {
+ $this->_required[] = $group;
+ }
+ } elseif (is_string($arg1)) {
+ if (false === ($newName = $this->isRuleRegistered($type, true))) {
+ return PEAR::raiseError(null, QUICKFORM_INVALID_RULE, null, E_USER_WARNING, "Rule '$type' is not registered in HTML_QuickForm::addGroupRule()", 'HTML_QuickForm_Error', true);
+ } elseif (is_string($newName)) {
+ $type = $newName;
+ }
+
+ // addGroupRule() should also handle <select multiple>
+ if (is_a($groupObj, 'html_quickform_group')) {
+ // Radios need to be handled differently when required
+ if ($type == 'required' && $groupObj->getGroupType() == 'radio') {
+ $howmany = ($howmany == 0) ? 1 : $howmany;
+ } else {
+ $howmany = ($howmany == 0) ? count($groupObj->getElements()) : $howmany;
+ }
+ }
+
+ $this->_rules[$group][] = array('type' => $type,
+ 'format' => $format,
+ 'message' => $arg1,
+ 'validation' => $validation,
+ 'howmany' => $howmany,
+ 'reset' => $reset);
+ if ($type == 'required') {
+ $this->_required[] = $group;
+ }
+ if ($validation == 'client') {
+ $this->updateAttributes(array('onsubmit' => 'try { var myValidator = validate_' . $this->_attributes['id'] . '; } catch(e) { return true; } return myValidator(this);'));
+ }
+ }
+ } // end func addGroupRule
+
+ // }}}
+ // {{{ addFormRule()
+
+ /**
+ * Adds a global validation rule
+ *
+ * This should be used when for a rule involving several fields or if
+ * you want to use some completely custom validation for your form.
+ * The rule function/method should return true in case of successful
+ * validation and array('element name' => 'error') when there were errors.
+ *
+ * @access public
+ * @param mixed Callback, either function name or array(&$object, 'method')
+ * @throws HTML_QuickForm_Error
+ */
+ function addFormRule($rule)
+ {
+ if (!is_callable($rule)) {
+ return PEAR::raiseError(null, QUICKFORM_INVALID_RULE, null, E_USER_WARNING, 'Callback function does not exist in HTML_QuickForm::addFormRule()', 'HTML_QuickForm_Error', true);
+ }
+ $this->_formRules[] = $rule;
+ }
+
+ // }}}
+ // {{{ applyFilter()
+
+ /**
+ * Applies a data filter for the given field(s)
+ *
+ * @param mixed $element Form element name or array of such names
+ * @param mixed $filter Callback, either function name or array(&$object, 'method')
+ * @since 2.0
+ * @access public
+ * @throws HTML_QuickForm_Error
+ */
+ function applyFilter($element, $filter)
+ {
+ if (!is_callable($filter)) {
+ return PEAR::raiseError(null, QUICKFORM_INVALID_FILTER, null, E_USER_WARNING, "Callback function does not exist in QuickForm::applyFilter()", 'HTML_QuickForm_Error', true);
+ }
+ if ($element == '__ALL__') {
+ $this->_submitValues = $this->_recursiveFilter($filter, $this->_submitValues);
+ } else {
+ if (!is_array($element)) {
+ $element = array($element);
+ }
+ foreach ($element as $elName) {
+ $value = $this->getSubmitValue($elName);
+ if (null !== $value) {
+ if (false === strpos($elName, '[')) {
+ $this->_submitValues[$elName] = $this->_recursiveFilter($filter, $value);
+ } else {
+ $idx = "['" . str_replace(
+ array('\\', '\'', ']', '['), array('\\\\', '\\\'', '', "']['"),
+ $elName
+ ) . "']";
+ eval("\$this->_submitValues{$idx} = \$this->_recursiveFilter(\$filter, \$value);");
+ }
+ }
+ }
+ }
+ } // end func applyFilter
+
+ // }}}
+ // {{{ _recursiveFilter()
+
+ /**
+ * Recursively apply a filter function
+ *
+ * @param string $filter filter to apply
+ * @param mixed $value submitted values
+ * @since 2.0
+ * @access private
+ * @return cleaned values
+ */
+ function _recursiveFilter($filter, $value)
+ {
+ if (is_array($value)) {
+ $cleanValues = array();
+ foreach ($value as $k => $v) {
+ $cleanValues[$k] = $this->_recursiveFilter($filter, $v);
+ }
+ return $cleanValues;
+ } else {
+ return call_user_func($filter, $value);
+ }
+ } // end func _recursiveFilter
+
+ // }}}
+ // {{{ arrayMerge()
+
+ /**
+ * Merges two arrays
+ *
+ * Merges two array like the PHP function array_merge but recursively.
+ * The main difference is that existing keys will not be renumbered
+ * if they are integers.
+ *
+ * @access public
+ * @param array $a original array
+ * @param array $b array which will be merged into first one
+ * @return array merged array
+ */
+ function arrayMerge($a, $b)
+ {
+ foreach ($b as $k => $v) {
+ if (is_array($v)) {
+ if (isset($a[$k]) && !is_array($a[$k])) {
+ $a[$k] = $v;
+ } else {
+ if (!isset($a[$k])) {
+ $a[$k] = array();
+ }
+ $a[$k] = HTML_QuickForm::arrayMerge($a[$k], $v);
+ }
+ } else {
+ $a[$k] = $v;
+ }
+ }
+ return $a;
+ } // end func arrayMerge
+
+ // }}}
+ // {{{ isTypeRegistered()
+
+ /**
+ * Returns whether or not the form element type is supported
+ *
+ * @param string $type Form element type
+ * @since 1.0
+ * @access public
+ * @return boolean
+ */
+ function isTypeRegistered($type)
+ {
+ return isset($GLOBALS['HTML_QUICKFORM_ELEMENT_TYPES'][strtolower($type)]);
+ } // end func isTypeRegistered
+
+ // }}}
+ // {{{ getRegisteredTypes()
+
+ /**
+ * Returns an array of registered element types
+ *
+ * @since 1.0
+ * @access public
+ * @return array
+ */
+ function getRegisteredTypes()
+ {
+ return array_keys($GLOBALS['HTML_QUICKFORM_ELEMENT_TYPES']);
+ } // end func getRegisteredTypes
+
+ // }}}
+ // {{{ isRuleRegistered()
+
+ /**
+ * Returns whether or not the given rule is supported
+ *
+ * @param string $name Validation rule name
+ * @param bool Whether to automatically register subclasses of HTML_QuickForm_Rule
+ * @since 1.0
+ * @access public
+ * @return mixed true if previously registered, false if not, new rule name if auto-registering worked
+ */
+ function isRuleRegistered($name, $autoRegister = false)
+ {
+ if (is_scalar($name) && isset($GLOBALS['_HTML_QuickForm_registered_rules'][$name])) {
+ return true;
+ } elseif (!$autoRegister) {
+ return false;
+ }
+ // automatically register the rule if requested
+ include_once 'HTML/QuickForm/RuleRegistry.php';
+ $ruleName = false;
+ if (is_object($name) && is_a($name, 'html_quickform_rule')) {
+ $ruleName = !empty($name->name)? $name->name: strtolower(get_class($name));
+ } elseif (is_string($name) && class_exists($name)) {
+ $parent = strtolower($name);
+ do {
+ if ('html_quickform_rule' == strtolower($parent)) {
+ $ruleName = strtolower($name);
+ break;
+ }
+ } while ($parent = get_parent_class($parent));
+ }
+ if ($ruleName) {
+ $registry =& HTML_QuickForm_RuleRegistry::singleton();
+ $registry->registerRule($ruleName, null, $name);
+ }
+ return $ruleName;
+ } // end func isRuleRegistered
+
+ // }}}
+ // {{{ getRegisteredRules()
+
+ /**
+ * Returns an array of registered validation rules
+ *
+ * @since 1.0
+ * @access public
+ * @return array
+ */
+ function getRegisteredRules()
+ {
+ return array_keys($GLOBALS['_HTML_QuickForm_registered_rules']);
+ } // end func getRegisteredRules
+
+ // }}}
+ // {{{ isElementRequired()
+
+ /**
+ * Returns whether or not the form element is required
+ *
+ * @param string $element Form element name
+ * @since 1.0
+ * @access public
+ * @return boolean
+ */
+ function isElementRequired($element)
+ {
+ return in_array($element, $this->_required, true);
+ } // end func isElementRequired
+
+ // }}}
+ // {{{ isElementFrozen()
+
+ /**
+ * Returns whether or not the form element is frozen
+ *
+ * @param string $element Form element name
+ * @since 1.0
+ * @access public
+ * @return boolean
+ */
+ function isElementFrozen($element)
+ {
+ if (isset($this->_elementIndex[$element])) {
+ return $this->_elements[$this->_elementIndex[$element]]->isFrozen();
+ }
+ return false;
+ } // end func isElementFrozen
+
+ // }}}
+ // {{{ setJsWarnings()
+
+ /**
+ * Sets JavaScript warning messages
+ *
+ * @param string $pref Prefix warning
+ * @param string $post Postfix warning
+ * @since 1.1
+ * @access public
+ * @return void
+ */
+ function setJsWarnings($pref, $post)
+ {
+ $this->_jsPrefix = $pref;
+ $this->_jsPostfix = $post;
+ } // end func setJsWarnings
+
+ // }}}
+ // {{{ setRequiredNote()
+
+ /**
+ * Sets required-note
+ *
+ * @param string $note Message indicating some elements are required
+ * @since 1.1
+ * @access public
+ * @return void
+ */
+ function setRequiredNote($note)
+ {
+ $this->_requiredNote = $note;
+ } // end func setRequiredNote
+
+ // }}}
+ // {{{ getRequiredNote()
+
+ /**
+ * Returns the required note
+ *
+ * @since 2.0
+ * @access public
+ * @return string
+ */
+ function getRequiredNote()
+ {
+ return $this->_requiredNote;
+ } // end func getRequiredNote
+
+ // }}}
+ // {{{ validate()
+
+ /**
+ * Performs the server side validation
+ * @access public
+ * @since 1.0
+ * @return boolean true if no error found
+ * @throws HTML_QuickForm_Error
+ */
+ function validate()
+ {
+ if (count($this->_rules) == 0 && count($this->_formRules) == 0 &&
+ $this->isSubmitted()) {
+ return (0 == count($this->_errors));
+ } elseif (!$this->isSubmitted()) {
+ return false;
+ }
+
+ include_once('HTML/QuickForm/RuleRegistry.php');
+ $registry =& HTML_QuickForm_RuleRegistry::singleton();
+
+ foreach ($this->_rules as $target => $rules) {
+ $submitValue = $this->getSubmitValue($target);
+
+ foreach ($rules as $rule) {
+ if ((isset($rule['group']) && isset($this->_errors[$rule['group']])) ||
+ isset($this->_errors[$target])) {
+ continue 2;
+ }
+ // If element is not required and is empty, we shouldn't validate it
+ if (!$this->isElementRequired($target)) {
+ if (!isset($submitValue) || '' == $submitValue) {
+ continue 2;
+ // Fix for bug #3501: we shouldn't validate not uploaded files, either.
+ // Unfortunately, we can't just use $element->isUploadedFile() since
+ // the element in question can be buried in group. Thus this hack.
+ } elseif (is_array($submitValue)) {
+ if (false === ($pos = strpos($target, '['))) {
+ $isUpload = !empty($this->_submitFiles[$target]);
+ } else {
+ $base = str_replace(
+ array('\\', '\''), array('\\\\', '\\\''),
+ substr($target, 0, $pos)
+ );
+ $idx = "['" . str_replace(
+ array('\\', '\'', ']', '['), array('\\\\', '\\\'', '', "']['"),
+ substr($target, $pos + 1, -1)
+ ) . "']";
+ eval("\$isUpload = isset(\$this->_submitFiles['{$base}']['name']{$idx});");
+ }
+ if ($isUpload && (!isset($submitValue['error']) || 0 != $submitValue['error'])) {
+ continue 2;
+ }
+ }
+ }
+ if (isset($rule['dependent']) && is_array($rule['dependent'])) {
+ $values = array($submitValue);
+ foreach ($rule['dependent'] as $elName) {
+ $values[] = $this->getSubmitValue($elName);
+ }
+ $result = $registry->validate($rule['type'], $values, $rule['format'], true);
+ } elseif (is_array($submitValue) && !isset($rule['howmany'])) {
+ $result = $registry->validate($rule['type'], $submitValue, $rule['format'], true);
+ } else {
+ $result = $registry->validate($rule['type'], $submitValue, $rule['format'], false);
+ }
+
+ if (!$result || (!empty($rule['howmany']) && $rule['howmany'] > (int)$result)) {
+ if (isset($rule['group'])) {
+ $this->_errors[$rule['group']] = $rule['message'];
+ } else {
+ $this->_errors[$target] = $rule['message'];
+ }
+ }
+ }
+ }
+
+ // process the global rules now
+ foreach ($this->_formRules as $rule) {
+ if (true !== ($res = call_user_func($rule, $this->_submitValues, $this->_submitFiles))) {
+ if (is_array($res)) {
+ $this->_errors += $res;
+ } else {
+ return PEAR::raiseError(null, QUICKFORM_ERROR, null, E_USER_WARNING, 'Form rule callback returned invalid value in HTML_QuickForm::validate()', 'HTML_QuickForm_Error', true);
+ }
+ }
+ }
+
+ return (0 == count($this->_errors));
+ } // end func validate
+
+ // }}}
+ // {{{ freeze()
+
+ /**
+ * Displays elements without HTML input tags
+ *
+ * @param mixed $elementList array or string of element(s) to be frozen
+ * @since 1.0
+ * @access public
+ * @throws HTML_QuickForm_Error
+ */
+ function freeze($elementList=null)
+ {
+ if (!isset($elementList)) {
+ $this->_freezeAll = true;
+ $elementList = array();
+ } else {
+ if (!is_array($elementList)) {
+ $elementList = preg_split('/[ ]*,[ ]*/', $elementList);
+ }
+ $elementList = array_flip($elementList);
+ }
+
+ foreach (array_keys($this->_elements) as $key) {
+ $name = $this->_elements[$key]->getName();
+ if ($this->_freezeAll || isset($elementList[$name])) {
+ $this->_elements[$key]->freeze();
+ unset($elementList[$name]);
+ }
+ }
+
+ if (!empty($elementList)) {
+ return PEAR::raiseError(null, QUICKFORM_NONEXIST_ELEMENT, null, E_USER_WARNING, "Nonexistant element(s): '" . implode("', '", array_keys($elementList)) . "' in HTML_QuickForm::freeze()", 'HTML_QuickForm_Error', true);
+ }
+ return true;
+ } // end func freeze
+
+ // }}}
+ // {{{ isFrozen()
+
+ /**
+ * Returns whether or not the whole form is frozen
+ *
+ * @since 3.0
+ * @access public
+ * @return boolean
+ */
+ function isFrozen()
+ {
+ return $this->_freezeAll;
+ } // end func isFrozen
+
+ // }}}
+ // {{{ process()
+
+ /**
+ * Performs the form data processing
+ *
+ * @param mixed $callback Callback, either function name or array(&$object, 'method')
+ * @param bool $mergeFiles Whether uploaded files should be processed too
+ * @since 1.0
+ * @access public
+ * @throws HTML_QuickForm_Error
+ * @return mixed Whatever value the $callback function returns
+ */
+ function process($callback, $mergeFiles = true)
+ {
+ if (!is_callable($callback)) {
+ return PEAR::raiseError(null, QUICKFORM_INVALID_PROCESS, null, E_USER_WARNING, "Callback function does not exist in QuickForm::process()", 'HTML_QuickForm_Error', true);
+ }
+ $values = ($mergeFiles === true) ? HTML_QuickForm::arrayMerge($this->_submitValues, $this->_submitFiles) : $this->_submitValues;
+ return call_user_func($callback, $values);
+ } // end func process
+
+ // }}}
+ // {{{ accept()
+
+ /**
+ * Accepts a renderer
+ *
+ * @param object An HTML_QuickForm_Renderer object
+ * @since 3.0
+ * @access public
+ * @return void
+ */
+ function accept(&$renderer)
+ {
+ $renderer->startForm($this);
+ foreach (array_keys($this->_elements) as $key) {
+ $element =& $this->_elements[$key];
+ $elementName = $element->getName();
+ $required = ($this->isElementRequired($elementName) && !$element->isFrozen());
+ $error = $this->getElementError($elementName);
+ $element->accept($renderer, $required, $error);
+ }
+ $renderer->finishForm($this);
+ } // end func accept
+
+ // }}}
+ // {{{ defaultRenderer()
+
+ /**
+ * Returns a reference to default renderer object
+ *
+ * @access public
+ * @since 3.0
+ * @return object a default renderer object
+ */
+ function &defaultRenderer()
+ {
+ if (!isset($GLOBALS['_HTML_QuickForm_default_renderer'])) {
+ include_once('HTML/QuickForm/Renderer/Default.php');
+ $GLOBALS['_HTML_QuickForm_default_renderer'] =& new HTML_QuickForm_Renderer_Default();
+ }
+ return $GLOBALS['_HTML_QuickForm_default_renderer'];
+ } // end func defaultRenderer
+
+ // }}}
+ // {{{ toHtml ()
+
+ /**
+ * Returns an HTML version of the form
+ *
+ * @param string $in_data (optional) Any extra data to insert right
+ * before form is rendered. Useful when using templates.
+ *
+ * @return string Html version of the form
+ * @since 1.0
+ * @access public
+ */
+ function toHtml ($in_data = null)
+ {
+ if (!is_null($in_data)) {
+ $this->addElement('html', $in_data);
+ }
+ $renderer =& $this->defaultRenderer();
+ $this->accept($renderer);
+ return $renderer->toHtml();
+ } // end func toHtml
+
+ // }}}
+ // {{{ getValidationScript()
+
+ /**
+ * Returns the client side validation script
+ *
+ * @since 2.0
+ * @access public
+ * @return string Javascript to perform validation, empty string if no 'client' rules were added
+ */
+ function getValidationScript()
+ {
+ if (empty($this->_rules) || empty($this->_attributes['onsubmit'])) {
+ return '';
+ }
+
+ include_once('HTML/QuickForm/RuleRegistry.php');
+ $registry =& HTML_QuickForm_RuleRegistry::singleton();
+ $test = array();
+ $js_escape = array(
+ "\r" => '\r',
+ "\n" => '\n',
+ "\t" => '\t',
+ "'" => "\\'",
+ '"' => '\"',
+ '\\' => '\\\\'
+ );
+
+ foreach ($this->_rules as $elementName => $rules) {
+ foreach ($rules as $rule) {
+ if ('client' == $rule['validation']) {
+ unset($element);
+
+ $dependent = isset($rule['dependent']) && is_array($rule['dependent']);
+ $rule['message'] = strtr($rule['message'], $js_escape);
+
+ if (isset($rule['group'])) {
+ $group =& $this->getElement($rule['group']);
+ // No JavaScript validation for frozen elements
+ if ($group->isFrozen()) {
+ continue 2;
+ }
+ $elements =& $group->getElements();
+ foreach (array_keys($elements) as $key) {
+ if ($elementName == $group->getElementName($key)) {
+ $element =& $elements[$key];
+ break;
+ }
+ }
+ } elseif ($dependent) {
+ $element = array();
+ $element[] =& $this->getElement($elementName);
+ foreach ($rule['dependent'] as $elName) {
+ $element[] =& $this->getElement($elName);
+ }
+ } else {
+ $element =& $this->getElement($elementName);
+ }
+ // No JavaScript validation for frozen elements
+ if (is_object($element) && $element->isFrozen()) {
+ continue 2;
+ } elseif (is_array($element)) {
+ foreach (array_keys($element) as $key) {
+ if ($element[$key]->isFrozen()) {
+ continue 3;
+ }
+ }
+ }
+
+ $test[] = $registry->getValidationScript($element, $elementName, $rule);
+ }
+ }
+ }
+ if (count($test) > 0) {
+ return
+ "\n<script type=\"text/javascript\">\n" .
+ "//<![CDATA[\n" .
+ "function validate_" . $this->_attributes['id'] . "(frm) {\n" .
+ " var value = '';\n" .
+ " var errFlag = new Array();\n" .
+ " var _qfGroups = {};\n" .
+ " _qfMsg = '';\n\n" .
+ join("\n", $test) .
+ "\n if (_qfMsg != '') {\n" .
+ " _qfMsg = '" . strtr($this->_jsPrefix, $js_escape) . "' + _qfMsg;\n" .
+ " _qfMsg = _qfMsg + '\\n" . strtr($this->_jsPostfix, $js_escape) . "';\n" .
+ " alert(_qfMsg);\n" .
+ " return false;\n" .
+ " }\n" .
+ " return true;\n" .
+ "}\n" .
+ "//]]>\n" .
+ "</script>";
+ }
+ return '';
+ } // end func getValidationScript
+
+ // }}}
+ // {{{ getSubmitValues()
+
+ /**
+ * Returns the values submitted by the form
+ *
+ * @since 2.0
+ * @access public
+ * @param bool Whether uploaded files should be returned too
+ * @return array
+ */
+ function getSubmitValues($mergeFiles = false)
+ {
+ return $mergeFiles? HTML_QuickForm::arrayMerge($this->_submitValues, $this->_submitFiles): $this->_submitValues;
+ } // end func getSubmitValues
+
+ // }}}
+ // {{{ toArray()
+
+ /**
+ * Returns the form's contents in an array.
+ *
+ * The description of the array structure is in HTML_QuickForm_Renderer_Array docs
+ *
+ * @since 2.0
+ * @access public
+ * @param bool Whether to collect hidden elements (passed to the Renderer's constructor)
+ * @return array of form contents
+ */
+ function toArray($collectHidden = false)
+ {
+ include_once 'HTML/QuickForm/Renderer/Array.php';
+ $renderer =& new HTML_QuickForm_Renderer_Array($collectHidden);
+ $this->accept($renderer);
+ return $renderer->toArray();
+ } // end func toArray
+
+ // }}}
+ // {{{ exportValue()
+
+ /**
+ * Returns a 'safe' element's value
+ *
+ * This method first tries to find a cleaned-up submitted value,
+ * it will return a value set by setValue()/setDefaults()/setConstants()
+ * if submitted value does not exist for the given element.
+ *
+ * @param string Name of an element
+ * @access public
+ * @return mixed
+ * @throws HTML_QuickForm_Error
+ */
+ function exportValue($element)
+ {
+ if (!isset($this->_elementIndex[$element])) {
+ return PEAR::raiseError(null, QUICKFORM_NONEXIST_ELEMENT, null, E_USER_WARNING, "Element '$element' does not exist in HTML_QuickForm::getElementValue()", 'HTML_QuickForm_Error', true);
+ }
+ $value = $this->_elements[$this->_elementIndex[$element]]->exportValue($this->_submitValues, false);
+ if (isset($this->_duplicateIndex[$element])) {
+ foreach ($this->_duplicateIndex[$element] as $index) {
+ if (null !== ($v = $this->_elements[$index]->exportValue($this->_submitValues, false))) {
+ if (is_array($value)) {
+ $value[] = $v;
+ } else {
+ $value = (null === $value)? $v: array($value, $v);
+ }
+ }
+ }
+ }
+ return $value;
+ }
+
+ // }}}
+ // {{{ exportValues()
+
+ /**
+ * Returns 'safe' elements' values
+ *
+ * Unlike getSubmitValues(), this will return only the values
+ * corresponding to the elements present in the form.
+ *
+ * @param mixed Array/string of element names, whose values we want. If not set then return all elements.
+ * @access public
+ * @return array An assoc array of elements' values
+ * @throws HTML_QuickForm_Error
+ */
+ function exportValues($elementList = null)
+ {
+ $values = array();
+ if (null === $elementList) {
+ // iterate over all elements, calling their exportValue() methods
+ foreach (array_keys($this->_elements) as $key) {
+ $value = $this->_elements[$key]->exportValue($this->_submitValues, true);
+ if (is_array($value)) {
+ // This shit throws a bogus warning in PHP 4.3.x
+ $values = HTML_QuickForm::arrayMerge($values, $value);
+ }
+ }
+ } else {
+ if (!is_array($elementList)) {
+ $elementList = array_map('trim', explode(',', $elementList));
+ }
+ foreach ($elementList as $elementName) {
+ $value = $this->exportValue($elementName);
+ if (PEAR::isError($value)) {
+ return $value;
+ }
+ $values[$elementName] = $value;
+ }
+ }
+ return $values;
+ }
+
+ // }}}
+ // {{{ isSubmitted()
+
+ /**
+ * Tells whether the form was already submitted
+ *
+ * This is useful since the _submitFiles and _submitValues arrays
+ * may be completely empty after the trackSubmit value is removed.
+ *
+ * @access public
+ * @return bool
+ */
+ function isSubmitted()
+ {
+ return $this->_flagSubmitted;
+ }
+
+
+ // }}}
+ // {{{ isError()
+
+ /**
+ * Tell whether a result from a QuickForm method is an error (an instance of HTML_QuickForm_Error)
+ *
+ * @access public
+ * @param mixed result code
+ * @return bool whether $value is an error
+ * @static
+ */
+ function isError($value)
+ {
+ return (is_object($value) && is_a($value, 'html_quickform_error'));
+ } // end func isError
+
+ // }}}
+ // {{{ errorMessage()
+
+ /**
+ * Return a textual error message for an QuickForm error code
+ *
+ * @access public
+ * @param int error code
+ * @return string error message
+ * @static
+ */
+ function errorMessage($value)
+ {
+ // make the variable static so that it only has to do the defining on the first call
+ static $errorMessages;
+
+ // define the varies error messages
+ if (!isset($errorMessages)) {
+ $errorMessages = array(
+ QUICKFORM_OK => 'no error',
+ QUICKFORM_ERROR => 'unknown error',
+ QUICKFORM_INVALID_RULE => 'the rule does not exist as a registered rule',
+ QUICKFORM_NONEXIST_ELEMENT => 'nonexistent html element',
+ QUICKFORM_INVALID_FILTER => 'invalid filter',
+ QUICKFORM_UNREGISTERED_ELEMENT => 'unregistered element',
+ QUICKFORM_INVALID_ELEMENT_NAME => 'element already exists',
+ QUICKFORM_INVALID_PROCESS => 'process callback does not exist',
+ QUICKFORM_DEPRECATED => 'method is deprecated',
+ QUICKFORM_INVALID_DATASOURCE => 'datasource is not an object'
+ );
+ }
+
+ // If this is an error object, then grab the corresponding error code
+ if (HTML_QuickForm::isError($value)) {
+ $value = $value->getCode();
+ }
+
+ // return the textual error message corresponding to the code
+ return isset($errorMessages[$value]) ? $errorMessages[$value] : $errorMessages[QUICKFORM_ERROR];
+ } // end func errorMessage
+
+ // }}}
+} // end class HTML_QuickForm
+
+/**
+ * Class for errors thrown by HTML_QuickForm package
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ */
+class HTML_QuickForm_Error extends PEAR_Error {
+
+ // {{{ properties
+
+ /**
+ * Prefix for all error messages
+ * @var string
+ */
+ var $error_message_prefix = 'QuickForm Error: ';
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Creates a quickform error object, extending the PEAR_Error class
+ *
+ * @param int $code the error code
+ * @param int $mode the reaction to the error, either return, die or trigger/callback
+ * @param int $level intensity of the error (PHP error code)
+ * @param mixed $debuginfo any information that can inform user as to nature of the error
+ */
+ function HTML_QuickForm_Error($code = QUICKFORM_ERROR, $mode = PEAR_ERROR_RETURN,
+ $level = E_USER_NOTICE, $debuginfo = null)
+ {
+ if (is_int($code)) {
+ $this->PEAR_Error(HTML_QuickForm::errorMessage($code), $code, $mode, $level, $debuginfo);
+ } else {
+ $this->PEAR_Error("Invalid error code: $code", QUICKFORM_ERROR, $mode, $level, $debuginfo);
+ }
+ }
+
+ // }}}
+} // end class HTML_QuickForm_Error
+?> \ No newline at end of file
diff --git a/libs/HTML/QuickForm/Renderer.php b/libs/HTML/QuickForm/Renderer.php
new file mode 100755
index 0000000000..9524dfd4f7
--- /dev/null
+++ b/libs/HTML/QuickForm/Renderer.php
@@ -0,0 +1,158 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * An abstract base class for QuickForm renderers
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id$
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * An abstract base class for QuickForm renderers
+ *
+ * The class implements a Visitor design pattern
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ * @since 3.0
+ * @abstract
+ */
+class HTML_QuickForm_Renderer
+{
+ /**
+ * Constructor
+ *
+ * @access public
+ */
+ function HTML_QuickForm_Renderer()
+ {
+ } // end constructor
+
+ /**
+ * Called when visiting a form, before processing any form elements
+ *
+ * @param HTML_QuickForm a form being visited
+ * @access public
+ * @return void
+ * @abstract
+ */
+ function startForm(&$form)
+ {
+ return;
+ } // end func startForm
+
+ /**
+ * Called when visiting a form, after processing all form elements
+ *
+ * @param HTML_QuickForm a form being visited
+ * @access public
+ * @return void
+ * @abstract
+ */
+ function finishForm(&$form)
+ {
+ return;
+ } // end func finishForm
+
+ /**
+ * Called when visiting a header element
+ *
+ * @param HTML_QuickForm_header a header element being visited
+ * @access public
+ * @return void
+ * @abstract
+ */
+ function renderHeader(&$header)
+ {
+ return;
+ } // end func renderHeader
+
+ /**
+ * Called when visiting an element
+ *
+ * @param HTML_QuickForm_element form element being visited
+ * @param bool Whether an element is required
+ * @param string An error message associated with an element
+ * @access public
+ * @return void
+ * @abstract
+ */
+ function renderElement(&$element, $required, $error)
+ {
+ return;
+ } // end func renderElement
+
+ /**
+ * Called when visiting a hidden element
+ *
+ * @param HTML_QuickForm_element a hidden element being visited
+ * @access public
+ * @return void
+ * @abstract
+ */
+ function renderHidden(&$element)
+ {
+ return;
+ } // end func renderHidden
+
+ /**
+ * Called when visiting a raw HTML/text pseudo-element
+ *
+ * Only implemented in Default renderer. Usage of 'html' elements is
+ * discouraged, templates should be used instead.
+ *
+ * @param HTML_QuickForm_html a 'raw html' element being visited
+ * @access public
+ * @return void
+ * @abstract
+ */
+ function renderHtml(&$data)
+ {
+ return;
+ } // end func renderHtml
+
+ /**
+ * Called when visiting a group, before processing any group elements
+ *
+ * @param HTML_QuickForm_group A group being visited
+ * @param bool Whether a group is required
+ * @param string An error message associated with a group
+ * @access public
+ * @return void
+ * @abstract
+ */
+ function startGroup(&$group, $required, $error)
+ {
+ return;
+ } // end func startGroup
+
+ /**
+ * Called when visiting a group, after processing all group elements
+ *
+ * @param HTML_QuickForm_group A group being visited
+ * @access public
+ * @return void
+ * @abstract
+ */
+ function finishGroup(&$group)
+ {
+ return;
+ } // end func finishGroup
+} // end class HTML_QuickForm_Renderer
+?>
diff --git a/libs/HTML/QuickForm/Renderer/Array.php b/libs/HTML/QuickForm/Renderer/Array.php
new file mode 100755
index 0000000000..24874ecb5a
--- /dev/null
+++ b/libs/HTML/QuickForm/Renderer/Array.php
@@ -0,0 +1,340 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * A concrete renderer for HTML_QuickForm, makes an array of form contents
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Thomas Schulz <ths@4bconsult.de>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: Array.php,v 1.10 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * An abstract base class for QuickForm renderers
+ */
+require_once 'HTML/QuickForm/Renderer.php';
+
+/**
+ * A concrete renderer for HTML_QuickForm, makes an array of form contents
+ *
+ * Based on old HTML_QuickForm::toArray() code.
+ *
+ * The form array structure is the following:
+ * <pre>
+ * array(
+ * 'frozen' => 'whether the form is frozen',
+ * 'javascript' => 'javascript for client-side validation',
+ * 'attributes' => 'attributes for <form> tag',
+ * 'requirednote => 'note about the required elements',
+ * // if we set the option to collect hidden elements
+ * 'hidden' => 'collected html of all hidden elements',
+ * // if there were some validation errors:
+ * 'errors' => array(
+ * '1st element name' => 'Error for the 1st element',
+ * ...
+ * 'nth element name' => 'Error for the nth element'
+ * ),
+ * // if there are no headers in the form:
+ * 'elements' => array(
+ * element_1,
+ * ...
+ * element_N
+ * )
+ * // if there are headers in the form:
+ * 'sections' => array(
+ * array(
+ * 'header' => 'Header text for the first header',
+ * 'name' => 'Header name for the first header',
+ * 'elements' => array(
+ * element_1,
+ * ...
+ * element_K1
+ * )
+ * ),
+ * ...
+ * array(
+ * 'header' => 'Header text for the Mth header',
+ * 'name' => 'Header name for the Mth header',
+ * 'elements' => array(
+ * element_1,
+ * ...
+ * element_KM
+ * )
+ * )
+ * )
+ * );
+ * </pre>
+ *
+ * where element_i is an array of the form:
+ * <pre>
+ * array(
+ * 'name' => 'element name',
+ * 'value' => 'element value',
+ * 'type' => 'type of the element',
+ * 'frozen' => 'whether element is frozen',
+ * 'label' => 'label for the element',
+ * 'required' => 'whether element is required',
+ * 'error' => 'error associated with the element',
+ * 'style' => 'some information about element style (e.g. for Smarty)',
+ * // if element is not a group
+ * 'html' => 'HTML for the element'
+ * // if element is a group
+ * 'separator' => 'separator for group elements',
+ * 'elements' => array(
+ * element_1,
+ * ...
+ * element_N
+ * )
+ * );
+ * </pre>
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Thomas Schulz <ths@4bconsult.de>
+ * @version Release: 3.2.9
+ * @since 3.0
+ */
+class HTML_QuickForm_Renderer_Array extends HTML_QuickForm_Renderer
+{
+ /**#@+
+ * @access private
+ */
+ /**
+ * An array being generated
+ * @var array
+ */
+ var $_ary;
+
+ /**
+ * Number of sections in the form (i.e. number of headers in it)
+ * @var integer
+ */
+ var $_sectionCount;
+
+ /**
+ * Current section number
+ * @var integer
+ */
+ var $_currentSection;
+
+ /**
+ * Array representing current group
+ * @var array
+ */
+ var $_currentGroup = null;
+
+ /**
+ * Additional style information for different elements
+ * @var array
+ */
+ var $_elementStyles = array();
+
+ /**
+ * true: collect all hidden elements into string; false: process them as usual form elements
+ * @var bool
+ */
+ var $_collectHidden = false;
+
+ /**
+ * true: render an array of labels to many labels, $key 0 named 'label', the rest "label_$key"
+ * false: leave labels as defined
+ * @var bool
+ */
+ var $_staticLabels = false;
+ /**#@-*/
+
+ /**
+ * Constructor
+ *
+ * @param bool true: collect all hidden elements into string; false: process them as usual form elements
+ * @param bool true: render an array of labels to many labels, $key 0 to 'label' and the oterh to "label_$key"
+ * @access public
+ */
+ function HTML_QuickForm_Renderer_Array($collectHidden = false, $staticLabels = false)
+ {
+ $this->HTML_QuickForm_Renderer();
+ $this->_collectHidden = $collectHidden;
+ $this->_staticLabels = $staticLabels;
+ } // end constructor
+
+
+ /**
+ * Returns the resultant array
+ *
+ * @access public
+ * @return array
+ */
+ function toArray()
+ {
+ return $this->_ary;
+ }
+
+
+ function startForm(&$form)
+ {
+ $this->_ary = array(
+ 'frozen' => $form->isFrozen(),
+ 'javascript' => $form->getValidationScript(),
+ 'attributes' => $form->getAttributes(true),
+ 'requirednote' => $form->getRequiredNote(),
+ 'errors' => array()
+ );
+ if ($this->_collectHidden) {
+ $this->_ary['hidden'] = '';
+ }
+ $this->_elementIdx = 1;
+ $this->_currentSection = null;
+ $this->_sectionCount = 0;
+ } // end func startForm
+
+
+ function renderHeader(&$header)
+ {
+ $this->_ary['sections'][$this->_sectionCount] = array(
+ 'header' => $header->toHtml(),
+ 'name' => $header->getName()
+ );
+ $this->_currentSection = $this->_sectionCount++;
+ } // end func renderHeader
+
+
+ function renderElement(&$element, $required, $error)
+ {
+ $elAry = $this->_elementToArray($element, $required, $error);
+ if (!empty($error)) {
+ $this->_ary['errors'][$elAry['name']] = $error;
+ }
+ $this->_storeArray($elAry);
+ } // end func renderElement
+
+
+ function renderHidden(&$element)
+ {
+ if ($this->_collectHidden) {
+ $this->_ary['hidden'] .= $element->toHtml() . "\n";
+ } else {
+ $this->renderElement($element, false, null);
+ }
+ } // end func renderHidden
+
+
+ function startGroup(&$group, $required, $error)
+ {
+ $this->_currentGroup = $this->_elementToArray($group, $required, $error);
+ if (!empty($error)) {
+ $this->_ary['errors'][$this->_currentGroup['name']] = $error;
+ }
+ } // end func startGroup
+
+
+ function finishGroup(&$group)
+ {
+ $this->_storeArray($this->_currentGroup);
+ $this->_currentGroup = null;
+ } // end func finishGroup
+
+
+ /**
+ * Creates an array representing an element
+ *
+ * @access private
+ * @param HTML_QuickForm_element element being processed
+ * @param bool Whether an element is required
+ * @param string Error associated with the element
+ * @return array
+ */
+ function _elementToArray(&$element, $required, $error)
+ {
+ $ret = array(
+ 'name' => $element->getName(),
+ 'value' => $element->getValue(),
+ 'type' => $element->getType(),
+ 'frozen' => $element->isFrozen(),
+ 'required' => $required,
+ 'error' => $error
+ );
+ // render label(s)
+ $labels = $element->getLabel();
+ if (is_array($labels) && $this->_staticLabels) {
+ foreach($labels as $key => $label) {
+ $key = is_int($key)? $key + 1: $key;
+ if (1 === $key) {
+ $ret['label'] = $label;
+ } else {
+ $ret['label_' . $key] = $label;
+ }
+ }
+ } else {
+ $ret['label'] = $labels;
+ }
+
+ // set the style for the element
+ if (isset($this->_elementStyles[$ret['name']])) {
+ $ret['style'] = $this->_elementStyles[$ret['name']];
+ }
+ if ('group' == $ret['type']) {
+ $ret['separator'] = $element->_separator;
+ $ret['elements'] = array();
+ } else {
+ $ret['html'] = $element->toHtml();
+ }
+ return $ret;
+ }
+
+
+ /**
+ * Stores an array representation of an element in the form array
+ *
+ * @access private
+ * @param array Array representation of an element
+ * @return void
+ */
+ function _storeArray($elAry)
+ {
+ // where should we put this element...
+ if (is_array($this->_currentGroup) && ('group' != $elAry['type'])) {
+ $this->_currentGroup['elements'][] = $elAry;
+ } elseif (isset($this->_currentSection)) {
+ $this->_ary['sections'][$this->_currentSection]['elements'][] = $elAry;
+ } else {
+ $this->_ary['elements'][] = $elAry;
+ }
+ }
+
+
+ /**
+ * Sets a style to use for element rendering
+ *
+ * @param mixed element name or array ('element name' => 'style name')
+ * @param string style name if $elementName is not an array
+ * @access public
+ * @return void
+ */
+ function setElementStyle($elementName, $styleName = null)
+ {
+ if (is_array($elementName)) {
+ $this->_elementStyles = array_merge($this->_elementStyles, $elementName);
+ } else {
+ $this->_elementStyles[$elementName] = $styleName;
+ }
+ }
+}
+?> \ No newline at end of file
diff --git a/libs/HTML/QuickForm/Renderer/ArraySmarty.php b/libs/HTML/QuickForm/Renderer/ArraySmarty.php
new file mode 100755
index 0000000000..0a87d56f0d
--- /dev/null
+++ b/libs/HTML/QuickForm/Renderer/ArraySmarty.php
@@ -0,0 +1,402 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * A static renderer for HTML_QuickForm, makes an array of form content
+ * useful for a Smarty template
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Thomas Schulz <ths@4bconsult.de>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: ArraySmarty.php,v 1.12 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * A concrete renderer for HTML_QuickForm, makes an array of form contents
+ */
+require_once 'HTML/QuickForm/Renderer/Array.php';
+
+/**
+ * A static renderer for HTML_QuickForm, makes an array of form content
+ * useful for a Smarty template
+ *
+ * Based on old HTML_QuickForm::toArray() code and ITStatic renderer.
+ *
+ * The form array structure is the following:
+ * <pre>
+ * Array (
+ * [frozen] => whether the complete form is frozen'
+ * [javascript] => javascript for client-side validation
+ * [attributes] => attributes for <form> tag
+ * [hidden] => html of all hidden elements
+ * [requirednote] => note about the required elements
+ * [errors] => Array
+ * (
+ * [1st_element_name] => Error for the 1st element
+ * ...
+ * [nth_element_name] => Error for the nth element
+ * )
+ *
+ * [header] => Array
+ * (
+ * [1st_header_name] => Header text for the 1st header
+ * ...
+ * [nth_header_name] => Header text for the nth header
+ * )
+ *
+ * [1st_element_name] => Array for the 1st element
+ * ...
+ * [nth_element_name] => Array for the nth element
+ * </pre>
+ *
+ * where an element array has the form:
+ * <pre>
+ * (
+ * [name] => element name
+ * [value] => element value,
+ * [type] => type of the element
+ * [frozen] => whether element is frozen
+ * [label] => label for the element
+ * [required] => whether element is required
+ * // if element is not a group:
+ * [html] => HTML for the element
+ * // if element is a group:
+ * [separator] => separator for group elements
+ * [1st_gitem_name] => Array for the 1st element in group
+ * ...
+ * [nth_gitem_name] => Array for the nth element in group
+ * )
+ * )
+ * </pre>
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Thomas Schulz <ths@4bconsult.de>
+ * @version Release: 3.2.9
+ * @since 3.0
+ */
+class HTML_QuickForm_Renderer_ArraySmarty extends HTML_QuickForm_Renderer_Array
+{
+ /**#@+
+ * @access private
+ */
+ /**
+ * The Smarty template engine instance
+ * @var object
+ */
+ var $_tpl = null;
+
+ /**
+ * Current element index
+ * @var integer
+ */
+ var $_elementIdx = 0;
+
+ /**
+ * The current element index inside a group
+ * @var integer
+ */
+ var $_groupElementIdx = 0;
+
+ /**
+ * How to handle the required tag for required fields
+ * @var string
+ * @see setRequiredTemplate()
+ */
+ var $_required = '';
+
+ /**
+ * How to handle error messages in form validation
+ * @var string
+ * @see setErrorTemplate()
+ */
+ var $_error = '';
+ /**#@-*/
+
+ /**
+ * Constructor
+ *
+ * @param Smarty reference to the Smarty template engine instance
+ * @param bool true: render an array of labels to many labels, $key 0 to 'label' and the oterh to "label_$key"
+ * @access public
+ */
+ function HTML_QuickForm_Renderer_ArraySmarty(&$tpl, $staticLabels = false)
+ {
+ $this->HTML_QuickForm_Renderer_Array(true, $staticLabels);
+ $this->_tpl =& $tpl;
+ } // end constructor
+
+ /**
+ * Called when visiting a header element
+ *
+ * @param HTML_QuickForm_header header element being visited
+ * @access public
+ * @return void
+ */
+ function renderHeader(&$header)
+ {
+ if ($name = $header->getName()) {
+ $this->_ary['header'][$name] = $header->toHtml();
+ } else {
+ $this->_ary['header'][$this->_sectionCount] = $header->toHtml();
+ }
+ $this->_currentSection = $this->_sectionCount++;
+ } // end func renderHeader
+
+ /**
+ * Called when visiting a group, before processing any group elements
+ *
+ * @param HTML_QuickForm_group group being visited
+ * @param bool Whether a group is required
+ * @param string An error message associated with a group
+ * @access public
+ * @return void
+ */
+ function startGroup(&$group, $required, $error)
+ {
+ parent::startGroup($group, $required, $error);
+ $this->_groupElementIdx = 1;
+ } // end func startGroup
+
+ /**
+ * Creates an array representing an element containing
+ * the key for storing this
+ *
+ * @access private
+ * @param HTML_QuickForm_element form element being visited
+ * @param bool Whether an element is required
+ * @param string Error associated with the element
+ * @return array
+ */
+ function _elementToArray(&$element, $required, $error)
+ {
+ $ret = parent::_elementToArray($element, $required, $error);
+
+ if ('group' == $ret['type']) {
+ $ret['html'] = $element->toHtml();
+ // we don't need the elements, see the array structure
+ unset($ret['elements']);
+ }
+ if (($required || $error) && !empty($this->_required)){
+ $this->_renderRequired($ret['label'], $ret['html'], $required, $error);
+ }
+ if ($error && !empty($this->_error)) {
+ $this->_renderError($ret['label'], $ret['html'], $error);
+ $ret['error'] = $error;
+ }
+ // create keys for elements grouped by native group or name
+ if (strstr($ret['name'], '[') or $this->_currentGroup) {
+ // Fix for bug #8123: escape backslashes and quotes to prevent errors
+ // in eval(). The code below seems to handle the case where element
+ // name has unbalanced square brackets. Dunno whether we really
+ // need this after the fix for #8123, but I'm wary of making big
+ // changes to this code.
+ preg_match('/([^]]*)\\[([^]]*)\\]/', $ret['name'], $matches);
+ if (isset($matches[1])) {
+ $sKeysSub = substr_replace($ret['name'], '', 0, strlen($matches[1]));
+ $sKeysSub = str_replace(
+ array('\\', '\'', '[' , ']', '[\'\']'),
+ array('\\\\', '\\\'', '[\'', '\']', '[]' ),
+ $sKeysSub
+ );
+ $sKeys = '[\'' . str_replace(array('\\', '\''), array('\\\\', '\\\''), $matches[1]) . '\']' . $sKeysSub;
+ } else {
+ $sKeys = '[\'' . str_replace(array('\\', '\''), array('\\\\', '\\\''), $ret['name']) . '\']';
+ }
+ // special handling for elements in native groups
+ if ($this->_currentGroup) {
+ // skip unnamed group items unless radios: no name -> no static access
+ // identification: have the same key string as the parent group
+ if ($this->_currentGroup['keys'] == $sKeys and 'radio' != $ret['type']) {
+ return false;
+ }
+ // reduce string of keys by remove leading group keys
+ if (0 === strpos($sKeys, $this->_currentGroup['keys'])) {
+ $sKeys = substr_replace($sKeys, '', 0, strlen($this->_currentGroup['keys']));
+ }
+ }
+ // element without a name
+ } elseif ($ret['name'] == '') {
+ $sKeys = '[\'element_' . $this->_elementIdx . '\']';
+ // other elements
+ } else {
+ $sKeys = '[\'' . str_replace(array('\\', '\''), array('\\\\', '\\\''), $ret['name']) . '\']';
+ }
+ // for radios: add extra key from value
+ if ('radio' == $ret['type'] and substr($sKeys, -2) != '[]') {
+ $sKeys .= '[\'' . str_replace(array('\\', '\''), array('\\\\', '\\\''), $ret['value']) . '\']';
+ }
+ $this->_elementIdx++;
+ $ret['keys'] = $sKeys;
+ return $ret;
+ } // end func _elementToArray
+
+ /**
+ * Stores an array representation of an element in the form array
+ *
+ * @access private
+ * @param array Array representation of an element
+ * @return void
+ */
+ function _storeArray($elAry)
+ {
+ if ($elAry) {
+ $sKeys = $elAry['keys'];
+ unset($elAry['keys']);
+ // where should we put this element...
+ if (is_array($this->_currentGroup) && ('group' != $elAry['type'])) {
+ $toEval = '$this->_currentGroup' . $sKeys . ' = $elAry;';
+ } else {
+ $toEval = '$this->_ary' . $sKeys . ' = $elAry;';
+ }
+ eval($toEval);
+ }
+ return;
+ }
+
+ /**
+ * Called when an element is required
+ *
+ * This method will add the required tag to the element label and/or the element html
+ * such as defined with the method setRequiredTemplate.
+ *
+ * @param string The element label
+ * @param string The element html rendering
+ * @param boolean The element required
+ * @param string The element error
+ * @see setRequiredTemplate()
+ * @access private
+ * @return void
+ */
+ function _renderRequired(&$label, &$html, &$required, &$error)
+ {
+ $this->_tpl->assign(array(
+ 'label' => $label,
+ 'html' => $html,
+ 'required' => $required,
+ 'error' => $error
+ ));
+ if (!empty($label) && strpos($this->_required, $this->_tpl->left_delimiter . '$label') !== false) {
+ $label = $this->_tplFetch($this->_required);
+ }
+ if (!empty($html) && strpos($this->_required, $this->_tpl->left_delimiter . '$html') !== false) {
+ $html = $this->_tplFetch($this->_required);
+ }
+ $this->_tpl->clear_assign(array('label', 'html', 'required'));
+ } // end func _renderRequired
+
+ /**
+ * Called when an element has a validation error
+ *
+ * This method will add the error message to the element label or the element html
+ * such as defined with the method setErrorTemplate. If the error placeholder is not found
+ * in the template, the error will be displayed in the form error block.
+ *
+ * @param string The element label
+ * @param string The element html rendering
+ * @param string The element error
+ * @see setErrorTemplate()
+ * @access private
+ * @return void
+ */
+ function _renderError(&$label, &$html, &$error)
+ {
+ $this->_tpl->assign(array('label' => '', 'html' => '', 'error' => $error));
+ $error = $this->_tplFetch($this->_error);
+ $this->_tpl->assign(array('label' => $label, 'html' => $html));
+
+ if (!empty($label) && strpos($this->_error, $this->_tpl->left_delimiter . '$label') !== false) {
+ $label = $this->_tplFetch($this->_error);
+ } elseif (!empty($html) && strpos($this->_error, $this->_tpl->left_delimiter . '$html') !== false) {
+ $html = $this->_tplFetch($this->_error);
+ }
+ $this->_tpl->clear_assign(array('label', 'html', 'error'));
+ } // end func _renderError
+
+ /**
+ * Process an template sourced in a string with Smarty
+ *
+ * Smarty has no core function to render a template given as a string.
+ * So we use the smarty eval plugin function to do this.
+ *
+ * @param string The template source
+ * @access private
+ * @return void
+ */
+ function _tplFetch($tplSource)
+ {
+ if (!function_exists('smarty_function_eval')) {
+ require SMARTY_DIR . '/plugins/function.eval.php';
+ }
+ return smarty_function_eval(array('var' => $tplSource), $this->_tpl);
+ }// end func _tplFetch
+
+ /**
+ * Sets the way required elements are rendered
+ *
+ * You can use {$label} or {$html} placeholders to let the renderer know where
+ * where the element label or the element html are positionned according to the
+ * required tag. They will be replaced accordingly with the right value. You
+ * can use the full smarty syntax here, especially a custom modifier for I18N.
+ * For example:
+ * {if $required}<span style="color: red;">*</span>{/if}{$label|translate}
+ * will put a red star in front of the label if the element is required and
+ * translate the label.
+ *
+ *
+ * @param string The required element template
+ * @access public
+ * @return void
+ */
+ function setRequiredTemplate($template)
+ {
+ $this->_required = $template;
+ } // end func setRequiredTemplate
+
+ /**
+ * Sets the way elements with validation errors are rendered
+ *
+ * You can use {$label} or {$html} placeholders to let the renderer know where
+ * where the element label or the element html are positionned according to the
+ * error message. They will be replaced accordingly with the right value.
+ * The error message will replace the {$error} placeholder.
+ * For example:
+ * {if $error}<span style="color: red;">{$error}</span>{/if}<br />{$html}
+ * will put the error message in red on top of the element html.
+ *
+ * If you want all error messages to be output in the main error block, use
+ * the {$form.errors} part of the rendered array that collects all raw error
+ * messages.
+ *
+ * If you want to place all error messages manually, do not specify {$html}
+ * nor {$label}.
+ *
+ * Groups can have special layouts. With this kind of groups, you have to
+ * place the formated error message manually. In this case, use {$form.group.error}
+ * where you want the formated error message to appear in the form.
+ *
+ * @param string The element error template
+ * @access public
+ * @return void
+ */
+ function setErrorTemplate($template)
+ {
+ $this->_error = $template;
+ } // end func setErrorTemplate
+}
+?> \ No newline at end of file
diff --git a/libs/HTML/QuickForm/Renderer/Default.php b/libs/HTML/QuickForm/Renderer/Default.php
new file mode 100755
index 0000000000..d119b3534b
--- /dev/null
+++ b/libs/HTML/QuickForm/Renderer/Default.php
@@ -0,0 +1,485 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * A concrete renderer for HTML_QuickForm, based on QuickForm 2.x built-in one
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id$
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * An abstract base class for QuickForm renderers
+ */
+require_once 'HTML/QuickForm/Renderer.php';
+
+/**
+ * A concrete renderer for HTML_QuickForm, based on QuickForm 2.x built-in one
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 3.0
+ */
+class HTML_QuickForm_Renderer_Default extends HTML_QuickForm_Renderer
+{
+ /**
+ * The HTML of the form
+ * @var string
+ * @access private
+ */
+ var $_html;
+
+ /**
+ * Header Template string
+ * @var string
+ * @access private
+ */
+ var $_headerTemplate =
+ "\n\t<tr>\n\t\t<td style=\"white-space: nowrap; background-color: #CCCCCC;\" align=\"left\" valign=\"top\" colspan=\"2\"><b>{header}</b></td>\n\t</tr>";
+
+ /**
+ * Element template string
+ * @var string
+ * @access private
+ */
+ var $_elementTemplate =
+ "\n\t<tr>\n\t\t<td align=\"right\" valign=\"top\"><!-- BEGIN required --><span style=\"color: #ff0000\">*</span><!-- END required --><b>{label}</b></td>\n\t\t<td valign=\"top\" align=\"left\"><!-- BEGIN error --><span style=\"color: #ff0000\">{error}</span><br /><!-- END error -->\t{element}</td>\n\t</tr>";
+
+ /**
+ * Form template string
+ * @var string
+ * @access private
+ */
+ var $_formTemplate =
+ "\n<form{attributes}>\n<div>\n{hidden}<table border=\"0\">\n{content}\n</table>\n</div>\n</form>";
+
+ /**
+ * Required Note template string
+ * @var string
+ * @access private
+ */
+ var $_requiredNoteTemplate =
+ "\n\t<tr>\n\t\t<td></td>\n\t<td align=\"left\" valign=\"top\">{requiredNote}</td>\n\t</tr>";
+
+ /**
+ * Array containing the templates for customised elements
+ * @var array
+ * @access private
+ */
+ var $_templates = array();
+
+ /**
+ * Array containing the templates for group wraps.
+ *
+ * These templates are wrapped around group elements and groups' own
+ * templates wrap around them. This is set by setGroupTemplate().
+ *
+ * @var array
+ * @access private
+ */
+ var $_groupWraps = array();
+
+ /**
+ * Array containing the templates for elements within groups
+ * @var array
+ * @access private
+ */
+ var $_groupTemplates = array();
+
+ /**
+ * True if we are inside a group
+ * @var bool
+ * @access private
+ */
+ var $_inGroup = false;
+
+ /**
+ * Array with HTML generated for group elements
+ * @var array
+ * @access private
+ */
+ var $_groupElements = array();
+
+ /**
+ * Template for an element inside a group
+ * @var string
+ * @access private
+ */
+ var $_groupElementTemplate = '';
+
+ /**
+ * HTML that wraps around the group elements
+ * @var string
+ * @access private
+ */
+ var $_groupWrap = '';
+
+ /**
+ * HTML for the current group
+ * @var string
+ * @access private
+ */
+ var $_groupTemplate = '';
+
+ /**
+ * Collected HTML of the hidden fields
+ * @var string
+ * @access private
+ */
+ var $_hiddenHtml = '';
+
+ /**
+ * Constructor
+ *
+ * @access public
+ */
+ function HTML_QuickForm_Renderer_Default()
+ {
+ $this->HTML_QuickForm_Renderer();
+ } // end constructor
+
+ /**
+ * returns the HTML generated for the form
+ *
+ * @access public
+ * @return string
+ */
+ function toHtml()
+ {
+ // _hiddenHtml is cleared in finishForm(), so this only matters when
+ // finishForm() was not called (e.g. group::toHtml(), bug #3511)
+ return $this->_hiddenHtml . $this->_html;
+ } // end func toHtml
+
+ /**
+ * Called when visiting a form, before processing any form elements
+ *
+ * @param HTML_QuickForm form object being visited
+ * @access public
+ * @return void
+ */
+ function startForm(&$form)
+ {
+ $this->_html = '';
+ $this->_hiddenHtml = '';
+ } // end func startForm
+
+ /**
+ * Called when visiting a form, after processing all form elements
+ * Adds required note, form attributes, validation javascript and form content.
+ *
+ * @param HTML_QuickForm form object being visited
+ * @access public
+ * @return void
+ */
+ function finishForm(&$form)
+ {
+ // add a required note, if one is needed
+ if (!empty($form->_required) && !$form->_freezeAll) {
+ $this->_html .= str_replace('{requiredNote}', $form->getRequiredNote(), $this->_requiredNoteTemplate);
+ }
+ // add form attributes and content
+ $html = str_replace('{attributes}', $form->getAttributes(true), $this->_formTemplate);
+ if (strpos($this->_formTemplate, '{hidden}')) {
+ $html = str_replace('{hidden}', $this->_hiddenHtml, $html);
+ } else {
+ $this->_html .= $this->_hiddenHtml;
+ }
+ $this->_hiddenHtml = '';
+ $this->_html = str_replace('{content}', $this->_html, $html);
+ // add a validation script
+ if ('' != ($script = $form->getValidationScript())) {
+ $this->_html = $script . "\n" . $this->_html;
+ }
+ } // end func finishForm
+
+ /**
+ * Called when visiting a header element
+ *
+ * @param HTML_QuickForm_header header element being visited
+ * @access public
+ * @return void
+ */
+ function renderHeader(&$header)
+ {
+ $name = $header->getName();
+ if (!empty($name) && isset($this->_templates[$name])) {
+ $this->_html .= str_replace('{header}', $header->toHtml(), $this->_templates[$name]);
+ } else {
+ $this->_html .= str_replace('{header}', $header->toHtml(), $this->_headerTemplate);
+ }
+ } // end func renderHeader
+
+ /**
+ * Helper method for renderElement
+ *
+ * @param string Element name
+ * @param mixed Element label (if using an array of labels, you should set the appropriate template)
+ * @param bool Whether an element is required
+ * @param string Error message associated with the element
+ * @access private
+ * @see renderElement()
+ * @return string Html for element
+ */
+ function _prepareTemplate($name, $label, $required, $error)
+ {
+ if (is_array($label)) {
+ $nameLabel = array_shift($label);
+ } else {
+ $nameLabel = $label;
+ }
+ if (isset($this->_templates[$name])) {
+ $html = str_replace('{label}', $nameLabel, $this->_templates[$name]);
+ } else {
+ $html = str_replace('{label}', $nameLabel, $this->_elementTemplate);
+ }
+ if ($required) {
+ $html = str_replace('<!-- BEGIN required -->', '', $html);
+ $html = str_replace('<!-- END required -->', '', $html);
+ } else {
+ $html = preg_replace("/([ \t\n\r]*)?<!-- BEGIN required -->.*<!-- END required -->([ \t\n\r]*)?/iU", '', $html);
+ }
+ if (isset($error)) {
+ $html = str_replace('{error}', $error, $html);
+ $html = str_replace('<!-- BEGIN error -->', '', $html);
+ $html = str_replace('<!-- END error -->', '', $html);
+ } else {
+ $html = preg_replace("/([ \t\n\r]*)?<!-- BEGIN error -->.*<!-- END error -->([ \t\n\r]*)?/iU", '', $html);
+ }
+ if (is_array($label)) {
+ foreach($label as $key => $text) {
+ $key = is_int($key)? $key + 2: $key;
+ $html = str_replace("{label_{$key}}", $text, $html);
+ $html = str_replace("<!-- BEGIN label_{$key} -->", '', $html);
+ $html = str_replace("<!-- END label_{$key} -->", '', $html);
+ }
+ }
+ if (strpos($html, '{label_')) {
+ $html = preg_replace('/\s*<!-- BEGIN label_(\S+) -->.*<!-- END label_\1 -->\s*/i', '', $html);
+ }
+ return $html;
+ } // end func _prepareTemplate
+
+ /**
+ * Renders an element Html
+ * Called when visiting an element
+ *
+ * @param HTML_QuickForm_element form element being visited
+ * @param bool Whether an element is required
+ * @param string An error message associated with an element
+ * @access public
+ * @return void
+ */
+ function renderElement(&$element, $required, $error)
+ {
+ if (!$this->_inGroup) {
+ $html = $this->_prepareTemplate($element->getName(), $element->getLabel(), $required, $error);
+ $this->_html .= str_replace('{element}', $element->toHtml(), $html);
+
+ } elseif (!empty($this->_groupElementTemplate)) {
+ $html = str_replace('{label}', $element->getLabel(), $this->_groupElementTemplate);
+ if ($required) {
+ $html = str_replace('<!-- BEGIN required -->', '', $html);
+ $html = str_replace('<!-- END required -->', '', $html);
+ } else {
+ $html = preg_replace("/([ \t\n\r]*)?<!-- BEGIN required -->.*<!-- END required -->([ \t\n\r]*)?/iU", '', $html);
+ }
+ $this->_groupElements[] = str_replace('{element}', $element->toHtml(), $html);
+
+ } else {
+ $this->_groupElements[] = $element->toHtml();
+ }
+ } // end func renderElement
+
+ /**
+ * Renders an hidden element
+ * Called when visiting a hidden element
+ *
+ * @param HTML_QuickForm_element form element being visited
+ * @access public
+ * @return void
+ */
+ function renderHidden(&$element)
+ {
+ $this->_hiddenHtml .= $element->toHtml() . "\n";
+ } // end func renderHidden
+
+ /**
+ * Called when visiting a raw HTML/text pseudo-element
+ *
+ * @param HTML_QuickForm_html element being visited
+ * @access public
+ * @return void
+ */
+ function renderHtml(&$data)
+ {
+ $this->_html .= $data->toHtml();
+ } // end func renderHtml
+
+ /**
+ * Called when visiting a group, before processing any group elements
+ *
+ * @param HTML_QuickForm_group group being visited
+ * @param bool Whether a group is required
+ * @param string An error message associated with a group
+ * @access public
+ * @return void
+ */
+ function startGroup(&$group, $required, $error)
+ {
+ $name = $group->getName();
+ $this->_groupTemplate = $this->_prepareTemplate($name, $group->getLabel(), $required, $error);
+ $this->_groupElementTemplate = empty($this->_groupTemplates[$name])? '': $this->_groupTemplates[$name];
+ $this->_groupWrap = empty($this->_groupWraps[$name])? '': $this->_groupWraps[$name];
+ $this->_groupElements = array();
+ $this->_inGroup = true;
+ } // end func startGroup
+
+ /**
+ * Called when visiting a group, after processing all group elements
+ *
+ * @param HTML_QuickForm_group group being visited
+ * @access public
+ * @return void
+ */
+ function finishGroup(&$group)
+ {
+ $separator = $group->_separator;
+ if (is_array($separator)) {
+ $count = count($separator);
+ $html = '';
+ for ($i = 0; $i < count($this->_groupElements); $i++) {
+ $html .= (0 == $i? '': $separator[($i - 1) % $count]) . $this->_groupElements[$i];
+ }
+ } else {
+ if (is_null($separator)) {
+ $separator = '&nbsp;';
+ }
+ $html = implode((string)$separator, $this->_groupElements);
+ }
+ if (!empty($this->_groupWrap)) {
+ $html = str_replace('{content}', $html, $this->_groupWrap);
+ }
+ $this->_html .= str_replace('{element}', $html, $this->_groupTemplate);
+ $this->_inGroup = false;
+ } // end func finishGroup
+
+ /**
+ * Sets element template
+ *
+ * @param string The HTML surrounding an element
+ * @param string (optional) Name of the element to apply template for
+ * @access public
+ * @return void
+ */
+ function setElementTemplate($html, $element = null)
+ {
+ if (is_null($element)) {
+ $this->_elementTemplate = $html;
+ } else {
+ $this->_templates[$element] = $html;
+ }
+ } // end func setElementTemplate
+
+
+ /**
+ * Sets template for a group wrapper
+ *
+ * This template is contained within a group-as-element template
+ * set via setTemplate() and contains group's element templates, set
+ * via setGroupElementTemplate()
+ *
+ * @param string The HTML surrounding group elements
+ * @param string Name of the group to apply template for
+ * @access public
+ * @return void
+ */
+ function setGroupTemplate($html, $group)
+ {
+ $this->_groupWraps[$group] = $html;
+ } // end func setGroupTemplate
+
+ /**
+ * Sets element template for elements within a group
+ *
+ * @param string The HTML surrounding an element
+ * @param string Name of the group to apply template for
+ * @access public
+ * @return void
+ */
+ function setGroupElementTemplate($html, $group)
+ {
+ $this->_groupTemplates[$group] = $html;
+ } // end func setGroupElementTemplate
+
+ /**
+ * Sets header template
+ *
+ * @param string The HTML surrounding the header
+ * @access public
+ * @return void
+ */
+ function setHeaderTemplate($html)
+ {
+ $this->_headerTemplate = $html;
+ } // end func setHeaderTemplate
+
+ /**
+ * Sets form template
+ *
+ * @param string The HTML surrounding the form tags
+ * @access public
+ * @return void
+ */
+ function setFormTemplate($html)
+ {
+ $this->_formTemplate = $html;
+ } // end func setFormTemplate
+
+ /**
+ * Sets the note indicating required fields template
+ *
+ * @param string The HTML surrounding the required note
+ * @access public
+ * @return void
+ */
+ function setRequiredNoteTemplate($html)
+ {
+ $this->_requiredNoteTemplate = $html;
+ } // end func setRequiredNoteTemplate
+
+ /**
+ * Clears all the HTML out of the templates that surround notes, elements, etc.
+ * Useful when you want to use addData() to create a completely custom form look
+ *
+ * @access public
+ * @return void
+ */
+ function clearAllTemplates()
+ {
+ $this->setElementTemplate('{element}');
+ $this->setFormTemplate("\n\t<form{attributes}>{content}\n\t</form>\n");
+ $this->setRequiredNoteTemplate('');
+ $this->_templates = array();
+ } // end func clearAllTemplates
+} // end class HTML_QuickForm_Renderer_Default
+?>
diff --git a/libs/HTML/QuickForm/Renderer/ITDynamic.php b/libs/HTML/QuickForm/Renderer/ITDynamic.php
new file mode 100755
index 0000000000..479cc4b876
--- /dev/null
+++ b/libs/HTML/QuickForm/Renderer/ITDynamic.php
@@ -0,0 +1,300 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * A concrete renderer for HTML_QuickForm, using Integrated Templates.
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: ITDynamic.php,v 1.6 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * An abstract base class for QuickForm renderers
+ */
+require_once 'HTML/QuickForm/Renderer.php';
+
+/**
+ * A concrete renderer for HTML_QuickForm, using Integrated Templates.
+ *
+ * This is a "dynamic" renderer, which means that concrete form look
+ * is defined at runtime. This also means that you can define
+ * <b>one</b> template file for <b>all</b> your forms. That template
+ * should contain a block for every element 'look' appearing in your
+ * forms and also some special blocks (consult the examples). If a
+ * special block is not set for an element, the renderer falls back to
+ * a default one.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ * @since 3.0
+ */
+class HTML_QuickForm_Renderer_ITDynamic extends HTML_QuickForm_Renderer
+{
+ /**#@+
+ * @access private
+ */
+ /**
+ * A template class (HTML_Template_ITX or HTML_Template_Sigma) instance
+ * @var HTML_Template_ITX|HTML_Template_Sigma
+ */
+ var $_tpl = null;
+
+ /**
+ * The errors that were not shown near concrete fields go here
+ * @var array
+ */
+ var $_errors = array();
+
+ /**
+ * Show the block with required note?
+ * @var bool
+ */
+ var $_showRequired = false;
+
+ /**
+ * A separator for group elements
+ * @var mixed
+ */
+ var $_groupSeparator = null;
+
+ /**
+ * The current element index inside a group
+ * @var integer
+ */
+ var $_groupElementIdx = 0;
+
+ /**
+ * Blocks to use for different elements
+ * @var array
+ */
+ var $_elementBlocks = array();
+
+ /**
+ * Block to use for headers
+ * @var string
+ */
+ var $_headerBlock = null;
+ /**#@-*/
+
+
+ /**
+ * Constructor
+ *
+ * @param HTML_Template_ITX|HTML_Template_Sigma Template object to use
+ */
+ function HTML_QuickForm_Renderer_ITDynamic(&$tpl)
+ {
+ $this->HTML_QuickForm_Renderer();
+ $this->_tpl =& $tpl;
+ $this->_tpl->setCurrentBlock('qf_main_loop');
+ }
+
+
+ function finishForm(&$form)
+ {
+ // display errors above form
+ if (!empty($this->_errors) && $this->_tpl->blockExists('qf_error_loop')) {
+ foreach ($this->_errors as $error) {
+ $this->_tpl->setVariable('qf_error', $error);
+ $this->_tpl->parse('qf_error_loop');
+ }
+ }
+ // show required note
+ if ($this->_showRequired) {
+ $this->_tpl->setVariable('qf_required_note', $form->getRequiredNote());
+ }
+ // assign form attributes
+ $this->_tpl->setVariable('qf_attributes', $form->getAttributes(true));
+ // assign javascript validation rules
+ $this->_tpl->setVariable('qf_javascript', $form->getValidationScript());
+ }
+
+
+ function renderHeader(&$header)
+ {
+ $blockName = $this->_matchBlock($header);
+ if ('qf_header' == $blockName && isset($this->_headerBlock)) {
+ $blockName = $this->_headerBlock;
+ }
+ $this->_tpl->setVariable('qf_header', $header->toHtml());
+ $this->_tpl->parse($blockName);
+ $this->_tpl->parse('qf_main_loop');
+ }
+
+
+ function renderElement(&$element, $required, $error)
+ {
+ $blockName = $this->_matchBlock($element);
+ // are we inside a group?
+ if ('qf_main_loop' != $this->_tpl->currentBlock) {
+ if (0 != $this->_groupElementIdx && $this->_tpl->placeholderExists('qf_separator', $blockName)) {
+ if (is_array($this->_groupSeparator)) {
+ $this->_tpl->setVariable('qf_separator', $this->_groupSeparator[($this->_groupElementIdx - 1) % count($this->_groupSeparator)]);
+ } else {
+ $this->_tpl->setVariable('qf_separator', (string)$this->_groupSeparator);
+ }
+ }
+ $this->_groupElementIdx++;
+
+ } elseif(!empty($error)) {
+ // show the error message or keep it for later use
+ if ($this->_tpl->blockExists($blockName . '_error')) {
+ $this->_tpl->setVariable('qf_error', $error);
+ } else {
+ $this->_errors[] = $error;
+ }
+ }
+ // show an '*' near the required element
+ if ($required) {
+ $this->_showRequired = true;
+ if ($this->_tpl->blockExists($blockName . '_required')) {
+ $this->_tpl->touchBlock($blockName . '_required');
+ }
+ }
+ // Prepare multiple labels
+ $labels = $element->getLabel();
+ if (is_array($labels)) {
+ $mainLabel = array_shift($labels);
+ } else {
+ $mainLabel = $labels;
+ }
+ // render the element itself with its main label
+ $this->_tpl->setVariable('qf_element', $element->toHtml());
+ if ($this->_tpl->placeholderExists('qf_label', $blockName)) {
+ $this->_tpl->setVariable('qf_label', $mainLabel);
+ }
+ // render extra labels, if any
+ if (is_array($labels)) {
+ foreach($labels as $key => $label) {
+ $key = is_int($key)? $key + 2: $key;
+ if ($this->_tpl->blockExists($blockName . '_label_' . $key)) {
+ $this->_tpl->setVariable('qf_label_' . $key, $label);
+ }
+ }
+ }
+ $this->_tpl->parse($blockName);
+ $this->_tpl->parseCurrentBlock();
+ }
+
+
+ function renderHidden(&$element)
+ {
+ $this->_tpl->setVariable('qf_hidden', $element->toHtml());
+ $this->_tpl->parse('qf_hidden_loop');
+ }
+
+
+ function startGroup(&$group, $required, $error)
+ {
+ $blockName = $this->_matchBlock($group);
+ $this->_tpl->setCurrentBlock($blockName . '_loop');
+ $this->_groupElementIdx = 0;
+ $this->_groupSeparator = is_null($group->_separator)? '&nbsp;': $group->_separator;
+ // show an '*' near the required element
+ if ($required) {
+ $this->_showRequired = true;
+ if ($this->_tpl->blockExists($blockName . '_required')) {
+ $this->_tpl->touchBlock($blockName . '_required');
+ }
+ }
+ // show the error message or keep it for later use
+ if (!empty($error)) {
+ if ($this->_tpl->blockExists($blockName . '_error')) {
+ $this->_tpl->setVariable('qf_error', $error);
+ } else {
+ $this->_errors[] = $error;
+ }
+ }
+ $this->_tpl->setVariable('qf_group_label', $group->getLabel());
+ }
+
+
+ function finishGroup(&$group)
+ {
+ $this->_tpl->parse($this->_matchBlock($group));
+ $this->_tpl->setCurrentBlock('qf_main_loop');
+ $this->_tpl->parseCurrentBlock();
+ }
+
+
+ /**
+ * Returns the name of a block to use for element rendering
+ *
+ * If a name was not explicitly set via setElementBlock(), it tries
+ * the names '{prefix}_{element type}' and '{prefix}_{element}', where
+ * prefix is either 'qf' or the name of the current group's block
+ *
+ * @param HTML_QuickForm_element form element being rendered
+ * @access private
+ * @return string block name
+ */
+ function _matchBlock(&$element)
+ {
+ $name = $element->getName();
+ $type = $element->getType();
+ if (isset($this->_elementBlocks[$name]) && $this->_tpl->blockExists($this->_elementBlocks[$name])) {
+ if (('group' == $type) || ($this->_elementBlocks[$name] . '_loop' != $this->_tpl->currentBlock)) {
+ return $this->_elementBlocks[$name];
+ }
+ }
+ if ('group' != $type && 'qf_main_loop' != $this->_tpl->currentBlock) {
+ $prefix = substr($this->_tpl->currentBlock, 0, -5); // omit '_loop' postfix
+ } else {
+ $prefix = 'qf';
+ }
+ if ($this->_tpl->blockExists($prefix . '_' . $type)) {
+ return $prefix . '_' . $type;
+ } elseif ($this->_tpl->blockExists($prefix . '_' . $name)) {
+ return $prefix . '_' . $name;
+ } else {
+ return $prefix . '_element';
+ }
+ }
+
+
+ /**
+ * Sets the block to use for element rendering
+ *
+ * @param mixed element name or array ('element name' => 'block name')
+ * @param string block name if $elementName is not an array
+ * @access public
+ * @return void
+ */
+ function setElementBlock($elementName, $blockName = null)
+ {
+ if (is_array($elementName)) {
+ $this->_elementBlocks = array_merge($this->_elementBlocks, $elementName);
+ } else {
+ $this->_elementBlocks[$elementName] = $blockName;
+ }
+ }
+
+
+ /**
+ * Sets the name of a block to use for header rendering
+ *
+ * @param string block name
+ * @access public
+ * @return void
+ */
+ function setHeaderBlock($blockName)
+ {
+ $this->_headerBlock = $blockName;
+ }
+}
+?>
diff --git a/libs/HTML/QuickForm/Renderer/ITStatic.php b/libs/HTML/QuickForm/Renderer/ITStatic.php
new file mode 100755
index 0000000000..578a8baed7
--- /dev/null
+++ b/libs/HTML/QuickForm/Renderer/ITStatic.php
@@ -0,0 +1,504 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * A static renderer for HTML_QuickForm compatible
+ * with HTML_Template_IT and HTML_Template_Sigma.
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: ITStatic.php,v 1.8 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * An abstract base class for QuickForm renderers
+ */
+require_once 'HTML/QuickForm/Renderer.php';
+
+/**
+ * A static renderer for HTML_QuickForm compatible
+ * with HTML_Template_IT and HTML_Template_Sigma.
+ *
+ * As opposed to the dynamic renderer, this renderer needs
+ * every elements and labels in the form to be specified by
+ * placeholders at the position you want them to be displayed.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 3.0
+ */
+class HTML_QuickForm_Renderer_ITStatic extends HTML_QuickForm_Renderer
+{
+ /**#@+
+ * @access private
+ */
+ /**
+ * An HTML_Template_IT or some other API compatible Template instance
+ * @var object
+ */
+ var $_tpl = null;
+
+ /**
+ * Rendered form name
+ * @var string
+ */
+ var $_formName = 'form';
+
+ /**
+ * The errors that were not shown near concrete fields go here
+ * @var array
+ */
+ var $_errors = array();
+
+ /**
+ * Show the block with required note?
+ * @var bool
+ */
+ var $_showRequired = false;
+
+ /**
+ * Which group are we currently parsing ?
+ * @var string
+ */
+ var $_inGroup;
+
+ /**
+ * Index of the element in its group
+ * @var int
+ */
+ var $_elementIndex = 0;
+
+ /**
+ * If elements have been added with the same name
+ * @var array
+ */
+ var $_duplicateElements = array();
+
+ /**
+ * How to handle the required tag for required fields
+ * @var string
+ */
+ var $_required = '{label}<font size="1" color="red">*</font>';
+
+ /**
+ * How to handle error messages in form validation
+ * @var string
+ */
+ var $_error = '<font color="red">{error}</font><br />{html}';
+
+ /**
+ * Collected HTML for hidden elements, if needed
+ * @var string
+ */
+ var $_hidden = '';
+ /**#@-*/
+
+ /**
+ * Constructor
+ *
+ * @param HTML_Template_IT|HTML_Template_Sigma Template object to use
+ */
+ function HTML_QuickForm_Renderer_ITStatic(&$tpl)
+ {
+ $this->HTML_QuickForm_Renderer();
+ $this->_tpl =& $tpl;
+ } // end constructor
+
+ /**
+ * Called when visiting a form, before processing any form elements
+ *
+ * @param HTML_QuickForm form object being visited
+ * @access public
+ * @return void
+ */
+ function startForm(&$form)
+ {
+ $this->_formName = $form->getAttribute('id');
+
+ if (count($form->_duplicateIndex) > 0) {
+ // Take care of duplicate elements
+ foreach ($form->_duplicateIndex as $elementName => $indexes) {
+ $this->_duplicateElements[$elementName] = 0;
+ }
+ }
+ } // end func startForm
+
+ /**
+ * Called when visiting a form, after processing all form elements
+ *
+ * @param HTML_QuickForm form object being visited
+ * @access public
+ * @return void
+ */
+ function finishForm(&$form)
+ {
+ // display errors above form
+ if (!empty($this->_errors) && $this->_tpl->blockExists($this->_formName.'_error_loop')) {
+ foreach ($this->_errors as $error) {
+ $this->_tpl->setVariable($this->_formName.'_error', $error);
+ $this->_tpl->parse($this->_formName.'_error_loop');
+ }
+ }
+ // show required note
+ if ($this->_showRequired) {
+ $this->_tpl->setVariable($this->_formName.'_required_note', $form->getRequiredNote());
+ }
+ // add hidden elements, if collected
+ if (!empty($this->_hidden)) {
+ $this->_tpl->setVariable($this->_formName . '_hidden', $this->_hidden);
+ }
+ // assign form attributes
+ $this->_tpl->setVariable($this->_formName.'_attributes', $form->getAttributes(true));
+ // assign javascript validation rules
+ $this->_tpl->setVariable($this->_formName.'_javascript', $form->getValidationScript());
+ } // end func finishForm
+
+ /**
+ * Called when visiting a header element
+ *
+ * @param HTML_QuickForm_header header element being visited
+ * @access public
+ * @return void
+ */
+ function renderHeader(&$header)
+ {
+ $name = $header->getName();
+ $varName = $this->_formName.'_header';
+
+ // Find placeHolder
+ if (!empty($name) && $this->_tpl->placeHolderExists($this->_formName.'_header_'.$name)) {
+ $varName = $this->_formName.'_header_'.$name;
+ }
+ $this->_tpl->setVariable($varName, $header->toHtml());
+ } // end func renderHeader
+
+ /**
+ * Called when visiting an element
+ *
+ * @param HTML_QuickForm_element form element being visited
+ * @param bool Whether an element is required
+ * @param string An error message associated with an element
+ * @access public
+ * @return void
+ */
+ function renderElement(&$element, $required, $error)
+ {
+ $name = $element->getName();
+
+ // are we inside a group?
+ if (!empty($this->_inGroup)) {
+ $varName = $this->_formName.'_'.str_replace(array('[', ']'), '_', $name);
+ if (substr($varName, -2) == '__') {
+ // element name is of type : group[]
+ $varName = $this->_inGroup.'_'.$this->_elementIndex.'_';
+ $this->_elementIndex++;
+ }
+ if ($varName != $this->_inGroup) {
+ $varName .= '_' == substr($varName, -1)? '': '_';
+ // element name is of type : group[name]
+ $label = $element->getLabel();
+ $html = $element->toHtml();
+
+ if ($required && !$element->isFrozen()) {
+ $this->_renderRequired($label, $html);
+ $this->_showRequired = true;
+ }
+ if (!empty($label)) {
+ if (is_array($label)) {
+ foreach ($label as $key => $value) {
+ $this->_tpl->setVariable($varName.'label_'.$key, $value);
+ }
+ } else {
+ $this->_tpl->setVariable($varName.'label', $label);
+ }
+ }
+ $this->_tpl->setVariable($varName.'html', $html);
+ }
+
+ } else {
+
+ $name = str_replace(array('[', ']'), array('_', ''), $name);
+
+ if (isset($this->_duplicateElements[$name])) {
+ // Element is a duplicate
+ $varName = $this->_formName.'_'.$name.'_'.$this->_duplicateElements[$name];
+ $this->_duplicateElements[$name]++;
+ } else {
+ $varName = $this->_formName.'_'.$name;
+ }
+
+ $label = $element->getLabel();
+ $html = $element->toHtml();
+
+ if ($required) {
+ $this->_showRequired = true;
+ $this->_renderRequired($label, $html);
+ }
+ if (!empty($error)) {
+ $this->_renderError($label, $html, $error);
+ }
+ if (is_array($label)) {
+ foreach ($label as $key => $value) {
+ $this->_tpl->setVariable($varName.'_label_'.$key, $value);
+ }
+ } else {
+ $this->_tpl->setVariable($varName.'_label', $label);
+ }
+ $this->_tpl->setVariable($varName.'_html', $html);
+ }
+ } // end func renderElement
+
+ /**
+ * Called when visiting a hidden element
+ *
+ * @param HTML_QuickForm_element hidden element being visited
+ * @access public
+ * @return void
+ */
+ function renderHidden(&$element)
+ {
+ if ($this->_tpl->placeholderExists($this->_formName . '_hidden')) {
+ $this->_hidden .= $element->toHtml();
+ } else {
+ $name = $element->getName();
+ $name = str_replace(array('[', ']'), array('_', ''), $name);
+ $this->_tpl->setVariable($this->_formName.'_'.$name.'_html', $element->toHtml());
+ }
+ } // end func renderHidden
+
+ /**
+ * Called when visiting a group, before processing any group elements
+ *
+ * @param HTML_QuickForm_group group being visited
+ * @param bool Whether a group is required
+ * @param string An error message associated with a group
+ * @access public
+ * @return void
+ */
+ function startGroup(&$group, $required, $error)
+ {
+ $name = $group->getName();
+ $varName = $this->_formName.'_'.$name;
+
+ $this->_elementIndex = 0;
+
+ $html = $this->_tpl->placeholderExists($varName.'_html') ? $group->toHtml() : '';
+ $label = $group->getLabel();
+
+ if ($required) {
+ $this->_renderRequired($label, $html);
+ }
+ if (!empty($error)) {
+ $this->_renderError($label, $html, $error);
+ }
+ if (!empty($html)) {
+ $this->_tpl->setVariable($varName.'_html', $html);
+ } else {
+ // Uses error blocks to set the special groups layout error
+ // <!-- BEGIN form_group_error -->{form_group_error}<!-- END form_group_error -->
+ if (!empty($error)) {
+ if ($this->_tpl->placeholderExists($varName.'_error')) {
+ if ($this->_tpl->blockExists($this->_formName . '_error_block')) {
+ $this->_tpl->setVariable($this->_formName . '_error', $error);
+ $error = $this->_getTplBlock($this->_formName . '_error_block');
+ } elseif (strpos($this->_error, '{html}') !== false || strpos($this->_error, '{label}') !== false) {
+ $error = str_replace('{error}', $error, $this->_error);
+ }
+ }
+ $this->_tpl->setVariable($varName . '_error', $error);
+ array_pop($this->_errors);
+ }
+ }
+ if (is_array($label)) {
+ foreach ($label as $key => $value) {
+ $this->_tpl->setVariable($varName.'_label_'.$key, $value);
+ }
+ } else {
+ $this->_tpl->setVariable($varName.'_label', $label);
+ }
+ $this->_inGroup = $varName;
+ } // end func startGroup
+
+ /**
+ * Called when visiting a group, after processing all group elements
+ *
+ * @param HTML_QuickForm_group group being visited
+ * @access public
+ * @return void
+ */
+ function finishGroup(&$group)
+ {
+ $this->_inGroup = '';
+ } // end func finishGroup
+
+ /**
+ * Sets the way required elements are rendered
+ *
+ * You can use {label} or {html} placeholders to let the renderer know where
+ * where the element label or the element html are positionned according to the
+ * required tag. They will be replaced accordingly with the right value.
+ * For example:
+ * <font color="red">*</font>{label}
+ * will put a red star in front of the label if the element is required.
+ *
+ * @param string The required element template
+ * @access public
+ * @return void
+ */
+ function setRequiredTemplate($template)
+ {
+ $this->_required = $template;
+ } // end func setRequiredTemplate
+
+ /**
+ * Sets the way elements with validation errors are rendered
+ *
+ * You can use {label} or {html} placeholders to let the renderer know where
+ * where the element label or the element html are positionned according to the
+ * error message. They will be replaced accordingly with the right value.
+ * The error message will replace the {error} place holder.
+ * For example:
+ * <font color="red">{error}</font><br />{html}
+ * will put the error message in red on top of the element html.
+ *
+ * If you want all error messages to be output in the main error block, do not specify
+ * {html} nor {label}.
+ *
+ * Groups can have special layouts. With this kind of groups, the renderer will need
+ * to know where to place the error message. In this case, use error blocks like:
+ * <!-- BEGIN form_group_error -->{form_group_error}<!-- END form_group_error -->
+ * where you want the error message to appear in the form.
+ *
+ * @param string The element error template
+ * @access public
+ * @return void
+ */
+ function setErrorTemplate($template)
+ {
+ $this->_error = $template;
+ } // end func setErrorTemplate
+
+ /**
+ * Called when an element is required
+ *
+ * This method will add the required tag to the element label and/or the element html
+ * such as defined with the method setRequiredTemplate
+ *
+ * @param string The element label
+ * @param string The element html rendering
+ * @see setRequiredTemplate()
+ * @access private
+ * @return void
+ */
+ function _renderRequired(&$label, &$html)
+ {
+ if ($this->_tpl->blockExists($tplBlock = $this->_formName . '_required_block')) {
+ if (!empty($label) && $this->_tpl->placeholderExists($this->_formName . '_label', $tplBlock)) {
+ $this->_tpl->setVariable($this->_formName . '_label', is_array($label)? $label[0]: $label);
+ if (is_array($label)) {
+ $label[0] = $this->_getTplBlock($tplBlock);
+ } else {
+ $label = $this->_getTplBlock($tplBlock);
+ }
+ }
+ if (!empty($html) && $this->_tpl->placeholderExists($this->_formName . '_html', $tplBlock)) {
+ $this->_tpl->setVariable($this->_formName . '_html', $html);
+ $html = $this->_getTplBlock($tplBlock);
+ }
+ } else {
+ if (!empty($label) && strpos($this->_required, '{label}') !== false) {
+ if (is_array($label)) {
+ $label[0] = str_replace('{label}', $label[0], $this->_required);
+ } else {
+ $label = str_replace('{label}', $label, $this->_required);
+ }
+ }
+ if (!empty($html) && strpos($this->_required, '{html}') !== false) {
+ $html = str_replace('{html}', $html, $this->_required);
+ }
+ }
+ } // end func _renderRequired
+
+ /**
+ * Called when an element has a validation error
+ *
+ * This method will add the error message to the element label or the element html
+ * such as defined with the method setErrorTemplate. If the error placeholder is not found
+ * in the template, the error will be displayed in the form error block.
+ *
+ * @param string The element label
+ * @param string The element html rendering
+ * @param string The element error
+ * @see setErrorTemplate()
+ * @access private
+ * @return void
+ */
+ function _renderError(&$label, &$html, $error)
+ {
+ if ($this->_tpl->blockExists($tplBlock = $this->_formName . '_error_block')) {
+ $this->_tpl->setVariable($this->_formName . '_error', $error);
+ if (!empty($label) && $this->_tpl->placeholderExists($this->_formName . '_label', $tplBlock)) {
+ $this->_tpl->setVariable($this->_formName . '_label', is_array($label)? $label[0]: $label);
+ if (is_array($label)) {
+ $label[0] = $this->_getTplBlock($tplBlock);
+ } else {
+ $label = $this->_getTplBlock($tplBlock);
+ }
+ } elseif (!empty($html) && $this->_tpl->placeholderExists($this->_formName . '_html', $tplBlock)) {
+ $this->_tpl->setVariable($this->_formName . '_html', $html);
+ $html = $this->_getTplBlock($tplBlock);
+ }
+ // clean up after ourselves
+ $this->_tpl->setVariable($this->_formName . '_error', null);
+ } elseif (!empty($label) && strpos($this->_error, '{label}') !== false) {
+ if (is_array($label)) {
+ $label[0] = str_replace(array('{label}', '{error}'), array($label[0], $error), $this->_error);
+ } else {
+ $label = str_replace(array('{label}', '{error}'), array($label, $error), $this->_error);
+ }
+ } elseif (!empty($html) && strpos($this->_error, '{html}') !== false) {
+ $html = str_replace(array('{html}', '{error}'), array($html, $error), $this->_error);
+ } else {
+ $this->_errors[] = $error;
+ }
+ }// end func _renderError
+
+
+ /**
+ * Returns the block's contents
+ *
+ * The method is needed because ITX and Sigma implement clearing
+ * the block contents on get() a bit differently
+ *
+ * @param string Block name
+ * @return string Block contents
+ */
+ function _getTplBlock($block)
+ {
+ $this->_tpl->parse($block);
+ if (is_a($this->_tpl, 'html_template_sigma')) {
+ $ret = $this->_tpl->get($block, true);
+ } else {
+ $oldClear = $this->_tpl->clearCache;
+ $this->_tpl->clearCache = true;
+ $ret = $this->_tpl->get($block);
+ $this->_tpl->clearCache = $oldClear;
+ }
+ return $ret;
+ }
+} // end class HTML_QuickForm_Renderer_ITStatic
+?> \ No newline at end of file
diff --git a/libs/HTML/QuickForm/Renderer/Object.php b/libs/HTML/QuickForm/Renderer/Object.php
new file mode 100755
index 0000000000..42f9b8be0f
--- /dev/null
+++ b/libs/HTML/QuickForm/Renderer/Object.php
@@ -0,0 +1,461 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * A concrete renderer for HTML_QuickForm, makes an object from form contents
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Ron McClain <ron@humaniq.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: Object.php,v 1.5 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * An abstract base class for QuickForm renderers
+ */
+require_once 'HTML/QuickForm/Renderer.php';
+
+/**
+ * A concrete renderer for HTML_QuickForm, makes an object from form contents
+ *
+ * Based on HTML_Quickform_Renderer_Array code
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Ron McClain <ron@humaniq.com>
+ * @version Release: 3.2.9
+ * @since 3.1.1
+ */
+class HTML_QuickForm_Renderer_Object extends HTML_QuickForm_Renderer
+{
+ /**#@+
+ * @access private
+ */
+ /**
+ * The object being generated
+ * @var QuickformForm
+ */
+ var $_obj= null;
+
+ /**
+ * Number of sections in the form (i.e. number of headers in it)
+ * @var integer $_sectionCount
+ */
+ var $_sectionCount;
+
+ /**
+ * Current section number
+ * @var integer $_currentSection
+ */
+ var $_currentSection;
+
+ /**
+ * Object representing current group
+ * @var object $_currentGroup
+ */
+ var $_currentGroup = null;
+
+ /**
+ * Class of Element Objects
+ * @var object $_elementType
+ */
+ var $_elementType = 'QuickFormElement';
+
+ /**
+ * Additional style information for different elements
+ * @var array $_elementStyles
+ */
+ var $_elementStyles = array();
+
+ /**
+ * true: collect all hidden elements into string; false: process them as usual form elements
+ * @var bool $_collectHidden
+ */
+ var $_collectHidden = false;
+ /**#@-*/
+
+
+ /**
+ * Constructor
+ *
+ * @param bool true: collect all hidden elements
+ * @access public
+ */
+ function HTML_QuickForm_Renderer_Object($collecthidden = false)
+ {
+ $this->HTML_QuickForm_Renderer();
+ $this->_collectHidden = $collecthidden;
+ $this->_obj = new QuickformForm;
+ }
+
+ /**
+ * Return the rendered Object
+ * @access public
+ */
+ function toObject()
+ {
+ return $this->_obj;
+ }
+
+ /**
+ * Set the class of the form elements. Defaults to QuickformElement.
+ * @param string Name of element class
+ * @access public
+ */
+ function setElementType($type)
+ {
+ $this->_elementType = $type;
+ }
+
+ function startForm(&$form)
+ {
+ $this->_obj->frozen = $form->isFrozen();
+ $this->_obj->javascript = $form->getValidationScript();
+ $this->_obj->attributes = $form->getAttributes(true);
+ $this->_obj->requirednote = $form->getRequiredNote();
+ $this->_obj->errors = new StdClass;
+
+ if($this->_collectHidden) {
+ $this->_obj->hidden = '';
+ }
+ $this->_elementIdx = 1;
+ $this->_currentSection = null;
+ $this->_sectionCount = 0;
+ } // end func startForm
+
+ function renderHeader(&$header)
+ {
+ $hobj = new StdClass;
+ $hobj->header = $header->toHtml();
+ $this->_obj->sections[$this->_sectionCount] = $hobj;
+ $this->_currentSection = $this->_sectionCount++;
+ }
+
+ function renderElement(&$element, $required, $error)
+ {
+ $elObj = $this->_elementToObject($element, $required, $error);
+ if(!empty($error)) {
+ $name = $elObj->name;
+ $this->_obj->errors->$name = $error;
+ }
+ $this->_storeObject($elObj);
+ } // end func renderElement
+
+ function renderHidden(&$element)
+ {
+ if($this->_collectHidden) {
+ $this->_obj->hidden .= $element->toHtml() . "\n";
+ } else {
+ $this->renderElement($element, false, null);
+ }
+ } //end func renderHidden
+
+ function startGroup(&$group, $required, $error)
+ {
+ $this->_currentGroup = $this->_elementToObject($group, $required, $error);
+ if(!empty($error)) {
+ $name = $this->_currentGroup->name;
+ $this->_obj->errors->$name = $error;
+ }
+ } // end func startGroup
+
+ function finishGroup(&$group)
+ {
+ $this->_storeObject($this->_currentGroup);
+ $this->_currentGroup = null;
+ } // end func finishGroup
+
+ /**
+ * Creates an object representing an element
+ *
+ * @access private
+ * @param HTML_QuickForm_element form element being rendered
+ * @param required bool Whether an element is required
+ * @param error string Error associated with the element
+ * @return object
+ */
+ function _elementToObject(&$element, $required, $error)
+ {
+ if($this->_elementType) {
+ $ret = new $this->_elementType;
+ }
+ $ret->name = $element->getName();
+ $ret->value = $element->getValue();
+ $ret->type = $element->getType();
+ $ret->frozen = $element->isFrozen();
+ $labels = $element->getLabel();
+ if (is_array($labels)) {
+ $ret->label = array_shift($labels);
+ foreach ($labels as $key => $label) {
+ $key = is_int($key)? $key + 2: $key;
+ $ret->{'label_' . $key} = $label;
+ }
+ } else {
+ $ret->label = $labels;
+ }
+ $ret->required = $required;
+ $ret->error = $error;
+
+ if(isset($this->_elementStyles[$ret->name])) {
+ $ret->style = $this->_elementStyles[$ret->name];
+ $ret->styleTemplate = "styles/". $ret->style .".html";
+ }
+ if($ret->type == 'group') {
+ $ret->separator = $element->_separator;
+ $ret->elements = array();
+ } else {
+ $ret->html = $element->toHtml();
+ }
+ return $ret;
+ }
+
+ /**
+ * Stores an object representation of an element in the form array
+ *
+ * @access private
+ * @param QuickformElement Object representation of an element
+ * @return void
+ */
+ function _storeObject($elObj)
+ {
+ $name = $elObj->name;
+ if(is_object($this->_currentGroup) && $elObj->type != 'group') {
+ $this->_currentGroup->elements[] = $elObj;
+ } elseif (isset($this->_currentSection)) {
+ $this->_obj->sections[$this->_currentSection]->elements[] = $elObj;
+ } else {
+ $this->_obj->elements[] = $elObj;
+ }
+ }
+
+ function setElementStyle($elementName, $styleName = null)
+ {
+ if(is_array($elementName)) {
+ $this->_elementStyles = array_merge($this->_elementStyles, $elementName);
+ } else {
+ $this->_elementStyles[$elementName] = $styleName;
+ }
+ }
+
+} // end class HTML_QuickForm_Renderer_Object
+
+
+
+/**
+ * Convenience class for the form object passed to outputObject()
+ *
+ * Eg.
+ * <pre>
+ * {form.outputJavaScript():h}
+ * {form.outputHeader():h}
+ * <table>
+ * <tr>
+ * <td>{form.name.label:h}</td><td>{form.name.html:h}</td>
+ * </tr>
+ * </table>
+ * </form>
+ * </pre>
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Ron McClain <ron@humaniq.com>
+ * @version Release: 3.2.9
+ * @since 3.1.1
+ */
+class QuickformForm
+{
+ /**
+ * Whether the form has been frozen
+ * @var boolean $frozen
+ */
+ var $frozen;
+
+ /**
+ * Javascript for client-side validation
+ * @var string $javascript
+ */
+ var $javascript;
+
+ /**
+ * Attributes for form tag
+ * @var string $attributes
+ */
+ var $attributes;
+
+ /**
+ * Note about required elements
+ * @var string $requirednote
+ */
+ var $requirednote;
+
+ /**
+ * Collected html of all hidden variables
+ * @var string $hidden
+ */
+ var $hidden;
+
+ /**
+ * Set if there were validation errors.
+ * StdClass object with element names for keys and their
+ * error messages as values
+ * @var object $errors
+ */
+ var $errors;
+
+ /**
+ * Array of QuickformElementObject elements. If there are headers in the form
+ * this will be empty and the elements will be in the
+ * separate sections
+ * @var array $elements
+ */
+ var $elements;
+
+ /**
+ * Array of sections contained in the document
+ * @var array $sections
+ */
+ var $sections;
+
+ /**
+ * Output &lt;form&gt; header
+ * {form.outputHeader():h}
+ * @return string &lt;form attributes&gt;
+ */
+ function outputHeader()
+ {
+ return "<form " . $this->attributes . ">\n";
+ }
+
+ /**
+ * Output form javascript
+ * {form.outputJavaScript():h}
+ * @return string Javascript
+ */
+ function outputJavaScript()
+ {
+ return $this->javascript;
+ }
+} // end class QuickformForm
+
+
+/**
+ * Convenience class describing a form element.
+ *
+ * The properties defined here will be available from
+ * your flexy templates by referencing
+ * {form.zip.label:h}, {form.zip.html:h}, etc.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Ron McClain <ron@humaniq.com>
+ * @version Release: 3.2.9
+ * @since 3.1.1
+ */
+class QuickformElement
+{
+ /**
+ * Element name
+ * @var string $name
+ */
+ var $name;
+
+ /**
+ * Element value
+ * @var mixed $value
+ */
+ var $value;
+
+ /**
+ * Type of element
+ * @var string $type
+ */
+ var $type;
+
+ /**
+ * Whether the element is frozen
+ * @var boolean $frozen
+ */
+ var $frozen;
+
+ /**
+ * Label for the element
+ * @var string $label
+ */
+ var $label;
+
+ /**
+ * Whether element is required
+ * @var boolean $required
+ */
+ var $required;
+
+ /**
+ * Error associated with the element
+ * @var string $error
+ */
+ var $error;
+
+ /**
+ * Some information about element style
+ * @var string $style
+ */
+ var $style;
+
+ /**
+ * HTML for the element
+ * @var string $html
+ */
+ var $html;
+
+ /**
+ * If element is a group, the group separator
+ * @var mixed $separator
+ */
+ var $separator;
+
+ /**
+ * If element is a group, an array of subelements
+ * @var array $elements
+ */
+ var $elements;
+
+ function isType($type)
+ {
+ return ($this->type == $type);
+ }
+
+ function notFrozen()
+ {
+ return !$this->frozen;
+ }
+
+ function isButton()
+ {
+ return ($this->type == "submit" || $this->type == "reset");
+ }
+
+
+ /**
+ * XXX: why does it use Flexy when all other stuff here does not depend on it?
+ */
+ function outputStyle()
+ {
+ ob_start();
+ HTML_Template_Flexy::staticQuickTemplate('styles/' . $this->style . '.html', $this);
+ $ret = ob_get_contents();
+ ob_end_clean();
+ return $ret;
+ }
+} // end class QuickformElement
+?>
diff --git a/libs/HTML/QuickForm/Renderer/ObjectFlexy.php b/libs/HTML/QuickForm/Renderer/ObjectFlexy.php
new file mode 100755
index 0000000000..ea6f6e645f
--- /dev/null
+++ b/libs/HTML/QuickForm/Renderer/ObjectFlexy.php
@@ -0,0 +1,291 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * QuickForm renderer for Flexy template engine, static version.
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Ron McClain <ron@humaniq.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: ObjectFlexy.php,v 1.9 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * A concrete renderer for HTML_QuickForm, makes an object from form contents
+ */
+require_once 'HTML/QuickForm/Renderer/Object.php';
+
+/**
+ * QuickForm renderer for Flexy template engine, static version.
+ *
+ * A static renderer for HTML_Quickform. Makes a QuickFormFlexyObject
+ * from the form content suitable for use with a Flexy template
+ *
+ * Usage:
+ * <code>
+ * $form =& new HTML_QuickForm('form', 'POST');
+ * $template =& new HTML_Template_Flexy();
+ * $renderer =& new HTML_QuickForm_Renderer_ObjectFlexy(&$template);
+ * $renderer->setHtmlTemplate("html.html");
+ * $renderer->setLabelTemplate("label.html");
+ * $form->accept($renderer);
+ * $view = new StdClass;
+ * $view->form = $renderer->toObject();
+ * $template->compile("mytemplate.html");
+ * </code>
+ *
+ * Based on the code for HTML_QuickForm_Renderer_ArraySmarty
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Ron McClain <ron@humaniq.com>
+ * @version Release: 3.2.9
+ * @since 3.1.1
+ */
+class HTML_QuickForm_Renderer_ObjectFlexy extends HTML_QuickForm_Renderer_Object
+{
+ /**#@+
+ * @access private
+ */
+ /**
+ * HTML_Template_Flexy instance
+ * @var object $_flexy
+ */
+ var $_flexy;
+
+ /**
+ * Current element index
+ * @var integer $_elementIdx
+ */
+ var $_elementIdx;
+
+ /**
+ * The current element index inside a group
+ * @var integer $_groupElementIdx
+ */
+ var $_groupElementIdx = 0;
+
+ /**
+ * Name of template file for form html
+ * @var string $_html
+ * @see setRequiredTemplate()
+ */
+ var $_html = '';
+
+ /**
+ * Name of template file for form labels
+ * @var string $label
+ * @see setErrorTemplate()
+ */
+ var $label = '';
+
+ /**
+ * Class of the element objects, so you can add your own
+ * element methods
+ * @var string $_elementType
+ */
+ var $_elementType = 'QuickformFlexyElement';
+ /**#@-*/
+
+ /**
+ * Constructor
+ *
+ * @param HTML_Template_Flexy template object to use
+ * @public
+ */
+ function HTML_QuickForm_Renderer_ObjectFlexy(&$flexy)
+ {
+ $this->HTML_QuickForm_Renderer_Object(true);
+ $this->_obj = new QuickformFlexyForm();
+ $this->_flexy =& $flexy;
+ } // end constructor
+
+ function renderHeader(&$header)
+ {
+ if($name = $header->getName()) {
+ $this->_obj->header->$name = $header->toHtml();
+ } else {
+ $this->_obj->header[$this->_sectionCount] = $header->toHtml();
+ }
+ $this->_currentSection = $this->_sectionCount++;
+ } // end func renderHeader
+
+ function startGroup(&$group, $required, $error)
+ {
+ parent::startGroup($group, $required, $error);
+ $this->_groupElementIdx = 1;
+ } //end func startGroup
+
+ /**
+ * Creates an object representing an element containing
+ * the key for storing this
+ *
+ * @access private
+ * @param HTML_QuickForm_element form element being rendered
+ * @param bool Whether an element is required
+ * @param string Error associated with the element
+ * @return object
+ */
+ function _elementToObject(&$element, $required, $error)
+ {
+ $ret = parent::_elementToObject($element, $required, $error);
+ if($ret->type == 'group') {
+ $ret->html = $element->toHtml();
+ unset($ret->elements);
+ }
+ if(!empty($this->_label)) {
+ $this->_renderLabel($ret);
+ }
+
+ if(!empty($this->_html)) {
+ $this->_renderHtml($ret);
+ $ret->error = $error;
+ }
+
+ // Create an element key from the name
+ if (false !== ($pos = strpos($ret->name, '[')) || is_object($this->_currentGroup)) {
+ if (!$pos) {
+ $keys = '->{\'' . str_replace(array('\\', '\''), array('\\\\', '\\\''), $ret->name) . '\'}';
+ } else {
+ $keys = '->{\'' . str_replace(
+ array('\\', '\'', '[', ']'), array('\\\\', '\\\'', '\'}->{\'', ''),
+ $ret->name
+ ) . '\'}';
+ }
+ // special handling for elements in native groups
+ if (is_object($this->_currentGroup)) {
+ // skip unnamed group items unless radios: no name -> no static access
+ // identification: have the same key string as the parent group
+ if ($this->_currentGroup->keys == $keys && 'radio' != $ret->type) {
+ return false;
+ }
+ // reduce string of keys by remove leading group keys
+ if (0 === strpos($keys, $this->_currentGroup->keys)) {
+ $keys = substr_replace($keys, '', 0, strlen($this->_currentGroup->keys));
+ }
+ }
+ } elseif (0 == strlen($ret->name)) {
+ $keys = '->{\'element_' . $this->_elementIdx . '\'}';
+ } else {
+ $keys = '->{\'' . str_replace(array('\\', '\''), array('\\\\', '\\\''), $ret->name) . '\'}';
+ }
+ // for radios: add extra key from value
+ if ('radio' == $ret->type && '[]' != substr($keys, -2)) {
+ $keys .= '->{\'' . str_replace(array('\\', '\''), array('\\\\', '\\\''), $ret->value) . '\'}';
+ }
+ $ret->keys = $keys;
+ $this->_elementIdx++;
+ return $ret;
+ }
+
+ /**
+ * Stores an object representation of an element in the
+ * QuickformFormObject instance
+ *
+ * @access private
+ * @param QuickformElement Object representation of an element
+ * @return void
+ */
+ function _storeObject($elObj)
+ {
+ if ($elObj) {
+ $keys = $elObj->keys;
+ unset($elObj->keys);
+ if(is_object($this->_currentGroup) && ('group' != $elObj->type)) {
+ $code = '$this->_currentGroup' . $keys . ' = $elObj;';
+ } else {
+ $code = '$this->_obj' . $keys . ' = $elObj;';
+ }
+ eval($code);
+ }
+ }
+
+ /**
+ * Set the filename of the template to render html elements.
+ * In your template, {html} is replaced by the unmodified html.
+ * If the element is required, {required} will be true.
+ * Eg.
+ * <pre>
+ * {if:error}
+ * <font color="red" size="1">{error:h}</font><br />
+ * {end:}
+ * {html:h}
+ * </pre>
+ *
+ * @access public
+ * @param string Filename of template
+ * @return void
+ */
+ function setHtmlTemplate($template)
+ {
+ $this->_html = $template;
+ }
+
+ /**
+ * Set the filename of the template to render form labels
+ * In your template, {label} is replaced by the unmodified label.
+ * {error} will be set to the error, if any. {required} will
+ * be true if this is a required field
+ * Eg.
+ * <pre>
+ * {if:required}
+ * <font color="orange" size="1">*</font>
+ * {end:}
+ * {label:h}
+ * </pre>
+ *
+ * @access public
+ * @param string Filename of template
+ * @return void
+ */
+ function setLabelTemplate($template)
+ {
+ $this->_label = $template;
+ }
+
+ function _renderLabel(&$ret)
+ {
+ $this->_flexy->compile($this->_label);
+ $ret->label = $this->_flexy->bufferedOutputObject($ret);
+ }
+
+ function _renderHtml(&$ret)
+ {
+ $this->_flexy->compile($this->_html);
+ $ret->html = $this->_flexy->bufferedOutputObject($ret);
+ }
+} // end class HTML_QuickForm_Renderer_ObjectFlexy
+
+/**
+ * Adds nothing to QuickformForm, left for backwards compatibility
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @ignore
+ */
+class QuickformFlexyForm extends QuickformForm
+{
+}
+
+/**
+ * Adds nothing to QuickformElement, left for backwards compatibility
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @ignore
+ */
+class QuickformFlexyElement extends QuickformElement
+{
+}
+?>
diff --git a/libs/HTML/QuickForm/Renderer/QuickHtml.php b/libs/HTML/QuickForm/Renderer/QuickHtml.php
new file mode 100755
index 0000000000..71472e23b3
--- /dev/null
+++ b/libs/HTML/QuickForm/Renderer/QuickHtml.php
@@ -0,0 +1,213 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * A renderer that makes it quick and easy to create customized forms.
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Jason Rust <jrust@rustyparts.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: QuickHtml.php,v 1.2 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * A concrete renderer for HTML_QuickForm, based on QuickForm 2.x built-in one
+ */
+require_once 'HTML/QuickForm/Renderer/Default.php';
+
+/**
+ * A renderer that makes it quick and easy to create customized forms.
+ *
+ * This renderer has three main distinctives: an easy way to create
+ * custom-looking forms, the ability to separate the creation of form
+ * elements from their display, and being able to use QuickForm in
+ * widget-based template systems. See the online docs for more info.
+ * For a usage example see: docs/renderers/QuickHtml_example.php
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Jason Rust <jrust@rustyparts.com>
+ * @version Release: 3.2.9
+ * @since 3.1.1
+ */
+class HTML_QuickForm_Renderer_QuickHtml extends HTML_QuickForm_Renderer_Default {
+ // {{{ properties
+
+ /**
+ * The array of rendered elements
+ * @var array
+ */
+ var $renderedElements = array();
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Constructor
+ *
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_Renderer_QuickHtml()
+ {
+ $this->HTML_QuickForm_Renderer_Default();
+ // The default templates aren't used for this renderer
+ $this->clearAllTemplates();
+ } // end constructor
+
+ // }}}
+ // {{{ toHtml()
+
+ /**
+ * returns the HTML generated for the form
+ *
+ * @param string $data (optional) Any extra data to put before the end of the form
+ *
+ * @access public
+ * @return string
+ */
+ function toHtml($data = '')
+ {
+ // Render any elements that haven't been rendered explicitly by elementToHtml()
+ foreach (array_keys($this->renderedElements) as $key) {
+ if (!$this->renderedElements[$key]['rendered']) {
+ $this->renderedElements[$key]['rendered'] = true;
+ $data .= $this->renderedElements[$key]['html'] . "\n";
+ }
+ }
+
+ // Insert the extra data and form elements at the end of the form
+ $this->_html = str_replace('</form>', $data . "\n</form>", $this->_html);
+ return $this->_html;
+ } // end func toHtml
+
+ // }}}
+ // {{{ elementToHtml()
+
+ /**
+ * Gets the html for an element and marks it as rendered.
+ *
+ * @param string $elementName The element name
+ * @param string $elementValue (optional) The value of the element. This is only useful
+ * for elements that have the same name (i.e. radio and checkbox), but
+ * different values
+ *
+ * @access public
+ * @return string The html for the QuickForm element
+ * @throws HTML_QuickForm_Error
+ */
+ function elementToHtml($elementName, $elementValue = null)
+ {
+ $elementKey = null;
+ // Find the key for the element
+ foreach ($this->renderedElements as $key => $data) {
+ if ($data['name'] == $elementName &&
+ // See if the value must match as well
+ (is_null($elementValue) ||
+ $data['value'] == $elementValue)) {
+ $elementKey = $key;
+ break;
+ }
+ }
+
+ if (is_null($elementKey)) {
+ $msg = is_null($elementValue) ? "Element $elementName does not exist." :
+ "Element $elementName with value of $elementValue does not exist.";
+ return PEAR::raiseError(null, QUICKFORM_UNREGISTERED_ELEMENT, null, E_USER_WARNING, $msg, 'HTML_QuickForm_Error', true);
+ } else {
+ if ($this->renderedElements[$elementKey]['rendered']) {
+ $msg = is_null($elementValue) ? "Element $elementName has already been rendered." :
+ "Element $elementName with value of $elementValue has already been rendered.";
+ return PEAR::raiseError(null, QUICKFORM_ERROR, null, E_USER_WARNING, $msg, 'HTML_QuickForm_Error', true);
+ } else {
+ $this->renderedElements[$elementKey]['rendered'] = true;
+ return $this->renderedElements[$elementKey]['html'];
+ }
+ }
+ } // end func elementToHtml
+
+ // }}}
+ // {{{ renderElement()
+
+ /**
+ * Gets the html for an element and adds it to the array by calling
+ * parent::renderElement()
+ *
+ * @param HTML_QuickForm_element form element being visited
+ * @param bool Whether an element is required
+ * @param string An error message associated with an element
+ *
+ * @access public
+ * @return mixed HTML string of element if $immediateRender is set, else we just add the
+ * html to the global _html string
+ */
+ function renderElement(&$element, $required, $error)
+ {
+ $this->_html = '';
+ parent::renderElement($element, $required, $error);
+ if (!$this->_inGroup) {
+ $this->renderedElements[] = array(
+ 'name' => $element->getName(),
+ 'value' => $element->getValue(),
+ 'html' => $this->_html,
+ 'rendered' => false);
+ }
+ $this->_html = '';
+ } // end func renderElement
+
+ // }}}
+ // {{{ renderHidden()
+
+ /**
+ * Gets the html for a hidden element and adds it to the array.
+ *
+ * @param HTML_QuickForm_element hidden form element being visited
+ * @access public
+ * @return void
+ */
+ function renderHidden(&$element)
+ {
+ $this->renderedElements[] = array(
+ 'name' => $element->getName(),
+ 'value' => $element->getValue(),
+ 'html' => $element->toHtml(),
+ 'rendered' => false);
+ } // end func renderHidden
+
+ // }}}
+ // {{{ finishGroup()
+
+ /**
+ * Gets the html for the group element and adds it to the array by calling
+ * parent::finishGroup()
+ *
+ * @param HTML_QuickForm_group group being visited
+ * @access public
+ * @return void
+ */
+ function finishGroup(&$group)
+ {
+ $this->_html = '';
+ parent::finishGroup($group);
+ $this->renderedElements[] = array(
+ 'name' => $group->getName(),
+ 'value' => $group->getValue(),
+ 'html' => $this->_html,
+ 'rendered' => false);
+ $this->_html = '';
+ } // end func finishGroup
+
+ // }}}
+} // end class HTML_QuickForm_Renderer_QuickHtml
+?>
diff --git a/libs/HTML/QuickForm/Rule.php b/libs/HTML/QuickForm/Rule.php
new file mode 100755
index 0000000000..8f66a847a0
--- /dev/null
+++ b/libs/HTML/QuickForm/Rule.php
@@ -0,0 +1,82 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Abstract base class for QuickForm validation rules
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: Rule.php,v 1.3 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Abstract base class for QuickForm validation rules
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 3.2
+ * @abstract
+ */
+class HTML_QuickForm_Rule
+{
+ /**
+ * Name of the rule to use in validate method
+ *
+ * This property is used in more global rules like Callback and Regex
+ * to determine which callback and which regex is to be used for validation
+ *
+ * @var string
+ * @access public
+ */
+ var $name;
+
+ /**
+ * Validates a value
+ *
+ * @access public
+ * @abstract
+ */
+ function validate($value)
+ {
+ return true;
+ }
+
+ /**
+ * Sets the rule name
+ *
+ * @param string rule name
+ * @access public
+ */
+ function setName($ruleName)
+ {
+ $this->name = $ruleName;
+ }
+
+ /**
+ * Returns the javascript test (the test should return true if the value is INVALID)
+ *
+ * @param mixed Options for the rule
+ * @access public
+ * @return array first element is code to setup validation, second is the check itself
+ * @abstract
+ */
+ function getValidationScript($options = null)
+ {
+ return array('', '');
+ }
+}
+?> \ No newline at end of file
diff --git a/libs/HTML/QuickForm/Rule/Callback.php b/libs/HTML/QuickForm/Rule/Callback.php
new file mode 100755
index 0000000000..6c1e9b22b8
--- /dev/null
+++ b/libs/HTML/QuickForm/Rule/Callback.php
@@ -0,0 +1,124 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Validates values using callback functions or methods
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: Callback.php,v 1.8 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Abstract base class for QuickForm validation rules
+ */
+require_once 'HTML/QuickForm/Rule.php';
+
+/**
+ * Validates values using callback functions or methods
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 3.2
+ */
+class HTML_QuickForm_Rule_Callback extends HTML_QuickForm_Rule
+{
+ /**
+ * Array of callbacks
+ *
+ * Array is in the format:
+ * $_data['rulename'] = array('functionname', 'classname');
+ * If the callback is not a method, then the class name is not set.
+ *
+ * @var array
+ * @access private
+ */
+ var $_data = array();
+
+ /**
+ * Whether to use BC mode for specific rules
+ *
+ * Previous versions of QF passed element's name as a first parameter
+ * to validation functions, but not to validation methods. This behaviour
+ * is emulated if you are using 'function' as rule type when registering.
+ *
+ * @var array
+ * @access private
+ */
+ var $_BCMode = array();
+
+ /**
+ * Validates a value using a callback
+ *
+ * @param string $value Value to be checked
+ * @param mixed $options Options for callback
+ * @access public
+ * @return boolean true if value is valid
+ */
+ function validate($value, $options = null)
+ {
+ if (isset($this->_data[$this->name])) {
+ $callback = $this->_data[$this->name];
+ if (isset($callback[1])) {
+ return call_user_func(array($callback[1], $callback[0]), $value, $options);
+ } elseif ($this->_BCMode[$this->name]) {
+ return $callback[0]('', $value, $options);
+ } else {
+ return $callback[0]($value, $options);
+ }
+ } elseif (is_callable($options)) {
+ return call_user_func($options, $value);
+ } else {
+ return true;
+ }
+ } // end func validate
+
+ /**
+ * Adds new callbacks to the callbacks list
+ *
+ * @param string $name Name of rule
+ * @param string $callback Name of function or method
+ * @param string $class Name of class containing the method
+ * @param bool $BCMode Backwards compatibility mode
+ * @access public
+ */
+ function addData($name, $callback, $class = null, $BCMode = false)
+ {
+ if (!empty($class)) {
+ $this->_data[$name] = array($callback, $class);
+ } else {
+ $this->_data[$name] = array($callback);
+ }
+ $this->_BCMode[$name] = $BCMode;
+ } // end func addData
+
+
+ function getValidationScript($options = null)
+ {
+ if (isset($this->_data[$this->name])) {
+ $callback = $this->_data[$this->name][0];
+ $params = ($this->_BCMode[$this->name]? "'', {jsVar}": '{jsVar}') .
+ (isset($options)? ", '{$options}'": '');
+ } else {
+ $callback = is_array($options)? $options[1]: $options;
+ $params = '{jsVar}';
+ }
+ return array('', "{jsVar} != '' && !{$callback}({$params})");
+ } // end func getValidationScript
+
+} // end class HTML_QuickForm_Rule_Callback
+?> \ No newline at end of file
diff --git a/libs/HTML/QuickForm/Rule/Compare.php b/libs/HTML/QuickForm/Rule/Compare.php
new file mode 100755
index 0000000000..fd51708f8a
--- /dev/null
+++ b/libs/HTML/QuickForm/Rule/Compare.php
@@ -0,0 +1,105 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Rule to compare two form fields
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: Compare.php,v 1.6 2007/06/05 18:35:49 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Abstract base class for QuickForm validation rules
+ */
+require_once 'HTML/QuickForm/Rule.php';
+
+/**
+ * Rule to compare two form fields
+ *
+ * The most common usage for this is to ensure that the password
+ * confirmation field matches the password field
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ * @since 3.2
+ */
+class HTML_QuickForm_Rule_Compare extends HTML_QuickForm_Rule
+{
+ /**
+ * Possible operators to use
+ * @var array
+ * @access private
+ */
+ var $_operators = array(
+ 'eq' => '===',
+ 'neq' => '!==',
+ 'gt' => '>',
+ 'gte' => '>=',
+ 'lt' => '<',
+ 'lte' => '<=',
+ '==' => '===',
+ '!=' => '!=='
+ );
+
+
+ /**
+ * Returns the operator to use for comparing the values
+ *
+ * @access private
+ * @param string operator name
+ * @return string operator to use for validation
+ */
+ function _findOperator($name)
+ {
+ if (empty($name)) {
+ return '===';
+ } elseif (isset($this->_operators[$name])) {
+ return $this->_operators[$name];
+ } elseif (in_array($name, $this->_operators)) {
+ return $name;
+ } else {
+ return '===';
+ }
+ }
+
+
+ function validate($values, $operator = null)
+ {
+ $operator = $this->_findOperator($operator);
+ if ('===' != $operator && '!==' != $operator) {
+ $compareFn = create_function('$a, $b', 'return floatval($a) ' . $operator . ' floatval($b);');
+ } else {
+ $compareFn = create_function('$a, $b', 'return strval($a) ' . $operator . ' strval($b);');
+ }
+
+ return $compareFn($values[0], $values[1]);
+ }
+
+
+ function getValidationScript($operator = null)
+ {
+ $operator = $this->_findOperator($operator);
+ if ('===' != $operator && '!==' != $operator) {
+ $check = "!(Number({jsVar}[0]) {$operator} Number({jsVar}[1]))";
+ } else {
+ $check = "!(String({jsVar}[0]) {$operator} String({jsVar}[1]))";
+ }
+ return array('', "'' != {jsVar}[0] && {$check}");
+ }
+}
+?>
diff --git a/libs/HTML/QuickForm/Rule/Email.php b/libs/HTML/QuickForm/Rule/Email.php
new file mode 100755
index 0000000000..1c39823f14
--- /dev/null
+++ b/libs/HTML/QuickForm/Rule/Email.php
@@ -0,0 +1,73 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Email validation rule
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: Email.php,v 1.6 2007/06/03 13:47:06 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Abstract base class for QuickForm validation rules
+ */
+require_once 'HTML/QuickForm/Rule.php';
+
+/**
+ * Email validation rule
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 3.2
+ */
+class HTML_QuickForm_Rule_Email extends HTML_QuickForm_Rule
+{
+ var $regex = '/^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/';
+
+ /**
+ * Validates an email address
+ *
+ * @param string $email Email address
+ * @param boolean $checkDomain True if dns check should be performed
+ * @access public
+ * @return boolean true if email is valid
+ */
+ function validate($email, $checkDomain = false)
+ {
+ // Fix for bug #10799: add 'D' modifier to regex
+ if (preg_match($this->regex . 'D', $email)) {
+ if ($checkDomain && function_exists('checkdnsrr')) {
+ $tokens = explode('@', $email);
+ if (checkdnsrr($tokens[1], 'MX') || checkdnsrr($tokens[1], 'A')) {
+ return true;
+ }
+ return false;
+ }
+ return true;
+ }
+ return false;
+ } // end func validate
+
+
+ function getValidationScript($options = null)
+ {
+ return array(" var regex = " . $this->regex . ";\n", "{jsVar} != '' && !regex.test({jsVar})");
+ } // end func getValidationScript
+
+} // end class HTML_QuickForm_Rule_Email
+?> \ No newline at end of file
diff --git a/libs/HTML/QuickForm/Rule/Range.php b/libs/HTML/QuickForm/Rule/Range.php
new file mode 100755
index 0000000000..5acba2c97f
--- /dev/null
+++ b/libs/HTML/QuickForm/Rule/Range.php
@@ -0,0 +1,75 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Checks that the length of value is within range
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: Range.php,v 1.7 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Abstract base class for QuickForm validation rules
+ */
+require_once 'HTML/QuickForm/Rule.php';
+
+/**
+ * Checks that the length of value is within range
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 3.2
+ */
+class HTML_QuickForm_Rule_Range extends HTML_QuickForm_Rule
+{
+ /**
+ * Validates a value using a range comparison
+ *
+ * @param string $value Value to be checked
+ * @param mixed $options Int for length, array for range
+ * @access public
+ * @return boolean true if value is valid
+ */
+ function validate($value, $options)
+ {
+ $length = strlen($value);
+ switch ($this->name) {
+ case 'minlength': return ($length >= $options);
+ case 'maxlength': return ($length <= $options);
+ default: return ($length >= $options[0] && $length <= $options[1]);
+ }
+ } // end func validate
+
+
+ function getValidationScript($options = null)
+ {
+ switch ($this->name) {
+ case 'minlength':
+ $test = '{jsVar}.length < '.$options;
+ break;
+ case 'maxlength':
+ $test = '{jsVar}.length > '.$options;
+ break;
+ default:
+ $test = '({jsVar}.length < '.$options[0].' || {jsVar}.length > '.$options[1].')';
+ }
+ return array('', "{jsVar} != '' && {$test}");
+ } // end func getValidationScript
+
+} // end class HTML_QuickForm_Rule_Range
+?> \ No newline at end of file
diff --git a/libs/HTML/QuickForm/Rule/Regex.php b/libs/HTML/QuickForm/Rule/Regex.php
new file mode 100755
index 0000000000..666581ac00
--- /dev/null
+++ b/libs/HTML/QuickForm/Rule/Regex.php
@@ -0,0 +1,101 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Validates values using regular expressions
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: Regex.php,v 1.5 2007/06/03 13:47:06 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Abstract base class for QuickForm validation rules
+ */
+require_once 'HTML/QuickForm/Rule.php';
+
+/**
+ * Validates values using regular expressions
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 3.2
+ */
+class HTML_QuickForm_Rule_Regex extends HTML_QuickForm_Rule
+{
+ /**
+ * Array of regular expressions
+ *
+ * Array is in the format:
+ * $_data['rulename'] = 'pattern';
+ *
+ * @var array
+ * @access private
+ */
+ var $_data = array(
+ 'lettersonly' => '/^[a-zA-Z]+$/',
+ 'alphanumeric' => '/^[a-zA-Z0-9]+$/',
+ 'numeric' => '/(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/',
+ 'nopunctuation' => '/^[^().\/\*\^\?#!@$%+=,\"\'><~\[\]{}]+$/',
+ 'nonzero' => '/^-?[1-9][0-9]*/'
+ );
+
+ /**
+ * Validates a value using a regular expression
+ *
+ * @param string $value Value to be checked
+ * @param string $regex Regular expression
+ * @access public
+ * @return boolean true if value is valid
+ */
+ function validate($value, $regex = null)
+ {
+ // Fix for bug #10799: add 'D' modifier to regex
+ if (isset($this->_data[$this->name])) {
+ if (!preg_match($this->_data[$this->name] . 'D', $value)) {
+ return false;
+ }
+ } else {
+ if (!preg_match($regex . 'D', $value)) {
+ return false;
+ }
+ }
+ return true;
+ } // end func validate
+
+ /**
+ * Adds new regular expressions to the list
+ *
+ * @param string $name Name of rule
+ * @param string $pattern Regular expression pattern
+ * @access public
+ */
+ function addData($name, $pattern)
+ {
+ $this->_data[$name] = $pattern;
+ } // end func addData
+
+
+ function getValidationScript($options = null)
+ {
+ $regex = isset($this->_data[$this->name]) ? $this->_data[$this->name] : $options;
+
+ return array(" var regex = " . $regex . ";\n", "{jsVar} != '' && !regex.test({jsVar})");
+ } // end func getValidationScript
+
+} // end class HTML_QuickForm_Rule_Regex
+?> \ No newline at end of file
diff --git a/libs/HTML/QuickForm/Rule/Required.php b/libs/HTML/QuickForm/Rule/Required.php
new file mode 100755
index 0000000000..9612d3e3ca
--- /dev/null
+++ b/libs/HTML/QuickForm/Rule/Required.php
@@ -0,0 +1,63 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Required elements validation
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: Required.php,v 1.5 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Abstract base class for QuickForm validation rules
+ */
+require_once 'HTML/QuickForm/Rule.php';
+
+/**
+ * Required elements validation
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 3.2
+ */
+class HTML_QuickForm_Rule_Required extends HTML_QuickForm_Rule
+{
+ /**
+ * Checks if an element is empty
+ *
+ * @param string $value Value to check
+ * @param mixed $options Not used yet
+ * @access public
+ * @return boolean true if value is not empty
+ */
+ function validate($value, $options = null)
+ {
+ if ((string)$value == '') {
+ return false;
+ }
+ return true;
+ } // end func validate
+
+
+ function getValidationScript($options = null)
+ {
+ return array('', "{jsVar} == ''");
+ } // end func getValidationScript
+
+} // end class HTML_QuickForm_Rule_Required
+?>
diff --git a/libs/HTML/QuickForm/RuleRegistry.php b/libs/HTML/QuickForm/RuleRegistry.php
new file mode 100755
index 0000000000..4fdba99c30
--- /dev/null
+++ b/libs/HTML/QuickForm/RuleRegistry.php
@@ -0,0 +1,349 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Registers rule objects and uses them for validation
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: RuleRegistry.php,v 1.18 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Registers rule objects and uses them for validation
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ * @since 3.2
+ */
+class HTML_QuickForm_RuleRegistry
+{
+ /**
+ * Array containing references to used rules
+ * @var array
+ * @access private
+ */
+ var $_rules = array();
+
+
+ /**
+ * Returns a singleton of HTML_QuickForm_RuleRegistry
+ *
+ * Usually, only one RuleRegistry object is needed, this is the reason
+ * why it is recommended to use this method to get the validation object.
+ *
+ * @access public
+ * @static
+ * @return HTML_QuickForm_RuleRegistry
+ */
+ function &singleton()
+ {
+ static $obj;
+ if (!isset($obj)) {
+ $obj = new HTML_QuickForm_RuleRegistry();
+ }
+ return $obj;
+ } // end func singleton
+
+ /**
+ * Registers a new validation rule
+ *
+ * In order to use a custom rule in your form, you need to register it
+ * first. For regular expressions, one can directly use the 'regex' type
+ * rule in addRule(), this is faster than registering the rule.
+ *
+ * Functions and methods can be registered. Use the 'function' type.
+ * When registering a method, specify the class name as second parameter.
+ *
+ * You can also register an HTML_QuickForm_Rule subclass with its own
+ * validate() method.
+ *
+ * @param string $ruleName Name of validation rule
+ * @param string $type Either: 'regex', 'function' or null
+ * @param string $data1 Name of function, regular expression or
+ * HTML_QuickForm_Rule object class name
+ * @param string $data2 Object parent of above function or HTML_QuickForm_Rule file path
+ * @access public
+ * @return void
+ */
+ function registerRule($ruleName, $type, $data1, $data2 = null)
+ {
+ $type = strtolower($type);
+ if ($type == 'regex') {
+ // Regular expression
+ $rule =& $this->getRule('regex');
+ $rule->addData($ruleName, $data1);
+ $GLOBALS['_HTML_QuickForm_registered_rules'][$ruleName] = $GLOBALS['_HTML_QuickForm_registered_rules']['regex'];
+
+ } elseif ($type == 'function' || $type == 'callback') {
+ // Callback function
+ $rule =& $this->getRule('callback');
+ $rule->addData($ruleName, $data1, $data2, 'function' == $type);
+ $GLOBALS['_HTML_QuickForm_registered_rules'][$ruleName] = $GLOBALS['_HTML_QuickForm_registered_rules']['callback'];
+
+ } elseif (is_object($data1)) {
+ // An instance of HTML_QuickForm_Rule
+ $this->_rules[strtolower(get_class($data1))] = $data1;
+ $GLOBALS['_HTML_QuickForm_registered_rules'][$ruleName] = array(strtolower(get_class($data1)), null);
+
+ } else {
+ // Rule class name
+ $GLOBALS['_HTML_QuickForm_registered_rules'][$ruleName] = array(strtolower($data1), $data2);
+ }
+ } // end func registerRule
+
+ /**
+ * Returns a reference to the requested rule object
+ *
+ * @param string $ruleName Name of the requested rule
+ * @access public
+ * @return HTML_QuickForm_Rule
+ */
+ function &getRule($ruleName)
+ {
+ list($class, $path) = $GLOBALS['_HTML_QuickForm_registered_rules'][$ruleName];
+
+ if (!isset($this->_rules[$class])) {
+ if (!empty($path)) {
+ include_once($path);
+ }
+ $this->_rules[$class] =& new $class();
+ }
+ $this->_rules[$class]->setName($ruleName);
+ return $this->_rules[$class];
+ } // end func getRule
+
+ /**
+ * Performs validation on the given values
+ *
+ * @param string $ruleName Name of the rule to be used
+ * @param mixed $values Can be a scalar or an array of values
+ * to be validated
+ * @param mixed $options Options used by the rule
+ * @param mixed $multiple Whether to validate an array of values altogether
+ * @access public
+ * @return mixed true if no error found, int of valid values (when an array of values is given) or false if error
+ */
+ function validate($ruleName, $values, $options = null, $multiple = false)
+ {
+ $rule =& $this->getRule($ruleName);
+
+ if (is_array($values) && !$multiple) {
+ $result = 0;
+ foreach ($values as $value) {
+ if ($rule->validate($value, $options) === true) {
+ $result++;
+ }
+ }
+ return ($result == 0) ? false : $result;
+ } else {
+ return $rule->validate($values, $options);
+ }
+ } // end func validate
+
+ /**
+ * Returns the validation test in javascript code
+ *
+ * @param array|HTML_QuickForm_element Element(s) the rule applies to
+ * @param string Element name, in case $element is
+ * not an array
+ * @param array Rule data
+ * @access public
+ * @return string JavaScript for the rule
+ */
+ function getValidationScript(&$element, $elementName, $ruleData)
+ {
+ $reset = (isset($ruleData['reset'])) ? $ruleData['reset'] : false;
+ $rule =& $this->getRule($ruleData['type']);
+ if (!is_array($element)) {
+ list($jsValue, $jsReset) = $this->_getJsValue($element, $elementName, $reset, null);
+ } else {
+ $jsValue = " value = new Array();\n";
+ $jsReset = '';
+ for ($i = 0; $i < count($element); $i++) {
+ list($tmp_value, $tmp_reset) = $this->_getJsValue($element[$i], $element[$i]->getName(), $reset, $i);
+ $jsValue .= "\n" . $tmp_value;
+ $jsReset .= $tmp_reset;
+ }
+ }
+ $jsField = isset($ruleData['group'])? $ruleData['group']: $elementName;
+ list ($jsPrefix, $jsCheck) = $rule->getValidationScript($ruleData['format']);
+ if (!isset($ruleData['howmany'])) {
+ $js = $jsValue . "\n" . $jsPrefix .
+ " if (" . str_replace('{jsVar}', 'value', $jsCheck) . " && !errFlag['{$jsField}']) {\n" .
+ " errFlag['{$jsField}'] = true;\n" .
+ " _qfMsg = _qfMsg + '\\n - {$ruleData['message']}';\n" .
+ $jsReset .
+ " }\n";
+ } else {
+ $js = $jsValue . "\n" . $jsPrefix .
+ " var res = 0;\n" .
+ " for (var i = 0; i < value.length; i++) {\n" .
+ " if (!(" . str_replace('{jsVar}', 'value[i]', $jsCheck) . ")) {\n" .
+ " res++;\n" .
+ " }\n" .
+ " }\n" .
+ " if (res < {$ruleData['howmany']} && !errFlag['{$jsField}']) {\n" .
+ " errFlag['{$jsField}'] = true;\n" .
+ " _qfMsg = _qfMsg + '\\n - {$ruleData['message']}';\n" .
+ $jsReset .
+ " }\n";
+ }
+ return $js;
+ } // end func getValidationScript
+
+
+ /**
+ * Returns JavaScript to get and to reset the element's value
+ *
+ * @access private
+ * @param HTML_QuickForm_element element being processed
+ * @param string element's name
+ * @param bool whether to generate JavaScript to reset
+ * the value
+ * @param integer value's index in the array (only used for
+ * multielement rules)
+ * @return array first item is value javascript, second is reset
+ */
+ function _getJsValue(&$element, $elementName, $reset = false, $index = null)
+ {
+ $jsIndex = isset($index)? '[' . $index . ']': '';
+ $tmp_reset = $reset? " var field = frm.elements['$elementName'];\n": '';
+ if (is_a($element, 'html_quickform_group')) {
+ $value = " _qfGroups['{$elementName}'] = {";
+ $elements =& $element->getElements();
+ for ($i = 0, $count = count($elements); $i < $count; $i++) {
+ $append = ($elements[$i]->getType() == 'select' && $elements[$i]->getMultiple())? '[]': '';
+ $value .= "'" . $element->getElementName($i) . $append . "': true" .
+ ($i < $count - 1? ', ': '');
+ }
+ $value .=
+ "};\n" .
+ " value{$jsIndex} = new Array();\n" .
+ " var valueIdx = 0;\n" .
+ " for (var i = 0; i < frm.elements.length; i++) {\n" .
+ " var _element = frm.elements[i];\n" .
+ " if (_element.name in _qfGroups['{$elementName}']) {\n" .
+ " switch (_element.type) {\n" .
+ " case 'checkbox':\n" .
+ " case 'radio':\n" .
+ " if (_element.checked) {\n" .
+ " value{$jsIndex}[valueIdx++] = _element.value;\n" .
+ " }\n" .
+ " break;\n" .
+ " case 'select-one':\n" .
+ " if (-1 != _element.selectedIndex) {\n" .
+ " value{$jsIndex}[valueIdx++] = _element.options[_element.selectedIndex].value;\n" .
+ " }\n" .
+ " break;\n" .
+ " case 'select-multiple':\n" .
+ " var tmpVal = new Array();\n" .
+ " var tmpIdx = 0;\n" .
+ " for (var j = 0; j < _element.options.length; j++) {\n" .
+ " if (_element.options[j].selected) {\n" .
+ " tmpVal[tmpIdx++] = _element.options[j].value;\n" .
+ " }\n" .
+ " }\n" .
+ " if (tmpIdx > 0) {\n" .
+ " value{$jsIndex}[valueIdx++] = tmpVal;\n" .
+ " }\n" .
+ " break;\n" .
+ " default:\n" .
+ " value{$jsIndex}[valueIdx++] = _element.value;\n" .
+ " }\n" .
+ " }\n" .
+ " }\n";
+ if ($reset) {
+ $tmp_reset =
+ " for (var i = 0; i < frm.elements.length; i++) {\n" .
+ " var _element = frm.elements[i];\n" .
+ " if (_element.name in _qfGroups['{$elementName}']) {\n" .
+ " switch (_element.type) {\n" .
+ " case 'checkbox':\n" .
+ " case 'radio':\n" .
+ " _element.checked = _element.defaultChecked;\n" .
+ " break;\n" .
+ " case 'select-one':\n" .
+ " case 'select-multiple':\n" .
+ " for (var j = 0; j < _element.options.length; j++) {\n" .
+ " _element.options[j].selected = _element.options[j].defaultSelected;\n" .
+ " }\n" .
+ " break;\n" .
+ " default:\n" .
+ " _element.value = _element.defaultValue;\n" .
+ " }\n" .
+ " }\n" .
+ " }\n";
+ }
+
+ } elseif ($element->getType() == 'select') {
+ if ($element->getMultiple()) {
+ $elementName .= '[]';
+ $value =
+ " value{$jsIndex} = new Array();\n" .
+ " var valueIdx = 0;\n" .
+ " for (var i = 0; i < frm.elements['{$elementName}'].options.length; i++) {\n" .
+ " if (frm.elements['{$elementName}'].options[i].selected) {\n" .
+ " value{$jsIndex}[valueIdx++] = frm.elements['{$elementName}'].options[i].value;\n" .
+ " }\n" .
+ " }\n";
+ } else {
+ $value = " value{$jsIndex} = frm.elements['{$elementName}'].selectedIndex == -1? '': frm.elements['{$elementName}'].options[frm.elements['{$elementName}'].selectedIndex].value;\n";
+ }
+ if ($reset) {
+ $tmp_reset .=
+ " for (var i = 0; i < field.options.length; i++) {\n" .
+ " field.options[i].selected = field.options[i].defaultSelected;\n" .
+ " }\n";
+ }
+
+ } elseif ($element->getType() == 'checkbox') {
+ if (is_a($element, 'html_quickform_advcheckbox')) {
+ $value = " value{$jsIndex} = frm.elements['$elementName'][1].checked? frm.elements['$elementName'][1].value: frm.elements['$elementName'][0].value;\n";
+ $tmp_reset .= $reset ? " field[1].checked = field[1].defaultChecked;\n" : '';
+ } else {
+ $value = " value{$jsIndex} = frm.elements['$elementName'].checked? '1': '';\n";
+ $tmp_reset .= $reset ? " field.checked = field.defaultChecked;\n" : '';
+ }
+
+ } elseif ($element->getType() == 'radio') {
+ $value = " value{$jsIndex} = '';\n" .
+ // Fix for bug #5644
+ " var els = 'length' in frm.elements['$elementName']? frm.elements['$elementName']: [ frm.elements['$elementName'] ];\n" .
+ " for (var i = 0; i < els.length; i++) {\n" .
+ " if (els[i].checked) {\n" .
+ " value{$jsIndex} = els[i].value;\n" .
+ " }\n" .
+ " }";
+ if ($reset) {
+ $tmp_reset .= " for (var i = 0; i < field.length; i++) {\n" .
+ " field[i].checked = field[i].defaultChecked;\n" .
+ " }";
+ }
+
+ } else {
+ $value = " value{$jsIndex} = frm.elements['$elementName'].value;";
+ $tmp_reset .= ($reset) ? " field.value = field.defaultValue;\n" : '';
+ }
+ return array($value, $tmp_reset);
+ }
+} // end class HTML_QuickForm_RuleRegistry
+?>
diff --git a/libs/HTML/QuickForm/advcheckbox.php b/libs/HTML/QuickForm/advcheckbox.php
new file mode 100755
index 0000000000..54f2c49bcc
--- /dev/null
+++ b/libs/HTML/QuickForm/advcheckbox.php
@@ -0,0 +1,286 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for an advanced checkbox type field
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Jason Rust <jrust@php.net>
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: advcheckbox.php,v 1.17 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * HTML class for a checkbox type field
+ */
+require_once 'HTML/QuickForm/checkbox.php';
+
+/**
+ * HTML class for an advanced checkbox type field
+ *
+ * Basically this fixes a problem that HTML has had
+ * where checkboxes can only pass a single value (the
+ * value of the checkbox when checked). A value for when
+ * the checkbox is not checked cannot be passed, and
+ * furthermore the checkbox variable doesn't even exist if
+ * the checkbox was submitted unchecked.
+ *
+ * It works by prepending a hidden field with the same name and
+ * another "unchecked" value to the checbox. If the checkbox is
+ * checked, PHP overwrites the value of the hidden field with
+ * its value.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Jason Rust <jrust@php.net>
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ * @since 2.0
+ */
+class HTML_QuickForm_advcheckbox extends HTML_QuickForm_checkbox
+{
+ // {{{ properties
+
+ /**
+ * The values passed by the hidden elment
+ *
+ * @var array
+ * @access private
+ */
+ var $_values = null;
+
+ /**
+ * The default value
+ *
+ * @var boolean
+ * @access private
+ */
+ var $_currentValue = null;
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string $elementName (optional)Input field name attribute
+ * @param string $elementLabel (optional)Input field label
+ * @param string $text (optional)Text to put after the checkbox
+ * @param mixed $attributes (optional)Either a typical HTML attribute string
+ * or an associative array
+ * @param mixed $values (optional)Values to pass if checked or not checked
+ *
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_advcheckbox($elementName=null, $elementLabel=null, $text=null, $attributes=null, $values=null)
+ {
+ $this->HTML_QuickForm_checkbox($elementName, $elementLabel, $text, $attributes);
+ $this->setValues($values);
+ } //end constructor
+
+ // }}}
+ // {{{ getPrivateName()
+
+ /**
+ * Gets the private name for the element
+ *
+ * @param string $elementName The element name to make private
+ *
+ * @access public
+ * @return string
+ *
+ * @deprecated Deprecated since 3.2.6, both generated elements have the same name
+ */
+ function getPrivateName($elementName)
+ {
+ return '__'.$elementName;
+ }
+
+ // }}}
+ // {{{ getOnclickJs()
+
+ /**
+ * Create the javascript for the onclick event which will
+ * set the value of the hidden field
+ *
+ * @param string $elementName The element name
+ *
+ * @access public
+ * @return string
+ *
+ * @deprecated Deprecated since 3.2.6, this element no longer uses any javascript
+ */
+ function getOnclickJs($elementName)
+ {
+ $onclickJs = 'if (this.checked) { this.form[\''.$elementName.'\'].value=\''.addcslashes($this->_values[1], '\'').'\'; }';
+ $onclickJs .= 'else { this.form[\''.$elementName.'\'].value=\''.addcslashes($this->_values[0], '\'').'\'; }';
+ return $onclickJs;
+ }
+
+ // }}}
+ // {{{ setValues()
+
+ /**
+ * Sets the values used by the hidden element
+ *
+ * @param mixed $values The values, either a string or an array
+ *
+ * @access public
+ * @return void
+ */
+ function setValues($values)
+ {
+ if (empty($values)) {
+ // give it default checkbox behavior
+ $this->_values = array('', 1);
+ } elseif (is_scalar($values)) {
+ // if it's string, then assume the value to
+ // be passed is for when the element is checked
+ $this->_values = array('', $values);
+ } else {
+ $this->_values = $values;
+ }
+ $this->updateAttributes(array('value' => $this->_values[1]));
+ $this->setChecked($this->_currentValue == $this->_values[1]);
+ }
+
+ // }}}
+ // {{{ setValue()
+
+ /**
+ * Sets the element's value
+ *
+ * @param mixed Element's value
+ * @access public
+ */
+ function setValue($value)
+ {
+ $this->setChecked(isset($this->_values[1]) && $value == $this->_values[1]);
+ $this->_currentValue = $value;
+ }
+
+ // }}}
+ // {{{ getValue()
+
+ /**
+ * Returns the element's value
+ *
+ * @access public
+ * @return mixed
+ */
+ function getValue()
+ {
+ if (is_array($this->_values)) {
+ return $this->_values[$this->getChecked()? 1: 0];
+ } else {
+ return null;
+ }
+ }
+
+ // }}}
+ // {{{ toHtml()
+
+ /**
+ * Returns the checkbox element in HTML
+ * and the additional hidden element in HTML
+ *
+ * @access public
+ * @return string
+ */
+ function toHtml()
+ {
+ if ($this->_flagFrozen) {
+ return parent::toHtml();
+ } else {
+ return '<input' . $this->_getAttrString(array(
+ 'type' => 'hidden',
+ 'name' => $this->getName(),
+ 'value' => $this->_values[0]
+ )) . ' />' . parent::toHtml();
+
+ }
+ } //end func toHtml
+
+ // }}}
+ // {{{ getFrozenHtml()
+
+ /**
+ * Unlike checkbox, this has to append a hidden input in both
+ * checked and non-checked states
+ */
+ function getFrozenHtml()
+ {
+ return ($this->getChecked()? '<tt>[x]</tt>': '<tt>[ ]</tt>') .
+ $this->_getPersistantData();
+ }
+
+ // }}}
+ // {{{ onQuickFormEvent()
+
+ /**
+ * Called by HTML_QuickForm whenever form event is made on this element
+ *
+ * @param string $event Name of event
+ * @param mixed $arg event arguments
+ * @param object &$caller calling object
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function onQuickFormEvent($event, $arg, &$caller)
+ {
+ switch ($event) {
+ case 'updateValue':
+ // constant values override both default and submitted ones
+ // default values are overriden by submitted
+ $value = $this->_findValue($caller->_constantValues);
+ if (null === $value) {
+ $value = $this->_findValue($caller->_submitValues);
+ if (null === $value) {
+ $value = $this->_findValue($caller->_defaultValues);
+ }
+ }
+ if (null !== $value) {
+ $this->setValue($value);
+ }
+ break;
+ default:
+ parent::onQuickFormEvent($event, $arg, $caller);
+ }
+ return true;
+ } // end func onQuickFormLoad
+
+ // }}}
+ // {{{ exportValue()
+
+ /**
+ * This element has a value even if it is not checked, thus we override
+ * checkbox's behaviour here
+ */
+ function exportValue(&$submitValues, $assoc)
+ {
+ $value = $this->_findValue($submitValues);
+ if (null === $value) {
+ $value = $this->getValue();
+ } elseif (is_array($this->_values) && ($value != $this->_values[0]) && ($value != $this->_values[1])) {
+ $value = null;
+ }
+ return $this->_prepareValue($value, $assoc);
+ }
+ // }}}
+} //end class HTML_QuickForm_advcheckbox
+?>
diff --git a/libs/HTML/QuickForm/autocomplete.php b/libs/HTML/QuickForm/autocomplete.php
new file mode 100755
index 0000000000..fdb7b3549d
--- /dev/null
+++ b/libs/HTML/QuickForm/autocomplete.php
@@ -0,0 +1,258 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for an autocomplete element
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Matteo Di Giovinazzo <matteodg@infinito.it>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: autocomplete.php,v 1.7 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * HTML class for a text field
+ */
+require_once 'HTML/QuickForm/text.php';
+
+/**
+ * HTML class for an autocomplete element
+ *
+ * Creates an HTML input text element that
+ * at every keypressed javascript event checks in an array of options
+ * if there's a match and autocompletes the text in case of match.
+ *
+ * For the JavaScript code thanks to Martin Honnen and Nicholas C. Zakas
+ * See {@link http://www.faqts.com/knowledge_base/view.phtml/aid/13562} and
+ * {@link http://www.sitepoint.com/article/1220}
+ *
+ * Example:
+ * <code>
+ * $autocomplete =& $form->addElement('autocomplete', 'fruit', 'Favourite fruit:');
+ * $options = array("Apple", "Orange", "Pear", "Strawberry");
+ * $autocomplete->setOptions($options);
+ * </code>
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Matteo Di Giovinazzo <matteodg@infinito.it>
+ * @version Release: 3.2.9
+ * @since 3.2
+ */
+class HTML_QuickForm_autocomplete extends HTML_QuickForm_text
+{
+ // {{{ properties
+
+ /**
+ * Options for the autocomplete input text element
+ *
+ * @var array
+ * @access private
+ */
+ var $_options = array();
+
+ /**
+ * "One-time" javascript (containing functions), see bug #4611
+ *
+ * @var string
+ * @access private
+ */
+ var $_js = '';
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string $elementName (optional)Input field name attribute
+ * @param string $elementLabel (optional)Input field label in form
+ * @param array $options (optional)Autocomplete options
+ * @param mixed $attributes (optional)Either a typical HTML attribute string
+ * or an associative array. Date format is passed along the attributes.
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_autocomplete($elementName = null, $elementLabel = null, $options = null, $attributes = null)
+ {
+ $this->HTML_QuickForm_text($elementName, $elementLabel, $attributes);
+ $this->_persistantFreeze = true;
+ $this->_type = 'autocomplete';
+ if (isset($options)) {
+ $this->setOptions($options);
+ }
+ } //end constructor
+
+ // }}}
+ // {{{ setOptions()
+
+ /**
+ * Sets the options for the autocomplete input text element
+ *
+ * @param array $options Array of options for the autocomplete input text element
+ * @access public
+ * @return void
+ */
+ function setOptions($options)
+ {
+ $this->_options = array_values($options);
+ } // end func setOptions
+
+ // }}}
+ // {{{ toHtml()
+
+ /**
+ * Returns Html for the autocomplete input text element
+ *
+ * @access public
+ * @return string
+ */
+ function toHtml()
+ {
+ // prevent problems with grouped elements
+ $arrayName = str_replace(array('[', ']'), array('__', ''), $this->getName()) . '_values';
+
+ $this->updateAttributes(array(
+ 'onkeypress' => 'return autocomplete(this, event, ' . $arrayName . ');'
+ ));
+ if ($this->_flagFrozen) {
+ $js = '';
+ } else {
+ $js = "<script type=\"text/javascript\">\n//<![CDATA[\n";
+ if (!defined('HTML_QUICKFORM_AUTOCOMPLETE_EXISTS')) {
+ $this->_js .= <<<EOS
+
+/* begin javascript for autocomplete */
+function setSelectionRange(input, selectionStart, selectionEnd) {
+ if (input.setSelectionRange) {
+ input.setSelectionRange(selectionStart, selectionEnd);
+ }
+ else if (input.createTextRange) {
+ var range = input.createTextRange();
+ range.collapse(true);
+ range.moveEnd("character", selectionEnd);
+ range.moveStart("character", selectionStart);
+ range.select();
+ }
+ input.focus();
+}
+
+function setCaretToPosition(input, position) {
+ setSelectionRange(input, position, position);
+}
+
+function replaceSelection (input, replaceString) {
+ var len = replaceString.length;
+ if (input.setSelectionRange) {
+ var selectionStart = input.selectionStart;
+ var selectionEnd = input.selectionEnd;
+
+ input.value = input.value.substring(0, selectionStart) + replaceString + input.value.substring(selectionEnd);
+ input.selectionStart = selectionStart + len;
+ input.selectionEnd = selectionStart + len;
+ }
+ else if (document.selection) {
+ var range = document.selection.createRange();
+ var saved_range = range.duplicate();
+
+ if (range.parentElement() == input) {
+ range.text = replaceString;
+ range.moveEnd("character", saved_range.selectionStart + len);
+ range.moveStart("character", saved_range.selectionStart + len);
+ range.select();
+ }
+ }
+ input.focus();
+}
+
+
+function autocompleteMatch (text, values) {
+ for (var i = 0; i < values.length; i++) {
+ if (values[i].toUpperCase().indexOf(text.toUpperCase()) == 0) {
+ return values[i];
+ }
+ }
+
+ return null;
+}
+
+function autocomplete(textbox, event, values) {
+ if (textbox.setSelectionRange || textbox.createTextRange) {
+ switch (event.keyCode) {
+ case 38: // up arrow
+ case 40: // down arrow
+ case 37: // left arrow
+ case 39: // right arrow
+ case 33: // page up
+ case 34: // page down
+ case 36: // home
+ case 35: // end
+ case 13: // enter
+ case 9: // tab
+ case 27: // esc
+ case 16: // shift
+ case 17: // ctrl
+ case 18: // alt
+ case 20: // caps lock
+ case 8: // backspace
+ case 46: // delete
+ return true;
+ break;
+
+ default:
+ var c = String.fromCharCode(
+ (event.charCode == undefined) ? event.keyCode : event.charCode
+ );
+ replaceSelection(textbox, c);
+ sMatch = autocompleteMatch(textbox.value, values);
+ var len = textbox.value.length;
+
+ if (sMatch != null) {
+ textbox.value = sMatch;
+ setSelectionRange(textbox, len, textbox.value.length);
+ }
+ return false;
+ }
+ }
+ else {
+ return true;
+ }
+}
+/* end javascript for autocomplete */
+
+EOS;
+ define('HTML_QUICKFORM_AUTOCOMPLETE_EXISTS', true);
+ }
+ $jsEscape = array(
+ "\r" => '\r',
+ "\n" => '\n',
+ "\t" => '\t',
+ "'" => "\\'",
+ '"' => '\"',
+ '\\' => '\\\\'
+ );
+
+ $js .= $this->_js;
+ $js .= 'var ' . $arrayName . " = new Array();\n";
+ for ($i = 0; $i < count($this->_options); $i++) {
+ $js .= $arrayName . '[' . $i . "] = '" . strtr($this->_options[$i], $jsEscape) . "';\n";
+ }
+ $js .= "//]]>\n</script>";
+ }
+ return $js . parent::toHtml();
+ }// end func toHtml
+
+ // }}}
+} // end class HTML_QuickForm_autocomplete
+?>
diff --git a/libs/HTML/QuickForm/button.php b/libs/HTML/QuickForm/button.php
new file mode 100755
index 0000000000..ed54612469
--- /dev/null
+++ b/libs/HTML/QuickForm/button.php
@@ -0,0 +1,80 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for an <input type="button" /> elements
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: button.php,v 1.5 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for <input /> form elements
+ */
+require_once 'HTML/QuickForm/input.php';
+
+/**
+ * HTML class for an <input type="button" /> elements
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 1.0
+ */
+class HTML_QuickForm_button extends HTML_QuickForm_input
+{
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string $elementName (optional)Input field name attribute
+ * @param string $value (optional)Input field value
+ * @param mixed $attributes (optional)Either a typical HTML attribute string
+ * or an associative array
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_button($elementName=null, $value=null, $attributes=null)
+ {
+ HTML_QuickForm_input::HTML_QuickForm_input($elementName, null, $attributes);
+ $this->_persistantFreeze = false;
+ $this->setValue($value);
+ $this->setType('button');
+ } //end constructor
+
+ // }}}
+ // {{{ freeze()
+
+ /**
+ * Freeze the element so that only its value is returned
+ *
+ * @access public
+ * @return void
+ */
+ function freeze()
+ {
+ return false;
+ } //end func freeze
+
+ // }}}
+
+} //end class HTML_QuickForm_button
+?>
diff --git a/libs/HTML/QuickForm/checkbox.php b/libs/HTML/QuickForm/checkbox.php
new file mode 100755
index 0000000000..9ded15cfbe
--- /dev/null
+++ b/libs/HTML/QuickForm/checkbox.php
@@ -0,0 +1,277 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for a checkbox type field
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: checkbox.php,v 1.22 2007/06/03 15:25:28 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for <input /> form elements
+ */
+require_once 'HTML/QuickForm/input.php';
+
+/**
+ * HTML class for a checkbox type field
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ * @since 1.0
+ */
+class HTML_QuickForm_checkbox extends HTML_QuickForm_input
+{
+ // {{{ properties
+
+ /**
+ * Checkbox display text
+ * @var string
+ * @since 1.1
+ * @access private
+ */
+ var $_text = '';
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string $elementName (optional)Input field name attribute
+ * @param string $elementLabel (optional)Input field value
+ * @param string $text (optional)Checkbox display text
+ * @param mixed $attributes (optional)Either a typical HTML attribute string
+ * or an associative array
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_checkbox($elementName=null, $elementLabel=null, $text='', $attributes=null)
+ {
+ HTML_QuickForm_input::HTML_QuickForm_input($elementName, $elementLabel, $attributes);
+ $this->_persistantFreeze = true;
+ $this->_text = $text;
+ $this->setType('checkbox');
+ $this->updateAttributes(array('value'=>1));
+ $this->_generateId();
+ } //end constructor
+
+ // }}}
+ // {{{ setChecked()
+
+ /**
+ * Sets whether a checkbox is checked
+ *
+ * @param bool $checked Whether the field is checked or not
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setChecked($checked)
+ {
+ if (!$checked) {
+ $this->removeAttribute('checked');
+ } else {
+ $this->updateAttributes(array('checked'=>'checked'));
+ }
+ } //end func setChecked
+
+ // }}}
+ // {{{ getChecked()
+
+ /**
+ * Returns whether a checkbox is checked
+ *
+ * @since 1.0
+ * @access public
+ * @return bool
+ */
+ function getChecked()
+ {
+ return (bool)$this->getAttribute('checked');
+ } //end func getChecked
+
+ // }}}
+ // {{{ toHtml()
+
+ /**
+ * Returns the checkbox element in HTML
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function toHtml()
+ {
+ if (0 == strlen($this->_text)) {
+ $label = '';
+ } elseif ($this->_flagFrozen) {
+ $label = $this->_text;
+ } else {
+ $label = '<label for="' . $this->getAttribute('id') . '">' . $this->_text . '</label>';
+ }
+ return HTML_QuickForm_input::toHtml() . $label;
+ } //end func toHtml
+
+ // }}}
+ // {{{ getFrozenHtml()
+
+ /**
+ * Returns the value of field without HTML tags
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function getFrozenHtml()
+ {
+ if ($this->getChecked()) {
+ return '<tt>[x]</tt>' .
+ $this->_getPersistantData();
+ } else {
+ return '<tt>[ ]</tt>';
+ }
+ } //end func getFrozenHtml
+
+ // }}}
+ // {{{ setText()
+
+ /**
+ * Sets the checkbox text
+ *
+ * @param string $text
+ * @since 1.1
+ * @access public
+ * @return void
+ */
+ function setText($text)
+ {
+ $this->_text = $text;
+ } //end func setText
+
+ // }}}
+ // {{{ getText()
+
+ /**
+ * Returns the checkbox text
+ *
+ * @since 1.1
+ * @access public
+ * @return string
+ */
+ function getText()
+ {
+ return $this->_text;
+ } //end func getText
+
+ // }}}
+ // {{{ setValue()
+
+ /**
+ * Sets the value of the form element
+ *
+ * @param string $value Default value of the form element
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setValue($value)
+ {
+ return $this->setChecked($value);
+ } // end func setValue
+
+ // }}}
+ // {{{ getValue()
+
+ /**
+ * Returns the value of the form element
+ *
+ * @since 1.0
+ * @access public
+ * @return bool
+ */
+ function getValue()
+ {
+ return $this->getChecked();
+ } // end func getValue
+
+ // }}}
+ // {{{ onQuickFormEvent()
+
+ /**
+ * Called by HTML_QuickForm whenever form event is made on this element
+ *
+ * @param string $event Name of event
+ * @param mixed $arg event arguments
+ * @param object &$caller calling object
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function onQuickFormEvent($event, $arg, &$caller)
+ {
+ switch ($event) {
+ case 'updateValue':
+ // constant values override both default and submitted ones
+ // default values are overriden by submitted
+ $value = $this->_findValue($caller->_constantValues);
+ if (null === $value) {
+ // if no boxes were checked, then there is no value in the array
+ // yet we don't want to display default value in this case
+ if ($caller->isSubmitted()) {
+ $value = $this->_findValue($caller->_submitValues);
+ } else {
+ $value = $this->_findValue($caller->_defaultValues);
+ }
+ }
+ if (null !== $value || $caller->isSubmitted()) {
+ $this->setChecked($value);
+ }
+ break;
+ case 'setGroupValue':
+ $this->setChecked($arg);
+ break;
+ default:
+ parent::onQuickFormEvent($event, $arg, $caller);
+ }
+ return true;
+ } // end func onQuickFormEvent
+
+ // }}}
+ // {{{ exportValue()
+
+ /**
+ * Return true if the checkbox is checked, null if it is not checked (getValue() returns false)
+ */
+ function exportValue(&$submitValues, $assoc = false)
+ {
+ $value = $this->_findValue($submitValues);
+ if (null === $value) {
+ $value = $this->getChecked()? true: null;
+ }
+ return $this->_prepareValue($value, $assoc);
+ }
+
+ // }}}
+} //end class HTML_QuickForm_checkbox
+?>
diff --git a/libs/HTML/QuickForm/date.php b/libs/HTML/QuickForm/date.php
new file mode 100755
index 0000000000..bf3858ae00
--- /dev/null
+++ b/libs/HTML/QuickForm/date.php
@@ -0,0 +1,511 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Class for a group of elements used to input dates (and times).
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: date.php,v 1.60 2007/06/04 19:22:23 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Class for a group of form elements
+ */
+require_once 'HTML/QuickForm/group.php';
+/**
+ * Class for <select></select> elements
+ */
+require_once 'HTML/QuickForm/select.php';
+
+/**
+ * Class for a group of elements used to input dates (and times).
+ *
+ * Inspired by original 'date' element but reimplemented as a subclass
+ * of HTML_QuickForm_group
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ * @since 3.1
+ */
+class HTML_QuickForm_date extends HTML_QuickForm_group
+{
+ // {{{ properties
+
+ /**
+ * Various options to control the element's display.
+ *
+ * @access private
+ * @var array
+ */
+ var $_options = array(
+ 'language' => 'en',
+ 'format' => 'dMY',
+ 'minYear' => 2001,
+ 'maxYear' => 2010,
+ 'addEmptyOption' => false,
+ 'emptyOptionValue' => '',
+ 'emptyOptionText' => '&nbsp;',
+ 'optionIncrement' => array('i' => 1, 's' => 1)
+ );
+
+ /**
+ * These complement separators, they are appended to the resultant HTML
+ * @access private
+ * @var array
+ */
+ var $_wrap = array('', '');
+
+ /**
+ * Options in different languages
+ *
+ * Note to potential translators: to avoid encoding problems please send
+ * your translations with "weird" letters encoded as HTML Unicode entities
+ *
+ * @access private
+ * @var array
+ */
+ var $_locale = array(
+ 'en' => array (
+ 'weekdays_short'=> array ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'),
+ 'weekdays_long' => array ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'),
+ 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'),
+ 'months_long' => array ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December')
+ ),
+ 'de' => array (
+ 'weekdays_short'=> array ('So', 'Mon', 'Di', 'Mi', 'Do', 'Fr', 'Sa'),
+ 'weekdays_long' => array ('Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'),
+ 'months_short' => array ('Jan', 'Feb', 'M&#xe4;rz', 'April', 'Mai', 'Juni', 'Juli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dez'),
+ 'months_long' => array ('Januar', 'Februar', 'M&#xe4;rz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember')
+ ),
+ 'fr' => array (
+ 'weekdays_short'=> array ('Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'),
+ 'weekdays_long' => array ('Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'),
+ 'months_short' => array ('Jan', 'F&#xe9;v', 'Mar', 'Avr', 'Mai', 'Juin', 'Juil', 'Ao&#xfb;t', 'Sep', 'Oct', 'Nov', 'D&#xe9;c'),
+ 'months_long' => array ('Janvier', 'F&#xe9;vrier', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Ao&#xfb;t', 'Septembre', 'Octobre', 'Novembre', 'D&#xe9;cembre')
+ ),
+ 'hu' => array (
+ 'weekdays_short'=> array ('V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'),
+ 'weekdays_long' => array ('vas&#xe1;rnap', 'h&#xe9;tf&#x151;', 'kedd', 'szerda', 'cs&#xfc;t&#xf6;rt&#xf6;k', 'p&#xe9;ntek', 'szombat'),
+ 'months_short' => array ('jan', 'feb', 'm&#xe1;rc', '&#xe1;pr', 'm&#xe1;j', 'j&#xfa;n', 'j&#xfa;l', 'aug', 'szept', 'okt', 'nov', 'dec'),
+ 'months_long' => array ('janu&#xe1;r', 'febru&#xe1;r', 'm&#xe1;rcius', '&#xe1;prilis', 'm&#xe1;jus', 'j&#xfa;nius', 'j&#xfa;lius', 'augusztus', 'szeptember', 'okt&#xf3;ber', 'november', 'december')
+ ),
+ 'pl' => array (
+ 'weekdays_short'=> array ('Nie', 'Pn', 'Wt', '&#x15a;r', 'Czw', 'Pt', 'Sob'),
+ 'weekdays_long' => array ('Niedziela', 'Poniedzia&#x142;ek', 'Wtorek', '&#x15a;roda', 'Czwartek', 'Pi&#x105;tek', 'Sobota'),
+ 'months_short' => array ('Sty', 'Lut', 'Mar', 'Kwi', 'Maj', 'Cze', 'Lip', 'Sie', 'Wrz', 'Pa&#x17a;', 'Lis', 'Gru'),
+ 'months_long' => array ('Stycze&#x144;', 'Luty', 'Marzec', 'Kwiecie&#x144;', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpie&#x144;', 'Wrzesie&#x144;', 'Pa&#x17a;dziernik', 'Listopad', 'Grudzie&#x144;')
+ ),
+ 'sl' => array (
+ 'weekdays_short'=> array ('Ned', 'Pon', 'Tor', 'Sre', 'Cet', 'Pet', 'Sob'),
+ 'weekdays_long' => array ('Nedelja', 'Ponedeljek', 'Torek', 'Sreda', 'Cetrtek', 'Petek', 'Sobota'),
+ 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Avg', 'Sep', 'Okt', 'Nov', 'Dec'),
+ 'months_long' => array ('Januar', 'Februar', 'Marec', 'April', 'Maj', 'Junij', 'Julij', 'Avgust', 'September', 'Oktober', 'November', 'December')
+ ),
+ 'ru' => array (
+ 'weekdays_short'=> array ('&#x412;&#x441;', '&#x41f;&#x43d;', '&#x412;&#x442;', '&#x421;&#x440;', '&#x427;&#x442;', '&#x41f;&#x442;', '&#x421;&#x431;'),
+ 'weekdays_long' => array ('&#x412;&#x43e;&#x441;&#x43a;&#x440;&#x435;&#x441;&#x435;&#x43d;&#x44c;&#x435;', '&#x41f;&#x43e;&#x43d;&#x435;&#x434;&#x435;&#x43b;&#x44c;&#x43d;&#x438;&#x43a;', '&#x412;&#x442;&#x43e;&#x440;&#x43d;&#x438;&#x43a;', '&#x421;&#x440;&#x435;&#x434;&#x430;', '&#x427;&#x435;&#x442;&#x432;&#x435;&#x440;&#x433;', '&#x41f;&#x44f;&#x442;&#x43d;&#x438;&#x446;&#x430;', '&#x421;&#x443;&#x431;&#x431;&#x43e;&#x442;&#x430;'),
+ 'months_short' => array ('&#x42f;&#x43d;&#x432;', '&#x424;&#x435;&#x432;', '&#x41c;&#x430;&#x440;', '&#x410;&#x43f;&#x440;', '&#x41c;&#x430;&#x439;', '&#x418;&#x44e;&#x43d;', '&#x418;&#x44e;&#x43b;', '&#x410;&#x432;&#x433;', '&#x421;&#x435;&#x43d;', '&#x41e;&#x43a;&#x442;', '&#x41d;&#x43e;&#x44f;', '&#x414;&#x435;&#x43a;'),
+ 'months_long' => array ('&#x42f;&#x43d;&#x432;&#x430;&#x440;&#x44c;', '&#x424;&#x435;&#x432;&#x440;&#x430;&#x43b;&#x44c;', '&#x41c;&#x430;&#x440;&#x442;', '&#x410;&#x43f;&#x440;&#x435;&#x43b;&#x44c;', '&#x41c;&#x430;&#x439;', '&#x418;&#x44e;&#x43d;&#x44c;', '&#x418;&#x44e;&#x43b;&#x44c;', '&#x410;&#x432;&#x433;&#x443;&#x441;&#x442;', '&#x421;&#x435;&#x43d;&#x442;&#x44f;&#x431;&#x440;&#x44c;', '&#x41e;&#x43a;&#x442;&#x44f;&#x431;&#x440;&#x44c;', '&#x41d;&#x43e;&#x44f;&#x431;&#x440;&#x44c;', '&#x414;&#x435;&#x43a;&#x430;&#x431;&#x440;&#x44c;')
+ ),
+ 'es' => array (
+ 'weekdays_short'=> array ('Dom', 'Lun', 'Mar', 'Mi&#xe9;', 'Jue', 'Vie', 'S&#xe1;b'),
+ 'weekdays_long' => array ('Domingo', 'Lunes', 'Martes', 'Mi&#xe9;rcoles', 'Jueves', 'Viernes', 'S&#xe1;bado'),
+ 'months_short' => array ('Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'),
+ 'months_long' => array ('Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre')
+ ),
+ 'da' => array (
+ 'weekdays_short'=> array ('S&#xf8;n', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'L&#xf8;r'),
+ 'weekdays_long' => array ('S&#xf8;ndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'L&#xf8;rdag'),
+ 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'),
+ 'months_long' => array ('Januar', 'Februar', 'Marts', 'April', 'Maj', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'December')
+ ),
+ 'is' => array (
+ 'weekdays_short'=> array ('Sun', 'M&#xe1;n', '&#xde;ri', 'Mi&#xf0;', 'Fim', 'F&#xf6;s', 'Lau'),
+ 'weekdays_long' => array ('Sunnudagur', 'M&#xe1;nudagur', '&#xde;ri&#xf0;judagur', 'Mi&#xf0;vikudagur', 'Fimmtudagur', 'F&#xf6;studagur', 'Laugardagur'),
+ 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'Ma&#xed;', 'J&#xfa;n', 'J&#xfa;l', '&#xc1;g&#xfa;', 'Sep', 'Okt', 'N&#xf3;v', 'Des'),
+ 'months_long' => array ('Jan&#xfa;ar', 'Febr&#xfa;ar', 'Mars', 'Apr&#xed;l', 'Ma&#xed;', 'J&#xfa;n&#xed;', 'J&#xfa;l&#xed;', '&#xc1;g&#xfa;st', 'September', 'Okt&#xf3;ber', 'N&#xf3;vember', 'Desember')
+ ),
+ 'it' => array (
+ 'weekdays_short'=> array ('Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab'),
+ 'weekdays_long' => array ('Domenica', 'Luned&#xec;', 'Marted&#xec;', 'Mercoled&#xec;', 'Gioved&#xec;', 'Venerd&#xec;', 'Sabato'),
+ 'months_short' => array ('Gen', 'Feb', 'Mar', 'Apr', 'Mag', 'Giu', 'Lug', 'Ago', 'Set', 'Ott', 'Nov', 'Dic'),
+ 'months_long' => array ('Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre')
+ ),
+ 'sk' => array (
+ 'weekdays_short'=> array ('Ned', 'Pon', 'Uto', 'Str', '&#x8a;tv', 'Pia', 'Sob'),
+ 'weekdays_long' => array ('Nede&#x17e;a', 'Pondelok', 'Utorok', 'Streda', '&#x8a;tvrtok', 'Piatok', 'Sobota'),
+ 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'M&#xe1;j', 'J&#xfa;n', 'J&#xfa;l', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'),
+ 'months_long' => array ('Janu&#xe1;r', 'Febru&#xe1;r', 'Marec', 'Apr&#xed;l', 'M&#xe1;j', 'J&#xfa;n', 'J&#xfa;l', 'August', 'September', 'Okt&#xf3;ber', 'November', 'December')
+ ),
+ 'cs' => array (
+ 'weekdays_short'=> array ('Ne', 'Po', '&#xda;t', 'St', '&#x10c;t', 'P&#xe1;', 'So'),
+ 'weekdays_long' => array ('Ned&#x11b;le', 'Pond&#x11b;l&#xed;', '&#xda;ter&#xfd;', 'St&#x159;eda', '&#x10c;tvrtek', 'P&#xe1;tek', 'Sobota'),
+ 'months_short' => array ('Led', '&#xda;no', 'B&#x159;e', 'Dub', 'Kv&#x11b;', '&#x10c;en', '&#x10c;ec', 'Srp', 'Z&#xe1;&#x159;', '&#x158;&#xed;j', 'Lis', 'Pro'),
+ 'months_long' => array ('Leden', '&#xda;nor', 'B&#x159;ezen', 'Duben', 'Kv&#x11b;ten', '&#x10c;erven', '&#x10c;ervenec', 'Srpen', 'Z&#xe1;&#x159;&#xed;', '&#x158;&#xed;jen', 'Listopad', 'Prosinec')
+ ),
+ 'hy' => array (
+ 'weekdays_short'=> array ('&#x53f;&#x580;&#x56f;', '&#x535;&#x580;&#x56f;', '&#x535;&#x580;&#x584;', '&#x549;&#x580;&#x584;', '&#x540;&#x576;&#x563;', '&#x548;&#x582;&#x580;', '&#x547;&#x562;&#x569;'),
+ 'weekdays_long' => array ('&#x53f;&#x56b;&#x580;&#x561;&#x56f;&#x56b;', '&#x535;&#x580;&#x56f;&#x578;&#x582;&#x577;&#x561;&#x562;&#x569;&#x56b;', '&#x535;&#x580;&#x565;&#x584;&#x577;&#x561;&#x562;&#x569;&#x56b;', '&#x549;&#x578;&#x580;&#x565;&#x584;&#x577;&#x561;&#x562;&#x569;&#x56b;', '&#x540;&#x56b;&#x576;&#x563;&#x577;&#x561;&#x562;&#x569;&#x56b;', '&#x548;&#x582;&#x580;&#x562;&#x561;&#x569;', '&#x547;&#x561;&#x562;&#x561;&#x569;'),
+ 'months_short' => array ('&#x540;&#x576;&#x57e;', '&#x553;&#x57f;&#x580;', '&#x544;&#x580;&#x57f;', '&#x531;&#x57a;&#x580;', '&#x544;&#x575;&#x57d;', '&#x540;&#x576;&#x57d;', '&#x540;&#x56c;&#x57d;', '&#x555;&#x563;&#x57d;', '&#x54d;&#x57a;&#x57f;', '&#x540;&#x56f;&#x57f;', '&#x546;&#x575;&#x574;', '&#x534;&#x56f;&#x57f;'),
+ 'months_long' => array ('&#x540;&#x578;&#x582;&#x576;&#x57e;&#x561;&#x580;', '&#x553;&#x565;&#x57f;&#x580;&#x57e;&#x561;&#x580;', '&#x544;&#x561;&#x580;&#x57f;', '&#x531;&#x57a;&#x580;&#x56b;&#x56c;', '&#x544;&#x561;&#x575;&#x56b;&#x57d;', '&#x540;&#x578;&#x582;&#x576;&#x56b;&#x57d;', '&#x540;&#x578;&#x582;&#x56c;&#x56b;&#x57d;', '&#x555;&#x563;&#x578;&#x57d;&#x57f;&#x578;&#x57d;', '&#x54d;&#x565;&#x57a;&#x57f;&#x565;&#x574;&#x562;&#x565;&#x580;', '&#x540;&#x578;&#x56f;&#x57f;&#x565;&#x574;&#x562;&#x565;&#x580;', '&#x546;&#x578;&#x575;&#x565;&#x574;&#x562;&#x565;&#x580;', '&#x534;&#x565;&#x56f;&#x57f;&#x565;&#x574;&#x562;&#x565;&#x580;')
+ ),
+ 'nl' => array (
+ 'weekdays_short'=> array ('Zo', 'Ma', 'Di', 'Wo', 'Do', 'Vr', 'Za'),
+ 'weekdays_long' => array ('Zondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag'),
+ 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'),
+ 'months_long' => array ('Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December')
+ ),
+ 'et' => array (
+ 'weekdays_short'=> array ('P', 'E', 'T', 'K', 'N', 'R', 'L'),
+ 'weekdays_long' => array ('P&#xfc;hap&#xe4;ev', 'Esmasp&#xe4;ev', 'Teisip&#xe4;ev', 'Kolmap&#xe4;ev', 'Neljap&#xe4;ev', 'Reede', 'Laup&#xe4;ev'),
+ 'months_short' => array ('Jaan', 'Veebr', 'M&#xe4;rts', 'Aprill', 'Mai', 'Juuni', 'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'),
+ 'months_long' => array ('Jaanuar', 'Veebruar', 'M&#xe4;rts', 'Aprill', 'Mai', 'Juuni', 'Juuli', 'August', 'September', 'Oktoober', 'November', 'Detsember')
+ ),
+ 'tr' => array (
+ 'weekdays_short'=> array ('Paz', 'Pzt', 'Sal', '&#xc7;ar', 'Per', 'Cum', 'Cts'),
+ 'weekdays_long' => array ('Pazar', 'Pazartesi', 'Sal&#x131;', '&#xc7;ar&#x15f;amba', 'Per&#x15f;embe', 'Cuma', 'Cumartesi'),
+ 'months_short' => array ('Ock', '&#x15e;bt', 'Mrt', 'Nsn', 'Mys', 'Hzrn', 'Tmmz', 'A&#x11f;st', 'Eyl', 'Ekm', 'Ksm', 'Arlk'),
+ 'months_long' => array ('Ocak', '&#x15e;ubat', 'Mart', 'Nisan', 'May&#x131;s', 'Haziran', 'Temmuz', 'A&#x11f;ustos', 'Eyl&#xfc;l', 'Ekim', 'Kas&#x131;m', 'Aral&#x131;k')
+ ),
+ 'no' => array (
+ 'weekdays_short'=> array ('S&#xf8;n', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'L&#xf8;r'),
+ 'weekdays_long' => array ('S&#xf8;ndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'L&#xf8;rdag'),
+ 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'),
+ 'months_long' => array ('Januar', 'Februar', 'Mars', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Desember')
+ ),
+ 'eo' => array (
+ 'weekdays_short'=> array ('Dim', 'Lun', 'Mar', 'Mer', '&#x134;a&#x16D;', 'Ven', 'Sab'),
+ 'weekdays_long' => array ('Diman&#x109;o', 'Lundo', 'Mardo', 'Merkredo', '&#x134;a&#x16D;do', 'Vendredo', 'Sabato'),
+ 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'A&#x16D;g', 'Sep', 'Okt', 'Nov', 'Dec'),
+ 'months_long' => array ('Januaro', 'Februaro', 'Marto', 'Aprilo', 'Majo', 'Junio', 'Julio', 'A&#x16D;gusto', 'Septembro', 'Oktobro', 'Novembro', 'Decembro')
+ ),
+ 'ua' => array (
+ 'weekdays_short'=> array('&#x41d;&#x434;&#x43b;', '&#x41f;&#x43d;&#x434;', '&#x412;&#x442;&#x440;', '&#x421;&#x440;&#x434;', '&#x427;&#x442;&#x432;', '&#x41f;&#x442;&#x43d;', '&#x421;&#x431;&#x442;'),
+ 'weekdays_long' => array('&#x41d;&#x435;&#x434;&#x456;&#x43b;&#x44f;', '&#x41f;&#x43e;&#x43d;&#x435;&#x434;&#x456;&#x43b;&#x43e;&#x43a;', '&#x412;&#x456;&#x432;&#x442;&#x43e;&#x440;&#x43e;&#x43a;', '&#x421;&#x435;&#x440;&#x435;&#x434;&#x430;', '&#x427;&#x435;&#x442;&#x432;&#x435;&#x440;', '&#x41f;\'&#x44f;&#x442;&#x43d;&#x438;&#x446;&#x44f;', '&#x421;&#x443;&#x431;&#x43e;&#x442;&#x430;'),
+ 'months_short' => array('&#x421;&#x456;&#x447;', '&#x41b;&#x44e;&#x442;', '&#x411;&#x435;&#x440;', '&#x41a;&#x432;&#x456;', '&#x422;&#x440;&#x430;', '&#x427;&#x435;&#x440;', '&#x41b;&#x438;&#x43f;', '&#x421;&#x435;&#x440;', '&#x412;&#x435;&#x440;', '&#x416;&#x43e;&#x432;', '&#x41b;&#x438;&#x441;', '&#x413;&#x440;&#x443;'),
+ 'months_long' => array('&#x421;&#x456;&#x447;&#x435;&#x43d;&#x44c;', '&#x41b;&#x44e;&#x442;&#x438;&#x439;', '&#x411;&#x435;&#x440;&#x435;&#x437;&#x435;&#x43d;&#x44c;', '&#x41a;&#x432;&#x456;&#x442;&#x435;&#x43d;&#x44c;', '&#x422;&#x440;&#x430;&#x432;&#x435;&#x43d;&#x44c;', '&#x427;&#x435;&#x440;&#x432;&#x435;&#x43d;&#x44c;', '&#x41b;&#x438;&#x43f;&#x435;&#x43d;&#x44c;', '&#x421;&#x435;&#x440;&#x43f;&#x435;&#x43d;&#x44c;', '&#x412;&#x435;&#x440;&#x435;&#x441;&#x435;&#x43d;&#x44c;', '&#x416;&#x43e;&#x432;&#x442;&#x435;&#x43d;&#x44c;', '&#x41b;&#x438;&#x441;&#x442;&#x43e;&#x43f;&#x430;&#x434;', '&#x413;&#x440;&#x443;&#x434;&#x435;&#x43d;&#x44c;')
+ ),
+ 'ro' => array (
+ 'weekdays_short'=> array ('Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sam'),
+ 'weekdays_long' => array ('Duminica', 'Luni', 'Marti', 'Miercuri', 'Joi', 'Vineri', 'Sambata'),
+ 'months_short' => array ('Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun', 'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'),
+ 'months_long' => array ('Ianuarie', 'Februarie', 'Martie', 'Aprilie', 'Mai', 'Iunie', 'Iulie', 'August', 'Septembrie', 'Octombrie', 'Noiembrie', 'Decembrie')
+ ),
+ 'he' => array (
+ 'weekdays_short'=> array ('&#1512;&#1488;&#1513;&#1493;&#1503;', '&#1513;&#1504;&#1497;', '&#1513;&#1500;&#1497;&#1513;&#1497;', '&#1512;&#1489;&#1497;&#1506;&#1497;', '&#1495;&#1502;&#1497;&#1513;&#1497;', '&#1513;&#1497;&#1513;&#1497;', '&#1513;&#1489;&#1514;'),
+ 'weekdays_long' => array ('&#1497;&#1493;&#1501; &#1512;&#1488;&#1513;&#1493;&#1503;', '&#1497;&#1493;&#1501; &#1513;&#1504;&#1497;', '&#1497;&#1493;&#1501; &#1513;&#1500;&#1497;&#1513;&#1497;', '&#1497;&#1493;&#1501; &#1512;&#1489;&#1497;&#1506;&#1497;', '&#1497;&#1493;&#1501; &#1495;&#1502;&#1497;&#1513;&#1497;', '&#1497;&#1493;&#1501; &#1513;&#1497;&#1513;&#1497;', '&#1513;&#1489;&#1514;'),
+ 'months_short' => array ('&#1497;&#1504;&#1493;&#1488;&#1512;', '&#1508;&#1489;&#1512;&#1493;&#1488;&#1512;', '&#1502;&#1512;&#1509;', '&#1488;&#1508;&#1512;&#1497;&#1500;', '&#1502;&#1488;&#1497;', '&#1497;&#1493;&#1504;&#1497;', '&#1497;&#1493;&#1500;&#1497;', '&#1488;&#1493;&#1490;&#1493;&#1505;&#1496;', '&#1505;&#1508;&#1496;&#1502;&#1489;&#1512;', '&#1488;&#1493;&#1511;&#1496;&#1493;&#1489;&#1512;', '&#1504;&#1493;&#1489;&#1502;&#1489;&#1512;', '&#1491;&#1510;&#1502;&#1489;&#1512;'),
+ 'months_long' => array ('&#1497;&#1504;&#1493;&#1488;&#1512;', '&#1508;&#1489;&#1512;&#1493;&#1488;&#1512;', '&#1502;&#1512;&#1509;', '&#1488;&#1508;&#1512;&#1497;&#1500;', '&#1502;&#1488;&#1497;', '&#1497;&#1493;&#1504;&#1497;', '&#1497;&#1493;&#1500;&#1497;', '&#1488;&#1493;&#1490;&#1493;&#1505;&#1496;', '&#1505;&#1508;&#1496;&#1502;&#1489;&#1512;', '&#1488;&#1493;&#1511;&#1496;&#1493;&#1489;&#1512;', '&#1504;&#1493;&#1489;&#1502;&#1489;&#1512;', '&#1491;&#1510;&#1502;&#1489;&#1512;')
+ ),
+ 'sv' => array (
+ 'weekdays_short'=> array ('S&#xf6;n', 'M&#xe5;n', 'Tis', 'Ons', 'Tor', 'Fre', 'L&#xf6;r'),
+ 'weekdays_long' => array ('S&#xf6;ndag', 'M&#xe5;ndag', 'Tisdag', 'Onsdag', 'Torsdag', 'Fredag', 'L&#xf6;rdag'),
+ 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'),
+ 'months_long' => array ('Januari', 'Februari', 'Mars', 'April', 'Maj', 'Juni', 'Juli', 'Augusti', 'September', 'Oktober', 'November', 'December')
+ ),
+ 'pt' => array (
+ 'weekdays_short'=> array ('Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'S&aacute;b'),
+ 'weekdays_long' => array ('Domingo', 'Segunda-feira', 'Ter&ccedil;a-feira', 'Quarta-feira', 'Quinta-feira', 'Sexta-feira', 'S&aacute;bado'),
+ 'months_short' => array ('Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'),
+ 'months_long' => array ('Janeiro', 'Fevereiro', 'Mar&ccedil;o', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro')
+ ),
+ 'tw' => array (
+ 'weekdays_short'=> array ('&#36913;&#26085;','&#36913;&#19968;', '&#36913;&#20108;','&#36913;&#19977;', '&#36913;&#22235;','&#36913;&#20116;', '&#36913;&#20845;'),
+ 'weekdays_long' => array ('&#26143;&#26399;&#26085;', '&#26143;&#26399;&#19968;', '&#26143;&#26399;&#20108;', '&#26143;&#26399;&#19977;', '&#26143;&#26399;&#22235;', '&#26143;&#26399;&#20116;', '&#26143;&#26399;&#20845;'),
+ 'months_short' => array ('&#19968;&#26376;', '&#20108;&#26376;', '&#19977;&#26376;', '&#22235;&#26376;', '&#20116;&#26376;', '&#20845;&#26376;', '&#19971;&#26376;', '&#20843;&#26376;', '&#20061;&#26376;', '&#21313;&#26376;', '&#21313;&#19968;&#26376;', '&#21313;&#20108;&#26376;'),
+ 'months_long' => array ('&#19968;&#26376;', '&#20108;&#26376;', '&#19977;&#26376;', '&#22235;&#26376;', '&#20116;&#26376;', '&#20845;&#26376;', '&#19971;&#26376;', '&#20843;&#26376;', '&#20061;&#26376;', '&#21313;&#26376;', '&#21313;&#19968;&#26376;', '&#21313;&#20108;&#26376;')
+ ),
+ 'pt-br' => array (
+ 'weekdays_short'=> array ('Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'S&aacute;b'),
+ 'weekdays_long' => array ('Domingo', 'Segunda', 'Ter&ccedil;a', 'Quarta', 'Quinta', 'Sexta', 'S&aacute;bado'),
+ 'months_short' => array ('Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'),
+ 'months_long' => array ('Janeiro', 'Fevereiro', 'Mar&ccedil;o', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro')
+ )
+ );
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * The following keys may appear in $options array:
+ * - 'language': date language
+ * - 'format': Format of the date, based on PHP's date() function.
+ * The following characters are currently recognised in format string:
+ * <pre>
+ * D => Short names of days
+ * l => Long names of days
+ * d => Day numbers
+ * M => Short names of months
+ * F => Long names of months
+ * m => Month numbers
+ * Y => Four digit year
+ * y => Two digit year
+ * h => 12 hour format
+ * H => 23 hour format
+ * i => Minutes
+ * s => Seconds
+ * a => am/pm
+ * A => AM/PM
+ * </pre>
+ * - 'minYear': Minimum year in year select
+ * - 'maxYear': Maximum year in year select
+ * - 'addEmptyOption': Should an empty option be added to the top of
+ * each select box?
+ * - 'emptyOptionValue': The value passed by the empty option.
+ * - 'emptyOptionText': The text displayed for the empty option.
+ * - 'optionIncrement': Step to increase the option values by (works for 'i' and 's')
+ *
+ * @access public
+ * @param string Element's name
+ * @param mixed Label(s) for an element
+ * @param array Options to control the element's display
+ * @param mixed Either a typical HTML attribute string or an associative array
+ */
+ function HTML_QuickForm_date($elementName = null, $elementLabel = null, $options = array(), $attributes = null)
+ {
+ $this->HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+ $this->_persistantFreeze = true;
+ $this->_appendName = true;
+ $this->_type = 'date';
+ // set the options, do not bother setting bogus ones
+ if (is_array($options)) {
+ foreach ($options as $name => $value) {
+ if ('language' == $name) {
+ $this->_options['language'] = isset($this->_locale[$value])? $value: 'en';
+ } elseif (isset($this->_options[$name])) {
+ if (is_array($value) && is_array($this->_options[$name])) {
+ $this->_options[$name] = @array_merge($this->_options[$name], $value);
+ } else {
+ $this->_options[$name] = $value;
+ }
+ }
+ }
+ }
+ }
+
+ // }}}
+ // {{{ _createElements()
+
+ function _createElements()
+ {
+ $this->_separator = $this->_elements = array();
+ $separator = '';
+ $locale =& $this->_locale[$this->_options['language']];
+ $backslash = false;
+ for ($i = 0, $length = strlen($this->_options['format']); $i < $length; $i++) {
+ $sign = $this->_options['format']{$i};
+ if ($backslash) {
+ $backslash = false;
+ $separator .= $sign;
+ } else {
+ $loadSelect = true;
+ switch ($sign) {
+ case 'D':
+ // Sunday is 0 like with 'w' in date()
+ $options = $locale['weekdays_short'];
+ break;
+ case 'l':
+ $options = $locale['weekdays_long'];
+ break;
+ case 'd':
+ $options = $this->_createOptionList(1, 31);
+ break;
+ case 'M':
+ $options = $locale['months_short'];
+ array_unshift($options , '');
+ unset($options[0]);
+ break;
+ case 'm':
+ $options = $this->_createOptionList(1, 12);
+ break;
+ case 'F':
+ $options = $locale['months_long'];
+ array_unshift($options , '');
+ unset($options[0]);
+ break;
+ case 'Y':
+ $options = $this->_createOptionList(
+ $this->_options['minYear'],
+ $this->_options['maxYear'],
+ $this->_options['minYear'] > $this->_options['maxYear']? -1: 1
+ );
+ break;
+ case 'y':
+ $options = $this->_createOptionList(
+ $this->_options['minYear'],
+ $this->_options['maxYear'],
+ $this->_options['minYear'] > $this->_options['maxYear']? -1: 1
+ );
+ array_walk($options, create_function('&$v,$k','$v = substr($v,-2);'));
+ break;
+ case 'h':
+ $options = $this->_createOptionList(1, 12);
+ break;
+ case 'g':
+ $options = $this->_createOptionList(1, 12);
+ array_walk($options, create_function('&$v,$k', '$v = intval($v);'));
+ break;
+ case 'H':
+ $options = $this->_createOptionList(0, 23);
+ break;
+ case 'i':
+ $options = $this->_createOptionList(0, 59, $this->_options['optionIncrement']['i']);
+ break;
+ case 's':
+ $options = $this->_createOptionList(0, 59, $this->_options['optionIncrement']['s']);
+ break;
+ case 'a':
+ $options = array('am' => 'am', 'pm' => 'pm');
+ break;
+ case 'A':
+ $options = array('AM' => 'AM', 'PM' => 'PM');
+ break;
+ case 'W':
+ $options = $this->_createOptionList(1, 53);
+ break;
+ case '\\':
+ $backslash = true;
+ $loadSelect = false;
+ break;
+ default:
+ $separator .= (' ' == $sign? '&nbsp;': $sign);
+ $loadSelect = false;
+ }
+
+ if ($loadSelect) {
+ if (0 < count($this->_elements)) {
+ $this->_separator[] = $separator;
+ } else {
+ $this->_wrap[0] = $separator;
+ }
+ $separator = '';
+ // Should we add an empty option to the top of the select?
+ if (!is_array($this->_options['addEmptyOption']) && $this->_options['addEmptyOption'] ||
+ is_array($this->_options['addEmptyOption']) && !empty($this->_options['addEmptyOption'][$sign])) {
+
+ // Using '+' array operator to preserve the keys
+ if (is_array($this->_options['emptyOptionText']) && !empty($this->_options['emptyOptionText'][$sign])) {
+ $options = array($this->_options['emptyOptionValue'] => $this->_options['emptyOptionText'][$sign]) + $options;
+ } else {
+ $options = array($this->_options['emptyOptionValue'] => $this->_options['emptyOptionText']) + $options;
+ }
+ }
+ $this->_elements[] =& new HTML_QuickForm_select($sign, null, $options, $this->getAttributes());
+ }
+ }
+ }
+ $this->_wrap[1] = $separator . ($backslash? '\\': '');
+ }
+
+ // }}}
+ // {{{ _createOptionList()
+
+ /**
+ * Creates an option list containing the numbers from the start number to the end, inclusive
+ *
+ * @param int The start number
+ * @param int The end number
+ * @param int Increment by this value
+ * @access private
+ * @return array An array of numeric options.
+ */
+ function _createOptionList($start, $end, $step = 1)
+ {
+ for ($i = $start, $options = array(); $start > $end? $i >= $end: $i <= $end; $i += $step) {
+ $options[$i] = sprintf('%02d', $i);
+ }
+ return $options;
+ }
+
+ // }}}
+ // {{{ setValue()
+
+ function setValue($value)
+ {
+ $trimLeadingZeros = create_function('$a', '$b = ltrim($a, \'0\'); return strlen($b)? $b: \'0\';');
+ if (empty($value)) {
+ $value = array();
+ } elseif (is_scalar($value)) {
+ if (!is_numeric($value)) {
+ $value = strtotime($value);
+ }
+ // might be a unix epoch, then we fill all possible values
+ $arr = explode('-', date('w-j-n-Y-g-G-i-s-a-A-W', (int)$value));
+ $value = array(
+ 'D' => $arr[0],
+ 'l' => $arr[0],
+ 'd' => $arr[1],
+ 'M' => $arr[2],
+ 'm' => $arr[2],
+ 'F' => $arr[2],
+ 'Y' => $arr[3],
+ 'y' => $arr[3],
+ 'h' => $arr[4],
+ 'g' => $arr[4],
+ 'H' => $arr[5],
+ 'i' => $trimLeadingZeros($arr[6]),
+ 's' => $trimLeadingZeros($arr[7]),
+ 'a' => $arr[8],
+ 'A' => $arr[9],
+ 'W' => $trimLeadingZeros($arr[10])
+ );
+ } else {
+ $value = array_map($trimLeadingZeros, $value);
+ }
+ parent::setValue($value);
+ }
+
+ // }}}
+ // {{{ toHtml()
+
+ function toHtml()
+ {
+ include_once('HTML/QuickForm/Renderer/Default.php');
+ $renderer =& new HTML_QuickForm_Renderer_Default();
+ $renderer->setElementTemplate('{element}');
+ parent::accept($renderer);
+ return $this->_wrap[0] . $renderer->toHtml() . $this->_wrap[1];
+ }
+
+ // }}}
+ // {{{ accept()
+
+ function accept(&$renderer, $required = false, $error = null)
+ {
+ $renderer->renderElement($this, $required, $error);
+ }
+
+ // }}}
+ // {{{ onQuickFormEvent()
+
+ function onQuickFormEvent($event, $arg, &$caller)
+ {
+ if ('updateValue' == $event) {
+ // we need to call setValue(), 'cause the default/constant value
+ // may be in fact a timestamp, not an array
+ return HTML_QuickForm_element::onQuickFormEvent($event, $arg, $caller);
+ } else {
+ return parent::onQuickFormEvent($event, $arg, $caller);
+ }
+ }
+
+ // }}}
+}
+?> \ No newline at end of file
diff --git a/libs/HTML/QuickForm/element.php b/libs/HTML/QuickForm/element.php
new file mode 100755
index 0000000000..f2bb6e0c67
--- /dev/null
+++ b/libs/HTML/QuickForm/element.php
@@ -0,0 +1,494 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Base class for form elements
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: element.php,v 1.35 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for all HTML classes
+ */
+require_once 'HTML/Common.php';
+
+/**
+ * Base class for form elements
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ * @since 1.0
+ * @abstract
+ */
+class HTML_QuickForm_element extends HTML_Common
+{
+ // {{{ properties
+
+ /**
+ * Label of the field
+ * @var string
+ * @since 1.3
+ * @access private
+ */
+ var $_label = '';
+
+ /**
+ * Form element type
+ * @var string
+ * @since 1.0
+ * @access private
+ */
+ var $_type = '';
+
+ /**
+ * Flag to tell if element is frozen
+ * @var boolean
+ * @since 1.0
+ * @access private
+ */
+ var $_flagFrozen = false;
+
+ /**
+ * Does the element support persistant data when frozen
+ * @var boolean
+ * @since 1.3
+ * @access private
+ */
+ var $_persistantFreeze = false;
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string Name of the element
+ * @param mixed Label(s) for the element
+ * @param mixed Associative array of tag attributes or HTML attributes name="value" pairs
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_element($elementName=null, $elementLabel=null, $attributes=null)
+ {
+ HTML_Common::HTML_Common($attributes);
+ if (isset($elementName)) {
+ $this->setName($elementName);
+ }
+ if (isset($elementLabel)) {
+ $this->setLabel($elementLabel);
+ }
+ } //end constructor
+
+ // }}}
+ // {{{ apiVersion()
+
+ /**
+ * Returns the current API version
+ *
+ * @since 1.0
+ * @access public
+ * @return float
+ */
+ function apiVersion()
+ {
+ return 3.2;
+ } // end func apiVersion
+
+ // }}}
+ // {{{ getType()
+
+ /**
+ * Returns element type
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function getType()
+ {
+ return $this->_type;
+ } // end func getType
+
+ // }}}
+ // {{{ setName()
+
+ /**
+ * Sets the input field name
+ *
+ * @param string $name Input field name attribute
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setName($name)
+ {
+ // interface method
+ } //end func setName
+
+ // }}}
+ // {{{ getName()
+
+ /**
+ * Returns the element name
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function getName()
+ {
+ // interface method
+ } //end func getName
+
+ // }}}
+ // {{{ setValue()
+
+ /**
+ * Sets the value of the form element
+ *
+ * @param string $value Default value of the form element
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setValue($value)
+ {
+ // interface
+ } // end func setValue
+
+ // }}}
+ // {{{ getValue()
+
+ /**
+ * Returns the value of the form element
+ *
+ * @since 1.0
+ * @access public
+ * @return mixed
+ */
+ function getValue()
+ {
+ // interface
+ return null;
+ } // end func getValue
+
+ // }}}
+ // {{{ freeze()
+
+ /**
+ * Freeze the element so that only its value is returned
+ *
+ * @access public
+ * @return void
+ */
+ function freeze()
+ {
+ $this->_flagFrozen = true;
+ } //end func freeze
+
+ // }}}
+ // {{{ unfreeze()
+
+ /**
+ * Unfreezes the element so that it becomes editable
+ *
+ * @access public
+ * @return void
+ * @since 3.2.4
+ */
+ function unfreeze()
+ {
+ $this->_flagFrozen = false;
+ }
+
+ // }}}
+ // {{{ getFrozenHtml()
+
+ /**
+ * Returns the value of field without HTML tags
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function getFrozenHtml()
+ {
+ $value = $this->getValue();
+ return ('' != $value? htmlspecialchars($value): '&nbsp;') .
+ $this->_getPersistantData();
+ } //end func getFrozenHtml
+
+ // }}}
+ // {{{ _getPersistantData()
+
+ /**
+ * Used by getFrozenHtml() to pass the element's value if _persistantFreeze is on
+ *
+ * @access private
+ * @return string
+ */
+ function _getPersistantData()
+ {
+ if (!$this->_persistantFreeze) {
+ return '';
+ } else {
+ $id = $this->getAttribute('id');
+ return '<input' . $this->_getAttrString(array(
+ 'type' => 'hidden',
+ 'name' => $this->getName(),
+ 'value' => $this->getValue()
+ ) + (isset($id)? array('id' => $id): array())) . ' />';
+ }
+ }
+
+ // }}}
+ // {{{ isFrozen()
+
+ /**
+ * Returns whether or not the element is frozen
+ *
+ * @since 1.3
+ * @access public
+ * @return bool
+ */
+ function isFrozen()
+ {
+ return $this->_flagFrozen;
+ } // end func isFrozen
+
+ // }}}
+ // {{{ setPersistantFreeze()
+
+ /**
+ * Sets wether an element value should be kept in an hidden field
+ * when the element is frozen or not
+ *
+ * @param bool $persistant True if persistant value
+ * @since 2.0
+ * @access public
+ * @return void
+ */
+ function setPersistantFreeze($persistant=false)
+ {
+ $this->_persistantFreeze = $persistant;
+ } //end func setPersistantFreeze
+
+ // }}}
+ // {{{ setLabel()
+
+ /**
+ * Sets display text for the element
+ *
+ * @param string $label Display text for the element
+ * @since 1.3
+ * @access public
+ * @return void
+ */
+ function setLabel($label)
+ {
+ $this->_label = $label;
+ } //end func setLabel
+
+ // }}}
+ // {{{ getLabel()
+
+ /**
+ * Returns display text for the element
+ *
+ * @since 1.3
+ * @access public
+ * @return string
+ */
+ function getLabel()
+ {
+ return $this->_label;
+ } //end func getLabel
+
+ // }}}
+ // {{{ _findValue()
+
+ /**
+ * Tries to find the element value from the values array
+ *
+ * @since 2.7
+ * @access private
+ * @return mixed
+ */
+ function _findValue(&$values)
+ {
+ if (empty($values)) {
+ return null;
+ }
+ $elementName = $this->getName();
+ if (isset($values[$elementName])) {
+ return $values[$elementName];
+ } elseif (strpos($elementName, '[')) {
+ $myVar = "['" . str_replace(
+ array('\\', '\'', ']', '['), array('\\\\', '\\\'', '', "']['"),
+ $elementName
+ ) . "']";
+ return eval("return (isset(\$values$myVar)) ? \$values$myVar : null;");
+ } else {
+ return null;
+ }
+ } //end func _findValue
+
+ // }}}
+ // {{{ onQuickFormEvent()
+
+ /**
+ * Called by HTML_QuickForm whenever form event is made on this element
+ *
+ * @param string $event Name of event
+ * @param mixed $arg event arguments
+ * @param object &$caller calling object
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function onQuickFormEvent($event, $arg, &$caller)
+ {
+ switch ($event) {
+ case 'createElement':
+ $className = get_class($this);
+ $this->$className($arg[0], $arg[1], $arg[2], $arg[3], $arg[4]);
+ break;
+ case 'addElement':
+ $this->onQuickFormEvent('createElement', $arg, $caller);
+ $this->onQuickFormEvent('updateValue', null, $caller);
+ break;
+ case 'updateValue':
+ // constant values override both default and submitted ones
+ // default values are overriden by submitted
+ $value = $this->_findValue($caller->_constantValues);
+ if (null === $value) {
+ $value = $this->_findValue($caller->_submitValues);
+ if (null === $value) {
+ $value = $this->_findValue($caller->_defaultValues);
+ }
+ }
+ if (null !== $value) {
+ $this->setValue($value);
+ }
+ break;
+ case 'setGroupValue':
+ $this->setValue($arg);
+ }
+ return true;
+ } // end func onQuickFormEvent
+
+ // }}}
+ // {{{ accept()
+
+ /**
+ * Accepts a renderer
+ *
+ * @param HTML_QuickForm_Renderer renderer object
+ * @param bool Whether an element is required
+ * @param string An error message associated with an element
+ * @access public
+ * @return void
+ */
+ function accept(&$renderer, $required=false, $error=null)
+ {
+ $renderer->renderElement($this, $required, $error);
+ } // end func accept
+
+ // }}}
+ // {{{ _generateId()
+
+ /**
+ * Automatically generates and assigns an 'id' attribute for the element.
+ *
+ * Currently used to ensure that labels work on radio buttons and
+ * checkboxes. Per idea of Alexander Radivanovich.
+ *
+ * @access private
+ * @return void
+ */
+ function _generateId()
+ {
+ static $idx = 1;
+
+ if (!$this->getAttribute('id')) {
+ $this->updateAttributes(array('id' => 'qf_' . substr(md5(microtime() . $idx++), 0, 6)));
+ }
+ } // end func _generateId
+
+ // }}}
+ // {{{ exportValue()
+
+ /**
+ * Returns a 'safe' element's value
+ *
+ * @param array array of submitted values to search
+ * @param bool whether to return the value as associative array
+ * @access public
+ * @return mixed
+ */
+ function exportValue(&$submitValues, $assoc = false)
+ {
+ $value = $this->_findValue($submitValues);
+ if (null === $value) {
+ $value = $this->getValue();
+ }
+ return $this->_prepareValue($value, $assoc);
+ }
+
+ // }}}
+ // {{{ _prepareValue()
+
+ /**
+ * Used by exportValue() to prepare the value for returning
+ *
+ * @param mixed the value found in exportValue()
+ * @param bool whether to return the value as associative array
+ * @access private
+ * @return mixed
+ */
+ function _prepareValue($value, $assoc)
+ {
+ if (null === $value) {
+ return null;
+ } elseif (!$assoc) {
+ return $value;
+ } else {
+ $name = $this->getName();
+ if (!strpos($name, '[')) {
+ return array($name => $value);
+ } else {
+ $valueAry = array();
+ $myIndex = "['" . str_replace(
+ array('\\', '\'', ']', '['), array('\\\\', '\\\'', '', "']['"),
+ $name
+ ) . "']";
+ eval("\$valueAry$myIndex = \$value;");
+ return $valueAry;
+ }
+ }
+ }
+
+ // }}}
+} // end class HTML_QuickForm_element
+?> \ No newline at end of file
diff --git a/libs/HTML/QuickForm/file.php b/libs/HTML/QuickForm/file.php
new file mode 100755
index 0000000000..35a186e6ac
--- /dev/null
+++ b/libs/HTML/QuickForm/file.php
@@ -0,0 +1,358 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for a file upload field
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: file.php,v 1.23 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for <input /> form elements
+ */
+require_once 'HTML/QuickForm/input.php';
+
+// register file-related rules
+if (class_exists('HTML_QuickForm')) {
+ HTML_QuickForm::registerRule('uploadedfile', 'callback', '_ruleIsUploadedFile', 'HTML_QuickForm_file');
+ HTML_QuickForm::registerRule('maxfilesize', 'callback', '_ruleCheckMaxFileSize', 'HTML_QuickForm_file');
+ HTML_QuickForm::registerRule('mimetype', 'callback', '_ruleCheckMimeType', 'HTML_QuickForm_file');
+ HTML_QuickForm::registerRule('filename', 'callback', '_ruleCheckFileName', 'HTML_QuickForm_file');
+}
+
+/**
+ * HTML class for a file upload field
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ * @since 1.0
+ */
+class HTML_QuickForm_file extends HTML_QuickForm_input
+{
+ // {{{ properties
+
+ /**
+ * Uploaded file data, from $_FILES
+ * @var array
+ */
+ var $_value = null;
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string Input field name attribute
+ * @param string Input field label
+ * @param mixed (optional)Either a typical HTML attribute string
+ * or an associative array
+ * @since 1.0
+ * @access public
+ */
+ function HTML_QuickForm_file($elementName=null, $elementLabel=null, $attributes=null)
+ {
+ HTML_QuickForm_input::HTML_QuickForm_input($elementName, $elementLabel, $attributes);
+ $this->setType('file');
+ } //end constructor
+
+ // }}}
+ // {{{ setSize()
+
+ /**
+ * Sets size of file element
+ *
+ * @param int Size of file element
+ * @since 1.0
+ * @access public
+ */
+ function setSize($size)
+ {
+ $this->updateAttributes(array('size' => $size));
+ } //end func setSize
+
+ // }}}
+ // {{{ getSize()
+
+ /**
+ * Returns size of file element
+ *
+ * @since 1.0
+ * @access public
+ * @return int
+ */
+ function getSize()
+ {
+ return $this->getAttribute('size');
+ } //end func getSize
+
+ // }}}
+ // {{{ freeze()
+
+ /**
+ * Freeze the element so that only its value is returned
+ *
+ * @access public
+ * @return bool
+ */
+ function freeze()
+ {
+ return false;
+ } //end func freeze
+
+ // }}}
+ // {{{ setValue()
+
+ /**
+ * Sets value for file element.
+ *
+ * Actually this does nothing. The function is defined here to override
+ * HTML_Quickform_input's behaviour of setting the 'value' attribute. As
+ * no sane user-agent uses <input type="file">'s value for anything
+ * (because of security implications) we implement file's value as a
+ * read-only property with a special meaning.
+ *
+ * @param mixed Value for file element
+ * @since 3.0
+ * @access public
+ */
+ function setValue($value)
+ {
+ return null;
+ } //end func setValue
+
+ // }}}
+ // {{{ getValue()
+
+ /**
+ * Returns information about the uploaded file
+ *
+ * @since 3.0
+ * @access public
+ * @return array
+ */
+ function getValue()
+ {
+ return $this->_value;
+ } // end func getValue
+
+ // }}}
+ // {{{ onQuickFormEvent()
+
+ /**
+ * Called by HTML_QuickForm whenever form event is made on this element
+ *
+ * @param string Name of event
+ * @param mixed event arguments
+ * @param object calling object
+ * @since 1.0
+ * @access public
+ * @return bool
+ */
+ function onQuickFormEvent($event, $arg, &$caller)
+ {
+ switch ($event) {
+ case 'updateValue':
+ if ($caller->getAttribute('method') == 'get') {
+ return PEAR::raiseError('Cannot add a file upload field to a GET method form');
+ }
+ $this->_value = $this->_findValue();
+ $caller->updateAttributes(array('enctype' => 'multipart/form-data'));
+ $caller->setMaxFileSize();
+ break;
+ case 'addElement':
+ $this->onQuickFormEvent('createElement', $arg, $caller);
+ return $this->onQuickFormEvent('updateValue', null, $caller);
+ break;
+ case 'createElement':
+ $className = get_class($this);
+ $this->$className($arg[0], $arg[1], $arg[2]);
+ break;
+ }
+ return true;
+ } // end func onQuickFormEvent
+
+ // }}}
+ // {{{ moveUploadedFile()
+
+ /**
+ * Moves an uploaded file into the destination
+ *
+ * @param string Destination directory path
+ * @param string New file name
+ * @access public
+ * @return bool Whether the file was moved successfully
+ */
+ function moveUploadedFile($dest, $fileName = '')
+ {
+ if ($dest != '' && substr($dest, -1) != '/') {
+ $dest .= '/';
+ }
+ $fileName = ($fileName != '') ? $fileName : basename($this->_value['name']);
+ return move_uploaded_file($this->_value['tmp_name'], $dest . $fileName);
+ } // end func moveUploadedFile
+
+ // }}}
+ // {{{ isUploadedFile()
+
+ /**
+ * Checks if the element contains an uploaded file
+ *
+ * @access public
+ * @return bool true if file has been uploaded, false otherwise
+ */
+ function isUploadedFile()
+ {
+ return $this->_ruleIsUploadedFile($this->_value);
+ } // end func isUploadedFile
+
+ // }}}
+ // {{{ _ruleIsUploadedFile()
+
+ /**
+ * Checks if the given element contains an uploaded file
+ *
+ * @param array Uploaded file info (from $_FILES)
+ * @access private
+ * @return bool true if file has been uploaded, false otherwise
+ */
+ function _ruleIsUploadedFile($elementValue)
+ {
+ if ((isset($elementValue['error']) && $elementValue['error'] == 0) ||
+ (!empty($elementValue['tmp_name']) && $elementValue['tmp_name'] != 'none')) {
+ return is_uploaded_file($elementValue['tmp_name']);
+ } else {
+ return false;
+ }
+ } // end func _ruleIsUploadedFile
+
+ // }}}
+ // {{{ _ruleCheckMaxFileSize()
+
+ /**
+ * Checks that the file does not exceed the max file size
+ *
+ * @param array Uploaded file info (from $_FILES)
+ * @param int Max file size
+ * @access private
+ * @return bool true if filesize is lower than maxsize, false otherwise
+ */
+ function _ruleCheckMaxFileSize($elementValue, $maxSize)
+ {
+ if (!empty($elementValue['error']) &&
+ (UPLOAD_ERR_FORM_SIZE == $elementValue['error'] || UPLOAD_ERR_INI_SIZE == $elementValue['error'])) {
+ return false;
+ }
+ if (!HTML_QuickForm_file::_ruleIsUploadedFile($elementValue)) {
+ return true;
+ }
+ return ($maxSize >= @filesize($elementValue['tmp_name']));
+ } // end func _ruleCheckMaxFileSize
+
+ // }}}
+ // {{{ _ruleCheckMimeType()
+
+ /**
+ * Checks if the given element contains an uploaded file of the right mime type
+ *
+ * @param array Uploaded file info (from $_FILES)
+ * @param mixed Mime Type (can be an array of allowed types)
+ * @access private
+ * @return bool true if mimetype is correct, false otherwise
+ */
+ function _ruleCheckMimeType($elementValue, $mimeType)
+ {
+ if (!HTML_QuickForm_file::_ruleIsUploadedFile($elementValue)) {
+ return true;
+ }
+ if (is_array($mimeType)) {
+ return in_array($elementValue['type'], $mimeType);
+ }
+ return $elementValue['type'] == $mimeType;
+ } // end func _ruleCheckMimeType
+
+ // }}}
+ // {{{ _ruleCheckFileName()
+
+ /**
+ * Checks if the given element contains an uploaded file of the filename regex
+ *
+ * @param array Uploaded file info (from $_FILES)
+ * @param string Regular expression
+ * @access private
+ * @return bool true if name matches regex, false otherwise
+ */
+ function _ruleCheckFileName($elementValue, $regex)
+ {
+ if (!HTML_QuickForm_file::_ruleIsUploadedFile($elementValue)) {
+ return true;
+ }
+ return preg_match($regex, $elementValue['name']);
+ } // end func _ruleCheckFileName
+
+ // }}}
+ // {{{ _findValue()
+
+ /**
+ * Tries to find the element value from the values array
+ *
+ * Needs to be redefined here as $_FILES is populated differently from
+ * other arrays when element name is of the form foo[bar]
+ *
+ * @access private
+ * @return mixed
+ */
+ function _findValue()
+ {
+ if (empty($_FILES)) {
+ return null;
+ }
+ $elementName = $this->getName();
+ if (isset($_FILES[$elementName])) {
+ return $_FILES[$elementName];
+ } elseif (false !== ($pos = strpos($elementName, '['))) {
+ $base = str_replace(
+ array('\\', '\''), array('\\\\', '\\\''),
+ substr($elementName, 0, $pos)
+ );
+ $idx = "['" . str_replace(
+ array('\\', '\'', ']', '['), array('\\\\', '\\\'', '', "']['"),
+ substr($elementName, $pos + 1, -1)
+ ) . "']";
+ $props = array('name', 'type', 'size', 'tmp_name', 'error');
+ $code = "if (!isset(\$_FILES['{$base}']['name']{$idx})) {\n" .
+ " return null;\n" .
+ "} else {\n" .
+ " \$value = array();\n";
+ foreach ($props as $prop) {
+ $code .= " \$value['{$prop}'] = \$_FILES['{$base}']['{$prop}']{$idx};\n";
+ }
+ return eval($code . " return \$value;\n}\n");
+ } else {
+ return null;
+ }
+ }
+
+ // }}}
+} // end class HTML_QuickForm_file
+?>
diff --git a/libs/HTML/QuickForm/group.php b/libs/HTML/QuickForm/group.php
new file mode 100755
index 0000000000..e48f26118a
--- /dev/null
+++ b/libs/HTML/QuickForm/group.php
@@ -0,0 +1,588 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for a form element group
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: group.php,v 1.39 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for form elements
+ */
+require_once 'HTML/QuickForm/element.php';
+
+/**
+ * HTML class for a form element group
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ * @since 1.0
+ */
+class HTML_QuickForm_group extends HTML_QuickForm_element
+{
+ // {{{ properties
+
+ /**
+ * Name of the element
+ * @var string
+ * @since 1.0
+ * @access private
+ */
+ var $_name = '';
+
+ /**
+ * Array of grouped elements
+ * @var array
+ * @since 1.0
+ * @access private
+ */
+ var $_elements = array();
+
+ /**
+ * String to separate elements
+ * @var mixed
+ * @since 2.5
+ * @access private
+ */
+ var $_separator = null;
+
+ /**
+ * Required elements in this group
+ * @var array
+ * @since 2.5
+ * @access private
+ */
+ var $_required = array();
+
+ /**
+ * Whether to change elements' names to $groupName[$elementName] or leave them as is
+ * @var bool
+ * @since 3.0
+ * @access private
+ */
+ var $_appendName = true;
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string $elementName (optional)Group name
+ * @param array $elementLabel (optional)Group label
+ * @param array $elements (optional)Group elements
+ * @param mixed $separator (optional)Use a string for one separator,
+ * use an array to alternate the separators.
+ * @param bool $appendName (optional)whether to change elements' names to
+ * the form $groupName[$elementName] or leave
+ * them as is.
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_group($elementName=null, $elementLabel=null, $elements=null, $separator=null, $appendName = true)
+ {
+ $this->HTML_QuickForm_element($elementName, $elementLabel);
+ $this->_type = 'group';
+ if (isset($elements) && is_array($elements)) {
+ $this->setElements($elements);
+ }
+ if (isset($separator)) {
+ $this->_separator = $separator;
+ }
+ if (isset($appendName)) {
+ $this->_appendName = $appendName;
+ }
+ } //end constructor
+
+ // }}}
+ // {{{ setName()
+
+ /**
+ * Sets the group name
+ *
+ * @param string $name Group name
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setName($name)
+ {
+ $this->_name = $name;
+ } //end func setName
+
+ // }}}
+ // {{{ getName()
+
+ /**
+ * Returns the group name
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function getName()
+ {
+ return $this->_name;
+ } //end func getName
+
+ // }}}
+ // {{{ setValue()
+
+ /**
+ * Sets values for group's elements
+ *
+ * @param mixed Values for group's elements
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setValue($value)
+ {
+ $this->_createElementsIfNotExist();
+ foreach (array_keys($this->_elements) as $key) {
+ if (!$this->_appendName) {
+ $v = $this->_elements[$key]->_findValue($value);
+ if (null !== $v) {
+ $this->_elements[$key]->onQuickFormEvent('setGroupValue', $v, $this);
+ }
+
+ } else {
+ $elementName = $this->_elements[$key]->getName();
+ $index = strlen($elementName) ? $elementName : $key;
+ if (is_array($value)) {
+ if (isset($value[$index])) {
+ $this->_elements[$key]->onQuickFormEvent('setGroupValue', $value[$index], $this);
+ }
+ } elseif (isset($value)) {
+ $this->_elements[$key]->onQuickFormEvent('setGroupValue', $value, $this);
+ }
+ }
+ }
+ } //end func setValue
+
+ // }}}
+ // {{{ getValue()
+
+ /**
+ * Returns the value of the group
+ *
+ * @since 1.0
+ * @access public
+ * @return mixed
+ */
+ function getValue()
+ {
+ $value = null;
+ foreach (array_keys($this->_elements) as $key) {
+ $element =& $this->_elements[$key];
+ switch ($element->getType()) {
+ case 'radio':
+ $v = $element->getChecked()? $element->getValue(): null;
+ break;
+ case 'checkbox':
+ $v = $element->getChecked()? true: null;
+ break;
+ default:
+ $v = $element->getValue();
+ }
+ if (null !== $v) {
+ $elementName = $element->getName();
+ if (is_null($elementName)) {
+ $value = $v;
+ } else {
+ if (!is_array($value)) {
+ $value = is_null($value)? array(): array($value);
+ }
+ if ('' === $elementName) {
+ $value[] = $v;
+ } else {
+ $value[$elementName] = $v;
+ }
+ }
+ }
+ }
+ return $value;
+ } // end func getValue
+
+ // }}}
+ // {{{ setElements()
+
+ /**
+ * Sets the grouped elements
+ *
+ * @param array $elements Array of elements
+ * @since 1.1
+ * @access public
+ * @return void
+ */
+ function setElements($elements)
+ {
+ $this->_elements = array_values($elements);
+ if ($this->_flagFrozen) {
+ $this->freeze();
+ }
+ } // end func setElements
+
+ // }}}
+ // {{{ getElements()
+
+ /**
+ * Gets the grouped elements
+ *
+ * @since 2.4
+ * @access public
+ * @return array
+ */
+ function &getElements()
+ {
+ $this->_createElementsIfNotExist();
+ return $this->_elements;
+ } // end func getElements
+
+ // }}}
+ // {{{ getGroupType()
+
+ /**
+ * Gets the group type based on its elements
+ * Will return 'mixed' if elements contained in the group
+ * are of different types.
+ *
+ * @access public
+ * @return string group elements type
+ */
+ function getGroupType()
+ {
+ $this->_createElementsIfNotExist();
+ $prevType = '';
+ foreach (array_keys($this->_elements) as $key) {
+ $type = $this->_elements[$key]->getType();
+ if ($type != $prevType && $prevType != '') {
+ return 'mixed';
+ }
+ $prevType = $type;
+ }
+ return $type;
+ } // end func getGroupType
+
+ // }}}
+ // {{{ toHtml()
+
+ /**
+ * Returns Html for the group
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function toHtml()
+ {
+ include_once('HTML/QuickForm/Renderer/Default.php');
+ $renderer =& new HTML_QuickForm_Renderer_Default();
+ $renderer->setElementTemplate('{element}');
+ $this->accept($renderer);
+ return $renderer->toHtml();
+ } //end func toHtml
+
+ // }}}
+ // {{{ getElementName()
+
+ /**
+ * Returns the element name inside the group such as found in the html form
+ *
+ * @param mixed $index Element name or element index in the group
+ * @since 3.0
+ * @access public
+ * @return mixed string with element name, false if not found
+ */
+ function getElementName($index)
+ {
+ $this->_createElementsIfNotExist();
+ $elementName = false;
+ if (is_int($index) && isset($this->_elements[$index])) {
+ $elementName = $this->_elements[$index]->getName();
+ if (isset($elementName) && $elementName == '') {
+ $elementName = $index;
+ }
+ if ($this->_appendName) {
+ if (is_null($elementName)) {
+ $elementName = $this->getName();
+ } else {
+ $elementName = $this->getName().'['.$elementName.']';
+ }
+ }
+
+ } elseif (is_string($index)) {
+ foreach (array_keys($this->_elements) as $key) {
+ $elementName = $this->_elements[$key]->getName();
+ if ($index == $elementName) {
+ if ($this->_appendName) {
+ $elementName = $this->getName().'['.$elementName.']';
+ }
+ break;
+ } elseif ($this->_appendName && $this->getName().'['.$elementName.']' == $index) {
+ break;
+ }
+ }
+ }
+ return $elementName;
+ } //end func getElementName
+
+ // }}}
+ // {{{ getFrozenHtml()
+
+ /**
+ * Returns the value of field without HTML tags
+ *
+ * @since 1.3
+ * @access public
+ * @return string
+ */
+ function getFrozenHtml()
+ {
+ $flags = array();
+ $this->_createElementsIfNotExist();
+ foreach (array_keys($this->_elements) as $key) {
+ if (false === ($flags[$key] = $this->_elements[$key]->isFrozen())) {
+ $this->_elements[$key]->freeze();
+ }
+ }
+ $html = $this->toHtml();
+ foreach (array_keys($this->_elements) as $key) {
+ if (!$flags[$key]) {
+ $this->_elements[$key]->unfreeze();
+ }
+ }
+ return $html;
+ } //end func getFrozenHtml
+
+ // }}}
+ // {{{ onQuickFormEvent()
+
+ /**
+ * Called by HTML_QuickForm whenever form event is made on this element
+ *
+ * @param string $event Name of event
+ * @param mixed $arg event arguments
+ * @param object &$caller calling object
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function onQuickFormEvent($event, $arg, &$caller)
+ {
+ switch ($event) {
+ case 'updateValue':
+ $this->_createElementsIfNotExist();
+ foreach (array_keys($this->_elements) as $key) {
+ if ($this->_appendName) {
+ $elementName = $this->_elements[$key]->getName();
+ if (is_null($elementName)) {
+ $this->_elements[$key]->setName($this->getName());
+ } elseif ('' === $elementName) {
+ $this->_elements[$key]->setName($this->getName() . '[' . $key . ']');
+ } else {
+ $this->_elements[$key]->setName($this->getName() . '[' . $elementName . ']');
+ }
+ }
+ $this->_elements[$key]->onQuickFormEvent('updateValue', $arg, $caller);
+ if ($this->_appendName) {
+ $this->_elements[$key]->setName($elementName);
+ }
+ }
+ break;
+
+ default:
+ parent::onQuickFormEvent($event, $arg, $caller);
+ }
+ return true;
+ } // end func onQuickFormEvent
+
+ // }}}
+ // {{{ accept()
+
+ /**
+ * Accepts a renderer
+ *
+ * @param HTML_QuickForm_Renderer renderer object
+ * @param bool Whether a group is required
+ * @param string An error message associated with a group
+ * @access public
+ * @return void
+ */
+ function accept(&$renderer, $required = false, $error = null)
+ {
+ $this->_createElementsIfNotExist();
+ $renderer->startGroup($this, $required, $error);
+ $name = $this->getName();
+ foreach (array_keys($this->_elements) as $key) {
+ $element =& $this->_elements[$key];
+
+ if ($this->_appendName) {
+ $elementName = $element->getName();
+ if (isset($elementName)) {
+ $element->setName($name . '['. (strlen($elementName)? $elementName: $key) .']');
+ } else {
+ $element->setName($name);
+ }
+ }
+
+ $required = !$element->isFrozen() && in_array($element->getName(), $this->_required);
+
+ $element->accept($renderer, $required);
+
+ // restore the element's name
+ if ($this->_appendName) {
+ $element->setName($elementName);
+ }
+ }
+ $renderer->finishGroup($this);
+ } // end func accept
+
+ // }}}
+ // {{{ exportValue()
+
+ /**
+ * As usual, to get the group's value we access its elements and call
+ * their exportValue() methods
+ */
+ function exportValue(&$submitValues, $assoc = false)
+ {
+ $value = null;
+ foreach (array_keys($this->_elements) as $key) {
+ $elementName = $this->_elements[$key]->getName();
+ if ($this->_appendName) {
+ if (is_null($elementName)) {
+ $this->_elements[$key]->setName($this->getName());
+ } elseif ('' === $elementName) {
+ $this->_elements[$key]->setName($this->getName() . '[' . $key . ']');
+ } else {
+ $this->_elements[$key]->setName($this->getName() . '[' . $elementName . ']');
+ }
+ }
+ $v = $this->_elements[$key]->exportValue($submitValues, $assoc);
+ if ($this->_appendName) {
+ $this->_elements[$key]->setName($elementName);
+ }
+ if (null !== $v) {
+ // Make $value an array, we will use it like one
+ if (null === $value) {
+ $value = array();
+ }
+ if ($assoc) {
+ // just like HTML_QuickForm::exportValues()
+ $value = HTML_QuickForm::arrayMerge($value, $v);
+ } else {
+ // just like getValue(), but should work OK every time here
+ if (is_null($elementName)) {
+ $value = $v;
+ } elseif ('' === $elementName) {
+ $value[] = $v;
+ } else {
+ $value[$elementName] = $v;
+ }
+ }
+ }
+ }
+ // do not pass the value through _prepareValue, we took care of this already
+ return $value;
+ }
+
+ // }}}
+ // {{{ _createElements()
+
+ /**
+ * Creates the group's elements.
+ *
+ * This should be overriden by child classes that need to create their
+ * elements. The method will be called automatically when needed, calling
+ * it from the constructor is discouraged as the constructor is usually
+ * called _twice_ on element creation, first time with _no_ parameters.
+ *
+ * @access private
+ * @abstract
+ */
+ function _createElements()
+ {
+ // abstract
+ }
+
+ // }}}
+ // {{{ _createElementsIfNotExist()
+
+ /**
+ * A wrapper around _createElements()
+ *
+ * This method calls _createElements() if the group's _elements array
+ * is empty. It also performs some updates, e.g. freezes the created
+ * elements if the group is already frozen.
+ *
+ * @access private
+ */
+ function _createElementsIfNotExist()
+ {
+ if (empty($this->_elements)) {
+ $this->_createElements();
+ if ($this->_flagFrozen) {
+ $this->freeze();
+ }
+ }
+ }
+
+ // }}}
+ // {{{ freeze()
+
+ function freeze()
+ {
+ parent::freeze();
+ foreach (array_keys($this->_elements) as $key) {
+ $this->_elements[$key]->freeze();
+ }
+ }
+
+ // }}}
+ // {{{ unfreeze()
+
+ function unfreeze()
+ {
+ parent::unfreeze();
+ foreach (array_keys($this->_elements) as $key) {
+ $this->_elements[$key]->unfreeze();
+ }
+ }
+
+ // }}}
+ // {{{ setPersistantFreeze()
+
+ function setPersistantFreeze($persistant = false)
+ {
+ parent::setPersistantFreeze($persistant);
+ foreach (array_keys($this->_elements) as $key) {
+ $this->_elements[$key]->setPersistantFreeze($persistant);
+ }
+ }
+
+ // }}}
+} //end class HTML_QuickForm_group
+?> \ No newline at end of file
diff --git a/libs/HTML/QuickForm/header.php b/libs/HTML/QuickForm/header.php
new file mode 100755
index 0000000000..90e6f0517c
--- /dev/null
+++ b/libs/HTML/QuickForm/header.php
@@ -0,0 +1,74 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * A pseudo-element used for adding headers to form
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: header.php,v 1.2 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * HTML class for static data
+ */
+require_once 'HTML/QuickForm/static.php';
+
+/**
+ * A pseudo-element used for adding headers to form
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ * @since 3.0
+ */
+class HTML_QuickForm_header extends HTML_QuickForm_static
+{
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string $elementName Header name
+ * @param string $text Header text
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_header($elementName = null, $text = null)
+ {
+ $this->HTML_QuickForm_static($elementName, null, $text);
+ $this->_type = 'header';
+ }
+
+ // }}}
+ // {{{ accept()
+
+ /**
+ * Accepts a renderer
+ *
+ * @param HTML_QuickForm_Renderer renderer object
+ * @access public
+ * @return void
+ */
+ function accept(&$renderer)
+ {
+ $renderer->renderHeader($this);
+ } // end func accept
+
+ // }}}
+
+} //end class HTML_QuickForm_header
+?>
diff --git a/libs/HTML/QuickForm/hidden.php b/libs/HTML/QuickForm/hidden.php
new file mode 100755
index 0000000000..95417b6a7e
--- /dev/null
+++ b/libs/HTML/QuickForm/hidden.php
@@ -0,0 +1,94 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for a hidden type element
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: hidden.php,v 1.11 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for <input /> form elements
+ */
+require_once 'HTML/QuickForm/input.php';
+
+/**
+ * HTML class for a hidden type element
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 1.0
+ */
+class HTML_QuickForm_hidden extends HTML_QuickForm_input
+{
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string $elementName (optional)Input field name attribute
+ * @param string $value (optional)Input field value
+ * @param mixed $attributes (optional)Either a typical HTML attribute string
+ * or an associative array
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_hidden($elementName=null, $value='', $attributes=null)
+ {
+ HTML_QuickForm_input::HTML_QuickForm_input($elementName, null, $attributes);
+ $this->setType('hidden');
+ $this->setValue($value);
+ } //end constructor
+
+ // }}}
+ // {{{ freeze()
+
+ /**
+ * Freeze the element so that only its value is returned
+ *
+ * @access public
+ * @return void
+ */
+ function freeze()
+ {
+ return false;
+ } //end func freeze
+
+ // }}}
+ // {{{ accept()
+
+ /**
+ * Accepts a renderer
+ *
+ * @param HTML_QuickForm_Renderer renderer object
+ * @access public
+ * @return void
+ */
+ function accept(&$renderer)
+ {
+ $renderer->renderHidden($this);
+ } // end func accept
+
+ // }}}
+
+} //end class HTML_QuickForm_hidden
+?>
diff --git a/libs/HTML/QuickForm/hiddenselect.php b/libs/HTML/QuickForm/hiddenselect.php
new file mode 100755
index 0000000000..8d3d97b172
--- /dev/null
+++ b/libs/HTML/QuickForm/hiddenselect.php
@@ -0,0 +1,118 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Hidden select pseudo-element
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Isaac Shepard <ishepard@bsiweb.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: hiddenselect.php,v 1.6 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Class for <select></select> elements
+ */
+require_once 'HTML/QuickForm/select.php';
+
+/**
+ * Hidden select pseudo-element
+ *
+ * This class takes the same arguments as a select element, but instead
+ * of creating a select ring it creates hidden elements for all values
+ * already selected with setDefault or setConstant. This is useful if
+ * you have a select ring that you don't want visible, but you need all
+ * selected values to be passed.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Isaac Shepard <ishepard@bsiweb.com>
+ * @version Release: 3.2.9
+ * @since 2.1
+ */
+class HTML_QuickForm_hiddenselect extends HTML_QuickForm_select
+{
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string Select name attribute
+ * @param mixed Label(s) for the select (not used)
+ * @param mixed Data to be used to populate options
+ * @param mixed Either a typical HTML attribute string or an associative array (not used)
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_hiddenselect($elementName=null, $elementLabel=null, $options=null, $attributes=null)
+ {
+ HTML_QuickForm_element::HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+ $this->_persistantFreeze = true;
+ $this->_type = 'hiddenselect';
+ if (isset($options)) {
+ $this->load($options);
+ }
+ } //end constructor
+
+ // }}}
+ // {{{ toHtml()
+
+ /**
+ * Returns the SELECT in HTML
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ * @throws
+ */
+ function toHtml()
+ {
+ if (empty($this->_values)) {
+ return '';
+ }
+
+ $tabs = $this->_getTabs();
+ $name = $this->getPrivateName();
+ $strHtml = '';
+
+ foreach ($this->_values as $key => $val) {
+ for ($i = 0, $optCount = count($this->_options); $i < $optCount; $i++) {
+ if ($val == $this->_options[$i]['attr']['value']) {
+ $strHtml .= $tabs . '<input' . $this->_getAttrString(array(
+ 'type' => 'hidden',
+ 'name' => $name,
+ 'value' => $val
+ )) . " />\n" ;
+ }
+ }
+ }
+
+ return $strHtml;
+ } //end func toHtml
+
+ // }}}
+ // {{{ accept()
+
+ /**
+ * This is essentially a hidden element and should be rendered as one
+ */
+ function accept(&$renderer)
+ {
+ $renderer->renderHidden($this);
+ }
+
+ // }}}
+} //end class HTML_QuickForm_hiddenselect
+?>
diff --git a/libs/HTML/QuickForm/hierselect.php b/libs/HTML/QuickForm/hierselect.php
new file mode 100755
index 0000000000..9e46f07bed
--- /dev/null
+++ b/libs/HTML/QuickForm/hierselect.php
@@ -0,0 +1,593 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Hierarchical select element
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Herim Vasquez <vasquezh@iro.umontreal.ca>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: hierselect.php,v 1.19 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Class for a group of form elements
+ */
+require_once 'HTML/QuickForm/group.php';
+/**
+ * Class for <select></select> elements
+ */
+require_once 'HTML/QuickForm/select.php';
+
+/**
+ * Hierarchical select element
+ *
+ * Class to dynamically create two or more HTML Select elements
+ * The first select changes the content of the second select and so on.
+ * This element is considered as a group. Selects will be named
+ * groupName[0], groupName[1], groupName[2]...
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Herim Vasquez <vasquezh@iro.umontreal.ca>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ * @since 3.1
+ */
+class HTML_QuickForm_hierselect extends HTML_QuickForm_group
+{
+ // {{{ properties
+
+ /**
+ * Options for all the select elements
+ *
+ * @see setOptions()
+ * @var array
+ * @access private
+ */
+ var $_options = array();
+
+ /**
+ * Number of select elements on this group
+ *
+ * @var int
+ * @access private
+ */
+ var $_nbElements = 0;
+
+ /**
+ * The javascript used to set and change the options
+ *
+ * @var string
+ * @access private
+ */
+ var $_js = '';
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string $elementName (optional)Input field name attribute
+ * @param string $elementLabel (optional)Input field label in form
+ * @param mixed $attributes (optional)Either a typical HTML attribute string
+ * or an associative array. Date format is passed along the attributes.
+ * @param mixed $separator (optional)Use a string for one separator,
+ * use an array to alternate the separators.
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_hierselect($elementName=null, $elementLabel=null, $attributes=null, $separator=null)
+ {
+ $this->HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+ $this->_persistantFreeze = true;
+ if (isset($separator)) {
+ $this->_separator = $separator;
+ }
+ $this->_type = 'hierselect';
+ $this->_appendName = true;
+ } //end constructor
+
+ // }}}
+ // {{{ setOptions()
+
+ /**
+ * Initialize the array structure containing the options for each select element.
+ * Call the functions that actually do the magic.
+ *
+ * Format is a bit more complex than for a simple select as we need to know
+ * which options are related to the ones in the previous select:
+ *
+ * Ex:
+ * <code>
+ * // first select
+ * $select1[0] = 'Pop';
+ * $select1[1] = 'Classical';
+ * $select1[2] = 'Funeral doom';
+ *
+ * // second select
+ * $select2[0][0] = 'Red Hot Chil Peppers';
+ * $select2[0][1] = 'The Pixies';
+ * $select2[1][0] = 'Wagner';
+ * $select2[1][1] = 'Strauss';
+ * $select2[2][0] = 'Pantheist';
+ * $select2[2][1] = 'Skepticism';
+ *
+ * // If only need two selects
+ * // - and using the deprecated functions
+ * $sel =& $form->addElement('hierselect', 'cds', 'Choose CD:');
+ * $sel->setMainOptions($select1);
+ * $sel->setSecOptions($select2);
+ *
+ * // - and using the new setOptions function
+ * $sel =& $form->addElement('hierselect', 'cds', 'Choose CD:');
+ * $sel->setOptions(array($select1, $select2));
+ *
+ * // If you have a third select with prices for the cds
+ * $select3[0][0][0] = '15.00$';
+ * $select3[0][0][1] = '17.00$';
+ * // etc
+ *
+ * // You can now use
+ * $sel =& $form->addElement('hierselect', 'cds', 'Choose CD:');
+ * $sel->setOptions(array($select1, $select2, $select3));
+ * </code>
+ *
+ * @param array $options Array of options defining each element
+ * @access public
+ * @return void
+ */
+ function setOptions($options)
+ {
+ $this->_options = $options;
+
+ if (empty($this->_elements)) {
+ $this->_nbElements = count($this->_options);
+ $this->_createElements();
+ } else {
+ // setDefaults has probably been called before this function
+ // check if all elements have been created
+ $totalNbElements = count($this->_options);
+ for ($i = $this->_nbElements; $i < $totalNbElements; $i ++) {
+ $this->_elements[] =& new HTML_QuickForm_select($i, null, array(), $this->getAttributes());
+ $this->_nbElements++;
+ }
+ }
+
+ $this->_setOptions();
+ } // end func setMainOptions
+
+ // }}}
+ // {{{ setMainOptions()
+
+ /**
+ * Sets the options for the first select element. Deprecated. setOptions() should be used.
+ *
+ * @param array $array Options for the first select element
+ *
+ * @access public
+ * @deprecated Deprecated since release 3.2.2
+ * @return void
+ */
+ function setMainOptions($array)
+ {
+ $this->_options[0] = $array;
+
+ if (empty($this->_elements)) {
+ $this->_nbElements = 2;
+ $this->_createElements();
+ }
+ } // end func setMainOptions
+
+ // }}}
+ // {{{ setSecOptions()
+
+ /**
+ * Sets the options for the second select element. Deprecated. setOptions() should be used.
+ * The main _options array is initialized and the _setOptions function is called.
+ *
+ * @param array $array Options for the second select element
+ *
+ * @access public
+ * @deprecated Deprecated since release 3.2.2
+ * @return void
+ */
+ function setSecOptions($array)
+ {
+ $this->_options[1] = $array;
+
+ if (empty($this->_elements)) {
+ $this->_nbElements = 2;
+ $this->_createElements();
+ } else {
+ // setDefaults has probably been called before this function
+ // check if all elements have been created
+ $totalNbElements = 2;
+ for ($i = $this->_nbElements; $i < $totalNbElements; $i ++) {
+ $this->_elements[] =& new HTML_QuickForm_select($i, null, array(), $this->getAttributes());
+ $this->_nbElements++;
+ }
+ }
+
+ $this->_setOptions();
+ } // end func setSecOptions
+
+ // }}}
+ // {{{ _setOptions()
+
+ /**
+ * Sets the options for each select element
+ *
+ * @access private
+ * @return void
+ */
+ function _setOptions()
+ {
+ $toLoad = '';
+ foreach (array_keys($this->_elements) AS $key) {
+ $array = eval("return isset(\$this->_options[{$key}]{$toLoad})? \$this->_options[{$key}]{$toLoad}: null;");
+ if (is_array($array)) {
+ $select =& $this->_elements[$key];
+ $select->_options = array();
+ $select->loadArray($array);
+
+ $value = is_array($v = $select->getValue()) ? $v[0] : key($array);
+ $toLoad .= '[\'' . str_replace(array('\\', '\''), array('\\\\', '\\\''), $value) . '\']';
+ }
+ }
+ } // end func _setOptions
+
+ // }}}
+ // {{{ setValue()
+
+ /**
+ * Sets values for group's elements
+ *
+ * @param array $value An array of 2 or more values, for the first,
+ * the second, the third etc. select
+ *
+ * @access public
+ * @return void
+ */
+ function setValue($value)
+ {
+ // fix for bug #6766. Hope this doesn't break anything more
+ // after bug #7961. Forgot that _nbElements was used in
+ // _createElements() called in several places...
+ $this->_nbElements = max($this->_nbElements, count($value));
+ parent::setValue($value);
+ $this->_setOptions();
+ } // end func setValue
+
+ // }}}
+ // {{{ _createElements()
+
+ /**
+ * Creates all the elements for the group
+ *
+ * @access private
+ * @return void
+ */
+ function _createElements()
+ {
+ for ($i = 0; $i < $this->_nbElements; $i++) {
+ $this->_elements[] =& new HTML_QuickForm_select($i, null, array(), $this->getAttributes());
+ }
+ } // end func _createElements
+
+ // }}}
+ // {{{ toHtml()
+
+ function toHtml()
+ {
+ $this->_js = '';
+ if (!$this->_flagFrozen) {
+ // set the onchange attribute for each element except last
+ $keys = array_keys($this->_elements);
+ $onChange = array();
+ for ($i = 0; $i < count($keys) - 1; $i++) {
+ $select =& $this->_elements[$keys[$i]];
+ $onChange[$i] = $select->getAttribute('onchange');
+ $select->updateAttributes(
+ array('onchange' => '_hs_swapOptions(this.form, \'' . $this->_escapeString($this->getName()) . '\', ' . $keys[$i] . ');' . $onChange[$i])
+ );
+ }
+
+ // create the js function to call
+ if (!defined('HTML_QUICKFORM_HIERSELECT_EXISTS')) {
+ $this->_js .= <<<JAVASCRIPT
+function _hs_findOptions(ary, keys)
+{
+ var key = keys.shift();
+ if (!key in ary) {
+ return {};
+ } else if (0 == keys.length) {
+ return ary[key];
+ } else {
+ return _hs_findOptions(ary[key], keys);
+ }
+}
+
+function _hs_findSelect(form, groupName, selectIndex)
+{
+ if (groupName+'['+ selectIndex +']' in form) {
+ return form[groupName+'['+ selectIndex +']'];
+ } else {
+ return form[groupName+'['+ selectIndex +'][]'];
+ }
+}
+
+function _hs_unescapeEntities(str)
+{
+ var div = document.createElement('div');
+ div.innerHTML = str;
+ return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
+}
+
+function _hs_replaceOptions(ctl, optionList)
+{
+ var j = 0;
+ ctl.options.length = 0;
+ for (i in optionList) {
+ var optionText = (-1 == String(optionList[i]).indexOf('&'))? optionList[i]: _hs_unescapeEntities(optionList[i]);
+ ctl.options[j++] = new Option(optionText, i, false, false);
+ }
+}
+
+function _hs_setValue(ctl, value)
+{
+ var testValue = {};
+ if (value instanceof Array) {
+ for (var i = 0; i < value.length; i++) {
+ testValue[value[i]] = true;
+ }
+ } else {
+ testValue[value] = true;
+ }
+ for (var i = 0; i < ctl.options.length; i++) {
+ if (ctl.options[i].value in testValue) {
+ ctl.options[i].selected = true;
+ }
+ }
+}
+
+function _hs_swapOptions(form, groupName, selectIndex)
+{
+ var hsValue = [];
+ for (var i = 0; i <= selectIndex; i++) {
+ hsValue[i] = _hs_findSelect(form, groupName, i).value;
+ }
+
+ _hs_replaceOptions(_hs_findSelect(form, groupName, selectIndex + 1),
+ _hs_findOptions(_hs_options[groupName][selectIndex], hsValue));
+ if (selectIndex + 1 < _hs_options[groupName].length) {
+ _hs_swapOptions(form, groupName, selectIndex + 1);
+ }
+}
+
+function _hs_onReset(form, groupNames)
+{
+ for (var i = 0; i < groupNames.length; i++) {
+ try {
+ for (var j = 0; j <= _hs_options[groupNames[i]].length; j++) {
+ _hs_setValue(_hs_findSelect(form, groupNames[i], j), _hs_defaults[groupNames[i]][j]);
+ if (j < _hs_options[groupNames[i]].length) {
+ _hs_replaceOptions(_hs_findSelect(form, groupNames[i], j + 1),
+ _hs_findOptions(_hs_options[groupNames[i]][j], _hs_defaults[groupNames[i]].slice(0, j + 1)));
+ }
+ }
+ } catch (e) {
+ if (!(e instanceof TypeError)) {
+ throw e;
+ }
+ }
+ }
+}
+
+function _hs_setupOnReset(form, groupNames)
+{
+ setTimeout(function() { _hs_onReset(form, groupNames); }, 25);
+}
+
+function _hs_onReload()
+{
+ var ctl;
+ for (var i = 0; i < document.forms.length; i++) {
+ for (var j in _hs_defaults) {
+ if (ctl = _hs_findSelect(document.forms[i], j, 0)) {
+ for (var k = 0; k < _hs_defaults[j].length; k++) {
+ _hs_setValue(_hs_findSelect(document.forms[i], j, k), _hs_defaults[j][k]);
+ }
+ }
+ }
+ }
+
+ if (_hs_prevOnload) {
+ _hs_prevOnload();
+ }
+}
+
+var _hs_prevOnload = null;
+if (window.onload) {
+ _hs_prevOnload = window.onload;
+}
+window.onload = _hs_onReload;
+
+var _hs_options = {};
+var _hs_defaults = {};
+
+JAVASCRIPT;
+ define('HTML_QUICKFORM_HIERSELECT_EXISTS', true);
+ }
+ // option lists
+ $jsParts = array();
+ for ($i = 1; $i < $this->_nbElements; $i++) {
+ $jsParts[] = $this->_convertArrayToJavascript($this->_options[$i]);
+ }
+ $this->_js .= "\n_hs_options['" . $this->_escapeString($this->getName()) . "'] = [\n" .
+ implode(",\n", $jsParts) .
+ "\n];\n";
+ // default value; if we don't actually have any values yet just use
+ // the first option (for single selects) or empty array (for multiple)
+ $values = array();
+ foreach (array_keys($this->_elements) as $key) {
+ if (is_array($v = $this->_elements[$key]->getValue())) {
+ $values[] = count($v) > 1? $v: $v[0];
+ } else {
+ // XXX: accessing the supposedly private _options array
+ $values[] = $this->_elements[$key]->getMultiple() || empty($this->_elements[$key]->_options[0])?
+ array():
+ $this->_elements[$key]->_options[0]['attr']['value'];
+ }
+ }
+ $this->_js .= "_hs_defaults['" . $this->_escapeString($this->getName()) . "'] = " .
+ $this->_convertArrayToJavascript($values, false) . ";\n";
+ }
+ include_once('HTML/QuickForm/Renderer/Default.php');
+ $renderer =& new HTML_QuickForm_Renderer_Default();
+ $renderer->setElementTemplate('{element}');
+ parent::accept($renderer);
+
+ if (!empty($onChange)) {
+ $keys = array_keys($this->_elements);
+ for ($i = 0; $i < count($keys) - 1; $i++) {
+ $this->_elements[$keys[$i]]->updateAttributes(array('onchange' => $onChange[$i]));
+ }
+ }
+ return (empty($this->_js)? '': "<script type=\"text/javascript\">\n//<![CDATA[\n" . $this->_js . "//]]>\n</script>") .
+ $renderer->toHtml();
+ } // end func toHtml
+
+ // }}}
+ // {{{ accept()
+
+ function accept(&$renderer, $required = false, $error = null)
+ {
+ $renderer->renderElement($this, $required, $error);
+ } // end func accept
+
+ // }}}
+ // {{{ onQuickFormEvent()
+
+ function onQuickFormEvent($event, $arg, &$caller)
+ {
+ if ('updateValue' == $event) {
+ // we need to call setValue() so that the secondary option
+ // matches the main option
+ return HTML_QuickForm_element::onQuickFormEvent($event, $arg, $caller);
+ } else {
+ $ret = parent::onQuickFormEvent($event, $arg, $caller);
+ // add onreset handler to form to properly reset hierselect (see bug #2970)
+ if ('addElement' == $event) {
+ $onReset = $caller->getAttribute('onreset');
+ if (strlen($onReset)) {
+ if (strpos($onReset, '_hs_setupOnReset')) {
+ $caller->updateAttributes(array('onreset' => str_replace('_hs_setupOnReset(this, [', "_hs_setupOnReset(this, ['" . $this->_escapeString($this->getName()) . "', ", $onReset)));
+ } else {
+ $caller->updateAttributes(array('onreset' => "var temp = function() { {$onReset} } ; if (!temp()) { return false; } ; if (typeof _hs_setupOnReset != 'undefined') { return _hs_setupOnReset(this, ['" . $this->_escapeString($this->getName()) . "']); } "));
+ }
+ } else {
+ $caller->updateAttributes(array('onreset' => "if (typeof _hs_setupOnReset != 'undefined') { return _hs_setupOnReset(this, ['" . $this->_escapeString($this->getName()) . "']); } "));
+ }
+ }
+ return $ret;
+ }
+ } // end func onQuickFormEvent
+
+ // }}}
+ // {{{ _convertArrayToJavascript()
+
+ /**
+ * Converts PHP array to its Javascript analog
+ *
+ * @access private
+ * @param array PHP array to convert
+ * @param bool Generate Javascript object literal (default, works like PHP's associative array) or array literal
+ * @return string Javascript representation of the value
+ */
+ function _convertArrayToJavascript($array, $assoc = true)
+ {
+ if (!is_array($array)) {
+ return $this->_convertScalarToJavascript($array);
+ } else {
+ $items = array();
+ foreach ($array as $key => $val) {
+ $item = $assoc? "'" . $this->_escapeString($key) . "': ": '';
+ if (is_array($val)) {
+ $item .= $this->_convertArrayToJavascript($val, $assoc);
+ } else {
+ $item .= $this->_convertScalarToJavascript($val);
+ }
+ $items[] = $item;
+ }
+ }
+ $js = implode(', ', $items);
+ return $assoc? '{ ' . $js . ' }': '[' . $js . ']';
+ }
+
+ // }}}
+ // {{{ _convertScalarToJavascript()
+
+ /**
+ * Converts PHP's scalar value to its Javascript analog
+ *
+ * @access private
+ * @param mixed PHP value to convert
+ * @return string Javascript representation of the value
+ */
+ function _convertScalarToJavascript($val)
+ {
+ if (is_bool($val)) {
+ return $val ? 'true' : 'false';
+ } elseif (is_int($val) || is_double($val)) {
+ return $val;
+ } elseif (is_string($val)) {
+ return "'" . $this->_escapeString($val) . "'";
+ } elseif (is_null($val)) {
+ return 'null';
+ } else {
+ // don't bother
+ return '{}';
+ }
+ }
+
+ // }}}
+ // {{{ _escapeString()
+
+ /**
+ * Quotes the string so that it can be used in Javascript string constants
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _escapeString($str)
+ {
+ return strtr($str,array(
+ "\r" => '\r',
+ "\n" => '\n',
+ "\t" => '\t',
+ "'" => "\\'",
+ '"' => '\"',
+ '\\' => '\\\\'
+ ));
+ }
+
+ // }}}
+} // end class HTML_QuickForm_hierselect
+?> \ No newline at end of file
diff --git a/libs/HTML/QuickForm/html.php b/libs/HTML/QuickForm/html.php
new file mode 100755
index 0000000000..03651a4c14
--- /dev/null
+++ b/libs/HTML/QuickForm/html.php
@@ -0,0 +1,77 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * A pseudo-element used for adding raw HTML to form
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: html.php,v 1.2 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * HTML class for static data
+ */
+require_once 'HTML/QuickForm/static.php';
+
+/**
+ * A pseudo-element used for adding raw HTML to form
+ *
+ * Intended for use with the default renderer only, template-based
+ * ones may (and probably will) completely ignore this
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ * @since 3.0
+ * @deprecated Please use the templates rather than add raw HTML via this element
+ */
+class HTML_QuickForm_html extends HTML_QuickForm_static
+{
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string $text raw HTML to add
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_html($text = null)
+ {
+ $this->HTML_QuickForm_static(null, null, $text);
+ $this->_type = 'html';
+ }
+
+ // }}}
+ // {{{ accept()
+
+ /**
+ * Accepts a renderer
+ *
+ * @param HTML_QuickForm_Renderer renderer object (only works with Default renderer!)
+ * @access public
+ * @return void
+ */
+ function accept(&$renderer)
+ {
+ $renderer->renderHtml($this);
+ } // end func accept
+
+ // }}}
+
+} //end class HTML_QuickForm_html
+?>
diff --git a/libs/HTML/QuickForm/image.php b/libs/HTML/QuickForm/image.php
new file mode 100755
index 0000000000..0c3c3a7553
--- /dev/null
+++ b/libs/HTML/QuickForm/image.php
@@ -0,0 +1,127 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for an <input type="image" /> element
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: image.php,v 1.5 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for <input /> form elements
+ */
+require_once 'HTML/QuickForm/input.php';
+
+/**
+ * HTML class for an <input type="image" /> element
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 1.0
+ */
+class HTML_QuickForm_image extends HTML_QuickForm_input
+{
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string $elementName (optional)Element name attribute
+ * @param string $src (optional)Image source
+ * @param mixed $attributes (optional)Either a typical HTML attribute string
+ * or an associative array
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_image($elementName=null, $src='', $attributes=null)
+ {
+ HTML_QuickForm_input::HTML_QuickForm_input($elementName, null, $attributes);
+ $this->setType('image');
+ $this->setSource($src);
+ } // end class constructor
+
+ // }}}
+ // {{{ setSource()
+
+ /**
+ * Sets source for image element
+ *
+ * @param string $src source for image element
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setSource($src)
+ {
+ $this->updateAttributes(array('src' => $src));
+ } // end func setSource
+
+ // }}}
+ // {{{ setBorder()
+
+ /**
+ * Sets border size for image element
+ *
+ * @param string $border border for image element
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setBorder($border)
+ {
+ $this->updateAttributes(array('border' => $border));
+ } // end func setBorder
+
+ // }}}
+ // {{{ setAlign()
+
+ /**
+ * Sets alignment for image element
+ *
+ * @param string $align alignment for image element
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setAlign($align)
+ {
+ $this->updateAttributes(array('align' => $align));
+ } // end func setAlign
+
+ // }}}
+ // {{{ freeze()
+
+ /**
+ * Freeze the element so that only its value is returned
+ *
+ * @access public
+ * @return void
+ */
+ function freeze()
+ {
+ return false;
+ } //end func freeze
+
+ // }}}
+
+} // end class HTML_QuickForm_image
+?>
diff --git a/libs/HTML/QuickForm/input.php b/libs/HTML/QuickForm/input.php
new file mode 100755
index 0000000000..fa82558a6a
--- /dev/null
+++ b/libs/HTML/QuickForm/input.php
@@ -0,0 +1,209 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Base class for <input /> form elements
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: input.php,v 1.9 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for form elements
+ */
+require_once 'HTML/QuickForm/element.php';
+
+/**
+ * Base class for <input /> form elements
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 1.0
+ * @abstract
+ */
+class HTML_QuickForm_input extends HTML_QuickForm_element
+{
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string Input field name attribute
+ * @param mixed Label(s) for the input field
+ * @param mixed Either a typical HTML attribute string or an associative array
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_input($elementName=null, $elementLabel=null, $attributes=null)
+ {
+ $this->HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+ } //end constructor
+
+ // }}}
+ // {{{ setType()
+
+ /**
+ * Sets the element type
+ *
+ * @param string $type Element type
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setType($type)
+ {
+ $this->_type = $type;
+ $this->updateAttributes(array('type'=>$type));
+ } // end func setType
+
+ // }}}
+ // {{{ setName()
+
+ /**
+ * Sets the input field name
+ *
+ * @param string $name Input field name attribute
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setName($name)
+ {
+ $this->updateAttributes(array('name'=>$name));
+ } //end func setName
+
+ // }}}
+ // {{{ getName()
+
+ /**
+ * Returns the element name
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function getName()
+ {
+ return $this->getAttribute('name');
+ } //end func getName
+
+ // }}}
+ // {{{ setValue()
+
+ /**
+ * Sets the value of the form element
+ *
+ * @param string $value Default value of the form element
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setValue($value)
+ {
+ $this->updateAttributes(array('value'=>$value));
+ } // end func setValue
+
+ // }}}
+ // {{{ getValue()
+
+ /**
+ * Returns the value of the form element
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function getValue()
+ {
+ return $this->getAttribute('value');
+ } // end func getValue
+
+ // }}}
+ // {{{ toHtml()
+
+ /**
+ * Returns the input field in HTML
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function toHtml()
+ {
+ if ($this->_flagFrozen) {
+ return $this->getFrozenHtml();
+ } else {
+ return $this->_getTabs() . '<input' . $this->_getAttrString($this->_attributes) . ' />';
+ }
+ } //end func toHtml
+
+ // }}}
+ // {{{ onQuickFormEvent()
+
+ /**
+ * Called by HTML_QuickForm whenever form event is made on this element
+ *
+ * @param string $event Name of event
+ * @param mixed $arg event arguments
+ * @param object &$caller calling object
+ * @since 1.0
+ * @access public
+ * @return void
+ * @throws
+ */
+ function onQuickFormEvent($event, $arg, &$caller)
+ {
+ // do not use submit values for button-type elements
+ $type = $this->getType();
+ if (('updateValue' != $event) ||
+ ('submit' != $type && 'reset' != $type && 'image' != $type && 'button' != $type)) {
+ parent::onQuickFormEvent($event, $arg, $caller);
+ } else {
+ $value = $this->_findValue($caller->_constantValues);
+ if (null === $value) {
+ $value = $this->_findValue($caller->_defaultValues);
+ }
+ if (null !== $value) {
+ $this->setValue($value);
+ }
+ }
+ return true;
+ } // end func onQuickFormEvent
+
+ // }}}
+ // {{{ exportValue()
+
+ /**
+ * We don't need values from button-type elements (except submit) and files
+ */
+ function exportValue(&$submitValues, $assoc = false)
+ {
+ $type = $this->getType();
+ if ('reset' == $type || 'image' == $type || 'button' == $type || 'file' == $type) {
+ return null;
+ } else {
+ return parent::exportValue($submitValues, $assoc);
+ }
+ }
+
+ // }}}
+} // end class HTML_QuickForm_element
+?>
diff --git a/libs/HTML/QuickForm/link.php b/libs/HTML/QuickForm/link.php
new file mode 100755
index 0000000000..fd39cceea1
--- /dev/null
+++ b/libs/HTML/QuickForm/link.php
@@ -0,0 +1,200 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for a link type field
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: link.php,v 1.3 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * HTML class for static data
+ */
+require_once 'HTML/QuickForm/static.php';
+
+/**
+ * HTML class for a link type field
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 2.0
+ */
+class HTML_QuickForm_link extends HTML_QuickForm_static
+{
+ // {{{ properties
+
+ /**
+ * Link display text
+ * @var string
+ * @since 1.0
+ * @access private
+ */
+ var $_text = "";
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string $elementLabel (optional)Link label
+ * @param string $href (optional)Link href
+ * @param string $text (optional)Link display text
+ * @param mixed $attributes (optional)Either a typical HTML attribute string
+ * or an associative array
+ * @since 1.0
+ * @access public
+ * @return void
+ * @throws
+ */
+ function HTML_QuickForm_link($elementName=null, $elementLabel=null, $href=null, $text=null, $attributes=null)
+ {
+ HTML_QuickForm_element::HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+ $this->_persistantFreeze = false;
+ $this->_type = 'link';
+ $this->setHref($href);
+ $this->_text = $text;
+ } //end constructor
+
+ // }}}
+ // {{{ setName()
+
+ /**
+ * Sets the input field name
+ *
+ * @param string $name Input field name attribute
+ * @since 1.0
+ * @access public
+ * @return void
+ * @throws
+ */
+ function setName($name)
+ {
+ $this->updateAttributes(array('name'=>$name));
+ } //end func setName
+
+ // }}}
+ // {{{ getName()
+
+ /**
+ * Returns the element name
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ * @throws
+ */
+ function getName()
+ {
+ return $this->getAttribute('name');
+ } //end func getName
+
+ // }}}
+ // {{{ setValue()
+
+ /**
+ * Sets value for textarea element
+ *
+ * @param string $value Value for password element
+ * @since 1.0
+ * @access public
+ * @return void
+ * @throws
+ */
+ function setValue($value)
+ {
+ return;
+ } //end func setValue
+
+ // }}}
+ // {{{ getValue()
+
+ /**
+ * Returns the value of the form element
+ *
+ * @since 1.0
+ * @access public
+ * @return void
+ * @throws
+ */
+ function getValue()
+ {
+ return;
+ } // end func getValue
+
+
+ // }}}
+ // {{{ setHref()
+
+ /**
+ * Sets the links href
+ *
+ * @param string $href
+ * @since 1.0
+ * @access public
+ * @return void
+ * @throws
+ */
+ function setHref($href)
+ {
+ $this->updateAttributes(array('href'=>$href));
+ } // end func setHref
+
+ // }}}
+ // {{{ toHtml()
+
+ /**
+ * Returns the textarea element in HTML
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ * @throws
+ */
+ function toHtml()
+ {
+ $tabs = $this->_getTabs();
+ $html = "$tabs<a".$this->_getAttrString($this->_attributes).">";
+ $html .= $this->_text;
+ $html .= "</a>";
+ return $html;
+ } //end func toHtml
+
+ // }}}
+ // {{{ getFrozenHtml()
+
+ /**
+ * Returns the value of field without HTML tags (in this case, value is changed to a mask)
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ * @throws
+ */
+ function getFrozenHtml()
+ {
+ return;
+ } //end func getFrozenHtml
+
+ // }}}
+
+} //end class HTML_QuickForm_textarea
+?>
diff --git a/libs/HTML/QuickForm/password.php b/libs/HTML/QuickForm/password.php
new file mode 100755
index 0000000000..a848aa0ac3
--- /dev/null
+++ b/libs/HTML/QuickForm/password.php
@@ -0,0 +1,115 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for a password type field
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: password.php,v 1.7 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for <input /> form elements
+ */
+require_once 'HTML/QuickForm/input.php';
+
+/**
+ * HTML class for a password type field
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 1.0
+ */
+class HTML_QuickForm_password extends HTML_QuickForm_input
+{
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string $elementName (optional)Input field name attribute
+ * @param string $elementLabel (optional)Input field label
+ * @param mixed $attributes (optional)Either a typical HTML attribute string
+ * or an associative array
+ * @since 1.0
+ * @access public
+ * @return void
+ * @throws
+ */
+ function HTML_QuickForm_password($elementName=null, $elementLabel=null, $attributes=null)
+ {
+ HTML_QuickForm_input::HTML_QuickForm_input($elementName, $elementLabel, $attributes);
+ $this->setType('password');
+ } //end constructor
+
+ // }}}
+ // {{{ setSize()
+
+ /**
+ * Sets size of password element
+ *
+ * @param string $size Size of password field
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setSize($size)
+ {
+ $this->updateAttributes(array('size'=>$size));
+ } //end func setSize
+
+ // }}}
+ // {{{ setMaxlength()
+
+ /**
+ * Sets maxlength of password element
+ *
+ * @param string $maxlength Maximum length of password field
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setMaxlength($maxlength)
+ {
+ $this->updateAttributes(array('maxlength'=>$maxlength));
+ } //end func setMaxlength
+
+ // }}}
+ // {{{ getFrozenHtml()
+
+ /**
+ * Returns the value of field without HTML tags (in this case, value is changed to a mask)
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ * @throws
+ */
+ function getFrozenHtml()
+ {
+ $value = $this->getValue();
+ return ('' != $value? '**********': '&nbsp;') .
+ $this->_getPersistantData();
+ } //end func getFrozenHtml
+
+ // }}}
+
+} //end class HTML_QuickForm_password
+?>
diff --git a/libs/HTML/QuickForm/radio.php b/libs/HTML/QuickForm/radio.php
new file mode 100755
index 0000000000..a90f199536
--- /dev/null
+++ b/libs/HTML/QuickForm/radio.php
@@ -0,0 +1,251 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for a radio type element
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: radio.php,v 1.19 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for <input /> form elements
+ */
+require_once 'HTML/QuickForm/input.php';
+
+/**
+ * HTML class for a radio type element
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 1.0
+ */
+class HTML_QuickForm_radio extends HTML_QuickForm_input
+{
+ // {{{ properties
+
+ /**
+ * Radio display text
+ * @var string
+ * @since 1.1
+ * @access private
+ */
+ var $_text = '';
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string Input field name attribute
+ * @param mixed Label(s) for a field
+ * @param string Text to display near the radio
+ * @param string Input field value
+ * @param mixed Either a typical HTML attribute string or an associative array
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_radio($elementName=null, $elementLabel=null, $text=null, $value=null, $attributes=null)
+ {
+ $this->HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+ if (isset($value)) {
+ $this->setValue($value);
+ }
+ $this->_persistantFreeze = true;
+ $this->setType('radio');
+ $this->_text = $text;
+ $this->_generateId();
+ } //end constructor
+
+ // }}}
+ // {{{ setChecked()
+
+ /**
+ * Sets whether radio button is checked
+ *
+ * @param bool $checked Whether the field is checked or not
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setChecked($checked)
+ {
+ if (!$checked) {
+ $this->removeAttribute('checked');
+ } else {
+ $this->updateAttributes(array('checked'=>'checked'));
+ }
+ } //end func setChecked
+
+ // }}}
+ // {{{ getChecked()
+
+ /**
+ * Returns whether radio button is checked
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function getChecked()
+ {
+ return $this->getAttribute('checked');
+ } //end func getChecked
+
+ // }}}
+ // {{{ toHtml()
+
+ /**
+ * Returns the radio element in HTML
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function toHtml()
+ {
+ if (0 == strlen($this->_text)) {
+ $label = '';
+ } elseif ($this->_flagFrozen) {
+ $label = $this->_text;
+ } else {
+ $label = '<label for="' . $this->getAttribute('id') . '">' . $this->_text . '</label>';
+ }
+ return HTML_QuickForm_input::toHtml() . $label;
+ } //end func toHtml
+
+ // }}}
+ // {{{ getFrozenHtml()
+
+ /**
+ * Returns the value of field without HTML tags
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function getFrozenHtml()
+ {
+ if ($this->getChecked()) {
+ return '<tt>(x)</tt>' .
+ $this->_getPersistantData();
+ } else {
+ return '<tt>( )</tt>';
+ }
+ } //end func getFrozenHtml
+
+ // }}}
+ // {{{ setText()
+
+ /**
+ * Sets the radio text
+ *
+ * @param string $text Text to display near the radio button
+ * @since 1.1
+ * @access public
+ * @return void
+ */
+ function setText($text)
+ {
+ $this->_text = $text;
+ } //end func setText
+
+ // }}}
+ // {{{ getText()
+
+ /**
+ * Returns the radio text
+ *
+ * @since 1.1
+ * @access public
+ * @return string
+ */
+ function getText()
+ {
+ return $this->_text;
+ } //end func getText
+
+ // }}}
+ // {{{ onQuickFormEvent()
+
+ /**
+ * Called by HTML_QuickForm whenever form event is made on this element
+ *
+ * @param string $event Name of event
+ * @param mixed $arg event arguments
+ * @param object &$caller calling object
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function onQuickFormEvent($event, $arg, &$caller)
+ {
+ switch ($event) {
+ case 'updateValue':
+ // constant values override both default and submitted ones
+ // default values are overriden by submitted
+ $value = $this->_findValue($caller->_constantValues);
+ if (null === $value) {
+ $value = $this->_findValue($caller->_submitValues);
+ if (null === $value) {
+ $value = $this->_findValue($caller->_defaultValues);
+ }
+ }
+ if (!is_null($value) && $value == $this->getValue()) {
+ $this->setChecked(true);
+ } else {
+ $this->setChecked(false);
+ }
+ break;
+ case 'setGroupValue':
+ if ($arg == $this->getValue()) {
+ $this->setChecked(true);
+ } else {
+ $this->setChecked(false);
+ }
+ break;
+ default:
+ parent::onQuickFormEvent($event, $arg, $caller);
+ }
+ return true;
+ } // end func onQuickFormLoad
+
+ // }}}
+ // {{{ exportValue()
+
+ /**
+ * Returns the value attribute if the radio is checked, null if it is not
+ */
+ function exportValue(&$submitValues, $assoc = false)
+ {
+ $value = $this->_findValue($submitValues);
+ if (null === $value) {
+ $value = $this->getChecked()? $this->getValue(): null;
+ } elseif ($value != $this->getValue()) {
+ $value = null;
+ }
+ return $this->_prepareValue($value, $assoc);
+ }
+
+ // }}}
+} //end class HTML_QuickForm_radio
+?>
diff --git a/libs/HTML/QuickForm/reset.php b/libs/HTML/QuickForm/reset.php
new file mode 100755
index 0000000000..2f43a24b11
--- /dev/null
+++ b/libs/HTML/QuickForm/reset.php
@@ -0,0 +1,79 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for a reset type element
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: reset.php,v 1.5 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for <input /> form elements
+ */
+require_once 'HTML/QuickForm/input.php';
+
+/**
+ * HTML class for a reset type element
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 1.0
+ */
+class HTML_QuickForm_reset extends HTML_QuickForm_input
+{
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string $elementName (optional)Input field name attribute
+ * @param string $value (optional)Input field value
+ * @param mixed $attributes (optional)Either a typical HTML attribute string
+ * or an associative array
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_reset($elementName=null, $value=null, $attributes=null)
+ {
+ HTML_QuickForm_input::HTML_QuickForm_input($elementName, null, $attributes);
+ $this->setValue($value);
+ $this->setType('reset');
+ } //end constructor
+
+ // }}}
+ // {{{ freeze()
+
+ /**
+ * Freeze the element so that only its value is returned
+ *
+ * @access public
+ * @return void
+ */
+ function freeze()
+ {
+ return false;
+ } //end func freeze
+
+ // }}}
+
+} //end class HTML_QuickForm_reset
+?>
diff --git a/libs/HTML/QuickForm/select.php b/libs/HTML/QuickForm/select.php
new file mode 100755
index 0000000000..9c5108ab31
--- /dev/null
+++ b/libs/HTML/QuickForm/select.php
@@ -0,0 +1,614 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Class to dynamically create an HTML SELECT
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: select.php,v 1.33 2007/06/03 15:01:00 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for form elements
+ */
+require_once 'HTML/QuickForm/element.php';
+
+/**
+ * Class to dynamically create an HTML SELECT
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ * @since 1.0
+ */
+class HTML_QuickForm_select extends HTML_QuickForm_element {
+
+ // {{{ properties
+
+ /**
+ * Contains the select options
+ *
+ * @var array
+ * @since 1.0
+ * @access private
+ */
+ var $_options = array();
+
+ /**
+ * Default values of the SELECT
+ *
+ * @var string
+ * @since 1.0
+ * @access private
+ */
+ var $_values = null;
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string Select name attribute
+ * @param mixed Label(s) for the select
+ * @param mixed Data to be used to populate options
+ * @param mixed Either a typical HTML attribute string or an associative array
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_select($elementName=null, $elementLabel=null, $options=null, $attributes=null)
+ {
+ HTML_QuickForm_element::HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+ $this->_persistantFreeze = true;
+ $this->_type = 'select';
+ if (isset($options)) {
+ $this->load($options);
+ }
+ } //end constructor
+
+ // }}}
+ // {{{ apiVersion()
+
+ /**
+ * Returns the current API version
+ *
+ * @since 1.0
+ * @access public
+ * @return double
+ */
+ function apiVersion()
+ {
+ return 2.3;
+ } //end func apiVersion
+
+ // }}}
+ // {{{ setSelected()
+
+ /**
+ * Sets the default values of the select box
+ *
+ * @param mixed $values Array or comma delimited string of selected values
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setSelected($values)
+ {
+ if (is_string($values) && $this->getMultiple()) {
+ $values = split("[ ]?,[ ]?", $values);
+ }
+ if (is_array($values)) {
+ $this->_values = array_values($values);
+ } else {
+ $this->_values = array($values);
+ }
+ } //end func setSelected
+
+ // }}}
+ // {{{ getSelected()
+
+ /**
+ * Returns an array of the selected values
+ *
+ * @since 1.0
+ * @access public
+ * @return array of selected values
+ */
+ function getSelected()
+ {
+ return $this->_values;
+ } // end func getSelected
+
+ // }}}
+ // {{{ setName()
+
+ /**
+ * Sets the input field name
+ *
+ * @param string $name Input field name attribute
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setName($name)
+ {
+ $this->updateAttributes(array('name' => $name));
+ } //end func setName
+
+ // }}}
+ // {{{ getName()
+
+ /**
+ * Returns the element name
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function getName()
+ {
+ return $this->getAttribute('name');
+ } //end func getName
+
+ // }}}
+ // {{{ getPrivateName()
+
+ /**
+ * Returns the element name (possibly with brackets appended)
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function getPrivateName()
+ {
+ if ($this->getAttribute('multiple')) {
+ return $this->getName() . '[]';
+ } else {
+ return $this->getName();
+ }
+ } //end func getPrivateName
+
+ // }}}
+ // {{{ setValue()
+
+ /**
+ * Sets the value of the form element
+ *
+ * @param mixed $values Array or comma delimited string of selected values
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setValue($value)
+ {
+ $this->setSelected($value);
+ } // end func setValue
+
+ // }}}
+ // {{{ getValue()
+
+ /**
+ * Returns an array of the selected values
+ *
+ * @since 1.0
+ * @access public
+ * @return array of selected values
+ */
+ function getValue()
+ {
+ return $this->_values;
+ } // end func getValue
+
+ // }}}
+ // {{{ setSize()
+
+ /**
+ * Sets the select field size, only applies to 'multiple' selects
+ *
+ * @param int $size Size of select field
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setSize($size)
+ {
+ $this->updateAttributes(array('size' => $size));
+ } //end func setSize
+
+ // }}}
+ // {{{ getSize()
+
+ /**
+ * Returns the select field size
+ *
+ * @since 1.0
+ * @access public
+ * @return int
+ */
+ function getSize()
+ {
+ return $this->getAttribute('size');
+ } //end func getSize
+
+ // }}}
+ // {{{ setMultiple()
+
+ /**
+ * Sets the select mutiple attribute
+ *
+ * @param bool $multiple Whether the select supports multi-selections
+ * @since 1.2
+ * @access public
+ * @return void
+ */
+ function setMultiple($multiple)
+ {
+ if ($multiple) {
+ $this->updateAttributes(array('multiple' => 'multiple'));
+ } else {
+ $this->removeAttribute('multiple');
+ }
+ } //end func setMultiple
+
+ // }}}
+ // {{{ getMultiple()
+
+ /**
+ * Returns the select mutiple attribute
+ *
+ * @since 1.2
+ * @access public
+ * @return bool true if multiple select, false otherwise
+ */
+ function getMultiple()
+ {
+ return (bool)$this->getAttribute('multiple');
+ } //end func getMultiple
+
+ // }}}
+ // {{{ addOption()
+
+ /**
+ * Adds a new OPTION to the SELECT
+ *
+ * @param string $text Display text for the OPTION
+ * @param string $value Value for the OPTION
+ * @param mixed $attributes Either a typical HTML attribute string
+ * or an associative array
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function addOption($text, $value, $attributes=null)
+ {
+ if (null === $attributes) {
+ $attributes = array('value' => (string)$value);
+ } else {
+ $attributes = $this->_parseAttributes($attributes);
+ if (isset($attributes['selected'])) {
+ // the 'selected' attribute will be set in toHtml()
+ $this->_removeAttr('selected', $attributes);
+ if (is_null($this->_values)) {
+ $this->_values = array($value);
+ } elseif (!in_array($value, $this->_values)) {
+ $this->_values[] = $value;
+ }
+ }
+ $this->_updateAttrArray($attributes, array('value' => (string)$value));
+ }
+ $this->_options[] = array('text' => $text, 'attr' => $attributes);
+ } // end func addOption
+
+ // }}}
+ // {{{ loadArray()
+
+ /**
+ * Loads the options from an associative array
+ *
+ * @param array $arr Associative array of options
+ * @param mixed $values (optional) Array or comma delimited string of selected values
+ * @since 1.0
+ * @access public
+ * @return PEAR_Error on error or true
+ * @throws PEAR_Error
+ */
+ function loadArray($arr, $values=null)
+ {
+ if (!is_array($arr)) {
+ return PEAR::raiseError('Argument 1 of HTML_Select::loadArray is not a valid array');
+ }
+ if (isset($values)) {
+ $this->setSelected($values);
+ }
+ foreach ($arr as $key => $val) {
+ // Warning: new API since release 2.3
+ $this->addOption($val, $key);
+ }
+ return true;
+ } // end func loadArray
+
+ // }}}
+ // {{{ loadDbResult()
+
+ /**
+ * Loads the options from DB_result object
+ *
+ * If no column names are specified the first two columns of the result are
+ * used as the text and value columns respectively
+ * @param object $result DB_result object
+ * @param string $textCol (optional) Name of column to display as the OPTION text
+ * @param string $valueCol (optional) Name of column to use as the OPTION value
+ * @param mixed $values (optional) Array or comma delimited string of selected values
+ * @since 1.0
+ * @access public
+ * @return PEAR_Error on error or true
+ * @throws PEAR_Error
+ */
+ function loadDbResult(&$result, $textCol=null, $valueCol=null, $values=null)
+ {
+ if (!is_object($result) || !is_a($result, 'db_result')) {
+ return PEAR::raiseError('Argument 1 of HTML_Select::loadDbResult is not a valid DB_result');
+ }
+ if (isset($values)) {
+ $this->setValue($values);
+ }
+ $fetchMode = ($textCol && $valueCol) ? DB_FETCHMODE_ASSOC : DB_FETCHMODE_ORDERED;
+ while (is_array($row = $result->fetchRow($fetchMode)) ) {
+ if ($fetchMode == DB_FETCHMODE_ASSOC) {
+ $this->addOption($row[$textCol], $row[$valueCol]);
+ } else {
+ $this->addOption($row[0], $row[1]);
+ }
+ }
+ return true;
+ } // end func loadDbResult
+
+ // }}}
+ // {{{ loadQuery()
+
+ /**
+ * Queries a database and loads the options from the results
+ *
+ * @param mixed $conn Either an existing DB connection or a valid dsn
+ * @param string $sql SQL query string
+ * @param string $textCol (optional) Name of column to display as the OPTION text
+ * @param string $valueCol (optional) Name of column to use as the OPTION value
+ * @param mixed $values (optional) Array or comma delimited string of selected values
+ * @since 1.1
+ * @access public
+ * @return void
+ * @throws PEAR_Error
+ */
+ function loadQuery(&$conn, $sql, $textCol=null, $valueCol=null, $values=null)
+ {
+ if (is_string($conn)) {
+ require_once('DB.php');
+ $dbConn = &DB::connect($conn, true);
+ if (DB::isError($dbConn)) {
+ return $dbConn;
+ }
+ } elseif (is_subclass_of($conn, "db_common")) {
+ $dbConn = &$conn;
+ } else {
+ return PEAR::raiseError('Argument 1 of HTML_Select::loadQuery is not a valid type');
+ }
+ $result = $dbConn->query($sql);
+ if (DB::isError($result)) {
+ return $result;
+ }
+ $this->loadDbResult($result, $textCol, $valueCol, $values);
+ $result->free();
+ if (is_string($conn)) {
+ $dbConn->disconnect();
+ }
+ return true;
+ } // end func loadQuery
+
+ // }}}
+ // {{{ load()
+
+ /**
+ * Loads options from different types of data sources
+ *
+ * This method is a simulated overloaded method. The arguments, other than the
+ * first are optional and only mean something depending on the type of the first argument.
+ * If the first argument is an array then all arguments are passed in order to loadArray.
+ * If the first argument is a db_result then all arguments are passed in order to loadDbResult.
+ * If the first argument is a string or a DB connection then all arguments are
+ * passed in order to loadQuery.
+ * @param mixed $options Options source currently supports assoc array or DB_result
+ * @param mixed $param1 (optional) See function detail
+ * @param mixed $param2 (optional) See function detail
+ * @param mixed $param3 (optional) See function detail
+ * @param mixed $param4 (optional) See function detail
+ * @since 1.1
+ * @access public
+ * @return PEAR_Error on error or true
+ * @throws PEAR_Error
+ */
+ function load(&$options, $param1=null, $param2=null, $param3=null, $param4=null)
+ {
+ switch (true) {
+ case is_array($options):
+ return $this->loadArray($options, $param1);
+ break;
+ case (is_a($options, 'db_result')):
+ return $this->loadDbResult($options, $param1, $param2, $param3);
+ break;
+ case (is_string($options) && !empty($options) || is_subclass_of($options, "db_common")):
+ return $this->loadQuery($options, $param1, $param2, $param3, $param4);
+ break;
+ }
+ } // end func load
+
+ // }}}
+ // {{{ toHtml()
+
+ /**
+ * Returns the SELECT in HTML
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function toHtml()
+ {
+ if ($this->_flagFrozen) {
+ return $this->getFrozenHtml();
+ } else {
+ $tabs = $this->_getTabs();
+ $strHtml = '';
+
+ if ($this->getComment() != '') {
+ $strHtml .= $tabs . '<!-- ' . $this->getComment() . " //-->\n";
+ }
+
+ if (!$this->getMultiple()) {
+ $attrString = $this->_getAttrString($this->_attributes);
+ } else {
+ $myName = $this->getName();
+ $this->setName($myName . '[]');
+ $attrString = $this->_getAttrString($this->_attributes);
+ $this->setName($myName);
+ }
+ $strHtml .= $tabs . '<select' . $attrString . ">\n";
+
+ $strValues = is_array($this->_values)? array_map('strval', $this->_values): array();
+ foreach ($this->_options as $option) {
+ if (!empty($strValues) && in_array($option['attr']['value'], $strValues, true)) {
+ $option['attr']['selected'] = 'selected';
+ }
+ $strHtml .= $tabs . "\t<option" . $this->_getAttrString($option['attr']) . '>' .
+ $option['text'] . "</option>\n";
+ }
+
+ return $strHtml . $tabs . '</select>';
+ }
+ } //end func toHtml
+
+ // }}}
+ // {{{ getFrozenHtml()
+
+ /**
+ * Returns the value of field without HTML tags
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function getFrozenHtml()
+ {
+ $value = array();
+ if (is_array($this->_values)) {
+ foreach ($this->_values as $key => $val) {
+ for ($i = 0, $optCount = count($this->_options); $i < $optCount; $i++) {
+ if (0 == strcmp($val, $this->_options[$i]['attr']['value'])) {
+ $value[$key] = $this->_options[$i]['text'];
+ break;
+ }
+ }
+ }
+ }
+ $html = empty($value)? '&nbsp;': join('<br />', $value);
+ if ($this->_persistantFreeze) {
+ $name = $this->getPrivateName();
+ // Only use id attribute if doing single hidden input
+ if (1 == count($value)) {
+ $id = $this->getAttribute('id');
+ $idAttr = isset($id)? array('id' => $id): array();
+ } else {
+ $idAttr = array();
+ }
+ foreach ($value as $key => $item) {
+ $html .= '<input' . $this->_getAttrString(array(
+ 'type' => 'hidden',
+ 'name' => $name,
+ 'value' => $this->_values[$key]
+ ) + $idAttr) . ' />';
+ }
+ }
+ return $html;
+ } //end func getFrozenHtml
+
+ // }}}
+ // {{{ exportValue()
+
+ /**
+ * We check the options and return only the values that _could_ have been
+ * selected. We also return a scalar value if select is not "multiple"
+ */
+ function exportValue(&$submitValues, $assoc = false)
+ {
+ $value = $this->_findValue($submitValues);
+ if (is_null($value)) {
+ $value = $this->getValue();
+ } elseif(!is_array($value)) {
+ $value = array($value);
+ }
+ if (is_array($value) && !empty($this->_options)) {
+ $cleanValue = null;
+ foreach ($value as $v) {
+ for ($i = 0, $optCount = count($this->_options); $i < $optCount; $i++) {
+ if (0 == strcmp($v, $this->_options[$i]['attr']['value'])) {
+ $cleanValue[] = $v;
+ break;
+ }
+ }
+ }
+ } else {
+ $cleanValue = $value;
+ }
+ if (is_array($cleanValue) && !$this->getMultiple()) {
+ return $this->_prepareValue($cleanValue[0], $assoc);
+ } else {
+ return $this->_prepareValue($cleanValue, $assoc);
+ }
+ }
+
+ // }}}
+ // {{{ onQuickFormEvent()
+
+ function onQuickFormEvent($event, $arg, &$caller)
+ {
+ if ('updateValue' == $event) {
+ $value = $this->_findValue($caller->_constantValues);
+ if (null === $value) {
+ $value = $this->_findValue($caller->_submitValues);
+ // Fix for bug #4465 & #5269
+ // XXX: should we push this to element::onQuickFormEvent()?
+ if (null === $value && (!$caller->isSubmitted() || !$this->getMultiple())) {
+ $value = $this->_findValue($caller->_defaultValues);
+ }
+ }
+ if (null !== $value) {
+ $this->setValue($value);
+ }
+ return true;
+ } else {
+ return parent::onQuickFormEvent($event, $arg, $caller);
+ }
+ }
+
+ // }}}
+} //end class HTML_QuickForm_select
+?>
diff --git a/libs/HTML/QuickForm/static.php b/libs/HTML/QuickForm/static.php
new file mode 100755
index 0000000000..02875e6109
--- /dev/null
+++ b/libs/HTML/QuickForm/static.php
@@ -0,0 +1,201 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for static data
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Wojciech Gdela <eltehaem@poczta.onet.pl>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: static.php,v 1.7 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for form elements
+ */
+require_once 'HTML/QuickForm/element.php';
+
+/**
+ * HTML class for static data
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Wojciech Gdela <eltehaem@poczta.onet.pl>
+ * @version Release: 3.2.9
+ * @since 2.7
+ */
+class HTML_QuickForm_static extends HTML_QuickForm_element {
+
+ // {{{ properties
+
+ /**
+ * Display text
+ * @var string
+ * @access private
+ */
+ var $_text = null;
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string $elementLabel (optional)Label
+ * @param string $text (optional)Display text
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_static($elementName=null, $elementLabel=null, $text=null)
+ {
+ HTML_QuickForm_element::HTML_QuickForm_element($elementName, $elementLabel);
+ $this->_persistantFreeze = false;
+ $this->_type = 'static';
+ $this->_text = $text;
+ } //end constructor
+
+ // }}}
+ // {{{ setName()
+
+ /**
+ * Sets the element name
+ *
+ * @param string $name Element name
+ * @access public
+ * @return void
+ */
+ function setName($name)
+ {
+ $this->updateAttributes(array('name'=>$name));
+ } //end func setName
+
+ // }}}
+ // {{{ getName()
+
+ /**
+ * Returns the element name
+ *
+ * @access public
+ * @return string
+ */
+ function getName()
+ {
+ return $this->getAttribute('name');
+ } //end func getName
+
+ // }}}
+ // {{{ setText()
+
+ /**
+ * Sets the text
+ *
+ * @param string $text
+ * @access public
+ * @return void
+ */
+ function setText($text)
+ {
+ $this->_text = $text;
+ } // end func setText
+
+ // }}}
+ // {{{ setValue()
+
+ /**
+ * Sets the text (uses the standard setValue call to emulate a form element.
+ *
+ * @param string $text
+ * @access public
+ * @return void
+ */
+ function setValue($text)
+ {
+ $this->setText($text);
+ } // end func setValue
+
+ // }}}
+ // {{{ toHtml()
+
+ /**
+ * Returns the static text element in HTML
+ *
+ * @access public
+ * @return string
+ */
+ function toHtml()
+ {
+ return $this->_getTabs() . $this->_text;
+ } //end func toHtml
+
+ // }}}
+ // {{{ getFrozenHtml()
+
+ /**
+ * Returns the value of field without HTML tags
+ *
+ * @access public
+ * @return string
+ */
+ function getFrozenHtml()
+ {
+ return $this->toHtml();
+ } //end func getFrozenHtml
+
+ // }}}
+ // {{{ onQuickFormEvent()
+
+ /**
+ * Called by HTML_QuickForm whenever form event is made on this element
+ *
+ * @param string $event Name of event
+ * @param mixed $arg event arguments
+ * @param object &$caller calling object
+ * @since 1.0
+ * @access public
+ * @return void
+ * @throws
+ */
+ function onQuickFormEvent($event, $arg, &$caller)
+ {
+ switch ($event) {
+ case 'updateValue':
+ // do NOT use submitted values for static elements
+ $value = $this->_findValue($caller->_constantValues);
+ if (null === $value) {
+ $value = $this->_findValue($caller->_defaultValues);
+ }
+ if (null !== $value) {
+ $this->setValue($value);
+ }
+ break;
+ default:
+ parent::onQuickFormEvent($event, $arg, $caller);
+ }
+ return true;
+ } // end func onQuickFormEvent
+
+ // }}}
+ // {{{ exportValue()
+
+ /**
+ * We override this here because we don't want any values from static elements
+ */
+ function exportValue(&$submitValues, $assoc = false)
+ {
+ return null;
+ }
+
+ // }}}
+} //end class HTML_QuickForm_static
+?>
diff --git a/libs/HTML/QuickForm/submit.php b/libs/HTML/QuickForm/submit.php
new file mode 100755
index 0000000000..53156f993d
--- /dev/null
+++ b/libs/HTML/QuickForm/submit.php
@@ -0,0 +1,89 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for a submit type element
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: submit.php,v 1.5 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for <input /> form elements
+ */
+require_once 'HTML/QuickForm/input.php';
+
+/**
+ * HTML class for a submit type element
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 1.0
+ */
+class HTML_QuickForm_submit extends HTML_QuickForm_input
+{
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string Input field name attribute
+ * @param string Input field value
+ * @param mixed Either a typical HTML attribute string or an associative array
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_submit($elementName=null, $value=null, $attributes=null)
+ {
+ HTML_QuickForm_input::HTML_QuickForm_input($elementName, null, $attributes);
+ $this->setValue($value);
+ $this->setType('submit');
+ } //end constructor
+
+ // }}}
+ // {{{ freeze()
+
+ /**
+ * Freeze the element so that only its value is returned
+ *
+ * @access public
+ * @return void
+ */
+ function freeze()
+ {
+ return false;
+ } //end func freeze
+
+ // }}}
+ // {{{ exportValue()
+
+ /**
+ * Only return the value if it is found within $submitValues (i.e. if
+ * this particular submit button was clicked)
+ */
+ function exportValue(&$submitValues, $assoc = false)
+ {
+ return $this->_prepareValue($this->_findValue($submitValues), $assoc);
+ }
+
+ // }}}
+} //end class HTML_QuickForm_submit
+?>
diff --git a/libs/HTML/QuickForm/text.php b/libs/HTML/QuickForm/text.php
new file mode 100755
index 0000000000..cb1c10a254
--- /dev/null
+++ b/libs/HTML/QuickForm/text.php
@@ -0,0 +1,98 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for a text field
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: text.php,v 1.6 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for <input /> form elements
+ */
+require_once 'HTML/QuickForm/input.php';
+
+/**
+ * HTML class for a text field
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 1.0
+ */
+class HTML_QuickForm_text extends HTML_QuickForm_input
+{
+
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string $elementName (optional)Input field name attribute
+ * @param string $elementLabel (optional)Input field label
+ * @param mixed $attributes (optional)Either a typical HTML attribute string
+ * or an associative array
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_text($elementName=null, $elementLabel=null, $attributes=null)
+ {
+ HTML_QuickForm_input::HTML_QuickForm_input($elementName, $elementLabel, $attributes);
+ $this->_persistantFreeze = true;
+ $this->setType('text');
+ } //end constructor
+
+ // }}}
+ // {{{ setSize()
+
+ /**
+ * Sets size of text field
+ *
+ * @param string $size Size of text field
+ * @since 1.3
+ * @access public
+ * @return void
+ */
+ function setSize($size)
+ {
+ $this->updateAttributes(array('size'=>$size));
+ } //end func setSize
+
+ // }}}
+ // {{{ setMaxlength()
+
+ /**
+ * Sets maxlength of text field
+ *
+ * @param string $maxlength Maximum length of text field
+ * @since 1.3
+ * @access public
+ * @return void
+ */
+ function setMaxlength($maxlength)
+ {
+ $this->updateAttributes(array('maxlength'=>$maxlength));
+ } //end func setMaxlength
+
+ // }}}
+
+} //end class HTML_QuickForm_text
+?>
diff --git a/libs/HTML/QuickForm/textarea.php b/libs/HTML/QuickForm/textarea.php
new file mode 100755
index 0000000000..4e72b59eee
--- /dev/null
+++ b/libs/HTML/QuickForm/textarea.php
@@ -0,0 +1,229 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTML class for a textarea type field
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: textarea.php,v 1.12 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for form elements
+ */
+require_once 'HTML/QuickForm/element.php';
+
+/**
+ * HTML class for a textarea type field
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Adam Daniel <adaniel1@eesus.jnj.com>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @version Release: 3.2.9
+ * @since 1.0
+ */
+class HTML_QuickForm_textarea extends HTML_QuickForm_element
+{
+ // {{{ properties
+
+ /**
+ * Field value
+ * @var string
+ * @since 1.0
+ * @access private
+ */
+ var $_value = null;
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Class constructor
+ *
+ * @param string Input field name attribute
+ * @param mixed Label(s) for a field
+ * @param mixed Either a typical HTML attribute string or an associative array
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function HTML_QuickForm_textarea($elementName=null, $elementLabel=null, $attributes=null)
+ {
+ HTML_QuickForm_element::HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+ $this->_persistantFreeze = true;
+ $this->_type = 'textarea';
+ } //end constructor
+
+ // }}}
+ // {{{ setName()
+
+ /**
+ * Sets the input field name
+ *
+ * @param string $name Input field name attribute
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setName($name)
+ {
+ $this->updateAttributes(array('name'=>$name));
+ } //end func setName
+
+ // }}}
+ // {{{ getName()
+
+ /**
+ * Returns the element name
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function getName()
+ {
+ return $this->getAttribute('name');
+ } //end func getName
+
+ // }}}
+ // {{{ setValue()
+
+ /**
+ * Sets value for textarea element
+ *
+ * @param string $value Value for textarea element
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setValue($value)
+ {
+ $this->_value = $value;
+ } //end func setValue
+
+ // }}}
+ // {{{ getValue()
+
+ /**
+ * Returns the value of the form element
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function getValue()
+ {
+ return $this->_value;
+ } // end func getValue
+
+ // }}}
+ // {{{ setWrap()
+
+ /**
+ * Sets wrap type for textarea element
+ *
+ * @param string $wrap Wrap type
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setWrap($wrap)
+ {
+ $this->updateAttributes(array('wrap' => $wrap));
+ } //end func setWrap
+
+ // }}}
+ // {{{ setRows()
+
+ /**
+ * Sets height in rows for textarea element
+ *
+ * @param string $rows Height expressed in rows
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setRows($rows)
+ {
+ $this->updateAttributes(array('rows' => $rows));
+ } //end func setRows
+
+ // }}}
+ // {{{ setCols()
+
+ /**
+ * Sets width in cols for textarea element
+ *
+ * @param string $cols Width expressed in cols
+ * @since 1.0
+ * @access public
+ * @return void
+ */
+ function setCols($cols)
+ {
+ $this->updateAttributes(array('cols' => $cols));
+ } //end func setCols
+
+ // }}}
+ // {{{ toHtml()
+
+ /**
+ * Returns the textarea element in HTML
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function toHtml()
+ {
+ if ($this->_flagFrozen) {
+ return $this->getFrozenHtml();
+ } else {
+ return $this->_getTabs() .
+ '<textarea' . $this->_getAttrString($this->_attributes) . '>' .
+ // because we wrap the form later we don't want the text indented
+ preg_replace("/(\r\n|\n|\r)/", '&#010;', htmlspecialchars($this->_value)) .
+ '</textarea>';
+ }
+ } //end func toHtml
+
+ // }}}
+ // {{{ getFrozenHtml()
+
+ /**
+ * Returns the value of field without HTML tags (in this case, value is changed to a mask)
+ *
+ * @since 1.0
+ * @access public
+ * @return string
+ */
+ function getFrozenHtml()
+ {
+ $value = htmlspecialchars($this->getValue());
+ if ($this->getAttribute('wrap') == 'off') {
+ $html = $this->_getTabs() . '<pre>' . $value."</pre>\n";
+ } else {
+ $html = nl2br($value)."\n";
+ }
+ return $html . $this->_getPersistantData();
+ } //end func getFrozenHtml
+
+ // }}}
+
+} //end class HTML_QuickForm_textarea
+?>
diff --git a/libs/HTML/QuickForm/xbutton.php b/libs/HTML/QuickForm/xbutton.php
new file mode 100755
index 0000000000..7e4d49ceba
--- /dev/null
+++ b/libs/HTML/QuickForm/xbutton.php
@@ -0,0 +1,153 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Class for HTML 4.0 <button> element
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @copyright 2001-2007 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License 3.01
+ * @version CVS: $Id: xbutton.php,v 1.2 2007/05/29 18:34:36 avb Exp $
+ * @link http://pear.php.net/package/HTML_QuickForm
+ */
+
+/**
+ * Base class for form elements
+ */
+require_once 'HTML/QuickForm/element.php';
+
+/**
+ * Class for HTML 4.0 <button> element
+ *
+ * @category HTML
+ * @package HTML_QuickForm
+ * @author Alexey Borzov <avb@php.net>
+ * @version Release: 3.2.9
+ * @since 3.2.3
+ */
+class HTML_QuickForm_xbutton extends HTML_QuickForm_element
+{
+ /**
+ * Contents of the <button> tag
+ * @var string
+ * @access private
+ */
+ var $_content;
+
+ /**
+ * Class constructor
+ *
+ * @param string Button name
+ * @param string Button content (HTML to add between <button></button> tags)
+ * @param mixed Either a typical HTML attribute string or an associative array
+ * @access public
+ */
+ function HTML_QuickForm_xbutton($elementName = null, $elementContent = null, $attributes = null)
+ {
+ $this->HTML_QuickForm_element($elementName, null, $attributes);
+ $this->setContent($elementContent);
+ $this->setPersistantFreeze(false);
+ $this->_type = 'xbutton';
+ }
+
+
+ function toHtml()
+ {
+ return '<button' . $this->getAttributes(true) . '>' . $this->_content . '</button>';
+ }
+
+
+ function getFrozenHtml()
+ {
+ return $this->toHtml();
+ }
+
+
+ function freeze()
+ {
+ return false;
+ }
+
+
+ function setName($name)
+ {
+ $this->updateAttributes(array(
+ 'name' => $name
+ ));
+ }
+
+
+ function getName()
+ {
+ return $this->getAttribute('name');
+ }
+
+
+ function setValue($value)
+ {
+ $this->updateAttributes(array(
+ 'value' => $value
+ ));
+ }
+
+
+ function getValue()
+ {
+ return $this->getAttribute('value');
+ }
+
+
+ /**
+ * Sets the contents of the button element
+ *
+ * @param string Button content (HTML to add between <button></button> tags)
+ */
+ function setContent($content)
+ {
+ $this->_content = $content;
+ }
+
+
+ function onQuickFormEvent($event, $arg, &$caller)
+ {
+ if ('updateValue' != $event) {
+ return parent::onQuickFormEvent($event, $arg, $caller);
+ } else {
+ $value = $this->_findValue($caller->_constantValues);
+ if (null === $value) {
+ $value = $this->_findValue($caller->_defaultValues);
+ }
+ if (null !== $value) {
+ $this->setValue($value);
+ }
+ }
+ return true;
+ }
+
+
+ /**
+ * Returns a 'safe' element's value
+ *
+ * The value is only returned if the button's type is "submit" and if this
+ * particlular button was clicked
+ */
+ function exportValue(&$submitValues, $assoc = false)
+ {
+ if ('submit' == $this->getAttribute('type')) {
+ return $this->_prepareValue($this->_findValue($submitValues), $assoc);
+ } else {
+ return null;
+ }
+ }
+}
+?>
diff --git a/libs/PEAR.php b/libs/PEAR.php
new file mode 100755
index 0000000000..fc879a0a78
--- /dev/null
+++ b/libs/PEAR.php
@@ -0,0 +1,1108 @@
+<?php
+/**
+ * PEAR, the PHP Extension and Application Repository
+ *
+ * PEAR class and PEAR_Error class
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.0 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_0.txt. If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category pear
+ * @package PEAR
+ * @author Sterling Hughes <sterling@php.net>
+ * @author Stig Bakken <ssb@php.net>
+ * @author Tomas V.V.Cox <cox@idecnet.com>
+ * @author Greg Beaver <cellog@php.net>
+ * @copyright 1997-2006 The PHP Group
+ * @license http://www.php.net/license/3_0.txt PHP License 3.0
+ * @version CVS: $Id: PEAR.php,v 1.101 2006/04/25 02:41:03 cellog Exp $
+ * @link http://pear.php.net/package/PEAR
+ * @since File available since Release 0.1
+ */
+
+/**#@+
+ * ERROR constants
+ */
+define('PEAR_ERROR_RETURN', 1);
+define('PEAR_ERROR_PRINT', 2);
+define('PEAR_ERROR_TRIGGER', 4);
+define('PEAR_ERROR_DIE', 8);
+define('PEAR_ERROR_CALLBACK', 16);
+/**
+ * WARNING: obsolete
+ * @deprecated
+ */
+define('PEAR_ERROR_EXCEPTION', 32);
+/**#@-*/
+define('PEAR_ZE2', (function_exists('version_compare') &&
+ version_compare(zend_version(), "2-dev", "ge")));
+
+if (substr(PHP_OS, 0, 3) == 'WIN') {
+ define('OS_WINDOWS', true);
+ define('OS_UNIX', false);
+ define('PEAR_OS', 'Windows');
+} else {
+ define('OS_WINDOWS', false);
+ define('OS_UNIX', true);
+ define('PEAR_OS', 'Unix'); // blatant assumption
+}
+
+// instant backwards compatibility
+if (!defined('PATH_SEPARATOR')) {
+ if (OS_WINDOWS) {
+ define('PATH_SEPARATOR', ';');
+ } else {
+ define('PATH_SEPARATOR', ':');
+ }
+}
+
+$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN;
+$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE;
+$GLOBALS['_PEAR_destructor_object_list'] = array();
+$GLOBALS['_PEAR_shutdown_funcs'] = array();
+$GLOBALS['_PEAR_error_handler_stack'] = array();
+
+@ini_set('track_errors', true);
+
+/**
+ * Base class for other PEAR classes. Provides rudimentary
+ * emulation of destructors.
+ *
+ * If you want a destructor in your class, inherit PEAR and make a
+ * destructor method called _yourclassname (same name as the
+ * constructor, but with a "_" prefix). Also, in your constructor you
+ * have to call the PEAR constructor: $this->PEAR();.
+ * The destructor method will be called without parameters. Note that
+ * at in some SAPI implementations (such as Apache), any output during
+ * the request shutdown (in which destructors are called) seems to be
+ * discarded. If you need to get any debug information from your
+ * destructor, use error_log(), syslog() or something similar.
+ *
+ * IMPORTANT! To use the emulated destructors you need to create the
+ * objects by reference: $obj =& new PEAR_child;
+ *
+ * @category pear
+ * @package PEAR
+ * @author Stig Bakken <ssb@php.net>
+ * @author Tomas V.V. Cox <cox@idecnet.com>
+ * @author Greg Beaver <cellog@php.net>
+ * @copyright 1997-2006 The PHP Group
+ * @license http://www.php.net/license/3_0.txt PHP License 3.0
+ * @version Release: 1.6.1
+ * @link http://pear.php.net/package/PEAR
+ * @see PEAR_Error
+ * @since Class available since PHP 4.0.2
+ * @link http://pear.php.net/manual/en/core.pear.php#core.pear.pear
+ */
+class PEAR
+{
+ // {{{ properties
+
+ /**
+ * Whether to enable internal debug messages.
+ *
+ * @var bool
+ * @access private
+ */
+ var $_debug = false;
+
+ /**
+ * Default error mode for this object.
+ *
+ * @var int
+ * @access private
+ */
+ var $_default_error_mode = null;
+
+ /**
+ * Default error options used for this object when error mode
+ * is PEAR_ERROR_TRIGGER.
+ *
+ * @var int
+ * @access private
+ */
+ var $_default_error_options = null;
+
+ /**
+ * Default error handler (callback) for this object, if error mode is
+ * PEAR_ERROR_CALLBACK.
+ *
+ * @var string
+ * @access private
+ */
+ var $_default_error_handler = '';
+
+ /**
+ * Which class to use for error objects.
+ *
+ * @var string
+ * @access private
+ */
+ var $_error_class = 'PEAR_Error';
+
+ /**
+ * An array of expected errors.
+ *
+ * @var array
+ * @access private
+ */
+ var $_expected_errors = array();
+
+ // }}}
+
+ // {{{ constructor
+
+ /**
+ * Constructor. Registers this object in
+ * $_PEAR_destructor_object_list for destructor emulation if a
+ * destructor object exists.
+ *
+ * @param string $error_class (optional) which class to use for
+ * error objects, defaults to PEAR_Error.
+ * @access public
+ * @return void
+ */
+ function PEAR($error_class = null)
+ {
+ $classname = strtolower(get_class($this));
+ if ($this->_debug) {
+ print "PEAR constructor called, class=$classname\n";
+ }
+ if ($error_class !== null) {
+ $this->_error_class = $error_class;
+ }
+ while ($classname && strcasecmp($classname, "pear")) {
+ $destructor = "_$classname";
+ if (method_exists($this, $destructor)) {
+ global $_PEAR_destructor_object_list;
+ $_PEAR_destructor_object_list[] = &$this;
+ if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {
+ register_shutdown_function("_PEAR_call_destructors");
+ $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;
+ }
+ break;
+ } else {
+ $classname = get_parent_class($classname);
+ }
+ }
+ }
+
+ // }}}
+ // {{{ destructor
+
+ /**
+ * Destructor (the emulated type of...). Does nothing right now,
+ * but is included for forward compatibility, so subclass
+ * destructors should always call it.
+ *
+ * See the note in the class desciption about output from
+ * destructors.
+ *
+ * @access public
+ * @return void
+ */
+ function _PEAR() {
+ if ($this->_debug) {
+ printf("PEAR destructor called, class=%s\n", strtolower(get_class($this)));
+ }
+ }
+
+ // }}}
+ // {{{ getStaticProperty()
+
+ /**
+ * If you have a class that's mostly/entirely static, and you need static
+ * properties, you can use this method to simulate them. Eg. in your method(s)
+ * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar');
+ * You MUST use a reference, or they will not persist!
+ *
+ * @access public
+ * @param string $class The calling classname, to prevent clashes
+ * @param string $var The variable to retrieve.
+ * @return mixed A reference to the variable. If not set it will be
+ * auto initialised to NULL.
+ */
+ function &getStaticProperty($class, $var)
+ {
+ static $properties;
+ if (!isset($properties[$class])) {
+ $properties[$class] = array();
+ }
+ if (!array_key_exists($var, $properties[$class])) {
+ $properties[$class][$var] = null;
+ }
+ return $properties[$class][$var];
+ }
+
+ // }}}
+ // {{{ registerShutdownFunc()
+
+ /**
+ * Use this function to register a shutdown method for static
+ * classes.
+ *
+ * @access public
+ * @param mixed $func The function name (or array of class/method) to call
+ * @param mixed $args The arguments to pass to the function
+ * @return void
+ */
+ function registerShutdownFunc($func, $args = array())
+ {
+ // if we are called statically, there is a potential
+ // that no shutdown func is registered. Bug #6445
+ if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {
+ register_shutdown_function("_PEAR_call_destructors");
+ $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;
+ }
+ $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args);
+ }
+
+ // }}}
+ // {{{ isError()
+
+ /**
+ * Tell whether a value is a PEAR error.
+ *
+ * @param mixed $data the value to test
+ * @param int $code if $data is an error object, return true
+ * only if $code is a string and
+ * $obj->getMessage() == $code or
+ * $code is an integer and $obj->getCode() == $code
+ * @access public
+ * @return bool true if parameter is an error
+ */
+ function isError($data, $code = null)
+ {
+ if (is_a($data, 'PEAR_Error')) {
+ if (is_null($code)) {
+ return true;
+ } elseif (is_string($code)) {
+ return $data->getMessage() == $code;
+ } else {
+ return $data->getCode() == $code;
+ }
+ }
+ return false;
+ }
+
+ // }}}
+ // {{{ setErrorHandling()
+
+ /**
+ * Sets how errors generated by this object should be handled.
+ * Can be invoked both in objects and statically. If called
+ * statically, setErrorHandling sets the default behaviour for all
+ * PEAR objects. If called in an object, setErrorHandling sets
+ * the default behaviour for that object.
+ *
+ * @param int $mode
+ * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
+ * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
+ * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION.
+ *
+ * @param mixed $options
+ * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one
+ * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
+ *
+ * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected
+ * to be the callback function or method. A callback
+ * function is a string with the name of the function, a
+ * callback method is an array of two elements: the element
+ * at index 0 is the object, and the element at index 1 is
+ * the name of the method to call in the object.
+ *
+ * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is
+ * a printf format string used when printing the error
+ * message.
+ *
+ * @access public
+ * @return void
+ * @see PEAR_ERROR_RETURN
+ * @see PEAR_ERROR_PRINT
+ * @see PEAR_ERROR_TRIGGER
+ * @see PEAR_ERROR_DIE
+ * @see PEAR_ERROR_CALLBACK
+ * @see PEAR_ERROR_EXCEPTION
+ *
+ * @since PHP 4.0.5
+ */
+
+ function setErrorHandling($mode = null, $options = null)
+ {
+ if (isset($this) && is_a($this, 'PEAR')) {
+ $setmode = &$this->_default_error_mode;
+ $setoptions = &$this->_default_error_options;
+ } else {
+ $setmode = &$GLOBALS['_PEAR_default_error_mode'];
+ $setoptions = &$GLOBALS['_PEAR_default_error_options'];
+ }
+
+ switch ($mode) {
+ case PEAR_ERROR_EXCEPTION:
+ case PEAR_ERROR_RETURN:
+ case PEAR_ERROR_PRINT:
+ case PEAR_ERROR_TRIGGER:
+ case PEAR_ERROR_DIE:
+ case null:
+ $setmode = $mode;
+ $setoptions = $options;
+ break;
+
+ case PEAR_ERROR_CALLBACK:
+ $setmode = $mode;
+ // class/object method callback
+ if (is_callable($options)) {
+ $setoptions = $options;
+ } else {
+ trigger_error("invalid error callback", E_USER_WARNING);
+ }
+ break;
+
+ default:
+ trigger_error("invalid error mode", E_USER_WARNING);
+ break;
+ }
+ }
+
+ // }}}
+ // {{{ expectError()
+
+ /**
+ * This method is used to tell which errors you expect to get.
+ * Expected errors are always returned with error mode
+ * PEAR_ERROR_RETURN. Expected error codes are stored in a stack,
+ * and this method pushes a new element onto it. The list of
+ * expected errors are in effect until they are popped off the
+ * stack with the popExpect() method.
+ *
+ * Note that this method can not be called statically
+ *
+ * @param mixed $code a single error code or an array of error codes to expect
+ *
+ * @return int the new depth of the "expected errors" stack
+ * @access public
+ */
+ function expectError($code = '*')
+ {
+ if (is_array($code)) {
+ array_push($this->_expected_errors, $code);
+ } else {
+ array_push($this->_expected_errors, array($code));
+ }
+ return sizeof($this->_expected_errors);
+ }
+
+ // }}}
+ // {{{ popExpect()
+
+ /**
+ * This method pops one element off the expected error codes
+ * stack.
+ *
+ * @return array the list of error codes that were popped
+ */
+ function popExpect()
+ {
+ return array_pop($this->_expected_errors);
+ }
+
+ // }}}
+ // {{{ _checkDelExpect()
+
+ /**
+ * This method checks unsets an error code if available
+ *
+ * @param mixed error code
+ * @return bool true if the error code was unset, false otherwise
+ * @access private
+ * @since PHP 4.3.0
+ */
+ function _checkDelExpect($error_code)
+ {
+ $deleted = false;
+
+ foreach ($this->_expected_errors AS $key => $error_array) {
+ if (in_array($error_code, $error_array)) {
+ unset($this->_expected_errors[$key][array_search($error_code, $error_array)]);
+ $deleted = true;
+ }
+
+ // clean up empty arrays
+ if (0 == count($this->_expected_errors[$key])) {
+ unset($this->_expected_errors[$key]);
+ }
+ }
+ return $deleted;
+ }
+
+ // }}}
+ // {{{ delExpect()
+
+ /**
+ * This method deletes all occurences of the specified element from
+ * the expected error codes stack.
+ *
+ * @param mixed $error_code error code that should be deleted
+ * @return mixed list of error codes that were deleted or error
+ * @access public
+ * @since PHP 4.3.0
+ */
+ function delExpect($error_code)
+ {
+ $deleted = false;
+
+ if ((is_array($error_code) && (0 != count($error_code)))) {
+ // $error_code is a non-empty array here;
+ // we walk through it trying to unset all
+ // values
+ foreach($error_code as $key => $error) {
+ if ($this->_checkDelExpect($error)) {
+ $deleted = true;
+ } else {
+ $deleted = false;
+ }
+ }
+ return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
+ } elseif (!empty($error_code)) {
+ // $error_code comes alone, trying to unset it
+ if ($this->_checkDelExpect($error_code)) {
+ return true;
+ } else {
+ return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
+ }
+ } else {
+ // $error_code is empty
+ return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME
+ }
+ }
+
+ // }}}
+ // {{{ raiseError()
+
+ /**
+ * This method is a wrapper that returns an instance of the
+ * configured error class with this object's default error
+ * handling applied. If the $mode and $options parameters are not
+ * specified, the object's defaults are used.
+ *
+ * @param mixed $message a text error message or a PEAR error object
+ *
+ * @param int $code a numeric error code (it is up to your class
+ * to define these if you want to use codes)
+ *
+ * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
+ * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
+ * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION.
+ *
+ * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter
+ * specifies the PHP-internal error level (one of
+ * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
+ * If $mode is PEAR_ERROR_CALLBACK, this
+ * parameter specifies the callback function or
+ * method. In other error modes this parameter
+ * is ignored.
+ *
+ * @param string $userinfo If you need to pass along for example debug
+ * information, this parameter is meant for that.
+ *
+ * @param string $error_class The returned error object will be
+ * instantiated from this class, if specified.
+ *
+ * @param bool $skipmsg If true, raiseError will only pass error codes,
+ * the error message parameter will be dropped.
+ *
+ * @access public
+ * @return object a PEAR error object
+ * @see PEAR::setErrorHandling
+ * @since PHP 4.0.5
+ */
+ function &raiseError($message = null,
+ $code = null,
+ $mode = null,
+ $options = null,
+ $userinfo = null,
+ $error_class = null,
+ $skipmsg = false)
+ {
+ // The error is yet a PEAR error object
+ if (is_object($message)) {
+ $code = $message->getCode();
+ $userinfo = $message->getUserInfo();
+ $error_class = $message->getType();
+ $message->error_message_prefix = '';
+ $message = $message->getMessage();
+ }
+
+ if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) {
+ if ($exp[0] == "*" ||
+ (is_int(reset($exp)) && in_array($code, $exp)) ||
+ (is_string(reset($exp)) && in_array($message, $exp))) {
+ $mode = PEAR_ERROR_RETURN;
+ }
+ }
+ // No mode given, try global ones
+ if ($mode === null) {
+ // Class error handler
+ if (isset($this) && isset($this->_default_error_mode)) {
+ $mode = $this->_default_error_mode;
+ $options = $this->_default_error_options;
+ // Global error handler
+ } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) {
+ $mode = $GLOBALS['_PEAR_default_error_mode'];
+ $options = $GLOBALS['_PEAR_default_error_options'];
+ }
+ }
+
+ if ($error_class !== null) {
+ $ec = $error_class;
+ } elseif (isset($this) && isset($this->_error_class)) {
+ $ec = $this->_error_class;
+ } else {
+ $ec = 'PEAR_Error';
+ }
+ if ($skipmsg) {
+ $a = &new $ec($code, $mode, $options, $userinfo);
+ return $a;
+ } else {
+ $a = &new $ec($message, $code, $mode, $options, $userinfo);
+ return $a;
+ }
+ }
+
+ // }}}
+ // {{{ throwError()
+
+ /**
+ * Simpler form of raiseError with fewer options. In most cases
+ * message, code and userinfo are enough.
+ *
+ * @param string $message
+ *
+ */
+ function &throwError($message = null,
+ $code = null,
+ $userinfo = null)
+ {
+ if (isset($this) && is_a($this, 'PEAR')) {
+ $a = &$this->raiseError($message, $code, null, null, $userinfo);
+ return $a;
+ } else {
+ $a = &PEAR::raiseError($message, $code, null, null, $userinfo);
+ return $a;
+ }
+ }
+
+ // }}}
+ function staticPushErrorHandling($mode, $options = null)
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ $def_mode = &$GLOBALS['_PEAR_default_error_mode'];
+ $def_options = &$GLOBALS['_PEAR_default_error_options'];
+ $stack[] = array($def_mode, $def_options);
+ switch ($mode) {
+ case PEAR_ERROR_EXCEPTION:
+ case PEAR_ERROR_RETURN:
+ case PEAR_ERROR_PRINT:
+ case PEAR_ERROR_TRIGGER:
+ case PEAR_ERROR_DIE:
+ case null:
+ $def_mode = $mode;
+ $def_options = $options;
+ break;
+
+ case PEAR_ERROR_CALLBACK:
+ $def_mode = $mode;
+ // class/object method callback
+ if (is_callable($options)) {
+ $def_options = $options;
+ } else {
+ trigger_error("invalid error callback", E_USER_WARNING);
+ }
+ break;
+
+ default:
+ trigger_error("invalid error mode", E_USER_WARNING);
+ break;
+ }
+ $stack[] = array($mode, $options);
+ return true;
+ }
+
+ function staticPopErrorHandling()
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ $setmode = &$GLOBALS['_PEAR_default_error_mode'];
+ $setoptions = &$GLOBALS['_PEAR_default_error_options'];
+ array_pop($stack);
+ list($mode, $options) = $stack[sizeof($stack) - 1];
+ array_pop($stack);
+ switch ($mode) {
+ case PEAR_ERROR_EXCEPTION:
+ case PEAR_ERROR_RETURN:
+ case PEAR_ERROR_PRINT:
+ case PEAR_ERROR_TRIGGER:
+ case PEAR_ERROR_DIE:
+ case null:
+ $setmode = $mode;
+ $setoptions = $options;
+ break;
+
+ case PEAR_ERROR_CALLBACK:
+ $setmode = $mode;
+ // class/object method callback
+ if (is_callable($options)) {
+ $setoptions = $options;
+ } else {
+ trigger_error("invalid error callback", E_USER_WARNING);
+ }
+ break;
+
+ default:
+ trigger_error("invalid error mode", E_USER_WARNING);
+ break;
+ }
+ return true;
+ }
+
+ // {{{ pushErrorHandling()
+
+ /**
+ * Push a new error handler on top of the error handler options stack. With this
+ * you can easily override the actual error handler for some code and restore
+ * it later with popErrorHandling.
+ *
+ * @param mixed $mode (same as setErrorHandling)
+ * @param mixed $options (same as setErrorHandling)
+ *
+ * @return bool Always true
+ *
+ * @see PEAR::setErrorHandling
+ */
+ function pushErrorHandling($mode, $options = null)
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ if (isset($this) && is_a($this, 'PEAR')) {
+ $def_mode = &$this->_default_error_mode;
+ $def_options = &$this->_default_error_options;
+ } else {
+ $def_mode = &$GLOBALS['_PEAR_default_error_mode'];
+ $def_options = &$GLOBALS['_PEAR_default_error_options'];
+ }
+ $stack[] = array($def_mode, $def_options);
+
+ if (isset($this) && is_a($this, 'PEAR')) {
+ $this->setErrorHandling($mode, $options);
+ } else {
+ PEAR::setErrorHandling($mode, $options);
+ }
+ $stack[] = array($mode, $options);
+ return true;
+ }
+
+ // }}}
+ // {{{ popErrorHandling()
+
+ /**
+ * Pop the last error handler used
+ *
+ * @return bool Always true
+ *
+ * @see PEAR::pushErrorHandling
+ */
+ function popErrorHandling()
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ array_pop($stack);
+ list($mode, $options) = $stack[sizeof($stack) - 1];
+ array_pop($stack);
+ if (isset($this) && is_a($this, 'PEAR')) {
+ $this->setErrorHandling($mode, $options);
+ } else {
+ PEAR::setErrorHandling($mode, $options);
+ }
+ return true;
+ }
+
+ // }}}
+ // {{{ loadExtension()
+
+ /**
+ * OS independant PHP extension load. Remember to take care
+ * on the correct extension name for case sensitive OSes.
+ *
+ * @param string $ext The extension name
+ * @return bool Success or not on the dl() call
+ */
+ function loadExtension($ext)
+ {
+ if (!extension_loaded($ext)) {
+ // if either returns true dl() will produce a FATAL error, stop that
+ if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) {
+ return false;
+ }
+ if (OS_WINDOWS) {
+ $suffix = '.dll';
+ } elseif (PHP_OS == 'HP-UX') {
+ $suffix = '.sl';
+ } elseif (PHP_OS == 'AIX') {
+ $suffix = '.a';
+ } elseif (PHP_OS == 'OSX') {
+ $suffix = '.bundle';
+ } else {
+ $suffix = '.so';
+ }
+ return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix);
+ }
+ return true;
+ }
+
+ // }}}
+}
+
+// {{{ _PEAR_call_destructors()
+
+function _PEAR_call_destructors()
+{
+ global $_PEAR_destructor_object_list;
+ if (is_array($_PEAR_destructor_object_list) &&
+ sizeof($_PEAR_destructor_object_list))
+ {
+ reset($_PEAR_destructor_object_list);
+ if (PEAR::getStaticProperty('PEAR', 'destructlifo')) {
+ $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list);
+ }
+ while (list($k, $objref) = each($_PEAR_destructor_object_list)) {
+ $classname = get_class($objref);
+ while ($classname) {
+ $destructor = "_$classname";
+ if (method_exists($objref, $destructor)) {
+ $objref->$destructor();
+ break;
+ } else {
+ $classname = get_parent_class($classname);
+ }
+ }
+ }
+ // Empty the object list to ensure that destructors are
+ // not called more than once.
+ $_PEAR_destructor_object_list = array();
+ }
+
+ // Now call the shutdown functions
+ if (is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) {
+ foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) {
+ call_user_func_array($value[0], $value[1]);
+ }
+ }
+}
+
+// }}}
+/**
+ * Standard PEAR error class for PHP 4
+ *
+ * This class is supserseded by {@link PEAR_Exception} in PHP 5
+ *
+ * @category pear
+ * @package PEAR
+ * @author Stig Bakken <ssb@php.net>
+ * @author Tomas V.V. Cox <cox@idecnet.com>
+ * @author Gregory Beaver <cellog@php.net>
+ * @copyright 1997-2006 The PHP Group
+ * @license http://www.php.net/license/3_0.txt PHP License 3.0
+ * @version Release: 1.6.1
+ * @link http://pear.php.net/manual/en/core.pear.pear-error.php
+ * @see PEAR::raiseError(), PEAR::throwError()
+ * @since Class available since PHP 4.0.2
+ */
+class PEAR_Error
+{
+ // {{{ properties
+
+ var $error_message_prefix = '';
+ var $mode = PEAR_ERROR_RETURN;
+ var $level = E_USER_NOTICE;
+ var $code = -1;
+ var $message = '';
+ var $userinfo = '';
+ var $backtrace = null;
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * PEAR_Error constructor
+ *
+ * @param string $message message
+ *
+ * @param int $code (optional) error code
+ *
+ * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN,
+ * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER,
+ * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION
+ *
+ * @param mixed $options (optional) error level, _OR_ in the case of
+ * PEAR_ERROR_CALLBACK, the callback function or object/method
+ * tuple.
+ *
+ * @param string $userinfo (optional) additional user/debug info
+ *
+ * @access public
+ *
+ */
+ function PEAR_Error($message = 'unknown error', $code = null,
+ $mode = null, $options = null, $userinfo = null)
+ {
+ if ($mode === null) {
+ $mode = PEAR_ERROR_RETURN;
+ }
+ $this->message = $message;
+ $this->code = $code;
+ $this->mode = $mode;
+ $this->userinfo = $userinfo;
+ if (!PEAR::getStaticProperty('PEAR_Error', 'skiptrace')) {
+ $this->backtrace = debug_backtrace();
+ if (isset($this->backtrace[0]) && isset($this->backtrace[0]['object'])) {
+ unset($this->backtrace[0]['object']);
+ }
+ }
+ if ($mode & PEAR_ERROR_CALLBACK) {
+ $this->level = E_USER_NOTICE;
+ $this->callback = $options;
+ } else {
+ if ($options === null) {
+ $options = E_USER_NOTICE;
+ }
+ $this->level = $options;
+ $this->callback = null;
+ }
+ if ($this->mode & PEAR_ERROR_PRINT) {
+ if (is_null($options) || is_int($options)) {
+ $format = "%s";
+ } else {
+ $format = $options;
+ }
+ printf($format, $this->getMessage());
+ }
+ if ($this->mode & PEAR_ERROR_TRIGGER) {
+ trigger_error($this->getMessage(), $this->level);
+ }
+ if ($this->mode & PEAR_ERROR_DIE) {
+ $msg = $this->getMessage();
+ if (is_null($options) || is_int($options)) {
+ $format = "%s";
+ if (substr($msg, -1) != "\n") {
+ $msg .= "\n";
+ }
+ } else {
+ $format = $options;
+ }
+ die(sprintf($format, $msg));
+ }
+ if ($this->mode & PEAR_ERROR_CALLBACK) {
+ if (is_callable($this->callback)) {
+ call_user_func($this->callback, $this);
+ }
+ }
+ if ($this->mode & PEAR_ERROR_EXCEPTION) {
+ trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING);
+ eval('$e = new Exception($this->message, $this->code);throw($e);');
+ }
+ }
+
+ // }}}
+ // {{{ getMode()
+
+ /**
+ * Get the error mode from an error object.
+ *
+ * @return int error mode
+ * @access public
+ */
+ function getMode() {
+ return $this->mode;
+ }
+
+ // }}}
+ // {{{ getCallback()
+
+ /**
+ * Get the callback function/method from an error object.
+ *
+ * @return mixed callback function or object/method array
+ * @access public
+ */
+ function getCallback() {
+ return $this->callback;
+ }
+
+ // }}}
+ // {{{ getMessage()
+
+
+ /**
+ * Get the error message from an error object.
+ *
+ * @return string full error message
+ * @access public
+ */
+ function getMessage()
+ {
+ return ($this->error_message_prefix . $this->message);
+ }
+
+
+ // }}}
+ // {{{ getCode()
+
+ /**
+ * Get error code from an error object
+ *
+ * @return int error code
+ * @access public
+ */
+ function getCode()
+ {
+ return $this->code;
+ }
+
+ // }}}
+ // {{{ getType()
+
+ /**
+ * Get the name of this error/exception.
+ *
+ * @return string error/exception name (type)
+ * @access public
+ */
+ function getType()
+ {
+ return get_class($this);
+ }
+
+ // }}}
+ // {{{ getUserInfo()
+
+ /**
+ * Get additional user-supplied information.
+ *
+ * @return string user-supplied information
+ * @access public
+ */
+ function getUserInfo()
+ {
+ return $this->userinfo;
+ }
+
+ // }}}
+ // {{{ getDebugInfo()
+
+ /**
+ * Get additional debug information supplied by the application.
+ *
+ * @return string debug information
+ * @access public
+ */
+ function getDebugInfo()
+ {
+ return $this->getUserInfo();
+ }
+
+ // }}}
+ // {{{ getBacktrace()
+
+ /**
+ * Get the call backtrace from where the error was generated.
+ * Supported with PHP 4.3.0 or newer.
+ *
+ * @param int $frame (optional) what frame to fetch
+ * @return array Backtrace, or NULL if not available.
+ * @access public
+ */
+ function getBacktrace($frame = null)
+ {
+ if (defined('PEAR_IGNORE_BACKTRACE')) {
+ return null;
+ }
+ if ($frame === null) {
+ return $this->backtrace;
+ }
+ return $this->backtrace[$frame];
+ }
+
+ // }}}
+ // {{{ addUserInfo()
+
+ function addUserInfo($info)
+ {
+ if (empty($this->userinfo)) {
+ $this->userinfo = $info;
+ } else {
+ $this->userinfo .= " ** $info";
+ }
+ }
+
+ // }}}
+ // {{{ toString()
+
+ /**
+ * Make a string representation of this object.
+ *
+ * @return string a string with an object summary
+ * @access public
+ */
+ function toString() {
+ $modes = array();
+ $levels = array(E_USER_NOTICE => 'notice',
+ E_USER_WARNING => 'warning',
+ E_USER_ERROR => 'error');
+ if ($this->mode & PEAR_ERROR_CALLBACK) {
+ if (is_array($this->callback)) {
+ $callback = (is_object($this->callback[0]) ?
+ strtolower(get_class($this->callback[0])) :
+ $this->callback[0]) . '::' .
+ $this->callback[1];
+ } else {
+ $callback = $this->callback;
+ }
+ return sprintf('[%s: message="%s" code=%d mode=callback '.
+ 'callback=%s prefix="%s" info="%s"]',
+ strtolower(get_class($this)), $this->message, $this->code,
+ $callback, $this->error_message_prefix,
+ $this->userinfo);
+ }
+ if ($this->mode & PEAR_ERROR_PRINT) {
+ $modes[] = 'print';
+ }
+ if ($this->mode & PEAR_ERROR_TRIGGER) {
+ $modes[] = 'trigger';
+ }
+ if ($this->mode & PEAR_ERROR_DIE) {
+ $modes[] = 'die';
+ }
+ if ($this->mode & PEAR_ERROR_RETURN) {
+ $modes[] = 'return';
+ }
+ return sprintf('[%s: message="%s" code=%d mode=%s level=%s '.
+ 'prefix="%s" info="%s"]',
+ strtolower(get_class($this)), $this->message, $this->code,
+ implode("|", $modes), $levels[$this->level],
+ $this->error_message_prefix,
+ $this->userinfo);
+ }
+
+ // }}}
+}
+
+/*
+ * Local Variables:
+ * mode: php
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
+?>
diff --git a/libs/Smarty/Config_File.class.php b/libs/Smarty/Config_File.class.php
new file mode 100755
index 0000000000..3d7c1b4933
--- /dev/null
+++ b/libs/Smarty/Config_File.class.php
@@ -0,0 +1,389 @@
+<?php
+
+/**
+ * Config_File class.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @link http://smarty.php.net/
+ * @version 2.6.18
+ * @copyright Copyright: 2001-2005 New Digital Group, Inc.
+ * @author Andrei Zmievski <andrei@php.net>
+ * @access public
+ * @package Smarty
+ */
+
+/* $Id: Config_File.class.php,v 1.88 2007/03/06 10:40:06 messju Exp $ */
+
+/**
+ * Config file reading class
+ * @package Smarty
+ */
+class Config_File {
+ /**#@+
+ * Options
+ * @var boolean
+ */
+ /**
+ * Controls whether variables with the same name overwrite each other.
+ */
+ var $overwrite = true;
+
+ /**
+ * Controls whether config values of on/true/yes and off/false/no get
+ * converted to boolean values automatically.
+ */
+ var $booleanize = true;
+
+ /**
+ * Controls whether hidden config sections/vars are read from the file.
+ */
+ var $read_hidden = true;
+
+ /**
+ * Controls whether or not to fix mac or dos formatted newlines.
+ * If set to true, \r or \r\n will be changed to \n.
+ */
+ var $fix_newlines = true;
+ /**#@-*/
+
+ /** @access private */
+ var $_config_path = "";
+ var $_config_data = array();
+ /**#@-*/
+
+ /**
+ * Constructs a new config file class.
+ *
+ * @param string $config_path (optional) path to the config files
+ */
+ function Config_File($config_path = NULL)
+ {
+ if (isset($config_path))
+ $this->set_path($config_path);
+ }
+
+
+ /**
+ * Set the path where configuration files can be found.
+ *
+ * @param string $config_path path to the config files
+ */
+ function set_path($config_path)
+ {
+ if (!empty($config_path)) {
+ if (!is_string($config_path) || !file_exists($config_path) || !is_dir($config_path)) {
+ $this->_trigger_error_msg("Bad config file path '$config_path'");
+ return;
+ }
+ if(substr($config_path, -1) != DIRECTORY_SEPARATOR) {
+ $config_path .= DIRECTORY_SEPARATOR;
+ }
+
+ $this->_config_path = $config_path;
+ }
+ }
+
+
+ /**
+ * Retrieves config info based on the file, section, and variable name.
+ *
+ * @param string $file_name config file to get info for
+ * @param string $section_name (optional) section to get info for
+ * @param string $var_name (optional) variable to get info for
+ * @return string|array a value or array of values
+ */
+ function get($file_name, $section_name = NULL, $var_name = NULL)
+ {
+ if (empty($file_name)) {
+ $this->_trigger_error_msg('Empty config file name');
+ return;
+ } else {
+ $file_name = $this->_config_path . $file_name;
+ if (!isset($this->_config_data[$file_name]))
+ $this->load_file($file_name, false);
+ }
+
+ if (!empty($var_name)) {
+ if (empty($section_name)) {
+ return $this->_config_data[$file_name]["vars"][$var_name];
+ } else {
+ if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name]))
+ return $this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name];
+ else
+ return array();
+ }
+ } else {
+ if (empty($section_name)) {
+ return (array)$this->_config_data[$file_name]["vars"];
+ } else {
+ if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"]))
+ return (array)$this->_config_data[$file_name]["sections"][$section_name]["vars"];
+ else
+ return array();
+ }
+ }
+ }
+
+
+ /**
+ * Retrieves config info based on the key.
+ *
+ * @param $file_name string config key (filename/section/var)
+ * @return string|array same as get()
+ * @uses get() retrieves information from config file and returns it
+ */
+ function &get_key($config_key)
+ {
+ list($file_name, $section_name, $var_name) = explode('/', $config_key, 3);
+ $result = &$this->get($file_name, $section_name, $var_name);
+ return $result;
+ }
+
+ /**
+ * Get all loaded config file names.
+ *
+ * @return array an array of loaded config file names
+ */
+ function get_file_names()
+ {
+ return array_keys($this->_config_data);
+ }
+
+
+ /**
+ * Get all section names from a loaded file.
+ *
+ * @param string $file_name config file to get section names from
+ * @return array an array of section names from the specified file
+ */
+ function get_section_names($file_name)
+ {
+ $file_name = $this->_config_path . $file_name;
+ if (!isset($this->_config_data[$file_name])) {
+ $this->_trigger_error_msg("Unknown config file '$file_name'");
+ return;
+ }
+
+ return array_keys($this->_config_data[$file_name]["sections"]);
+ }
+
+
+ /**
+ * Get all global or section variable names.
+ *
+ * @param string $file_name config file to get info for
+ * @param string $section_name (optional) section to get info for
+ * @return array an array of variables names from the specified file/section
+ */
+ function get_var_names($file_name, $section = NULL)
+ {
+ if (empty($file_name)) {
+ $this->_trigger_error_msg('Empty config file name');
+ return;
+ } else if (!isset($this->_config_data[$file_name])) {
+ $this->_trigger_error_msg("Unknown config file '$file_name'");
+ return;
+ }
+
+ if (empty($section))
+ return array_keys($this->_config_data[$file_name]["vars"]);
+ else
+ return array_keys($this->_config_data[$file_name]["sections"][$section]["vars"]);
+ }
+
+
+ /**
+ * Clear loaded config data for a certain file or all files.
+ *
+ * @param string $file_name file to clear config data for
+ */
+ function clear($file_name = NULL)
+ {
+ if ($file_name === NULL)
+ $this->_config_data = array();
+ else if (isset($this->_config_data[$file_name]))
+ $this->_config_data[$file_name] = array();
+ }
+
+
+ /**
+ * Load a configuration file manually.
+ *
+ * @param string $file_name file name to load
+ * @param boolean $prepend_path whether current config path should be
+ * prepended to the filename
+ */
+ function load_file($file_name, $prepend_path = true)
+ {
+ if ($prepend_path && $this->_config_path != "")
+ $config_file = $this->_config_path . $file_name;
+ else
+ $config_file = $file_name;
+
+ ini_set('track_errors', true);
+ $fp = @fopen($config_file, "r");
+ if (!is_resource($fp)) {
+ $this->_trigger_error_msg("Could not open config file '$config_file'");
+ return false;
+ }
+
+ $contents = ($size = filesize($config_file)) ? fread($fp, $size) : '';
+ fclose($fp);
+
+ $this->_config_data[$config_file] = $this->parse_contents($contents);
+ return true;
+ }
+
+ /**
+ * Store the contents of a file manually.
+ *
+ * @param string $config_file file name of the related contents
+ * @param string $contents the file-contents to parse
+ */
+ function set_file_contents($config_file, $contents)
+ {
+ $this->_config_data[$config_file] = $this->parse_contents($contents);
+ return true;
+ }
+
+ /**
+ * parse the source of a configuration file manually.
+ *
+ * @param string $contents the file-contents to parse
+ */
+ function parse_contents($contents)
+ {
+ if($this->fix_newlines) {
+ // fix mac/dos formatted newlines
+ $contents = preg_replace('!\r\n?!', "\n", $contents);
+ }
+
+ $config_data = array();
+ $config_data['sections'] = array();
+ $config_data['vars'] = array();
+
+ /* reference to fill with data */
+ $vars =& $config_data['vars'];
+
+ /* parse file line by line */
+ preg_match_all('!^.*\r?\n?!m', $contents, $match);
+ $lines = $match[0];
+ for ($i=0, $count=count($lines); $i<$count; $i++) {
+ $line = $lines[$i];
+ if (empty($line)) continue;
+
+ if ( substr($line, 0, 1) == '[' && preg_match('!^\[(.*?)\]!', $line, $match) ) {
+ /* section found */
+ if (substr($match[1], 0, 1) == '.') {
+ /* hidden section */
+ if ($this->read_hidden) {
+ $section_name = substr($match[1], 1);
+ } else {
+ /* break reference to $vars to ignore hidden section */
+ unset($vars);
+ $vars = array();
+ continue;
+ }
+ } else {
+ $section_name = $match[1];
+ }
+ if (!isset($config_data['sections'][$section_name]))
+ $config_data['sections'][$section_name] = array('vars' => array());
+ $vars =& $config_data['sections'][$section_name]['vars'];
+ continue;
+ }
+
+ if (preg_match('/^\s*(\.?\w+)\s*=\s*(.*)/s', $line, $match)) {
+ /* variable found */
+ $var_name = rtrim($match[1]);
+ if (strpos($match[2], '"""') === 0) {
+ /* handle multiline-value */
+ $lines[$i] = substr($match[2], 3);
+ $var_value = '';
+ while ($i<$count) {
+ if (($pos = strpos($lines[$i], '"""')) === false) {
+ $var_value .= $lines[$i++];
+ } else {
+ /* end of multiline-value */
+ $var_value .= substr($lines[$i], 0, $pos);
+ break;
+ }
+ }
+ $booleanize = false;
+
+ } else {
+ /* handle simple value */
+ $var_value = preg_replace('/^([\'"])(.*)\1$/', '\2', rtrim($match[2]));
+ $booleanize = $this->booleanize;
+
+ }
+ $this->_set_config_var($vars, $var_name, $var_value, $booleanize);
+ }
+ /* else unparsable line / means it is a comment / means ignore it */
+ }
+ return $config_data;
+ }
+
+ /**#@+ @access private */
+ /**
+ * @param array &$container
+ * @param string $var_name
+ * @param mixed $var_value
+ * @param boolean $booleanize determines whether $var_value is converted to
+ * to true/false
+ */
+ function _set_config_var(&$container, $var_name, $var_value, $booleanize)
+ {
+ if (substr($var_name, 0, 1) == '.') {
+ if (!$this->read_hidden)
+ return;
+ else
+ $var_name = substr($var_name, 1);
+ }
+
+ if (!preg_match("/^[a-zA-Z_]\w*$/", $var_name)) {
+ $this->_trigger_error_msg("Bad variable name '$var_name'");
+ return;
+ }
+
+ if ($booleanize) {
+ if (preg_match("/^(on|true|yes)$/i", $var_value))
+ $var_value = true;
+ else if (preg_match("/^(off|false|no)$/i", $var_value))
+ $var_value = false;
+ }
+
+ if (!isset($container[$var_name]) || $this->overwrite)
+ $container[$var_name] = $var_value;
+ else {
+ settype($container[$var_name], 'array');
+ $container[$var_name][] = $var_value;
+ }
+ }
+
+ /**
+ * @uses trigger_error() creates a PHP warning/error
+ * @param string $error_msg
+ * @param integer $error_type one of
+ */
+ function _trigger_error_msg($error_msg, $error_type = E_USER_WARNING)
+ {
+ trigger_error("Config_File error: $error_msg", $error_type);
+ }
+ /**#@-*/
+}
+
+?>
diff --git a/libs/Smarty/Smarty.class.php b/libs/Smarty/Smarty.class.php
new file mode 100755
index 0000000000..f05e0dadeb
--- /dev/null
+++ b/libs/Smarty/Smarty.class.php
@@ -0,0 +1,1944 @@
+<?php
+
+/**
+ * Project: Smarty: the PHP compiling template engine
+ * File: Smarty.class.php
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * For questions, help, comments, discussion, etc., please join the
+ * Smarty mailing list. Send a blank e-mail to
+ * smarty-general-subscribe@lists.php.net
+ *
+ * @link http://smarty.php.net/
+ * @copyright 2001-2005 New Digital Group, Inc.
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Andrei Zmievski <andrei@php.net>
+ * @package Smarty
+ * @version 2.6.18
+ */
+
+/* $Id: Smarty.class.php,v 1.528 2007/03/06 10:40:06 messju Exp $ */
+
+/**
+ * DIR_SEP isn't used anymore, but third party apps might
+ */
+if(!defined('DIR_SEP')) {
+ define('DIR_SEP', DIRECTORY_SEPARATOR);
+}
+
+/**
+ * set SMARTY_DIR to absolute path to Smarty library files.
+ * if not defined, include_path will be used. Sets SMARTY_DIR only if user
+ * application has not already defined it.
+ */
+
+if (!defined('SMARTY_DIR')) {
+ define('SMARTY_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+}
+
+if (!defined('SMARTY_CORE_DIR')) {
+ define('SMARTY_CORE_DIR', SMARTY_DIR . 'internals' . DIRECTORY_SEPARATOR);
+}
+
+define('SMARTY_PHP_PASSTHRU', 0);
+define('SMARTY_PHP_QUOTE', 1);
+define('SMARTY_PHP_REMOVE', 2);
+define('SMARTY_PHP_ALLOW', 3);
+
+/**
+ * @package Smarty
+ */
+class Smarty
+{
+ /**#@+
+ * Smarty Configuration Section
+ */
+
+ /**
+ * The name of the directory where templates are located.
+ *
+ * @var string
+ */
+ var $template_dir = 'templates';
+
+ /**
+ * The directory where compiled templates are located.
+ *
+ * @var string
+ */
+ var $compile_dir = 'templates_c';
+
+ /**
+ * The directory where config files are located.
+ *
+ * @var string
+ */
+ var $config_dir = 'configs';
+
+ /**
+ * An array of directories searched for plugins.
+ *
+ * @var array
+ */
+ var $plugins_dir = array('plugins');
+
+ /**
+ * If debugging is enabled, a debug console window will display
+ * when the page loads (make sure your browser allows unrequested
+ * popup windows)
+ *
+ * @var boolean
+ */
+ var $debugging = false;
+
+ /**
+ * When set, smarty does uses this value as error_reporting-level.
+ *
+ * @var boolean
+ */
+ var $error_reporting = null;
+
+ /**
+ * This is the path to the debug console template. If not set,
+ * the default one will be used.
+ *
+ * @var string
+ */
+ var $debug_tpl = '';
+
+ /**
+ * This determines if debugging is enable-able from the browser.
+ * <ul>
+ * <li>NONE => no debugging control allowed</li>
+ * <li>URL => enable debugging when SMARTY_DEBUG is found in the URL.</li>
+ * </ul>
+ * @link http://www.foo.dom/index.php?SMARTY_DEBUG
+ * @var string
+ */
+ var $debugging_ctrl = 'NONE';
+
+ /**
+ * This tells Smarty whether to check for recompiling or not. Recompiling
+ * does not need to happen unless a template or config file is changed.
+ * Typically you enable this during development, and disable for
+ * production.
+ *
+ * @var boolean
+ */
+ var $compile_check = true;
+
+ /**
+ * This forces templates to compile every time. Useful for development
+ * or debugging.
+ *
+ * @var boolean
+ */
+ var $force_compile = false;
+
+ /**
+ * This enables template caching.
+ * <ul>
+ * <li>0 = no caching</li>
+ * <li>1 = use class cache_lifetime value</li>
+ * <li>2 = use cache_lifetime in cache file</li>
+ * </ul>
+ * @var integer
+ */
+ var $caching = 0;
+
+ /**
+ * The name of the directory for cache files.
+ *
+ * @var string
+ */
+ var $cache_dir = 'cache';
+
+ /**
+ * This is the number of seconds cached content will persist.
+ * <ul>
+ * <li>0 = always regenerate cache</li>
+ * <li>-1 = never expires</li>
+ * </ul>
+ *
+ * @var integer
+ */
+ var $cache_lifetime = 3600;
+
+ /**
+ * Only used when $caching is enabled. If true, then If-Modified-Since headers
+ * are respected with cached content, and appropriate HTTP headers are sent.
+ * This way repeated hits to a cached page do not send the entire page to the
+ * client every time.
+ *
+ * @var boolean
+ */
+ var $cache_modified_check = false;
+
+ /**
+ * This determines how Smarty handles "<?php ... ?>" tags in templates.
+ * possible values:
+ * <ul>
+ * <li>SMARTY_PHP_PASSTHRU -> print tags as plain text</li>
+ * <li>SMARTY_PHP_QUOTE -> escape tags as entities</li>
+ * <li>SMARTY_PHP_REMOVE -> remove php tags</li>
+ * <li>SMARTY_PHP_ALLOW -> execute php tags</li>
+ * </ul>
+ *
+ * @var integer
+ */
+ var $php_handling = SMARTY_PHP_PASSTHRU;
+
+ /**
+ * This enables template security. When enabled, many things are restricted
+ * in the templates that normally would go unchecked. This is useful when
+ * untrusted parties are editing templates and you want a reasonable level
+ * of security. (no direct execution of PHP in templates for example)
+ *
+ * @var boolean
+ */
+ var $security = false;
+
+ /**
+ * This is the list of template directories that are considered secure. This
+ * is used only if {@link $security} is enabled. One directory per array
+ * element. {@link $template_dir} is in this list implicitly.
+ *
+ * @var array
+ */
+ var $secure_dir = array();
+
+ /**
+ * These are the security settings for Smarty. They are used only when
+ * {@link $security} is enabled.
+ *
+ * @var array
+ */
+ var $security_settings = array(
+ 'PHP_HANDLING' => false,
+ 'IF_FUNCS' => array('array', 'list',
+ 'isset', 'empty',
+ 'count', 'sizeof',
+ 'in_array', 'is_array',
+ 'true', 'false', 'null'),
+ 'INCLUDE_ANY' => false,
+ 'PHP_TAGS' => false,
+ 'MODIFIER_FUNCS' => array('count'),
+ 'ALLOW_CONSTANTS' => false
+ );
+
+ /**
+ * This is an array of directories where trusted php scripts reside.
+ * {@link $security} is disabled during their inclusion/execution.
+ *
+ * @var array
+ */
+ var $trusted_dir = array();
+
+ /**
+ * The left delimiter used for the template tags.
+ *
+ * @var string
+ */
+ var $left_delimiter = '{';
+
+ /**
+ * The right delimiter used for the template tags.
+ *
+ * @var string
+ */
+ var $right_delimiter = '}';
+
+ /**
+ * The order in which request variables are registered, similar to
+ * variables_order in php.ini E = Environment, G = GET, P = POST,
+ * C = Cookies, S = Server
+ *
+ * @var string
+ */
+ var $request_vars_order = 'EGPCS';
+
+ /**
+ * Indicates wether $HTTP_*_VARS[] (request_use_auto_globals=false)
+ * are uses as request-vars or $_*[]-vars. note: if
+ * request_use_auto_globals is true, then $request_vars_order has
+ * no effect, but the php-ini-value "gpc_order"
+ *
+ * @var boolean
+ */
+ var $request_use_auto_globals = true;
+
+ /**
+ * Set this if you want different sets of compiled files for the same
+ * templates. This is useful for things like different languages.
+ * Instead of creating separate sets of templates per language, you
+ * set different compile_ids like 'en' and 'de'.
+ *
+ * @var string
+ */
+ var $compile_id = null;
+
+ /**
+ * This tells Smarty whether or not to use sub dirs in the cache/ and
+ * templates_c/ directories. sub directories better organized, but
+ * may not work well with PHP safe mode enabled.
+ *
+ * @var boolean
+ *
+ */
+ var $use_sub_dirs = false;
+
+ /**
+ * This is a list of the modifiers to apply to all template variables.
+ * Put each modifier in a separate array element in the order you want
+ * them applied. example: <code>array('escape:"htmlall"');</code>
+ *
+ * @var array
+ */
+ var $default_modifiers = array();
+
+ /**
+ * This is the resource type to be used when not specified
+ * at the beginning of the resource path. examples:
+ * $smarty->display('file:index.tpl');
+ * $smarty->display('db:index.tpl');
+ * $smarty->display('index.tpl'); // will use default resource type
+ * {include file="file:index.tpl"}
+ * {include file="db:index.tpl"}
+ * {include file="index.tpl"} {* will use default resource type *}
+ *
+ * @var array
+ */
+ var $default_resource_type = 'file';
+
+ /**
+ * The function used for cache file handling. If not set, built-in caching is used.
+ *
+ * @var null|string function name
+ */
+ var $cache_handler_func = null;
+
+ /**
+ * This indicates which filters are automatically loaded into Smarty.
+ *
+ * @var array array of filter names
+ */
+ var $autoload_filters = array();
+
+ /**#@+
+ * @var boolean
+ */
+ /**
+ * This tells if config file vars of the same name overwrite each other or not.
+ * if disabled, same name variables are accumulated in an array.
+ */
+ var $config_overwrite = true;
+
+ /**
+ * This tells whether or not to automatically booleanize config file variables.
+ * If enabled, then the strings "on", "true", and "yes" are treated as boolean
+ * true, and "off", "false" and "no" are treated as boolean false.
+ */
+ var $config_booleanize = true;
+
+ /**
+ * This tells whether hidden sections [.foobar] are readable from the
+ * tempalates or not. Normally you would never allow this since that is
+ * the point behind hidden sections: the application can access them, but
+ * the templates cannot.
+ */
+ var $config_read_hidden = false;
+
+ /**
+ * This tells whether or not automatically fix newlines in config files.
+ * It basically converts \r (mac) or \r\n (dos) to \n
+ */
+ var $config_fix_newlines = true;
+ /**#@-*/
+
+ /**
+ * If a template cannot be found, this PHP function will be executed.
+ * Useful for creating templates on-the-fly or other special action.
+ *
+ * @var string function name
+ */
+ var $default_template_handler_func = '';
+
+ /**
+ * The file that contains the compiler class. This can a full
+ * pathname, or relative to the php_include path.
+ *
+ * @var string
+ */
+ var $compiler_file = 'Smarty_Compiler.class.php';
+
+ /**
+ * The class used for compiling templates.
+ *
+ * @var string
+ */
+ var $compiler_class = 'Smarty_Compiler';
+
+ /**
+ * The class used to load config vars.
+ *
+ * @var string
+ */
+ var $config_class = 'Config_File';
+
+/**#@+
+ * END Smarty Configuration Section
+ * There should be no need to touch anything below this line.
+ * @access private
+ */
+ /**
+ * where assigned template vars are kept
+ *
+ * @var array
+ */
+ var $_tpl_vars = array();
+
+ /**
+ * stores run-time $smarty.* vars
+ *
+ * @var null|array
+ */
+ var $_smarty_vars = null;
+
+ /**
+ * keeps track of sections
+ *
+ * @var array
+ */
+ var $_sections = array();
+
+ /**
+ * keeps track of foreach blocks
+ *
+ * @var array
+ */
+ var $_foreach = array();
+
+ /**
+ * keeps track of tag hierarchy
+ *
+ * @var array
+ */
+ var $_tag_stack = array();
+
+ /**
+ * configuration object
+ *
+ * @var Config_file
+ */
+ var $_conf_obj = null;
+
+ /**
+ * loaded configuration settings
+ *
+ * @var array
+ */
+ var $_config = array(array('vars' => array(), 'files' => array()));
+
+ /**
+ * md5 checksum of the string 'Smarty'
+ *
+ * @var string
+ */
+ var $_smarty_md5 = 'f8d698aea36fcbead2b9d5359ffca76f';
+
+ /**
+ * Smarty version number
+ *
+ * @var string
+ */
+ var $_version = '2.6.18';
+
+ /**
+ * current template inclusion depth
+ *
+ * @var integer
+ */
+ var $_inclusion_depth = 0;
+
+ /**
+ * for different compiled templates
+ *
+ * @var string
+ */
+ var $_compile_id = null;
+
+ /**
+ * text in URL to enable debug mode
+ *
+ * @var string
+ */
+ var $_smarty_debug_id = 'SMARTY_DEBUG';
+
+ /**
+ * debugging information for debug console
+ *
+ * @var array
+ */
+ var $_smarty_debug_info = array();
+
+ /**
+ * info that makes up a cache file
+ *
+ * @var array
+ */
+ var $_cache_info = array();
+
+ /**
+ * default file permissions
+ *
+ * @var integer
+ */
+ var $_file_perms = 0644;
+
+ /**
+ * default dir permissions
+ *
+ * @var integer
+ */
+ var $_dir_perms = 0771;
+
+ /**
+ * registered objects
+ *
+ * @var array
+ */
+ var $_reg_objects = array();
+
+ /**
+ * table keeping track of plugins
+ *
+ * @var array
+ */
+ var $_plugins = array(
+ 'modifier' => array(),
+ 'function' => array(),
+ 'block' => array(),
+ 'compiler' => array(),
+ 'prefilter' => array(),
+ 'postfilter' => array(),
+ 'outputfilter' => array(),
+ 'resource' => array(),
+ 'insert' => array());
+
+
+ /**
+ * cache serials
+ *
+ * @var array
+ */
+ var $_cache_serials = array();
+
+ /**
+ * name of optional cache include file
+ *
+ * @var string
+ */
+ var $_cache_include = null;
+
+ /**
+ * indicate if the current code is used in a compiled
+ * include
+ *
+ * @var string
+ */
+ var $_cache_including = false;
+
+ /**#@-*/
+ /**
+ * The class constructor.
+ */
+ function Smarty()
+ {
+ $this->assign('SCRIPT_NAME', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME']
+ : @$GLOBALS['HTTP_SERVER_VARS']['SCRIPT_NAME']);
+ }
+
+ /**
+ * assigns values to template variables
+ *
+ * @param array|string $tpl_var the template variable name(s)
+ * @param mixed $value the value to assign
+ */
+ function assign($tpl_var, $value = null)
+ {
+ if (is_array($tpl_var)){
+ foreach ($tpl_var as $key => $val) {
+ if ($key != '') {
+ $this->_tpl_vars[$key] = $val;
+ }
+ }
+ } else {
+ if ($tpl_var != '')
+ $this->_tpl_vars[$tpl_var] = $value;
+ }
+ }
+
+ /**
+ * assigns values to template variables by reference
+ *
+ * @param string $tpl_var the template variable name
+ * @param mixed $value the referenced value to assign
+ */
+ function assign_by_ref($tpl_var, &$value)
+ {
+ if ($tpl_var != '')
+ $this->_tpl_vars[$tpl_var] = &$value;
+ }
+
+ /**
+ * appends values to template variables
+ *
+ * @param array|string $tpl_var the template variable name(s)
+ * @param mixed $value the value to append
+ */
+ function append($tpl_var, $value=null, $merge=false)
+ {
+ if (is_array($tpl_var)) {
+ // $tpl_var is an array, ignore $value
+ foreach ($tpl_var as $_key => $_val) {
+ if ($_key != '') {
+ if(!@is_array($this->_tpl_vars[$_key])) {
+ settype($this->_tpl_vars[$_key],'array');
+ }
+ if($merge && is_array($_val)) {
+ foreach($_val as $_mkey => $_mval) {
+ $this->_tpl_vars[$_key][$_mkey] = $_mval;
+ }
+ } else {
+ $this->_tpl_vars[$_key][] = $_val;
+ }
+ }
+ }
+ } else {
+ if ($tpl_var != '' && isset($value)) {
+ if(!@is_array($this->_tpl_vars[$tpl_var])) {
+ settype($this->_tpl_vars[$tpl_var],'array');
+ }
+ if($merge && is_array($value)) {
+ foreach($value as $_mkey => $_mval) {
+ $this->_tpl_vars[$tpl_var][$_mkey] = $_mval;
+ }
+ } else {
+ $this->_tpl_vars[$tpl_var][] = $value;
+ }
+ }
+ }
+ }
+
+ /**
+ * appends values to template variables by reference
+ *
+ * @param string $tpl_var the template variable name
+ * @param mixed $value the referenced value to append
+ */
+ function append_by_ref($tpl_var, &$value, $merge=false)
+ {
+ if ($tpl_var != '' && isset($value)) {
+ if(!@is_array($this->_tpl_vars[$tpl_var])) {
+ settype($this->_tpl_vars[$tpl_var],'array');
+ }
+ if ($merge && is_array($value)) {
+ foreach($value as $_key => $_val) {
+ $this->_tpl_vars[$tpl_var][$_key] = &$value[$_key];
+ }
+ } else {
+ $this->_tpl_vars[$tpl_var][] = &$value;
+ }
+ }
+ }
+
+
+ /**
+ * clear the given assigned template variable.
+ *
+ * @param string $tpl_var the template variable to clear
+ */
+ function clear_assign($tpl_var)
+ {
+ if (is_array($tpl_var))
+ foreach ($tpl_var as $curr_var)
+ unset($this->_tpl_vars[$curr_var]);
+ else
+ unset($this->_tpl_vars[$tpl_var]);
+ }
+
+
+ /**
+ * Registers custom function to be used in templates
+ *
+ * @param string $function the name of the template function
+ * @param string $function_impl the name of the PHP function to register
+ */
+ function register_function($function, $function_impl, $cacheable=true, $cache_attrs=null)
+ {
+ $this->_plugins['function'][$function] =
+ array($function_impl, null, null, false, $cacheable, $cache_attrs);
+
+ }
+
+ /**
+ * Unregisters custom function
+ *
+ * @param string $function name of template function
+ */
+ function unregister_function($function)
+ {
+ unset($this->_plugins['function'][$function]);
+ }
+
+ /**
+ * Registers object to be used in templates
+ *
+ * @param string $object name of template object
+ * @param object &$object_impl the referenced PHP object to register
+ * @param null|array $allowed list of allowed methods (empty = all)
+ * @param boolean $smarty_args smarty argument format, else traditional
+ * @param null|array $block_functs list of methods that are block format
+ */
+ function register_object($object, &$object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
+ {
+ settype($allowed, 'array');
+ settype($smarty_args, 'boolean');
+ $this->_reg_objects[$object] =
+ array(&$object_impl, $allowed, $smarty_args, $block_methods);
+ }
+
+ /**
+ * Unregisters object
+ *
+ * @param string $object name of template object
+ */
+ function unregister_object($object)
+ {
+ unset($this->_reg_objects[$object]);
+ }
+
+
+ /**
+ * Registers block function to be used in templates
+ *
+ * @param string $block name of template block
+ * @param string $block_impl PHP function to register
+ */
+ function register_block($block, $block_impl, $cacheable=true, $cache_attrs=null)
+ {
+ $this->_plugins['block'][$block] =
+ array($block_impl, null, null, false, $cacheable, $cache_attrs);
+ }
+
+ /**
+ * Unregisters block function
+ *
+ * @param string $block name of template function
+ */
+ function unregister_block($block)
+ {
+ unset($this->_plugins['block'][$block]);
+ }
+
+ /**
+ * Registers compiler function
+ *
+ * @param string $function name of template function
+ * @param string $function_impl name of PHP function to register
+ */
+ function register_compiler_function($function, $function_impl, $cacheable=true)
+ {
+ $this->_plugins['compiler'][$function] =
+ array($function_impl, null, null, false, $cacheable);
+ }
+
+ /**
+ * Unregisters compiler function
+ *
+ * @param string $function name of template function
+ */
+ function unregister_compiler_function($function)
+ {
+ unset($this->_plugins['compiler'][$function]);
+ }
+
+ /**
+ * Registers modifier to be used in templates
+ *
+ * @param string $modifier name of template modifier
+ * @param string $modifier_impl name of PHP function to register
+ */
+ function register_modifier($modifier, $modifier_impl)
+ {
+ $this->_plugins['modifier'][$modifier] =
+ array($modifier_impl, null, null, false);
+ }
+
+ /**
+ * Unregisters modifier
+ *
+ * @param string $modifier name of template modifier
+ */
+ function unregister_modifier($modifier)
+ {
+ unset($this->_plugins['modifier'][$modifier]);
+ }
+
+ /**
+ * Registers a resource to fetch a template
+ *
+ * @param string $type name of resource
+ * @param array $functions array of functions to handle resource
+ */
+ function register_resource($type, $functions)
+ {
+ if (count($functions)==4) {
+ $this->_plugins['resource'][$type] =
+ array($functions, false);
+
+ } elseif (count($functions)==5) {
+ $this->_plugins['resource'][$type] =
+ array(array(array(&$functions[0], $functions[1])
+ ,array(&$functions[0], $functions[2])
+ ,array(&$functions[0], $functions[3])
+ ,array(&$functions[0], $functions[4]))
+ ,false);
+
+ } else {
+ $this->trigger_error("malformed function-list for '$type' in register_resource");
+
+ }
+ }
+
+ /**
+ * Unregisters a resource
+ *
+ * @param string $type name of resource
+ */
+ function unregister_resource($type)
+ {
+ unset($this->_plugins['resource'][$type]);
+ }
+
+ /**
+ * Registers a prefilter function to apply
+ * to a template before compiling
+ *
+ * @param string $function name of PHP function to register
+ */
+ function register_prefilter($function)
+ {
+ $_name = (is_array($function)) ? $function[1] : $function;
+ $this->_plugins['prefilter'][$_name]
+ = array($function, null, null, false);
+ }
+
+ /**
+ * Unregisters a prefilter function
+ *
+ * @param string $function name of PHP function
+ */
+ function unregister_prefilter($function)
+ {
+ unset($this->_plugins['prefilter'][$function]);
+ }
+
+ /**
+ * Registers a postfilter function to apply
+ * to a compiled template after compilation
+ *
+ * @param string $function name of PHP function to register
+ */
+ function register_postfilter($function)
+ {
+ $_name = (is_array($function)) ? $function[1] : $function;
+ $this->_plugins['postfilter'][$_name]
+ = array($function, null, null, false);
+ }
+
+ /**
+ * Unregisters a postfilter function
+ *
+ * @param string $function name of PHP function
+ */
+ function unregister_postfilter($function)
+ {
+ unset($this->_plugins['postfilter'][$function]);
+ }
+
+ /**
+ * Registers an output filter function to apply
+ * to a template output
+ *
+ * @param string $function name of PHP function
+ */
+ function register_outputfilter($function)
+ {
+ $_name = (is_array($function)) ? $function[1] : $function;
+ $this->_plugins['outputfilter'][$_name]
+ = array($function, null, null, false);
+ }
+
+ /**
+ * Unregisters an outputfilter function
+ *
+ * @param string $function name of PHP function
+ */
+ function unregister_outputfilter($function)
+ {
+ unset($this->_plugins['outputfilter'][$function]);
+ }
+
+ /**
+ * load a filter of specified type and name
+ *
+ * @param string $type filter type
+ * @param string $name filter name
+ */
+ function load_filter($type, $name)
+ {
+ switch ($type) {
+ case 'output':
+ $_params = array('plugins' => array(array($type . 'filter', $name, null, null, false)));
+ require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
+ smarty_core_load_plugins($_params, $this);
+ break;
+
+ case 'pre':
+ case 'post':
+ if (!isset($this->_plugins[$type . 'filter'][$name]))
+ $this->_plugins[$type . 'filter'][$name] = false;
+ break;
+ }
+ }
+
+ /**
+ * clear cached content for the given template and cache id
+ *
+ * @param string $tpl_file name of template file
+ * @param string $cache_id name of cache_id
+ * @param string $compile_id name of compile_id
+ * @param string $exp_time expiration time
+ * @return boolean
+ */
+ function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null)
+ {
+
+ if (!isset($compile_id))
+ $compile_id = $this->compile_id;
+
+ if (!isset($tpl_file))
+ $compile_id = null;
+
+ $_auto_id = $this->_get_auto_id($cache_id, $compile_id);
+
+ if (!empty($this->cache_handler_func)) {
+ return call_user_func_array($this->cache_handler_func,
+ array('clear', &$this, &$dummy, $tpl_file, $cache_id, $compile_id, $exp_time));
+ } else {
+ $_params = array('auto_base' => $this->cache_dir,
+ 'auto_source' => $tpl_file,
+ 'auto_id' => $_auto_id,
+ 'exp_time' => $exp_time);
+ require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
+ return smarty_core_rm_auto($_params, $this);
+ }
+
+ }
+
+
+ /**
+ * clear the entire contents of cache (all templates)
+ *
+ * @param string $exp_time expire time
+ * @return boolean results of {@link smarty_core_rm_auto()}
+ */
+ function clear_all_cache($exp_time = null)
+ {
+ return $this->clear_cache(null, null, null, $exp_time);
+ }
+
+
+ /**
+ * test to see if valid cache exists for this template
+ *
+ * @param string $tpl_file name of template file
+ * @param string $cache_id
+ * @param string $compile_id
+ * @return string|false results of {@link _read_cache_file()}
+ */
+ function is_cached($tpl_file, $cache_id = null, $compile_id = null)
+ {
+ if (!$this->caching)
+ return false;
+
+ if (!isset($compile_id))
+ $compile_id = $this->compile_id;
+
+ $_params = array(
+ 'tpl_file' => $tpl_file,
+ 'cache_id' => $cache_id,
+ 'compile_id' => $compile_id
+ );
+ require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php');
+ return smarty_core_read_cache_file($_params, $this);
+ }
+
+
+ /**
+ * clear all the assigned template variables.
+ *
+ */
+ function clear_all_assign()
+ {
+ $this->_tpl_vars = array();
+ }
+
+ /**
+ * clears compiled version of specified template resource,
+ * or all compiled template files if one is not specified.
+ * This function is for advanced use only, not normally needed.
+ *
+ * @param string $tpl_file
+ * @param string $compile_id
+ * @param string $exp_time
+ * @return boolean results of {@link smarty_core_rm_auto()}
+ */
+ function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null)
+ {
+ if (!isset($compile_id)) {
+ $compile_id = $this->compile_id;
+ }
+ $_params = array('auto_base' => $this->compile_dir,
+ 'auto_source' => $tpl_file,
+ 'auto_id' => $compile_id,
+ 'exp_time' => $exp_time,
+ 'extensions' => array('.inc', '.php'));
+ require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
+ return smarty_core_rm_auto($_params, $this);
+ }
+
+ /**
+ * Checks whether requested template exists.
+ *
+ * @param string $tpl_file
+ * @return boolean
+ */
+ function template_exists($tpl_file)
+ {
+ $_params = array('resource_name' => $tpl_file, 'quiet'=>true, 'get_source'=>false);
+ return $this->_fetch_resource_info($_params);
+ }
+
+ /**
+ * Returns an array containing template variables
+ *
+ * @param string $name
+ * @param string $type
+ * @return array
+ */
+ function &get_template_vars($name=null)
+ {
+ if(!isset($name)) {
+ return $this->_tpl_vars;
+ } elseif(isset($this->_tpl_vars[$name])) {
+ return $this->_tpl_vars[$name];
+ } else {
+ // var non-existant, return valid reference
+ $_tmp = null;
+ return $_tmp;
+ }
+ }
+
+ /**
+ * Returns an array containing config variables
+ *
+ * @param string $name
+ * @param string $type
+ * @return array
+ */
+ function &get_config_vars($name=null)
+ {
+ if(!isset($name) && is_array($this->_config[0])) {
+ return $this->_config[0]['vars'];
+ } else if(isset($this->_config[0]['vars'][$name])) {
+ return $this->_config[0]['vars'][$name];
+ } else {
+ // var non-existant, return valid reference
+ $_tmp = null;
+ return $_tmp;
+ }
+ }
+
+ /**
+ * trigger Smarty error
+ *
+ * @param string $error_msg
+ * @param integer $error_type
+ */
+ function trigger_error($error_msg, $error_type = E_USER_WARNING)
+ {
+ trigger_error("Smarty error: $error_msg", $error_type);
+ }
+
+
+ /**
+ * executes & displays the template results
+ *
+ * @param string $resource_name
+ * @param string $cache_id
+ * @param string $compile_id
+ */
+ function display($resource_name, $cache_id = null, $compile_id = null)
+ {
+ $this->fetch($resource_name, $cache_id, $compile_id, true);
+ }
+
+ /**
+ * executes & returns or displays the template results
+ *
+ * @param string $resource_name
+ * @param string $cache_id
+ * @param string $compile_id
+ * @param boolean $display
+ */
+ function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false)
+ {
+ static $_cache_info = array();
+
+ $_smarty_old_error_level = $this->debugging ? error_reporting() : error_reporting(isset($this->error_reporting)
+ ? $this->error_reporting : error_reporting() & ~E_NOTICE);
+
+ if (!$this->debugging && $this->debugging_ctrl == 'URL') {
+ $_query_string = $this->request_use_auto_globals ? $_SERVER['QUERY_STRING'] : $GLOBALS['HTTP_SERVER_VARS']['QUERY_STRING'];
+ if (@strstr($_query_string, $this->_smarty_debug_id)) {
+ if (@strstr($_query_string, $this->_smarty_debug_id . '=on')) {
+ // enable debugging for this browser session
+ @setcookie('SMARTY_DEBUG', true);
+ $this->debugging = true;
+ } elseif (@strstr($_query_string, $this->_smarty_debug_id . '=off')) {
+ // disable debugging for this browser session
+ @setcookie('SMARTY_DEBUG', false);
+ $this->debugging = false;
+ } else {
+ // enable debugging for this page
+ $this->debugging = true;
+ }
+ } else {
+ $this->debugging = (bool)($this->request_use_auto_globals ? @$_COOKIE['SMARTY_DEBUG'] : @$GLOBALS['HTTP_COOKIE_VARS']['SMARTY_DEBUG']);
+ }
+ }
+
+ if ($this->debugging) {
+ // capture time for debugging info
+ $_params = array();
+ require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+ $_debug_start_time = smarty_core_get_microtime($_params, $this);
+ $this->_smarty_debug_info[] = array('type' => 'template',
+ 'filename' => $resource_name,
+ 'depth' => 0);
+ $_included_tpls_idx = count($this->_smarty_debug_info) - 1;
+ }
+
+ if (!isset($compile_id)) {
+ $compile_id = $this->compile_id;
+ }
+
+ $this->_compile_id = $compile_id;
+ $this->_inclusion_depth = 0;
+
+ if ($this->caching) {
+ // save old cache_info, initialize cache_info
+ array_push($_cache_info, $this->_cache_info);
+ $this->_cache_info = array();
+ $_params = array(
+ 'tpl_file' => $resource_name,
+ 'cache_id' => $cache_id,
+ 'compile_id' => $compile_id,
+ 'results' => null
+ );
+ require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php');
+ if (smarty_core_read_cache_file($_params, $this)) {
+ $_smarty_results = $_params['results'];
+ if (!empty($this->_cache_info['insert_tags'])) {
+ $_params = array('plugins' => $this->_cache_info['insert_tags']);
+ require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
+ smarty_core_load_plugins($_params, $this);
+ $_params = array('results' => $_smarty_results);
+ require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php');
+ $_smarty_results = smarty_core_process_cached_inserts($_params, $this);
+ }
+ if (!empty($this->_cache_info['cache_serials'])) {
+ $_params = array('results' => $_smarty_results);
+ require_once(SMARTY_CORE_DIR . 'core.process_compiled_include.php');
+ $_smarty_results = smarty_core_process_compiled_include($_params, $this);
+ }
+
+
+ if ($display) {
+ if ($this->debugging)
+ {
+ // capture time for debugging info
+ $_params = array();
+ require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+ $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $_debug_start_time;
+ require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
+ $_smarty_results .= smarty_core_display_debug_console($_params, $this);
+ }
+ if ($this->cache_modified_check) {
+ $_server_vars = ($this->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
+ $_last_modified_date = @substr($_server_vars['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_server_vars['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
+ $_gmt_mtime = gmdate('D, d M Y H:i:s', $this->_cache_info['timestamp']).' GMT';
+ if (@count($this->_cache_info['insert_tags']) == 0
+ && !$this->_cache_serials
+ && $_gmt_mtime == $_last_modified_date) {
+ if (php_sapi_name()=='cgi')
+ header('Status: 304 Not Modified');
+ else
+ header('HTTP/1.1 304 Not Modified');
+
+ } else {
+ header('Last-Modified: '.$_gmt_mtime);
+ echo $_smarty_results;
+ }
+ } else {
+ echo $_smarty_results;
+ }
+ error_reporting($_smarty_old_error_level);
+ // restore initial cache_info
+ $this->_cache_info = array_pop($_cache_info);
+ return true;
+ } else {
+ error_reporting($_smarty_old_error_level);
+ // restore initial cache_info
+ $this->_cache_info = array_pop($_cache_info);
+ return $_smarty_results;
+ }
+ } else {
+ $this->_cache_info['template'][$resource_name] = true;
+ if ($this->cache_modified_check && $display) {
+ header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT');
+ }
+ }
+ }
+
+ // load filters that are marked as autoload
+ if (count($this->autoload_filters)) {
+ foreach ($this->autoload_filters as $_filter_type => $_filters) {
+ foreach ($_filters as $_filter) {
+ $this->load_filter($_filter_type, $_filter);
+ }
+ }
+ }
+
+ $_smarty_compile_path = $this->_get_compile_path($resource_name);
+
+ // if we just need to display the results, don't perform output
+ // buffering - for speed
+ $_cache_including = $this->_cache_including;
+ $this->_cache_including = false;
+ if ($display && !$this->caching && count($this->_plugins['outputfilter']) == 0) {
+ if ($this->_is_compiled($resource_name, $_smarty_compile_path)
+ || $this->_compile_resource($resource_name, $_smarty_compile_path))
+ {
+ include($_smarty_compile_path);
+ }
+ } else {
+ ob_start();
+ if ($this->_is_compiled($resource_name, $_smarty_compile_path)
+ || $this->_compile_resource($resource_name, $_smarty_compile_path))
+ {
+ include($_smarty_compile_path);
+ }
+ $_smarty_results = ob_get_contents();
+ ob_end_clean();
+
+ foreach ((array)$this->_plugins['outputfilter'] as $_output_filter) {
+ $_smarty_results = call_user_func_array($_output_filter[0], array($_smarty_results, &$this));
+ }
+ }
+
+ if ($this->caching) {
+ $_params = array('tpl_file' => $resource_name,
+ 'cache_id' => $cache_id,
+ 'compile_id' => $compile_id,
+ 'results' => $_smarty_results);
+ require_once(SMARTY_CORE_DIR . 'core.write_cache_file.php');
+ smarty_core_write_cache_file($_params, $this);
+ require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php');
+ $_smarty_results = smarty_core_process_cached_inserts($_params, $this);
+
+ if ($this->_cache_serials) {
+ // strip nocache-tags from output
+ $_smarty_results = preg_replace('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!s'
+ ,''
+ ,$_smarty_results);
+ }
+ // restore initial cache_info
+ $this->_cache_info = array_pop($_cache_info);
+ }
+ $this->_cache_including = $_cache_including;
+
+ if ($display) {
+ if (isset($_smarty_results)) { echo $_smarty_results; }
+ if ($this->debugging) {
+ // capture time for debugging info
+ $_params = array();
+ require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+ $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = (smarty_core_get_microtime($_params, $this) - $_debug_start_time);
+ require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
+ echo smarty_core_display_debug_console($_params, $this);
+ }
+ error_reporting($_smarty_old_error_level);
+ return;
+ } else {
+ error_reporting($_smarty_old_error_level);
+ if (isset($_smarty_results)) { return $_smarty_results; }
+ }
+ }
+
+ /**
+ * load configuration values
+ *
+ * @param string $file
+ * @param string $section
+ * @param string $scope
+ */
+ function config_load($file, $section = null, $scope = 'global')
+ {
+ require_once($this->_get_plugin_filepath('function', 'config_load'));
+ smarty_function_config_load(array('file' => $file, 'section' => $section, 'scope' => $scope), $this);
+ }
+
+ /**
+ * return a reference to a registered object
+ *
+ * @param string $name
+ * @return object
+ */
+ function &get_registered_object($name) {
+ if (!isset($this->_reg_objects[$name]))
+ $this->_trigger_fatal_error("'$name' is not a registered object");
+
+ if (!is_object($this->_reg_objects[$name][0]))
+ $this->_trigger_fatal_error("registered '$name' is not an object");
+
+ return $this->_reg_objects[$name][0];
+ }
+
+ /**
+ * clear configuration values
+ *
+ * @param string $var
+ */
+ function clear_config($var = null)
+ {
+ if(!isset($var)) {
+ // clear all values
+ $this->_config = array(array('vars' => array(),
+ 'files' => array()));
+ } else {
+ unset($this->_config[0]['vars'][$var]);
+ }
+ }
+
+ /**
+ * get filepath of requested plugin
+ *
+ * @param string $type
+ * @param string $name
+ * @return string|false
+ */
+ function _get_plugin_filepath($type, $name)
+ {
+ $_params = array('type' => $type, 'name' => $name);
+ require_once(SMARTY_CORE_DIR . 'core.assemble_plugin_filepath.php');
+ return smarty_core_assemble_plugin_filepath($_params, $this);
+ }
+
+ /**
+ * test if resource needs compiling
+ *
+ * @param string $resource_name
+ * @param string $compile_path
+ * @return boolean
+ */
+ function _is_compiled($resource_name, $compile_path)
+ {
+ if (!$this->force_compile && file_exists($compile_path)) {
+ if (!$this->compile_check) {
+ // no need to check compiled file
+ return true;
+ } else {
+ // get file source and timestamp
+ $_params = array('resource_name' => $resource_name, 'get_source'=>false);
+ if (!$this->_fetch_resource_info($_params)) {
+ return false;
+ }
+ if ($_params['resource_timestamp'] <= filemtime($compile_path)) {
+ // template not expired, no recompile
+ return true;
+ } else {
+ // compile template
+ return false;
+ }
+ }
+ } else {
+ // compiled template does not exist, or forced compile
+ return false;
+ }
+ }
+
+ /**
+ * compile the template
+ *
+ * @param string $resource_name
+ * @param string $compile_path
+ * @return boolean
+ */
+ function _compile_resource($resource_name, $compile_path)
+ {
+
+ $_params = array('resource_name' => $resource_name);
+ if (!$this->_fetch_resource_info($_params)) {
+ return false;
+ }
+
+ $_source_content = $_params['source_content'];
+ $_cache_include = substr($compile_path, 0, -4).'.inc';
+
+ if ($this->_compile_source($resource_name, $_source_content, $_compiled_content, $_cache_include)) {
+ // if a _cache_serial was set, we also have to write an include-file:
+ if ($this->_cache_include_info) {
+ require_once(SMARTY_CORE_DIR . 'core.write_compiled_include.php');
+ smarty_core_write_compiled_include(array_merge($this->_cache_include_info, array('compiled_content'=>$_compiled_content, 'resource_name'=>$resource_name)), $this);
+ }
+
+ $_params = array('compile_path'=>$compile_path, 'compiled_content' => $_compiled_content);
+ require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php');
+ smarty_core_write_compiled_resource($_params, $this);
+
+ return true;
+ } else {
+ return false;
+ }
+
+ }
+
+ /**
+ * compile the given source
+ *
+ * @param string $resource_name
+ * @param string $source_content
+ * @param string $compiled_content
+ * @return boolean
+ */
+ function _compile_source($resource_name, &$source_content, &$compiled_content, $cache_include_path=null)
+ {
+ if (file_exists(SMARTY_DIR . $this->compiler_file)) {
+ require_once(SMARTY_DIR . $this->compiler_file);
+ } else {
+ // use include_path
+ require_once($this->compiler_file);
+ }
+
+
+ $smarty_compiler = new $this->compiler_class;
+
+ $smarty_compiler->template_dir = $this->template_dir;
+ $smarty_compiler->compile_dir = $this->compile_dir;
+ $smarty_compiler->plugins_dir = $this->plugins_dir;
+ $smarty_compiler->config_dir = $this->config_dir;
+ $smarty_compiler->force_compile = $this->force_compile;
+ $smarty_compiler->caching = $this->caching;
+ $smarty_compiler->php_handling = $this->php_handling;
+ $smarty_compiler->left_delimiter = $this->left_delimiter;
+ $smarty_compiler->right_delimiter = $this->right_delimiter;
+ $smarty_compiler->_version = $this->_version;
+ $smarty_compiler->security = $this->security;
+ $smarty_compiler->secure_dir = $this->secure_dir;
+ $smarty_compiler->security_settings = $this->security_settings;
+ $smarty_compiler->trusted_dir = $this->trusted_dir;
+ $smarty_compiler->use_sub_dirs = $this->use_sub_dirs;
+ $smarty_compiler->_reg_objects = &$this->_reg_objects;
+ $smarty_compiler->_plugins = &$this->_plugins;
+ $smarty_compiler->_tpl_vars = &$this->_tpl_vars;
+ $smarty_compiler->default_modifiers = $this->default_modifiers;
+ $smarty_compiler->compile_id = $this->_compile_id;
+ $smarty_compiler->_config = $this->_config;
+ $smarty_compiler->request_use_auto_globals = $this->request_use_auto_globals;
+
+ if (isset($cache_include_path) && isset($this->_cache_serials[$cache_include_path])) {
+ $smarty_compiler->_cache_serial = $this->_cache_serials[$cache_include_path];
+ }
+ $smarty_compiler->_cache_include = $cache_include_path;
+
+
+ $_results = $smarty_compiler->_compile_file($resource_name, $source_content, $compiled_content);
+
+ if ($smarty_compiler->_cache_serial) {
+ $this->_cache_include_info = array(
+ 'cache_serial'=>$smarty_compiler->_cache_serial
+ ,'plugins_code'=>$smarty_compiler->_plugins_code
+ ,'include_file_path' => $cache_include_path);
+
+ } else {
+ $this->_cache_include_info = null;
+
+ }
+
+ return $_results;
+ }
+
+ /**
+ * Get the compile path for this resource
+ *
+ * @param string $resource_name
+ * @return string results of {@link _get_auto_filename()}
+ */
+ function _get_compile_path($resource_name)
+ {
+ return $this->_get_auto_filename($this->compile_dir, $resource_name,
+ $this->_compile_id) . '.php';
+ }
+
+ /**
+ * fetch the template info. Gets timestamp, and source
+ * if get_source is true
+ *
+ * sets $source_content to the source of the template, and
+ * $resource_timestamp to its time stamp
+ * @param string $resource_name
+ * @param string $source_content
+ * @param integer $resource_timestamp
+ * @param boolean $get_source
+ * @param boolean $quiet
+ * @return boolean
+ */
+
+ function _fetch_resource_info(&$params)
+ {
+ if(!isset($params['get_source'])) { $params['get_source'] = true; }
+ if(!isset($params['quiet'])) { $params['quiet'] = false; }
+
+ $_return = false;
+ $_params = array('resource_name' => $params['resource_name']) ;
+ if (isset($params['resource_base_path']))
+ $_params['resource_base_path'] = $params['resource_base_path'];
+ else
+ $_params['resource_base_path'] = $this->template_dir;
+
+ if ($this->_parse_resource_name($_params)) {
+ $_resource_type = $_params['resource_type'];
+ $_resource_name = $_params['resource_name'];
+ switch ($_resource_type) {
+ case 'file':
+ if ($params['get_source']) {
+ $params['source_content'] = $this->_read_file($_resource_name);
+ }
+ $params['resource_timestamp'] = filemtime($_resource_name);
+ $_return = is_file($_resource_name);
+ break;
+
+ default:
+ // call resource functions to fetch the template source and timestamp
+ if ($params['get_source']) {
+ $_source_return = isset($this->_plugins['resource'][$_resource_type]) &&
+ call_user_func_array($this->_plugins['resource'][$_resource_type][0][0],
+ array($_resource_name, &$params['source_content'], &$this));
+ } else {
+ $_source_return = true;
+ }
+
+ $_timestamp_return = isset($this->_plugins['resource'][$_resource_type]) &&
+ call_user_func_array($this->_plugins['resource'][$_resource_type][0][1],
+ array($_resource_name, &$params['resource_timestamp'], &$this));
+
+ $_return = $_source_return && $_timestamp_return;
+ break;
+ }
+ }
+
+ if (!$_return) {
+ // see if we can get a template with the default template handler
+ if (!empty($this->default_template_handler_func)) {
+ if (!is_callable($this->default_template_handler_func)) {
+ $this->trigger_error("default template handler function \"$this->default_template_handler_func\" doesn't exist.");
+ } else {
+ $_return = call_user_func_array(
+ $this->default_template_handler_func,
+ array($_params['resource_type'], $_params['resource_name'], &$params['source_content'], &$params['resource_timestamp'], &$this));
+ }
+ }
+ }
+
+ if (!$_return) {
+ if (!$params['quiet']) {
+ $this->trigger_error('unable to read resource: "' . $params['resource_name'] . '"');
+ }
+ } else if ($_return && $this->security) {
+ require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
+ if (!smarty_core_is_secure($_params, $this)) {
+ if (!$params['quiet'])
+ $this->trigger_error('(secure mode) accessing "' . $params['resource_name'] . '" is not allowed');
+ $params['source_content'] = null;
+ $params['resource_timestamp'] = null;
+ return false;
+ }
+ }
+ return $_return;
+ }
+
+
+ /**
+ * parse out the type and name from the resource
+ *
+ * @param string $resource_base_path
+ * @param string $resource_name
+ * @param string $resource_type
+ * @param string $resource_name
+ * @return boolean
+ */
+
+ function _parse_resource_name(&$params)
+ {
+
+ // split tpl_path by the first colon
+ $_resource_name_parts = explode(':', $params['resource_name'], 2);
+
+ if (count($_resource_name_parts) == 1) {
+ // no resource type given
+ $params['resource_type'] = $this->default_resource_type;
+ $params['resource_name'] = $_resource_name_parts[0];
+ } else {
+ if(strlen($_resource_name_parts[0]) == 1) {
+ // 1 char is not resource type, but part of filepath
+ $params['resource_type'] = $this->default_resource_type;
+ $params['resource_name'] = $params['resource_name'];
+ } else {
+ $params['resource_type'] = $_resource_name_parts[0];
+ $params['resource_name'] = $_resource_name_parts[1];
+ }
+ }
+
+ if ($params['resource_type'] == 'file') {
+ if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $params['resource_name'])) {
+ // relative pathname to $params['resource_base_path']
+ // use the first directory where the file is found
+ foreach ((array)$params['resource_base_path'] as $_curr_path) {
+ $_fullpath = $_curr_path . DIRECTORY_SEPARATOR . $params['resource_name'];
+ if (file_exists($_fullpath) && is_file($_fullpath)) {
+ $params['resource_name'] = $_fullpath;
+ return true;
+ }
+ // didn't find the file, try include_path
+ $_params = array('file_path' => $_fullpath);
+ require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
+ if(smarty_core_get_include_path($_params, $this)) {
+ $params['resource_name'] = $_params['new_file_path'];
+ return true;
+ }
+ }
+ return false;
+ } else {
+ /* absolute path */
+ return file_exists($params['resource_name']);
+ }
+ } elseif (empty($this->_plugins['resource'][$params['resource_type']])) {
+ $_params = array('type' => $params['resource_type']);
+ require_once(SMARTY_CORE_DIR . 'core.load_resource_plugin.php');
+ smarty_core_load_resource_plugin($_params, $this);
+ }
+
+ return true;
+ }
+
+
+ /**
+ * Handle modifiers
+ *
+ * @param string|null $modifier_name
+ * @param array|null $map_array
+ * @return string result of modifiers
+ */
+ function _run_mod_handler()
+ {
+ $_args = func_get_args();
+ list($_modifier_name, $_map_array) = array_splice($_args, 0, 2);
+ list($_func_name, $_tpl_file, $_tpl_line) =
+ $this->_plugins['modifier'][$_modifier_name];
+
+ $_var = $_args[0];
+ foreach ($_var as $_key => $_val) {
+ $_args[0] = $_val;
+ $_var[$_key] = call_user_func_array($_func_name, $_args);
+ }
+ return $_var;
+ }
+
+ /**
+ * Remove starting and ending quotes from the string
+ *
+ * @param string $string
+ * @return string
+ */
+ function _dequote($string)
+ {
+ if ((substr($string, 0, 1) == "'" || substr($string, 0, 1) == '"') &&
+ substr($string, -1) == substr($string, 0, 1))
+ return substr($string, 1, -1);
+ else
+ return $string;
+ }
+
+
+ /**
+ * read in a file
+ *
+ * @param string $filename
+ * @return string
+ */
+ function _read_file($filename)
+ {
+ if ( file_exists($filename) && ($fd = @fopen($filename, 'rb')) ) {
+ $contents = '';
+ while (!feof($fd)) {
+ $contents .= fread($fd, 8192);
+ }
+ fclose($fd);
+ return $contents;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * get a concrete filename for automagically created content
+ *
+ * @param string $auto_base
+ * @param string $auto_source
+ * @param string $auto_id
+ * @return string
+ * @staticvar string|null
+ * @staticvar string|null
+ */
+ function _get_auto_filename($auto_base, $auto_source = null, $auto_id = null)
+ {
+ $_compile_dir_sep = $this->use_sub_dirs ? DIRECTORY_SEPARATOR : '^';
+ $_return = $auto_base . DIRECTORY_SEPARATOR;
+
+ if(isset($auto_id)) {
+ // make auto_id safe for directory names
+ $auto_id = str_replace('%7C',$_compile_dir_sep,(urlencode($auto_id)));
+ // split into separate directories
+ $_return .= $auto_id . $_compile_dir_sep;
+ }
+
+ if(isset($auto_source)) {
+ // make source name safe for filename
+ $_filename = urlencode(basename($auto_source));
+ $_crc32 = sprintf('%08X', crc32($auto_source));
+ // prepend %% to avoid name conflicts with
+ // with $params['auto_id'] names
+ $_crc32 = substr($_crc32, 0, 2) . $_compile_dir_sep .
+ substr($_crc32, 0, 3) . $_compile_dir_sep . $_crc32;
+ $_return .= '%%' . $_crc32 . '%%' . $_filename;
+ }
+
+ return $_return;
+ }
+
+ /**
+ * unlink a file, possibly using expiration time
+ *
+ * @param string $resource
+ * @param integer $exp_time
+ */
+ function _unlink($resource, $exp_time = null)
+ {
+ if(isset($exp_time)) {
+ if(time() - @filemtime($resource) >= $exp_time) {
+ return @unlink($resource);
+ }
+ } else {
+ return @unlink($resource);
+ }
+ }
+
+ /**
+ * returns an auto_id for auto-file-functions
+ *
+ * @param string $cache_id
+ * @param string $compile_id
+ * @return string|null
+ */
+ function _get_auto_id($cache_id=null, $compile_id=null) {
+ if (isset($cache_id))
+ return (isset($compile_id)) ? $cache_id . '|' . $compile_id : $cache_id;
+ elseif(isset($compile_id))
+ return $compile_id;
+ else
+ return null;
+ }
+
+ /**
+ * trigger Smarty plugin error
+ *
+ * @param string $error_msg
+ * @param string $tpl_file
+ * @param integer $tpl_line
+ * @param string $file
+ * @param integer $line
+ * @param integer $error_type
+ */
+ function _trigger_fatal_error($error_msg, $tpl_file = null, $tpl_line = null,
+ $file = null, $line = null, $error_type = E_USER_ERROR)
+ {
+ if(isset($file) && isset($line)) {
+ $info = ' ('.basename($file).", line $line)";
+ } else {
+ $info = '';
+ }
+ if (isset($tpl_line) && isset($tpl_file)) {
+ $this->trigger_error('[in ' . $tpl_file . ' line ' . $tpl_line . "]: $error_msg$info", $error_type);
+ } else {
+ $this->trigger_error($error_msg . $info, $error_type);
+ }
+ }
+
+
+ /**
+ * callback function for preg_replace, to call a non-cacheable block
+ * @return string
+ */
+ function _process_compiled_include_callback($match) {
+ $_func = '_smarty_tplfunc_'.$match[2].'_'.$match[3];
+ ob_start();
+ $_func($this);
+ $_ret = ob_get_contents();
+ ob_end_clean();
+ return $_ret;
+ }
+
+
+ /**
+ * called for included templates
+ *
+ * @param string $_smarty_include_tpl_file
+ * @param string $_smarty_include_vars
+ */
+
+ // $_smarty_include_tpl_file, $_smarty_include_vars
+
+ function _smarty_include($params)
+ {
+ if ($this->debugging) {
+ $_params = array();
+ require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+ $debug_start_time = smarty_core_get_microtime($_params, $this);
+ $this->_smarty_debug_info[] = array('type' => 'template',
+ 'filename' => $params['smarty_include_tpl_file'],
+ 'depth' => ++$this->_inclusion_depth);
+ $included_tpls_idx = count($this->_smarty_debug_info) - 1;
+ }
+
+ $this->_tpl_vars = array_merge($this->_tpl_vars, $params['smarty_include_vars']);
+
+ // config vars are treated as local, so push a copy of the
+ // current ones onto the front of the stack
+ array_unshift($this->_config, $this->_config[0]);
+
+ $_smarty_compile_path = $this->_get_compile_path($params['smarty_include_tpl_file']);
+
+
+ if ($this->_is_compiled($params['smarty_include_tpl_file'], $_smarty_compile_path)
+ || $this->_compile_resource($params['smarty_include_tpl_file'], $_smarty_compile_path))
+ {
+ include($_smarty_compile_path);
+ }
+
+ // pop the local vars off the front of the stack
+ array_shift($this->_config);
+
+ $this->_inclusion_depth--;
+
+ if ($this->debugging) {
+ // capture time for debugging info
+ $_params = array();
+ require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+ $this->_smarty_debug_info[$included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $debug_start_time;
+ }
+
+ if ($this->caching) {
+ $this->_cache_info['template'][$params['smarty_include_tpl_file']] = true;
+ }
+ }
+
+
+ /**
+ * get or set an array of cached attributes for function that is
+ * not cacheable
+ * @return array
+ */
+ function &_smarty_cache_attrs($cache_serial, $count) {
+ $_cache_attrs =& $this->_cache_info['cache_attrs'][$cache_serial][$count];
+
+ if ($this->_cache_including) {
+ /* return next set of cache_attrs */
+ $_return = current($_cache_attrs);
+ next($_cache_attrs);
+ return $_return;
+
+ } else {
+ /* add a reference to a new set of cache_attrs */
+ $_cache_attrs[] = array();
+ return $_cache_attrs[count($_cache_attrs)-1];
+
+ }
+
+ }
+
+
+ /**
+ * wrapper for include() retaining $this
+ * @return mixed
+ */
+ function _include($filename, $once=false, $params=null)
+ {
+ if ($once) {
+ return include_once($filename);
+ } else {
+ return include($filename);
+ }
+ }
+
+
+ /**
+ * wrapper for eval() retaining $this
+ * @return mixed
+ */
+ function _eval($code, $params=null)
+ {
+ return eval($code);
+ }
+ /**#@-*/
+
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/Smarty_Compiler.class.php b/libs/Smarty/Smarty_Compiler.class.php
new file mode 100755
index 0000000000..f54cc2112a
--- /dev/null
+++ b/libs/Smarty/Smarty_Compiler.class.php
@@ -0,0 +1,2327 @@
+<?php
+
+/**
+ * Project: Smarty: the PHP compiling template engine
+ * File: Smarty_Compiler.class.php
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @link http://smarty.php.net/
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Andrei Zmievski <andrei@php.net>
+ * @version 2.6.18
+ * @copyright 2001-2005 New Digital Group, Inc.
+ * @package Smarty
+ */
+
+/* $Id: Smarty_Compiler.class.php,v 1.395 2007/03/06 10:40:06 messju Exp $ */
+
+/**
+ * Template compiling class
+ * @package Smarty
+ */
+class Smarty_Compiler extends Smarty {
+
+ // internal vars
+ /**#@+
+ * @access private
+ */
+ var $_folded_blocks = array(); // keeps folded template blocks
+ var $_current_file = null; // the current template being compiled
+ var $_current_line_no = 1; // line number for error messages
+ var $_capture_stack = array(); // keeps track of nested capture buffers
+ var $_plugin_info = array(); // keeps track of plugins to load
+ var $_init_smarty_vars = false;
+ var $_permitted_tokens = array('true','false','yes','no','on','off','null');
+ var $_db_qstr_regexp = null; // regexps are setup in the constructor
+ var $_si_qstr_regexp = null;
+ var $_qstr_regexp = null;
+ var $_func_regexp = null;
+ var $_reg_obj_regexp = null;
+ var $_var_bracket_regexp = null;
+ var $_num_const_regexp = null;
+ var $_dvar_guts_regexp = null;
+ var $_dvar_regexp = null;
+ var $_cvar_regexp = null;
+ var $_svar_regexp = null;
+ var $_avar_regexp = null;
+ var $_mod_regexp = null;
+ var $_var_regexp = null;
+ var $_parenth_param_regexp = null;
+ var $_func_call_regexp = null;
+ var $_obj_ext_regexp = null;
+ var $_obj_start_regexp = null;
+ var $_obj_params_regexp = null;
+ var $_obj_call_regexp = null;
+ var $_cacheable_state = 0;
+ var $_cache_attrs_count = 0;
+ var $_nocache_count = 0;
+ var $_cache_serial = null;
+ var $_cache_include = null;
+
+ var $_strip_depth = 0;
+ var $_additional_newline = "\n";
+
+ /**#@-*/
+ /**
+ * The class constructor.
+ */
+ function Smarty_Compiler()
+ {
+ // matches double quoted strings:
+ // "foobar"
+ // "foo\"bar"
+ $this->_db_qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"';
+
+ // matches single quoted strings:
+ // 'foobar'
+ // 'foo\'bar'
+ $this->_si_qstr_regexp = '\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'';
+
+ // matches single or double quoted strings
+ $this->_qstr_regexp = '(?:' . $this->_db_qstr_regexp . '|' . $this->_si_qstr_regexp . ')';
+
+ // matches bracket portion of vars
+ // [0]
+ // [foo]
+ // [$bar]
+ $this->_var_bracket_regexp = '\[\$?[\w\.]+\]';
+
+ // matches numerical constants
+ // 30
+ // -12
+ // 13.22
+ $this->_num_const_regexp = '(?:\-?\d+(?:\.\d+)?)';
+
+ // matches $ vars (not objects):
+ // $foo
+ // $foo.bar
+ // $foo.bar.foobar
+ // $foo[0]
+ // $foo[$bar]
+ // $foo[5][blah]
+ // $foo[5].bar[$foobar][4]
+ $this->_dvar_math_regexp = '(?:[\+\*\/\%]|(?:-(?!>)))';
+ $this->_dvar_math_var_regexp = '[\$\w\.\+\-\*\/\%\d\>\[\]]';
+ $this->_dvar_guts_regexp = '\w+(?:' . $this->_var_bracket_regexp
+ . ')*(?:\.\$?\w+(?:' . $this->_var_bracket_regexp . ')*)*(?:' . $this->_dvar_math_regexp . '(?:' . $this->_num_const_regexp . '|' . $this->_dvar_math_var_regexp . ')*)?';
+ $this->_dvar_regexp = '\$' . $this->_dvar_guts_regexp;
+
+ // matches config vars:
+ // #foo#
+ // #foobar123_foo#
+ $this->_cvar_regexp = '\#\w+\#';
+
+ // matches section vars:
+ // %foo.bar%
+ $this->_svar_regexp = '\%\w+\.\w+\%';
+
+ // matches all valid variables (no quotes, no modifiers)
+ $this->_avar_regexp = '(?:' . $this->_dvar_regexp . '|'
+ . $this->_cvar_regexp . '|' . $this->_svar_regexp . ')';
+
+ // matches valid variable syntax:
+ // $foo
+ // $foo
+ // #foo#
+ // #foo#
+ // "text"
+ // "text"
+ $this->_var_regexp = '(?:' . $this->_avar_regexp . '|' . $this->_qstr_regexp . ')';
+
+ // matches valid object call (one level of object nesting allowed in parameters):
+ // $foo->bar
+ // $foo->bar()
+ // $foo->bar("text")
+ // $foo->bar($foo, $bar, "text")
+ // $foo->bar($foo, "foo")
+ // $foo->bar->foo()
+ // $foo->bar->foo->bar()
+ // $foo->bar($foo->bar)
+ // $foo->bar($foo->bar())
+ // $foo->bar($foo->bar($blah,$foo,44,"foo",$foo[0].bar))
+ $this->_obj_ext_regexp = '\->(?:\$?' . $this->_dvar_guts_regexp . ')';
+ $this->_obj_restricted_param_regexp = '(?:'
+ . '(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . ')(?:' . $this->_obj_ext_regexp . '(?:\((?:(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . ')'
+ . '(?:\s*,\s*(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . '))*)?\))?)*)';
+ $this->_obj_single_param_regexp = '(?:\w+|' . $this->_obj_restricted_param_regexp . '(?:\s*,\s*(?:(?:\w+|'
+ . $this->_var_regexp . $this->_obj_restricted_param_regexp . ')))*)';
+ $this->_obj_params_regexp = '\((?:' . $this->_obj_single_param_regexp
+ . '(?:\s*,\s*' . $this->_obj_single_param_regexp . ')*)?\)';
+ $this->_obj_start_regexp = '(?:' . $this->_dvar_regexp . '(?:' . $this->_obj_ext_regexp . ')+)';
+ $this->_obj_call_regexp = '(?:' . $this->_obj_start_regexp . '(?:' . $this->_obj_params_regexp . ')?(?:' . $this->_dvar_math_regexp . '(?:' . $this->_num_const_regexp . '|' . $this->_dvar_math_var_regexp . ')*)?)';
+
+ // matches valid modifier syntax:
+ // |foo
+ // |@foo
+ // |foo:"bar"
+ // |foo:$bar
+ // |foo:"bar":$foobar
+ // |foo|bar
+ // |foo:$foo->bar
+ $this->_mod_regexp = '(?:\|@?\w+(?::(?:\w+|' . $this->_num_const_regexp . '|'
+ . $this->_obj_call_regexp . '|' . $this->_avar_regexp . '|' . $this->_qstr_regexp .'))*)';
+
+ // matches valid function name:
+ // foo123
+ // _foo_bar
+ $this->_func_regexp = '[a-zA-Z_]\w*';
+
+ // matches valid registered object:
+ // foo->bar
+ $this->_reg_obj_regexp = '[a-zA-Z_]\w*->[a-zA-Z_]\w*';
+
+ // matches valid parameter values:
+ // true
+ // $foo
+ // $foo|bar
+ // #foo#
+ // #foo#|bar
+ // "text"
+ // "text"|bar
+ // $foo->bar
+ $this->_param_regexp = '(?:\s*(?:' . $this->_obj_call_regexp . '|'
+ . $this->_var_regexp . '|' . $this->_num_const_regexp . '|\w+)(?>' . $this->_mod_regexp . '*)\s*)';
+
+ // matches valid parenthesised function parameters:
+ //
+ // "text"
+ // $foo, $bar, "text"
+ // $foo|bar, "foo"|bar, $foo->bar($foo)|bar
+ $this->_parenth_param_regexp = '(?:\((?:\w+|'
+ . $this->_param_regexp . '(?:\s*,\s*(?:(?:\w+|'
+ . $this->_param_regexp . ')))*)?\))';
+
+ // matches valid function call:
+ // foo()
+ // foo_bar($foo)
+ // _foo_bar($foo,"bar")
+ // foo123($foo,$foo->bar(),"foo")
+ $this->_func_call_regexp = '(?:' . $this->_func_regexp . '\s*(?:'
+ . $this->_parenth_param_regexp . '))';
+ }
+
+ /**
+ * compile a resource
+ *
+ * sets $compiled_content to the compiled source
+ * @param string $resource_name
+ * @param string $source_content
+ * @param string $compiled_content
+ * @return true
+ */
+ function _compile_file($resource_name, $source_content, &$compiled_content)
+ {
+
+ if ($this->security) {
+ // do not allow php syntax to be executed unless specified
+ if ($this->php_handling == SMARTY_PHP_ALLOW &&
+ !$this->security_settings['PHP_HANDLING']) {
+ $this->php_handling = SMARTY_PHP_PASSTHRU;
+ }
+ }
+
+ $this->_load_filters();
+
+ $this->_current_file = $resource_name;
+ $this->_current_line_no = 1;
+ $ldq = preg_quote($this->left_delimiter, '~');
+ $rdq = preg_quote($this->right_delimiter, '~');
+
+ // run template source through prefilter functions
+ if (count($this->_plugins['prefilter']) > 0) {
+ foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) {
+ if ($prefilter === false) continue;
+ if ($prefilter[3] || is_callable($prefilter[0])) {
+ $source_content = call_user_func_array($prefilter[0],
+ array($source_content, &$this));
+ $this->_plugins['prefilter'][$filter_name][3] = true;
+ } else {
+ $this->_trigger_fatal_error("[plugin] prefilter '$filter_name' is not implemented");
+ }
+ }
+ }
+
+ /* fetch all special blocks */
+ $search = "~{$ldq}\*(.*?)\*{$rdq}|{$ldq}\s*literal\s*{$rdq}(.*?){$ldq}\s*/literal\s*{$rdq}|{$ldq}\s*php\s*{$rdq}(.*?){$ldq}\s*/php\s*{$rdq}~s";
+
+ preg_match_all($search, $source_content, $match, PREG_SET_ORDER);
+ $this->_folded_blocks = $match;
+ reset($this->_folded_blocks);
+
+ /* replace special blocks by "{php}" */
+ $source_content = preg_replace($search.'e', "'"
+ . $this->_quote_replace($this->left_delimiter) . 'php'
+ . "' . str_repeat(\"\n\", substr_count('\\0', \"\n\")) .'"
+ . $this->_quote_replace($this->right_delimiter)
+ . "'"
+ , $source_content);
+
+ /* Gather all template tags. */
+ preg_match_all("~{$ldq}\s*(.*?)\s*{$rdq}~s", $source_content, $_match);
+ $template_tags = $_match[1];
+ /* Split content by template tags to obtain non-template content. */
+ $text_blocks = preg_split("~{$ldq}.*?{$rdq}~s", $source_content);
+
+ /* loop through text blocks */
+ for ($curr_tb = 0, $for_max = count($text_blocks); $curr_tb < $for_max; $curr_tb++) {
+ /* match anything resembling php tags */
+ if (preg_match_all('~(<\?(?:\w+|=)?|\?>|language\s*=\s*[\"\']?\s*php\s*[\"\']?)~is', $text_blocks[$curr_tb], $sp_match)) {
+ /* replace tags with placeholders to prevent recursive replacements */
+ $sp_match[1] = array_unique($sp_match[1]);
+ usort($sp_match[1], '_smarty_sort_length');
+ for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++) {
+ $text_blocks[$curr_tb] = str_replace($sp_match[1][$curr_sp],'%%%SMARTYSP'.$curr_sp.'%%%',$text_blocks[$curr_tb]);
+ }
+ /* process each one */
+ for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++) {
+ if ($this->php_handling == SMARTY_PHP_PASSTHRU) {
+ /* echo php contents */
+ $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', '<?php echo \''.str_replace("'", "\'", $sp_match[1][$curr_sp]).'\'; ?>'."\n", $text_blocks[$curr_tb]);
+ } else if ($this->php_handling == SMARTY_PHP_QUOTE) {
+ /* quote php tags */
+ $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', htmlspecialchars($sp_match[1][$curr_sp]), $text_blocks[$curr_tb]);
+ } else if ($this->php_handling == SMARTY_PHP_REMOVE) {
+ /* remove php tags */
+ $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', '', $text_blocks[$curr_tb]);
+ } else {
+ /* SMARTY_PHP_ALLOW, but echo non php starting tags */
+ $sp_match[1][$curr_sp] = preg_replace('~(<\?(?!php|=|$))~i', '<?php echo \'\\1\'?>'."\n", $sp_match[1][$curr_sp]);
+ $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', $sp_match[1][$curr_sp], $text_blocks[$curr_tb]);
+ }
+ }
+ }
+ }
+
+ /* Compile the template tags into PHP code. */
+ $compiled_tags = array();
+ for ($i = 0, $for_max = count($template_tags); $i < $for_max; $i++) {
+ $this->_current_line_no += substr_count($text_blocks[$i], "\n");
+ $compiled_tags[] = $this->_compile_tag($template_tags[$i]);
+ $this->_current_line_no += substr_count($template_tags[$i], "\n");
+ }
+ if (count($this->_tag_stack)>0) {
+ list($_open_tag, $_line_no) = end($this->_tag_stack);
+ $this->_syntax_error("unclosed tag \{$_open_tag} (opened line $_line_no).", E_USER_ERROR, __FILE__, __LINE__);
+ return;
+ }
+
+ /* Reformat $text_blocks between 'strip' and '/strip' tags,
+ removing spaces, tabs and newlines. */
+ $strip = false;
+ for ($i = 0, $for_max = count($compiled_tags); $i < $for_max; $i++) {
+ if ($compiled_tags[$i] == '{strip}') {
+ $compiled_tags[$i] = '';
+ $strip = true;
+ /* remove leading whitespaces */
+ $text_blocks[$i + 1] = ltrim($text_blocks[$i + 1]);
+ }
+ if ($strip) {
+ /* strip all $text_blocks before the next '/strip' */
+ for ($j = $i + 1; $j < $for_max; $j++) {
+ /* remove leading and trailing whitespaces of each line */
+ $text_blocks[$j] = preg_replace('![\t ]*[\r\n]+[\t ]*!', '', $text_blocks[$j]);
+ if ($compiled_tags[$j] == '{/strip}') {
+ /* remove trailing whitespaces from the last text_block */
+ $text_blocks[$j] = rtrim($text_blocks[$j]);
+ }
+ $text_blocks[$j] = "<?php echo '" . strtr($text_blocks[$j], array("'"=>"\'", "\\"=>"\\\\")) . "'; ?>";
+ if ($compiled_tags[$j] == '{/strip}') {
+ $compiled_tags[$j] = "\n"; /* slurped by php, but necessary
+ if a newline is following the closing strip-tag */
+ $strip = false;
+ $i = $j;
+ break;
+ }
+ }
+ }
+ }
+ $compiled_content = '';
+
+ $tag_guard = '%%%SMARTYOTG' . md5(uniqid(rand(), true)) . '%%%';
+
+ /* Interleave the compiled contents and text blocks to get the final result. */
+ for ($i = 0, $for_max = count($compiled_tags); $i < $for_max; $i++) {
+ if ($compiled_tags[$i] == '') {
+ // tag result empty, remove first newline from following text block
+ $text_blocks[$i+1] = preg_replace('~^(\r\n|\r|\n)~', '', $text_blocks[$i+1]);
+ }
+ // replace legit PHP tags with placeholder
+ $text_blocks[$i] = str_replace('<?', $tag_guard, $text_blocks[$i]);
+ $compiled_tags[$i] = str_replace('<?', $tag_guard, $compiled_tags[$i]);
+
+ $compiled_content .= $text_blocks[$i] . $compiled_tags[$i];
+ }
+ $compiled_content .= str_replace('<?', $tag_guard, $text_blocks[$i]);
+
+ // escape php tags created by interleaving
+ $compiled_content = str_replace('<?', "<?php echo '<?' ?>\n", $compiled_content);
+ $compiled_content = preg_replace("~(?<!')language\s*=\s*[\"\']?\s*php\s*[\"\']?~", "<?php echo 'language=php' ?>\n", $compiled_content);
+
+ // recover legit tags
+ $compiled_content = str_replace($tag_guard, '<?', $compiled_content);
+
+ // remove \n from the end of the file, if any
+ if (strlen($compiled_content) && (substr($compiled_content, -1) == "\n") ) {
+ $compiled_content = substr($compiled_content, 0, -1);
+ }
+
+ if (!empty($this->_cache_serial)) {
+ $compiled_content = "<?php \$this->_cache_serials['".$this->_cache_include."'] = '".$this->_cache_serial."'; ?>" . $compiled_content;
+ }
+
+ // run compiled template through postfilter functions
+ if (count($this->_plugins['postfilter']) > 0) {
+ foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) {
+ if ($postfilter === false) continue;
+ if ($postfilter[3] || is_callable($postfilter[0])) {
+ $compiled_content = call_user_func_array($postfilter[0],
+ array($compiled_content, &$this));
+ $this->_plugins['postfilter'][$filter_name][3] = true;
+ } else {
+ $this->_trigger_fatal_error("Smarty plugin error: postfilter '$filter_name' is not implemented");
+ }
+ }
+ }
+
+ // put header at the top of the compiled template
+ $template_header = "<?php /* Smarty version ".$this->_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n";
+ $template_header .= " compiled from ".strtr(urlencode($resource_name), array('%2F'=>'/', '%3A'=>':'))." */ ?>\n";
+
+ /* Emit code to load needed plugins. */
+ $this->_plugins_code = '';
+ if (count($this->_plugin_info)) {
+ $_plugins_params = "array('plugins' => array(";
+ foreach ($this->_plugin_info as $plugin_type => $plugins) {
+ foreach ($plugins as $plugin_name => $plugin_info) {
+ $_plugins_params .= "array('$plugin_type', '$plugin_name', '" . strtr($plugin_info[0], array("'" => "\\'", "\\" => "\\\\")) . "', $plugin_info[1], ";
+ $_plugins_params .= $plugin_info[2] ? 'true),' : 'false),';
+ }
+ }
+ $_plugins_params .= '))';
+ $plugins_code = "<?php require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');\nsmarty_core_load_plugins($_plugins_params, \$this); ?>\n";
+ $template_header .= $plugins_code;
+ $this->_plugin_info = array();
+ $this->_plugins_code = $plugins_code;
+ }
+
+ if ($this->_init_smarty_vars) {
+ $template_header .= "<?php require_once(SMARTY_CORE_DIR . 'core.assign_smarty_interface.php');\nsmarty_core_assign_smarty_interface(null, \$this); ?>\n";
+ $this->_init_smarty_vars = false;
+ }
+
+ $compiled_content = $template_header . $compiled_content;
+ return true;
+ }
+
+ /**
+ * Compile a template tag
+ *
+ * @param string $template_tag
+ * @return string
+ */
+ function _compile_tag($template_tag)
+ {
+ /* Matched comment. */
+ if (substr($template_tag, 0, 1) == '*' && substr($template_tag, -1) == '*')
+ return '';
+
+ /* Split tag into two three parts: command, command modifiers and the arguments. */
+ if(! preg_match('~^(?:(' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp
+ . '|\/?' . $this->_reg_obj_regexp . '|\/?' . $this->_func_regexp . ')(' . $this->_mod_regexp . '*))
+ (?:\s+(.*))?$
+ ~xs', $template_tag, $match)) {
+ $this->_syntax_error("unrecognized tag: $template_tag", E_USER_ERROR, __FILE__, __LINE__);
+ }
+
+ $tag_command = $match[1];
+ $tag_modifier = isset($match[2]) ? $match[2] : null;
+ $tag_args = isset($match[3]) ? $match[3] : null;
+
+ if (preg_match('~^' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '$~', $tag_command)) {
+ /* tag name is a variable or object */
+ $_return = $this->_parse_var_props($tag_command . $tag_modifier);
+ return "<?php echo $_return; ?>" . $this->_additional_newline;
+ }
+
+ /* If the tag name is a registered object, we process it. */
+ if (preg_match('~^\/?' . $this->_reg_obj_regexp . '$~', $tag_command)) {
+ return $this->_compile_registered_object_tag($tag_command, $this->_parse_attrs($tag_args), $tag_modifier);
+ }
+
+ switch ($tag_command) {
+ case 'include':
+ return $this->_compile_include_tag($tag_args);
+
+ case 'include_php':
+ return $this->_compile_include_php_tag($tag_args);
+
+ case 'if':
+ $this->_push_tag('if');
+ return $this->_compile_if_tag($tag_args);
+
+ case 'else':
+ list($_open_tag) = end($this->_tag_stack);
+ if ($_open_tag != 'if' && $_open_tag != 'elseif')
+ $this->_syntax_error('unexpected {else}', E_USER_ERROR, __FILE__, __LINE__);
+ else
+ $this->_push_tag('else');
+ return '<?php else: ?>';
+
+ case 'elseif':
+ list($_open_tag) = end($this->_tag_stack);
+ if ($_open_tag != 'if' && $_open_tag != 'elseif')
+ $this->_syntax_error('unexpected {elseif}', E_USER_ERROR, __FILE__, __LINE__);
+ if ($_open_tag == 'if')
+ $this->_push_tag('elseif');
+ return $this->_compile_if_tag($tag_args, true);
+
+ case '/if':
+ $this->_pop_tag('if');
+ return '<?php endif; ?>';
+
+ case 'capture':
+ return $this->_compile_capture_tag(true, $tag_args);
+
+ case '/capture':
+ return $this->_compile_capture_tag(false);
+
+ case 'ldelim':
+ return $this->left_delimiter;
+
+ case 'rdelim':
+ return $this->right_delimiter;
+
+ case 'section':
+ $this->_push_tag('section');
+ return $this->_compile_section_start($tag_args);
+
+ case 'sectionelse':
+ $this->_push_tag('sectionelse');
+ return "<?php endfor; else: ?>";
+ break;
+
+ case '/section':
+ $_open_tag = $this->_pop_tag('section');
+ if ($_open_tag == 'sectionelse')
+ return "<?php endif; ?>";
+ else
+ return "<?php endfor; endif; ?>";
+
+ case 'foreach':
+ $this->_push_tag('foreach');
+ return $this->_compile_foreach_start($tag_args);
+ break;
+
+ case 'foreachelse':
+ $this->_push_tag('foreachelse');
+ return "<?php endforeach; else: ?>";
+
+ case '/foreach':
+ $_open_tag = $this->_pop_tag('foreach');
+ if ($_open_tag == 'foreachelse')
+ return "<?php endif; unset(\$_from); ?>";
+ else
+ return "<?php endforeach; endif; unset(\$_from); ?>";
+ break;
+
+ case 'strip':
+ case '/strip':
+ if (substr($tag_command, 0, 1)=='/') {
+ $this->_pop_tag('strip');
+ if (--$this->_strip_depth==0) { /* outermost closing {/strip} */
+ $this->_additional_newline = "\n";
+ return '{' . $tag_command . '}';
+ }
+ } else {
+ $this->_push_tag('strip');
+ if ($this->_strip_depth++==0) { /* outermost opening {strip} */
+ $this->_additional_newline = "";
+ return '{' . $tag_command . '}';
+ }
+ }
+ return '';
+
+ case 'php':
+ /* handle folded tags replaced by {php} */
+ list(, $block) = each($this->_folded_blocks);
+ $this->_current_line_no += substr_count($block[0], "\n");
+ /* the number of matched elements in the regexp in _compile_file()
+ determins the type of folded tag that was found */
+ switch (count($block)) {
+ case 2: /* comment */
+ return '';
+
+ case 3: /* literal */
+ return "<?php echo '" . strtr($block[2], array("'"=>"\'", "\\"=>"\\\\")) . "'; ?>" . $this->_additional_newline;
+
+ case 4: /* php */
+ if ($this->security && !$this->security_settings['PHP_TAGS']) {
+ $this->_syntax_error("(secure mode) php tags not permitted", E_USER_WARNING, __FILE__, __LINE__);
+ return;
+ }
+ return '<?php ' . $block[3] .' ?>';
+ }
+ break;
+
+ case 'insert':
+ return $this->_compile_insert_tag($tag_args);
+
+ default:
+ if ($this->_compile_compiler_tag($tag_command, $tag_args, $output)) {
+ return $output;
+ } else if ($this->_compile_block_tag($tag_command, $tag_args, $tag_modifier, $output)) {
+ return $output;
+ } else if ($this->_compile_custom_tag($tag_command, $tag_args, $tag_modifier, $output)) {
+ return $output;
+ } else {
+ $this->_syntax_error("unrecognized tag '$tag_command'", E_USER_ERROR, __FILE__, __LINE__);
+ }
+
+ }
+ }
+
+
+ /**
+ * compile the custom compiler tag
+ *
+ * sets $output to the compiled custom compiler tag
+ * @param string $tag_command
+ * @param string $tag_args
+ * @param string $output
+ * @return boolean
+ */
+ function _compile_compiler_tag($tag_command, $tag_args, &$output)
+ {
+ $found = false;
+ $have_function = true;
+
+ /*
+ * First we check if the compiler function has already been registered
+ * or loaded from a plugin file.
+ */
+ if (isset($this->_plugins['compiler'][$tag_command])) {
+ $found = true;
+ $plugin_func = $this->_plugins['compiler'][$tag_command][0];
+ if (!is_callable($plugin_func)) {
+ $message = "compiler function '$tag_command' is not implemented";
+ $have_function = false;
+ }
+ }
+ /*
+ * Otherwise we need to load plugin file and look for the function
+ * inside it.
+ */
+ else if ($plugin_file = $this->_get_plugin_filepath('compiler', $tag_command)) {
+ $found = true;
+
+ include_once $plugin_file;
+
+ $plugin_func = 'smarty_compiler_' . $tag_command;
+ if (!is_callable($plugin_func)) {
+ $message = "plugin function $plugin_func() not found in $plugin_file\n";
+ $have_function = false;
+ } else {
+ $this->_plugins['compiler'][$tag_command] = array($plugin_func, null, null, null, true);
+ }
+ }
+
+ /*
+ * True return value means that we either found a plugin or a
+ * dynamically registered function. False means that we didn't and the
+ * compiler should now emit code to load custom function plugin for this
+ * tag.
+ */
+ if ($found) {
+ if ($have_function) {
+ $output = call_user_func_array($plugin_func, array($tag_args, &$this));
+ if($output != '') {
+ $output = '<?php ' . $this->_push_cacheable_state('compiler', $tag_command)
+ . $output
+ . $this->_pop_cacheable_state('compiler', $tag_command) . ' ?>';
+ }
+ } else {
+ $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+ /**
+ * compile block function tag
+ *
+ * sets $output to compiled block function tag
+ * @param string $tag_command
+ * @param string $tag_args
+ * @param string $tag_modifier
+ * @param string $output
+ * @return boolean
+ */
+ function _compile_block_tag($tag_command, $tag_args, $tag_modifier, &$output)
+ {
+ if (substr($tag_command, 0, 1) == '/') {
+ $start_tag = false;
+ $tag_command = substr($tag_command, 1);
+ } else
+ $start_tag = true;
+
+ $found = false;
+ $have_function = true;
+
+ /*
+ * First we check if the block function has already been registered
+ * or loaded from a plugin file.
+ */
+ if (isset($this->_plugins['block'][$tag_command])) {
+ $found = true;
+ $plugin_func = $this->_plugins['block'][$tag_command][0];
+ if (!is_callable($plugin_func)) {
+ $message = "block function '$tag_command' is not implemented";
+ $have_function = false;
+ }
+ }
+ /*
+ * Otherwise we need to load plugin file and look for the function
+ * inside it.
+ */
+ else if ($plugin_file = $this->_get_plugin_filepath('block', $tag_command)) {
+ $found = true;
+
+ include_once $plugin_file;
+
+ $plugin_func = 'smarty_block_' . $tag_command;
+ if (!function_exists($plugin_func)) {
+ $message = "plugin function $plugin_func() not found in $plugin_file\n";
+ $have_function = false;
+ } else {
+ $this->_plugins['block'][$tag_command] = array($plugin_func, null, null, null, true);
+
+ }
+ }
+
+ if (!$found) {
+ return false;
+ } else if (!$have_function) {
+ $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
+ return true;
+ }
+
+ /*
+ * Even though we've located the plugin function, compilation
+ * happens only once, so the plugin will still need to be loaded
+ * at runtime for future requests.
+ */
+ $this->_add_plugin('block', $tag_command);
+
+ if ($start_tag)
+ $this->_push_tag($tag_command);
+ else
+ $this->_pop_tag($tag_command);
+
+ if ($start_tag) {
+ $output = '<?php ' . $this->_push_cacheable_state('block', $tag_command);
+ $attrs = $this->_parse_attrs($tag_args);
+ $_cache_attrs='';
+ $arg_list = $this->_compile_arg_list('block', $tag_command, $attrs, $_cache_attrs);
+ $output .= "$_cache_attrs\$this->_tag_stack[] = array('$tag_command', array(".implode(',', $arg_list).')); ';
+ $output .= '$_block_repeat=true;' . $this->_compile_plugin_call('block', $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][1], null, $this, $_block_repeat);';
+ $output .= 'while ($_block_repeat) { ob_start(); ?>';
+ } else {
+ $output = '<?php $_block_content = ob_get_contents(); ob_end_clean(); ';
+ $_out_tag_text = $this->_compile_plugin_call('block', $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][1], $_block_content, $this, $_block_repeat)';
+ if ($tag_modifier != '') {
+ $this->_parse_modifiers($_out_tag_text, $tag_modifier);
+ }
+ $output .= '$_block_repeat=false;echo ' . $_out_tag_text . '; } ';
+ $output .= " array_pop(\$this->_tag_stack); " . $this->_pop_cacheable_state('block', $tag_command) . '?>';
+ }
+
+ return true;
+ }
+
+
+ /**
+ * compile custom function tag
+ *
+ * @param string $tag_command
+ * @param string $tag_args
+ * @param string $tag_modifier
+ * @return string
+ */
+ function _compile_custom_tag($tag_command, $tag_args, $tag_modifier, &$output)
+ {
+ $found = false;
+ $have_function = true;
+
+ /*
+ * First we check if the custom function has already been registered
+ * or loaded from a plugin file.
+ */
+ if (isset($this->_plugins['function'][$tag_command])) {
+ $found = true;
+ $plugin_func = $this->_plugins['function'][$tag_command][0];
+ if (!is_callable($plugin_func)) {
+ $message = "custom function '$tag_command' is not implemented";
+ $have_function = false;
+ }
+ }
+ /*
+ * Otherwise we need to load plugin file and look for the function
+ * inside it.
+ */
+ else if ($plugin_file = $this->_get_plugin_filepath('function', $tag_command)) {
+ $found = true;
+
+ include_once $plugin_file;
+
+ $plugin_func = 'smarty_function_' . $tag_command;
+ if (!function_exists($plugin_func)) {
+ $message = "plugin function $plugin_func() not found in $plugin_file\n";
+ $have_function = false;
+ } else {
+ $this->_plugins['function'][$tag_command] = array($plugin_func, null, null, null, true);
+
+ }
+ }
+
+ if (!$found) {
+ return false;
+ } else if (!$have_function) {
+ $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
+ return true;
+ }
+
+ /* declare plugin to be loaded on display of the template that
+ we compile right now */
+ $this->_add_plugin('function', $tag_command);
+
+ $_cacheable_state = $this->_push_cacheable_state('function', $tag_command);
+ $attrs = $this->_parse_attrs($tag_args);
+ $_cache_attrs = '';
+ $arg_list = $this->_compile_arg_list('function', $tag_command, $attrs, $_cache_attrs);
+
+ $output = $this->_compile_plugin_call('function', $tag_command).'(array('.implode(',', $arg_list)."), \$this)";
+ if($tag_modifier != '') {
+ $this->_parse_modifiers($output, $tag_modifier);
+ }
+
+ if($output != '') {
+ $output = '<?php ' . $_cacheable_state . $_cache_attrs . 'echo ' . $output . ';'
+ . $this->_pop_cacheable_state('function', $tag_command) . "?>" . $this->_additional_newline;
+ }
+
+ return true;
+ }
+
+ /**
+ * compile a registered object tag
+ *
+ * @param string $tag_command
+ * @param array $attrs
+ * @param string $tag_modifier
+ * @return string
+ */
+ function _compile_registered_object_tag($tag_command, $attrs, $tag_modifier)
+ {
+ if (substr($tag_command, 0, 1) == '/') {
+ $start_tag = false;
+ $tag_command = substr($tag_command, 1);
+ } else {
+ $start_tag = true;
+ }
+
+ list($object, $obj_comp) = explode('->', $tag_command);
+
+ $arg_list = array();
+ if(count($attrs)) {
+ $_assign_var = false;
+ foreach ($attrs as $arg_name => $arg_value) {
+ if($arg_name == 'assign') {
+ $_assign_var = $arg_value;
+ unset($attrs['assign']);
+ continue;
+ }
+ if (is_bool($arg_value))
+ $arg_value = $arg_value ? 'true' : 'false';
+ $arg_list[] = "'$arg_name' => $arg_value";
+ }
+ }
+
+ if($this->_reg_objects[$object][2]) {
+ // smarty object argument format
+ $args = "array(".implode(',', (array)$arg_list)."), \$this";
+ } else {
+ // traditional argument format
+ $args = implode(',', array_values($attrs));
+ if (empty($args)) {
+ $args = 'null';
+ }
+ }
+
+ $prefix = '';
+ $postfix = '';
+ $newline = '';
+ if(!is_object($this->_reg_objects[$object][0])) {
+ $this->_trigger_fatal_error("registered '$object' is not an object" , $this->_current_file, $this->_current_line_no, __FILE__, __LINE__);
+ } elseif(!empty($this->_reg_objects[$object][1]) && !in_array($obj_comp, $this->_reg_objects[$object][1])) {
+ $this->_trigger_fatal_error("'$obj_comp' is not a registered component of object '$object'", $this->_current_file, $this->_current_line_no, __FILE__, __LINE__);
+ } elseif(method_exists($this->_reg_objects[$object][0], $obj_comp)) {
+ // method
+ if(in_array($obj_comp, $this->_reg_objects[$object][3])) {
+ // block method
+ if ($start_tag) {
+ $prefix = "\$this->_tag_stack[] = array('$obj_comp', $args); ";
+ $prefix .= "\$_block_repeat=true; \$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], null, \$this, \$_block_repeat); ";
+ $prefix .= "while (\$_block_repeat) { ob_start();";
+ $return = null;
+ $postfix = '';
+ } else {
+ $prefix = "\$_obj_block_content = ob_get_contents(); ob_end_clean(); \$_block_repeat=false;";
+ $return = "\$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], \$_obj_block_content, \$this, \$_block_repeat)";
+ $postfix = "} array_pop(\$this->_tag_stack);";
+ }
+ } else {
+ // non-block method
+ $return = "\$this->_reg_objects['$object'][0]->$obj_comp($args)";
+ }
+ } else {
+ // property
+ $return = "\$this->_reg_objects['$object'][0]->$obj_comp";
+ }
+
+ if($return != null) {
+ if($tag_modifier != '') {
+ $this->_parse_modifiers($return, $tag_modifier);
+ }
+
+ if(!empty($_assign_var)) {
+ $output = "\$this->assign('" . $this->_dequote($_assign_var) ."', $return);";
+ } else {
+ $output = 'echo ' . $return . ';';
+ $newline = $this->_additional_newline;
+ }
+ } else {
+ $output = '';
+ }
+
+ return '<?php ' . $prefix . $output . $postfix . "?>" . $newline;
+ }
+
+ /**
+ * Compile {insert ...} tag
+ *
+ * @param string $tag_args
+ * @return string
+ */
+ function _compile_insert_tag($tag_args)
+ {
+ $attrs = $this->_parse_attrs($tag_args);
+ $name = $this->_dequote($attrs['name']);
+
+ if (empty($name)) {
+ return $this->_syntax_error("missing insert name", E_USER_ERROR, __FILE__, __LINE__);
+ }
+
+ if (!preg_match('~^\w+$~', $name)) {
+ return $this->_syntax_error("'insert: 'name' must be an insert function name", E_USER_ERROR, __FILE__, __LINE__);
+ }
+
+ if (!empty($attrs['script'])) {
+ $delayed_loading = true;
+ } else {
+ $delayed_loading = false;
+ }
+
+ foreach ($attrs as $arg_name => $arg_value) {
+ if (is_bool($arg_value))
+ $arg_value = $arg_value ? 'true' : 'false';
+ $arg_list[] = "'$arg_name' => $arg_value";
+ }
+
+ $this->_add_plugin('insert', $name, $delayed_loading);
+
+ $_params = "array('args' => array(".implode(', ', (array)$arg_list)."))";
+
+ return "<?php require_once(SMARTY_CORE_DIR . 'core.run_insert_handler.php');\necho smarty_core_run_insert_handler($_params, \$this); ?>" . $this->_additional_newline;
+ }
+
+ /**
+ * Compile {include ...} tag
+ *
+ * @param string $tag_args
+ * @return string
+ */
+ function _compile_include_tag($tag_args)
+ {
+ $attrs = $this->_parse_attrs($tag_args);
+ $arg_list = array();
+
+ if (empty($attrs['file'])) {
+ $this->_syntax_error("missing 'file' attribute in include tag", E_USER_ERROR, __FILE__, __LINE__);
+ }
+
+ foreach ($attrs as $arg_name => $arg_value) {
+ if ($arg_name == 'file') {
+ $include_file = $arg_value;
+ continue;
+ } else if ($arg_name == 'assign') {
+ $assign_var = $arg_value;
+ continue;
+ }
+ if (is_bool($arg_value))
+ $arg_value = $arg_value ? 'true' : 'false';
+ $arg_list[] = "'$arg_name' => $arg_value";
+ }
+
+ $output = '<?php ';
+
+ if (isset($assign_var)) {
+ $output .= "ob_start();\n";
+ }
+
+ $output .=
+ "\$_smarty_tpl_vars = \$this->_tpl_vars;\n";
+
+
+ $_params = "array('smarty_include_tpl_file' => " . $include_file . ", 'smarty_include_vars' => array(".implode(',', (array)$arg_list)."))";
+ $output .= "\$this->_smarty_include($_params);\n" .
+ "\$this->_tpl_vars = \$_smarty_tpl_vars;\n" .
+ "unset(\$_smarty_tpl_vars);\n";
+
+ if (isset($assign_var)) {
+ $output .= "\$this->assign(" . $assign_var . ", ob_get_contents()); ob_end_clean();\n";
+ }
+
+ $output .= ' ?>';
+
+ return $output;
+
+ }
+
+ /**
+ * Compile {include ...} tag
+ *
+ * @param string $tag_args
+ * @return string
+ */
+ function _compile_include_php_tag($tag_args)
+ {
+ $attrs = $this->_parse_attrs($tag_args);
+
+ if (empty($attrs['file'])) {
+ $this->_syntax_error("missing 'file' attribute in include_php tag", E_USER_ERROR, __FILE__, __LINE__);
+ }
+
+ $assign_var = (empty($attrs['assign'])) ? '' : $this->_dequote($attrs['assign']);
+ $once_var = (empty($attrs['once']) || $attrs['once']=='false') ? 'false' : 'true';
+
+ $arg_list = array();
+ foreach($attrs as $arg_name => $arg_value) {
+ if($arg_name != 'file' AND $arg_name != 'once' AND $arg_name != 'assign') {
+ if(is_bool($arg_value))
+ $arg_value = $arg_value ? 'true' : 'false';
+ $arg_list[] = "'$arg_name' => $arg_value";
+ }
+ }
+
+ $_params = "array('smarty_file' => " . $attrs['file'] . ", 'smarty_assign' => '$assign_var', 'smarty_once' => $once_var, 'smarty_include_vars' => array(".implode(',', $arg_list)."))";
+
+ return "<?php require_once(SMARTY_CORE_DIR . 'core.smarty_include_php.php');\nsmarty_core_smarty_include_php($_params, \$this); ?>" . $this->_additional_newline;
+ }
+
+
+ /**
+ * Compile {section ...} tag
+ *
+ * @param string $tag_args
+ * @return string
+ */
+ function _compile_section_start($tag_args)
+ {
+ $attrs = $this->_parse_attrs($tag_args);
+ $arg_list = array();
+
+ $output = '<?php ';
+ $section_name = $attrs['name'];
+ if (empty($section_name)) {
+ $this->_syntax_error("missing section name", E_USER_ERROR, __FILE__, __LINE__);
+ }
+
+ $output .= "unset(\$this->_sections[$section_name]);\n";
+ $section_props = "\$this->_sections[$section_name]";
+
+ foreach ($attrs as $attr_name => $attr_value) {
+ switch ($attr_name) {
+ case 'loop':
+ $output .= "{$section_props}['loop'] = is_array(\$_loop=$attr_value) ? count(\$_loop) : max(0, (int)\$_loop); unset(\$_loop);\n";
+ break;
+
+ case 'show':
+ if (is_bool($attr_value))
+ $show_attr_value = $attr_value ? 'true' : 'false';
+ else
+ $show_attr_value = "(bool)$attr_value";
+ $output .= "{$section_props}['show'] = $show_attr_value;\n";
+ break;
+
+ case 'name':
+ $output .= "{$section_props}['$attr_name'] = $attr_value;\n";
+ break;
+
+ case 'max':
+ case 'start':
+ $output .= "{$section_props}['$attr_name'] = (int)$attr_value;\n";
+ break;
+
+ case 'step':
+ $output .= "{$section_props}['$attr_name'] = ((int)$attr_value) == 0 ? 1 : (int)$attr_value;\n";
+ break;
+
+ default:
+ $this->_syntax_error("unknown section attribute - '$attr_name'", E_USER_ERROR, __FILE__, __LINE__);
+ break;
+ }
+ }
+
+ if (!isset($attrs['show']))
+ $output .= "{$section_props}['show'] = true;\n";
+
+ if (!isset($attrs['loop']))
+ $output .= "{$section_props}['loop'] = 1;\n";
+
+ if (!isset($attrs['max']))
+ $output .= "{$section_props}['max'] = {$section_props}['loop'];\n";
+ else
+ $output .= "if ({$section_props}['max'] < 0)\n" .
+ " {$section_props}['max'] = {$section_props}['loop'];\n";
+
+ if (!isset($attrs['step']))
+ $output .= "{$section_props}['step'] = 1;\n";
+
+ if (!isset($attrs['start']))
+ $output .= "{$section_props}['start'] = {$section_props}['step'] > 0 ? 0 : {$section_props}['loop']-1;\n";
+ else {
+ $output .= "if ({$section_props}['start'] < 0)\n" .
+ " {$section_props}['start'] = max({$section_props}['step'] > 0 ? 0 : -1, {$section_props}['loop'] + {$section_props}['start']);\n" .
+ "else\n" .
+ " {$section_props}['start'] = min({$section_props}['start'], {$section_props}['step'] > 0 ? {$section_props}['loop'] : {$section_props}['loop']-1);\n";
+ }
+
+ $output .= "if ({$section_props}['show']) {\n";
+ if (!isset($attrs['start']) && !isset($attrs['step']) && !isset($attrs['max'])) {
+ $output .= " {$section_props}['total'] = {$section_props}['loop'];\n";
+ } else {
+ $output .= " {$section_props}['total'] = min(ceil(({$section_props}['step'] > 0 ? {$section_props}['loop'] - {$section_props}['start'] : {$section_props}['start']+1)/abs({$section_props}['step'])), {$section_props}['max']);\n";
+ }
+ $output .= " if ({$section_props}['total'] == 0)\n" .
+ " {$section_props}['show'] = false;\n" .
+ "} else\n" .
+ " {$section_props}['total'] = 0;\n";
+
+ $output .= "if ({$section_props}['show']):\n";
+ $output .= "
+ for ({$section_props}['index'] = {$section_props}['start'], {$section_props}['iteration'] = 1;
+ {$section_props}['iteration'] <= {$section_props}['total'];
+ {$section_props}['index'] += {$section_props}['step'], {$section_props}['iteration']++):\n";
+ $output .= "{$section_props}['rownum'] = {$section_props}['iteration'];\n";
+ $output .= "{$section_props}['index_prev'] = {$section_props}['index'] - {$section_props}['step'];\n";
+ $output .= "{$section_props}['index_next'] = {$section_props}['index'] + {$section_props}['step'];\n";
+ $output .= "{$section_props}['first'] = ({$section_props}['iteration'] == 1);\n";
+ $output .= "{$section_props}['last'] = ({$section_props}['iteration'] == {$section_props}['total']);\n";
+
+ $output .= "?>";
+
+ return $output;
+ }
+
+
+ /**
+ * Compile {foreach ...} tag.
+ *
+ * @param string $tag_args
+ * @return string
+ */
+ function _compile_foreach_start($tag_args)
+ {
+ $attrs = $this->_parse_attrs($tag_args);
+ $arg_list = array();
+
+ if (empty($attrs['from'])) {
+ return $this->_syntax_error("foreach: missing 'from' attribute", E_USER_ERROR, __FILE__, __LINE__);
+ }
+ $from = $attrs['from'];
+
+ if (empty($attrs['item'])) {
+ return $this->_syntax_error("foreach: missing 'item' attribute", E_USER_ERROR, __FILE__, __LINE__);
+ }
+ $item = $this->_dequote($attrs['item']);
+ if (!preg_match('~^\w+$~', $item)) {
+ return $this->_syntax_error("'foreach: 'item' must be a variable name (literal string)", E_USER_ERROR, __FILE__, __LINE__);
+ }
+
+ if (isset($attrs['key'])) {
+ $key = $this->_dequote($attrs['key']);
+ if (!preg_match('~^\w+$~', $key)) {
+ return $this->_syntax_error("foreach: 'key' must to be a variable name (literal string)", E_USER_ERROR, __FILE__, __LINE__);
+ }
+ $key_part = "\$this->_tpl_vars['$key'] => ";
+ } else {
+ $key = null;
+ $key_part = '';
+ }
+
+ if (isset($attrs['name'])) {
+ $name = $attrs['name'];
+ } else {
+ $name = null;
+ }
+
+ $output = '<?php ';
+ $output .= "\$_from = $from; if (!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array'); }";
+ if (isset($name)) {
+ $foreach_props = "\$this->_foreach[$name]";
+ $output .= "{$foreach_props} = array('total' => count(\$_from), 'iteration' => 0);\n";
+ $output .= "if ({$foreach_props}['total'] > 0):\n";
+ $output .= " foreach (\$_from as $key_part\$this->_tpl_vars['$item']):\n";
+ $output .= " {$foreach_props}['iteration']++;\n";
+ } else {
+ $output .= "if (count(\$_from)):\n";
+ $output .= " foreach (\$_from as $key_part\$this->_tpl_vars['$item']):\n";
+ }
+ $output .= '?>';
+
+ return $output;
+ }
+
+
+ /**
+ * Compile {capture} .. {/capture} tags
+ *
+ * @param boolean $start true if this is the {capture} tag
+ * @param string $tag_args
+ * @return string
+ */
+
+ function _compile_capture_tag($start, $tag_args = '')
+ {
+ $attrs = $this->_parse_attrs($tag_args);
+
+ if ($start) {
+ if (isset($attrs['name']))
+ $buffer = $attrs['name'];
+ else
+ $buffer = "'default'";
+
+ if (isset($attrs['assign']))
+ $assign = $attrs['assign'];
+ else
+ $assign = null;
+ $output = "<?php ob_start(); ?>";
+ $this->_capture_stack[] = array($buffer, $assign);
+ } else {
+ list($buffer, $assign) = array_pop($this->_capture_stack);
+ $output = "<?php \$this->_smarty_vars['capture'][$buffer] = ob_get_contents(); ";
+ if (isset($assign)) {
+ $output .= " \$this->assign($assign, ob_get_contents());";
+ }
+ $output .= "ob_end_clean(); ?>";
+ }
+
+ return $output;
+ }
+
+ /**
+ * Compile {if ...} tag
+ *
+ * @param string $tag_args
+ * @param boolean $elseif if true, uses elseif instead of if
+ * @return string
+ */
+ function _compile_if_tag($tag_args, $elseif = false)
+ {
+
+ /* Tokenize args for 'if' tag. */
+ preg_match_all('~(?>
+ ' . $this->_obj_call_regexp . '(?:' . $this->_mod_regexp . '*)? | # valid object call
+ ' . $this->_var_regexp . '(?:' . $this->_mod_regexp . '*)? | # var or quoted string
+ \-?0[xX][0-9a-fA-F]+|\-?\d+(?:\.\d+)?|\.\d+|!==|===|==|!=|<>|<<|>>|<=|>=|\&\&|\|\||\(|\)|,|\!|\^|=|\&|\~|<|>|\||\%|\+|\-|\/|\*|\@ | # valid non-word token
+ \b\w+\b | # valid word token
+ \S+ # anything else
+ )~x', $tag_args, $match);
+
+ $tokens = $match[0];
+
+ if(empty($tokens)) {
+ $_error_msg = $elseif ? "'elseif'" : "'if'";
+ $_error_msg .= ' statement requires arguments';
+ $this->_syntax_error($_error_msg, E_USER_ERROR, __FILE__, __LINE__);
+ }
+
+
+ // make sure we have balanced parenthesis
+ $token_count = array_count_values($tokens);
+ if(isset($token_count['(']) && $token_count['('] != $token_count[')']) {
+ $this->_syntax_error("unbalanced parenthesis in if statement", E_USER_ERROR, __FILE__, __LINE__);
+ }
+
+ $is_arg_stack = array();
+
+ for ($i = 0; $i < count($tokens); $i++) {
+
+ $token = &$tokens[$i];
+
+ switch (strtolower($token)) {
+ case '!':
+ case '%':
+ case '!==':
+ case '==':
+ case '===':
+ case '>':
+ case '<':
+ case '!=':
+ case '<>':
+ case '<<':
+ case '>>':
+ case '<=':
+ case '>=':
+ case '&&':
+ case '||':
+ case '|':
+ case '^':
+ case '&':
+ case '~':
+ case ')':
+ case ',':
+ case '+':
+ case '-':
+ case '*':
+ case '/':
+ case '@':
+ break;
+
+ case 'eq':
+ $token = '==';
+ break;
+
+ case 'ne':
+ case 'neq':
+ $token = '!=';
+ break;
+
+ case 'lt':
+ $token = '<';
+ break;
+
+ case 'le':
+ case 'lte':
+ $token = '<=';
+ break;
+
+ case 'gt':
+ $token = '>';
+ break;
+
+ case 'ge':
+ case 'gte':
+ $token = '>=';
+ break;
+
+ case 'and':
+ $token = '&&';
+ break;
+
+ case 'or':
+ $token = '||';
+ break;
+
+ case 'not':
+ $token = '!';
+ break;
+
+ case 'mod':
+ $token = '%';
+ break;
+
+ case '(':
+ array_push($is_arg_stack, $i);
+ break;
+
+ case 'is':
+ /* If last token was a ')', we operate on the parenthesized
+ expression. The start of the expression is on the stack.
+ Otherwise, we operate on the last encountered token. */
+ if ($tokens[$i-1] == ')')
+ $is_arg_start = array_pop($is_arg_stack);
+ else
+ $is_arg_start = $i-1;
+ /* Construct the argument for 'is' expression, so it knows
+ what to operate on. */
+ $is_arg = implode(' ', array_slice($tokens, $is_arg_start, $i - $is_arg_start));
+
+ /* Pass all tokens from next one until the end to the
+ 'is' expression parsing function. The function will
+ return modified tokens, where the first one is the result
+ of the 'is' expression and the rest are the tokens it
+ didn't touch. */
+ $new_tokens = $this->_parse_is_expr($is_arg, array_slice($tokens, $i+1));
+
+ /* Replace the old tokens with the new ones. */
+ array_splice($tokens, $is_arg_start, count($tokens), $new_tokens);
+
+ /* Adjust argument start so that it won't change from the
+ current position for the next iteration. */
+ $i = $is_arg_start;
+ break;
+
+ default:
+ if(preg_match('~^' . $this->_func_regexp . '$~', $token) ) {
+ // function call
+ if($this->security &&
+ !in_array($token, $this->security_settings['IF_FUNCS'])) {
+ $this->_syntax_error("(secure mode) '$token' not allowed in if statement", E_USER_ERROR, __FILE__, __LINE__);
+ }
+ } elseif(preg_match('~^' . $this->_var_regexp . '$~', $token) && (strpos('+-*/^%&|', substr($token, -1)) === false) && isset($tokens[$i+1]) && $tokens[$i+1] == '(') {
+ // variable function call
+ $this->_syntax_error("variable function call '$token' not allowed in if statement", E_USER_ERROR, __FILE__, __LINE__);
+ } elseif(preg_match('~^' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . $this->_mod_regexp . '*)$~', $token)) {
+ // object or variable
+ $token = $this->_parse_var_props($token);
+ } elseif(is_numeric($token)) {
+ // number, skip it
+ } else {
+ $this->_syntax_error("unidentified token '$token'", E_USER_ERROR, __FILE__, __LINE__);
+ }
+ break;
+ }
+ }
+
+ if ($elseif)
+ return '<?php elseif ('.implode(' ', $tokens).'): ?>';
+ else
+ return '<?php if ('.implode(' ', $tokens).'): ?>';
+ }
+
+
+ function _compile_arg_list($type, $name, $attrs, &$cache_code) {
+ $arg_list = array();
+
+ if (isset($type) && isset($name)
+ && isset($this->_plugins[$type])
+ && isset($this->_plugins[$type][$name])
+ && empty($this->_plugins[$type][$name][4])
+ && is_array($this->_plugins[$type][$name][5])
+ ) {
+ /* we have a list of parameters that should be cached */
+ $_cache_attrs = $this->_plugins[$type][$name][5];
+ $_count = $this->_cache_attrs_count++;
+ $cache_code = "\$_cache_attrs =& \$this->_smarty_cache_attrs('$this->_cache_serial','$_count');";
+
+ } else {
+ /* no parameters are cached */
+ $_cache_attrs = null;
+ }
+
+ foreach ($attrs as $arg_name => $arg_value) {
+ if (is_bool($arg_value))
+ $arg_value = $arg_value ? 'true' : 'false';
+ if (is_null($arg_value))
+ $arg_value = 'null';
+ if ($_cache_attrs && in_array($arg_name, $_cache_attrs)) {
+ $arg_list[] = "'$arg_name' => (\$this->_cache_including) ? \$_cache_attrs['$arg_name'] : (\$_cache_attrs['$arg_name']=$arg_value)";
+ } else {
+ $arg_list[] = "'$arg_name' => $arg_value";
+ }
+ }
+ return $arg_list;
+ }
+
+ /**
+ * Parse is expression
+ *
+ * @param string $is_arg
+ * @param array $tokens
+ * @return array
+ */
+ function _parse_is_expr($is_arg, $tokens)
+ {
+ $expr_end = 0;
+ $negate_expr = false;
+
+ if (($first_token = array_shift($tokens)) == 'not') {
+ $negate_expr = true;
+ $expr_type = array_shift($tokens);
+ } else
+ $expr_type = $first_token;
+
+ switch ($expr_type) {
+ case 'even':
+ if (isset($tokens[$expr_end]) && $tokens[$expr_end] == 'by') {
+ $expr_end++;
+ $expr_arg = $tokens[$expr_end++];
+ $expr = "!(1 & ($is_arg / " . $this->_parse_var_props($expr_arg) . "))";
+ } else
+ $expr = "!(1 & $is_arg)";
+ break;
+
+ case 'odd':
+ if (isset($tokens[$expr_end]) && $tokens[$expr_end] == 'by') {
+ $expr_end++;
+ $expr_arg = $tokens[$expr_end++];
+ $expr = "(1 & ($is_arg / " . $this->_parse_var_props($expr_arg) . "))";
+ } else
+ $expr = "(1 & $is_arg)";
+ break;
+
+ case 'div':
+ if (@$tokens[$expr_end] == 'by') {
+ $expr_end++;
+ $expr_arg = $tokens[$expr_end++];
+ $expr = "!($is_arg % " . $this->_parse_var_props($expr_arg) . ")";
+ } else {
+ $this->_syntax_error("expecting 'by' after 'div'", E_USER_ERROR, __FILE__, __LINE__);
+ }
+ break;
+
+ default:
+ $this->_syntax_error("unknown 'is' expression - '$expr_type'", E_USER_ERROR, __FILE__, __LINE__);
+ break;
+ }
+
+ if ($negate_expr) {
+ $expr = "!($expr)";
+ }
+
+ array_splice($tokens, 0, $expr_end, $expr);
+
+ return $tokens;
+ }
+
+
+ /**
+ * Parse attribute string
+ *
+ * @param string $tag_args
+ * @return array
+ */
+ function _parse_attrs($tag_args)
+ {
+
+ /* Tokenize tag attributes. */
+ preg_match_all('~(?:' . $this->_obj_call_regexp . '|' . $this->_qstr_regexp . ' | (?>[^"\'=\s]+)
+ )+ |
+ [=]
+ ~x', $tag_args, $match);
+ $tokens = $match[0];
+
+ $attrs = array();
+ /* Parse state:
+ 0 - expecting attribute name
+ 1 - expecting '='
+ 2 - expecting attribute value (not '=') */
+ $state = 0;
+
+ foreach ($tokens as $token) {
+ switch ($state) {
+ case 0:
+ /* If the token is a valid identifier, we set attribute name
+ and go to state 1. */
+ if (preg_match('~^\w+$~', $token)) {
+ $attr_name = $token;
+ $state = 1;
+ } else
+ $this->_syntax_error("invalid attribute name: '$token'", E_USER_ERROR, __FILE__, __LINE__);
+ break;
+
+ case 1:
+ /* If the token is '=', then we go to state 2. */
+ if ($token == '=') {
+ $state = 2;
+ } else
+ $this->_syntax_error("expecting '=' after attribute name '$last_token'", E_USER_ERROR, __FILE__, __LINE__);
+ break;
+
+ case 2:
+ /* If token is not '=', we set the attribute value and go to
+ state 0. */
+ if ($token != '=') {
+ /* We booleanize the token if it's a non-quoted possible
+ boolean value. */
+ if (preg_match('~^(on|yes|true)$~', $token)) {
+ $token = 'true';
+ } else if (preg_match('~^(off|no|false)$~', $token)) {
+ $token = 'false';
+ } else if ($token == 'null') {
+ $token = 'null';
+ } else if (preg_match('~^' . $this->_num_const_regexp . '|0[xX][0-9a-fA-F]+$~', $token)) {
+ /* treat integer literally */
+ } else if (!preg_match('~^' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . $this->_mod_regexp . ')*$~', $token)) {
+ /* treat as a string, double-quote it escaping quotes */
+ $token = '"'.addslashes($token).'"';
+ }
+
+ $attrs[$attr_name] = $token;
+ $state = 0;
+ } else
+ $this->_syntax_error("'=' cannot be an attribute value", E_USER_ERROR, __FILE__, __LINE__);
+ break;
+ }
+ $last_token = $token;
+ }
+
+ if($state != 0) {
+ if($state == 1) {
+ $this->_syntax_error("expecting '=' after attribute name '$last_token'", E_USER_ERROR, __FILE__, __LINE__);
+ } else {
+ $this->_syntax_error("missing attribute value", E_USER_ERROR, __FILE__, __LINE__);
+ }
+ }
+
+ $this->_parse_vars_props($attrs);
+
+ return $attrs;
+ }
+
+ /**
+ * compile multiple variables and section properties tokens into
+ * PHP code
+ *
+ * @param array $tokens
+ */
+ function _parse_vars_props(&$tokens)
+ {
+ foreach($tokens as $key => $val) {
+ $tokens[$key] = $this->_parse_var_props($val);
+ }
+ }
+
+ /**
+ * compile single variable and section properties token into
+ * PHP code
+ *
+ * @param string $val
+ * @param string $tag_attrs
+ * @return string
+ */
+ function _parse_var_props($val)
+ {
+ $val = trim($val);
+
+ if(preg_match('~^(' . $this->_obj_call_regexp . '|' . $this->_dvar_regexp . ')(' . $this->_mod_regexp . '*)$~', $val, $match)) {
+ // $ variable or object
+ $return = $this->_parse_var($match[1]);
+ $modifiers = $match[2];
+ if (!empty($this->default_modifiers) && !preg_match('~(^|\|)smarty:nodefaults($|\|)~',$modifiers)) {
+ $_default_mod_string = implode('|',(array)$this->default_modifiers);
+ $modifiers = empty($modifiers) ? $_default_mod_string : $_default_mod_string . '|' . $modifiers;
+ }
+ $this->_parse_modifiers($return, $modifiers);
+ return $return;
+ } elseif (preg_match('~^' . $this->_db_qstr_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
+ // double quoted text
+ preg_match('~^(' . $this->_db_qstr_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match);
+ $return = $this->_expand_quoted_text($match[1]);
+ if($match[2] != '') {
+ $this->_parse_modifiers($return, $match[2]);
+ }
+ return $return;
+ }
+ elseif(preg_match('~^' . $this->_num_const_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
+ // numerical constant
+ preg_match('~^(' . $this->_num_const_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match);
+ if($match[2] != '') {
+ $this->_parse_modifiers($match[1], $match[2]);
+ return $match[1];
+ }
+ }
+ elseif(preg_match('~^' . $this->_si_qstr_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
+ // single quoted text
+ preg_match('~^(' . $this->_si_qstr_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match);
+ if($match[2] != '') {
+ $this->_parse_modifiers($match[1], $match[2]);
+ return $match[1];
+ }
+ }
+ elseif(preg_match('~^' . $this->_cvar_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
+ // config var
+ return $this->_parse_conf_var($val);
+ }
+ elseif(preg_match('~^' . $this->_svar_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
+ // section var
+ return $this->_parse_section_prop($val);
+ }
+ elseif(!in_array($val, $this->_permitted_tokens) && !is_numeric($val)) {
+ // literal string
+ return $this->_expand_quoted_text('"' . strtr($val, array('\\' => '\\\\', '"' => '\\"')) .'"');
+ }
+ return $val;
+ }
+
+ /**
+ * expand quoted text with embedded variables
+ *
+ * @param string $var_expr
+ * @return string
+ */
+ function _expand_quoted_text($var_expr)
+ {
+ // if contains unescaped $, expand it
+ if(preg_match_all('~(?:\`(?<!\\\\)\$' . $this->_dvar_guts_regexp . '(?:' . $this->_obj_ext_regexp . ')*\`)|(?:(?<!\\\\)\$\w+(\[[a-zA-Z0-9]+\])*)~', $var_expr, $_match)) {
+ $_match = $_match[0];
+ $_replace = array();
+ foreach($_match as $_var) {
+ $_replace[$_var] = '".(' . $this->_parse_var(str_replace('`','',$_var)) . ')."';
+ }
+ $var_expr = strtr($var_expr, $_replace);
+ $_return = preg_replace('~\.""|(?<!\\\\)""\.~', '', $var_expr);
+ } else {
+ $_return = $var_expr;
+ }
+ // replace double quoted literal string with single quotes
+ $_return = preg_replace('~^"([\s\w]+)"$~',"'\\1'",$_return);
+ return $_return;
+ }
+
+ /**
+ * parse variable expression into PHP code
+ *
+ * @param string $var_expr
+ * @param string $output
+ * @return string
+ */
+ function _parse_var($var_expr)
+ {
+ $_has_math = false;
+ $_math_vars = preg_split('~('.$this->_dvar_math_regexp.'|'.$this->_qstr_regexp.')~', $var_expr, -1, PREG_SPLIT_DELIM_CAPTURE);
+
+ if(count($_math_vars) > 1) {
+ $_first_var = "";
+ $_complete_var = "";
+ $_output = "";
+ // simple check if there is any math, to stop recursion (due to modifiers with "xx % yy" as parameter)
+ foreach($_math_vars as $_k => $_math_var) {
+ $_math_var = $_math_vars[$_k];
+
+ if(!empty($_math_var) || is_numeric($_math_var)) {
+ // hit a math operator, so process the stuff which came before it
+ if(preg_match('~^' . $this->_dvar_math_regexp . '$~', $_math_var)) {
+ $_has_math = true;
+ if(!empty($_complete_var) || is_numeric($_complete_var)) {
+ $_output .= $this->_parse_var($_complete_var);
+ }
+
+ // just output the math operator to php
+ $_output .= $_math_var;
+
+ if(empty($_first_var))
+ $_first_var = $_complete_var;
+
+ $_complete_var = "";
+ } else {
+ $_complete_var .= $_math_var;
+ }
+ }
+ }
+ if($_has_math) {
+ if(!empty($_complete_var) || is_numeric($_complete_var))
+ $_output .= $this->_parse_var($_complete_var);
+
+ // get the modifiers working (only the last var from math + modifier is left)
+ $var_expr = $_complete_var;
+ }
+ }
+
+ // prevent cutting of first digit in the number (we _definitly_ got a number if the first char is a digit)
+ if(is_numeric(substr($var_expr, 0, 1)))
+ $_var_ref = $var_expr;
+ else
+ $_var_ref = substr($var_expr, 1);
+
+ if(!$_has_math) {
+
+ // get [foo] and .foo and ->foo and (...) pieces
+ preg_match_all('~(?:^\w+)|' . $this->_obj_params_regexp . '|(?:' . $this->_var_bracket_regexp . ')|->\$?\w+|\.\$?\w+|\S+~', $_var_ref, $match);
+
+ $_indexes = $match[0];
+ $_var_name = array_shift($_indexes);
+
+ /* Handle $smarty.* variable references as a special case. */
+ if ($_var_name == 'smarty') {
+ /*
+ * If the reference could be compiled, use the compiled output;
+ * otherwise, fall back on the $smarty variable generated at
+ * run-time.
+ */
+ if (($smarty_ref = $this->_compile_smarty_ref($_indexes)) !== null) {
+ $_output = $smarty_ref;
+ } else {
+ $_var_name = substr(array_shift($_indexes), 1);
+ $_output = "\$this->_smarty_vars['$_var_name']";
+ }
+ } elseif(is_numeric($_var_name) && is_numeric(substr($var_expr, 0, 1))) {
+ // because . is the operator for accessing arrays thru inidizes we need to put it together again for floating point numbers
+ if(count($_indexes) > 0)
+ {
+ $_var_name .= implode("", $_indexes);
+ $_indexes = array();
+ }
+ $_output = $_var_name;
+ } else {
+ $_output = "\$this->_tpl_vars['$_var_name']";
+ }
+
+ foreach ($_indexes as $_index) {
+ if (substr($_index, 0, 1) == '[') {
+ $_index = substr($_index, 1, -1);
+ if (is_numeric($_index)) {
+ $_output .= "[$_index]";
+ } elseif (substr($_index, 0, 1) == '$') {
+ if (strpos($_index, '.') !== false) {
+ $_output .= '[' . $this->_parse_var($_index) . ']';
+ } else {
+ $_output .= "[\$this->_tpl_vars['" . substr($_index, 1) . "']]";
+ }
+ } else {
+ $_var_parts = explode('.', $_index);
+ $_var_section = $_var_parts[0];
+ $_var_section_prop = isset($_var_parts[1]) ? $_var_parts[1] : 'index';
+ $_output .= "[\$this->_sections['$_var_section']['$_var_section_prop']]";
+ }
+ } else if (substr($_index, 0, 1) == '.') {
+ if (substr($_index, 1, 1) == '$')
+ $_output .= "[\$this->_tpl_vars['" . substr($_index, 2) . "']]";
+ else
+ $_output .= "['" . substr($_index, 1) . "']";
+ } else if (substr($_index,0,2) == '->') {
+ if(substr($_index,2,2) == '__') {
+ $this->_syntax_error('call to internal object members is not allowed', E_USER_ERROR, __FILE__, __LINE__);
+ } elseif($this->security && substr($_index, 2, 1) == '_') {
+ $this->_syntax_error('(secure) call to private object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
+ } elseif (substr($_index, 2, 1) == '$') {
+ if ($this->security) {
+ $this->_syntax_error('(secure) call to dynamic object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
+ } else {
+ $_output .= '->{(($_var=$this->_tpl_vars[\''.substr($_index,3).'\']) && substr($_var,0,2)!=\'__\') ? $_var : $this->trigger_error("cannot access property \\"$_var\\"")}';
+ }
+ } else {
+ $_output .= $_index;
+ }
+ } elseif (substr($_index, 0, 1) == '(') {
+ $_index = $this->_parse_parenth_args($_index);
+ $_output .= $_index;
+ } else {
+ $_output .= $_index;
+ }
+ }
+ }
+
+ return $_output;
+ }
+
+ /**
+ * parse arguments in function call parenthesis
+ *
+ * @param string $parenth_args
+ * @return string
+ */
+ function _parse_parenth_args($parenth_args)
+ {
+ preg_match_all('~' . $this->_param_regexp . '~',$parenth_args, $match);
+ $orig_vals = $match = $match[0];
+ $this->_parse_vars_props($match);
+ $replace = array();
+ for ($i = 0, $count = count($match); $i < $count; $i++) {
+ $replace[$orig_vals[$i]] = $match[$i];
+ }
+ return strtr($parenth_args, $replace);
+ }
+
+ /**
+ * parse configuration variable expression into PHP code
+ *
+ * @param string $conf_var_expr
+ */
+ function _parse_conf_var($conf_var_expr)
+ {
+ $parts = explode('|', $conf_var_expr, 2);
+ $var_ref = $parts[0];
+ $modifiers = isset($parts[1]) ? $parts[1] : '';
+
+ $var_name = substr($var_ref, 1, -1);
+
+ $output = "\$this->_config[0]['vars']['$var_name']";
+
+ $this->_parse_modifiers($output, $modifiers);
+
+ return $output;
+ }
+
+ /**
+ * parse section property expression into PHP code
+ *
+ * @param string $section_prop_expr
+ * @return string
+ */
+ function _parse_section_prop($section_prop_expr)
+ {
+ $parts = explode('|', $section_prop_expr, 2);
+ $var_ref = $parts[0];
+ $modifiers = isset($parts[1]) ? $parts[1] : '';
+
+ preg_match('!%(\w+)\.(\w+)%!', $var_ref, $match);
+ $section_name = $match[1];
+ $prop_name = $match[2];
+
+ $output = "\$this->_sections['$section_name']['$prop_name']";
+
+ $this->_parse_modifiers($output, $modifiers);
+
+ return $output;
+ }
+
+
+ /**
+ * parse modifier chain into PHP code
+ *
+ * sets $output to parsed modified chain
+ * @param string $output
+ * @param string $modifier_string
+ */
+ function _parse_modifiers(&$output, $modifier_string)
+ {
+ preg_match_all('~\|(@?\w+)((?>:(?:'. $this->_qstr_regexp . '|[^|]+))*)~', '|' . $modifier_string, $_match);
+ list(, $_modifiers, $modifier_arg_strings) = $_match;
+
+ for ($_i = 0, $_for_max = count($_modifiers); $_i < $_for_max; $_i++) {
+ $_modifier_name = $_modifiers[$_i];
+
+ if($_modifier_name == 'smarty') {
+ // skip smarty modifier
+ continue;
+ }
+
+ preg_match_all('~:(' . $this->_qstr_regexp . '|[^:]+)~', $modifier_arg_strings[$_i], $_match);
+ $_modifier_args = $_match[1];
+
+ if (substr($_modifier_name, 0, 1) == '@') {
+ $_map_array = false;
+ $_modifier_name = substr($_modifier_name, 1);
+ } else {
+ $_map_array = true;
+ }
+
+ if (empty($this->_plugins['modifier'][$_modifier_name])
+ && !$this->_get_plugin_filepath('modifier', $_modifier_name)
+ && function_exists($_modifier_name)) {
+ if ($this->security && !in_array($_modifier_name, $this->security_settings['MODIFIER_FUNCS'])) {
+ $this->_trigger_fatal_error("[plugin] (secure mode) modifier '$_modifier_name' is not allowed" , $this->_current_file, $this->_current_line_no, __FILE__, __LINE__);
+ } else {
+ $this->_plugins['modifier'][$_modifier_name] = array($_modifier_name, null, null, false);
+ }
+ }
+ $this->_add_plugin('modifier', $_modifier_name);
+
+ $this->_parse_vars_props($_modifier_args);
+
+ if($_modifier_name == 'default') {
+ // supress notifications of default modifier vars and args
+ if(substr($output, 0, 1) == '$') {
+ $output = '@' . $output;
+ }
+ if(isset($_modifier_args[0]) && substr($_modifier_args[0], 0, 1) == '$') {
+ $_modifier_args[0] = '@' . $_modifier_args[0];
+ }
+ }
+ if (count($_modifier_args) > 0)
+ $_modifier_args = ', '.implode(', ', $_modifier_args);
+ else
+ $_modifier_args = '';
+
+ if ($_map_array) {
+ $output = "((is_array(\$_tmp=$output)) ? \$this->_run_mod_handler('$_modifier_name', true, \$_tmp$_modifier_args) : " . $this->_compile_plugin_call('modifier', $_modifier_name) . "(\$_tmp$_modifier_args))";
+
+ } else {
+
+ $output = $this->_compile_plugin_call('modifier', $_modifier_name)."($output$_modifier_args)";
+
+ }
+ }
+ }
+
+
+ /**
+ * add plugin
+ *
+ * @param string $type
+ * @param string $name
+ * @param boolean? $delayed_loading
+ */
+ function _add_plugin($type, $name, $delayed_loading = null)
+ {
+ if (!isset($this->_plugin_info[$type])) {
+ $this->_plugin_info[$type] = array();
+ }
+ if (!isset($this->_plugin_info[$type][$name])) {
+ $this->_plugin_info[$type][$name] = array($this->_current_file,
+ $this->_current_line_no,
+ $delayed_loading);
+ }
+ }
+
+
+ /**
+ * Compiles references of type $smarty.foo
+ *
+ * @param string $indexes
+ * @return string
+ */
+ function _compile_smarty_ref(&$indexes)
+ {
+ /* Extract the reference name. */
+ $_ref = substr($indexes[0], 1);
+ foreach($indexes as $_index_no=>$_index) {
+ if (substr($_index, 0, 1) != '.' && $_index_no<2 || !preg_match('~^(\.|\[|->)~', $_index)) {
+ $this->_syntax_error('$smarty' . implode('', array_slice($indexes, 0, 2)) . ' is an invalid reference', E_USER_ERROR, __FILE__, __LINE__);
+ }
+ }
+
+ switch ($_ref) {
+ case 'now':
+ $compiled_ref = 'time()';
+ $_max_index = 1;
+ break;
+
+ case 'foreach':
+ array_shift($indexes);
+ $_var = $this->_parse_var_props(substr($indexes[0], 1));
+ $_propname = substr($indexes[1], 1);
+ $_max_index = 1;
+ switch ($_propname) {
+ case 'index':
+ array_shift($indexes);
+ $compiled_ref = "(\$this->_foreach[$_var]['iteration']-1)";
+ break;
+
+ case 'first':
+ array_shift($indexes);
+ $compiled_ref = "(\$this->_foreach[$_var]['iteration'] <= 1)";
+ break;
+
+ case 'last':
+ array_shift($indexes);
+ $compiled_ref = "(\$this->_foreach[$_var]['iteration'] == \$this->_foreach[$_var]['total'])";
+ break;
+
+ case 'show':
+ array_shift($indexes);
+ $compiled_ref = "(\$this->_foreach[$_var]['total'] > 0)";
+ break;
+
+ default:
+ unset($_max_index);
+ $compiled_ref = "\$this->_foreach[$_var]";
+ }
+ break;
+
+ case 'section':
+ array_shift($indexes);
+ $_var = $this->_parse_var_props(substr($indexes[0], 1));
+ $compiled_ref = "\$this->_sections[$_var]";
+ break;
+
+ case 'get':
+ $compiled_ref = ($this->request_use_auto_globals) ? '$_GET' : "\$GLOBALS['HTTP_GET_VARS']";
+ break;
+
+ case 'post':
+ $compiled_ref = ($this->request_use_auto_globals) ? '$_POST' : "\$GLOBALS['HTTP_POST_VARS']";
+ break;
+
+ case 'cookies':
+ $compiled_ref = ($this->request_use_auto_globals) ? '$_COOKIE' : "\$GLOBALS['HTTP_COOKIE_VARS']";
+ break;
+
+ case 'env':
+ $compiled_ref = ($this->request_use_auto_globals) ? '$_ENV' : "\$GLOBALS['HTTP_ENV_VARS']";
+ break;
+
+ case 'server':
+ $compiled_ref = ($this->request_use_auto_globals) ? '$_SERVER' : "\$GLOBALS['HTTP_SERVER_VARS']";
+ break;
+
+ case 'session':
+ $compiled_ref = ($this->request_use_auto_globals) ? '$_SESSION' : "\$GLOBALS['HTTP_SESSION_VARS']";
+ break;
+
+ /*
+ * These cases are handled either at run-time or elsewhere in the
+ * compiler.
+ */
+ case 'request':
+ if ($this->request_use_auto_globals) {
+ $compiled_ref = '$_REQUEST';
+ break;
+ } else {
+ $this->_init_smarty_vars = true;
+ }
+ return null;
+
+ case 'capture':
+ return null;
+
+ case 'template':
+ $compiled_ref = "'$this->_current_file'";
+ $_max_index = 1;
+ break;
+
+ case 'version':
+ $compiled_ref = "'$this->_version'";
+ $_max_index = 1;
+ break;
+
+ case 'const':
+ if ($this->security && !$this->security_settings['ALLOW_CONSTANTS']) {
+ $this->_syntax_error("(secure mode) constants not permitted",
+ E_USER_WARNING, __FILE__, __LINE__);
+ return;
+ }
+ array_shift($indexes);
+ if (preg_match('!^\.\w+$!', $indexes[0])) {
+ $compiled_ref = '@' . substr($indexes[0], 1);
+ } else {
+ $_val = $this->_parse_var_props(substr($indexes[0], 1));
+ $compiled_ref = '@constant(' . $_val . ')';
+ }
+ $_max_index = 1;
+ break;
+
+ case 'config':
+ $compiled_ref = "\$this->_config[0]['vars']";
+ $_max_index = 3;
+ break;
+
+ case 'ldelim':
+ $compiled_ref = "'$this->left_delimiter'";
+ break;
+
+ case 'rdelim':
+ $compiled_ref = "'$this->right_delimiter'";
+ break;
+
+ default:
+ $this->_syntax_error('$smarty.' . $_ref . ' is an unknown reference', E_USER_ERROR, __FILE__, __LINE__);
+ break;
+ }
+
+ if (isset($_max_index) && count($indexes) > $_max_index) {
+ $this->_syntax_error('$smarty' . implode('', $indexes) .' is an invalid reference', E_USER_ERROR, __FILE__, __LINE__);
+ }
+
+ array_shift($indexes);
+ return $compiled_ref;
+ }
+
+ /**
+ * compiles call to plugin of type $type with name $name
+ * returns a string containing the function-name or method call
+ * without the paramter-list that would have follow to make the
+ * call valid php-syntax
+ *
+ * @param string $type
+ * @param string $name
+ * @return string
+ */
+ function _compile_plugin_call($type, $name) {
+ if (isset($this->_plugins[$type][$name])) {
+ /* plugin loaded */
+ if (is_array($this->_plugins[$type][$name][0])) {
+ return ((is_object($this->_plugins[$type][$name][0][0])) ?
+ "\$this->_plugins['$type']['$name'][0][0]->" /* method callback */
+ : (string)($this->_plugins[$type][$name][0][0]).'::' /* class callback */
+ ). $this->_plugins[$type][$name][0][1];
+
+ } else {
+ /* function callback */
+ return $this->_plugins[$type][$name][0];
+
+ }
+ } else {
+ /* plugin not loaded -> auto-loadable-plugin */
+ return 'smarty_'.$type.'_'.$name;
+
+ }
+ }
+
+ /**
+ * load pre- and post-filters
+ */
+ function _load_filters()
+ {
+ if (count($this->_plugins['prefilter']) > 0) {
+ foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) {
+ if ($prefilter === false) {
+ unset($this->_plugins['prefilter'][$filter_name]);
+ $_params = array('plugins' => array(array('prefilter', $filter_name, null, null, false)));
+ require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
+ smarty_core_load_plugins($_params, $this);
+ }
+ }
+ }
+ if (count($this->_plugins['postfilter']) > 0) {
+ foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) {
+ if ($postfilter === false) {
+ unset($this->_plugins['postfilter'][$filter_name]);
+ $_params = array('plugins' => array(array('postfilter', $filter_name, null, null, false)));
+ require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
+ smarty_core_load_plugins($_params, $this);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Quote subpattern references
+ *
+ * @param string $string
+ * @return string
+ */
+ function _quote_replace($string)
+ {
+ return strtr($string, array('\\' => '\\\\', '$' => '\\$'));
+ }
+
+ /**
+ * display Smarty syntax error
+ *
+ * @param string $error_msg
+ * @param integer $error_type
+ * @param string $file
+ * @param integer $line
+ */
+ function _syntax_error($error_msg, $error_type = E_USER_ERROR, $file=null, $line=null)
+ {
+ $this->_trigger_fatal_error("syntax error: $error_msg", $this->_current_file, $this->_current_line_no, $file, $line, $error_type);
+ }
+
+
+ /**
+ * check if the compilation changes from cacheable to
+ * non-cacheable state with the beginning of the current
+ * plugin. return php-code to reflect the transition.
+ * @return string
+ */
+ function _push_cacheable_state($type, $name) {
+ $_cacheable = !isset($this->_plugins[$type][$name]) || $this->_plugins[$type][$name][4];
+ if ($_cacheable
+ || 0<$this->_cacheable_state++) return '';
+ if (!isset($this->_cache_serial)) $this->_cache_serial = md5(uniqid('Smarty'));
+ $_ret = 'if ($this->caching && !$this->_cache_including): echo \'{nocache:'
+ . $this->_cache_serial . '#' . $this->_nocache_count
+ . '}\'; endif;';
+ return $_ret;
+ }
+
+
+ /**
+ * check if the compilation changes from non-cacheable to
+ * cacheable state with the end of the current plugin return
+ * php-code to reflect the transition.
+ * @return string
+ */
+ function _pop_cacheable_state($type, $name) {
+ $_cacheable = !isset($this->_plugins[$type][$name]) || $this->_plugins[$type][$name][4];
+ if ($_cacheable
+ || --$this->_cacheable_state>0) return '';
+ return 'if ($this->caching && !$this->_cache_including): echo \'{/nocache:'
+ . $this->_cache_serial . '#' . ($this->_nocache_count++)
+ . '}\'; endif;';
+ }
+
+
+ /**
+ * push opening tag-name, file-name and line-number on the tag-stack
+ * @param string the opening tag's name
+ */
+ function _push_tag($open_tag)
+ {
+ array_push($this->_tag_stack, array($open_tag, $this->_current_line_no));
+ }
+
+ /**
+ * pop closing tag-name
+ * raise an error if this stack-top doesn't match with the closing tag
+ * @param string the closing tag's name
+ * @return string the opening tag's name
+ */
+ function _pop_tag($close_tag)
+ {
+ $message = '';
+ if (count($this->_tag_stack)>0) {
+ list($_open_tag, $_line_no) = array_pop($this->_tag_stack);
+ if ($close_tag == $_open_tag) {
+ return $_open_tag;
+ }
+ if ($close_tag == 'if' && ($_open_tag == 'else' || $_open_tag == 'elseif' )) {
+ return $this->_pop_tag($close_tag);
+ }
+ if ($close_tag == 'section' && $_open_tag == 'sectionelse') {
+ $this->_pop_tag($close_tag);
+ return $_open_tag;
+ }
+ if ($close_tag == 'foreach' && $_open_tag == 'foreachelse') {
+ $this->_pop_tag($close_tag);
+ return $_open_tag;
+ }
+ if ($_open_tag == 'else' || $_open_tag == 'elseif') {
+ $_open_tag = 'if';
+ } elseif ($_open_tag == 'sectionelse') {
+ $_open_tag = 'section';
+ } elseif ($_open_tag == 'foreachelse') {
+ $_open_tag = 'foreach';
+ }
+ $message = " expected {/$_open_tag} (opened line $_line_no).";
+ }
+ $this->_syntax_error("mismatched tag {/$close_tag}.$message",
+ E_USER_ERROR, __FILE__, __LINE__);
+ }
+
+}
+
+/**
+ * compare to values by their string length
+ *
+ * @access private
+ * @param string $a
+ * @param string $b
+ * @return 0|-1|1
+ */
+function _smarty_sort_length($a, $b)
+{
+ if($a == $b)
+ return 0;
+
+ if(strlen($a) == strlen($b))
+ return ($a > $b) ? -1 : 1;
+
+ return (strlen($a) > strlen($b)) ? -1 : 1;
+}
+
+
+/* vim: set et: */
+
+?>
diff --git a/libs/Smarty/debug.tpl b/libs/Smarty/debug.tpl
new file mode 100755
index 0000000000..c05ef5d0b5
--- /dev/null
+++ b/libs/Smarty/debug.tpl
@@ -0,0 +1,157 @@
+{* Smarty *}
+{* debug.tpl, last updated version 2.1.0 *}
+{assign_debug_info}
+{capture assign=debug_output}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+ <title>Smarty Debug Console</title>
+{literal}
+<style type="text/css">
+/* <![CDATA[ */
+body, h1, h2, td, th, p {
+ font-family: sans-serif;
+ font-weight: normal;
+ font-size: 0.9em;
+ margin: 1px;
+ padding: 0;
+}
+
+h1 {
+ margin: 0;
+ text-align: left;
+ padding: 2px;
+ background-color: #f0c040;
+ color: black;
+ font-weight: bold;
+ font-size: 1.2em;
+ }
+
+h2 {
+ background-color: #9B410E;
+ color: white;
+ text-align: left;
+ font-weight: bold;
+ padding: 2px;
+ border-top: 1px solid black;
+}
+
+body {
+ background: black;
+}
+
+p, table, div {
+ background: #f0ead8;
+}
+
+p {
+ margin: 0;
+ font-style: italic;
+ text-align: center;
+}
+
+table {
+ width: 100%;
+}
+
+th, td {
+ font-family: monospace;
+ vertical-align: top;
+ text-align: left;
+ width: 50%;
+}
+
+td {
+ color: green;
+}
+
+.odd {
+ background-color: #eeeeee;
+}
+
+.even {
+ background-color: #fafafa;
+}
+
+.exectime {
+ font-size: 0.8em;
+ font-style: italic;
+}
+
+#table_assigned_vars th {
+ color: blue;
+}
+
+#table_config_vars th {
+ color: maroon;
+}
+/* ]]> */
+</style>
+{/literal}
+</head>
+<body>
+
+<h1>Smarty Debug Console</h1>
+
+<h2>included templates &amp; config files (load time in seconds)</h2>
+
+<div>
+{section name=templates loop=$_debug_tpls}
+ {section name=indent loop=$_debug_tpls[templates].depth}&nbsp;&nbsp;&nbsp;{/section}
+ <font color={if $_debug_tpls[templates].type eq "template"}brown{elseif $_debug_tpls[templates].type eq "insert"}black{else}green{/if}>
+ {$_debug_tpls[templates].filename|escape:html}</font>
+ {if isset($_debug_tpls[templates].exec_time)}
+ <span class="exectime">
+ ({$_debug_tpls[templates].exec_time|string_format:"%.5f"})
+ {if %templates.index% eq 0}(total){/if}
+ </span>
+ {/if}
+ <br />
+{sectionelse}
+ <p>no templates included</p>
+{/section}
+</div>
+
+<h2>assigned template variables</h2>
+
+<table id="table_assigned_vars">
+ {section name=vars loop=$_debug_keys}
+ <tr class="{cycle values="odd,even"}">
+ <th>{ldelim}${$_debug_keys[vars]|escape:'html'}{rdelim}</th>
+ <td>{$_debug_vals[vars]|@debug_print_var}</td></tr>
+ {sectionelse}
+ <tr><td><p>no template variables assigned</p></td></tr>
+ {/section}
+</table>
+
+<h2>assigned config file variables (outer template scope)</h2>
+
+<table id="table_config_vars">
+ {section name=config_vars loop=$_debug_config_keys}
+ <tr class="{cycle values="odd,even"}">
+ <th>{ldelim}#{$_debug_config_keys[config_vars]|escape:'html'}#{rdelim}</th>
+ <td>{$_debug_config_vals[config_vars]|@debug_print_var}</td></tr>
+ {sectionelse}
+ <tr><td><p>no config vars assigned</p></td></tr>
+ {/section}
+</table>
+</body>
+</html>
+{/capture}
+{if isset($_smarty_debug_output) and $_smarty_debug_output eq "html"}
+ {$debug_output}
+{else}
+<script type="text/javascript">
+// <![CDATA[
+ if ( self.name == '' ) {ldelim}
+ var title = 'Console';
+ {rdelim}
+ else {ldelim}
+ var title = 'Console_' + self.name;
+ {rdelim}
+ _smarty_console = window.open("",title.value,"width=680,height=600,resizable,scrollbars=yes");
+ _smarty_console.document.write('{$debug_output|escape:'javascript'}');
+ _smarty_console.document.close();
+// ]]>
+</script>
+{/if} \ No newline at end of file
diff --git a/libs/Smarty/internals/core.assemble_plugin_filepath.php b/libs/Smarty/internals/core.assemble_plugin_filepath.php
new file mode 100755
index 0000000000..690d3ddbc2
--- /dev/null
+++ b/libs/Smarty/internals/core.assemble_plugin_filepath.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * assemble filepath of requested plugin
+ *
+ * @param string $type
+ * @param string $name
+ * @return string|false
+ */
+function smarty_core_assemble_plugin_filepath($params, &$smarty)
+{
+ static $_filepaths_cache = array();
+
+ $_plugin_filename = $params['type'] . '.' . $params['name'] . '.php';
+ if (isset($_filepaths_cache[$_plugin_filename])) {
+ return $_filepaths_cache[$_plugin_filename];
+ }
+ $_return = false;
+
+ foreach ((array)$smarty->plugins_dir as $_plugin_dir) {
+
+ $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename;
+
+ // see if path is relative
+ if (!preg_match("/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/", $_plugin_dir)) {
+ $_relative_paths[] = $_plugin_dir;
+ // relative path, see if it is in the SMARTY_DIR
+ if (@is_readable(SMARTY_DIR . $_plugin_filepath)) {
+ $_return = SMARTY_DIR . $_plugin_filepath;
+ break;
+ }
+ }
+ // try relative to cwd (or absolute)
+ if (@is_readable($_plugin_filepath)) {
+ $_return = $_plugin_filepath;
+ break;
+ }
+ }
+
+ if($_return === false) {
+ // still not found, try PHP include_path
+ if(isset($_relative_paths)) {
+ foreach ((array)$_relative_paths as $_plugin_dir) {
+
+ $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename;
+
+ $_params = array('file_path' => $_plugin_filepath);
+ require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
+ if(smarty_core_get_include_path($_params, $smarty)) {
+ $_return = $_params['new_file_path'];
+ break;
+ }
+ }
+ }
+ }
+ $_filepaths_cache[$_plugin_filename] = $_return;
+ return $_return;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.assign_smarty_interface.php b/libs/Smarty/internals/core.assign_smarty_interface.php
new file mode 100755
index 0000000000..7e65a73ec2
--- /dev/null
+++ b/libs/Smarty/internals/core.assign_smarty_interface.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty assign_smarty_interface core plugin
+ *
+ * Type: core<br>
+ * Name: assign_smarty_interface<br>
+ * Purpose: assign the $smarty interface variable
+ * @param array Format: null
+ * @param Smarty
+ */
+function smarty_core_assign_smarty_interface($params, &$smarty)
+{
+ if (isset($smarty->_smarty_vars) && isset($smarty->_smarty_vars['request'])) {
+ return;
+ }
+
+ $_globals_map = array('g' => 'HTTP_GET_VARS',
+ 'p' => 'HTTP_POST_VARS',
+ 'c' => 'HTTP_COOKIE_VARS',
+ 's' => 'HTTP_SERVER_VARS',
+ 'e' => 'HTTP_ENV_VARS');
+
+ $_smarty_vars_request = array();
+
+ foreach (preg_split('!!', strtolower($smarty->request_vars_order)) as $_c) {
+ if (isset($_globals_map[$_c])) {
+ $_smarty_vars_request = array_merge($_smarty_vars_request, $GLOBALS[$_globals_map[$_c]]);
+ }
+ }
+ $_smarty_vars_request = @array_merge($_smarty_vars_request, $GLOBALS['HTTP_SESSION_VARS']);
+
+ $smarty->_smarty_vars['request'] = $_smarty_vars_request;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.create_dir_structure.php b/libs/Smarty/internals/core.create_dir_structure.php
new file mode 100755
index 0000000000..3eecc49723
--- /dev/null
+++ b/libs/Smarty/internals/core.create_dir_structure.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * create full directory structure
+ *
+ * @param string $dir
+ */
+
+// $dir
+
+function smarty_core_create_dir_structure($params, &$smarty)
+{
+ if (!file_exists($params['dir'])) {
+ $_open_basedir_ini = ini_get('open_basedir');
+
+ if (DIRECTORY_SEPARATOR=='/') {
+ /* unix-style paths */
+ $_dir = $params['dir'];
+ $_dir_parts = preg_split('!/+!', $_dir, -1, PREG_SPLIT_NO_EMPTY);
+ $_new_dir = (substr($_dir, 0, 1)=='/') ? '/' : getcwd().'/';
+ if($_use_open_basedir = !empty($_open_basedir_ini)) {
+ $_open_basedirs = explode(':', $_open_basedir_ini);
+ }
+
+ } else {
+ /* other-style paths */
+ $_dir = str_replace('\\','/', $params['dir']);
+ $_dir_parts = preg_split('!/+!', $_dir, -1, PREG_SPLIT_NO_EMPTY);
+ if (preg_match('!^((//)|([a-zA-Z]:/))!', $_dir, $_root_dir)) {
+ /* leading "//" for network volume, or "[letter]:/" for full path */
+ $_new_dir = $_root_dir[1];
+ /* remove drive-letter from _dir_parts */
+ if (isset($_root_dir[3])) array_shift($_dir_parts);
+
+ } else {
+ $_new_dir = str_replace('\\', '/', getcwd()).'/';
+
+ }
+
+ if($_use_open_basedir = !empty($_open_basedir_ini)) {
+ $_open_basedirs = explode(';', str_replace('\\', '/', $_open_basedir_ini));
+ }
+
+ }
+
+ /* all paths use "/" only from here */
+ foreach ($_dir_parts as $_dir_part) {
+ $_new_dir .= $_dir_part;
+
+ if ($_use_open_basedir) {
+ // do not attempt to test or make directories outside of open_basedir
+ $_make_new_dir = false;
+ foreach ($_open_basedirs as $_open_basedir) {
+ if (substr($_new_dir, 0, strlen($_open_basedir)) == $_open_basedir) {
+ $_make_new_dir = true;
+ break;
+ }
+ }
+ } else {
+ $_make_new_dir = true;
+ }
+
+ if ($_make_new_dir && !file_exists($_new_dir) && !@mkdir($_new_dir, $smarty->_dir_perms) && !is_dir($_new_dir)) {
+ $smarty->trigger_error("problem creating directory '" . $_new_dir . "'");
+ return false;
+ }
+ $_new_dir .= '/';
+ }
+ }
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.display_debug_console.php b/libs/Smarty/internals/core.display_debug_console.php
new file mode 100755
index 0000000000..1a80f39096
--- /dev/null
+++ b/libs/Smarty/internals/core.display_debug_console.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty debug_console function plugin
+ *
+ * Type: core<br>
+ * Name: display_debug_console<br>
+ * Purpose: display the javascript debug console window
+ * @param array Format: null
+ * @param Smarty
+ */
+function smarty_core_display_debug_console($params, &$smarty)
+{
+ // we must force compile the debug template in case the environment
+ // changed between separate applications.
+
+ if(empty($smarty->debug_tpl)) {
+ // set path to debug template from SMARTY_DIR
+ $smarty->debug_tpl = SMARTY_DIR . 'debug.tpl';
+ if($smarty->security && is_file($smarty->debug_tpl)) {
+ $smarty->secure_dir[] = realpath($smarty->debug_tpl);
+ }
+ $smarty->debug_tpl = 'file:' . SMARTY_DIR . 'debug.tpl';
+ }
+
+ $_ldelim_orig = $smarty->left_delimiter;
+ $_rdelim_orig = $smarty->right_delimiter;
+
+ $smarty->left_delimiter = '{';
+ $smarty->right_delimiter = '}';
+
+ $_compile_id_orig = $smarty->_compile_id;
+ $smarty->_compile_id = null;
+
+ $_compile_path = $smarty->_get_compile_path($smarty->debug_tpl);
+ if ($smarty->_compile_resource($smarty->debug_tpl, $_compile_path))
+ {
+ ob_start();
+ $smarty->_include($_compile_path);
+ $_results = ob_get_contents();
+ ob_end_clean();
+ } else {
+ $_results = '';
+ }
+
+ $smarty->_compile_id = $_compile_id_orig;
+
+ $smarty->left_delimiter = $_ldelim_orig;
+ $smarty->right_delimiter = $_rdelim_orig;
+
+ return $_results;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.get_include_path.php b/libs/Smarty/internals/core.get_include_path.php
new file mode 100755
index 0000000000..43432412b8
--- /dev/null
+++ b/libs/Smarty/internals/core.get_include_path.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Get path to file from include_path
+ *
+ * @param string $file_path
+ * @param string $new_file_path
+ * @return boolean
+ * @staticvar array|null
+ */
+
+// $file_path, &$new_file_path
+
+function smarty_core_get_include_path(&$params, &$smarty)
+{
+ static $_path_array = null;
+
+ if(!isset($_path_array)) {
+ $_ini_include_path = ini_get('include_path');
+
+ if(strstr($_ini_include_path,';')) {
+ // windows pathnames
+ $_path_array = explode(';',$_ini_include_path);
+ } else {
+ $_path_array = explode(':',$_ini_include_path);
+ }
+ }
+ foreach ($_path_array as $_include_path) {
+ if (@is_readable($_include_path . DIRECTORY_SEPARATOR . $params['file_path'])) {
+ $params['new_file_path'] = $_include_path . DIRECTORY_SEPARATOR . $params['file_path'];
+ return true;
+ }
+ }
+ return false;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.get_microtime.php b/libs/Smarty/internals/core.get_microtime.php
new file mode 100755
index 0000000000..f1a28e0425
--- /dev/null
+++ b/libs/Smarty/internals/core.get_microtime.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Get seconds and microseconds
+ * @return double
+ */
+function smarty_core_get_microtime($params, &$smarty)
+{
+ $mtime = microtime();
+ $mtime = explode(" ", $mtime);
+ $mtime = (double)($mtime[1]) + (double)($mtime[0]);
+ return ($mtime);
+}
+
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.get_php_resource.php b/libs/Smarty/internals/core.get_php_resource.php
new file mode 100755
index 0000000000..786d4e78e8
--- /dev/null
+++ b/libs/Smarty/internals/core.get_php_resource.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Retrieves PHP script resource
+ *
+ * sets $php_resource to the returned resource
+ * @param string $resource
+ * @param string $resource_type
+ * @param $php_resource
+ * @return boolean
+ */
+
+function smarty_core_get_php_resource(&$params, &$smarty)
+{
+
+ $params['resource_base_path'] = $smarty->trusted_dir;
+ $smarty->_parse_resource_name($params, $smarty);
+
+ /*
+ * Find out if the resource exists.
+ */
+
+ if ($params['resource_type'] == 'file') {
+ $_readable = false;
+ if(file_exists($params['resource_name']) && is_readable($params['resource_name'])) {
+ $_readable = true;
+ } else {
+ // test for file in include_path
+ $_params = array('file_path' => $params['resource_name']);
+ require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
+ if(smarty_core_get_include_path($_params, $smarty)) {
+ $_include_path = $_params['new_file_path'];
+ $_readable = true;
+ }
+ }
+ } else if ($params['resource_type'] != 'file') {
+ $_template_source = null;
+ $_readable = is_callable($smarty->_plugins['resource'][$params['resource_type']][0][0])
+ && call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][0],
+ array($params['resource_name'], &$_template_source, &$smarty));
+ }
+
+ /*
+ * Set the error function, depending on which class calls us.
+ */
+ if (method_exists($smarty, '_syntax_error')) {
+ $_error_funcc = '_syntax_error';
+ } else {
+ $_error_funcc = 'trigger_error';
+ }
+
+ if ($_readable) {
+ if ($smarty->security) {
+ require_once(SMARTY_CORE_DIR . 'core.is_trusted.php');
+ if (!smarty_core_is_trusted($params, $smarty)) {
+ $smarty->$_error_funcc('(secure mode) ' . $params['resource_type'] . ':' . $params['resource_name'] . ' is not trusted');
+ return false;
+ }
+ }
+ } else {
+ $smarty->$_error_funcc($params['resource_type'] . ':' . $params['resource_name'] . ' is not readable');
+ return false;
+ }
+
+ if ($params['resource_type'] == 'file') {
+ $params['php_resource'] = $params['resource_name'];
+ } else {
+ $params['php_resource'] = $_template_source;
+ }
+ return true;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.is_secure.php b/libs/Smarty/internals/core.is_secure.php
new file mode 100755
index 0000000000..d54abd4322
--- /dev/null
+++ b/libs/Smarty/internals/core.is_secure.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * determines if a resource is secure or not.
+ *
+ * @param string $resource_type
+ * @param string $resource_name
+ * @return boolean
+ */
+
+// $resource_type, $resource_name
+
+function smarty_core_is_secure($params, &$smarty)
+{
+ if (!$smarty->security || $smarty->security_settings['INCLUDE_ANY']) {
+ return true;
+ }
+
+ if ($params['resource_type'] == 'file') {
+ $_rp = realpath($params['resource_name']);
+ if (isset($params['resource_base_path'])) {
+ foreach ((array)$params['resource_base_path'] as $curr_dir) {
+ if ( ($_cd = realpath($curr_dir)) !== false &&
+ strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
+ substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) {
+ return true;
+ }
+ }
+ }
+ if (!empty($smarty->secure_dir)) {
+ foreach ((array)$smarty->secure_dir as $curr_dir) {
+ if ( ($_cd = realpath($curr_dir)) !== false) {
+ if($_cd == $_rp) {
+ return true;
+ } elseif (strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
+ substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR) {
+ return true;
+ }
+ }
+ }
+ }
+ } else {
+ // resource is not on local file system
+ return call_user_func_array(
+ $smarty->_plugins['resource'][$params['resource_type']][0][2],
+ array($params['resource_name'], &$smarty));
+ }
+
+ return false;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.is_trusted.php b/libs/Smarty/internals/core.is_trusted.php
new file mode 100755
index 0000000000..429973158d
--- /dev/null
+++ b/libs/Smarty/internals/core.is_trusted.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * determines if a resource is trusted or not
+ *
+ * @param string $resource_type
+ * @param string $resource_name
+ * @return boolean
+ */
+
+ // $resource_type, $resource_name
+
+function smarty_core_is_trusted($params, &$smarty)
+{
+ $_smarty_trusted = false;
+ if ($params['resource_type'] == 'file') {
+ if (!empty($smarty->trusted_dir)) {
+ $_rp = realpath($params['resource_name']);
+ foreach ((array)$smarty->trusted_dir as $curr_dir) {
+ if (!empty($curr_dir) && is_readable ($curr_dir)) {
+ $_cd = realpath($curr_dir);
+ if (strncmp($_rp, $_cd, strlen($_cd)) == 0
+ && substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) {
+ $_smarty_trusted = true;
+ break;
+ }
+ }
+ }
+ }
+
+ } else {
+ // resource is not on local file system
+ $_smarty_trusted = call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][3],
+ array($params['resource_name'], $smarty));
+ }
+
+ return $_smarty_trusted;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.load_plugins.php b/libs/Smarty/internals/core.load_plugins.php
new file mode 100755
index 0000000000..6db1dc51d2
--- /dev/null
+++ b/libs/Smarty/internals/core.load_plugins.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Load requested plugins
+ *
+ * @param array $plugins
+ */
+
+// $plugins
+
+function smarty_core_load_plugins($params, &$smarty)
+{
+
+ foreach ($params['plugins'] as $_plugin_info) {
+ list($_type, $_name, $_tpl_file, $_tpl_line, $_delayed_loading) = $_plugin_info;
+ $_plugin = &$smarty->_plugins[$_type][$_name];
+
+ /*
+ * We do not load plugin more than once for each instance of Smarty.
+ * The following code checks for that. The plugin can also be
+ * registered dynamically at runtime, in which case template file
+ * and line number will be unknown, so we fill them in.
+ *
+ * The final element of the info array is a flag that indicates
+ * whether the dynamically registered plugin function has been
+ * checked for existence yet or not.
+ */
+ if (isset($_plugin)) {
+ if (empty($_plugin[3])) {
+ if (!is_callable($_plugin[0])) {
+ $smarty->_trigger_fatal_error("[plugin] $_type '$_name' is not implemented", $_tpl_file, $_tpl_line, __FILE__, __LINE__);
+ } else {
+ $_plugin[1] = $_tpl_file;
+ $_plugin[2] = $_tpl_line;
+ $_plugin[3] = true;
+ if (!isset($_plugin[4])) $_plugin[4] = true; /* cacheable */
+ }
+ }
+ continue;
+ } else if ($_type == 'insert') {
+ /*
+ * For backwards compatibility, we check for insert functions in
+ * the symbol table before trying to load them as a plugin.
+ */
+ $_plugin_func = 'insert_' . $_name;
+ if (function_exists($_plugin_func)) {
+ $_plugin = array($_plugin_func, $_tpl_file, $_tpl_line, true, false);
+ continue;
+ }
+ }
+
+ $_plugin_file = $smarty->_get_plugin_filepath($_type, $_name);
+
+ if (! $_found = ($_plugin_file != false)) {
+ $_message = "could not load plugin file '$_type.$_name.php'\n";
+ }
+
+ /*
+ * If plugin file is found, it -must- provide the properly named
+ * plugin function. In case it doesn't, simply output the error and
+ * do not fall back on any other method.
+ */
+ if ($_found) {
+ include_once $_plugin_file;
+
+ $_plugin_func = 'smarty_' . $_type . '_' . $_name;
+ if (!function_exists($_plugin_func)) {
+ $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", $_tpl_file, $_tpl_line, __FILE__, __LINE__);
+ continue;
+ }
+ }
+ /*
+ * In case of insert plugins, their code may be loaded later via
+ * 'script' attribute.
+ */
+ else if ($_type == 'insert' && $_delayed_loading) {
+ $_plugin_func = 'smarty_' . $_type . '_' . $_name;
+ $_found = true;
+ }
+
+ /*
+ * Plugin specific processing and error checking.
+ */
+ if (!$_found) {
+ if ($_type == 'modifier') {
+ /*
+ * In case modifier falls back on using PHP functions
+ * directly, we only allow those specified in the security
+ * context.
+ */
+ if ($smarty->security && !in_array($_name, $smarty->security_settings['MODIFIER_FUNCS'])) {
+ $_message = "(secure mode) modifier '$_name' is not allowed";
+ } else {
+ if (!function_exists($_name)) {
+ $_message = "modifier '$_name' is not implemented";
+ } else {
+ $_plugin_func = $_name;
+ $_found = true;
+ }
+ }
+ } else if ($_type == 'function') {
+ /*
+ * This is a catch-all situation.
+ */
+ $_message = "unknown tag - '$_name'";
+ }
+ }
+
+ if ($_found) {
+ $smarty->_plugins[$_type][$_name] = array($_plugin_func, $_tpl_file, $_tpl_line, true, true);
+ } else {
+ // output error
+ $smarty->_trigger_fatal_error('[plugin] ' . $_message, $_tpl_file, $_tpl_line, __FILE__, __LINE__);
+ }
+ }
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.load_resource_plugin.php b/libs/Smarty/internals/core.load_resource_plugin.php
new file mode 100755
index 0000000000..a7d37d1afc
--- /dev/null
+++ b/libs/Smarty/internals/core.load_resource_plugin.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * load a resource plugin
+ *
+ * @param string $type
+ */
+
+// $type
+
+function smarty_core_load_resource_plugin($params, &$smarty)
+{
+ /*
+ * Resource plugins are not quite like the other ones, so they are
+ * handled differently. The first element of plugin info is the array of
+ * functions provided by the plugin, the second one indicates whether
+ * all of them exist or not.
+ */
+
+ $_plugin = &$smarty->_plugins['resource'][$params['type']];
+ if (isset($_plugin)) {
+ if (!$_plugin[1] && count($_plugin[0])) {
+ $_plugin[1] = true;
+ foreach ($_plugin[0] as $_plugin_func) {
+ if (!is_callable($_plugin_func)) {
+ $_plugin[1] = false;
+ break;
+ }
+ }
+ }
+
+ if (!$_plugin[1]) {
+ $smarty->_trigger_fatal_error("[plugin] resource '" . $params['type'] . "' is not implemented", null, null, __FILE__, __LINE__);
+ }
+
+ return;
+ }
+
+ $_plugin_file = $smarty->_get_plugin_filepath('resource', $params['type']);
+ $_found = ($_plugin_file != false);
+
+ if ($_found) { /*
+ * If the plugin file is found, it -must- provide the properly named
+ * plugin functions.
+ */
+ include_once($_plugin_file);
+
+ /*
+ * Locate functions that we require the plugin to provide.
+ */
+ $_resource_ops = array('source', 'timestamp', 'secure', 'trusted');
+ $_resource_funcs = array();
+ foreach ($_resource_ops as $_op) {
+ $_plugin_func = 'smarty_resource_' . $params['type'] . '_' . $_op;
+ if (!function_exists($_plugin_func)) {
+ $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", null, null, __FILE__, __LINE__);
+ return;
+ } else {
+ $_resource_funcs[] = $_plugin_func;
+ }
+ }
+
+ $smarty->_plugins['resource'][$params['type']] = array($_resource_funcs, true);
+ }
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.process_cached_inserts.php b/libs/Smarty/internals/core.process_cached_inserts.php
new file mode 100755
index 0000000000..1d78edd937
--- /dev/null
+++ b/libs/Smarty/internals/core.process_cached_inserts.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Replace cached inserts with the actual results
+ *
+ * @param string $results
+ * @return string
+ */
+function smarty_core_process_cached_inserts($params, &$smarty)
+{
+ preg_match_all('!'.$smarty->_smarty_md5.'{insert_cache (.*)}'.$smarty->_smarty_md5.'!Uis',
+ $params['results'], $match);
+ list($cached_inserts, $insert_args) = $match;
+
+ for ($i = 0, $for_max = count($cached_inserts); $i < $for_max; $i++) {
+ if ($smarty->debugging) {
+ $_params = array();
+ require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+ $debug_start_time = smarty_core_get_microtime($_params, $smarty);
+ }
+
+ $args = unserialize($insert_args[$i]);
+ $name = $args['name'];
+
+ if (isset($args['script'])) {
+ $_params = array('resource_name' => $smarty->_dequote($args['script']));
+ require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
+ if(!smarty_core_get_php_resource($_params, $smarty)) {
+ return false;
+ }
+ $resource_type = $_params['resource_type'];
+ $php_resource = $_params['php_resource'];
+
+
+ if ($resource_type == 'file') {
+ $smarty->_include($php_resource, true);
+ } else {
+ $smarty->_eval($php_resource);
+ }
+ }
+
+ $function_name = $smarty->_plugins['insert'][$name][0];
+ if (empty($args['assign'])) {
+ $replace = $function_name($args, $smarty);
+ } else {
+ $smarty->assign($args['assign'], $function_name($args, $smarty));
+ $replace = '';
+ }
+
+ $params['results'] = substr_replace($params['results'], $replace, strpos($params['results'], $cached_inserts[$i]), strlen($cached_inserts[$i]));
+ if ($smarty->debugging) {
+ $_params = array();
+ require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+ $smarty->_smarty_debug_info[] = array('type' => 'insert',
+ 'filename' => 'insert_'.$name,
+ 'depth' => $smarty->_inclusion_depth,
+ 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $debug_start_time);
+ }
+ }
+
+ return $params['results'];
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.process_compiled_include.php b/libs/Smarty/internals/core.process_compiled_include.php
new file mode 100755
index 0000000000..d539423bf7
--- /dev/null
+++ b/libs/Smarty/internals/core.process_compiled_include.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Replace nocache-tags by results of the corresponding non-cacheable
+ * functions and return it
+ *
+ * @param string $compiled_tpl
+ * @param string $cached_source
+ * @return string
+ */
+
+function smarty_core_process_compiled_include($params, &$smarty)
+{
+ $_cache_including = $smarty->_cache_including;
+ $smarty->_cache_including = true;
+
+ $_return = $params['results'];
+
+ foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) {
+ $smarty->_include($_include_file_path, true);
+ }
+
+ foreach ($smarty->_cache_serials as $_include_file_path=>$_cache_serial) {
+ $_return = preg_replace_callback('!(\{nocache\:('.$_cache_serial.')#(\d+)\})!s',
+ array(&$smarty, '_process_compiled_include_callback'),
+ $_return);
+ }
+ $smarty->_cache_including = $_cache_including;
+ return $_return;
+}
+
+?>
diff --git a/libs/Smarty/internals/core.read_cache_file.php b/libs/Smarty/internals/core.read_cache_file.php
new file mode 100755
index 0000000000..c60e113a71
--- /dev/null
+++ b/libs/Smarty/internals/core.read_cache_file.php
@@ -0,0 +1,101 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * read a cache file, determine if it needs to be
+ * regenerated or not
+ *
+ * @param string $tpl_file
+ * @param string $cache_id
+ * @param string $compile_id
+ * @param string $results
+ * @return boolean
+ */
+
+// $tpl_file, $cache_id, $compile_id, &$results
+
+function smarty_core_read_cache_file(&$params, &$smarty)
+{
+ static $content_cache = array();
+
+ if ($smarty->force_compile) {
+ // force compile enabled, always regenerate
+ return false;
+ }
+
+ if (isset($content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']])) {
+ list($params['results'], $smarty->_cache_info) = $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']];
+ return true;
+ }
+
+ if (!empty($smarty->cache_handler_func)) {
+ // use cache_handler function
+ call_user_func_array($smarty->cache_handler_func,
+ array('read', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], null));
+ } else {
+ // use local cache file
+ $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']);
+ $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id);
+ $params['results'] = $smarty->_read_file($_cache_file);
+ }
+
+ if (empty($params['results'])) {
+ // nothing to parse (error?), regenerate cache
+ return false;
+ }
+
+ $_contents = $params['results'];
+ $_info_start = strpos($_contents, "\n") + 1;
+ $_info_len = (int)substr($_contents, 0, $_info_start - 1);
+ $_cache_info = unserialize(substr($_contents, $_info_start, $_info_len));
+ $params['results'] = substr($_contents, $_info_start + $_info_len);
+
+ if ($smarty->caching == 2 && isset ($_cache_info['expires'])){
+ // caching by expiration time
+ if ($_cache_info['expires'] > -1 && (time() > $_cache_info['expires'])) {
+ // cache expired, regenerate
+ return false;
+ }
+ } else {
+ // caching by lifetime
+ if ($smarty->cache_lifetime > -1 && (time() - $_cache_info['timestamp'] > $smarty->cache_lifetime)) {
+ // cache expired, regenerate
+ return false;
+ }
+ }
+
+ if ($smarty->compile_check) {
+ $_params = array('get_source' => false, 'quiet'=>true);
+ foreach (array_keys($_cache_info['template']) as $_template_dep) {
+ $_params['resource_name'] = $_template_dep;
+ if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) {
+ // template file has changed, regenerate cache
+ return false;
+ }
+ }
+
+ if (isset($_cache_info['config'])) {
+ $_params = array('resource_base_path' => $smarty->config_dir, 'get_source' => false, 'quiet'=>true);
+ foreach (array_keys($_cache_info['config']) as $_config_dep) {
+ $_params['resource_name'] = $_config_dep;
+ if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) {
+ // config file has changed, regenerate cache
+ return false;
+ }
+ }
+ }
+ }
+
+ $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']] = array($params['results'], $_cache_info);
+
+ $smarty->_cache_info = $_cache_info;
+ return true;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.rm_auto.php b/libs/Smarty/internals/core.rm_auto.php
new file mode 100755
index 0000000000..b251f64911
--- /dev/null
+++ b/libs/Smarty/internals/core.rm_auto.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * delete an automagically created file by name and id
+ *
+ * @param string $auto_base
+ * @param string $auto_source
+ * @param string $auto_id
+ * @param integer $exp_time
+ * @return boolean
+ */
+
+// $auto_base, $auto_source = null, $auto_id = null, $exp_time = null
+
+function smarty_core_rm_auto($params, &$smarty)
+{
+ if (!@is_dir($params['auto_base']))
+ return false;
+
+ if(!isset($params['auto_id']) && !isset($params['auto_source'])) {
+ $_params = array(
+ 'dirname' => $params['auto_base'],
+ 'level' => 0,
+ 'exp_time' => $params['exp_time']
+ );
+ require_once(SMARTY_CORE_DIR . 'core.rmdir.php');
+ $_res = smarty_core_rmdir($_params, $smarty);
+ } else {
+ $_tname = $smarty->_get_auto_filename($params['auto_base'], $params['auto_source'], $params['auto_id']);
+
+ if(isset($params['auto_source'])) {
+ if (isset($params['extensions'])) {
+ $_res = false;
+ foreach ((array)$params['extensions'] as $_extension)
+ $_res |= $smarty->_unlink($_tname.$_extension, $params['exp_time']);
+ } else {
+ $_res = $smarty->_unlink($_tname, $params['exp_time']);
+ }
+ } elseif ($smarty->use_sub_dirs) {
+ $_params = array(
+ 'dirname' => $_tname,
+ 'level' => 1,
+ 'exp_time' => $params['exp_time']
+ );
+ require_once(SMARTY_CORE_DIR . 'core.rmdir.php');
+ $_res = smarty_core_rmdir($_params, $smarty);
+ } else {
+ // remove matching file names
+ $_handle = opendir($params['auto_base']);
+ $_res = true;
+ while (false !== ($_filename = readdir($_handle))) {
+ if($_filename == '.' || $_filename == '..') {
+ continue;
+ } elseif (substr($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, 0, strlen($_tname)) == $_tname) {
+ $_res &= (bool)$smarty->_unlink($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, $params['exp_time']);
+ }
+ }
+ }
+ }
+
+ return $_res;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.rmdir.php b/libs/Smarty/internals/core.rmdir.php
new file mode 100755
index 0000000000..2166c44d28
--- /dev/null
+++ b/libs/Smarty/internals/core.rmdir.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * delete a dir recursively (level=0 -> keep root)
+ * WARNING: no tests, it will try to remove what you tell it!
+ *
+ * @param string $dirname
+ * @param integer $level
+ * @param integer $exp_time
+ * @return boolean
+ */
+
+// $dirname, $level = 1, $exp_time = null
+
+function smarty_core_rmdir($params, &$smarty)
+{
+ if(!isset($params['level'])) { $params['level'] = 1; }
+ if(!isset($params['exp_time'])) { $params['exp_time'] = null; }
+
+ if($_handle = @opendir($params['dirname'])) {
+
+ while (false !== ($_entry = readdir($_handle))) {
+ if ($_entry != '.' && $_entry != '..') {
+ if (@is_dir($params['dirname'] . DIRECTORY_SEPARATOR . $_entry)) {
+ $_params = array(
+ 'dirname' => $params['dirname'] . DIRECTORY_SEPARATOR . $_entry,
+ 'level' => $params['level'] + 1,
+ 'exp_time' => $params['exp_time']
+ );
+ smarty_core_rmdir($_params, $smarty);
+ }
+ else {
+ $smarty->_unlink($params['dirname'] . DIRECTORY_SEPARATOR . $_entry, $params['exp_time']);
+ }
+ }
+ }
+ closedir($_handle);
+ }
+
+ if ($params['level']) {
+ return @rmdir($params['dirname']);
+ }
+ return (bool)$_handle;
+
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.run_insert_handler.php b/libs/Smarty/internals/core.run_insert_handler.php
new file mode 100755
index 0000000000..71c3845080
--- /dev/null
+++ b/libs/Smarty/internals/core.run_insert_handler.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Handle insert tags
+ *
+ * @param array $args
+ * @return string
+ */
+function smarty_core_run_insert_handler($params, &$smarty)
+{
+
+ require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+ if ($smarty->debugging) {
+ $_params = array();
+ $_debug_start_time = smarty_core_get_microtime($_params, $smarty);
+ }
+
+ if ($smarty->caching) {
+ $_arg_string = serialize($params['args']);
+ $_name = $params['args']['name'];
+ if (!isset($smarty->_cache_info['insert_tags'][$_name])) {
+ $smarty->_cache_info['insert_tags'][$_name] = array('insert',
+ $_name,
+ $smarty->_plugins['insert'][$_name][1],
+ $smarty->_plugins['insert'][$_name][2],
+ !empty($params['args']['script']) ? true : false);
+ }
+ return $smarty->_smarty_md5."{insert_cache $_arg_string}".$smarty->_smarty_md5;
+ } else {
+ if (isset($params['args']['script'])) {
+ $_params = array('resource_name' => $smarty->_dequote($params['args']['script']));
+ require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
+ if(!smarty_core_get_php_resource($_params, $smarty)) {
+ return false;
+ }
+
+ if ($_params['resource_type'] == 'file') {
+ $smarty->_include($_params['php_resource'], true);
+ } else {
+ $smarty->_eval($_params['php_resource']);
+ }
+ unset($params['args']['script']);
+ }
+
+ $_funcname = $smarty->_plugins['insert'][$params['args']['name']][0];
+ $_content = $_funcname($params['args'], $smarty);
+ if ($smarty->debugging) {
+ $_params = array();
+ require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+ $smarty->_smarty_debug_info[] = array('type' => 'insert',
+ 'filename' => 'insert_'.$params['args']['name'],
+ 'depth' => $smarty->_inclusion_depth,
+ 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time);
+ }
+
+ if (!empty($params['args']["assign"])) {
+ $smarty->assign($params['args']["assign"], $_content);
+ } else {
+ return $_content;
+ }
+ }
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.smarty_include_php.php b/libs/Smarty/internals/core.smarty_include_php.php
new file mode 100755
index 0000000000..30c6e76549
--- /dev/null
+++ b/libs/Smarty/internals/core.smarty_include_php.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * called for included php files within templates
+ *
+ * @param string $smarty_file
+ * @param string $smarty_assign variable to assign the included template's
+ * output into
+ * @param boolean $smarty_once uses include_once if this is true
+ * @param array $smarty_include_vars associative array of vars from
+ * {include file="blah" var=$var}
+ */
+
+// $file, $assign, $once, $_smarty_include_vars
+
+function smarty_core_smarty_include_php($params, &$smarty)
+{
+ $_params = array('resource_name' => $params['smarty_file']);
+ require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
+ smarty_core_get_php_resource($_params, $smarty);
+ $_smarty_resource_type = $_params['resource_type'];
+ $_smarty_php_resource = $_params['php_resource'];
+
+ if (!empty($params['smarty_assign'])) {
+ ob_start();
+ if ($_smarty_resource_type == 'file') {
+ $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']);
+ } else {
+ $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']);
+ }
+ $smarty->assign($params['smarty_assign'], ob_get_contents());
+ ob_end_clean();
+ } else {
+ if ($_smarty_resource_type == 'file') {
+ $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']);
+ } else {
+ $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']);
+ }
+ }
+}
+
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.write_cache_file.php b/libs/Smarty/internals/core.write_cache_file.php
new file mode 100755
index 0000000000..72f785b74e
--- /dev/null
+++ b/libs/Smarty/internals/core.write_cache_file.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Prepend the cache information to the cache file
+ * and write it
+ *
+ * @param string $tpl_file
+ * @param string $cache_id
+ * @param string $compile_id
+ * @param string $results
+ * @return true|null
+ */
+
+ // $tpl_file, $cache_id, $compile_id, $results
+
+function smarty_core_write_cache_file($params, &$smarty)
+{
+
+ // put timestamp in cache header
+ $smarty->_cache_info['timestamp'] = time();
+ if ($smarty->cache_lifetime > -1){
+ // expiration set
+ $smarty->_cache_info['expires'] = $smarty->_cache_info['timestamp'] + $smarty->cache_lifetime;
+ } else {
+ // cache will never expire
+ $smarty->_cache_info['expires'] = -1;
+ }
+
+ // collapse nocache.../nocache-tags
+ if (preg_match_all('!\{(/?)nocache\:[0-9a-f]{32}#\d+\}!', $params['results'], $match, PREG_PATTERN_ORDER)) {
+ // remove everything between every pair of outermost noache.../nocache-tags
+ // and replace it by a single nocache-tag
+ // this new nocache-tag will be replaced by dynamic contents in
+ // smarty_core_process_compiled_includes() on a cache-read
+
+ $match_count = count($match[0]);
+ $results = preg_split('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!', $params['results'], -1, PREG_SPLIT_DELIM_CAPTURE);
+
+ $level = 0;
+ $j = 0;
+ for ($i=0, $results_count = count($results); $i < $results_count && $j < $match_count; $i++) {
+ if ($results[$i] == $match[0][$j]) {
+ // nocache tag
+ if ($match[1][$j]) { // closing tag
+ $level--;
+ unset($results[$i]);
+ } else { // opening tag
+ if ($level++ > 0) unset($results[$i]);
+ }
+ $j++;
+ } elseif ($level > 0) {
+ unset($results[$i]);
+ }
+ }
+ $params['results'] = implode('', $results);
+ }
+ $smarty->_cache_info['cache_serials'] = $smarty->_cache_serials;
+
+ // prepend the cache header info into cache file
+ $_cache_info = serialize($smarty->_cache_info);
+ $params['results'] = strlen($_cache_info) . "\n" . $_cache_info . $params['results'];
+
+ if (!empty($smarty->cache_handler_func)) {
+ // use cache_handler function
+ call_user_func_array($smarty->cache_handler_func,
+ array('write', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], null));
+ } else {
+ // use local cache file
+
+ if(!@is_writable($smarty->cache_dir)) {
+ // cache_dir not writable, see if it exists
+ if(!@is_dir($smarty->cache_dir)) {
+ $smarty->trigger_error('the $cache_dir \'' . $smarty->cache_dir . '\' does not exist, or is not a directory.', E_USER_ERROR);
+ return false;
+ }
+ $smarty->trigger_error('unable to write to $cache_dir \'' . realpath($smarty->cache_dir) . '\'. Be sure $cache_dir is writable by the web server user.', E_USER_ERROR);
+ return false;
+ }
+
+ $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']);
+ $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id);
+ $_params = array('filename' => $_cache_file, 'contents' => $params['results'], 'create_dirs' => true);
+ require_once(SMARTY_CORE_DIR . 'core.write_file.php');
+ smarty_core_write_file($_params, $smarty);
+ return true;
+ }
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.write_compiled_include.php b/libs/Smarty/internals/core.write_compiled_include.php
new file mode 100755
index 0000000000..c14adb5f42
--- /dev/null
+++ b/libs/Smarty/internals/core.write_compiled_include.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Extract non-cacheable parts out of compiled template and write it
+ *
+ * @param string $compile_path
+ * @param string $template_compiled
+ * @return boolean
+ */
+
+function smarty_core_write_compiled_include($params, &$smarty)
+{
+ $_tag_start = 'if \(\$this->caching && \!\$this->_cache_including\)\: echo \'\{nocache\:('.$params['cache_serial'].')#(\d+)\}\'; endif;';
+ $_tag_end = 'if \(\$this->caching && \!\$this->_cache_including\)\: echo \'\{/nocache\:(\\2)#(\\3)\}\'; endif;';
+
+ preg_match_all('!('.$_tag_start.'(.*)'.$_tag_end.')!Us',
+ $params['compiled_content'], $_match_source, PREG_SET_ORDER);
+
+ // no nocache-parts found: done
+ if (count($_match_source)==0) return;
+
+ // convert the matched php-code to functions
+ $_include_compiled = "<?php /* Smarty version ".$smarty->_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n";
+ $_include_compiled .= " compiled from " . strtr(urlencode($params['resource_name']), array('%2F'=>'/', '%3A'=>':')) . " */\n\n";
+
+ $_compile_path = $params['include_file_path'];
+
+ $smarty->_cache_serials[$_compile_path] = $params['cache_serial'];
+ $_include_compiled .= "\$this->_cache_serials['".$_compile_path."'] = '".$params['cache_serial']."';\n\n?>";
+
+ $_include_compiled .= $params['plugins_code'];
+ $_include_compiled .= "<?php";
+
+ $this_varname = ((double)phpversion() >= 5.0) ? '_smarty' : 'this';
+ for ($_i = 0, $_for_max = count($_match_source); $_i < $_for_max; $_i++) {
+ $_match =& $_match_source[$_i];
+ $source = $_match[4];
+ if ($this_varname == '_smarty') {
+ /* rename $this to $_smarty in the sourcecode */
+ $tokens = token_get_all('<?php ' . $_match[4]);
+
+ /* remove trailing <?php */
+ $open_tag = '';
+ while ($tokens) {
+ $token = array_shift($tokens);
+ if (is_array($token)) {
+ $open_tag .= $token[1];
+ } else {
+ $open_tag .= $token;
+ }
+ if ($open_tag == '<?php ') break;
+ }
+
+ for ($i=0, $count = count($tokens); $i < $count; $i++) {
+ if (is_array($tokens[$i])) {
+ if ($tokens[$i][0] == T_VARIABLE && $tokens[$i][1] == '$this') {
+ $tokens[$i] = '$' . $this_varname;
+ } else {
+ $tokens[$i] = $tokens[$i][1];
+ }
+ }
+ }
+ $source = implode('', $tokens);
+ }
+
+ /* add function to compiled include */
+ $_include_compiled .= "
+function _smarty_tplfunc_$_match[2]_$_match[3](&\$$this_varname)
+{
+$source
+}
+
+";
+ }
+ $_include_compiled .= "\n\n?>\n";
+
+ $_params = array('filename' => $_compile_path,
+ 'contents' => $_include_compiled, 'create_dirs' => true);
+
+ require_once(SMARTY_CORE_DIR . 'core.write_file.php');
+ smarty_core_write_file($_params, $smarty);
+ return true;
+}
+
+
+?>
diff --git a/libs/Smarty/internals/core.write_compiled_resource.php b/libs/Smarty/internals/core.write_compiled_resource.php
new file mode 100755
index 0000000000..b902eff3cb
--- /dev/null
+++ b/libs/Smarty/internals/core.write_compiled_resource.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * write the compiled resource
+ *
+ * @param string $compile_path
+ * @param string $compiled_content
+ * @return true
+ */
+function smarty_core_write_compiled_resource($params, &$smarty)
+{
+ if(!@is_writable($smarty->compile_dir)) {
+ // compile_dir not writable, see if it exists
+ if(!@is_dir($smarty->compile_dir)) {
+ $smarty->trigger_error('the $compile_dir \'' . $smarty->compile_dir . '\' does not exist, or is not a directory.', E_USER_ERROR);
+ return false;
+ }
+ $smarty->trigger_error('unable to write to $compile_dir \'' . realpath($smarty->compile_dir) . '\'. Be sure $compile_dir is writable by the web server user.', E_USER_ERROR);
+ return false;
+ }
+
+ $_params = array('filename' => $params['compile_path'], 'contents' => $params['compiled_content'], 'create_dirs' => true);
+ require_once(SMARTY_CORE_DIR . 'core.write_file.php');
+ smarty_core_write_file($_params, $smarty);
+ return true;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/internals/core.write_file.php b/libs/Smarty/internals/core.write_file.php
new file mode 100755
index 0000000000..8a3a3b3984
--- /dev/null
+++ b/libs/Smarty/internals/core.write_file.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * write out a file to disk
+ *
+ * @param string $filename
+ * @param string $contents
+ * @param boolean $create_dirs
+ * @return boolean
+ */
+function smarty_core_write_file($params, &$smarty)
+{
+ $_dirname = dirname($params['filename']);
+
+ if ($params['create_dirs']) {
+ $_params = array('dir' => $_dirname);
+ require_once(SMARTY_CORE_DIR . 'core.create_dir_structure.php');
+ smarty_core_create_dir_structure($_params, $smarty);
+ }
+
+ // write to tmp file, then rename it to avoid file locking race condition
+ $_tmp_file = tempnam($_dirname, 'wrt');
+
+ if (!($fd = @fopen($_tmp_file, 'wb'))) {
+ $_tmp_file = $_dirname . DIRECTORY_SEPARATOR . uniqid('wrt');
+ if (!($fd = @fopen($_tmp_file, 'wb'))) {
+ $smarty->trigger_error("problem writing temporary file '$_tmp_file'");
+ return false;
+ }
+ }
+
+ fwrite($fd, $params['contents']);
+ fclose($fd);
+
+ if (DIRECTORY_SEPARATOR == '\\' || !@rename($_tmp_file, $params['filename'])) {
+ // On platforms and filesystems that cannot overwrite with rename()
+ // delete the file before renaming it -- because windows always suffers
+ // this, it is short-circuited to avoid the initial rename() attempt
+ @unlink($params['filename']);
+ @rename($_tmp_file, $params['filename']);
+ }
+ @chmod($params['filename'], $smarty->_file_perms);
+
+ return true;
+}
+
+/* vim: set expandtab: */
+
+?> \ No newline at end of file
diff --git a/libs/Smarty/plugins/block.textformat.php b/libs/Smarty/plugins/block.textformat.php
new file mode 100755
index 0000000000..8cd010acb4
--- /dev/null
+++ b/libs/Smarty/plugins/block.textformat.php
@@ -0,0 +1,103 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty {textformat}{/textformat} block plugin
+ *
+ * Type: block function<br>
+ * Name: textformat<br>
+ * Purpose: format text a certain way with preset styles
+ * or custom wrap/indent settings<br>
+ * @link http://smarty.php.net/manual/en/language.function.textformat.php {textformat}
+ * (Smarty online manual)
+ * @param array
+ * <pre>
+ * Params: style: string (email)
+ * indent: integer (0)
+ * wrap: integer (80)
+ * wrap_char string ("\n")
+ * indent_char: string (" ")
+ * wrap_boundary: boolean (true)
+ * </pre>
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string contents of the block
+ * @param Smarty clever simulation of a method
+ * @return string string $content re-formatted
+ */
+function smarty_block_textformat($params, $content, &$smarty)
+{
+ if (is_null($content)) {
+ return;
+ }
+
+ $style = null;
+ $indent = 0;
+ $indent_first = 0;
+ $indent_char = ' ';
+ $wrap = 80;
+ $wrap_char = "\n";
+ $wrap_cut = false;
+ $assign = null;
+
+ foreach ($params as $_key => $_val) {
+ switch ($_key) {
+ case 'style':
+ case 'indent_char':
+ case 'wrap_char':
+ case 'assign':
+ $$_key = (string)$_val;
+ break;
+
+ case 'indent':
+ case 'indent_first':
+ case 'wrap':
+ $$_key = (int)$_val;
+ break;
+
+ case 'wrap_cut':
+ $$_key = (bool)$_val;
+ break;
+
+ default:
+ $smarty->trigger_error("textformat: unknown attribute '$_key'");
+ }
+ }
+
+ if ($style == 'email') {
+ $wrap = 72;
+ }
+
+ // split into paragraphs
+ $_paragraphs = preg_split('![\r\n][\r\n]!',$content);
+ $_output = '';
+
+ for($_x = 0, $_y = count($_paragraphs); $_x < $_y; $_x++) {
+ if ($_paragraphs[$_x] == '') {
+ continue;
+ }
+ // convert mult. spaces & special chars to single space
+ $_paragraphs[$_x] = preg_replace(array('!\s+!','!(^\s+)|(\s+$)!'), array(' ',''), $_paragraphs[$_x]);
+ // indent first line
+ if($indent_first > 0) {
+ $_paragraphs[$_x] = str_repeat($indent_char, $indent_first) . $_paragraphs[$_x];
+ }
+ // wordwrap sentences
+ $_paragraphs[$_x] = wordwrap($_paragraphs[$_x], $wrap - $indent, $wrap_char, $wrap_cut);
+ // indent lines
+ if($indent > 0) {
+ $_paragraphs[$_x] = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraphs[$_x]);
+ }
+ }
+ $_output = implode($wrap_char . $wrap_char, $_paragraphs);
+
+ return $assign ? $smarty->assign($assign, $_output) : $_output;
+
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/compiler.assign.php b/libs/Smarty/plugins/compiler.assign.php
new file mode 100755
index 0000000000..be17298501
--- /dev/null
+++ b/libs/Smarty/plugins/compiler.assign.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty {assign} compiler function plugin
+ *
+ * Type: compiler function<br>
+ * Name: assign<br>
+ * Purpose: assign a value to a template variable
+ * @link http://smarty.php.net/manual/en/language.custom.functions.php#LANGUAGE.FUNCTION.ASSIGN {assign}
+ * (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com> (initial author)
+ * @auther messju mohr <messju at lammfellpuschen dot de> (conversion to compiler function)
+ * @param string containing var-attribute and value-attribute
+ * @param Smarty_Compiler
+ */
+function smarty_compiler_assign($tag_attrs, &$compiler)
+{
+ $_params = $compiler->_parse_attrs($tag_attrs);
+
+ if (!isset($_params['var'])) {
+ $compiler->_syntax_error("assign: missing 'var' parameter", E_USER_WARNING);
+ return;
+ }
+
+ if (!isset($_params['value'])) {
+ $compiler->_syntax_error("assign: missing 'value' parameter", E_USER_WARNING);
+ return;
+ }
+
+ return "\$this->assign({$_params['var']}, {$_params['value']});";
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.assign_debug_info.php b/libs/Smarty/plugins/function.assign_debug_info.php
new file mode 100755
index 0000000000..654049876a
--- /dev/null
+++ b/libs/Smarty/plugins/function.assign_debug_info.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty {assign_debug_info} function plugin
+ *
+ * Type: function<br>
+ * Name: assign_debug_info<br>
+ * Purpose: assign debug info to the template<br>
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param array unused in this plugin, this plugin uses {@link Smarty::$_config},
+ * {@link Smarty::$_tpl_vars} and {@link Smarty::$_smarty_debug_info}
+ * @param Smarty
+ */
+function smarty_function_assign_debug_info($params, &$smarty)
+{
+ $assigned_vars = $smarty->_tpl_vars;
+ ksort($assigned_vars);
+ if (@is_array($smarty->_config[0])) {
+ $config_vars = $smarty->_config[0];
+ ksort($config_vars);
+ $smarty->assign("_debug_config_keys", array_keys($config_vars));
+ $smarty->assign("_debug_config_vals", array_values($config_vars));
+ }
+
+ $included_templates = $smarty->_smarty_debug_info;
+
+ $smarty->assign("_debug_keys", array_keys($assigned_vars));
+ $smarty->assign("_debug_vals", array_values($assigned_vars));
+
+ $smarty->assign("_debug_tpls", $included_templates);
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.config_load.php b/libs/Smarty/plugins/function.config_load.php
new file mode 100755
index 0000000000..db89f638c2
--- /dev/null
+++ b/libs/Smarty/plugins/function.config_load.php
@@ -0,0 +1,142 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty {config_load} function plugin
+ *
+ * Type: function<br>
+ * Name: config_load<br>
+ * Purpose: load config file vars
+ * @link http://smarty.php.net/manual/en/language.function.config.load.php {config_load}
+ * (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author messju mohr <messju at lammfellpuschen dot de> (added use of resources)
+ * @param array Format:
+ * <pre>
+ * array('file' => required config file name,
+ * 'section' => optional config file section to load
+ * 'scope' => local/parent/global
+ * 'global' => overrides scope, setting to parent if true)
+ * </pre>
+ * @param Smarty
+ */
+function smarty_function_config_load($params, &$smarty)
+{
+ if ($smarty->debugging) {
+ $_params = array();
+ require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+ $_debug_start_time = smarty_core_get_microtime($_params, $smarty);
+ }
+
+ $_file = isset($params['file']) ? $smarty->_dequote($params['file']) : null;
+ $_section = isset($params['section']) ? $smarty->_dequote($params['section']) : null;
+ $_scope = isset($params['scope']) ? $smarty->_dequote($params['scope']) : 'global';
+ $_global = isset($params['global']) ? $smarty->_dequote($params['global']) : false;
+
+ if (!isset($_file) || strlen($_file) == 0) {
+ $smarty->trigger_error("missing 'file' attribute in config_load tag", E_USER_ERROR, __FILE__, __LINE__);
+ }
+
+ if (isset($_scope)) {
+ if ($_scope != 'local' &&
+ $_scope != 'parent' &&
+ $_scope != 'global') {
+ $smarty->trigger_error("invalid 'scope' attribute value", E_USER_ERROR, __FILE__, __LINE__);
+ }
+ } else {
+ if ($_global) {
+ $_scope = 'parent';
+ } else {
+ $_scope = 'local';
+ }
+ }
+
+ $_params = array('resource_name' => $_file,
+ 'resource_base_path' => $smarty->config_dir,
+ 'get_source' => false);
+ $smarty->_parse_resource_name($_params);
+ $_file_path = $_params['resource_type'] . ':' . $_params['resource_name'];
+ if (isset($_section))
+ $_compile_file = $smarty->_get_compile_path($_file_path.'|'.$_section);
+ else
+ $_compile_file = $smarty->_get_compile_path($_file_path);
+
+ if($smarty->force_compile || !file_exists($_compile_file)) {
+ $_compile = true;
+ } elseif ($smarty->compile_check) {
+ $_params = array('resource_name' => $_file,
+ 'resource_base_path' => $smarty->config_dir,
+ 'get_source' => false);
+ $_compile = $smarty->_fetch_resource_info($_params) &&
+ $_params['resource_timestamp'] > filemtime($_compile_file);
+ } else {
+ $_compile = false;
+ }
+
+ if($_compile) {
+ // compile config file
+ if(!is_object($smarty->_conf_obj)) {
+ require_once SMARTY_DIR . $smarty->config_class . '.class.php';
+ $smarty->_conf_obj = new $smarty->config_class();
+ $smarty->_conf_obj->overwrite = $smarty->config_overwrite;
+ $smarty->_conf_obj->booleanize = $smarty->config_booleanize;
+ $smarty->_conf_obj->read_hidden = $smarty->config_read_hidden;
+ $smarty->_conf_obj->fix_newlines = $smarty->config_fix_newlines;
+ }
+
+ $_params = array('resource_name' => $_file,
+ 'resource_base_path' => $smarty->config_dir,
+ $_params['get_source'] = true);
+ if (!$smarty->_fetch_resource_info($_params)) {
+ return;
+ }
+ $smarty->_conf_obj->set_file_contents($_file, $_params['source_content']);
+ $_config_vars = array_merge($smarty->_conf_obj->get($_file),
+ $smarty->_conf_obj->get($_file, $_section));
+ if(function_exists('var_export')) {
+ $_output = '<?php $_config_vars = ' . var_export($_config_vars, true) . '; ?>';
+ } else {
+ $_output = '<?php $_config_vars = unserialize(\'' . strtr(serialize($_config_vars),array('\''=>'\\\'', '\\'=>'\\\\')) . '\'); ?>';
+ }
+ $_params = (array('compile_path' => $_compile_file, 'compiled_content' => $_output, 'resource_timestamp' => $_params['resource_timestamp']));
+ require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php');
+ smarty_core_write_compiled_resource($_params, $smarty);
+ } else {
+ include($_compile_file);
+ }
+
+ if ($smarty->caching) {
+ $smarty->_cache_info['config'][$_file] = true;
+ }
+
+ $smarty->_config[0]['vars'] = @array_merge($smarty->_config[0]['vars'], $_config_vars);
+ $smarty->_config[0]['files'][$_file] = true;
+
+ if ($_scope == 'parent') {
+ $smarty->_config[1]['vars'] = @array_merge($smarty->_config[1]['vars'], $_config_vars);
+ $smarty->_config[1]['files'][$_file] = true;
+ } else if ($_scope == 'global') {
+ for ($i = 1, $for_max = count($smarty->_config); $i < $for_max; $i++) {
+ $smarty->_config[$i]['vars'] = @array_merge($smarty->_config[$i]['vars'], $_config_vars);
+ $smarty->_config[$i]['files'][$_file] = true;
+ }
+ }
+
+ if ($smarty->debugging) {
+ $_params = array();
+ require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+ $smarty->_smarty_debug_info[] = array('type' => 'config',
+ 'filename' => $_file.' ['.$_section.'] '.$_scope,
+ 'depth' => $smarty->_inclusion_depth,
+ 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time);
+ }
+
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.counter.php b/libs/Smarty/plugins/function.counter.php
new file mode 100755
index 0000000000..1f26db5fb6
--- /dev/null
+++ b/libs/Smarty/plugins/function.counter.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {counter} function plugin
+ *
+ * Type: function<br>
+ * Name: counter<br>
+ * Purpose: print out a counter value
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @link http://smarty.php.net/manual/en/language.function.counter.php {counter}
+ * (Smarty online manual)
+ * @param array parameters
+ * @param Smarty
+ * @return string|null
+ */
+function smarty_function_counter($params, &$smarty)
+{
+ static $counters = array();
+
+ $name = (isset($params['name'])) ? $params['name'] : 'default';
+ if (!isset($counters[$name])) {
+ $counters[$name] = array(
+ 'start'=>1,
+ 'skip'=>1,
+ 'direction'=>'up',
+ 'count'=>1
+ );
+ }
+ $counter =& $counters[$name];
+
+ if (isset($params['start'])) {
+ $counter['start'] = $counter['count'] = (int)$params['start'];
+ }
+
+ if (!empty($params['assign'])) {
+ $counter['assign'] = $params['assign'];
+ }
+
+ if (isset($counter['assign'])) {
+ $smarty->assign($counter['assign'], $counter['count']);
+ }
+
+ if (isset($params['print'])) {
+ $print = (bool)$params['print'];
+ } else {
+ $print = empty($counter['assign']);
+ }
+
+ if ($print) {
+ $retval = $counter['count'];
+ } else {
+ $retval = null;
+ }
+
+ if (isset($params['skip'])) {
+ $counter['skip'] = $params['skip'];
+ }
+
+ if (isset($params['direction'])) {
+ $counter['direction'] = $params['direction'];
+ }
+
+ if ($counter['direction'] == "down")
+ $counter['count'] -= $counter['skip'];
+ else
+ $counter['count'] += $counter['skip'];
+
+ return $retval;
+
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.cycle.php b/libs/Smarty/plugins/function.cycle.php
new file mode 100755
index 0000000000..fe78bb87da
--- /dev/null
+++ b/libs/Smarty/plugins/function.cycle.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty {cycle} function plugin
+ *
+ * Type: function<br>
+ * Name: cycle<br>
+ * Date: May 3, 2002<br>
+ * Purpose: cycle through given values<br>
+ * Input:
+ * - name = name of cycle (optional)
+ * - values = comma separated list of values to cycle,
+ * or an array of values to cycle
+ * (this can be left out for subsequent calls)
+ * - reset = boolean - resets given var to true
+ * - print = boolean - print var or not. default is true
+ * - advance = boolean - whether or not to advance the cycle
+ * - delimiter = the value delimiter, default is ","
+ * - assign = boolean, assigns to template var instead of
+ * printed.
+ *
+ * Examples:<br>
+ * <pre>
+ * {cycle values="#eeeeee,#d0d0d0d"}
+ * {cycle name=row values="one,two,three" reset=true}
+ * {cycle name=row}
+ * </pre>
+ * @link http://smarty.php.net/manual/en/language.function.cycle.php {cycle}
+ * (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author credit to Mark Priatel <mpriatel@rogers.com>
+ * @author credit to Gerard <gerard@interfold.com>
+ * @author credit to Jason Sweat <jsweat_php@yahoo.com>
+ * @version 1.3
+ * @param array
+ * @param Smarty
+ * @return string|null
+ */
+function smarty_function_cycle($params, &$smarty)
+{
+ static $cycle_vars;
+
+ $name = (empty($params['name'])) ? 'default' : $params['name'];
+ $print = (isset($params['print'])) ? (bool)$params['print'] : true;
+ $advance = (isset($params['advance'])) ? (bool)$params['advance'] : true;
+ $reset = (isset($params['reset'])) ? (bool)$params['reset'] : false;
+
+ if (!in_array('values', array_keys($params))) {
+ if(!isset($cycle_vars[$name]['values'])) {
+ $smarty->trigger_error("cycle: missing 'values' parameter");
+ return;
+ }
+ } else {
+ if(isset($cycle_vars[$name]['values'])
+ && $cycle_vars[$name]['values'] != $params['values'] ) {
+ $cycle_vars[$name]['index'] = 0;
+ }
+ $cycle_vars[$name]['values'] = $params['values'];
+ }
+
+ $cycle_vars[$name]['delimiter'] = (isset($params['delimiter'])) ? $params['delimiter'] : ',';
+
+ if(is_array($cycle_vars[$name]['values'])) {
+ $cycle_array = $cycle_vars[$name]['values'];
+ } else {
+ $cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']);
+ }
+
+ if(!isset($cycle_vars[$name]['index']) || $reset ) {
+ $cycle_vars[$name]['index'] = 0;
+ }
+
+ if (isset($params['assign'])) {
+ $print = false;
+ $smarty->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]);
+ }
+
+ if($print) {
+ $retval = $cycle_array[$cycle_vars[$name]['index']];
+ } else {
+ $retval = null;
+ }
+
+ if($advance) {
+ if ( $cycle_vars[$name]['index'] >= count($cycle_array) -1 ) {
+ $cycle_vars[$name]['index'] = 0;
+ } else {
+ $cycle_vars[$name]['index']++;
+ }
+ }
+
+ return $retval;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.debug.php b/libs/Smarty/plugins/function.debug.php
new file mode 100755
index 0000000000..43452307bc
--- /dev/null
+++ b/libs/Smarty/plugins/function.debug.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {debug} function plugin
+ *
+ * Type: function<br>
+ * Name: debug<br>
+ * Date: July 1, 2002<br>
+ * Purpose: popup debug window
+ * @link http://smarty.php.net/manual/en/language.function.debug.php {debug}
+ * (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @version 1.0
+ * @param array
+ * @param Smarty
+ * @return string output from {@link Smarty::_generate_debug_output()}
+ */
+function smarty_function_debug($params, &$smarty)
+{
+ if (isset($params['output'])) {
+ $smarty->assign('_smarty_debug_output', $params['output']);
+ }
+ require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
+ return smarty_core_display_debug_console(null, $smarty);
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.eval.php b/libs/Smarty/plugins/function.eval.php
new file mode 100755
index 0000000000..ff0472de25
--- /dev/null
+++ b/libs/Smarty/plugins/function.eval.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {eval} function plugin
+ *
+ * Type: function<br>
+ * Name: eval<br>
+ * Purpose: evaluate a template variable as a template<br>
+ * @link http://smarty.php.net/manual/en/language.function.eval.php {eval}
+ * (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param array
+ * @param Smarty
+ */
+function smarty_function_eval($params, &$smarty)
+{
+
+ if (!isset($params['var'])) {
+ $smarty->trigger_error("eval: missing 'var' parameter");
+ return;
+ }
+
+ if($params['var'] == '') {
+ return;
+ }
+
+ $smarty->_compile_source('evaluated template', $params['var'], $_var_compiled);
+
+ ob_start();
+ $smarty->_eval('?>' . $_var_compiled);
+ $_contents = ob_get_contents();
+ ob_end_clean();
+
+ if (!empty($params['assign'])) {
+ $smarty->assign($params['assign'], $_contents);
+ } else {
+ return $_contents;
+ }
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.fetch.php b/libs/Smarty/plugins/function.fetch.php
new file mode 100755
index 0000000000..81b1bfc6b9
--- /dev/null
+++ b/libs/Smarty/plugins/function.fetch.php
@@ -0,0 +1,221 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {fetch} plugin
+ *
+ * Type: function<br>
+ * Name: fetch<br>
+ * Purpose: fetch file, web or ftp data and display results
+ * @link http://smarty.php.net/manual/en/language.function.fetch.php {fetch}
+ * (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param array
+ * @param Smarty
+ * @return string|null if the assign parameter is passed, Smarty assigns the
+ * result to a template variable
+ */
+function smarty_function_fetch($params, &$smarty)
+{
+ if (empty($params['file'])) {
+ $smarty->_trigger_fatal_error("[plugin] parameter 'file' cannot be empty");
+ return;
+ }
+
+ $content = '';
+ if ($smarty->security && !preg_match('!^(http|ftp)://!i', $params['file'])) {
+ $_params = array('resource_type' => 'file', 'resource_name' => $params['file']);
+ require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
+ if(!smarty_core_is_secure($_params, $smarty)) {
+ $smarty->_trigger_fatal_error('[plugin] (secure mode) fetch \'' . $params['file'] . '\' is not allowed');
+ return;
+ }
+
+ // fetch the file
+ if($fp = @fopen($params['file'],'r')) {
+ while(!feof($fp)) {
+ $content .= fgets ($fp,4096);
+ }
+ fclose($fp);
+ } else {
+ $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] . '\'');
+ return;
+ }
+ } else {
+ // not a local file
+ if(preg_match('!^http://!i',$params['file'])) {
+ // http fetch
+ if($uri_parts = parse_url($params['file'])) {
+ // set defaults
+ $host = $server_name = $uri_parts['host'];
+ $timeout = 30;
+ $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
+ $agent = "Smarty Template Engine ".$smarty->_version;
+ $referer = "";
+ $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/';
+ $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : '';
+ $_is_proxy = false;
+ if(empty($uri_parts['port'])) {
+ $port = 80;
+ } else {
+ $port = $uri_parts['port'];
+ }
+ if(!empty($uri_parts['user'])) {
+ $user = $uri_parts['user'];
+ }
+ if(!empty($uri_parts['pass'])) {
+ $pass = $uri_parts['pass'];
+ }
+ // loop through parameters, setup headers
+ foreach($params as $param_key => $param_value) {
+ switch($param_key) {
+ case "file":
+ case "assign":
+ case "assign_headers":
+ break;
+ case "user":
+ if(!empty($param_value)) {
+ $user = $param_value;
+ }
+ break;
+ case "pass":
+ if(!empty($param_value)) {
+ $pass = $param_value;
+ }
+ break;
+ case "accept":
+ if(!empty($param_value)) {
+ $accept = $param_value;
+ }
+ break;
+ case "header":
+ if(!empty($param_value)) {
+ if(!preg_match('![\w\d-]+: .+!',$param_value)) {
+ $smarty->_trigger_fatal_error("[plugin] invalid header format '".$param_value."'");
+ return;
+ } else {
+ $extra_headers[] = $param_value;
+ }
+ }
+ break;
+ case "proxy_host":
+ if(!empty($param_value)) {
+ $proxy_host = $param_value;
+ }
+ break;
+ case "proxy_port":
+ if(!preg_match('!\D!', $param_value)) {
+ $proxy_port = (int) $param_value;
+ } else {
+ $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'");
+ return;
+ }
+ break;
+ case "agent":
+ if(!empty($param_value)) {
+ $agent = $param_value;
+ }
+ break;
+ case "referer":
+ if(!empty($param_value)) {
+ $referer = $param_value;
+ }
+ break;
+ case "timeout":
+ if(!preg_match('!\D!', $param_value)) {
+ $timeout = (int) $param_value;
+ } else {
+ $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'");
+ return;
+ }
+ break;
+ default:
+ $smarty->_trigger_fatal_error("[plugin] unrecognized attribute '".$param_key."'");
+ return;
+ }
+ }
+ if(!empty($proxy_host) && !empty($proxy_port)) {
+ $_is_proxy = true;
+ $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout);
+ } else {
+ $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout);
+ }
+
+ if(!$fp) {
+ $smarty->_trigger_fatal_error("[plugin] unable to fetch: $errstr ($errno)");
+ return;
+ } else {
+ if($_is_proxy) {
+ fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n");
+ } else {
+ fputs($fp, "GET $uri HTTP/1.0\r\n");
+ }
+ if(!empty($host)) {
+ fputs($fp, "Host: $host\r\n");
+ }
+ if(!empty($accept)) {
+ fputs($fp, "Accept: $accept\r\n");
+ }
+ if(!empty($agent)) {
+ fputs($fp, "User-Agent: $agent\r\n");
+ }
+ if(!empty($referer)) {
+ fputs($fp, "Referer: $referer\r\n");
+ }
+ if(isset($extra_headers) && is_array($extra_headers)) {
+ foreach($extra_headers as $curr_header) {
+ fputs($fp, $curr_header."\r\n");
+ }
+ }
+ if(!empty($user) && !empty($pass)) {
+ fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n");
+ }
+
+ fputs($fp, "\r\n");
+ while(!feof($fp)) {
+ $content .= fgets($fp,4096);
+ }
+ fclose($fp);
+ $csplit = split("\r\n\r\n",$content,2);
+
+ $content = $csplit[1];
+
+ if(!empty($params['assign_headers'])) {
+ $smarty->assign($params['assign_headers'],split("\r\n",$csplit[0]));
+ }
+ }
+ } else {
+ $smarty->_trigger_fatal_error("[plugin] unable to parse URL, check syntax");
+ return;
+ }
+ } else {
+ // ftp fetch
+ if($fp = @fopen($params['file'],'r')) {
+ while(!feof($fp)) {
+ $content .= fgets ($fp,4096);
+ }
+ fclose($fp);
+ } else {
+ $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] .'\'');
+ return;
+ }
+ }
+
+ }
+
+
+ if (!empty($params['assign'])) {
+ $smarty->assign($params['assign'],$content);
+ } else {
+ return $content;
+ }
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.html_checkboxes.php b/libs/Smarty/plugins/function.html_checkboxes.php
new file mode 100755
index 0000000000..ed8ad7f33d
--- /dev/null
+++ b/libs/Smarty/plugins/function.html_checkboxes.php
@@ -0,0 +1,143 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {html_checkboxes} function plugin
+ *
+ * File: function.html_checkboxes.php<br>
+ * Type: function<br>
+ * Name: html_checkboxes<br>
+ * Date: 24.Feb.2003<br>
+ * Purpose: Prints out a list of checkbox input types<br>
+ * Input:<br>
+ * - name (optional) - string default "checkbox"
+ * - values (required) - array
+ * - options (optional) - associative array
+ * - checked (optional) - array default not set
+ * - separator (optional) - ie <br> or &nbsp;
+ * - output (optional) - the output next to each checkbox
+ * - assign (optional) - assign the output as an array to this variable
+ * Examples:
+ * <pre>
+ * {html_checkboxes values=$ids output=$names}
+ * {html_checkboxes values=$ids name='box' separator='<br>' output=$names}
+ * {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names}
+ * </pre>
+ * @link http://smarty.php.net/manual/en/language.function.html.checkboxes.php {html_checkboxes}
+ * (Smarty online manual)
+ * @author Christopher Kvarme <christopher.kvarme@flashjab.com>
+ * @author credits to Monte Ohrt <monte at ohrt dot com>
+ * @version 1.0
+ * @param array
+ * @param Smarty
+ * @return string
+ * @uses smarty_function_escape_special_chars()
+ */
+function smarty_function_html_checkboxes($params, &$smarty)
+{
+ require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
+
+ $name = 'checkbox';
+ $values = null;
+ $options = null;
+ $selected = null;
+ $separator = '';
+ $labels = true;
+ $output = null;
+
+ $extra = '';
+
+ foreach($params as $_key => $_val) {
+ switch($_key) {
+ case 'name':
+ case 'separator':
+ $$_key = $_val;
+ break;
+
+ case 'labels':
+ $$_key = (bool)$_val;
+ break;
+
+ case 'options':
+ $$_key = (array)$_val;
+ break;
+
+ case 'values':
+ case 'output':
+ $$_key = array_values((array)$_val);
+ break;
+
+ case 'checked':
+ case 'selected':
+ $selected = array_map('strval', array_values((array)$_val));
+ break;
+
+ case 'checkboxes':
+ $smarty->trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING);
+ $options = (array)$_val;
+ break;
+
+ case 'assign':
+ break;
+
+ default:
+ if(!is_array($_val)) {
+ $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
+ } else {
+ $smarty->trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+ }
+ break;
+ }
+ }
+
+ if (!isset($options) && !isset($values))
+ return ''; /* raise error here? */
+
+ settype($selected, 'array');
+ $_html_result = array();
+
+ if (isset($options)) {
+
+ foreach ($options as $_key=>$_val)
+ $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels);
+
+
+ } else {
+ foreach ($values as $_i=>$_key) {
+ $_val = isset($output[$_i]) ? $output[$_i] : '';
+ $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels);
+ }
+
+ }
+
+ if(!empty($params['assign'])) {
+ $smarty->assign($params['assign'], $_html_result);
+ } else {
+ return implode("\n",$_html_result);
+ }
+
+}
+
+function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels) {
+ $_output = '';
+ if ($labels) $_output .= '<label>';
+ $_output .= '<input type="checkbox" name="'
+ . smarty_function_escape_special_chars($name) . '[]" value="'
+ . smarty_function_escape_special_chars($value) . '"';
+
+ if (in_array((string)$value, $selected)) {
+ $_output .= ' checked="checked"';
+ }
+ $_output .= $extra . ' />' . $output;
+ if ($labels) $_output .= '</label>';
+ $_output .= $separator;
+
+ return $_output;
+}
+
+?>
diff --git a/libs/Smarty/plugins/function.html_image.php b/libs/Smarty/plugins/function.html_image.php
new file mode 100755
index 0000000000..9abae72ef7
--- /dev/null
+++ b/libs/Smarty/plugins/function.html_image.php
@@ -0,0 +1,142 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {html_image} function plugin
+ *
+ * Type: function<br>
+ * Name: html_image<br>
+ * Date: Feb 24, 2003<br>
+ * Purpose: format HTML tags for the image<br>
+ * Input:<br>
+ * - file = file (and path) of image (required)
+ * - height = image height (optional, default actual height)
+ * - width = image width (optional, default actual width)
+ * - basedir = base directory for absolute paths, default
+ * is environment variable DOCUMENT_ROOT
+ * - path_prefix = prefix for path output (optional, default empty)
+ *
+ * Examples: {html_image file="/images/masthead.gif"}
+ * Output: <img src="/images/masthead.gif" width=400 height=23>
+ * @link http://smarty.php.net/manual/en/language.function.html.image.php {html_image}
+ * (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author credits to Duda <duda@big.hu> - wrote first image function
+ * in repository, helped with lots of functionality
+ * @version 1.0
+ * @param array
+ * @param Smarty
+ * @return string
+ * @uses smarty_function_escape_special_chars()
+ */
+function smarty_function_html_image($params, &$smarty)
+{
+ require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
+
+ $alt = '';
+ $file = '';
+ $height = '';
+ $width = '';
+ $extra = '';
+ $prefix = '';
+ $suffix = '';
+ $path_prefix = '';
+ $server_vars = ($smarty->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
+ $basedir = isset($server_vars['DOCUMENT_ROOT']) ? $server_vars['DOCUMENT_ROOT'] : '';
+ foreach($params as $_key => $_val) {
+ switch($_key) {
+ case 'file':
+ case 'height':
+ case 'width':
+ case 'dpi':
+ case 'path_prefix':
+ case 'basedir':
+ $$_key = $_val;
+ break;
+
+ case 'alt':
+ if(!is_array($_val)) {
+ $$_key = smarty_function_escape_special_chars($_val);
+ } else {
+ $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+ }
+ break;
+
+ case 'link':
+ case 'href':
+ $prefix = '<a href="' . $_val . '">';
+ $suffix = '</a>';
+ break;
+
+ default:
+ if(!is_array($_val)) {
+ $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
+ } else {
+ $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+ }
+ break;
+ }
+ }
+
+ if (empty($file)) {
+ $smarty->trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE);
+ return;
+ }
+
+ if (substr($file,0,1) == '/') {
+ $_image_path = $basedir . $file;
+ } else {
+ $_image_path = $file;
+ }
+
+ if(!isset($params['width']) || !isset($params['height'])) {
+ if(!$_image_data = @getimagesize($_image_path)) {
+ if(!file_exists($_image_path)) {
+ $smarty->trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE);
+ return;
+ } else if(!is_readable($_image_path)) {
+ $smarty->trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE);
+ return;
+ } else {
+ $smarty->trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE);
+ return;
+ }
+ }
+ if ($smarty->security &&
+ ($_params = array('resource_type' => 'file', 'resource_name' => $_image_path)) &&
+ (require_once(SMARTY_CORE_DIR . 'core.is_secure.php')) &&
+ (!smarty_core_is_secure($_params, $smarty)) ) {
+ $smarty->trigger_error("html_image: (secure) '$_image_path' not in secure directory", E_USER_NOTICE);
+ }
+
+ if(!isset($params['width'])) {
+ $width = $_image_data[0];
+ }
+ if(!isset($params['height'])) {
+ $height = $_image_data[1];
+ }
+
+ }
+
+ if(isset($params['dpi'])) {
+ if(strstr($server_vars['HTTP_USER_AGENT'], 'Mac')) {
+ $dpi_default = 72;
+ } else {
+ $dpi_default = 96;
+ }
+ $_resize = $dpi_default/$params['dpi'];
+ $width = round($width * $_resize);
+ $height = round($height * $_resize);
+ }
+
+ return $prefix . '<img src="'.$path_prefix.$file.'" alt="'.$alt.'" width="'.$width.'" height="'.$height.'"'.$extra.' />' . $suffix;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.html_options.php b/libs/Smarty/plugins/function.html_options.php
new file mode 100755
index 0000000000..cebadde479
--- /dev/null
+++ b/libs/Smarty/plugins/function.html_options.php
@@ -0,0 +1,122 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {html_options} function plugin
+ *
+ * Type: function<br>
+ * Name: html_options<br>
+ * Input:<br>
+ * - name (optional) - string default "select"
+ * - values (required if no options supplied) - array
+ * - options (required if no values supplied) - associative array
+ * - selected (optional) - string default not set
+ * - output (required if not options supplied) - array
+ * Purpose: Prints the list of <option> tags generated from
+ * the passed parameters
+ * @link http://smarty.php.net/manual/en/language.function.html.options.php {html_image}
+ * (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param array
+ * @param Smarty
+ * @return string
+ * @uses smarty_function_escape_special_chars()
+ */
+function smarty_function_html_options($params, &$smarty)
+{
+ require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
+
+ $name = null;
+ $values = null;
+ $options = null;
+ $selected = array();
+ $output = null;
+
+ $extra = '';
+
+ foreach($params as $_key => $_val) {
+ switch($_key) {
+ case 'name':
+ $$_key = (string)$_val;
+ break;
+
+ case 'options':
+ $$_key = (array)$_val;
+ break;
+
+ case 'values':
+ case 'output':
+ $$_key = array_values((array)$_val);
+ break;
+
+ case 'selected':
+ $$_key = array_map('strval', array_values((array)$_val));
+ break;
+
+ default:
+ if(!is_array($_val)) {
+ $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
+ } else {
+ $smarty->trigger_error("html_options: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+ }
+ break;
+ }
+ }
+
+ if (!isset($options) && !isset($values))
+ return ''; /* raise error here? */
+
+ $_html_result = '';
+
+ if (isset($options)) {
+
+ foreach ($options as $_key=>$_val)
+ $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected);
+
+ } else {
+
+ foreach ($values as $_i=>$_key) {
+ $_val = isset($output[$_i]) ? $output[$_i] : '';
+ $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected);
+ }
+
+ }
+
+ if(!empty($name)) {
+ $_html_result = '<select name="' . $name . '"' . $extra . '>' . "\n" . $_html_result . '</select>' . "\n";
+ }
+
+ return $_html_result;
+
+}
+
+function smarty_function_html_options_optoutput($key, $value, $selected) {
+ if(!is_array($value)) {
+ $_html_result = '<option label="' . smarty_function_escape_special_chars($value) . '" value="' .
+ smarty_function_escape_special_chars($key) . '"';
+ if (in_array((string)$key, $selected))
+ $_html_result .= ' selected="selected"';
+ $_html_result .= '>' . smarty_function_escape_special_chars($value) . '</option>' . "\n";
+ } else {
+ $_html_result = smarty_function_html_options_optgroup($key, $value, $selected);
+ }
+ return $_html_result;
+}
+
+function smarty_function_html_options_optgroup($key, $values, $selected) {
+ $optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n";
+ foreach ($values as $key => $value) {
+ $optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected);
+ }
+ $optgroup_html .= "</optgroup>\n";
+ return $optgroup_html;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.html_radios.php b/libs/Smarty/plugins/function.html_radios.php
new file mode 100755
index 0000000000..7503cfaca8
--- /dev/null
+++ b/libs/Smarty/plugins/function.html_radios.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {html_radios} function plugin
+ *
+ * File: function.html_radios.php<br>
+ * Type: function<br>
+ * Name: html_radios<br>
+ * Date: 24.Feb.2003<br>
+ * Purpose: Prints out a list of radio input types<br>
+ * Input:<br>
+ * - name (optional) - string default "radio"
+ * - values (required) - array
+ * - options (optional) - associative array
+ * - checked (optional) - array default not set
+ * - separator (optional) - ie <br> or &nbsp;
+ * - output (optional) - the output next to each radio button
+ * - assign (optional) - assign the output as an array to this variable
+ * Examples:
+ * <pre>
+ * {html_radios values=$ids output=$names}
+ * {html_radios values=$ids name='box' separator='<br>' output=$names}
+ * {html_radios values=$ids checked=$checked separator='<br>' output=$names}
+ * </pre>
+ * @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios}
+ * (Smarty online manual)
+ * @author Christopher Kvarme <christopher.kvarme@flashjab.com>
+ * @author credits to Monte Ohrt <monte at ohrt dot com>
+ * @version 1.0
+ * @param array
+ * @param Smarty
+ * @return string
+ * @uses smarty_function_escape_special_chars()
+ */
+function smarty_function_html_radios($params, &$smarty)
+{
+ require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
+
+ $name = 'radio';
+ $values = null;
+ $options = null;
+ $selected = null;
+ $separator = '';
+ $labels = true;
+ $label_ids = false;
+ $output = null;
+ $extra = '';
+
+ foreach($params as $_key => $_val) {
+ switch($_key) {
+ case 'name':
+ case 'separator':
+ $$_key = (string)$_val;
+ break;
+
+ case 'checked':
+ case 'selected':
+ if(is_array($_val)) {
+ $smarty->trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING);
+ } else {
+ $selected = (string)$_val;
+ }
+ break;
+
+ case 'labels':
+ case 'label_ids':
+ $$_key = (bool)$_val;
+ break;
+
+ case 'options':
+ $$_key = (array)$_val;
+ break;
+
+ case 'values':
+ case 'output':
+ $$_key = array_values((array)$_val);
+ break;
+
+ case 'radios':
+ $smarty->trigger_error('html_radios: the use of the "radios" attribute is deprecated, use "options" instead', E_USER_WARNING);
+ $options = (array)$_val;
+ break;
+
+ case 'assign':
+ break;
+
+ default:
+ if(!is_array($_val)) {
+ $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
+ } else {
+ $smarty->trigger_error("html_radios: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+ }
+ break;
+ }
+ }
+
+ if (!isset($options) && !isset($values))
+ return ''; /* raise error here? */
+
+ $_html_result = array();
+
+ if (isset($options)) {
+
+ foreach ($options as $_key=>$_val)
+ $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids);
+
+ } else {
+
+ foreach ($values as $_i=>$_key) {
+ $_val = isset($output[$_i]) ? $output[$_i] : '';
+ $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids);
+ }
+
+ }
+
+ if(!empty($params['assign'])) {
+ $smarty->assign($params['assign'], $_html_result);
+ } else {
+ return implode("\n",$_html_result);
+ }
+
+}
+
+function smarty_function_html_radios_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids) {
+ $_output = '';
+ if ($labels) {
+ if($label_ids) {
+ $_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!', '_', $name . '_' . $value));
+ $_output .= '<label for="' . $_id . '">';
+ } else {
+ $_output .= '<label>';
+ }
+ }
+ $_output .= '<input type="radio" name="'
+ . smarty_function_escape_special_chars($name) . '" value="'
+ . smarty_function_escape_special_chars($value) . '"';
+
+ if ($labels && $label_ids) $_output .= ' id="' . $_id . '"';
+
+ if ((string)$value==$selected) {
+ $_output .= ' checked="checked"';
+ }
+ $_output .= $extra . ' />' . $output;
+ if ($labels) $_output .= '</label>';
+ $_output .= $separator;
+
+ return $_output;
+}
+
+?>
diff --git a/libs/Smarty/plugins/function.html_select_date.php b/libs/Smarty/plugins/function.html_select_date.php
new file mode 100755
index 0000000000..e5eb18307b
--- /dev/null
+++ b/libs/Smarty/plugins/function.html_select_date.php
@@ -0,0 +1,331 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty {html_select_date} plugin
+ *
+ * Type: function<br>
+ * Name: html_select_date<br>
+ * Purpose: Prints the dropdowns for date selection.
+ *
+ * ChangeLog:<br>
+ * - 1.0 initial release
+ * - 1.1 added support for +/- N syntax for begin
+ * and end year values. (Monte)
+ * - 1.2 added support for yyyy-mm-dd syntax for
+ * time value. (Jan Rosier)
+ * - 1.3 added support for choosing format for
+ * month values (Gary Loescher)
+ * - 1.3.1 added support for choosing format for
+ * day values (Marcus Bointon)
+ * - 1.3.2 support negative timestamps, force year
+ * dropdown to include given date unless explicitly set (Monte)
+ * - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that
+ * of 0000-00-00 dates (cybot, boots)
+ * @link http://smarty.php.net/manual/en/language.function.html.select.date.php {html_select_date}
+ * (Smarty online manual)
+ * @version 1.3.4
+ * @author Andrei Zmievski
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param array
+ * @param Smarty
+ * @return string
+ */
+function smarty_function_html_select_date($params, &$smarty)
+{
+ require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
+ require_once $smarty->_get_plugin_filepath('shared','make_timestamp');
+ require_once $smarty->_get_plugin_filepath('function','html_options');
+ /* Default values. */
+ $prefix = "Date_";
+ $start_year = strftime("%Y");
+ $end_year = $start_year;
+ $display_days = true;
+ $display_months = true;
+ $display_years = true;
+ $month_format = "%B";
+ /* Write months as numbers by default GL */
+ $month_value_format = "%m";
+ $day_format = "%02d";
+ /* Write day values using this format MB */
+ $day_value_format = "%d";
+ $year_as_text = false;
+ /* Display years in reverse order? Ie. 2000,1999,.... */
+ $reverse_years = false;
+ /* Should the select boxes be part of an array when returned from PHP?
+ e.g. setting it to "birthday", would create "birthday[Day]",
+ "birthday[Month]" & "birthday[Year]". Can be combined with prefix */
+ $field_array = null;
+ /* <select size>'s of the different <select> tags.
+ If not set, uses default dropdown. */
+ $day_size = null;
+ $month_size = null;
+ $year_size = null;
+ /* Unparsed attributes common to *ALL* the <select>/<input> tags.
+ An example might be in the template: all_extra ='class ="foo"'. */
+ $all_extra = null;
+ /* Separate attributes for the tags. */
+ $day_extra = null;
+ $month_extra = null;
+ $year_extra = null;
+ /* Order in which to display the fields.
+ "D" -> day, "M" -> month, "Y" -> year. */
+ $field_order = 'MDY';
+ /* String printed between the different fields. */
+ $field_separator = "\n";
+ $time = time();
+ $all_empty = null;
+ $day_empty = null;
+ $month_empty = null;
+ $year_empty = null;
+ $extra_attrs = '';
+
+ foreach ($params as $_key=>$_value) {
+ switch ($_key) {
+ case 'prefix':
+ case 'time':
+ case 'start_year':
+ case 'end_year':
+ case 'month_format':
+ case 'day_format':
+ case 'day_value_format':
+ case 'field_array':
+ case 'day_size':
+ case 'month_size':
+ case 'year_size':
+ case 'all_extra':
+ case 'day_extra':
+ case 'month_extra':
+ case 'year_extra':
+ case 'field_order':
+ case 'field_separator':
+ case 'month_value_format':
+ case 'month_empty':
+ case 'day_empty':
+ case 'year_empty':
+ $$_key = (string)$_value;
+ break;
+
+ case 'all_empty':
+ $$_key = (string)$_value;
+ $day_empty = $month_empty = $year_empty = $all_empty;
+ break;
+
+ case 'display_days':
+ case 'display_months':
+ case 'display_years':
+ case 'year_as_text':
+ case 'reverse_years':
+ $$_key = (bool)$_value;
+ break;
+
+ default:
+ if(!is_array($_value)) {
+ $extra_attrs .= ' '.$_key.'="'.smarty_function_escape_special_chars($_value).'"';
+ } else {
+ $smarty->trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+ }
+ break;
+ }
+ }
+
+ if (preg_match('!^-\d+$!', $time)) {
+ // negative timestamp, use date()
+ $time = date('Y-m-d', $time);
+ }
+ // If $time is not in format yyyy-mm-dd
+ if (preg_match('/^(\d{0,4}-\d{0,2}-\d{0,2})/', $time, $found)) {
+ $time = $found[1];
+ } else {
+ // use smarty_make_timestamp to get an unix timestamp and
+ // strftime to make yyyy-mm-dd
+ $time = strftime('%Y-%m-%d', smarty_make_timestamp($time));
+ }
+ // Now split this in pieces, which later can be used to set the select
+ $time = explode("-", $time);
+
+ // make syntax "+N" or "-N" work with start_year and end_year
+ if (preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match)) {
+ if ($match[1] == '+') {
+ $end_year = strftime('%Y') + $match[2];
+ } else {
+ $end_year = strftime('%Y') - $match[2];
+ }
+ }
+ if (preg_match('!^(\+|\-)\s*(\d+)$!', $start_year, $match)) {
+ if ($match[1] == '+') {
+ $start_year = strftime('%Y') + $match[2];
+ } else {
+ $start_year = strftime('%Y') - $match[2];
+ }
+ }
+ if (strlen($time[0]) > 0) {
+ if ($start_year > $time[0] && !isset($params['start_year'])) {
+ // force start year to include given date if not explicitly set
+ $start_year = $time[0];
+ }
+ if($end_year < $time[0] && !isset($params['end_year'])) {
+ // force end year to include given date if not explicitly set
+ $end_year = $time[0];
+ }
+ }
+
+ $field_order = strtoupper($field_order);
+
+ $html_result = $month_result = $day_result = $year_result = "";
+
+ $field_separator_count = -1;
+ if ($display_months) {
+ $field_separator_count++;
+ $month_names = array();
+ $month_values = array();
+ if(isset($month_empty)) {
+ $month_names[''] = $month_empty;
+ $month_values[''] = '';
+ }
+ for ($i = 1; $i <= 12; $i++) {
+ $month_names[$i] = strftime($month_format, mktime(0, 0, 0, $i, 1, 2000));
+ $month_values[$i] = strftime($month_value_format, mktime(0, 0, 0, $i, 1, 2000));
+ }
+
+ $month_result .= '<select name=';
+ if (null !== $field_array){
+ $month_result .= '"' . $field_array . '[' . $prefix . 'Month]"';
+ } else {
+ $month_result .= '"' . $prefix . 'Month"';
+ }
+ if (null !== $month_size){
+ $month_result .= ' size="' . $month_size . '"';
+ }
+ if (null !== $month_extra){
+ $month_result .= ' ' . $month_extra;
+ }
+ if (null !== $all_extra){
+ $month_result .= ' ' . $all_extra;
+ }
+ $month_result .= $extra_attrs . '>'."\n";
+
+ $month_result .= smarty_function_html_options(array('output' => $month_names,
+ 'values' => $month_values,
+ 'selected' => (int)$time[1] ? strftime($month_value_format, mktime(0, 0, 0, (int)$time[1], 1, 2000)) : '',
+ 'print_result' => false),
+ $smarty);
+ $month_result .= '</select>';
+ }
+
+ if ($display_days) {
+ $field_separator_count++;
+ $days = array();
+ if (isset($day_empty)) {
+ $days[''] = $day_empty;
+ $day_values[''] = '';
+ }
+ for ($i = 1; $i <= 31; $i++) {
+ $days[] = sprintf($day_format, $i);
+ $day_values[] = sprintf($day_value_format, $i);
+ }
+
+ $day_result .= '<select name=';
+ if (null !== $field_array){
+ $day_result .= '"' . $field_array . '[' . $prefix . 'Day]"';
+ } else {
+ $day_result .= '"' . $prefix . 'Day"';
+ }
+ if (null !== $day_size){
+ $day_result .= ' size="' . $day_size . '"';
+ }
+ if (null !== $all_extra){
+ $day_result .= ' ' . $all_extra;
+ }
+ if (null !== $day_extra){
+ $day_result .= ' ' . $day_extra;
+ }
+ $day_result .= $extra_attrs . '>'."\n";
+ $day_result .= smarty_function_html_options(array('output' => $days,
+ 'values' => $day_values,
+ 'selected' => $time[2],
+ 'print_result' => false),
+ $smarty);
+ $day_result .= '</select>';
+ }
+
+ if ($display_years) {
+ $field_separator_count++;
+ if (null !== $field_array){
+ $year_name = $field_array . '[' . $prefix . 'Year]';
+ } else {
+ $year_name = $prefix . 'Year';
+ }
+ if ($year_as_text) {
+ $year_result .= '<input type="text" name="' . $year_name . '" value="' . $time[0] . '" size="4" maxlength="4"';
+ if (null !== $all_extra){
+ $year_result .= ' ' . $all_extra;
+ }
+ if (null !== $year_extra){
+ $year_result .= ' ' . $year_extra;
+ }
+ $year_result .= ' />';
+ } else {
+ $years = range((int)$start_year, (int)$end_year);
+ if ($reverse_years) {
+ rsort($years, SORT_NUMERIC);
+ } else {
+ sort($years, SORT_NUMERIC);
+ }
+ $yearvals = $years;
+ if(isset($year_empty)) {
+ array_unshift($years, $year_empty);
+ array_unshift($yearvals, '');
+ }
+ $year_result .= '<select name="' . $year_name . '"';
+ if (null !== $year_size){
+ $year_result .= ' size="' . $year_size . '"';
+ }
+ if (null !== $all_extra){
+ $year_result .= ' ' . $all_extra;
+ }
+ if (null !== $year_extra){
+ $year_result .= ' ' . $year_extra;
+ }
+ $year_result .= $extra_attrs . '>'."\n";
+ $year_result .= smarty_function_html_options(array('output' => $years,
+ 'values' => $yearvals,
+ 'selected' => $time[0],
+ 'print_result' => false),
+ $smarty);
+ $year_result .= '</select>';
+ }
+ }
+
+ // Loop thru the field_order field
+ for ($i = 0; $i <= 2; $i++){
+ $c = substr($field_order, $i, 1);
+ switch ($c){
+ case 'D':
+ $html_result .= $day_result;
+ break;
+
+ case 'M':
+ $html_result .= $month_result;
+ break;
+
+ case 'Y':
+ $html_result .= $year_result;
+ break;
+ }
+ // Add the field seperator
+ if($i < $field_separator_count) {
+ $html_result .= $field_separator;
+ }
+ }
+
+ return $html_result;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.html_select_time.php b/libs/Smarty/plugins/function.html_select_time.php
new file mode 100755
index 0000000000..2e5be7efe3
--- /dev/null
+++ b/libs/Smarty/plugins/function.html_select_time.php
@@ -0,0 +1,194 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {html_select_time} function plugin
+ *
+ * Type: function<br>
+ * Name: html_select_time<br>
+ * Purpose: Prints the dropdowns for time selection
+ * @link http://smarty.php.net/manual/en/language.function.html.select.time.php {html_select_time}
+ * (Smarty online manual)
+ * @author Roberto Berto <roberto@berto.net>
+ * @credits Monte Ohrt <monte AT ohrt DOT com>
+ * @param array
+ * @param Smarty
+ * @return string
+ * @uses smarty_make_timestamp()
+ */
+function smarty_function_html_select_time($params, &$smarty)
+{
+ require_once $smarty->_get_plugin_filepath('shared','make_timestamp');
+ require_once $smarty->_get_plugin_filepath('function','html_options');
+ /* Default values. */
+ $prefix = "Time_";
+ $time = time();
+ $display_hours = true;
+ $display_minutes = true;
+ $display_seconds = true;
+ $display_meridian = true;
+ $use_24_hours = true;
+ $minute_interval = 1;
+ $second_interval = 1;
+ /* Should the select boxes be part of an array when returned from PHP?
+ e.g. setting it to "birthday", would create "birthday[Hour]",
+ "birthday[Minute]", "birthday[Seconds]" & "birthday[Meridian]".
+ Can be combined with prefix. */
+ $field_array = null;
+ $all_extra = null;
+ $hour_extra = null;
+ $minute_extra = null;
+ $second_extra = null;
+ $meridian_extra = null;
+
+ foreach ($params as $_key=>$_value) {
+ switch ($_key) {
+ case 'prefix':
+ case 'time':
+ case 'field_array':
+ case 'all_extra':
+ case 'hour_extra':
+ case 'minute_extra':
+ case 'second_extra':
+ case 'meridian_extra':
+ $$_key = (string)$_value;
+ break;
+
+ case 'display_hours':
+ case 'display_minutes':
+ case 'display_seconds':
+ case 'display_meridian':
+ case 'use_24_hours':
+ $$_key = (bool)$_value;
+ break;
+
+ case 'minute_interval':
+ case 'second_interval':
+ $$_key = (int)$_value;
+ break;
+
+ default:
+ $smarty->trigger_error("[html_select_time] unknown parameter $_key", E_USER_WARNING);
+ }
+ }
+
+ $time = smarty_make_timestamp($time);
+
+ $html_result = '';
+
+ if ($display_hours) {
+ $hours = $use_24_hours ? range(0, 23) : range(1, 12);
+ $hour_fmt = $use_24_hours ? '%H' : '%I';
+ for ($i = 0, $for_max = count($hours); $i < $for_max; $i++)
+ $hours[$i] = sprintf('%02d', $hours[$i]);
+ $html_result .= '<select name=';
+ if (null !== $field_array) {
+ $html_result .= '"' . $field_array . '[' . $prefix . 'Hour]"';
+ } else {
+ $html_result .= '"' . $prefix . 'Hour"';
+ }
+ if (null !== $hour_extra){
+ $html_result .= ' ' . $hour_extra;
+ }
+ if (null !== $all_extra){
+ $html_result .= ' ' . $all_extra;
+ }
+ $html_result .= '>'."\n";
+ $html_result .= smarty_function_html_options(array('output' => $hours,
+ 'values' => $hours,
+ 'selected' => strftime($hour_fmt, $time),
+ 'print_result' => false),
+ $smarty);
+ $html_result .= "</select>\n";
+ }
+
+ if ($display_minutes) {
+ $all_minutes = range(0, 59);
+ for ($i = 0, $for_max = count($all_minutes); $i < $for_max; $i+= $minute_interval)
+ $minutes[] = sprintf('%02d', $all_minutes[$i]);
+ $selected = intval(floor(strftime('%M', $time) / $minute_interval) * $minute_interval);
+ $html_result .= '<select name=';
+ if (null !== $field_array) {
+ $html_result .= '"' . $field_array . '[' . $prefix . 'Minute]"';
+ } else {
+ $html_result .= '"' . $prefix . 'Minute"';
+ }
+ if (null !== $minute_extra){
+ $html_result .= ' ' . $minute_extra;
+ }
+ if (null !== $all_extra){
+ $html_result .= ' ' . $all_extra;
+ }
+ $html_result .= '>'."\n";
+
+ $html_result .= smarty_function_html_options(array('output' => $minutes,
+ 'values' => $minutes,
+ 'selected' => $selected,
+ 'print_result' => false),
+ $smarty);
+ $html_result .= "</select>\n";
+ }
+
+ if ($display_seconds) {
+ $all_seconds = range(0, 59);
+ for ($i = 0, $for_max = count($all_seconds); $i < $for_max; $i+= $second_interval)
+ $seconds[] = sprintf('%02d', $all_seconds[$i]);
+ $selected = intval(floor(strftime('%S', $time) / $second_interval) * $second_interval);
+ $html_result .= '<select name=';
+ if (null !== $field_array) {
+ $html_result .= '"' . $field_array . '[' . $prefix . 'Second]"';
+ } else {
+ $html_result .= '"' . $prefix . 'Second"';
+ }
+
+ if (null !== $second_extra){
+ $html_result .= ' ' . $second_extra;
+ }
+ if (null !== $all_extra){
+ $html_result .= ' ' . $all_extra;
+ }
+ $html_result .= '>'."\n";
+
+ $html_result .= smarty_function_html_options(array('output' => $seconds,
+ 'values' => $seconds,
+ 'selected' => $selected,
+ 'print_result' => false),
+ $smarty);
+ $html_result .= "</select>\n";
+ }
+
+ if ($display_meridian && !$use_24_hours) {
+ $html_result .= '<select name=';
+ if (null !== $field_array) {
+ $html_result .= '"' . $field_array . '[' . $prefix . 'Meridian]"';
+ } else {
+ $html_result .= '"' . $prefix . 'Meridian"';
+ }
+
+ if (null !== $meridian_extra){
+ $html_result .= ' ' . $meridian_extra;
+ }
+ if (null !== $all_extra){
+ $html_result .= ' ' . $all_extra;
+ }
+ $html_result .= '>'."\n";
+
+ $html_result .= smarty_function_html_options(array('output' => array('AM', 'PM'),
+ 'values' => array('am', 'pm'),
+ 'selected' => strtolower(strftime('%p', $time)),
+ 'print_result' => false),
+ $smarty);
+ $html_result .= "</select>\n";
+ }
+
+ return $html_result;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.html_table.php b/libs/Smarty/plugins/function.html_table.php
new file mode 100755
index 0000000000..32aeba83c9
--- /dev/null
+++ b/libs/Smarty/plugins/function.html_table.php
@@ -0,0 +1,177 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {html_table} function plugin
+ *
+ * Type: function<br>
+ * Name: html_table<br>
+ * Date: Feb 17, 2003<br>
+ * Purpose: make an html table from an array of data<br>
+ * Input:<br>
+ * - loop = array to loop through
+ * - cols = number of columns, comma separated list of column names
+ * or array of column names
+ * - rows = number of rows
+ * - table_attr = table attributes
+ * - th_attr = table heading attributes (arrays are cycled)
+ * - tr_attr = table row attributes (arrays are cycled)
+ * - td_attr = table cell attributes (arrays are cycled)
+ * - trailpad = value to pad trailing cells with
+ * - caption = text for caption element
+ * - vdir = vertical direction (default: "down", means top-to-bottom)
+ * - hdir = horizontal direction (default: "right", means left-to-right)
+ * - inner = inner loop (default "cols": print $loop line by line,
+ * $loop will be printed column by column otherwise)
+ *
+ *
+ * Examples:
+ * <pre>
+ * {table loop=$data}
+ * {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
+ * {table loop=$data cols="first,second,third" tr_attr=$colors}
+ * </pre>
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author credit to Messju Mohr <messju at lammfellpuschen dot de>
+ * @author credit to boots <boots dot smarty at yahoo dot com>
+ * @version 1.1
+ * @link http://smarty.php.net/manual/en/language.function.html.table.php {html_table}
+ * (Smarty online manual)
+ * @param array
+ * @param Smarty
+ * @return string
+ */
+function smarty_function_html_table($params, &$smarty)
+{
+ $table_attr = 'border="1"';
+ $tr_attr = '';
+ $th_attr = '';
+ $td_attr = '';
+ $cols = $cols_count = 3;
+ $rows = 3;
+ $trailpad = '&nbsp;';
+ $vdir = 'down';
+ $hdir = 'right';
+ $inner = 'cols';
+ $caption = '';
+
+ if (!isset($params['loop'])) {
+ $smarty->trigger_error("html_table: missing 'loop' parameter");
+ return;
+ }
+
+ foreach ($params as $_key=>$_value) {
+ switch ($_key) {
+ case 'loop':
+ $$_key = (array)$_value;
+ break;
+
+ case 'cols':
+ if (is_array($_value) && !empty($_value)) {
+ $cols = $_value;
+ $cols_count = count($_value);
+ } elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) {
+ $cols = explode(',', $_value);
+ $cols_count = count($cols);
+ } elseif (!empty($_value)) {
+ $cols_count = (int)$_value;
+ } else {
+ $cols_count = $cols;
+ }
+ break;
+
+ case 'rows':
+ $$_key = (int)$_value;
+ break;
+
+ case 'table_attr':
+ case 'trailpad':
+ case 'hdir':
+ case 'vdir':
+ case 'inner':
+ case 'caption':
+ $$_key = (string)$_value;
+ break;
+
+ case 'tr_attr':
+ case 'td_attr':
+ case 'th_attr':
+ $$_key = $_value;
+ break;
+ }
+ }
+
+ $loop_count = count($loop);
+ if (empty($params['rows'])) {
+ /* no rows specified */
+ $rows = ceil($loop_count/$cols_count);
+ } elseif (empty($params['cols'])) {
+ if (!empty($params['rows'])) {
+ /* no cols specified, but rows */
+ $cols_count = ceil($loop_count/$rows);
+ }
+ }
+
+ $output = "<table $table_attr>\n";
+
+ if (!empty($caption)) {
+ $output .= '<caption>' . $caption . "</caption>\n";
+ }
+
+ if (is_array($cols)) {
+ $cols = ($hdir == 'right') ? $cols : array_reverse($cols);
+ $output .= "<thead><tr>\n";
+
+ for ($r=0; $r<$cols_count; $r++) {
+ $output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>';
+ $output .= $cols[$r];
+ $output .= "</th>\n";
+ }
+ $output .= "</tr></thead>\n";
+ }
+
+ $output .= "<tbody>\n";
+ for ($r=0; $r<$rows; $r++) {
+ $output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n";
+ $rx = ($vdir == 'down') ? $r*$cols_count : ($rows-1-$r)*$cols_count;
+
+ for ($c=0; $c<$cols_count; $c++) {
+ $x = ($hdir == 'right') ? $rx+$c : $rx+$cols_count-1-$c;
+ if ($inner!='cols') {
+ /* shuffle x to loop over rows*/
+ $x = floor($x/$cols_count) + ($x%$cols_count)*$rows;
+ }
+
+ if ($x<$loop_count) {
+ $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[$x] . "</td>\n";
+ } else {
+ $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n";
+ }
+ }
+ $output .= "</tr>\n";
+ }
+ $output .= "</tbody>\n";
+ $output .= "</table>\n";
+
+ return $output;
+}
+
+function smarty_function_html_table_cycle($name, $var, $no) {
+ if(!is_array($var)) {
+ $ret = $var;
+ } else {
+ $ret = $var[$no % count($var)];
+ }
+
+ return ($ret) ? ' '.$ret : '';
+}
+
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.mailto.php b/libs/Smarty/plugins/function.mailto.php
new file mode 100755
index 0000000000..20e9ed9849
--- /dev/null
+++ b/libs/Smarty/plugins/function.mailto.php
@@ -0,0 +1,165 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {mailto} function plugin
+ *
+ * Type: function<br>
+ * Name: mailto<br>
+ * Date: May 21, 2002
+ * Purpose: automate mailto address link creation, and optionally
+ * encode them.<br>
+ * Input:<br>
+ * - address = e-mail address
+ * - text = (optional) text to display, default is address
+ * - encode = (optional) can be one of:
+ * * none : no encoding (default)
+ * * javascript : encode with javascript
+ * * javascript_charcode : encode with javascript charcode
+ * * hex : encode with hexidecimal (no javascript)
+ * - cc = (optional) address(es) to carbon copy
+ * - bcc = (optional) address(es) to blind carbon copy
+ * - subject = (optional) e-mail subject
+ * - newsgroups = (optional) newsgroup(s) to post to
+ * - followupto = (optional) address(es) to follow up to
+ * - extra = (optional) extra tags for the href link
+ *
+ * Examples:
+ * <pre>
+ * {mailto address="me@domain.com"}
+ * {mailto address="me@domain.com" encode="javascript"}
+ * {mailto address="me@domain.com" encode="hex"}
+ * {mailto address="me@domain.com" subject="Hello to you!"}
+ * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
+ * {mailto address="me@domain.com" extra='class="mailto"'}
+ * </pre>
+ * @link http://smarty.php.net/manual/en/language.function.mailto.php {mailto}
+ * (Smarty online manual)
+ * @version 1.2
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author credits to Jason Sweat (added cc, bcc and subject functionality)
+ * @param array
+ * @param Smarty
+ * @return string
+ */
+function smarty_function_mailto($params, &$smarty)
+{
+ $extra = '';
+
+ if (empty($params['address'])) {
+ $smarty->trigger_error("mailto: missing 'address' parameter");
+ return;
+ } else {
+ $address = $params['address'];
+ }
+
+ $text = $address;
+
+ // netscape and mozilla do not decode %40 (@) in BCC field (bug?)
+ // so, don't encode it.
+ $search = array('%40', '%2C');
+ $replace = array('@', ',');
+ $mail_parms = array();
+ foreach ($params as $var=>$value) {
+ switch ($var) {
+ case 'cc':
+ case 'bcc':
+ case 'followupto':
+ if (!empty($value))
+ $mail_parms[] = $var.'='.str_replace($search,$replace,rawurlencode($value));
+ break;
+
+ case 'subject':
+ case 'newsgroups':
+ $mail_parms[] = $var.'='.rawurlencode($value);
+ break;
+
+ case 'extra':
+ case 'text':
+ $$var = $value;
+
+ default:
+ }
+ }
+
+ $mail_parm_vals = '';
+ for ($i=0; $i<count($mail_parms); $i++) {
+ $mail_parm_vals .= (0==$i) ? '?' : '&';
+ $mail_parm_vals .= $mail_parms[$i];
+ }
+ $address .= $mail_parm_vals;
+
+ $encode = (empty($params['encode'])) ? 'none' : $params['encode'];
+ if (!in_array($encode,array('javascript','javascript_charcode','hex','none')) ) {
+ $smarty->trigger_error("mailto: 'encode' parameter must be none, javascript or hex");
+ return;
+ }
+
+ if ($encode == 'javascript' ) {
+ $string = 'document.write(\'<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>\');';
+
+ $js_encode = '';
+ for ($x=0; $x < strlen($string); $x++) {
+ $js_encode .= '%' . bin2hex($string[$x]);
+ }
+
+ return '<script type="text/javascript">eval(unescape(\''.$js_encode.'\'))</script>';
+
+ } elseif ($encode == 'javascript_charcode' ) {
+ $string = '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
+
+ for($x = 0, $y = strlen($string); $x < $y; $x++ ) {
+ $ord[] = ord($string[$x]);
+ }
+
+ $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n";
+ $_ret .= "<!--\n";
+ $_ret .= "{document.write(String.fromCharCode(";
+ $_ret .= implode(',',$ord);
+ $_ret .= "))";
+ $_ret .= "}\n";
+ $_ret .= "//-->\n";
+ $_ret .= "</script>\n";
+
+ return $_ret;
+
+
+ } elseif ($encode == 'hex') {
+
+ preg_match('!^(.*)(\?.*)$!',$address,$match);
+ if(!empty($match[2])) {
+ $smarty->trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.");
+ return;
+ }
+ $address_encode = '';
+ for ($x=0; $x < strlen($address); $x++) {
+ if(preg_match('!\w!',$address[$x])) {
+ $address_encode .= '%' . bin2hex($address[$x]);
+ } else {
+ $address_encode .= $address[$x];
+ }
+ }
+ $text_encode = '';
+ for ($x=0; $x < strlen($text); $x++) {
+ $text_encode .= '&#x' . bin2hex($text[$x]).';';
+ }
+
+ $mailto = "&#109;&#97;&#105;&#108;&#116;&#111;&#58;";
+ return '<a href="'.$mailto.$address_encode.'" '.$extra.'>'.$text_encode.'</a>';
+
+ } else {
+ // no encoding
+ return '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
+
+ }
+
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.math.php b/libs/Smarty/plugins/function.math.php
new file mode 100755
index 0000000000..71672fea41
--- /dev/null
+++ b/libs/Smarty/plugins/function.math.php
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {math} function plugin
+ *
+ * Type: function<br>
+ * Name: math<br>
+ * Purpose: handle math computations in template<br>
+ * @link http://smarty.php.net/manual/en/language.function.math.php {math}
+ * (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param array
+ * @param Smarty
+ * @return string
+ */
+function smarty_function_math($params, &$smarty)
+{
+ // be sure equation parameter is present
+ if (empty($params['equation'])) {
+ $smarty->trigger_error("math: missing equation parameter");
+ return;
+ }
+
+ $equation = $params['equation'];
+
+ // make sure parenthesis are balanced
+ if (substr_count($equation,"(") != substr_count($equation,")")) {
+ $smarty->trigger_error("math: unbalanced parenthesis");
+ return;
+ }
+
+ // match all vars in equation, make sure all are passed
+ preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]+)!",$equation, $match);
+ $allowed_funcs = array('int','abs','ceil','cos','exp','floor','log','log10',
+ 'max','min','pi','pow','rand','round','sin','sqrt','srand','tan');
+
+ foreach($match[1] as $curr_var) {
+ if ($curr_var && !in_array($curr_var, array_keys($params)) && !in_array($curr_var, $allowed_funcs)) {
+ $smarty->trigger_error("math: function call $curr_var not allowed");
+ return;
+ }
+ }
+
+ foreach($params as $key => $val) {
+ if ($key != "equation" && $key != "format" && $key != "assign") {
+ // make sure value is not empty
+ if (strlen($val)==0) {
+ $smarty->trigger_error("math: parameter $key is empty");
+ return;
+ }
+ if (!is_numeric($val)) {
+ $smarty->trigger_error("math: parameter $key: is not numeric");
+ return;
+ }
+ $equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation);
+ }
+ }
+
+ eval("\$smarty_math_result = ".$equation.";");
+
+ if (empty($params['format'])) {
+ if (empty($params['assign'])) {
+ return $smarty_math_result;
+ } else {
+ $smarty->assign($params['assign'],$smarty_math_result);
+ }
+ } else {
+ if (empty($params['assign'])){
+ printf($params['format'],$smarty_math_result);
+ } else {
+ $smarty->assign($params['assign'],sprintf($params['format'],$smarty_math_result));
+ }
+ }
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.popup.php b/libs/Smarty/plugins/function.popup.php
new file mode 100755
index 0000000000..3a76b785a4
--- /dev/null
+++ b/libs/Smarty/plugins/function.popup.php
@@ -0,0 +1,119 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {popup} function plugin
+ *
+ * Type: function<br>
+ * Name: popup<br>
+ * Purpose: make text pop up in windows via overlib
+ * @link http://smarty.php.net/manual/en/language.function.popup.php {popup}
+ * (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param array
+ * @param Smarty
+ * @return string
+ */
+function smarty_function_popup($params, &$smarty)
+{
+ $append = '';
+ foreach ($params as $_key=>$_value) {
+ switch ($_key) {
+ case 'text':
+ case 'trigger':
+ case 'function':
+ case 'inarray':
+ $$_key = (string)$_value;
+ if ($_key == 'function' || $_key == 'inarray')
+ $append .= ',' . strtoupper($_key) . ",'$_value'";
+ break;
+
+ case 'caption':
+ case 'closetext':
+ case 'status':
+ $append .= ',' . strtoupper($_key) . ",'" . str_replace("'","\'",$_value) . "'";
+ break;
+
+ case 'fgcolor':
+ case 'bgcolor':
+ case 'textcolor':
+ case 'capcolor':
+ case 'closecolor':
+ case 'textfont':
+ case 'captionfont':
+ case 'closefont':
+ case 'fgbackground':
+ case 'bgbackground':
+ case 'caparray':
+ case 'capicon':
+ case 'background':
+ case 'frame':
+ $append .= ',' . strtoupper($_key) . ",'$_value'";
+ break;
+
+ case 'textsize':
+ case 'captionsize':
+ case 'closesize':
+ case 'width':
+ case 'height':
+ case 'border':
+ case 'offsetx':
+ case 'offsety':
+ case 'snapx':
+ case 'snapy':
+ case 'fixx':
+ case 'fixy':
+ case 'padx':
+ case 'pady':
+ case 'timeout':
+ case 'delay':
+ $append .= ',' . strtoupper($_key) . ",$_value";
+ break;
+
+ case 'sticky':
+ case 'left':
+ case 'right':
+ case 'center':
+ case 'above':
+ case 'below':
+ case 'noclose':
+ case 'autostatus':
+ case 'autostatuscap':
+ case 'fullhtml':
+ case 'hauto':
+ case 'vauto':
+ case 'mouseoff':
+ case 'followmouse':
+ case 'closeclick':
+ if ($_value) $append .= ',' . strtoupper($_key);
+ break;
+
+ default:
+ $smarty->trigger_error("[popup] unknown parameter $_key", E_USER_WARNING);
+ }
+ }
+
+ if (empty($text) && !isset($inarray) && empty($function)) {
+ $smarty->trigger_error("overlib: attribute 'text' or 'inarray' or 'function' required");
+ return false;
+ }
+
+ if (empty($trigger)) { $trigger = "onmouseover"; }
+
+ $retval = $trigger . '="return overlib(\''.preg_replace(array("!'!","![\r\n]!"),array("\'",'\r'),$text).'\'';
+ $retval .= $append . ');"';
+ if ($trigger == 'onmouseover')
+ $retval .= ' onmouseout="nd();"';
+
+
+ return $retval;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/function.popup_init.php b/libs/Smarty/plugins/function.popup_init.php
new file mode 100755
index 0000000000..93cb45450c
--- /dev/null
+++ b/libs/Smarty/plugins/function.popup_init.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {popup_init} function plugin
+ *
+ * Type: function<br>
+ * Name: popup_init<br>
+ * Purpose: initialize overlib
+ * @link http://smarty.php.net/manual/en/language.function.popup.init.php {popup_init}
+ * (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param array
+ * @param Smarty
+ * @return string
+ */
+function smarty_function_popup_init($params, &$smarty)
+{
+ $zindex = 1000;
+
+ if (!empty($params['zindex'])) {
+ $zindex = $params['zindex'];
+ }
+
+ if (!empty($params['src'])) {
+ return '<div id="overDiv" style="position:absolute; visibility:hidden; z-index:'.$zindex.';"></div>' . "\n"
+ . '<script type="text/javascript" language="JavaScript" src="'.$params['src'].'"></script>' . "\n";
+ } else {
+ $smarty->trigger_error("popup_init: missing src parameter");
+ }
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.capitalize.php b/libs/Smarty/plugins/modifier.capitalize.php
new file mode 100755
index 0000000000..4a611d9f0f
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.capitalize.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty capitalize modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: capitalize<br>
+ * Purpose: capitalize words in the string
+ * @link http://smarty.php.net/manual/en/language.modifiers.php#LANGUAGE.MODIFIER.CAPITALIZE
+ * capitalize (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return string
+ */
+function smarty_modifier_capitalize($string, $uc_digits = false)
+{
+ smarty_modifier_capitalize_ucfirst(null, $uc_digits);
+ return preg_replace_callback('!\'?\b\w(\w|\')*\b!', 'smarty_modifier_capitalize_ucfirst', $string);
+}
+
+function smarty_modifier_capitalize_ucfirst($string, $uc_digits = null)
+{
+ static $_uc_digits = false;
+
+ if(isset($uc_digits)) {
+ $_uc_digits = $uc_digits;
+ return;
+ }
+
+ if(substr($string[0],0,1) != "'" && !preg_match("!\d!",$string[0]) || $_uc_digits)
+ return ucfirst($string[0]);
+ else
+ return $string[0];
+}
+
+
+?>
diff --git a/libs/Smarty/plugins/modifier.cat.php b/libs/Smarty/plugins/modifier.cat.php
new file mode 100755
index 0000000000..2e37940d43
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.cat.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty cat modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: cat<br>
+ * Date: Feb 24, 2003
+ * Purpose: catenate a value to a variable
+ * Input: string to catenate
+ * Example: {$var|cat:"foo"}
+ * @link http://smarty.php.net/manual/en/language.modifier.cat.php cat
+ * (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @version 1.0
+ * @param string
+ * @param string
+ * @return string
+ */
+function smarty_modifier_cat($string, $cat)
+{
+ return $string . $cat;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.count_characters.php b/libs/Smarty/plugins/modifier.count_characters.php
new file mode 100755
index 0000000000..5ed9a87cd1
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.count_characters.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty count_characters modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: count_characteres<br>
+ * Purpose: count the number of characters in a text
+ * @link http://smarty.php.net/manual/en/language.modifier.count.characters.php
+ * count_characters (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param boolean include whitespace in the character count
+ * @return integer
+ */
+function smarty_modifier_count_characters($string, $include_spaces = false)
+{
+ if ($include_spaces)
+ return(strlen($string));
+
+ return preg_match_all("/[^\s]/",$string, $match);
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.count_paragraphs.php b/libs/Smarty/plugins/modifier.count_paragraphs.php
new file mode 100755
index 0000000000..e0e274da77
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.count_paragraphs.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty count_paragraphs modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: count_paragraphs<br>
+ * Purpose: count the number of paragraphs in a text
+ * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
+ * count_paragraphs (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return integer
+ */
+function smarty_modifier_count_paragraphs($string)
+{
+ // count \r or \n characters
+ return count(preg_split('/[\r\n]+/', $string));
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.count_sentences.php b/libs/Smarty/plugins/modifier.count_sentences.php
new file mode 100755
index 0000000000..f66ea1703d
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.count_sentences.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty count_sentences modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: count_sentences
+ * Purpose: count the number of sentences in a text
+ * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
+ * count_sentences (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return integer
+ */
+function smarty_modifier_count_sentences($string)
+{
+ // find periods with a word before but not after.
+ return preg_match_all('/[^\s]\.(?!\w)/', $string, $match);
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.count_words.php b/libs/Smarty/plugins/modifier.count_words.php
new file mode 100755
index 0000000000..9d339f5422
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.count_words.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty count_words modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: count_words<br>
+ * Purpose: count the number of words in a text
+ * @link http://smarty.php.net/manual/en/language.modifier.count.words.php
+ * count_words (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return integer
+ */
+function smarty_modifier_count_words($string)
+{
+ // split text by ' ',\r,\n,\f,\t
+ $split_array = preg_split('/\s+/',$string);
+ // count matches that contain alphanumerics
+ $word_count = preg_grep('/[a-zA-Z0-9\\x80-\\xff]/', $split_array);
+
+ return count($word_count);
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.date_format.php b/libs/Smarty/plugins/modifier.date_format.php
new file mode 100755
index 0000000000..8cf7d5e14e
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.date_format.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Include the {@link shared.make_timestamp.php} plugin
+ */
+require_once $smarty->_get_plugin_filepath('shared', 'make_timestamp');
+/**
+ * Smarty date_format modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: date_format<br>
+ * Purpose: format datestamps via strftime<br>
+ * Input:<br>
+ * - string: input date string
+ * - format: strftime format for output
+ * - default_date: default date if $string is empty
+ * @link http://smarty.php.net/manual/en/language.modifier.date.format.php
+ * date_format (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param string
+ * @param string
+ * @return string|void
+ * @uses smarty_make_timestamp()
+ */
+function smarty_modifier_date_format($string, $format = '%b %e, %Y', $default_date = '')
+{
+ if ($string != '') {
+ $timestamp = smarty_make_timestamp($string);
+ } elseif ($default_date != '') {
+ $timestamp = smarty_make_timestamp($default_date);
+ } else {
+ return;
+ }
+ if (DIRECTORY_SEPARATOR == '\\') {
+ $_win_from = array('%D', '%h', '%n', '%r', '%R', '%t', '%T');
+ $_win_to = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S');
+ if (strpos($format, '%e') !== false) {
+ $_win_from[] = '%e';
+ $_win_to[] = sprintf('%\' 2d', date('j', $timestamp));
+ }
+ if (strpos($format, '%l') !== false) {
+ $_win_from[] = '%l';
+ $_win_to[] = sprintf('%\' 2d', date('h', $timestamp));
+ }
+ $format = str_replace($_win_from, $_win_to, $format);
+ }
+ return strftime($format, $timestamp);
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.debug_print_var.php b/libs/Smarty/plugins/modifier.debug_print_var.php
new file mode 100755
index 0000000000..e4f7bc0ccf
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.debug_print_var.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty debug_print_var modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: debug_print_var<br>
+ * Purpose: formats variable contents for display in the console
+ * @link http://smarty.php.net/manual/en/language.modifier.debug.print.var.php
+ * debug_print_var (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param array|object
+ * @param integer
+ * @param integer
+ * @return string
+ */
+function smarty_modifier_debug_print_var($var, $depth = 0, $length = 40)
+{
+ $_replace = array(
+ "\n" => '<i>\n</i>',
+ "\r" => '<i>\r</i>',
+ "\t" => '<i>\t</i>'
+ );
+
+ switch (gettype($var)) {
+ case 'array' :
+ $results = '<b>Array (' . count($var) . ')</b>';
+ foreach ($var as $curr_key => $curr_val) {
+ $results .= '<br>' . str_repeat('&nbsp;', $depth * 2)
+ . '<b>' . strtr($curr_key, $_replace) . '</b> =&gt; '
+ . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
+ $depth--;
+ }
+ break;
+ case 'object' :
+ $object_vars = get_object_vars($var);
+ $results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>';
+ foreach ($object_vars as $curr_key => $curr_val) {
+ $results .= '<br>' . str_repeat('&nbsp;', $depth * 2)
+ . '<b> -&gt;' . strtr($curr_key, $_replace) . '</b> = '
+ . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
+ $depth--;
+ }
+ break;
+ case 'boolean' :
+ case 'NULL' :
+ case 'resource' :
+ if (true === $var) {
+ $results = 'true';
+ } elseif (false === $var) {
+ $results = 'false';
+ } elseif (null === $var) {
+ $results = 'null';
+ } else {
+ $results = htmlspecialchars((string) $var);
+ }
+ $results = '<i>' . $results . '</i>';
+ break;
+ case 'integer' :
+ case 'float' :
+ $results = htmlspecialchars((string) $var);
+ break;
+ case 'string' :
+ $results = strtr($var, $_replace);
+ if (strlen($var) > $length ) {
+ $results = substr($var, 0, $length - 3) . '...';
+ }
+ $results = htmlspecialchars('"' . $results . '"');
+ break;
+ case 'unknown type' :
+ default :
+ $results = strtr((string) $var, $_replace);
+ if (strlen($results) > $length ) {
+ $results = substr($results, 0, $length - 3) . '...';
+ }
+ $results = htmlspecialchars($results);
+ }
+
+ return $results;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.default.php b/libs/Smarty/plugins/modifier.default.php
new file mode 100755
index 0000000000..70011fd6b5
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.default.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty default modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: default<br>
+ * Purpose: designate default value for empty variables
+ * @link http://smarty.php.net/manual/en/language.modifier.default.php
+ * default (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param string
+ * @return string
+ */
+function smarty_modifier_default($string, $default = '')
+{
+ if (!isset($string) || $string === '')
+ return $default;
+ else
+ return $string;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.escape.php b/libs/Smarty/plugins/modifier.escape.php
new file mode 100755
index 0000000000..a2f52b232c
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.escape.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty escape modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: escape<br>
+ * Purpose: Escape the string according to escapement type
+ * @link http://smarty.php.net/manual/en/language.modifier.escape.php
+ * escape (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param html|htmlall|url|quotes|hex|hexentity|javascript
+ * @return string
+ */
+function smarty_modifier_escape($string, $esc_type = 'html', $char_set = 'ISO-8859-1')
+{
+ switch ($esc_type) {
+ case 'html':
+ return htmlspecialchars($string, ENT_QUOTES, $char_set);
+
+ case 'htmlall':
+ return htmlentities($string, ENT_QUOTES, $char_set);
+
+ case 'url':
+ return rawurlencode($string);
+
+ case 'urlpathinfo':
+ return str_replace('%2F','/',rawurlencode($string));
+
+ case 'quotes':
+ // escape unescaped single quotes
+ return preg_replace("%(?<!\\\\)'%", "\\'", $string);
+
+ case 'hex':
+ // escape every character into hex
+ $return = '';
+ for ($x=0; $x < strlen($string); $x++) {
+ $return .= '%' . bin2hex($string[$x]);
+ }
+ return $return;
+
+ case 'hexentity':
+ $return = '';
+ for ($x=0; $x < strlen($string); $x++) {
+ $return .= '&#x' . bin2hex($string[$x]) . ';';
+ }
+ return $return;
+
+ case 'decentity':
+ $return = '';
+ for ($x=0; $x < strlen($string); $x++) {
+ $return .= '&#' . ord($string[$x]) . ';';
+ }
+ return $return;
+
+ case 'javascript':
+ // escape quotes and backslashes, newlines, etc.
+ return strtr($string, array('\\'=>'\\\\',"'"=>"\\'",'"'=>'\\"',"\r"=>'\\r',"\n"=>'\\n','</'=>'<\/'));
+
+ case 'mail':
+ // safe way to display e-mail address on a web page
+ return str_replace(array('@', '.'),array(' [AT] ', ' [DOT] '), $string);
+
+ case 'nonstd':
+ // escape non-standard chars, such as ms document quotes
+ $_res = '';
+ for($_i = 0, $_len = strlen($string); $_i < $_len; $_i++) {
+ $_ord = ord(substr($string, $_i, 1));
+ // non-standard char, escape it
+ if($_ord >= 126){
+ $_res .= '&#' . $_ord . ';';
+ }
+ else {
+ $_res .= substr($string, $_i, 1);
+ }
+ }
+ return $_res;
+
+ default:
+ return $string;
+ }
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.indent.php b/libs/Smarty/plugins/modifier.indent.php
new file mode 100755
index 0000000000..394147a29d
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.indent.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty indent modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: indent<br>
+ * Purpose: indent lines of text
+ * @link http://smarty.php.net/manual/en/language.modifier.indent.php
+ * indent (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param integer
+ * @param string
+ * @return string
+ */
+function smarty_modifier_indent($string,$chars=4,$char=" ")
+{
+ return preg_replace('!^!m',str_repeat($char,$chars),$string);
+}
+
+?>
diff --git a/libs/Smarty/plugins/modifier.lower.php b/libs/Smarty/plugins/modifier.lower.php
new file mode 100755
index 0000000000..20e7a8d39c
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.lower.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty lower modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: lower<br>
+ * Purpose: convert string to lowercase
+ * @link http://smarty.php.net/manual/en/language.modifier.lower.php
+ * lower (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return string
+ */
+function smarty_modifier_lower($string)
+{
+ return strtolower($string);
+}
+
+?>
diff --git a/libs/Smarty/plugins/modifier.nl2br.php b/libs/Smarty/plugins/modifier.nl2br.php
new file mode 100755
index 0000000000..d6fabff64d
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.nl2br.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty plugin
+ *
+ * Type: modifier<br>
+ * Name: nl2br<br>
+ * Date: Feb 26, 2003
+ * Purpose: convert \r\n, \r or \n to <<br>>
+ * Input:<br>
+ * - contents = contents to replace
+ * - preceed_test = if true, includes preceeding break tags
+ * in replacement
+ * Example: {$text|nl2br}
+ * @link http://smarty.php.net/manual/en/language.modifier.nl2br.php
+ * nl2br (Smarty online manual)
+ * @version 1.0
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return string
+ */
+function smarty_modifier_nl2br($string)
+{
+ return nl2br($string);
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.regex_replace.php b/libs/Smarty/plugins/modifier.regex_replace.php
new file mode 100755
index 0000000000..d4d20309d2
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.regex_replace.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty regex_replace modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: regex_replace<br>
+ * Purpose: regular expression search/replace
+ * @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php
+ * regex_replace (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param string|array
+ * @param string|array
+ * @return string
+ */
+function smarty_modifier_regex_replace($string, $search, $replace)
+{
+ if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[1], 'e') !== false)) {
+ /* remove eval-modifier from $search */
+ $search = substr($search, 0, -strlen($match[1])) . preg_replace('![e\s]+!', '', $match[1]);
+ }
+
+ return preg_replace($search, $replace, $string);
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.replace.php b/libs/Smarty/plugins/modifier.replace.php
new file mode 100755
index 0000000000..df041c8843
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.replace.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty replace modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: replace<br>
+ * Purpose: simple search/replace
+ * @link http://smarty.php.net/manual/en/language.modifier.replace.php
+ * replace (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param string
+ * @param string
+ * @return string
+ */
+function smarty_modifier_replace($string, $search, $replace)
+{
+ return str_replace($search, $replace, $string);
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.spacify.php b/libs/Smarty/plugins/modifier.spacify.php
new file mode 100755
index 0000000000..c2423f4f2f
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.spacify.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty spacify modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: spacify<br>
+ * Purpose: add spaces between characters in a string
+ * @link http://smarty.php.net/manual/en/language.modifier.spacify.php
+ * spacify (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param string
+ * @return string
+ */
+function smarty_modifier_spacify($string, $spacify_char = ' ')
+{
+ return implode($spacify_char,
+ preg_split('//', $string, -1, PREG_SPLIT_NO_EMPTY));
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.string_format.php b/libs/Smarty/plugins/modifier.string_format.php
new file mode 100755
index 0000000000..9e051a578e
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.string_format.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty string_format modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: string_format<br>
+ * Purpose: format strings via sprintf
+ * @link http://smarty.php.net/manual/en/language.modifier.string.format.php
+ * string_format (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param string
+ * @return string
+ */
+function smarty_modifier_string_format($string, $format)
+{
+ return sprintf($format, $string);
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.strip.php b/libs/Smarty/plugins/modifier.strip.php
new file mode 100755
index 0000000000..cc5c453c8a
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.strip.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty strip modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: strip<br>
+ * Purpose: Replace all repeated spaces, newlines, tabs
+ * with a single space or supplied replacement string.<br>
+ * Example: {$var|strip} {$var|strip:"&nbsp;"}
+ * Date: September 25th, 2002
+ * @link http://smarty.php.net/manual/en/language.modifier.strip.php
+ * strip (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @version 1.0
+ * @param string
+ * @param string
+ * @return string
+ */
+function smarty_modifier_strip($text, $replace = ' ')
+{
+ return preg_replace('!\s+!', $replace, $text);
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.strip_tags.php b/libs/Smarty/plugins/modifier.strip_tags.php
new file mode 100755
index 0000000000..93011a892c
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.strip_tags.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty strip_tags modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: strip_tags<br>
+ * Purpose: strip html tags from text
+ * @link http://smarty.php.net/manual/en/language.modifier.strip.tags.php
+ * strip_tags (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param boolean
+ * @return string
+ */
+function smarty_modifier_strip_tags($string, $replace_with_space = true)
+{
+ if ($replace_with_space)
+ return preg_replace('!<[^>]*?>!', ' ', $string);
+ else
+ return strip_tags($string);
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.truncate.php b/libs/Smarty/plugins/modifier.truncate.php
new file mode 100755
index 0000000000..35c89690a1
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.truncate.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty truncate modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: truncate<br>
+ * Purpose: Truncate a string to a certain length if necessary,
+ * optionally splitting in the middle of a word, and
+ * appending the $etc string or inserting $etc into the middle.
+ * @link http://smarty.php.net/manual/en/language.modifier.truncate.php
+ * truncate (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param integer
+ * @param string
+ * @param boolean
+ * @param boolean
+ * @return string
+ */
+function smarty_modifier_truncate($string, $length = 80, $etc = '...',
+ $break_words = false, $middle = false)
+{
+ if ($length == 0)
+ return '';
+
+ if (strlen($string) > $length) {
+ $length -= min($length, strlen($etc));
+ if (!$break_words && !$middle) {
+ $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
+ }
+ if(!$middle) {
+ return substr($string, 0, $length) . $etc;
+ } else {
+ return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
+ }
+ } else {
+ return $string;
+ }
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/modifier.upper.php b/libs/Smarty/plugins/modifier.upper.php
new file mode 100755
index 0000000000..c12480fbda
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.upper.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty upper modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: upper<br>
+ * Purpose: convert string to uppercase
+ * @link http://smarty.php.net/manual/en/language.modifier.upper.php
+ * upper (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return string
+ */
+function smarty_modifier_upper($string)
+{
+ return strtoupper($string);
+}
+
+?>
diff --git a/libs/Smarty/plugins/modifier.wordwrap.php b/libs/Smarty/plugins/modifier.wordwrap.php
new file mode 100755
index 0000000000..ce07181569
--- /dev/null
+++ b/libs/Smarty/plugins/modifier.wordwrap.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty wordwrap modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: wordwrap<br>
+ * Purpose: wrap a string of text at a given length
+ * @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php
+ * wordwrap (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param integer
+ * @param string
+ * @param boolean
+ * @return string
+ */
+function smarty_modifier_wordwrap($string,$length=80,$break="\n",$cut=false)
+{
+ return wordwrap($string,$length,$break,$cut);
+}
+
+?>
diff --git a/libs/Smarty/plugins/outputfilter.trimwhitespace.php b/libs/Smarty/plugins/outputfilter.trimwhitespace.php
new file mode 100755
index 0000000000..97b0d21e84
--- /dev/null
+++ b/libs/Smarty/plugins/outputfilter.trimwhitespace.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty trimwhitespace outputfilter plugin
+ *
+ * File: outputfilter.trimwhitespace.php<br>
+ * Type: outputfilter<br>
+ * Name: trimwhitespace<br>
+ * Date: Jan 25, 2003<br>
+ * Purpose: trim leading white space and blank lines from
+ * template source after it gets interpreted, cleaning
+ * up code and saving bandwidth. Does not affect
+ * <<PRE>></PRE> and <SCRIPT></SCRIPT> blocks.<br>
+ * Install: Drop into the plugin directory, call
+ * <code>$smarty->load_filter('output','trimwhitespace');</code>
+ * from application.
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Contributions from Lars Noschinski <lars@usenet.noschinski.de>
+ * @version 1.3
+ * @param string
+ * @param Smarty
+ */
+function smarty_outputfilter_trimwhitespace($source, &$smarty)
+{
+ // Pull out the script blocks
+ preg_match_all("!<script[^>]+>.*?</script>!is", $source, $match);
+ $_script_blocks = $match[0];
+ $source = preg_replace("!<script[^>]+>.*?</script>!is",
+ '@@@SMARTY:TRIM:SCRIPT@@@', $source);
+
+ // Pull out the pre blocks
+ preg_match_all("!<pre>.*?</pre>!is", $source, $match);
+ $_pre_blocks = $match[0];
+ $source = preg_replace("!<pre>.*?</pre>!is",
+ '@@@SMARTY:TRIM:PRE@@@', $source);
+
+ // Pull out the textarea blocks
+ preg_match_all("!<textarea[^>]+>.*?</textarea>!is", $source, $match);
+ $_textarea_blocks = $match[0];
+ $source = preg_replace("!<textarea[^>]+>.*?</textarea>!is",
+ '@@@SMARTY:TRIM:TEXTAREA@@@', $source);
+
+ // remove all leading spaces, tabs and carriage returns NOT
+ // preceeded by a php close tag.
+ $source = trim(preg_replace('/((?<!\?>)\n)[\s]+/m', '\1', $source));
+
+ // replace textarea blocks
+ smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:TEXTAREA@@@",$_textarea_blocks, $source);
+
+ // replace pre blocks
+ smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:PRE@@@",$_pre_blocks, $source);
+
+ // replace script blocks
+ smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:SCRIPT@@@",$_script_blocks, $source);
+
+ return $source;
+}
+
+function smarty_outputfilter_trimwhitespace_replace($search_str, $replace, &$subject) {
+ $_len = strlen($search_str);
+ $_pos = 0;
+ for ($_i=0, $_count=count($replace); $_i<$_count; $_i++)
+ if (($_pos=strpos($subject, $search_str, $_pos))!==false)
+ $subject = substr_replace($subject, $replace[$_i], $_pos, $_len);
+ else
+ break;
+
+}
+
+?>
diff --git a/libs/Smarty/plugins/shared.escape_special_chars.php b/libs/Smarty/plugins/shared.escape_special_chars.php
new file mode 100755
index 0000000000..c07ce31be2
--- /dev/null
+++ b/libs/Smarty/plugins/shared.escape_special_chars.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Smarty shared plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * escape_special_chars common function
+ *
+ * Function: smarty_function_escape_special_chars<br>
+ * Purpose: used by other smarty functions to escape
+ * special chars except for already escaped ones
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return string
+ */
+function smarty_function_escape_special_chars($string)
+{
+ if(!is_array($string)) {
+ $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
+ $string = htmlspecialchars($string);
+ $string = str_replace(array('%%%SMARTY_START%%%','%%%SMARTY_END%%%'), array('&',';'), $string);
+ }
+ return $string;
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Smarty/plugins/shared.make_timestamp.php b/libs/Smarty/plugins/shared.make_timestamp.php
new file mode 100755
index 0000000000..b42eb11d85
--- /dev/null
+++ b/libs/Smarty/plugins/shared.make_timestamp.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Smarty shared plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Function: smarty_make_timestamp<br>
+ * Purpose: used by other smarty functions to make a timestamp
+ * from a string.
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return string
+ */
+function smarty_make_timestamp($string)
+{
+ if(empty($string)) {
+ // use "now":
+ $time = time();
+
+ } elseif (preg_match('/^\d{14}$/', $string)) {
+ // it is mysql timestamp format of YYYYMMDDHHMMSS?
+ $time = mktime(substr($string, 8, 2),substr($string, 10, 2),substr($string, 12, 2),
+ substr($string, 4, 2),substr($string, 6, 2),substr($string, 0, 4));
+
+ } elseif (is_numeric($string)) {
+ // it is a numeric string, we handle it as timestamp
+ $time = (int)$string;
+
+ } else {
+ // strtotime should handle it
+ $time = strtotime($string);
+ if ($time == -1 || $time === false) {
+ // strtotime() was not able to parse $string, use "now":
+ $time = time();
+ }
+ }
+ return $time;
+
+}
+
+/* vim: set expandtab: */
+
+?>
diff --git a/libs/Zend/Acl.php b/libs/Zend/Acl.php
new file mode 100755
index 0000000000..18e3f30b2c
--- /dev/null
+++ b/libs/Zend/Acl.php
@@ -0,0 +1,1001 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Acl.php 2797 2007-01-16 01:35:30Z bkarwin $
+ */
+
+
+/**
+ * Zend_Acl_Resource_Interface
+ */
+require_once 'Zend/Acl/Resource/Interface.php';
+
+
+/**
+ * Zend_Acl_Role_Registry
+ */
+require_once 'Zend/Acl/Role/Registry.php';
+
+
+/**
+ * Zend_Acl_Assert_Interface
+ */
+require_once 'Zend/Acl/Assert/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Acl
+{
+ /**
+ * Rule type: allow
+ */
+ const TYPE_ALLOW = 'TYPE_ALLOW';
+
+ /**
+ * Rule type: deny
+ */
+ const TYPE_DENY = 'TYPE_DENY';
+
+ /**
+ * Rule operation: add
+ */
+ const OP_ADD = 'OP_ADD';
+
+ /**
+ * Rule operation: remove
+ */
+ const OP_REMOVE = 'OP_REMOVE';
+
+ /**
+ * Role registry
+ *
+ * @var Zend_Acl_Role_Registry
+ */
+ protected $_roleRegistry = null;
+
+ /**
+ * Resource tree
+ *
+ * @var array
+ */
+ protected $_resources = array();
+
+ /**
+ * ACL rules; whitelist (deny everything to all) by default
+ *
+ * @var array
+ */
+ protected $_rules = array(
+ 'allResources' => array(
+ 'allRoles' => array(
+ 'allPrivileges' => array(
+ 'type' => self::TYPE_DENY,
+ 'assert' => null
+ ),
+ 'byPrivilegeId' => array()
+ ),
+ 'byRoleId' => array()
+ ),
+ 'byResourceId' => array()
+ );
+
+ /**
+ * Adds a Role having an identifier unique to the registry
+ *
+ * The $parents parameter may be a reference to, or the string identifier for,
+ * a Role existing in the registry, or $parents may be passed as an array of
+ * these - mixing string identifiers and objects is ok - to indicate the Roles
+ * from which the newly added Role will directly inherit.
+ *
+ * In order to resolve potential ambiguities with conflicting rules inherited
+ * from different parents, the most recently added parent takes precedence over
+ * parents that were previously added. In other words, the first parent added
+ * will have the least priority, and the last parent added will have the
+ * highest priority.
+ *
+ * @param Zend_Acl_Role_Interface $role
+ * @param Zend_Acl_Role_Interface|string|array $parents
+ * @uses Zend_Acl_Role_Registry::add()
+ * @return Zend_Acl Provides a fluent interface
+ */
+ public function addRole(Zend_Acl_Role_Interface $role, $parents = null)
+ {
+ $this->_getRoleRegistry()->add($role, $parents);
+
+ return $this;
+ }
+
+ /**
+ * Returns the identified Role
+ *
+ * The $role parameter can either be a Role or Role identifier.
+ *
+ * @param Zend_Acl_Role_Interface|string $role
+ * @uses Zend_Acl_Role_Registry::get()
+ * @return Zend_Acl_Role_Interface
+ */
+ public function getRole($role)
+ {
+ return $this->_getRoleRegistry()->get($role);
+ }
+
+ /**
+ * Returns true if and only if the Role exists in the registry
+ *
+ * The $role parameter can either be a Role or a Role identifier.
+ *
+ * @param Zend_Acl_Role_Interface|string $role
+ * @uses Zend_Acl_Role_Registry::has()
+ * @return boolean
+ */
+ public function hasRole($role)
+ {
+ return $this->_getRoleRegistry()->has($role);
+ }
+
+ /**
+ * Returns true if and only if $role inherits from $inherit
+ *
+ * Both parameters may be either a Role or a Role identifier. If
+ * $onlyParents is true, then $role must inherit directly from
+ * $inherit in order to return true. By default, this method looks
+ * through the entire inheritance DAG to determine whether $role
+ * inherits from $inherit through its ancestor Roles.
+ *
+ * @param Zend_Acl_Role_Interface|string $role
+ * @param Zend_Acl_Role_Interface|string $inherit
+ * @param boolean $onlyParents
+ * @uses Zend_Acl_Role_Registry::inherits()
+ * @return boolean
+ */
+ public function inheritsRole($role, $inherit, $onlyParents = false)
+ {
+ return $this->_getRoleRegistry()->inherits($role, $inherit, $onlyParents = false);
+ }
+
+ /**
+ * Removes the Role from the registry
+ *
+ * The $role parameter can either be a Role or a Role identifier.
+ *
+ * @param Zend_Acl_Role_Interface|string $role
+ * @uses Zend_Acl_Role_Registry::remove()
+ * @return Zend_Acl Provides a fluent interface
+ */
+ public function removeRole($role)
+ {
+ $this->_getRoleRegistry()->remove($role);
+
+ if ($role instanceof Zend_Acl_Role_Interface) {
+ $roleId = $role->getRoleId();
+ } else {
+ $roleId = $role;
+ }
+
+ foreach ($this->_rules['allResources']['byRoleId'] as $roleIdCurrent => $rules) {
+ if ($roleId === $roleIdCurrent) {
+ unset($this->_rules['allResources']['byRoleId'][$roleIdCurrent]);
+ }
+ }
+ foreach ($this->_rules['byResourceId'] as $resourceIdCurrent => $visitor) {
+ foreach ($visitor['byRoleId'] as $roleIdCurrent => $rules) {
+ if ($roleId === $roleIdCurrent) {
+ unset($this->_rules['byResourceId'][$resourceIdCurrent]['byRoleId'][$roleIdCurrent]);
+ }
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Removes all Roles from the registry
+ *
+ * @uses Zend_Acl_Role_Registry::removeAll()
+ * @return Zend_Acl Provides a fluent interface
+ */
+ public function removeRoleAll()
+ {
+ $this->_getRoleRegistry()->removeAll();
+
+ foreach ($this->_rules['allResources']['byRoleId'] as $roleIdCurrent => $rules) {
+ unset($this->_rules['allResources']['byRoleId'][$roleIdCurrent]);
+ }
+ foreach ($this->_rules['byResourceId'] as $resourceIdCurrent => $visitor) {
+ foreach ($visitor['byRoleId'] as $roleIdCurrent => $rules) {
+ unset($this->_rules['byResourceId'][$resourceIdCurrent]['byRoleId'][$roleIdCurrent]);
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Adds a Resource having an identifier unique to the ACL
+ *
+ * The $parent parameter may be a reference to, or the string identifier for,
+ * the existing Resource from which the newly added Resource will inherit.
+ *
+ * @param Zend_Acl_Resource_Interface $resource
+ * @param Zend_Acl_Resource_Interface|string $parent
+ * @throws Zend_Acl_Exception
+ * @return Zend_Acl Provides a fluent interface
+ */
+ public function add(Zend_Acl_Resource_Interface $resource, $parent = null)
+ {
+ $resourceId = $resource->getResourceId();
+
+ if ($this->has($resourceId)) {
+ require_once 'Zend/Acl/Exception.php';
+ throw new Zend_Acl_Exception("Resource id '$resourceId' already exists in the ACL");
+ }
+
+ $resourceParent = null;
+
+ if (null !== $parent) {
+ try {
+ if ($parent instanceof Zend_Acl_Resource_Interface) {
+ $resourceParentId = $parent->getResourceId();
+ } else {
+ $resourceParentId = $parent;
+ }
+ $resourceParent = $this->get($resourceParentId);
+ } catch (Zend_Acl_Exception $e) {
+ throw new Zend_Acl_Exception("Parent Resource id '$resourceParentId' does not exist");
+ }
+ $this->_resources[$resourceParentId]['children'][$resourceId] = $resource;
+ }
+
+ $this->_resources[$resourceId] = array(
+ 'instance' => $resource,
+ 'parent' => $resourceParent,
+ 'children' => array()
+ );
+
+ return $this;
+ }
+
+ /**
+ * Returns the identified Resource
+ *
+ * The $resource parameter can either be a Resource or a Resource identifier.
+ *
+ * @param Zend_Acl_Resource_Interface|string $resource
+ * @throws Zend_Acl_Exception
+ * @return Zend_Acl_Resource_Interface
+ */
+ public function get($resource)
+ {
+ if ($resource instanceof Zend_Acl_Resource_Interface) {
+ $resourceId = $resource->getResourceId();
+ } else {
+ $resourceId = (string) $resource;
+ }
+
+ if (!$this->has($resource)) {
+ require_once 'Zend/Acl/Exception.php';
+ throw new Zend_Acl_Exception("Resource '$resourceId' not found");
+ }
+
+ return $this->_resources[$resourceId]['instance'];
+ }
+
+ /**
+ * Returns true if and only if the Resource exists in the ACL
+ *
+ * The $resource parameter can either be a Resource or a Resource identifier.
+ *
+ * @param Zend_Acl_Resource_Interface|string $resource
+ * @return boolean
+ */
+ public function has($resource)
+ {
+ if ($resource instanceof Zend_Acl_Resource_Interface) {
+ $resourceId = $resource->getResourceId();
+ } else {
+ $resourceId = (string) $resource;
+ }
+
+ return isset($this->_resources[$resourceId]);
+ }
+
+ /**
+ * Returns true if and only if $resource inherits from $inherit
+ *
+ * Both parameters may be either a Resource or a Resource identifier. If
+ * $onlyParent is true, then $resource must inherit directly from
+ * $inherit in order to return true. By default, this method looks
+ * through the entire inheritance tree to determine whether $resource
+ * inherits from $inherit through its ancestor Resources.
+ *
+ * @param Zend_Acl_Resource_Interface|string $resource
+ * @param Zend_Acl_Resource_Interface|string $inherit
+ * @param boolean $onlyParent
+ * @throws Zend_Acl_Resource_Registry_Exception
+ * @return boolean
+ */
+ public function inherits($resource, $inherit, $onlyParent = false)
+ {
+ try {
+ $resourceId = $this->get($resource)->getResourceId();
+ $inheritId = $this->get($inherit)->getResourceId();
+ } catch (Zend_Acl_Exception $e) {
+ throw $e;
+ }
+
+ if (null !== $this->_resources[$resourceId]['parent']) {
+ $parentId = $this->_resources[$resourceId]['parent']->getResourceId();
+ if ($inheritId === $parentId) {
+ return true;
+ } else if ($onlyParent) {
+ return false;
+ }
+ } else {
+ return false;
+ }
+
+ while (null !== $this->_resources[$parentId]['parent']) {
+ $parentId = $this->_resources[$parentId]['parent']->getResourceId();
+ if ($inheritId === $parentId) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Removes a Resource and all of its children
+ *
+ * The $resource parameter can either be a Resource or a Resource identifier.
+ *
+ * @param Zend_Acl_Resource_Interface|string $resource
+ * @throws Zend_Acl_Exception
+ * @return Zend_Acl Provides a fluent interface
+ */
+ public function remove($resource)
+ {
+ try {
+ $resourceId = $this->get($resource)->getResourceId();
+ } catch (Zend_Acl_Exception $e) {
+ throw $e;
+ }
+
+ $resourcesRemoved = array($resourceId);
+ if (null !== ($resourceParent = $this->_resources[$resourceId]['parent'])) {
+ unset($this->_resources[$resourceParent->getResourceId()]['children'][$resourceId]);
+ }
+ foreach ($this->_resources[$resourceId]['children'] as $childId => $child) {
+ $this->remove($childId);
+ $resourcesRemoved[] = $childId;
+ }
+
+ foreach ($resourcesRemoved as $resourceIdRemoved) {
+ foreach ($this->_rules['byResourceId'] as $resourceIdCurrent => $rules) {
+ if ($resourceIdRemoved === $resourceIdCurrent) {
+ unset($this->_rules['byResourceId'][$resourceIdCurrent]);
+ }
+ }
+ }
+
+ unset($this->_resources[$resourceId]);
+
+ return $this;
+ }
+
+ /**
+ * Removes all Resources
+ *
+ * @return Zend_Acl Provides a fluent interface
+ */
+ public function removeAll()
+ {
+ foreach ($this->_resources as $resourceId => $resource) {
+ foreach ($this->_rules['byResourceId'] as $resourceIdCurrent => $rules) {
+ if ($resourceId === $resourceIdCurrent) {
+ unset($this->_rules['byResourceId'][$resourceIdCurrent]);
+ }
+ }
+ }
+
+ $this->_resources = array();
+
+ return $this;
+ }
+
+ /**
+ * Adds an "allow" rule to the ACL
+ *
+ * @param Zend_Acl_Role_Interface|string|array $roles
+ * @param Zend_Acl_Resource_Interface|string|array $resources
+ * @param string|array $privileges
+ * @param Zend_Acl_Assert_Interface $assert
+ * @uses Zend_Acl::setRule()
+ * @return Zend_Acl Provides a fluent interface
+ */
+ public function allow($roles = null, $resources = null, $privileges = null, Zend_Acl_Assert_Interface $assert = null)
+ {
+ return $this->setRule(self::OP_ADD, self::TYPE_ALLOW, $roles, $resources, $privileges, $assert);
+ }
+
+ /**
+ * Adds a "deny" rule to the ACL
+ *
+ * @param Zend_Acl_Role_Interface|string|array $roles
+ * @param Zend_Acl_Resource_Interface|string|array $resources
+ * @param string|array $privileges
+ * @param Zend_Acl_Assert_Interface $assert
+ * @uses Zend_Acl::setRule()
+ * @return Zend_Acl Provides a fluent interface
+ */
+ public function deny($roles = null, $resources = null, $privileges = null, Zend_Acl_Assert_Interface $assert = null)
+ {
+ return $this->setRule(self::OP_ADD, self::TYPE_DENY, $roles, $resources, $privileges, $assert);
+ }
+
+ /**
+ * Removes "allow" permissions from the ACL
+ *
+ * @param Zend_Acl_Role_Interface|string|array $roles
+ * @param Zend_Acl_Resource_Interface|string|array $resources
+ * @param string|array $privileges
+ * @uses Zend_Acl::setRule()
+ * @return Zend_Acl Provides a fluent interface
+ */
+ public function removeAllow($roles = null, $resources = null, $privileges = null)
+ {
+ return $this->setRule(self::OP_REMOVE, self::TYPE_ALLOW, $roles, $resources, $privileges);
+ }
+
+ /**
+ * Removes "deny" restrictions from the ACL
+ *
+ * @param Zend_Acl_Role_Interface|string|array $roles
+ * @param Zend_Acl_Resource_Interface|string|array $resources
+ * @param string|array $privileges
+ * @uses Zend_Acl::setRule()
+ * @return Zend_Acl Provides a fluent interface
+ */
+ public function removeDeny($roles = null, $resources = null, $privileges = null)
+ {
+ return $this->setRule(self::OP_REMOVE, self::TYPE_DENY, $roles, $resources, $privileges);
+ }
+
+ /**
+ * Performs operations on ACL rules
+ *
+ * The $operation parameter may be either OP_ADD or OP_REMOVE, depending on whether the
+ * user wants to add or remove a rule, respectively:
+ *
+ * OP_ADD specifics:
+ *
+ * A rule is added that would allow one or more Roles access to [certain $privileges
+ * upon] the specified Resource(s).
+ *
+ * OP_REMOVE specifics:
+ *
+ * The rule is removed only in the context of the given Roles, Resources, and privileges.
+ * Existing rules to which the remove operation does not apply would remain in the
+ * ACL.
+ *
+ * The $type parameter may be either TYPE_ALLOW or TYPE_DENY, depending on whether the
+ * rule is intended to allow or deny permission, respectively.
+ *
+ * The $roles and $resources parameters may be references to, or the string identifiers for,
+ * existing Resources/Roles, or they may be passed as arrays of these - mixing string identifiers
+ * and objects is ok - to indicate the Resources and Roles to which the rule applies. If either
+ * $roles or $resources is null, then the rule applies to all Roles or all Resources, respectively.
+ * Both may be null in order to work with the default rule of the ACL.
+ *
+ * The $privileges parameter may be used to further specify that the rule applies only
+ * to certain privileges upon the Resource(s) in question. This may be specified to be a single
+ * privilege with a string, and multiple privileges may be specified as an array of strings.
+ *
+ * If $assert is provided, then its assert() method must return true in order for
+ * the rule to apply. If $assert is provided with $roles, $resources, and $privileges all
+ * equal to null, then a rule having a type of:
+ *
+ * TYPE_ALLOW will imply a type of TYPE_DENY, and
+ *
+ * TYPE_DENY will imply a type of TYPE_ALLOW
+ *
+ * when the rule's assertion fails. This is because the ACL needs to provide expected
+ * behavior when an assertion upon the default ACL rule fails.
+ *
+ * @param string $operation
+ * @param string $type
+ * @param Zend_Acl_Role_Interface|string|array $roles
+ * @param Zend_Acl_Resource_Interface|string|array $resources
+ * @param string|array $privileges
+ * @param Zend_Acl_Assert_Interface $assert
+ * @throws Zend_Acl_Exception
+ * @uses Zend_Acl_Role_Registry::get()
+ * @uses Zend_Acl::get()
+ * @return Zend_Acl Provides a fluent interface
+ */
+ public function setRule($operation, $type, $roles = null, $resources = null, $privileges = null,
+ Zend_Acl_Assert_Interface $assert = null)
+ {
+ // ensure that the rule type is valid; normalize input to uppercase
+ $type = strtoupper($type);
+ if (self::TYPE_ALLOW !== $type && self::TYPE_DENY !== $type) {
+ require_once 'Zend/Acl/Exception.php';
+ throw new Zend_Acl_Exception("Unsupported rule type; must be either '" . self::TYPE_ALLOW . "' or '"
+ . self::TYPE_DENY . "'");
+ }
+
+ // ensure that all specified Roles exist; normalize input to array of Role objects or null
+ if (!is_array($roles)) {
+ $roles = array($roles);
+ } else if (0 === count($roles)) {
+ $roles = array(null);
+ }
+ $rolesTemp = $roles;
+ $roles = array();
+ foreach ($rolesTemp as $role) {
+ if (null !== $role) {
+ $roles[] = $this->_getRoleRegistry()->get($role);
+ } else {
+ $roles[] = null;
+ }
+ }
+ unset($rolesTemp);
+
+ // ensure that all specified Resources exist; normalize input to array of Resource objects or null
+ if (!is_array($resources)) {
+ $resources = array($resources);
+ } else if (0 === count($resources)) {
+ $resources = array(null);
+ }
+ $resourcesTemp = $resources;
+ $resources = array();
+ foreach ($resourcesTemp as $resource) {
+ if (null !== $resource) {
+ $resources[] = $this->get($resource);
+ } else {
+ $resources[] = null;
+ }
+ }
+ unset($resourcesTemp);
+
+ // normalize privileges to array
+ if (null === $privileges) {
+ $privileges = array();
+ } else if (!is_array($privileges)) {
+ $privileges = array($privileges);
+ }
+
+ switch ($operation) {
+
+ // add to the rules
+ case self::OP_ADD:
+ foreach ($resources as $resource) {
+ foreach ($roles as $role) {
+ $rules =& $this->_getRules($resource, $role, true);
+ if (0 === count($privileges)) {
+ $rules['allPrivileges']['type'] = $type;
+ $rules['allPrivileges']['assert'] = $assert;
+ if (!isset($rules['byPrivilegeId'])) {
+ $rules['byPrivilegeId'] = array();
+ }
+ } else {
+ foreach ($privileges as $privilege) {
+ $rules['byPrivilegeId'][$privilege]['type'] = $type;
+ $rules['byPrivilegeId'][$privilege]['assert'] = $assert;
+ }
+ }
+ }
+ }
+ break;
+
+ // remove from the rules
+ case self::OP_REMOVE:
+ foreach ($resources as $resource) {
+ foreach ($roles as $role) {
+ $rules =& $this->_getRules($resource, $role);
+ if (null === $rules) {
+ continue;
+ }
+ if (0 === count($privileges)) {
+ if (null === $resource && null === $role) {
+ if ($type === $rules['allPrivileges']['type']) {
+ $rules = array(
+ 'allPrivileges' => array(
+ 'type' => self::TYPE_DENY,
+ 'assert' => null
+ ),
+ 'byPrivilegeId' => array()
+ );
+ }
+ continue;
+ }
+ if ($type === $rules['allPrivileges']['type']) {
+ unset($rules['allPrivileges']);
+ }
+ } else {
+ foreach ($privileges as $privilege) {
+ if (isset($rules['byPrivilegeId'][$privilege]) &&
+ $type === $rules['byPrivilegeId'][$privilege]['type']) {
+ unset($rules['byPrivilegeId'][$privilege]);
+ }
+ }
+ }
+ }
+ }
+ break;
+
+ default:
+ require_once 'Zend/Acl/Exception.php';
+ throw new Zend_Acl_Exception("Unsupported operation; must be either '" . self::OP_ADD . "' or '"
+ . self::OP_REMOVE . "'");
+ }
+
+ return $this;
+ }
+
+ /**
+ * Returns true if and only if the Role has access to the Resource
+ *
+ * The $role and $resource parameters may be references to, or the string identifiers for,
+ * an existing Resource and Role combination.
+ *
+ * If either $role or $resource is null, then the query applies to all Roles or all Resources,
+ * respectively. Both may be null to query whether the ACL has a "blacklist" rule
+ * (allow everything to all). By default, Zend_Acl creates a "whitelist" rule (deny
+ * everything to all), and this method would return false unless this default has
+ * been overridden (i.e., by executing $acl->allow()).
+ *
+ * If a $privilege is not provided, then this method returns false if and only if the
+ * Role is denied access to at least one privilege upon the Resource. In other words, this
+ * method returns true if and only if the Role is allowed all privileges on the Resource.
+ *
+ * This method checks Role inheritance using a depth-first traversal of the Role registry.
+ * The highest priority parent (i.e., the parent most recently added) is checked first,
+ * and its respective parents are checked similarly before the lower-priority parents of
+ * the Role are checked.
+ *
+ * @param Zend_Acl_Role_Interface|string $role
+ * @param Zend_Acl_Resource_Interface|string $resource
+ * @param string $privilege
+ * @uses Zend_Acl::get()
+ * @uses Zend_Acl_Role_Registry::get()
+ * @return boolean
+ */
+ public function isAllowed($role = null, $resource = null, $privilege = null)
+ {
+ if (null !== $role) {
+ $role = $this->_getRoleRegistry()->get($role);
+ }
+
+ if (null !== $resource) {
+ $resource = $this->get($resource);
+ }
+
+ if (null === $privilege) {
+ // query on all privileges
+ do {
+ // depth-first search on $role if it is not 'allRoles' pseudo-parent
+ if (null !== $role && null !== ($result = $this->_roleDFSAllPrivileges($role, $resource, $privilege))) {
+ return $result;
+ }
+
+ // look for rule on 'allRoles' psuedo-parent
+ if (null !== ($rules = $this->_getRules($resource, null))) {
+ foreach ($rules['byPrivilegeId'] as $privilege => $rule) {
+ if (self::TYPE_DENY === ($ruleTypeOnePrivilege = $this->_getRuleType($resource, null, $privilege))) {
+ return false;
+ }
+ }
+ if (null !== ($ruleTypeAllPrivileges = $this->_getRuleType($resource, null, null))) {
+ return self::TYPE_ALLOW === $ruleTypeAllPrivileges;
+ }
+ }
+
+ // try next Resource
+ $resource = $this->_resources[$resource->getResourceId()]['parent'];
+
+ } while (true); // loop terminates at 'allResources' pseudo-parent
+ } else {
+ // query on one privilege
+ do {
+ // depth-first search on $role if it is not 'allRoles' pseudo-parent
+ if (null !== $role && null !== ($result = $this->_roleDFSOnePrivilege($role, $resource, $privilege))) {
+ return $result;
+ }
+
+ // look for rule on 'allRoles' pseudo-parent
+ if (null !== ($ruleType = $this->_getRuleType($resource, null, $privilege))) {
+ return self::TYPE_ALLOW === $ruleType;
+ } else if (null !== ($ruleTypeAllPrivileges = $this->_getRuleType($resource, null, null))) {
+ return self::TYPE_ALLOW === $ruleTypeAllPrivileges;
+ }
+
+ // try next Resource
+ $resource = $this->_resources[$resource->getResourceId()]['parent'];
+
+ } while (true); // loop terminates at 'allResources' pseudo-parent
+ }
+ }
+
+ /**
+ * Returns the Role registry for this ACL
+ *
+ * If no Role registry has been created yet, a new default Role registry
+ * is created and returned.
+ *
+ * @return Zend_Acl_Role_Registry
+ */
+ protected function _getRoleRegistry()
+ {
+ if (null === $this->_roleRegistry) {
+ $this->_roleRegistry = new Zend_Acl_Role_Registry();
+ }
+ return $this->_roleRegistry;
+ }
+
+ /**
+ * Performs a depth-first search of the Role DAG, starting at $role, in order to find a rule
+ * allowing/denying $role access to all privileges upon $resource
+ *
+ * This method returns true if a rule is found and allows access. If a rule exists and denies access,
+ * then this method returns false. If no applicable rule is found, then this method returns null.
+ *
+ * @param Zend_Acl_Role_Interface $role
+ * @param Zend_Acl_Resource_Interface $resource
+ * @return boolean|null
+ */
+ protected function _roleDFSAllPrivileges(Zend_Acl_Role_Interface $role, Zend_Acl_Resource_Interface $resource = null)
+ {
+ $dfs = array(
+ 'visited' => array(),
+ 'stack' => array()
+ );
+
+ if (null !== ($result = $this->_roleDFSVisitAllPrivileges($role, $resource, $dfs))) {
+ return $result;
+ }
+
+ while (null !== ($role = array_pop($dfs['stack']))) {
+ if (!isset($dfs['visited'][$role->getRoleId()])) {
+ if (null !== ($result = $this->_roleDFSVisitAllPrivileges($role, $resource, $dfs))) {
+ return $result;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Visits an $role in order to look for a rule allowing/denying $role access to all privileges upon $resource
+ *
+ * This method returns true if a rule is found and allows access. If a rule exists and denies access,
+ * then this method returns false. If no applicable rule is found, then this method returns null.
+ *
+ * This method is used by the internal depth-first search algorithm and may modify the DFS data structure.
+ *
+ * @param Zend_Acl_Role_Interface $role
+ * @param Zend_Acl_Resource_Interface $resource
+ * @param array $dfs
+ * @return boolean|null
+ */
+ protected function _roleDFSVisitAllPrivileges(Zend_Acl_Role_Interface $role, Zend_Acl_Resource_Interface $resource = null,
+ &$dfs)
+ {
+ if (null !== ($rules = $this->_getRules($resource, $role))) {
+ foreach ($rules['byPrivilegeId'] as $privilege => $rule) {
+ if (self::TYPE_DENY === ($ruleTypeOnePrivilege = $this->_getRuleType($resource, $role, $privilege))) {
+ return false;
+ }
+ }
+ if (null !== ($ruleTypeAllPrivileges = $this->_getRuleType($resource, $role, null))) {
+ return self::TYPE_ALLOW === $ruleTypeAllPrivileges;
+ }
+ }
+
+ $dfs['visited'][$role->getRoleId()] = true;
+ foreach ($this->_getRoleRegistry()->getParents($role) as $roleParentId => $roleParent) {
+ $dfs['stack'][] = $roleParent;
+ }
+
+ return null;
+ }
+
+ /**
+ * Performs a depth-first search of the Role DAG, starting at $role, in order to find a rule
+ * allowing/denying $role access to a $privilege upon $resource
+ *
+ * This method returns true if a rule is found and allows access. If a rule exists and denies access,
+ * then this method returns false. If no applicable rule is found, then this method returns null.
+ *
+ * @param Zend_Acl_Role_Interface $role
+ * @param Zend_Acl_Resource_Interface $resource
+ * @param string $privilege
+ * @return boolean|null
+ */
+ protected function _roleDFSOnePrivilege(Zend_Acl_Role_Interface $role, Zend_Acl_Resource_Interface $resource = null, $privilege)
+ {
+ $dfs = array(
+ 'visited' => array(),
+ 'stack' => array()
+ );
+
+ if (null !== ($result = $this->_roleDFSVisitOnePrivilege($role, $resource, $privilege, $dfs))) {
+ return $result;
+ }
+
+ while (null !== ($role = array_pop($dfs['stack']))) {
+ if (!isset($dfs['visited'][$role->getRoleId()])) {
+ if (null !== ($result = $this->_roleDFSVisitOnePrivilege($role, $resource, $privilege, $dfs))) {
+ return $result;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Visits an $role in order to look for a rule allowing/denying $role access to a $privilege upon $resource
+ *
+ * This method returns true if a rule is found and allows access. If a rule exists and denies access,
+ * then this method returns false. If no applicable rule is found, then this method returns null.
+ *
+ * This method is used by the internal depth-first search algorithm and may modify the DFS data structure.
+ *
+ * @param Zend_Acl_Role_Interface $role
+ * @param Zend_Acl_Resource_Interface $resource
+ * @param string $privilege
+ * @param array $dfs
+ * @return boolean|null
+ */
+ protected function _roleDFSVisitOnePrivilege(Zend_Acl_Role_Interface $role, Zend_Acl_Resource_Interface $resource = null,
+ $privilege, &$dfs)
+ {
+ if (null !== ($ruleTypeOnePrivilege = $this->_getRuleType($resource, $role, $privilege))) {
+ return self::TYPE_ALLOW === $ruleTypeOnePrivilege;
+ } else if (null !== ($ruleTypeAllPrivileges = $this->_getRuleType($resource, $role, null))) {
+ return self::TYPE_ALLOW === $ruleTypeAllPrivileges;
+ }
+
+ $dfs['visited'][$role->getRoleId()] = true;
+ foreach ($this->_getRoleRegistry()->getParents($role) as $roleParentId => $roleParent) {
+ $dfs['stack'][] = $roleParent;
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns the rule type associated with the specified Resource, Role, and privilege
+ * combination.
+ *
+ * If a rule does not exist or its attached assertion fails, which means that
+ * the rule is not applicable, then this method returns null. Otherwise, the
+ * rule type applies and is returned as either TYPE_ALLOW or TYPE_DENY.
+ *
+ * If $resource or $role is null, then this means that the rule must apply to
+ * all Resources or Roles, respectively.
+ *
+ * If $privilege is null, then the rule must apply to all privileges.
+ *
+ * If all three parameters are null, then the default ACL rule type is returned,
+ * based on whether its assertion method passes.
+ *
+ * @param Zend_Acl_Resource_Interface $resource
+ * @param Zend_Acl_Role_Interface $role
+ * @param string $privilege
+ * @return string|null
+ */
+ protected function _getRuleType(Zend_Acl_Resource_Interface $resource = null, Zend_Acl_Role_Interface $role = null,
+ $privilege = null)
+ {
+ // get the rules for the $resource and $role
+ if (null === ($rules = $this->_getRules($resource, $role))) {
+ return null;
+ }
+
+ // follow $privilege
+ if (null === $privilege) {
+ if (isset($rules['allPrivileges'])) {
+ $rule = $rules['allPrivileges'];
+ } else {
+ return null;
+ }
+ } else if (!isset($rules['byPrivilegeId'][$privilege])) {
+ return null;
+ } else {
+ $rule = $rules['byPrivilegeId'][$privilege];
+ }
+
+ // check assertion if necessary
+ if (null === $rule['assert'] || $rule['assert']->assert($this, $role, $resource, $privilege)) {
+ return $rule['type'];
+ } else if (null !== $resource || null !== $role || null !== $privilege) {
+ return null;
+ } else if (self::TYPE_ALLOW === $rule['type']) {
+ return self::TYPE_DENY;
+ } else {
+ return self::TYPE_ALLOW;
+ }
+ }
+
+ /**
+ * Returns the rules associated with a Resource and a Role, or null if no such rules exist
+ *
+ * If either $resource or $role is null, this means that the rules returned are for all Resources or all Roles,
+ * respectively. Both can be null to return the default rule set for all Resources and all Roles.
+ *
+ * If the $create parameter is true, then a rule set is first created and then returned to the caller.
+ *
+ * @param Zend_Acl_Resource_Interface $resource
+ * @param Zend_Acl_Role_Interface $role
+ * @param boolean $create
+ * @return array|null
+ */
+ protected function &_getRules(Zend_Acl_Resource_Interface $resource = null, Zend_Acl_Role_Interface $role = null,
+ $create = false)
+ {
+ // create a reference to null
+ $null = null;
+ $nullRef =& $null;
+
+ // follow $resource
+ do {
+ if (null === $resource) {
+ $visitor =& $this->_rules['allResources'];
+ break;
+ }
+ $resourceId = $resource->getResourceId();
+ if (!isset($this->_rules['byResourceId'][$resourceId])) {
+ if (!$create) {
+ return $nullRef;
+ }
+ $this->_rules['byResourceId'][$resourceId] = array();
+ }
+ $visitor =& $this->_rules['byResourceId'][$resourceId];
+ } while (false);
+
+
+ // follow $role
+ if (null === $role) {
+ if (!isset($visitor['allRoles'])) {
+ if (!$create) {
+ return $nullRef;
+ }
+ $visitor['allRoles']['byPrivilegeId'] = array();
+ }
+ return $visitor['allRoles'];
+ }
+ $roleId = $role->getRoleId();
+ if (!isset($visitor['byRoleId'][$roleId])) {
+ if (!$create) {
+ return $nullRef;
+ }
+ $visitor['byRoleId'][$roleId]['byPrivilegeId'] = array();
+ }
+ return $visitor['byRoleId'][$roleId];
+ }
+
+}
diff --git a/libs/Zend/Acl/Assert/Interface.php b/libs/Zend/Acl/Assert/Interface.php
new file mode 100755
index 0000000000..758af439a5
--- /dev/null
+++ b/libs/Zend/Acl/Assert/Interface.php
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 2797 2007-01-16 01:35:30Z bkarwin $
+ */
+
+
+/**
+ * Zend_Acl
+ */
+require_once 'Zend/Acl.php';
+
+
+/**
+ * Zend_Acl_Role_Interface
+ */
+require_once 'Zend/Acl/Role/Interface.php';
+
+
+/**
+ * Zend_Acl_Resource_Interface
+ */
+require_once 'Zend/Acl/Resource/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Acl_Assert_Interface
+{
+ /**
+ * Returns true if and only if the assertion conditions are met
+ *
+ * This method is passed the ACL, Role, Resource, and privilege to which the authorization query applies. If the
+ * $role, $resource, or $privilege parameters are null, it means that the query applies to all Roles, Resources, or
+ * privileges, respectively.
+ *
+ * @param Zend_Acl $acl
+ * @param Zend_Acl_Role_Interface $role
+ * @param Zend_Acl_Resource_Interface $resource
+ * @param string $privilege
+ * @return boolean
+ */
+ public function assert(Zend_Acl $acl, Zend_Acl_Role_Interface $role = null, Zend_Acl_Resource_Interface $resource = null,
+ $privilege = null);
+}
diff --git a/libs/Zend/Acl/Exception.php b/libs/Zend/Acl/Exception.php
new file mode 100755
index 0000000000..12c1b4a03b
--- /dev/null
+++ b/libs/Zend/Acl/Exception.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Exception.php 2797 2007-01-16 01:35:30Z bkarwin $
+ */
+
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Acl_Exception extends Zend_Exception
+{}
diff --git a/libs/Zend/Acl/Resource.php b/libs/Zend/Acl/Resource.php
new file mode 100755
index 0000000000..dda6351eb3
--- /dev/null
+++ b/libs/Zend/Acl/Resource.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Resource.php 2797 2007-01-16 01:35:30Z bkarwin $
+ */
+
+
+/**
+ * Zend_Acl_Resource_Interface
+ */
+require_once 'Zend/Acl/Resource/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Acl_Resource implements Zend_Acl_Resource_Interface
+{
+ /**
+ * Unique id of Resource
+ *
+ * @var string
+ */
+ protected $_resourceId;
+
+ /**
+ * Sets the Resource identifier
+ *
+ * @param string $id
+ * @return void
+ */
+ public function __construct($resourceId)
+ {
+ $this->_resourceId = (string) $resourceId;
+ }
+
+ /**
+ * Defined by Zend_Acl_Resource_Interface; returns the Resource identifier
+ *
+ * @return string
+ */
+ public function getResourceId()
+ {
+ return $this->_resourceId;
+ }
+
+}
diff --git a/libs/Zend/Acl/Resource/Interface.php b/libs/Zend/Acl/Resource/Interface.php
new file mode 100755
index 0000000000..c78b75f49f
--- /dev/null
+++ b/libs/Zend/Acl/Resource/Interface.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 2797 2007-01-16 01:35:30Z bkarwin $
+ */
+
+
+/**
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Acl_Resource_Interface
+{
+ /**
+ * Returns the string identifier of the Resource
+ *
+ * @return string
+ */
+ public function getResourceId();
+}
diff --git a/libs/Zend/Acl/Role.php b/libs/Zend/Acl/Role.php
new file mode 100755
index 0000000000..b219606afa
--- /dev/null
+++ b/libs/Zend/Acl/Role.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Role.php 2797 2007-01-16 01:35:30Z bkarwin $
+ */
+
+
+/**
+ * Zend_Acl_Role_Interface
+ */
+require_once 'Zend/Acl/Role/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Acl_Role implements Zend_Acl_Role_Interface
+{
+ /**
+ * Unique id of Role
+ *
+ * @var string
+ */
+ protected $_roleId;
+
+ /**
+ * Sets the Role identifier
+ *
+ * @param string $id
+ * @return void
+ */
+ public function __construct($roleId)
+ {
+ $this->_roleId = (string) $roleId;
+ }
+
+ /**
+ * Defined by Zend_Acl_Role_Interface; returns the Role identifier
+ *
+ * @return string
+ */
+ public function getRoleId()
+ {
+ return $this->_roleId;
+ }
+
+}
diff --git a/libs/Zend/Acl/Role/Interface.php b/libs/Zend/Acl/Role/Interface.php
new file mode 100755
index 0000000000..cd1181f16c
--- /dev/null
+++ b/libs/Zend/Acl/Role/Interface.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 2797 2007-01-16 01:35:30Z bkarwin $
+ */
+
+
+/**
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Acl_Role_Interface
+{
+ /**
+ * Returns the string identifier of the Role
+ *
+ * @return string
+ */
+ public function getRoleId();
+}
diff --git a/libs/Zend/Acl/Role/Registry.php b/libs/Zend/Acl/Role/Registry.php
new file mode 100755
index 0000000000..2037594178
--- /dev/null
+++ b/libs/Zend/Acl/Role/Registry.php
@@ -0,0 +1,249 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Registry.php 2797 2007-01-16 01:35:30Z bkarwin $
+ */
+
+
+/**
+ * Zend_Acl_Role_Interface
+ */
+require_once 'Zend/Acl/Role/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Acl_Role_Registry
+{
+ /**
+ * Internal Role registry data storage
+ *
+ * @var array
+ */
+ protected $_roles = array();
+
+ /**
+ * Adds a Role having an identifier unique to the registry
+ *
+ * The $parents parameter may be a reference to, or the string identifier for,
+ * a Role existing in the registry, or $parents may be passed as an array of
+ * these - mixing string identifiers and objects is ok - to indicate the Roles
+ * from which the newly added Role will directly inherit.
+ *
+ * In order to resolve potential ambiguities with conflicting rules inherited
+ * from different parents, the most recently added parent takes precedence over
+ * parents that were previously added. In other words, the first parent added
+ * will have the least priority, and the last parent added will have the
+ * highest priority.
+ *
+ * @param Zend_Acl_Role_Interface $role
+ * @param Zend_Acl_Role_Interface|string|array $parents
+ * @throws Zend_Acl_Role_Registry_Exception
+ * @return Zend_Acl_Role_Registry Provides a fluent interface
+ */
+ public function add(Zend_Acl_Role_Interface $role, $parents = null)
+ {
+ $roleId = $role->getRoleId();
+
+ if ($this->has($roleId)) {
+ require_once 'Zend/Acl/Role/Registry/Exception.php';
+ throw new Zend_Acl_Role_Registry_Exception("Role id '$roleId' already exists in the registry");
+ }
+
+ $roleParents = array();
+
+ if (null !== $parents) {
+ if (!is_array($parents)) {
+ $parents = array($parents);
+ }
+ foreach ($parents as $parent) {
+ try {
+ if ($parent instanceof Zend_Acl_Role_Interface) {
+ $roleParentId = $parent->getRoleId();
+ } else {
+ $roleParentId = $parent;
+ }
+ $roleParent = $this->get($roleParentId);
+ } catch (Zend_Acl_Role_Registry_Exception $e) {
+ throw new Zend_Acl_Role_Registry_Exception("Parent Role id '$roleParentId' does not exist");
+ }
+ $roleParents[$roleParentId] = $roleParent;
+ $this->_roles[$roleParentId]['children'][$roleId] = $role;
+ }
+ }
+
+ $this->_roles[$roleId] = array(
+ 'instance' => $role,
+ 'parents' => $roleParents,
+ 'children' => array()
+ );
+
+ return $this;
+ }
+
+ /**
+ * Returns the identified Role
+ *
+ * The $role parameter can either be a Role or a Role identifier.
+ *
+ * @param Zend_Acl_Role_Interface|string $role
+ * @throws Zend_Acl_Role_Registry_Exception
+ * @return Zend_Acl_Role_Interface
+ */
+ public function get($role)
+ {
+ if ($role instanceof Zend_Acl_Role_Interface) {
+ $roleId = $role->getRoleId();
+ } else {
+ $roleId = (string) $role;
+ }
+
+ if (!$this->has($role)) {
+ require_once 'Zend/Acl/Role/Registry/Exception.php';
+ throw new Zend_Acl_Role_Registry_Exception("Role '$roleId' not found");
+ }
+
+ return $this->_roles[$roleId]['instance'];
+ }
+
+ /**
+ * Returns true if and only if the Role exists in the registry
+ *
+ * The $role parameter can either be a Role or a Role identifier.
+ *
+ * @param Zend_Acl_Role_Interface|string $role
+ * @return boolean
+ */
+ public function has($role)
+ {
+ if ($role instanceof Zend_Acl_Role_Interface) {
+ $roleId = $role->getRoleId();
+ } else {
+ $roleId = (string) $role;
+ }
+
+ return isset($this->_roles[$roleId]);
+ }
+
+ /**
+ * Returns an array of an existing Role's parents
+ *
+ * The array keys are the identifiers of the parent Roles, and the values are
+ * the parent Role instances. The parent Roles are ordered in this array by
+ * ascending priority. The highest priority parent Role, last in the array,
+ * corresponds with the parent Role most recently added.
+ *
+ * If the Role does not have any parents, then an empty array is returned.
+ *
+ * @param Zend_Acl_Role_Interface|string $role
+ * @uses Zend_Acl_Role_Registry::get()
+ * @return array
+ */
+ public function getParents($role)
+ {
+ $roleId = $this->get($role)->getRoleId();
+
+ return $this->_roles[$roleId]['parents'];
+ }
+
+ /**
+ * Returns true if and only if $role inherits from $inherit
+ *
+ * Both parameters may be either a Role or a Role identifier. If
+ * $onlyParents is true, then $role must inherit directly from
+ * $inherit in order to return true. By default, this method looks
+ * through the entire inheritance DAG to determine whether $role
+ * inherits from $inherit through its ancestor Roles.
+ *
+ * @param Zend_Acl_Role_Interface|string $role
+ * @param Zend_Acl_Role_Interface|string $inherit
+ * @param boolean $onlyParents
+ * @throws Zend_Acl_Role_Registry_Exception
+ * @return boolean
+ */
+ public function inherits($role, $inherit, $onlyParents = false)
+ {
+ try {
+ $roleId = $this->get($role)->getRoleId();
+ $inheritId = $this->get($inherit)->getRoleId();
+ } catch (Zend_Acl_Role_Registry_Exception $e) {
+ throw $e;
+ }
+
+ $inherits = isset($this->_roles[$roleId]['parents'][$inheritId]);
+
+ if ($inherits || $onlyParents) {
+ return $inherits;
+ }
+
+ foreach ($this->_roles[$roleId]['parents'] as $parentId => $parent) {
+ if ($this->inherits($parentId, $inheritId)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Removes the Role from the registry
+ *
+ * The $role parameter can either be a Role or a Role identifier.
+ *
+ * @param Zend_Acl_Role_Interface|string $role
+ * @throws Zend_Acl_Role_Registry_Exception
+ * @return Zend_Acl_Role_Registry Provides a fluent interface
+ */
+ public function remove($role)
+ {
+ try {
+ $roleId = $this->get($role)->getRoleId();
+ } catch (Zend_Acl_Role_Registry_Exception $e) {
+ throw $e;
+ }
+
+ foreach ($this->_roles[$roleId]['children'] as $childId => $child) {
+ unset($this->_roles[$childId]['parents'][$roleId]);
+ }
+ foreach ($this->_roles[$roleId]['parents'] as $parentId => $parent) {
+ unset($this->_roles[$parentId]['children'][$roleId]);
+ }
+
+ unset($this->_roles[$roleId]);
+
+ return $this;
+ }
+
+ /**
+ * Removes all Roles from the registry
+ *
+ * @return Zend_Acl_Role_Registry Provides a fluent interface
+ */
+ public function removeAll()
+ {
+ $this->_roles = array();
+
+ return $this;
+ }
+
+}
diff --git a/libs/Zend/Acl/Role/Registry/Exception.php b/libs/Zend/Acl/Role/Registry/Exception.php
new file mode 100755
index 0000000000..c6d07b26d4
--- /dev/null
+++ b/libs/Zend/Acl/Role/Registry/Exception.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Exception.php 2797 2007-01-16 01:35:30Z bkarwin $
+ */
+
+
+/**
+ * Zend_Acl_Exception
+ */
+require_once 'Zend/Acl/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Acl
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Acl_Role_Registry_Exception extends Zend_Acl_Exception
+{}
diff --git a/libs/Zend/Auth.php b/libs/Zend/Auth.php
new file mode 100755
index 0000000000..b9c726aac5
--- /dev/null
+++ b/libs/Zend/Auth.php
@@ -0,0 +1,162 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Auth.php 3467 2007-02-15 22:40:55Z darby $
+ */
+
+
+/**
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Auth
+{
+ /**
+ * Singleton instance
+ *
+ * @var Zend_Auth
+ */
+ protected static $_instance = null;
+
+ /**
+ * Persistent storage handler
+ *
+ * @var Zend_Auth_Storage_Interface
+ */
+ protected $_storage = null;
+
+ /**
+ * Singleton pattern implementation makes "new" unavailable
+ *
+ * @return void
+ */
+ private function __construct()
+ {}
+
+ /**
+ * Singleton pattern implementation makes "clone" unavailable
+ *
+ * @return void
+ */
+ private function __clone()
+ {}
+
+ /**
+ * Returns an instance of Zend_Auth
+ *
+ * Singleton pattern implementation
+ *
+ * @return Zend_Auth Provides a fluent interface
+ */
+ public static function getInstance()
+ {
+ if (null === self::$_instance) {
+ self::$_instance = new self();
+ }
+
+ return self::$_instance;
+ }
+
+ /**
+ * Returns the persistent storage handler
+ *
+ * Session storage is used by default unless a different storage adapter has been set.
+ *
+ * @return Zend_Auth_Storage_Interface
+ */
+ public function getStorage()
+ {
+ if (null === $this->_storage) {
+ /**
+ * @see Zend_Auth_Storage_Session
+ */
+ require_once 'Zend/Auth/Storage/Session.php';
+ $this->setStorage(new Zend_Auth_Storage_Session());
+ }
+
+ return $this->_storage;
+ }
+
+ /**
+ * Sets the persistent storage handler
+ *
+ * @param Zend_Auth_Storage_Interface $storage
+ * @return Zend_Auth Provides a fluent interface
+ */
+ public function setStorage(Zend_Auth_Storage_Interface $storage)
+ {
+ $this->_storage = $storage;
+ return $this;
+ }
+
+ /**
+ * Authenticates against the supplied adapter
+ *
+ * @param Zend_Auth_Adapter_Interface $adapter
+ * @return Zend_Auth_Result
+ */
+ public function authenticate(Zend_Auth_Adapter_Interface $adapter)
+ {
+ $result = $adapter->authenticate();
+
+ if ($result->isValid()) {
+ $this->getStorage()->write($result->getIdentity());
+ }
+
+ return $result;
+ }
+
+ /**
+ * Returns true if and only if an identity is available from storage
+ *
+ * @return boolean
+ */
+ public function hasIdentity()
+ {
+ return !$this->getStorage()->isEmpty();
+ }
+
+ /**
+ * Returns the identity from storage or null if no identity is available
+ *
+ * @return mixed|null
+ */
+ public function getIdentity()
+ {
+ $storage = $this->getStorage();
+
+ if ($storage->isEmpty()) {
+ return null;
+ }
+
+ return $storage->read();
+ }
+
+ /**
+ * Clears the identity from persistent storage
+ *
+ * @return void
+ */
+ public function clearIdentity()
+ {
+ $this->getStorage()->clear();
+ }
+}
diff --git a/libs/Zend/Auth/Adapter/DbTable.php b/libs/Zend/Auth/Adapter/DbTable.php
new file mode 100755
index 0000000000..d0cc4e18d8
--- /dev/null
+++ b/libs/Zend/Auth/Adapter/DbTable.php
@@ -0,0 +1,354 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @subpackage Zend_Auth_Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: DbTable.php 4246 2007-03-27 22:35:56Z ralph $
+ */
+
+
+/**
+ * @see Zend_Auth_Adapter_Interface
+ */
+require_once 'Zend/Auth/Adapter/Interface.php';
+
+
+/**
+ * @see Zend_Db_Adapter_Abstract
+ */
+require_once 'Zend/Db/Adapter/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Auth
+ * @subpackage Zend_Auth_Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Auth_Adapter_DbTable implements Zend_Auth_Adapter_Interface
+{
+ /**
+ * Database Connection
+ *
+ * @var Zend_Db_Adapter_Abstract
+ */
+ protected $_zendDb = null;
+
+ /**
+ * $_tableName - the table name to check
+ *
+ * @var string
+ */
+ protected $_tableName = null;
+
+ /**
+ * $_identityColumn - the column to use as the identity
+ *
+ * @var string
+ */
+ protected $_identityColumn = null;
+
+ /**
+ * $_credentialColumns - columns to be used as the credentials
+ *
+ * @var string
+ */
+ protected $_credentialColumn = null;
+
+ /**
+ * $_identity - Identity value
+ *
+ * @var string
+ */
+ protected $_identity = null;
+
+ /**
+ * $_credential - Credential values
+ *
+ * @var string
+ */
+ protected $_credential = null;
+
+ /**
+ * $_credentialTreatment - Treatment applied to the credential, such as MD5() or PASSWORD()
+ *
+ * @var string
+ */
+ protected $_credentialTreatment = null;
+
+ /**
+ * $_resultRow - Results of database authentication query
+ *
+ * @var array
+ */
+ protected $_resultRow = null;
+
+ /**
+ * __construct() - Sets configuration options
+ *
+ * @param Zend_Db_Adapter_Abstract $zendDb
+ * @param string $tableName
+ * @param string $identityColumn
+ * @param string $credentialColumn
+ * @param string $credentialTreatment
+ * @return void
+ */
+ public function __construct(Zend_Db_Adapter_Abstract $zendDb, $tableName = null, $identityColumn = null,
+ $credentialColumn = null, $credentialTreatment = null)
+ {
+ $this->_zendDb = $zendDb;
+
+ if (null !== $tableName) {
+ $this->setTableName($tableName);
+ }
+
+ if (null !== $identityColumn) {
+ $this->setIdentityColumn($identityColumn);
+ }
+
+ if (null !== $credentialColumn) {
+ $this->setCredentialColumn($credentialColumn);
+ }
+
+ if (null !== $credentialTreatment) {
+ $this->setCredentialTreatment($credentialTreatment);
+ }
+ }
+
+ /**
+ * setTableName() - set the table name to be used in the select query
+ *
+ * @param string $tableName
+ * @return Zend_Auth_Adapter_DbTable
+ */
+ public function setTableName($tableName)
+ {
+ $this->_tableName = $tableName;
+ return $this;
+ }
+
+ /**
+ * setIdentityColumn() - set the column name to be used as the identity column
+ *
+ * @param string $identityColumn
+ * @return Zend_Auth_Adapter_DbTable
+ */
+ public function setIdentityColumn($identityColumn)
+ {
+ $this->_identityColumn = $identityColumn;
+ return $this;
+ }
+
+ /**
+ * setCredentialColumn() - set the column name to be used as the credential column
+ *
+ * @param string $credentialColumn
+ * @return Zend_Auth_Adapter_DbTable
+ */
+ public function setCredentialColumn($credentialColumn)
+ {
+ $this->_credentialColumn = $credentialColumn;
+ return $this;
+ }
+
+ /**
+ * setCredentialTreatment() - allows the developer to pass a parameterized string that is
+ * used to transform or treat the input credential data
+ *
+ * In many cases, passwords and other sensitive data are encrypted, hashed, encoded,
+ * obscured, or otherwise treated through some function or algorithm. By specifying a
+ * parameterized treatment string with this method, a developer may apply arbitrary SQL
+ * upon input credential data.
+ *
+ * Examples:
+ *
+ * 'PASSWORD(?)'
+ * 'MD5(?)'
+ *
+ * @param string $treatment
+ * @return Zend_Auth_Adapter_DbTable
+ */
+ public function setCredentialTreatment($treatment)
+ {
+ $this->_credentialTreatment = $treatment;
+ return $this;
+ }
+
+ /**
+ * setIdentity() - set the value to be used as the identity
+ *
+ * @param string $value
+ * @return Zend_Auth_Adapter_DbTable
+ */
+ public function setIdentity($value)
+ {
+ $this->_identity = $value;
+ return $this;
+ }
+
+ /**
+ * setCredential() - set the credential value to be used, optionally can specify a treatment
+ * to be used, should be supplied in parameterized form, such as 'MD5(?)' or 'PASSWORD(?)'
+ *
+ * @param string $credential
+ * @return Zend_Auth_Adapter_DbTable
+ */
+ public function setCredential($credential)
+ {
+ $this->_credential = $credential;
+ return $this;
+ }
+
+ /**
+ * getResultRowObject() - Returns the result row as a stdClass object
+ *
+ * @param string|array $returnColumns
+ * @param string|array $omitColumns
+ * @return stdClass
+ */
+ public function getResultRowObject($returnColumns = null, $omitColumns = null)
+ {
+ $returnObject = new stdClass();
+
+ if (null !== $returnColumns) {
+
+ $availableColumns = array_keys($this->_resultRow);
+ foreach ( (array) $returnColumns as $returnColumn) {
+ if (in_array($returnColumn, $availableColumns)) {
+ $returnObject->{$returnColumn} = $this->_resultRow[$returnColumn];
+ }
+ }
+ return $returnObject;
+
+ } elseif (null !== $omitColumns) {
+
+ $omitColumns = (array) $omitColumns;
+ foreach ($this->_resultRow as $resultColumn => $resultValue) {
+ if (!in_array($resultColumn, $omitColumns)) {
+ $returnObject->{$resultColumn} = $resultValue;
+ }
+ }
+ return $returnObject;
+
+ } else {
+
+ foreach ($this->_resultRow as $resultColumn => $resultValue) {
+ $returnObject->{$resultColumn} = $resultValue;
+ }
+ return $returnObject;
+
+ }
+ }
+
+ /**
+ * authenticate() - defined by Zend_Auth_Adapter_Interface.
+ *
+ * @throws Zend_Auth_Adapter_Exception if answering the authentication query is impossible
+ * @return Zend_Auth_Result
+ */
+ public function authenticate()
+ {
+ $exception = null;
+
+ if ($this->_tableName == '') {
+ $exception = 'A table must be supplied for the Zend_Auth_Adapter_DbTable authentication adapter.';
+ } elseif ($this->_identityColumn == '') {
+ $exception = 'An identity column must be supplied for the Zend_Auth_Adapter_DbTable authentication adapter.';
+ } elseif ($this->_credentialColumn == '') {
+ $exception = 'A credential column must be supplied for the Zend_Auth_Adapter_DbTable authentication adapter.';
+ } elseif ($this->_identity == '') {
+ $exception = 'A value for the identity was not provided prior to authentication with Zend_Auth_Adapter_DbTable.';
+ } elseif ($this->_credential === null) {
+ $exception = 'A credential value was not provided prior to authentication with Zend_Auth_Adapter_DbTable.';
+ }
+
+ if (null !== $exception) {
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception($exception);
+ }
+
+ // create result array
+ $authResult = array(
+ 'code' => Zend_Auth_Result::FAILURE,
+ 'identity' => $this->_identity,
+ 'messages' => array()
+ );
+
+
+ // build credential expression
+ if (empty($this->_credentialTreatment) || (strpos($this->_credentialTreatment, "?") === false)) {
+ $this->_credentialTreatment = '?';
+ }
+
+ $credentialExpression = new Zend_Db_Expr(
+ $this->_zendDb->quoteInto(
+ $this->_zendDb->quoteIdentifier($this->_credentialColumn)
+ . ' = ' . $this->_credentialTreatment, $this->_credential
+ )
+ . ' AS zend_auth_credential_match'
+ );
+
+ // get select
+ $dbSelect = $this->_zendDb->select();
+ $dbSelect->from($this->_tableName, array('*', $credentialExpression))
+ ->where($this->_zendDb->quoteIdentifier($this->_identityColumn) . ' = ?', $this->_identity);
+
+ // query for the identity
+ try {
+ $resultIdentities = $this->_zendDb->fetchAll($dbSelect->__toString());
+ } catch (Exception $e) {
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception('The supplied parameters to Zend_Auth_Adapter_DbTable failed to '
+ . 'produce a valid sql statement, please check table and column names '
+ . 'for validity.');
+ }
+
+ if (count($resultIdentities) < 1) {
+ $authResult['code'] = Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND;
+ $authResult['messages'][] = 'A record with the supplied identity could not be found.';
+ return new Zend_Auth_Result($authResult['code'], $authResult['identity'], $authResult['messages']);
+ } elseif (count($resultIdentities) > 1) {
+ $authResult['code'] = Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS;
+ $authResult['messages'][] = 'More than one record matches the supplied identity.';
+ return new Zend_Auth_Result($authResult['code'], $authResult['identity'], $authResult['messages']);
+ }
+
+ $resultIdentity = $resultIdentities[0];
+
+ if ($resultIdentity['zend_auth_credential_match'] != '1') {
+ $authResult['code'] = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID;
+ $authResult['messages'][] = 'Supplied credential is invalid.';
+ return new Zend_Auth_Result($authResult['code'], $authResult['identity'], $authResult['messages']);
+ }
+
+ unset($resultIdentity['zend_auth_credential_match']);
+ $this->_resultRow = $resultIdentity;
+
+ $authResult['code'] = Zend_Auth_Result::SUCCESS;
+ $authResult['messages'][] = 'Authentication successful.';
+ return new Zend_Auth_Result($authResult['code'], $authResult['identity'], $authResult['messages']);
+ }
+
+} \ No newline at end of file
diff --git a/libs/Zend/Auth/Adapter/Digest.php b/libs/Zend/Auth/Adapter/Digest.php
new file mode 100755
index 0000000000..31131a1652
--- /dev/null
+++ b/libs/Zend/Auth/Adapter/Digest.php
@@ -0,0 +1,229 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Digest.php 4194 2007-03-22 23:50:34Z darby $
+ */
+
+
+/**
+ * @see Zend_Auth_Adapter_Interface
+ */
+require_once 'Zend/Auth/Adapter/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Auth_Adapter_Digest implements Zend_Auth_Adapter_Interface
+{
+ /**
+ * Filename against which authentication queries are performed
+ *
+ * @var string
+ */
+ protected $_filename;
+
+ /**
+ * Digest authentication realm
+ *
+ * @var string
+ */
+ protected $_realm;
+
+ /**
+ * Digest authentication user
+ *
+ * @var string
+ */
+ protected $_username;
+
+ /**
+ * Password for the user of the realm
+ *
+ * @var string
+ */
+ protected $_password;
+
+ /**
+ * Sets adapter options
+ *
+ * @param mixed $filename
+ * @param mixed $realm
+ * @param mixed $username
+ * @param mixed $password
+ * @return void
+ */
+ public function __construct($filename = null, $realm = null, $username = null, $password = null)
+ {
+ $options = array('filename', 'realm', 'username', 'password');
+ foreach ($options as $option) {
+ if (null !== $$option) {
+ $methodName = 'set' . ucfirst($option);
+ $this->$methodName($$option);
+ }
+ }
+ }
+
+ /**
+ * Returns the filename option value or null if it has not yet been set
+ *
+ * @return string|null
+ */
+ public function getFilename()
+ {
+ return $this->_filename;
+ }
+
+ /**
+ * Sets the filename option value
+ *
+ * @param mixed $filename
+ * @return Zend_Auth_Adapter_Digest Provides a fluent interface
+ */
+ public function setFilename($filename)
+ {
+ $this->_filename = (string) $filename;
+ return $this;
+ }
+
+ /**
+ * Returns the realm option value or null if it has not yet been set
+ *
+ * @return string|null
+ */
+ public function getRealm()
+ {
+ return $this->_realm;
+ }
+
+ /**
+ * Sets the realm option value
+ *
+ * @param mixed $realm
+ * @return Zend_Auth_Adapter_Digest Provides a fluent interface
+ */
+ public function setRealm($realm)
+ {
+ $this->_realm = (string) $realm;
+ return $this;
+ }
+
+ /**
+ * Returns the username option value or null if it has not yet been set
+ *
+ * @return string|null
+ */
+ public function getUsername()
+ {
+ return $this->_username;
+ }
+
+ /**
+ * Sets the username option value
+ *
+ * @param mixed $username
+ * @return Zend_Auth_Adapter_Digest Provides a fluent interface
+ */
+ public function setUsername($username)
+ {
+ $this->_username = (string) $username;
+ return $this;
+ }
+
+ /**
+ * Returns the password option value or null if it has not yet been set
+ *
+ * @return string|null
+ */
+ public function getPassword()
+ {
+ return $this->_password;
+ }
+
+ /**
+ * Sets the password option value
+ *
+ * @param mixed $password
+ * @return Zend_Auth_Adapter_Digest Provides a fluent interface
+ */
+ public function setPassword($password)
+ {
+ $this->_password = (string) $password;
+ return $this;
+ }
+
+ /**
+ * Defined by Zend_Auth_Adapter_Interface
+ *
+ * @throws Zend_Auth_Adapter_Exception
+ * @return Zend_Auth_Result
+ */
+ public function authenticate()
+ {
+ $optionsRequired = array('filename', 'realm', 'username', 'password');
+ foreach ($optionsRequired as $optionRequired) {
+ if (null === $this->{"_$optionRequired"}) {
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception("Option '$optionRequired' must be set before authentication");
+ }
+ }
+
+ if (false === ($fileHandle = @fopen($this->_filename, 'r'))) {
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception("Cannot open '$this->_filename' for reading");
+ }
+
+ $id = "$this->_username:$this->_realm";
+ $idLength = strlen($id);
+
+ $result = array(
+ 'code' => Zend_Auth_Result::FAILURE,
+ 'identity' => array(
+ 'realm' => $this->_realm,
+ 'username' => $this->_username,
+ ),
+ 'messages' => array()
+ );
+
+ while ($line = trim(fgets($fileHandle))) {
+ if (substr($line, 0, $idLength) === $id) {
+ if (substr($line, -32) === md5("$this->_username:$this->_realm:$this->_password")) {
+ $result['code'] = Zend_Auth_Result::SUCCESS;
+ } else {
+ $result['code'] = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID;
+ $result['messages'][] = 'Password incorrect';
+ }
+ return new Zend_Auth_Result($result['code'], $result['identity'], $result['messages']);
+ }
+ }
+
+ $result['code'] = Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND;
+ $result['messages'][] = "Username '$this->_username' and realm '$this->_realm' combination not found";
+ return new Zend_Auth_Result($result['code'], $result['identity'], $result['messages']);
+ }
+}
diff --git a/libs/Zend/Auth/Adapter/Exception.php b/libs/Zend/Auth/Adapter/Exception.php
new file mode 100755
index 0000000000..8aa8ba4f11
--- /dev/null
+++ b/libs/Zend/Auth/Adapter/Exception.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Exception.php 2794 2007-01-16 01:29:51Z bkarwin $
+ */
+
+
+/**
+ * Zend_Auth_Exception
+ */
+require_once 'Zend/Auth/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Auth_Adapter_Exception extends Zend_Auth_Exception
+{}
diff --git a/libs/Zend/Auth/Adapter/Http.php b/libs/Zend/Auth/Adapter/Http.php
new file mode 100755
index 0000000000..43decf5336
--- /dev/null
+++ b/libs/Zend/Auth/Adapter/Http.php
@@ -0,0 +1,834 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @subpackage Zend_Auth_Adapter_Http
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Http.php 5260 2007-06-12 03:54:44Z gearhead $
+ */
+
+
+/**
+ * @see Zend_Auth_Adapter_Interface
+ */
+require_once 'Zend/Auth/Adapter/Interface.php';
+
+
+/**
+ * HTTP Authentication Adapter
+ *
+ * Implements a pretty good chunk of RFC 2617.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @subpackage Zend_Auth_Adapter_Http
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @todo Support auth-int
+ * @todo Track nonces, nonce-count, opaque for replay protection and stale support
+ * @todo Support Authentication-Info header
+ */
+class Zend_Auth_Adapter_Http implements Zend_Auth_Adapter_Interface
+{
+ /**
+ * Reference to the HTTP Request object
+ *
+ * @var Zend_Controller_Request_Http
+ */
+ protected $_request;
+
+ /**
+ * Reference to the HTTP Response object
+ *
+ * @var Zend_Controller_Response_Http
+ */
+ protected $_response;
+
+ /**
+ * Object that looks up user credentials for the Basic scheme
+ *
+ * @var Zend_Auth_Adapter_Http_Resolver_Interface
+ */
+ protected $_basicResolver;
+
+ /**
+ * Object that looks up user credentials for the Digest scheme
+ *
+ * @var Zend_Auth_Adapter_Http_Resolver_Interface
+ */
+ protected $_digestResolver;
+
+ /**
+ * List of authentication schemes supported by this class
+ *
+ * @var array
+ */
+ protected $_supportedSchemes = array('basic', 'digest');
+
+ /**
+ * List of schemes this class will accept from the client
+ *
+ * @var array
+ */
+ protected $_acceptSchemes;
+
+ /**
+ * Space-delimited list of protected domains for Digest Auth
+ *
+ * @var string
+ */
+ protected $_domains;
+
+ /**
+ * The protection realm to use
+ *
+ * @var string
+ */
+ protected $_realm;
+
+ /**
+ * Nonce timeout period
+ *
+ * @var integer
+ */
+ protected $_nonceTimeout;
+
+ /**
+ * Whether to send the opaque value in the header. True by default
+ *
+ * @var boolean
+ */
+ protected $_useOpaque;
+
+ /**
+ * List of the supported digest algorithms. I want to support both MD5 and
+ * MD5-sess, but MD5-sess won't make it into the first version.
+ *
+ * @var array
+ */
+ protected $_supportedAlgos = array('MD5');
+
+ /**
+ * The actual algorithm to use. Defaults to MD5
+ *
+ * @var string
+ */
+ protected $_algo;
+
+ /**
+ * List of supported qop options. My intetion is to support both 'auth' and
+ * 'auth-int', but 'auth-int' won't make it into the first version.
+ *
+ * @var array
+ */
+ protected $_supportedQops = array('auth');
+
+ /**
+ * Whether or not to do Proxy Authentication instead of origin server
+ * authentication (send 407's instead of 401's). Off by default.
+ *
+ * @var boolean
+ */
+ protected $_imaProxy;
+
+ /**
+ * Flag indicating the client is IE and didn't bother to return the opaque string
+ *
+ * @var boolean
+ */
+ protected $_ieNoOpaque;
+
+ /**
+ * Constructor
+ *
+ * @param array $config Configuration settings:
+ * 'accept_schemes' => 'basic'|'digest'|'basic digest'
+ * 'realm' => <string>
+ * 'digest_domains' => <string> Space-delimited list of URIs
+ * 'nonce_timeout' => <int>
+ * 'use_opaque' => <bool> Whether to send the opaque value in the header
+ * 'alogrithm' => <string> See $_supportedAlgos. Default: MD5
+ * 'proxy_auth' => <bool> Whether to do authentication as a Proxy
+ * @throws Zend_Auth_Adapter_Exception
+ * @return void
+ */
+ public function __construct(array $config)
+ {
+ $this->_request = null;
+ $this->_response = null;
+ $this->_ieNoOpaque = false;
+
+
+ if (empty($config['accept_schemes'])) {
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception('Config key \'accept_schemes\' is required');
+ }
+
+ $schemes = explode(' ', $config['accept_schemes']);
+ $this->_acceptSchemes = array_intersect($schemes, $this->_supportedSchemes);
+ if (empty($this->_acceptSchemes)) {
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception('No supported schemes given in \'accept_schemes\'. Valid values: '
+ . implode(', ', $this->_supportedSchemes));
+ }
+
+ // Double-quotes are used to delimit the realm string in the HTTP header,
+ // and colons are field delimiters in the password file.
+ if (empty($config['realm']) ||
+ !ctype_print($config['realm']) ||
+ strpos($config['realm'], ':') !== false ||
+ strpos($config['realm'], '"') !== false) {
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception('Config key \'realm\' is required, and must contain only printable '
+ . 'characters, excluding quotation marks and colons');
+ } else {
+ $this->_realm = $config['realm'];
+ }
+
+ if (in_array('digest', $this->_acceptSchemes)) {
+ if (empty($config['digest_domains']) ||
+ !ctype_print($config['digest_domains']) ||
+ strpos($config['digest_domains'], '"') !== false) {
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception('Config key \'digest_domains\' is required, and must contain '
+ . 'only printable characters, excluding quotation marks');
+ } else {
+ $this->_domains = $config['digest_domains'];
+ }
+
+ if (empty($config['nonce_timeout']) ||
+ !is_numeric($config['nonce_timeout'])) {
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception('Config key \'nonce_timeout\' is required, and must be an '
+ . 'integer');
+ } else {
+ $this->_nonceTimeout = (int) $config['nonce_timeout'];
+ }
+
+ // We use the opaque value unless explicitly told not to
+ if (isset($config['use_opaque']) && false == (bool) $config['use_opaque']) {
+ $this->_useOpaque = false;
+ } else {
+ $this->_useOpaque = true;
+ }
+
+ if (isset($config['algorithm']) && in_array($config['algorithm'], $this->_supportedAlgos)) {
+ $this->_algo = $config['algorithm'];
+ } else {
+ $this->_algo = 'MD5';
+ }
+ }
+
+ // Don't be a proxy unless explicitly told to do so
+ if (isset($config['proxy_auth']) && true == (bool) $config['proxy_auth']) {
+ $this->_imaProxy = true; // I'm a Proxy
+ } else {
+ $this->_imaProxy = false;
+ }
+ }
+
+ /**
+ * Setter for the _basicResolver property
+ *
+ * @param Zend_Auth_Adapter_Http_Resolver_Interface $resolver
+ * @return Zend_Auth_Adapter_Http Provides a fluent interface
+ */
+ public function setBasicResolver(Zend_Auth_Adapter_Http_Resolver_Interface $resolver)
+ {
+ $this->_basicResolver = $resolver;
+
+ return $this;
+ }
+
+ /**
+ * Getter for the _basicResolver property
+ *
+ * @return Zend_Auth_Adapter_Http_Resolver_Interface
+ */
+ public function getBasicResolver()
+ {
+ return $this->_basicResolver;
+ }
+
+ /**
+ * Setter for the _digestResolver property
+ *
+ * @param Zend_Auth_Adapter_Http_Resolver_Interface $resolver
+ * @return Zend_Auth_Adapter_Http Provides a fluent interface
+ */
+ public function setDigestResolver(Zend_Auth_Adapter_Http_Resolver_Interface $resolver)
+ {
+ $this->_digestResolver = $resolver;
+
+ return $this;
+ }
+
+ /**
+ * Getter for the _digestResolver property
+ *
+ * @return Zend_Auth_Adapter_Http_Resolver_Interface
+ */
+ public function getDigestResolver()
+ {
+ return $this->_digestResolver;
+ }
+
+ /**
+ * Setter for the Request object
+ *
+ * @param Zend_Controller_Request_Http $request
+ * @return Zend_Auth_Adapter_Http Provides a fluent interface
+ */
+ public function setRequest(Zend_Controller_Request_Http $request)
+ {
+ $this->_request = $request;
+
+ return $this;
+ }
+
+ /**
+ * Getter for the Request object
+ *
+ * @return Zend_Controller_Request_Http
+ */
+ public function getRequest()
+ {
+ return $this->_request;
+ }
+
+ /**
+ * Setter for the Response object
+ *
+ * @param Zend_Controller_Response_Http $response
+ * @return Zend_Auth_Adapter_Http Provides a fluent interface
+ */
+ public function setResponse(Zend_Controller_Response_Http $response)
+ {
+ $this->_response = $response;
+
+ return $this;
+ }
+
+ /**
+ * Getter for the Response object
+ *
+ * @return Zend_Controller_Response_Http
+ */
+ public function getResponse()
+ {
+ return $this->_response;
+ }
+
+ /**
+ * Authenticate
+ *
+ * @return Zend_Auth_Result
+ * @throws Zend_Auth_Adapter_Exception
+ */
+ public function authenticate()
+ {
+ if (empty($this->_request) ||
+ empty($this->_response)) {
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception('Request and Response objects must be set before calling '
+ . 'authenticate()');
+ }
+
+ if ($this->_imaProxy) {
+ $getHeader = 'Proxy-Authorization';
+ } else {
+ $getHeader = 'Authorization';
+ }
+
+ $authHeader = $this->_request->getHeader($getHeader);
+ if (!$authHeader) {
+ return $this->_challengeClient();
+ }
+
+ list($clientScheme) = explode(' ', $authHeader);
+ $clientScheme = strtolower($clientScheme);
+
+ if (!in_array($clientScheme, $this->_supportedSchemes)) {
+ $this->_response->setHttpResponseCode(400);
+ return new Zend_Auth_Result(
+ Zend_Auth_Result::FAILURE_UNCATEGORIZED,
+ array(),
+ array('Client requested an unsupported authentication scheme')
+ );
+ }
+
+ // The server can issue multiple challenges, but the client should
+ // answer with only one selected auth scheme.
+ switch ($clientScheme) {
+ case 'basic':
+ $result = $this->_basicAuth($authHeader);
+ break;
+ case 'digest':
+ $result = $this->_digestAuth($authHeader);
+ break;
+ default:
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception('Unsupported authentication scheme');
+ }
+
+ return $result;
+ }
+
+ /**
+ * Challenge Client
+ *
+ * Sets a 401 or 407 Unauthorized response code, and creates the
+ * appropriate Authenticate header(s) to prompt for credentials.
+ *
+ * @return Zend_Auth_Result Always returns a non-identity Auth result
+ */
+ protected function _challengeClient()
+ {
+ if ($this->_imaProxy) {
+ $statusCode = 407;
+ $headerName = 'Proxy-Authenticate';
+ } else {
+ $statusCode = 401;
+ $headerName = 'WWW-Authenticate';
+ }
+
+ $this->_response->setHttpResponseCode($statusCode);
+
+ // Send a challenge in each acceptable authentication scheme
+ if (in_array('basic', $this->_acceptSchemes)) {
+ $this->_response->setHeader($headerName, $this->_basicHeader());
+ }
+ if (in_array('digest', $this->_acceptSchemes)) {
+ $this->_response->setHeader($headerName, $this->_digestHeader());
+ }
+ return new Zend_Auth_Result(
+ Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID,
+ array(),
+ array('Invalid or absent credentials; challenging client')
+ );
+ }
+
+ /**
+ * Basic Header
+ *
+ * Generates a Proxy- or WWW-Authenticate header value in the Basic
+ * authentication scheme.
+ *
+ * @return string Authenticate header value
+ */
+ protected function _basicHeader()
+ {
+ return 'Basic realm="' . $this->_realm . '"';
+ }
+
+ /**
+ * Digest Header
+ *
+ * Generates a Proxy- or WWW-Authenticate header value in the Digest
+ * authentication scheme.
+ *
+ * @return string Authenticate header value
+ */
+ protected function _digestHeader()
+ {
+ $wwwauth = 'Digest realm="' . $this->_realm . '", '
+ . 'domain="' . $this->_domains . '", '
+ . 'nonce="' . $this->_calcNonce() . '", '
+ . ($this->_useOpaque ? 'opaque="' . $this->_calcOpaque() . '", ' : '')
+ . 'algorithm="' . $this->_algo . '", '
+ . 'qop="' . implode(',', $this->_supportedQops) . '"';
+
+ return $wwwauth;
+ }
+
+ /**
+ * Basic Authentication
+ *
+ * @param string $header Client's Authorization header
+ * @throws Zend_Auth_Adapter_Exception
+ * @return Zend_Auth_Result
+ */
+ protected function _basicAuth($header)
+ {
+ if (empty($header)) {
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception('The value of the client Authorization header is required');
+ }
+ if (empty($this->_basicResolver)) {
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception('A basicResolver object must be set before doing Basic '
+ . 'authentication');
+ }
+
+ // Decode the Authorization header
+ $auth = substr($header, strlen('Basic '));
+ $auth = base64_decode($auth);
+ if (!$auth) {
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception('Unable to base64_decode Authorization header value');
+ }
+
+ // See ZF-1253. Validate the credentials the same way the digest
+ // implementation does. If invalid credentials are detected,
+ // re-challenge the client.
+ if (!ctype_print($auth)) {
+ return $this->_challengeClient();
+ }
+ // Fix for ZF-1515: Now re-challenges on empty username or password
+ $creds = array_filter(explode(':', $auth));
+ if (count($creds) != 2) {
+ return $this->_challengeClient();
+ }
+
+ $password = $this->_basicResolver->resolve($creds[0], $this->_realm);
+ if ($password && $password == $creds[1]) {
+ $identity = array('username'=>$creds[0], 'realm'=>$this->_realm);
+ return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $identity);
+ } else {
+ return $this->_challengeClient();
+ }
+ }
+
+ /**
+ * Digest Authentication
+ *
+ * @param string $header Client's Authorization header
+ * @throws Zend_Auth_Adapter_Exception
+ * @return Zend_Auth_Result Valid auth result only on successful auth
+ */
+ protected function _digestAuth($header)
+ {
+ if (empty($header)) {
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception('The value of the client Authorization header is required');
+ }
+ if (empty($this->_digestResolver)) {
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception('A digestResolver object must be set before doing Digest authentication');
+ }
+
+ $data = $this->_parseDigestAuth($header);
+ if ($data === false) {
+ $this->_response->setHttpResponseCode(400);
+ return new Zend_Auth_Result(
+ Zend_Auth_Result::FAILURE_UNCATEGORIZED,
+ array(),
+ array('Invalid Authorization header format')
+ );
+ }
+
+ // See ZF-1052. This code was a bit too unforgiving of invalid
+ // usernames. Now, if the username is bad, we re-challenge the client.
+ if ('::invalid::' == $data['username']) {
+ return $this->_challengeClient();
+ }
+
+ // Verify that the client sent back the same nonce
+ if ($this->_calcNonce() != $data['nonce']) {
+ return $this->_challengeClient();
+ }
+ // The opaque value is also required to match, but of course IE doesn't
+ // play ball.
+ if (!$this->_ieNoOpaque && $this->_calcOpaque() != $data['opaque']) {
+ return $this->_challengeClient();
+ }
+
+ // Look up the user's password hash. If not found, deny access.
+ // This makes no assumptions about how the password hash was
+ // constructed beyond that it must have been built in such a way as
+ // to be recreatable with the current settings of this object.
+ $ha1 = $this->_digestResolver->resolve($data['username'], $data['realm']);
+ if ($ha1 === false) {
+ return $this->_challengeClient();
+ }
+
+ // If MD5-sess is used, a1 value is made of the user's password
+ // hash with the server and client nonce appended, separated by
+ // colons.
+ if ($this->_algo == 'MD5-sess') {
+ $ha1 = hash('md5', $ha1 . ':' . $data['nonce'] . ':' . $data['cnonce']);
+ }
+
+ // Calculate h(a2). The value of this hash depends on the qop
+ // option selected by the client and the supported hash functions
+ switch ($data['qop']) {
+ case 'auth':
+ $a2 = $this->_request->getMethod() . ':' . $data['uri'];
+ break;
+ case 'auth-int':
+ // Should be REQUEST_METHOD . ':' . uri . ':' . hash(entity-body),
+ // but this isn't supported yet, so fall through to default case
+ default:
+ /**
+ * @see Zend_Auth_Adapter_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Exception.php';
+ throw new Zend_Auth_Adapter_Exception('Client requested an unsupported qop option');
+ }
+ // Using hash() should make parameterizing the hash algorithm
+ // easier
+ $ha2 = hash('md5', $a2);
+
+
+ // Calculate the server's version of the request-digest. This must
+ // match $data['response']. See RFC 2617, section 3.2.2.1
+ $message = $data['nonce'] . ':' . $data['nc'] . ':' . $data['cnonce'] . ':' . $data['qop'] . ':' . $ha2;
+ $digest = hash('md5', $ha1 . ':' . $message);
+
+ // If our digest matches the client's let them in, otherwise return
+ // a 401 code and exit to prevent access to the protected resource.
+ if ($digest == $data['response']) {
+ $identity = array('username'=>$data['username'], 'realm'=>$data['realm']);
+ return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $identity);
+ } else {
+ return $this->_challengeClient();
+ }
+ }
+
+ /**
+ * Calculate Nonce
+ *
+ * @return string The nonce value
+ */
+ protected function _calcNonce()
+ {
+ // Once subtle consequence of this timeout calculation is that it
+ // actually divides all of time into _nonceTimeout-sized sections, such
+ // that the value of timeout is the point in time of the next
+ // approaching "boundary" of a section. This allows the server to
+ // consistently generate the same timeout (and hence the same nonce
+ // value) across requests, but only as long as one of those
+ // "boundaries" is not crossed between requests. If that happens, the
+ // nonce will change on its own, and effectively log the user out. This
+ // would be surprising if the user just logged in.
+ $timeout = ceil(time() / $this->_nonceTimeout) * $this->_nonceTimeout;
+
+ $nonce = hash('md5', $timeout . ':' . $this->_request->getServer('HTTP_USER_AGENT') . ':' . __CLASS__);
+ return $nonce;
+ }
+
+ /**
+ * Calculate Opaque
+ *
+ * The opaque string can be anything; the client must return it exactly as
+ * it was sent. It may be useful to store data in this string in some
+ * applications. Ideally, a new value for this would be generated each time
+ * a WWW-Authenticate header is sent (in order to reduce predictability),
+ * but we would have to be able to create the same exact value across at
+ * least two separate requests from the same client.
+ *
+ * @return string The opaque value
+ */
+ protected function _calcOpaque()
+ {
+ return hash('md5', 'Opaque Data:' . __CLASS__);
+ }
+
+ /**
+ * Parse Digest Authorization header
+ *
+ * @param string $header Client's Authorization: HTTP header
+ * @return array|false Data elements from header, or false if any part of
+ * the header is invalid
+ */
+ protected function _parseDigestAuth($header)
+ {
+ $temp = null;
+ $data = array();
+
+ // See ZF-1052. Detect invalid usernames instead of just returning a
+ // 400 code.
+ $ret = preg_match('/username="([^"]+)"/', $header, $temp);
+ if (!$ret || empty($temp[1])
+ || !ctype_print($temp[1])
+ || strpos($temp[1], ':') !== false) {
+ $data['username'] = '::invalid::';
+ } else {
+ $data['username'] = $temp[1];
+ }
+ $temp = null;
+
+ $ret = preg_match('/realm="([^"]+)"/', $header, $temp);
+ if (!$ret || empty($temp[1])) {
+ return false;
+ }
+ if (!ctype_print($temp[1]) || strpos($temp[1], ':') !== false) {
+ return false;
+ } else {
+ $data['realm'] = $temp[1];
+ }
+ $temp = null;
+
+ $ret = preg_match('/nonce="([^"]+)"/', $header, $temp);
+ if (!$ret || empty($temp[1])) {
+ return false;
+ }
+ if (!ctype_xdigit($temp[1])) {
+ return false;
+ } else {
+ $data['nonce'] = $temp[1];
+ }
+ $temp = null;
+
+ $ret = preg_match('/uri="([^"]+)"/', $header, $temp);
+ if (!$ret || empty($temp[1])) {
+ return false;
+ }
+ // Section 3.2.2.5 in RFC 2617 says the authenticating server must
+ // verify that the URI field in the Authorization header is for the
+ // same resource requested in the Request Line.
+ $rUri = @parse_url($this->_request->getRequestUri());
+ $cUri = @parse_url($temp[1]);
+ if (false === $rUri || false === $cUri) {
+ return false;
+ } else {
+ // Make sure the path portion of both URIs is the same
+ if ($rUri['path'] != $cUri['path']) {
+ return false;
+ }
+ // Section 3.2.2.5 seems to suggest that the value of the URI
+ // Authorization field should be made into an absolute URI if the
+ // Request URI is absolute, but it's vague, and that's a bunch of
+ // code I don't want to write right now.
+ $data['uri'] = $temp[1];
+ }
+ $temp = null;
+
+ $ret = preg_match('/response="([^"]+)"/', $header, $temp);
+ if (!$ret || empty($temp[1])) {
+ return false;
+ }
+ if (32 != strlen($temp[1]) || !ctype_xdigit($temp[1])) {
+ return false;
+ } else {
+ $data['response'] = $temp[1];
+ }
+ $temp = null;
+
+ // The spec says this should default to MD5 if omitted. OK, so how does
+ // that square with the algo we send out in the WWW-Authenticate header,
+ // if it can easily be overridden by the client?
+ $ret = preg_match('/algorithm="?(' . $this->_algo . ')"?/', $header, $temp);
+ if ($ret && !empty($temp[1])
+ && in_array($temp[1], $this->_supportedAlgos)) {
+ $data['algorithm'] = $temp[1];
+ } else {
+ $data['algorithm'] = 'MD5'; // = $this->_algo; ?
+ }
+ $temp = null;
+
+ // Not optional in this implementation
+ $ret = preg_match('/cnonce="([^"]+)"/', $header, $temp);
+ if (!$ret || empty($temp[1])) {
+ return false;
+ }
+ if (!ctype_print($temp[1])) {
+ return false;
+ } else {
+ $data['cnonce'] = $temp[1];
+ }
+ $temp = null;
+
+ // If the server sent an opaque value, the client must send it back
+ if ($this->_useOpaque) {
+ $ret = preg_match('/opaque="([^"]+)"/', $header, $temp);
+ if (!$ret || empty($temp[1])) {
+
+ // Big surprise: IE isn't RFC 2617-compliant.
+ if (false !== strpos($this->_request->getHeader('User-Agent'), 'MSIE')) {
+ $temp[1] = '';
+ $this->_ieNoOpaque = true;
+ } else {
+ return false;
+ }
+ }
+ // This implementation only sends MD5 hex strings in the opaque value
+ if (!$this->_ieNoOpaque &&
+ (32 != strlen($temp[1]) || !ctype_xdigit($temp[1]))) {
+ return false;
+ } else {
+ $data['opaque'] = $temp[1];
+ }
+ $temp = null;
+ }
+
+ // Not optional in this implementation, but must be one of the supported
+ // qop types
+ $ret = preg_match('/qop="?(' . implode('|', $this->_supportedQops) . ')"?/', $header, $temp);
+ if (!$ret || empty($temp[1])) {
+ return false;
+ }
+ if (!in_array($temp[1], $this->_supportedQops)) {
+ return false;
+ } else {
+ $data['qop'] = $temp[1];
+ }
+ $temp = null;
+
+ // Not optional in this implementation. The spec says this value
+ // shouldn't be a quoted string, but apparently some implementations
+ // quote it anyway. See ZF-1544.
+ $ret = preg_match('/nc="?([0-9A-Fa-f]{8})"?/', $header, $temp);
+ if (!$ret || empty($temp[1])) {
+ return false;
+ }
+ if (8 != strlen($temp[1]) || !ctype_xdigit($temp[1])) {
+ return false;
+ } else {
+ $data['nc'] = $temp[1];
+ }
+ $temp = null;
+
+ return $data;
+ }
+}
diff --git a/libs/Zend/Auth/Adapter/Http/Resolver/Exception.php b/libs/Zend/Auth/Adapter/Http/Resolver/Exception.php
new file mode 100755
index 0000000000..d27250d670
--- /dev/null
+++ b/libs/Zend/Auth/Adapter/Http/Resolver/Exception.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @subpackage Zend_Auth_Adapter_Http
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Exception.php 3842 2007-03-09 18:59:27Z darby $
+ */
+
+
+/**
+ * @see Zend_Auth_Exception
+ */
+require_once 'Zend/Auth/Exception.php';
+
+
+/**
+ * HTTP Auth Resolver Exception
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @subpackage Zend_Auth_Adapter_Http
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Auth_Adapter_Http_Resolver_Exception extends Zend_Auth_Exception
+{}
diff --git a/libs/Zend/Auth/Adapter/Http/Resolver/File.php b/libs/Zend/Auth/Adapter/Http/Resolver/File.php
new file mode 100755
index 0000000000..e68936111f
--- /dev/null
+++ b/libs/Zend/Auth/Adapter/Http/Resolver/File.php
@@ -0,0 +1,168 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @subpackage Zend_Auth_Adapter_Http
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: File.php 3842 2007-03-09 18:59:27Z darby $
+ */
+
+
+/**
+ * @see Zend_Auth_Adapter_Http_Resolver_Interface
+ */
+require_once 'Zend/Auth/Adapter/Http/Resolver/Interface.php';
+
+
+/**
+ * HTTP Authentication File Resolver
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @subpackage Zend_Auth_Adapter_Http
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Auth_Adapter_Http_Resolver_File implements Zend_Auth_Adapter_Http_Resolver_Interface
+{
+ /**
+ * Path to credentials file
+ *
+ * @var string
+ */
+ protected $_file;
+
+ /**
+ * Constructor
+ *
+ * @param string $path Complete filename where the credentials are stored
+ * @return void
+ */
+ public function __construct($path = '')
+ {
+ if (!empty($path)) {
+ $this->setFile($path);
+ }
+ }
+
+ /**
+ * Set the path to the credentials file
+ *
+ * @param string $path
+ * @throws Zend_Auth_Adapter_Http_Resolver_Exception
+ * @return Zend_Auth_Adapter_Http_Resolver_File Provides a fluent interface
+ */
+ public function setFile($path)
+ {
+ if (empty($path) || !is_readable($path)) {
+ /**
+ * @see Zend_Auth_Adapter_Http_Resolver_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php';
+ throw new Zend_Auth_Adapter_Http_Resolver_Exception('Path not readable: ' . $path);
+ }
+ $this->_file = $path;
+
+ return $this;
+ }
+
+ /**
+ * Returns the path to the credentials file
+ *
+ * @return string
+ */
+ public function getFile()
+ {
+ return $this->_file;
+ }
+
+ /**
+ * Resolve credentials
+ *
+ * Only the first matching username/realm combination in the file is
+ * returned. If the file contains credentials for Digest authentication,
+ * the returned string is the password hash, or h(a1) from RFC 2617. The
+ * returned string is the plain-text password for Basic authentication.
+ *
+ * The expected format of the file is:
+ * username:realm:sharedSecret
+ *
+ * That is, each line consists of the user's username, the applicable
+ * authentication realm, and the password or hash, each delimited by
+ * colons.
+ *
+ * @param string $username Username
+ * @param string $realm Authentication Realm
+ * @throws Zend_Auth_Adapter_Http_Resolver_Exception
+ * @return string|false User's shared secret, if the user is found in the
+ * realm, false otherwise.
+ */
+ public function resolve($username, $realm)
+ {
+ if (empty($username)) {
+ /**
+ * @see Zend_Auth_Adapter_Http_Resolver_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php';
+ throw new Zend_Auth_Adapter_Http_Resolver_Exception('Username is required');
+ } else if (!ctype_print($username) || strpos($username, ':') !== false) {
+ /**
+ * @see Zend_Auth_Adapter_Http_Resolver_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php';
+ throw new Zend_Auth_Adapter_Http_Resolver_Exception('Username must consist only of printable characters, '
+ . 'excluding the colon');
+ }
+ if (empty($realm)) {
+ /**
+ * @see Zend_Auth_Adapter_Http_Resolver_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php';
+ throw new Zend_Auth_Adapter_Http_Resolver_Exception('Realm is required');
+ } else if (!ctype_print($realm) || strpos($realm, ':') !== false) {
+ /**
+ * @see Zend_Auth_Adapter_Http_Resolver_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php';
+ throw new Zend_Auth_Adapter_Http_Resolver_Exception('Realm must consist only of printable characters, '
+ . 'excluding the colon.');
+ }
+
+ // Open file, read through looking for matching credentials
+ $fp = @fopen($this->_file, 'r');
+ if (!$fp) {
+ /**
+ * @see Zend_Auth_Adapter_Http_Resolver_Exception
+ */
+ require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php';
+ throw new Zend_Auth_Adapter_Http_Resolver_Exception('Unable to open password file: ' . $this->_file);
+ }
+
+ // No real validation is done on the contents of the password file. The
+ // assumption is that we trust the administrators to keep it secure.
+ while (($line = fgetcsv($fp, 512, ':')) !== false) {
+ if ($line[0] == $username && $line[1] == $realm) {
+ $password = $line[2];
+ fclose($fp);
+ return $password;
+ }
+ }
+
+ fclose($fp);
+ return false;
+ }
+}
diff --git a/libs/Zend/Auth/Adapter/Http/Resolver/Interface.php b/libs/Zend/Auth/Adapter/Http/Resolver/Interface.php
new file mode 100755
index 0000000000..e867ce52b1
--- /dev/null
+++ b/libs/Zend/Auth/Adapter/Http/Resolver/Interface.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @subpackage Zend_Auth_Adapter_Http
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 3842 2007-03-09 18:59:27Z darby $
+ */
+
+
+/**
+ * Auth HTTP Resolver Interface
+ *
+ * Defines an interace to resolve a username/realm combination into a shared
+ * secret usable by HTTP Authentication.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @subpackage Zend_Auth_Adapter_Http
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Auth_Adapter_Http_Resolver_Interface
+{
+ /**
+ * Resolve username/realm to password/hash/etc.
+ *
+ * @param string $username Username
+ * @param string $realm Authentication Realm
+ * @return string|false User's shared secret, if the user is found in the
+ * realm, false otherwise.
+ */
+ public function resolve($username, $realm);
+}
diff --git a/libs/Zend/Auth/Adapter/Interface.php b/libs/Zend/Auth/Adapter/Interface.php
new file mode 100755
index 0000000000..2b6691be88
--- /dev/null
+++ b/libs/Zend/Auth/Adapter/Interface.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 3412 2007-02-14 22:22:35Z darby $
+ */
+
+
+/**
+ * @see Zend_Auth_Result
+ */
+require_once 'Zend/Auth/Result.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Auth_Adapter_Interface
+{
+ /**
+ * Performs an authentication attempt
+ *
+ * @throws Zend_Auth_Adapter_Exception If authentication cannot be performed
+ * @return Zend_Auth_Result
+ */
+ public function authenticate();
+}
diff --git a/libs/Zend/Auth/Exception.php b/libs/Zend/Auth/Exception.php
new file mode 100755
index 0000000000..9066f4d7c3
--- /dev/null
+++ b/libs/Zend/Auth/Exception.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Exception.php 2794 2007-01-16 01:29:51Z bkarwin $
+ */
+
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Auth_Exception extends Zend_Exception
+{}
diff --git a/libs/Zend/Auth/Result.php b/libs/Zend/Auth/Result.php
new file mode 100755
index 0000000000..25ff374fa7
--- /dev/null
+++ b/libs/Zend/Auth/Result.php
@@ -0,0 +1,149 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Result.php 4194 2007-03-22 23:50:34Z darby $
+ */
+
+
+/**
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Auth_Result
+{
+ /**
+ * General Failure
+ */
+ const FAILURE = 0;
+
+ /**
+ * Failure due to identity not being found.
+ */
+ const FAILURE_IDENTITY_NOT_FOUND = -1;
+
+ /**
+ * Failure due to identity being ambiguous.
+ */
+ const FAILURE_IDENTITY_AMBIGUOUS = -2;
+
+ /**
+ * Failure due to invalid credential being supplied.
+ */
+ const FAILURE_CREDENTIAL_INVALID = -3;
+
+ /**
+ * Failure due to uncategorized reasons.
+ */
+ const FAILURE_UNCATEGORIZED = -4;
+
+ /**
+ * Authentication success.
+ */
+ const SUCCESS = 1;
+
+ /**
+ * Authentication result code
+ *
+ * @var int
+ */
+ protected $_code;
+
+ /**
+ * The identity used in the authentication attempt
+ *
+ * @var mixed
+ */
+ protected $_identity;
+
+ /**
+ * An array of string reasons why the authentication attempt was unsuccessful
+ *
+ * If authentication was successful, this should be an empty array.
+ *
+ * @var array
+ */
+ protected $_messages;
+
+ /**
+ * Sets the result code, identity, and failure messages
+ *
+ * @param int $code
+ * @param mixed $identity
+ * @param array $messages
+ * @return void
+ */
+ public function __construct($code, $identity, array $messages = array())
+ {
+ $code = (int) $code;
+
+ if ($code < self::FAILURE_UNCATEGORIZED) {
+ $code = self::FAILURE;
+ } elseif ($code > self::SUCCESS ) {
+ $code = 1;
+ }
+
+ $this->_code = $code;
+ $this->_identity = $identity;
+ $this->_messages = $messages;
+ }
+
+ /**
+ * Returns whether the result represents a successful authentication attempt
+ *
+ * @return boolean
+ */
+ public function isValid()
+ {
+ return ($this->_code > 0) ? true : false;
+ }
+
+ /**
+ * getCode() - Get the result code for this authentication attempt
+ *
+ * @return int
+ */
+ public function getCode()
+ {
+ return $this->_code;
+ }
+
+ /**
+ * Returns the identity used in the authentication attempt
+ *
+ * @return mixed
+ */
+ public function getIdentity()
+ {
+ return $this->_identity;
+ }
+
+ /**
+ * Returns an array of string reasons why the authentication attempt was unsuccessful
+ *
+ * If authentication was successful, this method returns an empty array.
+ *
+ * @return array
+ */
+ public function getMessages()
+ {
+ return $this->_messages;
+ }
+}
diff --git a/libs/Zend/Auth/Storage/Exception.php b/libs/Zend/Auth/Storage/Exception.php
new file mode 100755
index 0000000000..24dbad0e6c
--- /dev/null
+++ b/libs/Zend/Auth/Storage/Exception.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Exception.php 3412 2007-02-14 22:22:35Z darby $
+ */
+
+
+/**
+ * Zend_Auth_Exception
+ */
+require_once 'Zend/Auth/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Auth_Storage_Exception extends Zend_Auth_Exception
+{}
diff --git a/libs/Zend/Auth/Storage/Interface.php b/libs/Zend/Auth/Storage/Interface.php
new file mode 100755
index 0000000000..e5acd16051
--- /dev/null
+++ b/libs/Zend/Auth/Storage/Interface.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 3412 2007-02-14 22:22:35Z darby $
+ */
+
+
+/**
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Auth_Storage_Interface
+{
+ /**
+ * Returns true if and only if storage is empty
+ *
+ * @throws Zend_Auth_Storage_Exception If it is impossible to determine whether storage is empty
+ * @return boolean
+ */
+ public function isEmpty();
+
+ /**
+ * Returns the contents of storage
+ *
+ * Behavior is undefined when storage is empty.
+ *
+ * @throws Zend_Auth_Storage_Exception If reading contents from storage is impossible
+ * @return mixed
+ */
+ public function read();
+
+ /**
+ * Writes $contents to storage
+ *
+ * @param mixed $contents
+ * @throws Zend_Auth_Storage_Exception If writing $contents to storage is impossible
+ * @return void
+ */
+ public function write($contents);
+
+ /**
+ * Clears contents from storage
+ *
+ * @throws Zend_Auth_Storage_Exception If clearing contents from storage is impossible
+ * @return void
+ */
+ public function clear();
+}
diff --git a/libs/Zend/Auth/Storage/NonPersistent.php b/libs/Zend/Auth/Storage/NonPersistent.php
new file mode 100755
index 0000000000..d36616b419
--- /dev/null
+++ b/libs/Zend/Auth/Storage/NonPersistent.php
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id:$
+ */
+
+
+/**
+ * @see Zend_Auth_Storage_Interface
+ */
+require_once 'Zend/Auth/Storage/Interface.php';
+
+
+/**
+ * Non-Persistent Auth Storage
+ *
+ * Since HTTP Authentication happens again on each request, this will always be
+ * re-populated. So there's no need to use sessions, this simple value class
+ * will hold the data for rest of the current request.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Auth_Storage_NonPersistent implements Zend_Auth_Storage_Interface
+{
+ /**
+ * Holds the actual auth data
+ */
+ protected $_data;
+
+
+ /**
+ * Returns true if and only if storage is empty
+ *
+ * @throws Zend_Auth_Storage_Exception If it is impossible to determine whether storage is empty
+ * @return boolean
+ */
+ public function isEmpty()
+ {
+ return empty($this->_data);
+ }
+
+ /**
+ * Returns the contents of storage
+ *
+ * Behavior is undefined when storage is empty.
+ *
+ * @throws Zend_Auth_Storage_Exception If reading contents from storage is impossible
+ * @return mixed
+ */
+ public function read()
+ {
+ return $this->_data;
+ }
+
+ /**
+ * Writes $contents to storage
+ *
+ * @param mixed $contents
+ * @throws Zend_Auth_Storage_Exception If writing $contents to storage is impossible
+ * @return void
+ */
+ public function write($contents)
+ {
+ $this->_data = $contents;
+ }
+
+ /**
+ * Clears contents from storage
+ *
+ * @throws Zend_Auth_Storage_Exception If clearing contents from storage is impossible
+ * @return void
+ */
+ public function clear()
+ {
+ $this->_data = null;
+ }
+}
diff --git a/libs/Zend/Auth/Storage/Session.php b/libs/Zend/Auth/Storage/Session.php
new file mode 100755
index 0000000000..2775e6fb6c
--- /dev/null
+++ b/libs/Zend/Auth/Storage/Session.php
@@ -0,0 +1,148 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Session.php 3428 2007-02-15 14:02:05Z darby $
+ */
+
+
+/**
+ * @see Zend_Auth_Storage_Interface
+ */
+require_once 'Zend/Auth/Storage/Interface.php';
+
+
+/**
+ * @see Zend_Session
+ */
+require_once 'Zend/Session.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Auth
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Auth_Storage_Session implements Zend_Auth_Storage_Interface
+{
+ /**
+ * Default session namespace
+ */
+ const NAMESPACE_DEFAULT = 'Zend_Auth';
+
+ /**
+ * Default session object member name
+ */
+ const MEMBER_DEFAULT = 'storage';
+
+ /**
+ * Object to proxy $_SESSION storage
+ *
+ * @var Zend_Session_Namespace
+ */
+ protected $_session;
+
+ /**
+ * Session namespace
+ *
+ * @var mixed
+ */
+ protected $_namespace;
+
+ /**
+ * Session object member
+ *
+ * @var mixed
+ */
+ protected $_member;
+
+ /**
+ * Sets session storage options and initializes session namespace object
+ *
+ * @param mixed $namespace
+ * @param mixed $member
+ */
+ public function __construct($namespace = self::NAMESPACE_DEFAULT, $member = self::MEMBER_DEFAULT)
+ {
+ $this->_namespace = $namespace;
+ $this->_member = $member;
+ $this->_session = new Zend_Session_Namespace($this->_namespace);
+ }
+
+ /**
+ * Returns the session namespace
+ *
+ * @return string
+ */
+ public function getNamespace()
+ {
+ return $this->_namespace;
+ }
+
+ /**
+ * Returns the name of the session object member
+ *
+ * @return string
+ */
+ public function getMember()
+ {
+ return $this->_member;
+ }
+
+ /**
+ * Defined by Zend_Auth_Storage_Interface
+ *
+ * @return boolean
+ */
+ public function isEmpty()
+ {
+ return !isset($this->_session->{$this->_member});
+ }
+
+ /**
+ * Defined by Zend_Auth_Storage_Interface
+ *
+ * @return mixed
+ */
+ public function read()
+ {
+ return $this->_session->{$this->_member};
+ }
+
+ /**
+ * Defined by Zend_Auth_Storage_Interface
+ *
+ * @param mixed $contents
+ * @return void
+ */
+ public function write($contents)
+ {
+ $this->_session->{$this->_member} = $contents;
+ }
+
+ /**
+ * Defined by Zend_Auth_Storage_Interface
+ *
+ * @return void
+ */
+ public function clear()
+ {
+ unset($this->_session->{$this->_member});
+ }
+}
diff --git a/libs/Zend/Cache.php b/libs/Zend/Cache.php
new file mode 100755
index 0000000000..b49737b5ab
--- /dev/null
+++ b/libs/Zend/Cache.php
@@ -0,0 +1,119 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * @package Zend_Cache
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Cache
+{
+
+ /**
+ * Available frontends
+ *
+ * @var array $availableFrontends array of frontend name (string)
+ */
+ public static $availableFrontends = array('Core', 'Output', 'Class', 'File', 'Function', 'Page');
+
+ /**
+ * Available backends
+ *
+ * @var array $availableBackends array of backends name (string)
+ */
+ public static $availableBackends = array('File', 'Sqlite', 'Memcached', 'Apc', 'ZendPlatform');
+
+ /**
+ * Consts for clean() method
+ */
+ const CLEANING_MODE_ALL = 'all';
+ const CLEANING_MODE_OLD = 'old';
+ const CLEANING_MODE_MATCHING_TAG = 'matchingTag';
+ const CLEANING_MODE_NOT_MATCHING_TAG = 'notMatchingTag';
+
+ /**
+ * Factory
+ *
+ * @param string $frontend frontend name
+ * @param string $backend backend name
+ * @param array $frontendOptions associative array of options for the corresponding frontend constructor
+ * @param array $backendOptions associative array of options for the corresponding backend constructor
+ */
+ public static function factory($frontend, $backend, $frontendOptions = array(), $backendOptions = array())
+ {
+
+ // because lowercase will fail
+ $frontend = self::_normalizeName($frontend);
+ $backend = self::_normalizeName($backend);
+
+ if (!in_array($frontend, self::$availableFrontends)) {
+ self::throwException("Incorrect frontend ($frontend)");
+ }
+ if (!in_array($backend, Zend_Cache::$availableBackends)) {
+ self::throwException("Incorrect backend ($backend)");
+ }
+
+ // For perfs reasons, with frontend == 'Core', we can interact with the Core itself
+ $frontendClass = 'Zend_Cache_' . ($frontend != 'Core' ? 'Frontend_' : '') . $frontend;
+
+ $backendClass = 'Zend_Cache_Backend_' . $backend;
+
+ // For perfs reasons, we do not use the Zend_Loader::loadClass() method
+ // (security controls are explicit)
+ require_once str_replace('_', DIRECTORY_SEPARATOR, $frontendClass) . '.php';
+ require_once str_replace('_', DIRECTORY_SEPARATOR, $backendClass) . '.php';
+
+ $frontendObject = new $frontendClass($frontendOptions);
+ $backendObject = new $backendClass($backendOptions);
+ $frontendObject->setBackend($backendObject);
+ return $frontendObject;
+
+ }
+
+ /**
+ * Throw an exception
+ *
+ * Note : for perf reasons, the "load" of Zend/Cache/Exception is dynamic
+ */
+ public static function throwException($msg)
+ {
+ // For perfs reasons, we use this dynamic inclusion
+ require_once 'Zend/Cache/Exception.php';
+ throw new Zend_Cache_Exception($msg);
+ }
+
+ /**
+ * Normalize frontend and backend names to allow multiple words TitleCased
+ *
+ * @param string $name
+ * @return string
+ */
+ protected static function _normalizeName($name)
+ {
+ $name = ucfirst(strtolower($name));
+ $name = str_replace(array('-', '_', '.'), ' ', $name);
+ $name = ucwords($name);
+ $name = str_replace(' ', '', $name);
+ return $name;
+ }
+
+}
diff --git a/libs/Zend/Cache/Backend.php b/libs/Zend/Cache/Backend.php
new file mode 100755
index 0000000000..0c9071030b
--- /dev/null
+++ b/libs/Zend/Cache/Backend.php
@@ -0,0 +1,224 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Cache_Backend
+{
+
+ // ------------------
+ // --- Properties ---
+ // ------------------
+
+ /**
+ * Frontend or Core directives
+ *
+ * =====> (int) lifetime :
+ * - Cache lifetime (in seconds)
+ * - If null, the cache is valid forever
+ *
+ * =====> (int) logging :
+ * - if set to true, a logging is activated throw Zend_Log
+ *
+ * @var array directives
+ */
+ protected $_directives = array(
+ 'lifetime' => 3600,
+ 'logging' => false,
+ 'logger' => null
+ );
+
+ /**
+ * Available options
+ *
+ * @var array available options
+ */
+ protected $_options = array();
+
+ /**
+ * backward compatibility becase of ZF-879 and ZF-1172 (it will be removed in ZF 1.1)
+ *
+ * @var array
+ */
+ protected $_backwardCompatibilityArray = array();
+
+ // ----------------------
+ // --- Public methods ---
+ // ----------------------
+
+ /**
+ * Constructor
+ *
+ * @param array $options associative array of options
+ */
+ public function __construct($options = array())
+ {
+ if (!is_array($options)) Zend_Cache::throwException('Options parameter must be an array');
+ while (list($name, $value) = each($options)) {
+ $this->setOption($name, $value);
+ }
+ }
+
+ /**
+ * Set the frontend directives
+ *
+ * @param array $directives assoc of directives
+ */
+ public function setDirectives($directives)
+ {
+ if (!is_array($directives)) Zend_Cache::throwException('Directives parameter must be an array');
+ while (list($name, $value) = each($directives)) {
+ if (!is_string($name)) {
+ Zend_Cache::throwException("Incorrect option name : $name");
+ }
+ $name = strtolower($name);
+ if (array_key_exists($name, $this->_directives)) {
+ $this->_directives[$name] = $value;
+ }
+
+ }
+
+ $this->_loggerSanity();
+ }
+
+ /**
+ * Set an option
+ *
+ * @param string $name
+ * @param mixed $value
+ */
+ public function setOption($name, $value)
+ {
+ if (!is_string($name)) {
+ Zend_Cache::throwException("Incorrect option name : $name");
+ }
+ if (array_key_exists($name, $this->_backwardCompatibilityArray)) {
+ $tmp = $this->_backwardCompatibilityArray[$name];
+ $this->_log("$name option is deprecated, use $tmp instead (same syntax) !");
+ $name = $tmp;
+ } else {
+ $name = strtolower($name);
+ }
+ if (!array_key_exists($name, $this->_options)) {
+ Zend_Cache::throwException("Incorrect option name : $name");
+ }
+ $this->_options[$name] = $value;
+ }
+
+ /**
+ * Get the life time
+ *
+ * if $specificLifetime is not false, the given specific life time is used
+ * else, the global lifetime is used
+ *
+ * @return int cache life time
+ */
+ public function getLifetime($specificLifetime)
+ {
+ if ($specificLifetime === false) {
+ return $this->_directives['lifetime'];
+ }
+ return $specificLifetime;
+ }
+
+ /**
+ * Return a system-wide tmp directory
+ *
+ * @return string system-wide tmp directory
+ */
+ static function getTmpDir()
+ {
+ if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
+ // windows...
+ foreach (array($_ENV, $_SERVER) as $tab) {
+ foreach (array('TEMP', 'TMP', 'windir', 'SystemRoot') as $key) {
+ if (isset($tab[$key])) {
+ $result = $tab[$key];
+ if (($key == 'windir') or ($key == 'SystemRoot')) {
+ $result = $result . '\\temp';
+ }
+ return $result;
+ }
+ }
+ }
+ return '\temp';
+ } else {
+ // unix...
+ if (isset($_ENV['TMPDIR'])) return $_ENV['TMPDIR'];
+ if (isset($_SERVER['TMPDIR'])) return $_SERVER['TMPDIR'];
+ return '/tmp';
+ }
+ }
+
+ /**
+ * Make sure if we enable logging that the Zend_Log class
+ * is available.
+ * Create a default log object if none is set.
+ *
+ * @return void
+ * @throws Zend_Cache_Exception
+ */
+ protected function _loggerSanity()
+ {
+ if (!isset($this->_directives['logging']) || !$this->_directives['logging']) {
+ return;
+ }
+ try {
+ require_once 'Zend/Loader.php';
+ Zend_Loader::loadClass('Zend_Log');
+ } catch (Zend_Exception $e) {
+ Zend_Cache::throwException('Logging feature is enabled but the Zend_Log class is not available');
+ }
+ if (isset($this->_directives['logger']) && $this->_directives['logger'] instanceof Zend_Log) {
+ return;
+ }
+ // Create a default logger to the standard output stream
+ Zend_Loader::loadClass('Zend_Log_Writer_Stream');
+ $logger = new Zend_Log(new Zend_Log_Writer_Stream('php://output'));
+ $this->_directives['logger'] = $logger;
+ }
+
+ /**
+ * Log a message at the WARN (4) priority.
+ *
+ * @param string $message
+ * @return void
+ * @throws Zend_Cache_Exception
+ */
+ protected function _log($message, $priority = 4)
+ {
+ if (!$this->_directives['logging']) {
+ return;
+ }
+ if (!(isset($this->_directives['logger']) || $this->_directives['logger'] instanceof Zend_Log)) {
+ Zend_Cache::throwException('Logging is enabled but logger is not set');
+ }
+ $logger = $this->_directives['logger'];
+ $logger->log($message, $priority);
+ }
+
+}
diff --git a/libs/Zend/Cache/Backend/Apc.php b/libs/Zend/Cache/Backend/Apc.php
new file mode 100755
index 0000000000..c6e13e4ed6
--- /dev/null
+++ b/libs/Zend/Cache/Backend/Apc.php
@@ -0,0 +1,161 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Cache_Backend_Interface
+ */
+require_once 'Zend/Cache/Backend/Interface.php';
+
+/**
+ * Zend_Cache_Backend
+ */
+require_once 'Zend/Cache/Backend.php';
+
+
+/**
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Cache_Backend_Apc extends Zend_Cache_Backend implements Zend_Cache_Backend_Interface
+{
+
+ // ----------------------
+ // --- Public methods ---
+ // ----------------------
+
+ /**
+ * Constructor
+ *
+ * @param array $options associative array of options
+ */
+ public function __construct($options = array())
+ {
+ if (!extension_loaded('apc')) {
+ Zend_Cache::throwException('The apc extension must be loaded for using this backend !');
+ }
+ parent::__construct($options);
+ }
+
+ /**
+ * Test if a cache is available for the given id and (if yes) return it (false else)
+ *
+ * WARNING $doNotTestCacheValidity=true is unsupported by the Apc backend
+ *
+ * @param string $id cache id
+ * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested
+ * @return string cached datas (or false)
+ */
+ public function load($id, $doNotTestCacheValidity = false)
+ {
+ if ($doNotTestCacheValidity) {
+ $this->_log("Zend_Cache_Backend_Apc::load() : \$doNotTestCacheValidity=true is unsupported by the Apc backend");
+ }
+ $tmp = apc_fetch($id);
+ if (is_array($tmp)) {
+ return $tmp[0];
+ }
+ return false;
+ }
+
+ /**
+ * Test if a cache is available or not (for the given id)
+ *
+ * @param string $id cache id
+ * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record
+ */
+ public function test($id)
+ {
+ $tmp = apc_fetch($id);
+ if (is_array($tmp)) {
+ return $tmp[1];
+ }
+ return false;
+ }
+
+ /**
+ * Save some string datas into a cache record
+ *
+ * Note : $data is always "string" (serialization is done by the
+ * core not by the backend)
+ *
+ * @param string $data datas to cache
+ * @param string $id cache id
+ * @param array $tags array of strings, the cache record will be tagged by each string entry
+ * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime)
+ * @return boolean true if no problem
+ */
+ public function save($data, $id, $tags = array(), $specificLifetime = false)
+ {
+ $lifetime = $this->getLifetime($specificLifetime);
+ $result = apc_store($id, array($data, time()), $lifetime);
+ if (count($tags) > 0) {
+ $this->_log("Zend_Cache_Backend_Apc::save() : tags are unsupported by the Apc backend");
+ }
+ return $result;
+ }
+
+ /**
+ * Remove a cache record
+ *
+ * @param string $id cache id
+ * @return boolean true if no problem
+ */
+ public function remove($id)
+ {
+ return apc_delete($id);
+ }
+
+ /**
+ * Clean some cache records
+ *
+ * Available modes are :
+ * 'all' (default) => remove all cache entries ($tags is not used)
+ * 'old' => remove too old cache entries ($tags is not used)
+ * 'matchingTag' => remove cache entries matching all given tags
+ * ($tags can be an array of strings or a single string)
+ * 'notMatchingTag' => remove cache entries not matching one of the given tags
+ * ($tags can be an array of strings or a single string)
+ *
+ * @param string $mode clean mode
+ * @param tags array $tags array of tags
+ * @return boolean true if no problem
+ */
+ public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array())
+ {
+ if ($mode==Zend_Cache::CLEANING_MODE_ALL) {
+ return apc_clear_cache('user');
+ }
+ if ($mode==Zend_Cache::CLEANING_MODE_OLD) {
+ $this->_log("Zend_Cache_Backend_Apc::clean() : CLEANING_MODE_OLD is unsupported by the Apc backend");
+ }
+ if ($mode==Zend_Cache::CLEANING_MODE_MATCHING_TAG) {
+ $this->_log("Zend_Cache_Backend_Apc::clean() : tags are unsupported by the Apc backend");
+ }
+ if ($mode==Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG) {
+ $this->_log("Zend_Cache_Backend_Apc::clean() : tags are unsupported by the Apc backend");
+ }
+ }
+
+}
diff --git a/libs/Zend/Cache/Backend/File.php b/libs/Zend/Cache/Backend/File.php
new file mode 100755
index 0000000000..5451beea05
--- /dev/null
+++ b/libs/Zend/Cache/Backend/File.php
@@ -0,0 +1,654 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Cache_Backend_Interface
+ */
+require_once 'Zend/Cache/Backend/Interface.php';
+
+/**
+ * Zend_Cache_Backend
+ */
+require_once 'Zend/Cache/Backend.php';
+
+
+/**
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Cache_Backend_File extends Zend_Cache_Backend implements Zend_Cache_Backend_Interface
+{
+
+ // ------------------
+ // --- Properties ---
+ // ------------------
+
+ /**
+ * Available options
+ *
+ * =====> (string) cache_dir :
+ * - Directory where to put the cache files
+ *
+ * =====> (boolean) file_locking :
+ * - Enable / disable file_locking
+ * - Can avoid cache corruption under bad circumstances but it doesn't work on multithread
+ * webservers and on NFS filesystems for example
+ *
+ * =====> (boolean) read_control :
+ * - Enable / disable read control
+ * - If enabled, a control key is embeded in cache file and this key is compared with the one
+ * calculated after the reading.
+ *
+ * =====> (string) read_control_type :
+ * - Type of read control (only if read control is enabled). Available values are :
+ * 'md5' for a md5 hash control (best but slowest)
+ * 'crc32' for a crc32 hash control (lightly less safe but faster, better choice)
+ * 'strlen' for a length only test (fastest)
+ *
+ * =====> (int) hashed_directory_level :
+ * - Hashed directory level
+ * - Set the hashed directory structure level. 0 means "no hashed directory
+ * structure", 1 means "one level of directory", 2 means "two levels"...
+ * This option can speed up the cache only when you have many thousands of
+ * cache file. Only specific benchs can help you to choose the perfect value
+ * for you. Maybe, 1 or 2 is a good start.
+ *
+ * =====> (int) hashed_directory_umask :
+ * - Umask for hashed directory structure
+ *
+ * =====> (string) file_name_prefix :
+ * - prefix for cache files
+ * - be really carefull with this option because a too generic value in a system cache dir
+ * (like /tmp) can cause disasters when cleaning the cache
+ *
+ * @var array available options
+ */
+ protected $_options = array(
+ 'cache_dir' => null,
+ 'file_locking' => true,
+ 'read_control' => true,
+ 'read_control_type' => 'crc32',
+ 'hashed_directory_level' => 0,
+ 'hashed_directory_umask' => 0700,
+ 'file_name_prefix' => 'zend_cache'
+ );
+
+ /**
+ * backward compatibility becase of ZF-879 and ZF-1172 (it will be removed in ZF 1.1)
+ *
+ * @var array
+ */
+ protected $_backwardCompatibilityArray = array(
+ 'cacheDir' => 'cache_dir',
+ 'fileLocking' => 'file_locking',
+ 'readControl' => 'read_control',
+ 'readControlType' => 'read_control_type',
+ 'hashedDirectoryLevel' => 'hashed_directory_level',
+ 'hashedDirectoryUmask' => 'hashed_directory_umask',
+ 'fileNamePrefix' => 'file_name_prefix'
+ );
+
+ // ----------------------
+ // --- Public methods ---
+ // ----------------------
+
+ /**
+ * Constructor
+ *
+ * @param array $options associative array of options
+ */
+ public function __construct($options = array())
+ {
+ parent::__construct($options);
+ if (!is_null($this->_options['cache_dir'])) { // particular case for this option
+ $this->setCacheDir($this->_options['cache_dir']);
+ } else {
+ $this->_options['cache_dir'] = self::getTmpDir() . DIRECTORY_SEPARATOR;
+ }
+ if (isset($this->_options['file_name_prefix'])) { // particular case for this option
+ if (!preg_match('~^[\w]+$~', $this->_options['file_name_prefix'])) {
+ Zend_Cache::throwException('Invalid file_name_prefix : must use only [a-zA-A0-9_]');
+ }
+ }
+ }
+
+ /**
+ * Set the cache_dir (particular case of setOption() method)
+ *
+ * @param mixed $value
+ */
+ public function setCacheDir($value)
+ {
+ // add a trailing DIRECTORY_SEPARATOR if necessary
+ $value = rtrim($value, '\\/') . DIRECTORY_SEPARATOR;
+ $this->setOption('cache_dir', $value);
+ }
+
+ /**
+ * Test if a cache is available for the given id and (if yes) return it (false else)
+ *
+ * @param string $id cache id
+ * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested
+ * @return string cached datas (or false)
+ */
+ public function load($id, $doNotTestCacheValidity = false)
+ {
+ if (!($this->_test($id, $doNotTestCacheValidity))) {
+ // The cache is not hit !
+ return false;
+ }
+ $file = $this->_file($id);
+ if (is_null($file)) {
+ return false;
+ }
+ // There is an available cache file !
+ $fp = @fopen($file, 'rb');
+ if (!$fp) return false;
+ if ($this->_options['file_locking']) @flock($fp, LOCK_SH);
+ $length = @filesize($file);
+ $mqr = get_magic_quotes_runtime();
+ set_magic_quotes_runtime(0);
+ if ($this->_options['read_control']) {
+ $hashControl = @fread($fp, 32);
+ $length = $length - 32;
+ }
+ if ($length) {
+ $data = @fread($fp, $length);
+ } else {
+ $data = '';
+ }
+ set_magic_quotes_runtime($mqr);
+ if ($this->_options['file_locking']) @flock($fp, LOCK_UN);
+ @fclose($fp);
+ if ($this->_options['read_control']) {
+ $hashData = $this->_hash($data, $this->_options['read_control_type']);
+ if ($hashData != $hashControl) {
+ // Problem detected by the read control !
+ $this->_log('Zend_Cache_Backend_File::load() / read_control : stored hash and computed hash do not match');
+ $this->_remove($file);
+ return false;
+ }
+ }
+ return $data;
+ }
+
+ /**
+ * Test if a cache is available or not (for the given id)
+ *
+ * @param string $id cache id
+ * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record
+ */
+ public function test($id)
+ {
+ return $this->_test($id, false);
+ }
+
+ /**
+ * Save some string datas into a cache record
+ *
+ * Note : $data is always "string" (serialization is done by the
+ * core not by the backend)
+ *
+ * @param string $data datas to cache
+ * @param string $id cache id
+ * @param array $tags array of strings, the cache record will be tagged by each string entry
+ * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime)
+ * @return boolean true if no problem
+ */
+ public function save($data, $id, $tags = array(), $specificLifetime = false)
+ {
+ if ((!is_dir($this->_options['cache_dir'])) or (!is_writable($this->_options['cache_dir']))) {
+ $this->_log("Zend_Cache_Backend_File::save() : cache_dir doesn't exist or is not writable");
+ }
+ $this->remove($id); // to avoid multiple files with the same cache id
+ $lifetime = $this->getLifetime($specificLifetime);
+ $expire = $this->_expireTime($lifetime);
+ $file = $this->_file($id, $expire);
+ $firstTry = true;
+ $result = false;
+ while (1 == 1) {
+ $fp = @fopen($file, "wb");
+ if ($fp) {
+ // we can open the file, so the directory structure is ok
+ if ($this->_options['file_locking']) @flock($fp, LOCK_EX);
+ if ($this->_options['read_control']) {
+ @fwrite($fp, $this->_hash($data, $this->_options['read_control_type']), 32);
+ }
+ $mqr = get_magic_quotes_runtime();
+ set_magic_quotes_runtime(0);
+ @fwrite($fp, $data);
+ if ($this->_options['file_locking']) @flock($fp, LOCK_UN);
+ @fclose($fp);
+ set_magic_quotes_runtime($mqr);
+ $result = true;
+ break;
+ }
+ // we can't open the file but it's maybe only the directory structure
+ // which has to be built
+ if ($this->_options['hashed_directory_level']==0) break;
+ if ((!$firstTry) || ($this->_options['hashed_directory_level'] == 0)) {
+ // it's not a problem of directory structure
+ break;
+ }
+ $firstTry = false;
+ // In this case, maybe we just need to create the corresponding directory
+ @mkdir($this->_path($id), $this->_options['hashed_directory_umask'], true);
+ @chmod($this->_path($id), $this->_options['hashed_directory_umask']); // see #ZF-320 (this line is required in some configurations)
+ }
+ if ($result) {
+ foreach ($tags as $tag) {
+ $this->_registerTag($id, $tag);
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * Remove a cache record
+ *
+ * @param string $id cache id
+ * @return boolean true if no problem
+ */
+ public function remove($id)
+ {
+ $result1 = true;
+ $files = @glob($this->_file($id, '*'));
+ if (count($files) == 0) {
+ return false;
+ }
+ foreach ($files as $file) {
+ $result1 = $result1 && $this->_remove($file);
+ }
+ $result2 = $this->_unregisterTag($id);
+ return ($result1 && $result2);
+ }
+
+ /**
+ * Clean some cache records
+ *
+ * Available modes are :
+ * 'all' (default) => remove all cache entries ($tags is not used)
+ * 'old' => remove too old cache entries ($tags is not used)
+ * 'matchingTag' => remove cache entries matching all given tags
+ * ($tags can be an array of strings or a single string)
+ * 'notMatchingTag' => remove cache entries not matching one of the given tags
+ * ($tags can be an array of strings or a single string)
+ *
+ * @param string $mode clean mode
+ * @param tags array $tags array of tags
+ * @return boolean true if no problem
+ */
+ public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array())
+ {
+ // We use this private method to hide the recursive stuff
+ clearstatcache();
+ return $this->_clean($this->_options['cache_dir'], $mode, $tags);
+ }
+
+ /**
+ * PUBLIC METHOD FOR UNIT TESTING ONLY !
+ *
+ * Force a cache record to expire
+ *
+ * @param string $id cache id
+ */
+ public function ___expire($id)
+ {
+ $file = $this->_file($id);
+ if (!(is_null($file))) {
+ $file2 = $this->_file($id, 1);
+ @rename($file, $file2);
+ }
+ }
+
+ // -----------------------
+ // --- Private methods ---
+ // -----------------------
+
+ /**
+ * Remove a file
+ *
+ * If we can't remove the file (because of locks or any problem), we will touch
+ * the file to invalidate it
+ *
+ * @param string $file complete file path
+ * @return boolean true if ok
+ */
+ private function _remove($file)
+ {
+ if (!@unlink($file)) {
+ # we can't remove the file (because of locks or any problem)
+ $this->_log("Zend_Cache_Backend_File::_remove() : we can't remove $file => we are going to try to invalidate it");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Test if the given cache id is available (and still valid as a cache record)
+ *
+ * @param string $id cache id
+ * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested
+ * @return boolean mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record
+ */
+ private function _test($id, $doNotTestCacheValidity)
+ {
+ clearstatcache();
+ $file = $this->_file($id);
+ if (is_null($file)) {
+ return false;
+ }
+ $fileName = @basename($file);
+ $expire = (int) $this->_fileNameToExpireField($fileName);
+ if ($doNotTestCacheValidity) {
+ return $expire;
+ }
+ if (time() <= $expire) {
+ return @filemtime($file);
+ }
+ return false;
+ }
+
+ /**
+ * Clean some cache records (private method used for recursive stuff)
+ *
+ * Available modes are :
+ * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used)
+ * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used)
+ * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags
+ * ($tags can be an array of strings or a single string)
+ * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags}
+ * ($tags can be an array of strings or a single string)
+ *
+ * @param string $dir directory to clean
+ * @param string $mode clean mode
+ * @param tags array $tags array of tags
+ * @return boolean true if no problem
+ */
+ private function _clean($dir, $mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array())
+ {
+ if (!is_dir($dir)) {
+ return false;
+ }
+ $result = true;
+ $prefix = $this->_options['file_name_prefix'];
+ $glob = @glob($dir . $prefix . '--*');
+ foreach ($glob as $file) {
+ if (is_file($file)) {
+ if ($mode==Zend_Cache::CLEANING_MODE_ALL) {
+ $result = ($result) && ($this->_remove($file));
+ }
+ if ($mode==Zend_Cache::CLEANING_MODE_OLD) {
+ $fileName = @basename($file);
+ $expire = (int) $this->_fileNameToExpireField($fileName);
+ if (time() > $expire) {
+ $result = ($result) && ($this->_remove($file));
+ }
+ }
+ if ($mode==Zend_Cache::CLEANING_MODE_MATCHING_TAG) {
+ $matching = true;
+ $id = $this->_fileNameToId(basename($file));
+ if (!($this->_isATag($id))) {
+ foreach ($tags as $tag) {
+ if (!($this->_testTag($id, $tag))) {
+ $matching = false;
+ break;
+ }
+ }
+ if ($matching) {
+ $result = ($result) && ($this->remove($id));
+ }
+ }
+ }
+ if ($mode==Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG) {
+ $matching = false;
+ $id = $this->_fileNameToId(basename($file));
+ if (!($this->_isATag($id))) {
+ foreach ($tags as $tag) {
+ if ($this->_testTag($id, $tag)) {
+ $matching = true;
+ break;
+ }
+ }
+ if (!$matching) {
+ $result = ($result) && ($this->remove($id));
+ }
+ }
+ }
+ }
+ if ((is_dir($file)) and ($this->_options['hashed_directory_level']>0)) {
+ // Recursive call
+ $result = ($result) && ($this->_clean($file . DIRECTORY_SEPARATOR, $mode, $tags));
+ if ($mode=='all') {
+ // if mode=='all', we try to drop the structure too
+ @rmdir($file);
+ }
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * Register a cache id with the given tag
+ *
+ * @param string $id cache id
+ * @param string $tag tag
+ * @return boolean true if no problem
+ */
+ private function _registerTag($id, $tag)
+ {
+ return $this->save('1', $this->_tagCacheId($id, $tag));
+ }
+
+ /**
+ * Unregister tags of a cache id
+ *
+ * @param string $id cache id
+ * @return boolean true if no problem
+ */
+ private function _unregisterTag($id)
+ {
+ $filesToRemove = @glob($this->_file($this->_tagCacheId($id, '*'), '*'));
+ $result = true;
+ foreach ($filesToRemove as $file) {
+ $result = $result && ($this->_remove($file));
+ }
+ return $result;
+ }
+
+ /**
+ * Test if a cache id was saved with the given tag
+ *
+ * @param string $id cache id
+ * @param string $tag tag name
+ * @return true if the cache id was saved with the given tag
+ */
+ private function _testTag($id, $tag)
+ {
+ if ($this->test($this->_tagCacheId($id, $tag))) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Compute & return the expire time
+ *
+ * @return int expire time (unix timestamp)
+ */
+ private function _expireTime($lifetime)
+ {
+ if (is_null($this->_directives['lifetime'])) {
+ return 9999999999;
+ }
+ return time() + $lifetime;
+ }
+
+ /**
+ * Make a control key with the string containing datas
+ *
+ * @param string $data data
+ * @param string $controlType type of control 'md5', 'crc32' or 'strlen'
+ * @return string control key
+ */
+ private function _hash($data, $controlType)
+ {
+ switch ($controlType) {
+ case 'md5':
+ return md5($data);
+ case 'crc32':
+ return sprintf('% 32d', crc32($data));
+ case 'strlen':
+ return sprintf('% 32d', strlen($data));
+ default:
+ Zend_Cache::throwException("Incorrect hash function : $controlType");
+ }
+ }
+
+ /**
+ * Return a special/reserved cache id for storing the given tag on the given id
+ *
+ * @param string $id cache id
+ * @param string $tag tag name
+ * @return string cache id for the tag
+ */
+ private function _tagCacheId($id, $tag) {
+ return 'internal-' . $id . '-' . $tag;
+ }
+
+ /**
+ * Return true is the given id is a tag
+ *
+ * @param string $id
+ * @return boolean
+ */
+ private function _isATag($id)
+ {
+ if (substr($id, 0, 9) == 'internal-') {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Transform a cache id into a file name and return it
+ *
+ * @param string $id cache id
+ * @param int expire timestamp
+ * @return string file name
+ */
+ private function _idToFileName($id, $expire)
+ {
+ $prefix = $this->_options['file_name_prefix'];
+ $result = $prefix . '---' . $id . '---' . $expire;
+ return $result;
+ }
+
+ /**
+ * Get the father cache id from the tag cache id
+ *
+ * @param string $id tag cache id
+ * @return string father cache id
+ */
+ private function _tagCacheIdToFatherCacheId($id)
+ {
+ return preg_replace('~internal-(\w*)-.*$~', '$1', $id);
+ }
+
+ /**
+ * Return the expire field from the file name
+ *
+ * @param string $fileName
+ * @return string expire field
+ */
+ private function _fileNameToExpireField($fileName)
+ {
+ $prefix = $this->_options['file_name_prefix'];
+ return preg_replace('~^' . $prefix . '---.*---(\d*)$~', '$1', $fileName);
+ }
+
+ /**
+ * Transform a file name into cache id and return it
+ *
+ * @param string $fileName file name
+ * @return string cache id
+ */
+ private function _fileNameToId($fileName)
+ {
+ $prefix = $this->_options['file_name_prefix'];
+ return preg_replace('~^' . $prefix . '---(.*)---.*$~', '$1', $fileName);
+ }
+
+ /**
+ * Return the complete directory path of a filename (including hashedDirectoryStructure)
+ *
+ * @param string $id cache id
+ * @return string complete directory path
+ */
+ private function _path($id)
+ {
+ $root = $this->_options['cache_dir'];
+ $prefix = $this->_options['file_name_prefix'];
+ if ($this->_options['hashed_directory_level']>0) {
+ if ($this->_isATag($id)) {
+ // we store tags in the same directory than the father
+ $id2 = $this->_tagCacheIdToFatherCacheId($id);
+ $hash = md5($this->_tagCacheIdToFatherCacheId($id));
+ } else {
+ $hash = md5($id);
+ }
+ for ($i=0 ; $i<$this->_options['hashed_directory_level'] ; $i++) {
+ $root = $root . $prefix . '--' . substr($hash, 0, $i + 1) . DIRECTORY_SEPARATOR;
+ }
+ }
+ return $root;
+ }
+
+ /**
+ * Make and return a file name (with path)
+ *
+ * if $expire is null (default), the function try to guess the real file name
+ * (if it fails (no cache files or several cache files for this id, the method returns null)
+ *
+ * @param string $id cache id
+ * @param int expire timestamp
+ * @return string file name (with path)
+ */
+ private function _file($id, $expire = null)
+ {
+ $path = $this->_path($id);
+ if (is_null($expire)) {
+ $glob = @glob($path . $this->_idToFileName($id, '*'));
+ $nbr = count($glob);
+ if ($nbr == 1) {
+ return $glob[0];
+ }
+ return null;
+ }
+ $fileName = $this->_idToFileName($id, $expire);
+ return $path . $fileName;
+ }
+
+}
diff --git a/libs/Zend/Cache/Backend/Interface.php b/libs/Zend/Cache/Backend/Interface.php
new file mode 100755
index 0000000000..6cb1168d7d
--- /dev/null
+++ b/libs/Zend/Cache/Backend/Interface.php
@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Cache_Backend_Interface
+{
+
+ /**
+ * Set the frontend directives
+ *
+ * @param array $directives assoc of directives
+ */
+ public function setDirectives($directives);
+
+ /**
+ * Test if a cache is available for the given id and (if yes) return it (false else)
+ *
+ * Note : return value is always "string" (unserialization is done by the core not by the backend)
+ *
+ * @param string $id cache id
+ * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested
+ * @return string cached datas (or false)
+ */
+ public function load($id, $doNotTestCacheValidity = false);
+
+ /**
+ * Test if a cache is available or not (for the given id)
+ *
+ * @param string $id cache id
+ * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record
+ */
+ public function test($id);
+
+ /**
+ * Save some string datas into a cache record
+ *
+ * Note : $data is always "string" (serialization is done by the
+ * core not by the backend)
+ *
+ * @param string $data datas to cache
+ * @param string $id cache id
+ * @param array $tags array of strings, the cache record will be tagged by each string entry
+ * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime)
+ * @return boolean true if no problem
+ */
+ public function save($data, $id, $tags = array(), $specificLifetime = false);
+
+ /**
+ * Remove a cache record
+ *
+ * @param string $id cache id
+ * @return boolean true if no problem
+ */
+ public function remove($id);
+
+ /**
+ * Clean some cache records
+ *
+ * Available modes are :
+ * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used)
+ * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used)
+ * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags
+ * ($tags can be an array of strings or a single string)
+ * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags}
+ * ($tags can be an array of strings or a single string)
+ *
+ * @param string $mode clean mode
+ * @param tags array $tags array of tags
+ * @return boolean true if no problem
+ */
+ public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array());
+
+}
diff --git a/libs/Zend/Cache/Backend/Memcached.php b/libs/Zend/Cache/Backend/Memcached.php
new file mode 100755
index 0000000000..81d26da12f
--- /dev/null
+++ b/libs/Zend/Cache/Backend/Memcached.php
@@ -0,0 +1,225 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Cache_Backend_Interface
+ */
+require_once 'Zend/Cache/Backend/Interface.php';
+
+/**
+ * Zend_Cache_Backend
+ */
+require_once 'Zend/Cache/Backend.php';
+
+
+/**
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Cache_Backend_Memcached extends Zend_Cache_Backend implements Zend_Cache_Backend_Interface
+{
+
+ // -----------------
+ // --- Constants ---
+ // -----------------
+ const DEFAULT_HOST = '127.0.0.1';
+ const DEFAULT_PORT = 11211;
+ const DEFAULT_PERSISTENT = true;
+
+ // ------------------
+ // --- Properties ---
+ // ------------------
+
+ /**
+ * Available options
+ *
+ * =====> (array) servers :
+ * an array of memcached server ; each memcached server is described by an associative array :
+ * 'host' => (string) : the name of the memcached server
+ * 'port' => (int) : the port of the memcached server
+ * 'persistent' => (bool) : use or not persistent connections to this memcached server
+ *
+ * =====> (boolean) compression :
+ * true if you want to use on-the-fly compression
+ *
+ * @var array available options
+ */
+ protected $_options = array(
+ 'servers' => array(array(
+ 'host' => Zend_Cache_Backend_Memcached::DEFAULT_HOST,
+ 'port' => Zend_Cache_Backend_Memcached::DEFAULT_PORT,
+ 'persistent' => Zend_Cache_Backend_Memcached::DEFAULT_PERSISTENT
+ )),
+ 'compression' => false
+ );
+
+ /**
+ * Memcache object
+ *
+ * @var mixed memcache object
+ */
+ private $_memcache = null;
+
+
+ // ----------------------
+ // --- Public methods ---
+ // ----------------------
+
+ /**
+ * Constructor
+ *
+ * @param array $options associative array of options
+ */
+ public function __construct($options = array())
+ {
+ if (!extension_loaded('memcache')) {
+ Zend_Cache::throwException('The memcache extension must be loaded for using this backend !');
+ }
+ parent::__construct($options);
+ if (isset($this->_options['servers'])) {
+ $value= $this->_options['servers'];
+ if (isset($value['host'])) {
+ // in this case, $value seems to be a simple associative array (one server only)
+ $value = array(0 => $value); // let's transform it into a classical array of associative arrays
+ }
+ $this->setOption('servers', $value);
+ }
+ $this->_memcache = new Memcache;
+ foreach ($this->_options['servers'] as $server) {
+ if (!array_key_exists('persistent', $server)) {
+ $server['persistent'] = Zend_Cache_Backend_Memcached::DEFAULT_PERSISTENT;
+ }
+ if (!array_key_exists('port', $server)) {
+ $server['port'] = Zend_Cache_Backend_Memcached::DEFAULT_PORT;
+ }
+ $this->_memcache->addServer($server['host'], $server['port'], $server['persistent']);
+ }
+ }
+
+ /**
+ * Test if a cache is available for the given id and (if yes) return it (false else)
+ *
+ * @param string $id cache id
+ * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested
+ * @return string cached datas (or false)
+ */
+ public function load($id, $doNotTestCacheValidity = false)
+ {
+ // WARNING : $doNotTestCacheValidity is not supported !!!
+ if ($doNotTestCacheValidity) {
+ $this->_log("Zend_Cache_Backend_Memcached::load() : \$doNotTestCacheValidity=true is unsupported by the Memcached backend");
+ }
+ $tmp = $this->_memcache->get($id);
+ if (is_array($tmp)) {
+ return $tmp[0];
+ }
+ return false;
+ }
+
+ /**
+ * Test if a cache is available or not (for the given id)
+ *
+ * @param string $id cache id
+ * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record
+ */
+ public function test($id)
+ {
+ $tmp = $this->_memcache->get($id);
+ if (is_array($tmp)) {
+ return $tmp[1];
+ }
+ return false;
+ }
+
+ /**
+ * Save some string datas into a cache record
+ *
+ * Note : $data is always "string" (serialization is done by the
+ * core not by the backend)
+ *
+ * @param string $data datas to cache
+ * @param string $id cache id
+ * @param array $tags array of strings, the cache record will be tagged by each string entry
+ * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime)
+ * @return boolean true if no problem
+ */
+ public function save($data, $id, $tags = array(), $specificLifetime = false)
+ {
+ $lifetime = $this->getLifetime($specificLifetime);
+ if ($this->_options['compression']) {
+ $flag = MEMCACHE_COMPRESSED;
+ } else {
+ $flag = 0;
+ }
+ $result = $this->_memcache->set($id, array($data, time()), $flag, $lifetime);
+ if (count($tags) > 0) {
+ $this->_log("Zend_Cache_Backend_Memcached::save() : tags are unsupported by the Memcached backend");
+ }
+ return $result;
+ }
+
+ /**
+ * Remove a cache record
+ *
+ * @param string $id cache id
+ * @return boolean true if no problem
+ */
+ public function remove($id)
+ {
+ return $this->_memcache->delete($id);
+ }
+
+ /**
+ * Clean some cache records
+ *
+ * Available modes are :
+ * 'all' (default) => remove all cache entries ($tags is not used)
+ * 'old' => remove too old cache entries ($tags is not used)
+ * 'matchingTag' => remove cache entries matching all given tags
+ * ($tags can be an array of strings or a single string)
+ * 'notMatchingTag' => remove cache entries not matching one of the given tags
+ * ($tags can be an array of strings or a single string)
+ *
+ * @param string $mode clean mode
+ * @param tags array $tags array of tags
+ * @return boolean true if no problem
+ */
+ public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array())
+ {
+ if ($mode==Zend_Cache::CLEANING_MODE_ALL) {
+ return $this->_memcache->flush();
+ }
+ if ($mode==Zend_Cache::CLEANING_MODE_OLD) {
+ $this->_log("Zend_Cache_Backend_Memcached::clean() : CLEANING_MODE_OLD is unsupported by the Memcached backend");
+ }
+ if ($mode==Zend_Cache::CLEANING_MODE_MATCHING_TAG) {
+ $this->_log("Zend_Cache_Backend_Memcached::clean() : tags are unsupported by the Memcached backend");
+ }
+ if ($mode==Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG) {
+ $this->_log("Zend_Cache_Backend_Memcached::clean() : tags are unsupported by the Memcached backend");
+ }
+ }
+
+}
diff --git a/libs/Zend/Cache/Backend/Sqlite.php b/libs/Zend/Cache/Backend/Sqlite.php
new file mode 100755
index 0000000000..6628c176d8
--- /dev/null
+++ b/libs/Zend/Cache/Backend/Sqlite.php
@@ -0,0 +1,411 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Cache_Backend_Interface
+ */
+require_once 'Zend/Cache/Backend/Interface.php';
+
+/**
+ * Zend_Cache_Backend
+ */
+require_once 'Zend/Cache/Backend.php';
+
+/**
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Cache_Backend_Sqlite extends Zend_Cache_Backend implements Zend_Cache_Backend_Interface
+{
+
+ // ------------------
+ // --- Properties ---
+ // ------------------
+
+ /**
+ * Available options
+ *
+ * =====> (string) cache_db_complete_path :
+ * - the complete path (filename included) of the SQLITE database
+ *
+ * ====> (int) automatic_vacuum_factor :
+ * - Disable / Tune the automatic vacuum process
+ * - The automatic vacuum process defragment the database file (and make it smaller)
+ * when a clean() or delete() is called
+ * 0 => no automatic vacuum
+ * 1 => systematic vacuum (when delete() or clean() methods are called)
+ * x (integer) > 1 => automatic vacuum randomly 1 times on x clean() or delete()
+ *
+ * @var array available options
+ */
+ protected $_options = array(
+ 'cache_db_complete_path' => null,
+ 'automatic_vacuum_factor' => 10
+ );
+
+ /**
+ * DB ressource
+ *
+ * @var mixed $_db
+ */
+ private $_db = null;
+
+ /**
+ * backward compatibility becase of ZF-879 and ZF-1172 (it will be removed in ZF 1.1)
+ *
+ * @var array
+ */
+ protected $_backwardCompatibilityArray = array(
+ 'cacheDBCompletePath' => 'cache_db_complete_path',
+ 'automaticVacuumFactor' => 'automatic_vacuum_factor'
+ );
+
+ // ----------------------
+ // --- Public methods ---
+ // ----------------------
+
+ /**
+ * Constructor
+ *
+ * @param array $options associative array of options
+ */
+ public function __construct($options = array())
+ {
+ parent::__construct($options);
+ if (is_null($this->_options['cache_db_complete_path'])) {
+ Zend_Cache::throwException('cache_db_complete_path option has to set');
+ }
+ $this->_db = @sqlite_open($this->_options['cache_db_complete_path']);
+ if (!($this->_db)) {
+ Zend_Cache::throwException("Impossible to open " . $this->_options['cache_db_complete_path'] . " cache DB file");
+ }
+ }
+
+ /**
+ * Destructor
+ */
+ public function __destruct()
+ {
+ @sqlite_close($this->_db);
+ }
+
+ /**
+ * Test if a cache is available for the given id and (if yes) return it (false else)
+ *
+ * @param string $id cache id
+ * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested
+ * @return string cached datas (or false)
+ */
+ public function load($id, $doNotTestCacheValidity = false)
+ {
+ $sql = "SELECT content FROM cache WHERE id='$id'";
+ if (!$doNotTestCacheValidity) {
+ $sql = $sql . " AND (expire=0 OR expire>" . time() . ')';
+ }
+ $result = @sqlite_query($this->_db, $sql);
+ $row = @sqlite_fetch_array($result);
+ if ($row) {
+ return $row['content'];
+ }
+ return false;
+ }
+
+ /**
+ * Test if a cache is available or not (for the given id)
+ *
+ * @param string $id cache id
+ * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record
+ */
+ public function test($id)
+ {
+ $sql = "SELECT lastModified FROM cache WHERE id='$id' AND (expire=0 OR expire>" . time() . ')';
+ $result = @sqlite_query($this->_db, $sql);
+ $row = @sqlite_fetch_array($result);
+ if ($row) {
+ return ((int) $row['lastModified']);
+ }
+ return false;
+ }
+
+ /**
+ * Save some string datas into a cache record
+ *
+ * Note : $data is always "string" (serialization is done by the
+ * core not by the backend)
+ *
+ * @param string $data datas to cache
+ * @param string $id cache id
+ * @param array $tags array of strings, the cache record will be tagged by each string entry
+ * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime)
+ * @return boolean true if no problem
+ */
+ public function save($data, $id, $tags = array(), $specificLifetime = false)
+ {
+ if (!$this->_checkStructureVersion()) {
+ $this->_buildStructure();
+ if (!$this->_checkStructureVersion()) {
+ Zend_Cache::throwException("Impossible to build cache structure in " . $this->_options['cache_db_complete_path']);
+ }
+ }
+ $lifetime = $this->getLifetime($specificLifetime);
+ $data = @sqlite_escape_string($data);
+ $mktime = time();
+ if (is_null($lifetime)) {
+ $expire = 0;
+ } else {
+ $expire = $mktime + $lifetime;
+ }
+ @sqlite_query($this->_db, "DELETE FROM cache WHERE id='$id'");
+ $sql = "INSERT INTO cache (id, content, lastModified, expire) VALUES ('$id', '$data', $mktime, $expire)";
+ $res = @sqlite_query($this->_db, $sql);
+ if (!$res) {
+ $this->_log("Zend_Cache_Backend_Sqlite::save() : impossible to store the cache id=$id");
+ return false;
+ }
+ $res = true;
+ foreach ($tags as $tag) {
+ $res = $res && $this->_registerTag($id, $tag);
+ }
+ return $res;
+ }
+
+ /**
+ * Remove a cache record
+ *
+ * @param string $id cache id
+ * @return boolean true if no problem
+ */
+ public function remove($id)
+ {
+ $res = @sqlite_query($this->_db, "SELECT COUNT(*) AS nbr FROM cache WHERE id='$id'");
+ $result1 = @sqlite_fetch_single($res);
+ $result2 = @sqlite_query($this->_db, "DELETE FROM cache WHERE id='$id'");
+ $result3 = @sqlite_query($this->_db, "DELETE FROM tag WHERE id='$id'");
+ $this->_automaticVacuum();
+ return ($result1 && $result2 && $result3);
+ }
+
+ /**
+ * Clean some cache records
+ *
+ * Available modes are :
+ * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used)
+ * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used)
+ * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags
+ * ($tags can be an array of strings or a single string)
+ * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags}
+ * ($tags can be an array of strings or a single string)
+ *
+ * @param string $mode clean mode
+ * @param tags array $tags array of tags
+ * @return boolean true if no problem
+ */
+ public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array())
+ {
+ $return = $this->_clean($mode, $tags);
+ $this->_automaticVacuum();
+ return $return;
+ }
+
+ /**
+ * PUBLIC METHOD FOR UNIT TESTING ONLY !
+ *
+ * Force a cache record to expire
+ *
+ * @param string $id cache id
+ */
+ public function ___expire($id)
+ {
+ $time = time() - 1;
+ @sqlite_query($this->_db, "UPDATE cache SET lastModified=$time, expire=$time WHERE id='$id'");
+ }
+
+ /**
+ * PUBLIC METHOD FOR UNIT TESTING ONLY !
+ *
+ * Unlink the database file
+ */
+ public function ___dropDatabaseFile()
+ {
+ @sqlite_close($this->_db);
+ @unlink($this->_options['cache_db_complete_path']);
+ }
+
+ // -----------------------
+ // --- Private methods ---
+ // -----------------------
+
+ /**
+ * Deal with the automatic vacuum process
+ */
+ private function _automaticVacuum()
+ {
+ if ($this->_options['automatic_vacuum_factor'] > 0) {
+ $rand = rand(1, $this->_options['automatic_vacuum_factor']);
+ if ($rand == 1) {
+ @sqlite_query($this->_db, 'VACUUM');
+ }
+ }
+ }
+
+ /**
+ * Register a cache id with the given tag
+ *
+ * @param string $id cache id
+ * @param string $tag tag
+ * @return boolean true if no problem
+ */
+ private function _registerTag($id, $tag) {
+ $res = @sqlite_query($this->_db, "DELETE FROM TAG WHERE name='$tag' AND id='$id'");
+ $res = @sqlite_query($this->_db, "INSERT INTO tag (name, id) VALUES ('$tag', '$id')");
+ if (!$res) {
+ $this->_log("Zend_Cache_Backend_Sqlite::_registerTag() : impossible to register tag=$tag on id=$id");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Build the database structure
+ */
+ private function _buildStructure()
+ {
+ @sqlite_query($this->_db, 'DROP INDEX tag_id_index');
+ @sqlite_query($this->_db, 'DROP INDEX tag_name_index');
+ @sqlite_query($this->_db, 'DROP INDEX cache_id_expire_index');
+ @sqlite_query($this->_db, 'DROP TABLE version');
+ @sqlite_query($this->_db, 'DROP TABLE cache');
+ @sqlite_query($this->_db, 'DROP TABLE tag');
+ @sqlite_query($this->_db, 'CREATE TABLE version (num INTEGER PRIMARY KEY)');
+ @sqlite_query($this->_db, 'CREATE TABLE cache (id TEXT PRIMARY KEY, content BLOB, lastModified INTEGER, expire INTEGER)');
+ @sqlite_query($this->_db, 'CREATE TABLE tag (name TEXT, id TEXT)');
+ @sqlite_query($this->_db, 'CREATE INDEX tag_id_index ON tag(id)');
+ @sqlite_query($this->_db, 'CREATE INDEX tag_name_index ON tag(name)');
+ @sqlite_query($this->_db, 'CREATE INDEX cache_id_expire_index ON cache(id, expire)');
+ @sqlite_query($this->_db, 'INSERT INTO version (num) VALUES (1)');
+ }
+
+ /**
+ * Check if the database structure is ok (with the good version)
+ *
+ * @return boolean true if ok
+ */
+ private function _checkStructureVersion()
+ {
+ $result = @sqlite_query($this->_db, "SELECT num FROM version");
+ if (!$result) return false;
+ $row = @sqlite_fetch_array($result);
+ if (!$row) {
+ return false;
+ }
+ if (((int) $row['num']) != 1) {
+ // old cache structure
+ $this->_log('Zend_Cache_Backend_Sqlite::_checkStructureVersion() : old cache structure version detected => the cache is going to be dropped');
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Clean some cache records
+ *
+ * Available modes are :
+ * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used)
+ * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used)
+ * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags
+ * ($tags can be an array of strings or a single string)
+ * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags}
+ * ($tags can be an array of strings or a single string)
+ *
+ * @param string $mode clean mode
+ * @param tags array $tags array of tags
+ * @return boolean true if no problem
+ */
+ private function _clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array())
+ {
+ if ($mode==Zend_Cache::CLEANING_MODE_ALL) {
+ $res1 = @sqlite_query($this->_db, 'DELETE FROM cache');
+ $res2 = @sqlite_query($this->_db, 'DELETE FROM tag');
+ return $res1 && $res2;
+ }
+ if ($mode==Zend_Cache::CLEANING_MODE_OLD) {
+ $mktime = time();
+ $res1 = @sqlite_query($this->_db, "DELETE FROM tag WHERE id IN (SELECT id FROM cache WHERE expire>0 AND expire<=$mktime)");
+ $res2 = @sqlite_query($this->_db, "DELETE FROM cache WHERE expire>0 AND expire<=$mktime");
+ return $res1 && $res2;
+ }
+ if ($mode==Zend_Cache::CLEANING_MODE_MATCHING_TAG) {
+ $first = true;
+ $ids = array();
+ foreach ($tags as $tag) {
+ $res = @sqlite_query($this->_db, "SELECT DISTINCT(id) AS id FROM tag WHERE name='$tag'");
+ if (!$res) {
+ return false;
+ }
+ $rows = @sqlite_fetch_all($res, SQLITE_ASSOC);
+ $ids2 = array();
+ foreach ($rows as $row) {
+ $ids2[] = $row['id'];
+ }
+ if ($first) {
+ $ids = $ids2;
+ $first = false;
+ } else {
+ $ids = array_intersect($ids, $ids2);
+ }
+ }
+ $result = true;
+ foreach ($ids as $id) {
+ $result = $result && ($this->remove($id));
+ }
+ return $result;
+ }
+ if ($mode==Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG) {
+ $res = @sqlite_query($this->_db, "SELECT id FROM cache");
+ $rows = @sqlite_fetch_all($res, SQLITE_ASSOC);
+ $result = true;
+ foreach ($rows as $row) {
+ $id = $row['id'];
+ $matching = false;
+ foreach ($tags as $tag) {
+ $res = @sqlite_query($this->_db, "SELECT COUNT(*) AS nbr FROM tag WHERE name='$tag' AND id='$id'");
+ if (!$res) {
+ return false;
+ }
+ $nbr = (int) @sqlite_fetch_single($res);
+ if ($nbr > 0) {
+ $matching = true;
+ }
+ }
+ if (!$matching) {
+ $result = $result && $this->remove($id);
+ }
+ }
+ return $result;
+ }
+ return false;
+ }
+
+}
diff --git a/libs/Zend/Cache/Backend/Test.php b/libs/Zend/Cache/Backend/Test.php
new file mode 100755
index 0000000000..cdb17b6329
--- /dev/null
+++ b/libs/Zend/Cache/Backend/Test.php
@@ -0,0 +1,259 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Cache_Backend_Interface
+ */
+require_once 'Zend/Cache/Backend/Interface.php';
+
+
+/**
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Cache_Backend_Test implements Zend_Cache_Backend_Interface
+{
+
+ // ------------------
+ // --- Properties ---
+ // ------------------
+
+ /**
+ * Available options
+ *
+ * @var array available options
+ */
+ private $_options = array();
+
+ /**
+ * Frontend or Core directives
+ *
+ * @var array directives
+ */
+ private $_directives = array();
+
+ /**
+ * Array to log actions
+ *
+ * @var array $_log
+ */
+ private $_log = array();
+
+ /**
+ * Current index for log array
+ *
+ * @var int $_index
+ */
+ private $_index = 0;
+
+
+ // ----------------------
+ // --- Public methods ---
+ // ----------------------
+
+ /**
+ * Constructor
+ *
+ * @param array $options associative array of options
+ */
+ public function __construct($options = array())
+ {
+ $this->_addLog('construct', array($options));
+ }
+
+ /**
+ * Set the frontend directives
+ *
+ * @param array $directives assoc of directives
+ */
+ public function setDirectives($directives)
+ {
+ $this->_addLog('setDirectives', array($directives));
+ }
+
+ /**
+ * Test if a cache is available for the given id and (if yes) return it (false else)
+ *
+ * For this test backend only, if $id == 'false', then the method will return false
+ * if $id == 'serialized', the method will return a serialized array
+ * ('foo' else)
+ *
+ * @param string $id cache id
+ * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested
+ * @return string cached datas (or false)
+ */
+ public function load($id, $doNotTestCacheValidity = false)
+ {
+ $this->_addLog('get', array($id, $doNotTestCacheValidity));
+ if ($id=='false') {
+ return false;
+ }
+ if ($id=='serialized') {
+ return serialize(array('foo'));
+ }
+ if (($id=='71769f39054f75894288e397df04e445') or ($id=='615d222619fb20b527168340cebd0578')) {
+ return serialize(array('foo', 'bar'));
+ }
+ return 'foo';
+ }
+
+ /**
+ * Test if a cache is available or not (for the given id)
+ *
+ * For this test backend only, if $id == 'false', then the method will return false
+ * (123456 else)
+ *
+ * @param string $id cache id
+ * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record
+ */
+ public function test($id)
+ {
+ $this->_addLog('test', array($id));
+ if ($id=='false') {
+ return false;
+ }
+ if (($id=='d8523b3ee441006261eeffa5c3d3a0a7') or ($id=='3c439c922209e2cb0b54d6deffccd75a')) {
+ return false;
+ }
+ return 123456;
+ }
+
+ /**
+ * Save some string datas into a cache record
+ *
+ * For this test backend only, if $id == 'false', then the method will return false
+ * (true else)
+ *
+ * @param string $data datas to cache
+ * @param string $id cache id
+ * @param array $tags array of strings, the cache record will be tagged by each string entry
+ * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime)
+ * @return boolean true if no problem
+ */
+ public function save($data, $id, $tags = array(), $specificLifetime = false)
+ {
+ $this->_addLog('save', array($data, $id, $tags));
+ if ($id=='false') {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Remove a cache record
+ *
+ * For this test backend only, if $id == 'false', then the method will return false
+ * (true else)
+ *
+ * @param string $id cache id
+ * @return boolean true if no problem
+ */
+ public function remove($id)
+ {
+ $this->_addLog('remove', array($id));
+ if ($id=='false') {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Clean some cache records
+ *
+ * For this test backend only, if $mode == 'false', then the method will return false
+ * (true else)
+ *
+ * Available modes are :
+ * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used)
+ * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used)
+ * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags
+ * ($tags can be an array of strings or a single string)
+ * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags}
+ * ($tags can be an array of strings or a single string)
+ *
+ * @param string $mode clean mode
+ * @param tags array $tags array of tags
+ * @return boolean true if no problem
+ */
+ public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array())
+ {
+ $this->_addLog('clean', array($mode, $tags));
+ if ($mode=='false') {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Get the last log
+ *
+ * @return string the last log
+ */
+ public function getLastLog()
+ {
+ return $this->_log[$this->_index - 1];
+ }
+
+ /**
+ * Get the log index
+ *
+ * @return int log index
+ */
+ public function getLogIndex()
+ {
+ return $this->_index;
+ }
+
+ /**
+ * Get the complete log array
+ *
+ * @return array complete log array
+ */
+ public function getAllLogs()
+ {
+ return $this->_log;
+ }
+
+
+ // -----------------------
+ // --- Private methods ---
+ // -----------------------
+
+ /**
+ * Add an event to the log array
+ *
+ * @param string $methodName methodName
+ * @param array $args arguments
+ */
+ private function _addLog($methodName, $args)
+ {
+ $this->_log[$this->_index] = array(
+ 'methodName' => $methodName,
+ 'args' => $args
+ );
+ $this->_index = $this->_index + 1;
+ }
+
+}
diff --git a/libs/Zend/Cache/Backend/ZendPlatform.php b/libs/Zend/Cache/Backend/ZendPlatform.php
new file mode 100755
index 0000000000..c3a525f00f
--- /dev/null
+++ b/libs/Zend/Cache/Backend/ZendPlatform.php
@@ -0,0 +1,295 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Cache_Backend_Interface
+ */
+require_once 'Zend/Cache/Backend.php';
+
+/**
+ * Zend_Cache_Backend_Interface
+ */
+require_once 'Zend/Cache/Backend/Interface.php';
+
+
+/**
+ * Impementation of Zend Cache Backend using the Zend Platform (Output Content Caching)
+ *
+ * @package Zend_Cache
+ * @subpackage Backend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Cache_Backend_ZendPlatform extends Zend_Cache_Backend implements Zend_Cache_Backend_Interface
+{
+
+ // -----------------
+ // --- Constants ---
+ // -----------------
+ const TAGS_PREFIX = "internal_ZPtag:";
+
+
+ // ----------------------
+ // --- Public methods ---
+ // ----------------------
+
+ /**
+ * Constructor
+ * Validate that the Zend Platform is loaded and licensed
+ *
+ * @param array $options associative array of options
+ */
+ public function __construct($options = array())
+ {
+ if (!function_exists('accelerator_license_info')) {
+ Zend_Cache::throwException('The Zend Platform extension must be loaded for using this backend !');
+ }
+ if (!function_exists('accelerator_get_configuration')) {
+ $licenseInfo = accelerator_license_info();
+ Zend_Cache::throwException('The Zend Platform extension is not loaded correctly: '.$licenseInfo['failure_reason']);
+ }
+ $accConf = accelerator_get_configuration();
+ if (@!$accConf['output_cache_licensed']) {
+ Zend_Cache::throwException('The Zend Platform extension does not have the proper license to use content caching features');
+ }
+ if (@!$accConf['output_cache_enabled']) {
+ Zend_Cache::throwException('The Zend Platform content caching feature must be enabled for using this backend, set the \'zend_accelerator.output_cache_enabled\' directive to On !');
+ }
+ if (!is_writable($accConf['output_cache_dir'])) {
+ Zend_Cache::throwException('The cache copies directory \''. ini_get('zend_accelerator.output_cache_dir') .'\' must be writable !');
+ }
+ parent:: __construct($options);
+ }
+
+ /**
+ * Test if a cache is available for the given id and (if yes) return it (false else)
+ *
+ * @param string $id cache id
+ * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested
+ * @return string cached data (or false)
+ */
+ public function load($id, $doNotTestCacheValidity = false)
+ {
+ // doNotTestCacheValidity implemented by giving zero lifetime to the cache
+ if ($doNotTestCacheValidity) {
+ $lifetime = 0;
+ } else {
+ $lifetime = $this->_directives['lifetime'];
+ }
+ $res = output_cache_get($id, $lifetime);
+ if($res) {
+ return $res[0];
+ } else {
+ return false;
+ }
+ }
+
+
+ /**
+ * Test if a cache is available or not (for the given id)
+ *
+ * @param string $id cache id
+ * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record
+ */
+ public function test($id)
+ {
+ $result = output_cache_get($id, $this->_directives['lifetime']);
+ if ($result) {
+ return $result[1];
+ }
+ return false;
+ }
+
+ /**
+ * Save some string datas into a cache record
+ *
+ * Note : $data is always "string" (serialization is done by the
+ * core not by the backend)
+ *
+ * @param string $data data to cache
+ * @param string $id cache id
+ * @param array $tags array of strings, the cache record will be tagged by each string entry
+ * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime)
+ * @return boolean true if no problem
+ */
+ public function save($data, $id, $tags = array(), $specificLifetime = false)
+ {
+ if (!($specificLifetime === false)) {
+ $this->_log("Zend_Cache_Backend_ZendPlatform::save() : non false specifc lifetime is unsuported for this backend");
+ }
+
+ $lifetime = $this->_directives['lifetime'];
+ $result1 = output_cache_put($id, array($data, time()));
+ $result2 = (count($tags) == 0);
+
+ foreach ($tags as $tag) {
+ $tagid = self::TAGS_PREFIX.$tag;
+ $old_tags = output_cache_get($tagid, $lifetime);
+ if ($old_tags === false) {
+ $old_tags = array();
+ }
+ $old_tags[$id] = $id;
+ $result2 = output_cache_put($tagid, $old_tags);
+ }
+
+ return $result1 && $result2;
+ }
+
+
+ /**
+ * Remove a cache record
+ *
+ * @param string $id cache id
+ * @return boolean true if no problem
+ */
+ public function remove($id)
+ {
+ return output_cache_remove_key($id);
+ }
+
+
+ /**
+ * Clean some cache records
+ *
+ * Available modes are :
+ * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used)
+ * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used)
+ * This mode is not supported in this backend
+ * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags
+ * ($tags can be an array of strings or a single string)
+ * This mode is not supported in this backend
+ * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not matching one of the given tags
+ * ($tags can be an array of strings or a single string)
+ * This mode is not supported in this backend
+ *
+ * @param string $mode clean mode
+ * @param tags array $tags array of tags
+ * @return boolean true if no problem
+ */
+ public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array())
+ {
+ if ($mode==Zend_Cache::CLEANING_MODE_MATCHING_TAG) {
+ $idlist = null;
+ foreach ($tags as $tag) {
+ $next_idlist = output_cache_get(self::TAGS_PREFIX.$tag, $this->_directives['lifetime']);
+ if ($idlist) {
+ $idlist = array_intersect_assoc($idlist, $next_idlist);
+ } else {
+ $idlist = $next_idlist;
+ }
+ if (count($idlist) == 0) {
+ // if ID list is already empty - we may skip checking other IDs
+ $idlist = null;
+ break;
+ }
+ }
+ if ($idlist) {
+ foreach ($idlist as $id) {
+ output_cache_remove_key($id);
+ }
+ }
+ return true;
+ }
+ if ($mode==Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG) {
+ $this->_log("Zend_Cache_Backend_ZendPlatform::clean() : CLEANING_MODE_NOT_MATCHING_TAG is not supported by the Zend Platform backend");
+ }
+ $cache_dir = ini_get('zend_accelerator.output_cache_dir');
+ if (!$cache_dir) {
+ return false;
+ }
+ $cache_dir .= '/.php_cache_api/';
+ return $this->_clean($cache_dir, $mode);
+ }
+
+
+ // -----------------------
+ // --- Private methods ---
+ // -----------------------
+
+
+ /**
+ * Clean a directory and recursivly go over it's subdirectories
+ *
+ * Remove all the cached files that need to be cleaned (according to mode and files mtime)
+ *
+ * @param string $dir Path of directory ot clean
+ * @param string $mode The same parameter as in Zend_Cache_Backend_ZendPlatform::clean()
+ * @return boolean true if ok
+ */
+ private function _clean($dir, $mode)
+ {
+ $d = @dir($dir);
+ if (!$d) {
+ return false;
+ }
+ $result = true;
+ while (false !== ($file = $d->read())) {
+ if ($file == '.' || $file == '..') {
+ continue;
+ }
+ $file = $d->path . $file;
+ if (is_dir($file)) {
+ $result = ($this->_clean($file .'/', $mode)) && ($result);
+ } else {
+ if ($mode == Zend_Cache::CLEANING_MODE_ALL) {
+ $result = ($this->_remove($file)) && ($result);
+ } else if ($mode == Zend_Cache::CLEANING_MODE_OLD) {
+ // Files older than lifetime get deleted from cache
+ if (!is_null($this->_directives['lifetime'])) {
+ if ((time() - @filemtime($file)) > $this->_directives['lifetime']) {
+ $result = ($this->_remove($file)) && ($result);
+ }
+ }
+ }
+ }
+ }
+ $d->close();
+ return $result;
+ }
+
+ /**
+ * Remove a file
+ *
+ * If we can't remove the file (because of locks or any problem), we will touch
+ * the file to invalidate it
+ *
+ * @param string $file complete file path
+ * @return boolean true if ok
+ */
+ private function _remove($file)
+ {
+ if (!@unlink($file)) {
+ # If we can't remove the file (because of locks or any problem), we will touch
+ # the file to invalidate it
+ $this->_log("Zend_Cache_Backend_ZendPlatform::_remove() : we can't remove $file => we are going to try to invalidate it");
+ if (is_null($this->_directives['lifetime'])) {
+ return false;
+ }
+ if (!file_exists($file)) {
+ return false;
+ }
+ return @touch($file, time() - 2*abs($this->_directives['lifetime']));
+ }
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Cache/Core.php b/libs/Zend/Cache/Core.php
new file mode 100755
index 0000000000..ce43aadeae
--- /dev/null
+++ b/libs/Zend/Cache/Core.php
@@ -0,0 +1,474 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * @package Zend_Cache
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Cache_Core
+{
+
+ // ------------------
+ // --- Properties ---
+ // ------------------
+
+ /**
+ * Backend Object
+ *
+ * @var object
+ */
+ private $_backend = null;
+
+ /**
+ * Available options
+ *
+ * ====> (boolean) write_control :
+ * - Enable / disable write control (the cache is read just after writing to detect corrupt entries)
+ * - Enable write control will lightly slow the cache writing but not the cache reading
+ * Write control can detect some corrupt cache files but maybe it's not a perfect control
+ *
+ * ====> (boolean) caching :
+ * - Enable / disable caching
+ * (can be very usefull for the debug of cached scripts)
+ *
+ * ====> (boolean) automatic_serialization :
+ * - Enable / disable automatic serialization
+ * - It can be used to save directly datas which aren't strings (but it's slower)
+ *
+ * ====> (int) automatic_cleaning_factor :
+ * - Disable / Tune the automatic cleaning process
+ * - The automatic cleaning process destroy too old (for the given life time)
+ * cache files when a new cache file is written :
+ * 0 => no automatic cache cleaning
+ * 1 => systematic cache cleaning
+ * x (integer) > 1 => automatic cleaning randomly 1 times on x cache write
+ *
+ * ====> (int) lifetime :
+ * - Cache lifetime (in seconds)
+ * - If null, the cache is valid forever.
+ *
+ * ====> (boolean) logging :
+ * - If set to true, logging is activated (but the system is slower)
+ *
+ * @var array available options
+ */
+ protected $_options = array(
+ 'write_control' => true,
+ 'caching' => true,
+ 'automatic_serialization' => false,
+ 'automatic_cleaning_factor' => 10,
+ 'lifetime' => 3600,
+ 'logging' => false,
+ 'logger' => null
+ );
+
+ /**
+ * Array of options which have to be transfered to backend
+ */
+ protected static $_directivesList = array('lifetime', 'logging', 'logger');
+
+ /**
+ * Not used for the core, just a sort a hint to get a common setOption() method (for the core and for frontends)
+ */
+ protected $_specificOptions = array();
+
+ /**
+ * Last used cache id
+ *
+ * @var string $_lastId
+ */
+ private $_lastId = null;
+
+ /**
+ * backward compatibility becase of ZF-879 and ZF-1172 (it will be removed in ZF 1.1)
+ *
+ * @var array
+ */
+ protected $_backwardCompatibilityArray = array(
+ 'lifeTime' => 'lifetime',
+ 'writeControl' => 'write_control',
+ 'automaticSerialization' => 'automatic_serialization',
+ 'automaticCleaningFactor' => 'automatic_cleaning_factor',
+ 'cachedEntity' => 'cached_entity',
+ 'cacheByDefault' => 'cache_by_default',
+ 'cachedMethods' => 'cached_methods',
+ 'nonCachedMethods' => 'non_cached_methods',
+ 'cachedFunctions' => 'cached_functions',
+ 'nonCachedFunctions' => 'non_cached_functions',
+ 'masterFile' => 'master_file',
+ 'httpConditional' => 'http_conditional',
+ 'debugHeader' => 'debug_header',
+ 'defaultOptions' => 'default_options',
+ 'cacheWithGetVariables' => 'cache_with_get_variables',
+ 'cacheWithPostVariables' => 'cache_with_post_variables',
+ 'cacheWithSessionVariables' => 'cache_with_session_variables',
+ 'cacheWithFilesVariables' => 'cache_with_files_variables',
+ 'cacheWithCookieVariables' => 'cache_with_cookie_variables',
+ 'makeIdWithGetVariables' => 'make_id_with_get_variables',
+ 'makeIdWithPostVariables' => 'make_id_with_post_variables',
+ 'makeIdWithSessionVariables' => 'make_id_with_session_variables',
+ 'makeIdWithFilesVariables' => 'make_id_with_files_variables',
+ 'makeIdWithCookieVariables' => 'make_id_with_cookie_variables'
+ );
+
+ // ----------------------
+ // --- Public methods ---
+ // ----------------------
+
+ /**
+ * Constructor
+ *
+ * @param array $options associative array of options
+ */
+ public function __construct($options = array())
+ {
+ if (!is_array($options)) {
+ Zend_Cache::throwException('Options parameter must be an array');
+ }
+ while (list($name, $value) = each($options)) {
+ $this->setOption($name, $value);
+ }
+ $this->_loggerSanity();
+ }
+
+ /**
+ * Set the backend
+ *
+ * @param object $backendObject
+ */
+ public function setBackend($backendObject)
+ {
+ if (!is_object($backendObject)) {
+ Zend_Cache::throwException('Incorrect backend object !');
+ }
+ $this->_backend= $backendObject;
+ // some options (listed in $_directivesList) have to be given
+ // to the backend too (even if they are not "backend specific")
+ $directives = array();
+ foreach (Zend_Cache_Core::$_directivesList as $directive) {
+ $directives[$directive] = $this->_options[$directive];
+ }
+ $this->_backend->setDirectives($directives);
+ }
+
+ /**
+ * Public frontend to set an option
+ *
+ * There is an additional validation (relatively to the protected _setOption method)
+ *
+ * @param string $name name of the option
+ * @param mixed $value value of the option
+ */
+ public function setOption($name, $value)
+ {
+ if (is_string($name)) {
+ if (array_key_exists($name, $this->_backwardCompatibilityArray)) {
+ $tmp = $this->_backwardCompatibilityArray[$name];
+ $this->_log("$name option is deprecated, use $tmp instead (same syntax) !");
+ $name = $tmp;
+ } else {
+ $name = strtolower($name);
+ }
+ if (array_key_exists($name, $this->_options)) {
+ // This is a Core option
+ $this->_setOption($name, $value);
+ return;
+ }
+ if (array_key_exists($name, $this->_specificOptions)) {
+ // This a specic option of this frontend
+ $this->_specificOptions[$name] = $value;
+ return;
+ }
+ }
+ Zend_Cache::throwException("Incorrect option name : $name");
+ }
+
+ /**
+ * Set an option
+ *
+ * @param string $name name of the option
+ * @param mixed $value value of the option
+ */
+ private function _setOption($name, $value)
+ {
+ if (!is_string($name) || !array_key_exists($name, $this->_options)) {
+ Zend_Cache::throwException("Incorrect option name : $name");
+ }
+ $this->_options[$name] = $value;
+ }
+
+ /**
+ * Force a new lifetime
+ *
+ * The new value is set for the core/frontend but for the backend too (directive)
+ *
+ * @param int $newLifetime new lifetime (in seconds)
+ */
+ public function setLifetime($newLifetime)
+ {
+ $this->_options['lifetime'] = $newLifetime;
+ $this->_backend->setDirectives(array(
+ 'lifetime' => $newLifetime
+ ));
+ }
+
+ /**
+ * Test if a cache is available for the given id and (if yes) return it (false else)
+ *
+ * @param string $id cache id
+ * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested
+ * @param boolean $doNotUnserialize do not serialize (even if automatic_serialization is true) => for internal use
+ * @return mixed cached datas (or false)
+ */
+ public function load($id, $doNotTestCacheValidity = false, $doNotUnserialize = false)
+ {
+ if (!$this->_options['caching']) {
+ return false;
+ }
+ $this->_lastId = $id;
+ self::_validateIdOrTag($id);
+ $data = $this->_backend->load($id, $doNotTestCacheValidity);
+ if ($data===false) {
+ // no cache available
+ return false;
+ }
+ if ((!$doNotUnserialize) && $this->_options['automatic_serialization']) {
+ // we need to unserialize before sending the result
+ return unserialize($data);
+ }
+ return $data;
+ }
+
+ /**
+ * THIS METHOD IS DEPRECATED : USE LOAD() INSTEAD (same syntax) !
+ *
+ * it will be removed in ZF 1.1 !
+ */
+ public function get($id, $doNotTestCacheValidity = false, $doNotUnserialize = false)
+ {
+ $this->_log("get() method is deprecated => use load() method instead (same syntax) !");
+ return $this->load($id, $doNotTestCacheValidity, $doNotUnserialize);
+ }
+
+ /**
+ * Test if a cache is available for the given id
+ *
+ * @param string $id cache id
+ * @return boolean true is a cache is available, false else
+ */
+ public function test($id)
+ {
+ if (!$this->_options['caching']) {
+ return false;
+ }
+ self::_validateIdOrTag($id);
+ $this->_lastId = $id;
+ return $this->_backend->test($id);
+ }
+
+ /**
+ * Save some data in a cache
+ *
+ * @param mixed $data data to put in cache (can be another type than string if automatic_serialization is on)
+ * @param cache $id cache id (if not set, the last cache id will be used)
+ * @param array $tags cache tags
+ * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime)
+ * @return boolean true if no problem
+ */
+ public function save($data, $id = null, $tags = array(), $specificLifetime = false)
+ {
+ if (!$this->_options['caching']) {
+ return true;
+ }
+ if (is_null($id)) {
+ $id = $this->_lastId;
+ }
+ self::_validateIdOrTag($id);
+ self::_validateTagsArray($tags);
+ if ($this->_options['automatic_serialization']) {
+ // we need to serialize datas before storing them
+ $data = serialize($data);
+ } else {
+ if (!is_string($data)) {
+ Zend_Cache::throwException("Datas must be string or set automatic_serialization = true");
+ }
+ }
+ // automatic cleaning
+ if ($this->_options['automatic_cleaning_factor'] > 0) {
+ $rand = rand(1, $this->_options['automatic_cleaning_factor']);
+ if ($rand==1) {
+ $this->clean('old');
+ }
+ }
+ $result = $this->_backend->save($data, $id, $tags, $specificLifetime);
+ if (!$result) {
+ // maybe the cache is corrupted, so we remove it !
+ if ($this->_options['logging']) {
+ $this->_log("Zend_Cache_Core::save() : impossible to save cache (id=$id)");
+ }
+ $this->remove($id);
+ return false;
+ }
+ if ($this->_options['write_control']) {
+ $data2 = $this->_backend->load($id, true);
+ if ($data!=$data2) {
+ $this->_log('Zend_Cache_Core::save() / write_control : written and read data do not match');
+ $this->remove($id);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Remove a cache
+ *
+ * @param string $id cache id to remove
+ * @return boolean true if ok
+ */
+ public function remove($id)
+ {
+ if (!$this->_options['caching']) {
+ return true;
+ }
+ self::_validateIdOrTag($id);
+ return $this->_backend->remove($id);
+ }
+
+ /**
+ * Clean cache entries
+ *
+ * Available modes are :
+ * 'all' (default) => remove all cache entries ($tags is not used)
+ * 'old' => remove too old cache entries ($tags is not used)
+ * 'matchingTag' => remove cache entries matching all given tags
+ * ($tags can be an array of strings or a single string)
+ * 'notMatchingTag' => remove cache entries not matching one of the given tags
+ * ($tags can be an array of strings or a single string)
+ *
+ * @param string $mode
+ * @param mixed $parameters
+ * @return boolean true if ok
+ */
+ public function clean($mode = 'all', $tags = array())
+ {
+ if (!$this->_options['caching']) {
+ return true;
+ }
+ if (!in_array($mode, array(Zend_Cache::CLEANING_MODE_ALL, Zend_Cache::CLEANING_MODE_OLD, Zend_Cache::CLEANING_MODE_MATCHING_TAG, Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG))) {
+ Zend_Cache::throwException('Invalid cleaning mode');
+ }
+ self::_validateTagsArray($tags);
+ return $this->_backend->clean($mode, $tags);
+ }
+
+ // ------------------------------------
+ // --- Private or protected methods ---
+ // ------------------------------------
+
+ /**
+ * Validate a cache id or a tag (security, reliable filenames, reserved prefixes...)
+ *
+ * Throw an exception if a problem is found
+ *
+ * @param string $string cache id or tag
+ */
+ private static function _validateIdOrTag($string)
+ {
+ if (!is_string($string)) {
+ Zend_Cache::throwException('Invalid id or tag : must be a string');
+ }
+ if (substr($string, 0, 9) == 'internal-') {
+ Zend_Cache::throwException('"internal-*" ids or tags are reserved');
+ }
+ if (!preg_match('~^[\w]+$~', $string)) {
+ Zend_Cache::throwException('Invalid id or tag : must use only [a-zA-Z0-9_]');
+ }
+ }
+
+ /**
+ * Validate a tags array (security, reliable filenames, reserved prefixes...)
+ *
+ * Throw an exception if a problem is found
+ *
+ * @param array $tags array of tags
+ */
+ private static function _validateTagsArray($tags)
+ {
+ if (!is_array($tags)) {
+ Zend_Cache::throwException('Invalid tags array : must be an array');
+ }
+ foreach($tags as $tag) {
+ self::_validateIdOrTag($tag);
+ }
+ reset($tags);
+ }
+
+ /**
+ * Make sure if we enable logging that the Zend_Log class
+ * is available.
+ * Create a default log object if none is set.
+ *
+ * @return void
+ * @throws Zend_Cache_Exception
+ */
+ protected function _loggerSanity()
+ {
+ if (!isset($this->_options['logging']) || !$this->_options['logging']) {
+ return;
+ }
+ try {
+ require_once 'Zend/Loader.php';
+ Zend_Loader::loadClass('Zend_Log');
+ } catch (Zend_Exception $e) {
+ Zend_Cache::throwException('Logging feature is enabled but the Zend_Log class is not available');
+ }
+ if (isset($this->_options['logger']) && $this->_options['logger'] instanceof Zend_Log) {
+ return;
+ }
+ // Create a default logger to the standard output stream
+ Zend_Loader::loadClass('Zend_Log_Writer_Stream');
+ $logger = new Zend_Log(new Zend_Log_Writer_Stream('php://output'));
+ $this->_options['logger'] = $logger;
+ }
+
+ /**
+ * Log a message at the WARN (4) priority.
+ *
+ * @param string $message
+ * @return void
+ * @throws Zend_Cache_Exception
+ */
+ protected function _log($message, $priority = 4)
+ {
+ if (!$this->_options['logging']) {
+ return;
+ }
+ if (!(isset($this->_options['logger']) || $this->_options['logger'] instanceof Zend_Log)) {
+ Zend_Cache::throwException('Logging is enabled but logger is not set');
+ }
+ $logger = $this->_options['logger'];
+ $logger->log($message, $priority);
+ }
+
+}
diff --git a/libs/Zend/Cache/EXAMPLES.txt b/libs/Zend/Cache/EXAMPLES.txt
new file mode 100755
index 0000000000..cfe60f8413
--- /dev/null
+++ b/libs/Zend/Cache/EXAMPLES.txt
@@ -0,0 +1,373 @@
+// =================================================
+// === Classical use of the "Core" of Zend_Cache ===
+// =================================================
+
+<?php
+
+require_once 'Zend/Cache.php';
+
+$frontendOptions = array(
+ 'lifetime' => 7200 // cache lifetime of 2 hours
+);
+
+$backendOptions = array(
+ 'cache_dir' => '/tmp/' // Directory where to put the cache files (make sure to add a trailing slash)
+);
+
+$cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
+
+$id = 'foo'; // cache id of "what we want to cache"
+
+if (!($cache->test($id))) {
+ // cache missed
+
+ require_once ... // for perfs reasons, all "require_once" have to be loaded ONLY if the cache is missed
+ require_once ...
+
+ // we build "what we want to cache"
+ // for example
+ $data = '';
+ for ($i=0;$i<10000;$i++) {
+ $data = $data . $i;
+ }
+
+ // We save the result into the cache
+ $cache->save($data);
+
+} else {
+ // cache hit
+
+ $data = $cache->load($id);
+
+}
+
+// do something with $data :)
+// [...]
+
+?>
+
+
+// =================================================
+// === "Compact" use of the "Core" of Zend_Cache ===
+// =================================================
+
+// This is ok if you store only strings into the cache
+// (because with "automatic_serialization" option, it's possible to store
+// some booleans into cache)
+
+<?php
+
+// [...] // require and configuration
+
+$cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
+$id = 'foo'; // cache id of "what we want to cache"
+
+if (!($data = $cache->load($id))) {
+ // cache missed
+
+ $data = '';
+ for ($i=0;$i<10000;$i++) {
+ $data = $data . $i;
+ }
+
+ $cache->save($data);
+
+}
+
+echo($data);
+
+?>
+
+
+// =================================================
+// === "Compact" use of the "Core" of Zend_Cache ===
+// === (example with two blocks) ===
+// =================================================
+
+// This is ok if you store only strings into the cache
+// (because with "automatic_serialization" option, it's possible to store
+// some booleans into cache)
+
+<?php
+
+// [...] // require and configuration
+
+$cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
+$id1 = 'foo'; // cache id of block1
+$id2 = 'bar'; // cache id of block2
+
+// BLOCK1
+if (!($data = $cache->load($id1))) {
+ // cache missed
+
+ $data = '';
+ for ($i=0;$i<10000;$i++) {
+ $data = $data . $i;
+ }
+
+ $cache->save($data);
+
+}
+echo($data);
+
+// NEVER CACHED BLOCK
+echo('NEVER CACHED !');
+
+// BLOCK2
+if (!($data = $cache->load($id2))) {
+ // cache missed
+
+ $data = '';
+ for ($i=0;$i<10000;$i++) {
+ $data = $data . '!';
+ }
+
+ $cache->save($data);
+
+}
+echo($data);
+
+?>
+
+
+// =========================================================
+// === "Compact" use of the "Core" of Zend_Cache ===
+// === (example with two blocks and different lifetimes) ===
+// =========================================================
+
+<?php
+
+// [...] // require and configuration
+
+$cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
+$id1 = 'foo'; // cache id of block1
+$id2 = 'bar'; // cache id of block2
+
+// BLOCK1
+if (!($data = $cache->load($id1))) {
+ // cache missed
+
+ $data = '';
+ for ($i=0;$i<10000;$i++) {
+ $data = $data . $i;
+ }
+
+ $cache->save($data);
+
+}
+echo($data);
+
+// NEVER CACHED BLOCK
+echo('NEVER CACHED !');
+
+// BLOCK2
+if (!($data = $cache->load($id2))) {
+ // cache missed
+
+ $data = '';
+ for ($i=0;$i<10000;$i++) {
+ $data = $data . '!';
+ }
+
+ $cache->save($data, null, array(), 3600);
+ // => this cache will have a specific lifetime of 3600 seconds
+
+}
+echo($data);
+
+?>
+
+
+// ============================================================
+// === Classical use of the "Output" frontend of Zend_Cache ===
+// ============================================================
+
+<?php
+
+require_once 'Zend/Cache.php';
+
+$frontendOptions = array(
+ 'lifetime' => 7200 // cache lifetime of 2 hours
+);
+
+$backendOptions = array(
+ 'cache_dir' => '/tmp/' // Directory where to put the cache files (make sure to add a trailing slash)
+);
+
+$cache = Zend_Cache::factory('Output', 'File', $frontendOptions, $backendOptions);
+
+$id = 'foo'; // cache id of "what we want to cache"
+
+if (!($cache->start($id))) {
+ // cache is not hit !
+
+ // Output you want to cache
+ for ($i=0;$i<10000;$i++) {
+ echo($i);
+ }
+
+ // store "captured" output into cache
+ $cache->end();
+}
+
+?>
+
+
+// ==============================================================
+// === Classical use of the "Function" frontend of Zend_Cache ===
+// ==============================================================
+
+<?php
+
+require_once 'Zend/Cache.php';
+
+$frontendOptions = array(
+ 'lifetime' => 7200 // cache lifetime of 2 hours
+);
+
+$backendOptions = array(
+ 'cache_dir' => '/tmp/' // Directory where to put the cache files (make sure to add a trailing slash)
+);
+
+$cache = Zend_Cache::factory('Function', 'File', $frontendOptions, $backendOptions);
+
+function function_to_cache($arg1, $arg2) {
+ echo("called function_to_cache($arg1, $arg2)");
+ return $arg1 + $arg2;
+}
+
+// First call, the function will be called
+$res1 = $cache->call('function_to_cache', array(1, 3));
+echo($res1);
+
+// Second call, output and result will be get from cache
+$res2 = $cache->call('function_to_cache', array(1, 3));
+echo($res2);
+
+// Third call, the function will be called (because argument values are different)
+$res3 = $cache->call('function_to_cache', array(2, 5));
+echo($res3);
+
+?>
+
+
+// ===========================================================
+// === Classical use of the "Class" frontend of Zend_Cache ===
+// === (mode : class) ===
+// ===========================================================
+
+<?php
+
+// Class to cache
+class test {
+
+ public static function foobar($param1, $param2) {
+ echo "foobar_output($param1, $param2)";
+ return "foobar_return($param1, $param2)";
+ }
+
+}
+
+require_once 'Zend/Cache.php';
+
+$frontendOptions = array(
+ 'lifetime' => 7200 // cache lifetime of 2 hours,
+ 'cached_entity' => 'test'
+);
+
+$backendOptions = array(
+ 'cache_dir' => '/tmp/' // Directory where to put the cache files (make sure to add a trailing slash)
+);
+
+$cache = Zend_Cache::factory('Class', 'File', $frontendOptions, $backendOptions);
+
+// First call, the static method will be called
+$res1 = $cache->foobar(1, 3);
+echo($res1);
+
+// Second call, output and result will be get from cache
+$res2 = $cache->foobar(1, 3);
+echo($res2);
+
+// Third call, the method will be called (because argument values are different)
+$res3 = $cache->foobar(2, 5)
+echo($res3);
+
+?>
+
+
+// ===========================================================
+// === Classical use of the "Class" frontend of Zend_Cache ===
+// === (mode : object) ===
+// ===========================================================
+
+<?php
+
+// Class to cache
+class test {
+
+ private $_string = 'hello !';
+
+ public function foobar2($param1, $param2) {
+ echo($this->_string);
+ echo "foobar2_output($param1, $param2)";
+ return "foobar2_return($param1, $param2)";
+ }
+
+}
+
+require_once 'Zend/Cache.php';
+
+$frontendOptions = array(
+ 'lifetime' => 7200 // cache lifetime of 2 hours,
+ 'cached_entity' => new test()
+);
+
+$backendOptions = array(
+ 'cache_dir' => '/tmp/' // Directory where to put the cache files (make sure to add a trailing slash)
+);
+
+$cache = Zend_Cache::factory('Class', 'File', $frontendOptions, $backendOptions);
+
+// First call, the method will be called
+$res1 = $cache->foobar(1, 3);
+echo($res1);
+
+// Second call, output and result will be get from cache
+$res2 = $cache->foobar(1, 3);
+echo($res2);
+
+// Third call, the method will be called (because argument values are different)
+$res3 = $cache->foobar(2, 5)
+echo($res3);
+
+?>
+
+
+// ==========================================================
+// === Classical use of the "File" frontend of Zend_Cache ===
+// ==========================================================
+
+<?php
+
+// The file frontend is used to get a cache driven by a master file
+// for example, you have a config file declared as master file
+// => all your cache records will be invalidated if the config file is touched
+// (very usefull to avoid the parsing of a XML file at each time for example)
+
+require_once 'Zend/Cache.php';
+
+$frontendOptions = array(
+ 'lifetime' => null // no lifetime,
+ 'master_file' => '/path/to/your/master.file' // your master file here
+);
+
+$backendOptions = array(
+ 'cache_dir' => '/tmp/' // Directory where to put the cache files (make sure to add a trailing slash)
+);
+
+$cache = Zend_Cache::factory('File', 'File', $frontendOptions, $backendOptions);
+
+// [...] identical to the "Core" use
+
+?> \ No newline at end of file
diff --git a/libs/Zend/Cache/Exception.php b/libs/Zend/Cache/Exception.php
new file mode 100755
index 0000000000..57c8606f8f
--- /dev/null
+++ b/libs/Zend/Cache/Exception.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+/**
+ * @package Zend_Cache
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license Zend Framework License version 1.0
+ */
+class Zend_Cache_Exception extends Zend_Exception {}
diff --git a/libs/Zend/Cache/Frontend/Class.php b/libs/Zend/Cache/Frontend/Class.php
new file mode 100755
index 0000000000..99bea0bbe8
--- /dev/null
+++ b/libs/Zend/Cache/Frontend/Class.php
@@ -0,0 +1,190 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @subpackage Frontend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Cache_Core
+ */
+require_once 'Zend/Cache/Core.php';
+
+
+/**
+ * @package Zend_Cache
+ * @subpackage Frontend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Cache_Frontend_Class extends Zend_Cache_Core
+{
+
+ // ------------------
+ // --- Properties ---
+ // ------------------
+
+ /**
+ * Available options
+ *
+ * ====> (mixed) cached_entity :
+ * - if set to a class name, we will cache an abstract class and will use only static calls
+ * - if set to an object, we will cache this object methods
+ *
+ * ====> (boolean) cache_by_default :
+ * - if true, method calls will be cached by default
+ *
+ * ====> (array) cached_methods :
+ * - an array of method names which will be cached (even if cache_by_default = false)
+ *
+ * ====> (array) non_cached_methods :
+ * - an array of method names which won't be cached (even if cache_by_default = true)
+ *
+ * @var array available options
+ */
+ protected $_specificOptions = array(
+ 'cached_entity' => null,
+ 'cache_by_default' => true,
+ 'cached_methods' => array(),
+ 'non_cached_methods' => array()
+ );
+
+ /**
+ * Tags array
+ *
+ * @var array
+ */
+ private $_tags = array();
+
+ /**
+ * SpecificLifetime value
+ *
+ * false => no specific life time
+ *
+ * @var int
+ */
+ private $_specificLifetime = false;
+
+ /**
+ * The cached object or the name of the cached abstract class
+ *
+ * @var mixed
+ */
+ private $_cachedEntity = null;
+
+
+ // ----------------------
+ // --- Public methods ---
+ // ----------------------
+
+ /**
+ * Constructor
+ *
+ * @param array $options associative array of options
+ */
+ public function __construct($options = array())
+ {
+ while (list($name, $value) = each($options)) {
+ $this->setOption($name, $value);
+ }
+ if (is_null($this->_specificOptions['cached_entity'])) {
+ Zend_Cache::throwException('cached_entity must be set !');
+ } else {
+ if (!is_string($this->_specificOptions['cached_entity']) && !is_object($this->_specificOptions['cached_entity'])) {
+ Zend_Cache::throwException('cached_entity must be an object or a class name');
+ }
+ }
+ $this->_cachedEntity = $this->_specificOptions['cached_entity'];
+ $this->setOption('automatic_serialization', true);
+ }
+
+ /**
+ * Set a specific life time
+ *
+ * @param int $specificLifetime
+ */
+ public function setSpecificLifetime($specificLifetime = false)
+ {
+ $this->_specificLifetime = $specificLifetime;
+ }
+
+ /**
+ * Set the cache array
+ *
+ * @param array $tags
+ */
+ public function setTagsArray($tags = array())
+ {
+ $this->_tags = $tags;
+ }
+
+ /**
+ * Main method : call the specified method or get the result from cache
+ *
+ * @param string $name method name
+ * @param array $parameters method parameters
+ * @return mixed result
+ */
+ public function __call($name, $parameters)
+ {
+ $cacheBool1 = $this->_specificOptions['cache_by_default'];
+ $cacheBool2 = in_array($name, $this->_specificOptions['cached_methods']);
+ $cacheBool3 = in_array($name, $this->_specificOptions['non_cached_methods']);
+ $cache = (($cacheBool1 || $cacheBool2) && (!$cacheBool3));
+ if (!$cache) {
+ // We do not have not cache
+ return call_user_func_array(array($this->_cachedEntity, $name), $parameters);
+ }
+ $id = $this->_makeId($name, $parameters);
+ if ($this->test($id)) {
+ // A cache is available
+ $result = $this->load($id);
+ $output = $result[0];
+ $return = $result[1];
+ } else {
+ // A cache is not available
+ ob_start();
+ ob_implicit_flush(false);
+ $return = call_user_func_array(array($this->_cachedEntity, $name), $parameters);
+ $output = ob_get_contents();
+ ob_end_clean();
+ $data = array($output, $return);
+ $this->save($data, $id, $this->_tags, $this->_specificLifetime);
+ }
+ echo $output;
+ return $return;
+ }
+
+
+ // ------------------------------------
+ // --- Private or protected methods ---
+ // ------------------------------------
+
+ /**
+ * Make a cache id from the method name and parameters
+ *
+ * @param string $name method name
+ * @param array $parameters method parameters
+ * @return string cache id
+ */
+ private function _makeId($name, $parameters)
+ {
+ return md5($name . serialize($parameters));
+ }
+
+}
diff --git a/libs/Zend/Cache/Frontend/File.php b/libs/Zend/Cache/Frontend/File.php
new file mode 100755
index 0000000000..342fb3b0bc
--- /dev/null
+++ b/libs/Zend/Cache/Frontend/File.php
@@ -0,0 +1,115 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @subpackage Frontend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Cache_Core
+ */
+require_once 'Zend/Cache/Core.php';
+
+
+/**
+ * @package Zend_Cache
+ * @subpackage Frontend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Cache_Frontend_File extends Zend_Cache_Core
+{
+
+ /**
+ * Available options
+ *
+ * ====> (string) master_file :
+ * - the complete path and name of the master file
+ * - this option has to be set !
+ *
+ * @var array available options
+ */
+ protected $_specificOptions = array(
+ 'master_file' => ''
+ );
+
+ /**
+ * Master file mtime
+ *
+ * @var int
+ */
+ private $_masterFile_mtime = null;
+
+ /**
+ * Constructor
+ *
+ * @param array $options associative array of options
+ */
+ public function __construct($options = array())
+ {
+ while (list($name, $value) = each($options)) {
+ $this->setOption($name, $value);
+ }
+ if (!isset($this->_specificOptions['master_file'])) {
+ Zend_Cache::throwException('master_file option must be set');
+ }
+ clearstatcache();
+ if (!($this->_masterFile_mtime = @filemtime($this->_specificOptions['master_file']))) {
+ Zend_Cache::throwException('Unable to read master_file : '.$this->_specificOptions['master_file']);
+ }
+ }
+
+ /**
+ * Test if a cache is available for the given id and (if yes) return it (false else)
+ *
+ * @param string $id cache id
+ * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested
+ * @param boolean $doNotUnserialize do not serialize (even if automatic_serialization is true) => for internal use
+ * @return mixed cached datas (or false)
+ */
+ public function load($id, $doNotTestCacheValidity = false, $doNotUnserialize = false)
+ {
+ if (!$doNotTestCacheValidity) {
+ if ($this->test($id)) {
+ return parent::load($id, true, $doNotUnserialize);
+ }
+ return false;
+ }
+ return parent::load($id, true, $doNotUnserialize);
+ }
+
+ /**
+ * Test if a cache is available for the given id
+ *
+ * @param string $id cache id
+ * @return boolean true is a cache is available, false else
+ */
+ public function test($id)
+ {
+ $lastModified = parent::test($id);
+ if ($lastModified) {
+ if ($lastModified > $this->_masterFile_mtime) {
+ return $lastModified;
+ }
+ }
+ return false;
+ }
+
+}
+
diff --git a/libs/Zend/Cache/Frontend/Function.php b/libs/Zend/Cache/Frontend/Function.php
new file mode 100755
index 0000000000..2a521da74d
--- /dev/null
+++ b/libs/Zend/Cache/Frontend/Function.php
@@ -0,0 +1,143 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @subpackage Frontend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Cache_Core
+ */
+require_once 'Zend/Cache/Core.php';
+
+
+/**
+ * @package Zend_Cache
+ * @subpackage Frontend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Cache_Frontend_Function extends Zend_Cache_Core
+{
+
+ // ------------------
+ // --- Properties ---
+ // ------------------
+
+ /**
+ * This frontend specific options
+ *
+ * ====> (boolean) cache_by_default :
+ * - if true, function calls will be cached by default
+ *
+ * ====> (array) cached_functions :
+ * - an array of function names which will be cached (even if cache_by_default = false)
+ *
+ * ====> (array) non_cached_functions :
+ * - an array of function names which won't be cached (even if cache_by_default = true)
+ *
+ * @var array options
+ */
+ protected $_specificOptions = array(
+ 'cache_by_default' => true,
+ 'cached_functions' => array(),
+ 'non_cached_functions' => array()
+ );
+
+
+ // ----------------------
+ // --- Public methods ---
+ // ----------------------
+
+ /**
+ * Constructor
+ *
+ * @param array $options associative array of options
+ */
+ public function __construct($options = array())
+ {
+ while (list($name, $value) = each($options)) {
+ $this->setOption($name, $value);
+ }
+ $this->setOption('automatic_serialization', true);
+ }
+
+ /**
+ * Main method : call the specified function or get the result from cache
+ *
+ * @param string $name function name
+ * @param array $parameters function parameters
+ * @param array $tags cache tags
+ * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime)
+ * @return mixed result
+ */
+ public function call($name, $parameters = array(), $tags = array(), $specificLifetime = false)
+ {
+ $cacheBool1 = $this->_specificOptions['cache_by_default'];
+ $cacheBool2 = in_array($name, $this->_specificOptions['cached_functions']);
+ $cacheBool3 = in_array($name, $this->_specificOptions['non_cached_functions']);
+ $cache = (($cacheBool1 || $cacheBool2) && (!$cacheBool3));
+ if (!$cache) {
+ // We do not have not cache
+ return call_user_func_array($name, $parameters);
+ }
+ $id = $this->_makeId($name, $parameters);
+ if ($this->test($id)) {
+ // A cache is available
+ $result = $this->load($id);
+ $output = $result[0];
+ $return = $result[1];
+ } else {
+ // A cache is not available
+ ob_start();
+ ob_implicit_flush(false);
+ $return = call_user_func_array($name, $parameters);
+ $output = ob_get_contents();
+ ob_end_clean();
+ $data = array($output, $return);
+ $this->save($data, $id, $tags, $specificLifetime);
+ }
+ echo $output;
+ return $return;
+ }
+
+
+ // ------------------------------------
+ // --- Private or protected methods ---
+ // ------------------------------------
+
+ /**
+ * Make a cache id from the function name and parameters
+ *
+ * @param string $name function name
+ * @param array $parameters function parameters
+ * @return string cache id
+ */
+ private function _makeId($name, $parameters)
+ {
+ if (!is_string($name)) {
+ Zend_Cache::throwException('Incorrect function name');
+ }
+ if (!is_array($parameters)) {
+ Zend_Cache::throwException('parameters argument must be an array');
+ }
+ return md5($name . serialize($parameters));
+ }
+
+}
diff --git a/libs/Zend/Cache/Frontend/Output.php b/libs/Zend/Cache/Frontend/Output.php
new file mode 100755
index 0000000000..6ea8ca3ff1
--- /dev/null
+++ b/libs/Zend/Cache/Frontend/Output.php
@@ -0,0 +1,84 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @subpackage Frontend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Cache_Core
+ */
+require_once 'Zend/Cache/Core.php';
+
+
+/**
+ * @package Zend_Cache
+ * @subpackage Frontend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Cache_Frontend_Output extends Zend_Cache_Core
+{
+
+ /**
+ * Constructor
+ *
+ * @param array $options associative array of options
+ */
+ public function __construct($options = array())
+ {
+ parent::__construct($options);
+ }
+
+
+ /**
+ * Start the cache
+ *
+ * @param string $id cache id
+ * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested
+ * @return boolean true if the cache is hit (false else)
+ */
+ public function start($id, $doNotTestCacheValidity = false)
+ {
+ $data = $this->load($id, $doNotTestCacheValidity);
+ if ($data !== false) {
+ echo($data);
+ return true;
+ }
+ ob_start();
+ ob_implicit_flush(false);
+ return false;
+ }
+
+
+ /**
+ * Stop the cache
+ *
+ * @param array $tags tags array
+ * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime)
+ */
+ public function end($tags = array(), $specificLifetime = false)
+ {
+ $data = ob_get_contents();
+ ob_end_clean();
+ $this->save($data, null, $tags, $specificLifetime);
+ echo($data);
+ }
+
+} \ No newline at end of file
diff --git a/libs/Zend/Cache/Frontend/Page.php b/libs/Zend/Cache/Frontend/Page.php
new file mode 100755
index 0000000000..7b1a7077a8
--- /dev/null
+++ b/libs/Zend/Cache/Frontend/Page.php
@@ -0,0 +1,313 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Cache
+ * @subpackage Frontend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Cache_Core
+ */
+require_once 'Zend/Cache/Core.php';
+
+
+/**
+ * @package Zend_Cache
+ * @subpackage Frontend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Cache_Frontend_Page extends Zend_Cache_Core
+{
+
+ /**
+ * This frontend specific options
+ *
+ * ====> (boolean) http_conditional :
+ * - if true, http conditional mode is on
+ * WARNING : http_conditional OPTION IS NOT IMPLEMENTED FOR THE MOMENT (TODO)
+ *
+ * ====> (boolean) debug_header :
+ * - if true, a debug text is added before each cached pages
+ *
+ * ====> (array) default_options :
+ * - an associative array of default options :
+ * - (boolean) cache : cache is on by default if true
+ * - (boolean) cacheWithXXXVariables (XXXX = 'Get', 'Post', 'Session', 'Files' or 'Cookie') :
+ * if true, cache is still on even if there are some variables in this superglobal array
+ * if false, cache is off if there are some variables in this superglobal array
+ * - (boolean) makeIdWithXXXVariables (XXXX = 'Get', 'Post', 'Session', 'Files' or 'Cookie') :
+ * if true, we have to use the content of this superglobal array to make a cache id
+ * if false, the cache id won't be dependent of the content of this superglobal array
+ *
+ * ====> (array) regexps :
+ * - an associative array to set options only for some REQUEST_URI
+ * - keys are (pcre) regexps
+ * - values are associative array with specific options to set if the regexp matchs on $_SERVER['REQUEST_URI']
+ * (see default_options for the list of available options)
+ * - if several regexps match the $_SERVER['REQUEST_URI'], only the last one will be used
+ *
+ * @var array options
+ */
+ protected $_specificOptions = array(
+ 'http_conditional' => false,
+ 'debug_header' => false,
+ 'default_options' => array(
+ 'cache_with_get_variables' => false,
+ 'cache_with_post_variables' => false,
+ 'cache_with_session_variables' => false,
+ 'cache_with_files_variables' => false,
+ 'cache_with_cookie_variables' => false,
+ 'make_id_with_get_variables' => true,
+ 'make_id_with_post_variables' => true,
+ 'make_id_with_session_variables' => true,
+ 'make_id_with_files_variables' => true,
+ 'make_id_with_cookie_variables' => true,
+ 'cache' => true
+ ),
+ 'regexps' => array()
+ );
+
+ /**
+ * Internal array to store some options
+ *
+ * @var array associative array of options
+ */
+ protected $_activeOptions = array();
+
+ /**
+ * Constructor
+ *
+ * @param array $options associative array of options
+ * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested
+ */
+ public function __construct($options = array())
+ {
+ while (list($name, $value) = each($options)) {
+ if (array_key_exists($name, $this->_backwardCompatibilityArray)) {
+ $tmp = $this->_backwardCompatibilityArray[$name];
+ $this->_log("$name option is deprecated, use $tmp instead (same syntax) !");
+ $name = $tmp;
+ } else {
+ $name = strtolower($name);
+ }
+ switch ($name) {
+ case 'regexps':
+ $this->_setRegexps($value);
+ break;
+ case 'default_options':
+ $this->_setDefaultOptions($value);
+ break;
+ default:
+ $this->setOption($name, $value);
+ }
+ }
+ if (isset($this->_specificOptions['http_conditional'])) {
+ if ($this->_specificOptions['http_conditional']) {
+ Zend_Cache::throwException('http_conditional is not implemented for the moment !');
+ }
+ }
+ }
+
+ /**
+ * Specific setter for the 'default_options' option (with some additional tests)
+ *
+ * @param array $options associative array
+ */
+ protected function _setDefaultOptions($options)
+ {
+ if (!is_array($options)) {
+ Zend_Cache::throwException('default_options must be an array !');
+ }
+ foreach ($options as $key=>$value) {
+ if (array_key_exists($key, $this->_backwardCompatibilityArray)) {
+ $tmp = $this->_backwardCompatibilityArray[$key];
+ $this->_log("$key option is deprecated, use $tmp instead (same syntax) !");
+ $key = $tmp;
+ } else {
+ $key = strtolower($key);
+ }
+ if (!isset($this->_specificOptions['default_options'][$key])) {
+ Zend_Cache::throwException("unknown option [$key] !");
+ } else {
+ $this->_specificOptions['default_options'][$key] = $value;
+ }
+ }
+ }
+
+ /**
+ * Specific setter for the 'regexps' option (with some additional tests)
+ *
+ * @param array $options associative array
+ */
+ protected function _setRegexps($regexps)
+ {
+ if (!is_array($regexps)) {
+ Zend_Cache::throwException('regexps option must be an array !');
+ }
+ foreach ($regexps as $regexp=>$conf) {
+ if (!is_array($conf)) {
+ Zend_Cache::throwException('regexps option must be an array of arrays !');
+ }
+ $validKeys = array_keys($this->_specificOptions['default_options']);
+ foreach ($conf as $key=>$value) {
+ if (array_key_exists($key, $this->_backwardCompatibilityArray)) {
+ $tmp = $this->_backwardCompatibilityArray[$key];
+ $this->_log("$key option is deprecated, use $tmp instead (same syntax) !");
+ $key = $tmp;
+ } else {
+ $key = strtolower($key);
+ }
+ if (!in_array($key, $validKeys)) {
+ Zend_Cache::throwException("unknown option [$key] !");
+ }
+ }
+ }
+ $this->setOption('regexps', $regexps);
+ }
+
+ /**
+ * Start the cache
+ *
+ * @param string $id (optional) a cache id (if you set a value here, maybe you have to use Output frontend instead)
+ * @param boolean $doNotDie for unit testing only !
+ * @return boolean true if the cache is hit (false else)
+ */
+ public function start($id = false, $doNotDie = false)
+ {
+ $lastMatchingRegexp = null;
+ foreach ($this->_specificOptions['regexps'] as $regexp => $conf) {
+ if (preg_match("`$regexp`", $_SERVER['REQUEST_URI'])) {
+ $lastMatchingRegexp = $regexp;
+ }
+ }
+ $this->_activeOptions = $this->_specificOptions['default_options'];
+ if (!is_null($lastMatchingRegexp)) {
+ $conf = $this->_specificOptions['regexps'][$lastMatchingRegexp];
+ foreach ($conf as $key=>$value) {
+ $this->_activeOptions[$key] = $value;
+ }
+ }
+ if (!($this->_activeOptions['cache'])) {
+ return false;
+ }
+ if (!$id) {
+ $id = $this->_makeId();
+ if (!$id) {
+ return false;
+ }
+ }
+ $data = $this->load($id);
+ if ($data !== false) {
+ if ($this->_specificOptions['debug_header']) {
+ echo 'DEBUG HEADER : This is a cached page !';
+ }
+ echo $data;
+ if ($doNotDie) {
+ return true;
+ }
+ die();
+ }
+ ob_start(array($this, '_flush'));
+ ob_implicit_flush(false);
+ return false;
+ }
+
+ /**
+ * callback for output buffering
+ * (shouldn't really be called manually)
+ *
+ * @param string $data buffered output
+ * @return string data to send to browser
+ */
+ public function _flush($data)
+ {
+ $this->save($data);
+ return $data;
+ }
+
+ /**
+ * Make an id depending on REQUEST_URI and superglobal arrays (depending on options)
+ *
+ * @return mixed a cache id (string), false if the cache should have not to be used
+ */
+ private function _makeId()
+ {
+ $tmp = $_SERVER['REQUEST_URI'];
+ foreach (array('Get', 'Post', 'Session', 'Files', 'Cookie') as $arrayName) {
+ $tmp2 = $this->_makePartialId($arrayName, $this->_activeOptions['cache_with_' . strtolower($arrayName) . '_variables'], $this->_activeOptions['make_id_with_' . strtolower($arrayName) . '_variables']);
+ if ($tmp2===false) {
+ return false;
+ }
+ $tmp = $tmp . $tmp2;
+ }
+ return md5($tmp);
+ }
+
+ /**
+ * Make a partial id depending on options
+ *
+ * @param string $arrayName superglobal array name
+ * @param bool $bool1 if true, cache is still on even if there are some variables in the superglobal array
+ * @param bool $bool2 if true, we have to use the content of the superglobal array to make a partial id
+ * @return mixed partial id (string) or false if the cache should have not to be used
+ */
+ private function _makePartialId($arrayName, $bool1, $bool2)
+ {
+ switch ($arrayName) {
+ case 'Get':
+ $var = $_GET;
+ break;
+ case 'Post':
+ $var = $_POST;
+ break;
+ case 'Session':
+ if (isset($_SESSION)) {
+ $var = $_SESSION;
+ } else {
+ $var = null;
+ }
+ break;
+ case 'Cookie':
+ if (isset($_COOKIE)) {
+ $var = $_COOKIE;
+ } else {
+ $var = null;
+ }
+ break;
+ case 'Files':
+ $var = $_FILES;
+ break;
+ default:
+ return false;
+ }
+ if ($bool1) {
+ if ($bool2) {
+ return serialize($var);
+ }
+ return '';
+ }
+ if (count($var) > 0) {
+ return false;
+ }
+ return '';
+ }
+
+}
+
diff --git a/libs/Zend/Cache/TODO.txt b/libs/Zend/Cache/TODO.txt
new file mode 100755
index 0000000000..a88fdb5057
--- /dev/null
+++ b/libs/Zend/Cache/TODO.txt
@@ -0,0 +1,9 @@
+Priority 1 :
+
+- end of "Page" frontend (clone of "jpcache")
+ => introduce conditionnal HTTP requests (304 Not Modified...)
+
+
+Priority 2 :
+
+- improve logging feature with debug support (only warnings are implemented now)
diff --git a/libs/Zend/Config.php b/libs/Zend/Config.php
new file mode 100755
index 0000000000..4635006527
--- /dev/null
+++ b/libs/Zend/Config.php
@@ -0,0 +1,291 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Config_Exception
+ */
+require_once 'Zend/Config/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Config implements Countable, Iterator
+{
+ /**
+ * Whether in-memory modifications to configuration data are allowed
+ *
+ * @var boolean
+ */
+ protected $_allowModifications;
+
+ /**
+ * Iteration index
+ *
+ * @var integer
+ */
+ protected $_index;
+
+ /**
+ * Number of elements in configuration data
+ *
+ * @var integer
+ */
+ protected $_count;
+
+ /**
+ * Contains array of configuration data
+ *
+ * @var array
+ */
+ protected $_data;
+
+
+ /**
+ * Contains which config file sections were loaded. This is null
+ * if all sections were loaded, a string name if one section is loaded
+ * and an array of string names if multiple sections were loaded.
+ *
+ * @var mixed
+ */
+ protected $_loadedSection;
+
+ /**
+ * This is used to track section inheritance. The keys are names of sections that
+ * extend other sections, and the values are the extended sections.
+ *
+ * @var array
+ */
+ protected $_extends = array();
+
+ /**
+ * Zend_Config provides a property based interface to
+ * an array. The data are read-only unless $allowModifications
+ * is set to true on construction.
+ *
+ * Zend_Config also implements Countable and Iterator to
+ * facilitate easy access to the data.
+ *
+ * @param array $array
+ * @param boolean $allowModifications
+ * @throws Zend_Config_Exception
+ */
+ public function __construct($array, $allowModifications = false)
+ {
+ $this->_allowModifications = (boolean) $allowModifications;
+ $this->_loadedSection = null;
+ $this->_index = 0;
+ $this->_data = array();
+ foreach ($array as $key => $value) {
+ if (is_array($value)) {
+ $this->_data[$key] = new Zend_Config($value, $this->_allowModifications);
+ } else {
+ $this->_data[$key] = $value;
+ }
+ }
+ $this->_count = count($this->_data);
+ }
+
+ /**
+ * Retrieve a value and return $default if there is no element set.
+ *
+ * @param string $name
+ * @param mixed $default
+ * @return mixed
+ */
+ public function get($name, $default = null)
+ {
+ $result = $default;
+ if (array_key_exists($name, $this->_data)) {
+ $result = $this->_data[$name];
+ }
+ return $result;
+ }
+
+ /**
+ * Magic function so that $obj->value will work.
+ *
+ * @param string $name
+ * @return mixed
+ */
+ public function __get($name)
+ {
+ return $this->get($name);
+ }
+
+ /**
+ * Only allow setting of a property if $allowModifications
+ * was set to true on construction. Otherwise, throw an exception.
+ *
+ * @param string $name
+ * @param mixed $value
+ * @throws Zend_Config_Exception
+ */
+ public function __set($name, $value)
+ {
+ if ($this->_allowModifications) {
+ if (is_array($value)) {
+ $this->_data[$name] = new Zend_Config($value, true);
+ } else {
+ $this->_data[$name] = $value;
+ }
+ $this->_count = count($this->_data);
+ } else {
+ throw new Zend_Config_Exception('Zend_Config is read only');
+ }
+ }
+
+ /**
+ * Return an associative array of the stored data.
+ *
+ * @return array
+ */
+ public function toArray()
+ {
+ $array = array();
+ foreach ($this->_data as $key => $value) {
+ if (is_object($value)) {
+ $array[$key] = $value->toArray();
+ } else {
+ $array[$key] = $value;
+ }
+ }
+ return $array;
+ }
+
+ /**
+ * Support isset() overloading on PHP 5.1
+ *
+ * @param string $name
+ * @return boolean
+ */
+ protected function __isset($name)
+ {
+ return isset($this->_data[$name]);
+ }
+
+ /**
+ * Defined by Countable interface
+ *
+ * @return int
+ */
+ public function count()
+ {
+ return $this->_count;
+ }
+
+ /**
+ * Defined by Iterator interface
+ *
+ * @return mixed
+ */
+ public function current()
+ {
+ return current($this->_data);
+ }
+
+ /**
+ * Defined by Iterator interface
+ *
+ * @return mixed
+ */
+ public function key()
+ {
+ return key($this->_data);
+ }
+
+ /**
+ * Defined by Iterator interface
+ *
+ */
+ public function next()
+ {
+ next($this->_data);
+ $this->_index++;
+ }
+
+ /**
+ * Defined by Iterator interface
+ *
+ */
+ public function rewind()
+ {
+ reset($this->_data);
+ $this->_index = 0;
+ }
+
+ /**
+ * Defined by Iterator interface
+ *
+ * @return boolean
+ */
+ public function valid()
+ {
+ return $this->_index < $this->_count;
+ }
+
+ /**
+ * Returns the section name(s) loaded.
+ *
+ * @return mixed
+ */
+ public function getSectionName()
+ {
+ return $this->_loadedSection;
+ }
+
+ /**
+ * Returns true if all sections were loaded
+ *
+ * @return boolean
+ */
+ public function areAllSectionsLoaded()
+ {
+ return $this->_loadedSection === null;
+ }
+
+ /**
+ * Throws an exception if $extendingSection may not extend $extendedSection,
+ * and tracks the section extension if it is valid.
+ *
+ * @param string $extendingSection
+ * @param string $extendedSection
+ * @throws Zend_Config_Exception
+ */
+ protected function _assertValidExtend($extendingSection, $extendedSection)
+ {
+ // detect circular section inheritance
+ $extendedSectionCurrent = $extendedSection;
+ while (array_key_exists($extendedSectionCurrent, $this->_extends)) {
+ if ($this->_extends[$extendedSectionCurrent] == $extendingSection) {
+ throw new Zend_Config_Exception('Illegal circular inheritance detected');
+ }
+ $extendedSectionCurrent = $this->_extends[$extendedSectionCurrent];
+ }
+ // remember that this section extends another section
+ $this->_extends[$extendingSection] = $extendedSection;
+ }
+
+}
diff --git a/libs/Zend/Config/Exception.php b/libs/Zend/Config/Exception.php
new file mode 100755
index 0000000000..57ee47b768
--- /dev/null
+++ b/libs/Zend/Config/Exception.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+/**
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license Zend Framework License version 1.0
+ */
+class Zend_Config_Exception extends Zend_Exception {}
+
diff --git a/libs/Zend/Config/Ini.php b/libs/Zend/Config/Ini.php
new file mode 100755
index 0000000000..e000955af5
--- /dev/null
+++ b/libs/Zend/Config/Ini.php
@@ -0,0 +1,211 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Ini.php 4532 2007-04-18 16:52:34Z darby $
+ */
+
+
+/**
+ * @see Zend_Config
+ */
+require_once 'Zend/Config.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Config_Ini extends Zend_Config
+{
+ /**
+ * String that separates nesting levels of configuration data identifiers
+ *
+ * @var string
+ */
+ protected $_nestSeparator = '.';
+
+ /**
+ * Loads the section $section from the config file $filename for
+ * access facilitated by nested object properties.
+ *
+ * If any keys with $section are called "extends", then the section
+ * pointed to by the "extends" is then included into the properties.
+ * Note that the keys in $section will override any keys of the same
+ * name in the sections that have been included via "extends".
+ *
+ * If any key includes a ".", then this will act as a separator to
+ * create a sub-property.
+ *
+ * example ini file:
+ * [all]
+ * db.connection = database
+ * hostname = live
+ *
+ * [staging]
+ * extends = all
+ * hostname = staging
+ *
+ * after calling $data = new Zend_Config_Ini($file, 'staging'); then
+ * $data->hostname === "staging"
+ * $data->db->connection === "database"
+ *
+ * The $config parameter may be provided as either a boolean or an array. If provided as a boolean, this sets the
+ * $allowModifications option of Zend_Config. If provided as an array, there are two configuration directives that
+ * may be set. For example:
+ *
+ * $config = array(
+ * 'allowModifications' => false,
+ * 'nestSeparator' => '->'
+ * );
+ *
+ * @param string $filename
+ * @param mixed $section
+ * @param boolean|array $config
+ * @throws Zend_Config_Exception
+ */
+ public function __construct($filename, $section, $config = false)
+ {
+ if (empty($filename)) {
+ throw new Zend_Config_Exception('Filename is not set');
+ }
+
+ $allowModifications = false;
+ if (is_bool($config)) {
+ $allowModifications = $config;
+ } elseif (is_array($config)) {
+ if (isset($config['allowModifications'])) {
+ $allowModifications = (bool) $config['allowModifications'];
+ }
+ if (isset($config['nestSeparator'])) {
+ $this->_nestSeparator = (string) $config['nestSeparator'];
+ }
+ }
+
+ $iniArray = parse_ini_file($filename, true);
+ $preProcessedArray = array();
+ foreach ($iniArray as $key => $data)
+ {
+ $bits = explode(':', $key);
+ $numberOfBits = count($bits);
+ $thisSection = trim($bits[0]);
+ switch (count($bits)) {
+ case 1:
+ $preProcessedArray[$thisSection] = $data;
+ break;
+
+ case 2:
+ $extendedSection = trim($bits[1]);
+ $preProcessedArray[$thisSection] = array_merge(array(';extends'=>$extendedSection), $data);
+ break;
+
+ default:
+ throw new Zend_Config_Exception("Section '$thisSection' may not extend multiple sections in $filename");
+ }
+ }
+
+ if (null === $section) {
+ $dataArray = array();
+ foreach ($preProcessedArray as $sectionName => $sectionData) {
+ $dataArray[$sectionName] = $this->_processExtends($preProcessedArray, $sectionName);
+ }
+ parent::__construct($dataArray, $allowModifications);
+ } elseif (is_array($section)) {
+ $dataArray = array();
+ foreach ($section as $sectionName) {
+ if (!isset($preProcessedArray[$sectionName])) {
+ throw new Zend_Config_Exception("Section '$sectionName' cannot be found in $filename");
+ }
+ $dataArray = array_merge($this->_processExtends($preProcessedArray, $sectionName), $dataArray);
+
+ }
+ parent::__construct($dataArray, $allowModifications);
+ } else {
+ if (!isset($preProcessedArray[$section])) {
+ throw new Zend_Config_Exception("Section '$section' cannot be found in $filename");
+ }
+ parent::__construct($this->_processExtends($preProcessedArray, $section), $allowModifications);
+ }
+
+ $this->_loadedSection = $section;
+ }
+
+ /**
+ * Helper function to process each element in the section and handle
+ * the "extends" inheritance keyword. Passes control to _processKey()
+ * to handle the "dot" sub-property syntax in each key.
+ *
+ * @param array $iniArray
+ * @param string $section
+ * @param array $config
+ * @throws Zend_Config_Exception
+ * @return array
+ */
+ protected function _processExtends($iniArray, $section, $config = array())
+ {
+ $thisSection = $iniArray[$section];
+
+ foreach ($thisSection as $key => $value) {
+ if (strtolower($key) == ';extends') {
+ if (isset($iniArray[$value])) {
+ $this->_assertValidExtend($section, $value);
+ $config = $this->_processExtends($iniArray, $value, $config);
+ } else {
+ throw new Zend_Config_Exception("Section '$section' cannot be found");
+ }
+ } else {
+ $config = $this->_processKey($config, $key, $value);
+ }
+ }
+ return $config;
+ }
+
+ /**
+ * Assign the key's value to the property list. Handle the "dot"
+ * notation for sub-properties by passing control to
+ * processLevelsInKey().
+ *
+ * @param array $config
+ * @param string $key
+ * @param string $value
+ * @throws Zend_Config_Exception
+ * @return array
+ */
+ protected function _processKey($config, $key, $value)
+ {
+ if (strpos($key, $this->_nestSeparator) !== false) {
+ $pieces = explode($this->_nestSeparator, $key, 2);
+ if (strlen($pieces[0]) && strlen($pieces[1])) {
+ if (!isset($config[$pieces[0]])) {
+ $config[$pieces[0]] = array();
+ } elseif (!is_array($config[$pieces[0]])) {
+ throw new Zend_Config_Exception("Cannot create sub-key for '{$pieces[0]}' as key already exists");
+ }
+ $config[$pieces[0]] = $this->_processKey($config[$pieces[0]], $pieces[1], $value);
+ } else {
+ throw new Zend_Config_Exception("Invalid key '$key'");
+ }
+ } else {
+ $config[$key] = $value;
+ }
+ return $config;
+ }
+
+}
diff --git a/libs/Zend/Config/Xml.php b/libs/Zend/Config/Xml.php
new file mode 100755
index 0000000000..356c791ce5
--- /dev/null
+++ b/libs/Zend/Config/Xml.php
@@ -0,0 +1,162 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Config
+ */
+require_once 'Zend/Config.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Config_Xml extends Zend_Config
+{
+ /**
+ * Loads the section $section from the config file $filename for
+ * access facilitated by nested object properties.
+ *
+ * Sections are defined in the XML as children of the root element.
+ *
+ * In order to extend another section, a section defines the "extends"
+ * attribute having a value of the section name from which the extending
+ * section inherits values.
+ *
+ * Note that the keys in $section will override any keys of the same
+ * name in the sections that have been included via "extends".
+ *
+ * @param string $filename
+ * @param mixed $section
+ * @param boolean $allowModifications
+ * @throws Zend_Config_Exception
+ */
+ public function __construct($filename, $section, $allowModifications = false)
+ {
+ if (empty($filename)) {
+ throw new Zend_Config_Exception('Filename is not set');
+ }
+
+ $config = simplexml_load_file($filename);
+
+ if (null === $section) {
+ $dataArray = array();
+ foreach ($config as $sectionName => $sectionData) {
+ $dataArray[$sectionName] = $this->_processExtends($config, $sectionName);
+ }
+ parent::__construct($dataArray, $allowModifications);
+ } elseif (is_array($section)) {
+ $dataArray = array();
+ foreach ($section as $sectionName) {
+ if (!isset($config->$sectionName)) {
+ throw new Zend_Config_Exception("Section '$sectionName' cannot be found in $filename");
+ }
+ $dataArray = array_merge($this->_processExtends($config, $sectionName), $dataArray);
+ }
+ parent::__construct($dataArray, $allowModifications);
+ } else {
+ if (!isset($config->$section)) {
+ throw new Zend_Config_Exception("Section '$section' cannot be found in $filename");
+ }
+ parent::__construct($this->_processExtends($config, $section), $allowModifications);
+ }
+
+ $this->_loadedSection = $section;
+ }
+
+
+ /**
+ * Helper function to process each element in the section and handle
+ * the "extends" inheritance attribute.
+ *
+ * @param SimpleXMLElement $element
+ * @param string $section
+ * @param array $config
+ * @throws Zend_Config_Exception
+ * @return array
+ */
+ protected function _processExtends($element, $section, $config = array())
+ {
+ if (!$element->$section) {
+ throw new Zend_Config_Exception("Section '$section' cannot be found");
+ }
+
+ $thisSection = $element->$section;
+
+ if (isset($thisSection['extends'])) {
+ $extendedSection = (string) $thisSection['extends'];
+ $this->_assertValidExtend($section, $extendedSection);
+ $config = $this->_processExtends($element, $extendedSection, $config);
+ }
+
+ $config = $this->_arrayMergeRecursive($config, $this->_toArray($thisSection));
+
+ return $config;
+ }
+
+
+ /**
+ * Returns an associative and possibly multidimensional array from a SimpleXMLElement.
+ *
+ * @param SimpleXMLElement $xmlObject
+ * @return array
+ */
+ protected function _toArray($xmlObject)
+ {
+ $config = array();
+ foreach ($xmlObject->children() as $key => $value) {
+ if ($value->children()) {
+ $config[$key] = $this->_toArray($value);
+ } else {
+ $config[$key] = (string) $value;
+ }
+ }
+ return $config;
+ }
+
+ /**
+ * Merge two arrays recursively, overwriting keys of the same name name
+ * in $array1 with the value in $array2.
+ *
+ * @param array $array1
+ * @param array $array2
+ * @return array
+ */
+ protected function _arrayMergeRecursive($array1, $array2)
+ {
+ if (is_array($array1) && is_array($array2)) {
+ foreach ($array2 as $key => $value) {
+ if (isset($array1[$key])) {
+ $array1[$key] = $this->_arrayMergeRecursive($array1[$key], $value);
+ } else {
+ $array1[$key] = $value;
+ }
+ }
+ } else {
+ $array1 = $array2;
+ }
+ return $array1;
+ }
+
+}
diff --git a/libs/Zend/Controller/Action.php b/libs/Zend/Controller/Action.php
new file mode 100755
index 0000000000..dd56894c44
--- /dev/null
+++ b/libs/Zend/Controller/Action.php
@@ -0,0 +1,669 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Controller_Exception */
+require_once 'Zend/Controller/Action/Exception.php';
+
+/** Zend_Controller_Action_HelperBroker */
+require_once 'Zend/Controller/Action/HelperBroker.php';
+
+/** Zend_Controller_Front */
+require_once 'Zend/Controller/Front.php';
+
+/** Zend_Controller_Request_Abstract */
+require_once 'Zend/Controller/Request/Abstract.php';
+
+/** Zend_Controller_Response_Abstract */
+require_once 'Zend/Controller/Response/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Controller_Action
+{
+ /**
+ * Word delimiters (used for normalizing view script paths)
+ * @var array
+ */
+ protected $_delimiters;
+
+ /**
+ * Array of arguments provided to the constructor, minus the
+ * {@link $_request Request object}.
+ * @var array
+ */
+ protected $_invokeArgs = array();
+
+ /**
+ * Front controller instance
+ * @var Zend_Controller_Front
+ */
+ protected $_frontController;
+
+ /**
+ * Zend_Controller_Request_Abstract object wrapping the request environment
+ * @var Zend_Controller_Request_Abstract
+ */
+ protected $_request = null;
+
+ /**
+ * Zend_Controller_Response_Abstract object wrapping the response
+ * @var Zend_Controller_Response_Abstract
+ */
+ protected $_response = null;
+
+ /**
+ * View script suffix; defaults to 'phtml'
+ * @see {render()}
+ * @var string
+ */
+ public $viewSuffix = 'phtml';
+
+ /**
+ * View object
+ * @var Zend_View_Interface
+ */
+ public $view;
+
+ /**
+ * Helper Broker to assist in routing help requests to the proper object
+ *
+ * @var Zend_Controller_Action_HelperBroker
+ */
+ protected $_helper = null;
+
+ /**
+ * Class constructor
+ *
+ * The request and response objects should be registered with the
+ * controller, as should be any additional optional arguments; these will be
+ * available via {@link getRequest()}, {@link getResponse()}, and
+ * {@link getInvokeArgs()}, respectively.
+ *
+ * When overriding the constructor, please consider this usage as a best
+ * practice and ensure that each is registered appropriately; the easiest
+ * way to do so is to simply call parent::__construct($request, $response,
+ * $invokeArgs).
+ *
+ * After the request, response, and invokeArgs are set, the
+ * {@link $_helper helper broker} is initialized.
+ *
+ * Finally, {@link init()} is called as the final action of
+ * instantiation, and may be safely overridden to perform initialization
+ * tasks; as a general rule, override {@link init()} instead of the
+ * constructor to customize an action controller's instantiation.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @param Zend_Controller_Response_Abstract $response
+ * @param array $invokeArgs Any additional invocation arguments
+ * @return void
+ */
+ public function __construct(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response, array $invokeArgs = array())
+ {
+ $this->setRequest($request)
+ ->setResponse($response)
+ ->_setInvokeArgs($invokeArgs);
+ $this->_helper = new Zend_Controller_Action_HelperBroker($this);
+ $this->init();
+ }
+
+ /**
+ * Initialize object
+ *
+ * Called from {@link __construct()} as final step of object instantiation.
+ *
+ * @return void
+ */
+ public function init()
+ {
+ }
+
+ /**
+ * Initialize View object
+ *
+ * Initializes {@link $view} if not otherwise a Zend_View_Interface.
+ *
+ * If {@link $view} is not otherwise set, instantiates a new Zend_View
+ * object, using the 'views' subdirectory at the same level as the
+ * controller directory for the current module as the base directory.
+ * It uses this to set the following:
+ * - script path = views/scripts/
+ * - helper path = views/helpers/
+ * - filter path = views/filters/
+ *
+ * @return Zend_View_Interface
+ * @throws Zend_Controller_Exception if base view directory does not exist
+ */
+ public function initView()
+ {
+ if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {
+ return $this->view;
+ }
+
+ require_once 'Zend/View/Interface.php';
+ if (isset($this->view) && ($this->view instanceof Zend_View_Interface)) {
+ return $this->view;
+ }
+
+ $request = $this->getRequest();
+ $module = $request->getModuleName();
+ $dirs = $this->getFrontController()->getControllerDirectory();
+ if (empty($module) || !isset($dirs[$module])) {
+ $module = $this->getFrontController()->getDispatcher()->getDefaultModule();
+ }
+ $baseDir = dirname($dirs[$module]) . DIRECTORY_SEPARATOR . 'views';
+ if (!file_exists($baseDir) || !is_dir($baseDir)) {
+ throw new Zend_Controller_Exception('Missing base view directory ("' . $baseDir . '")');
+ }
+
+ require_once 'Zend/View.php';
+ $this->view = new Zend_View(array('basePath' => $baseDir));
+
+ return $this->view;
+ }
+
+ /**
+ * Render a view
+ *
+ * Renders a view. By default, views are found in the view script path as
+ * <controller>/<action>.phtml. You may change the script suffix by
+ * resetting {@link $viewSuffix}. You may omit the controller directory
+ * prefix by specifying boolean true for $noController.
+ *
+ * By default, the rendered contents are appended to the response. You may
+ * specify the named body content segment to set by specifying a $name.
+ *
+ * @see Zend_Controller_Response_Abstract::appendBody()
+ * @param string|null $action Defaults to action registered in request object
+ * @param string|null $name Response object named path segment to use; defaults to null
+ * @param bool $noController Defaults to false; i.e. use controller name as subdir in which to search for view script
+ * @return void
+ */
+ public function render($action = null, $name = null, $noController = false)
+ {
+ if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {
+ return $this->_helper->viewRenderer->render($action, $name, $noController);
+ }
+
+ $view = $this->initView();
+ $script = $this->getViewScript($action, $noController);
+
+ $this->getResponse()->appendBody(
+ $view->render($script),
+ $name
+ );
+ }
+
+ /**
+ * Render a given view script
+ *
+ * Similar to {@link render()}, this method renders a view script. Unlike render(),
+ * however, it does not autodetermine the view script via {@link getViewScript()},
+ * but instead renders the script passed to it. Use this if you know the
+ * exact view script name and path you wish to use, or if using paths that do not
+ * conform to the spec defined with getViewScript().
+ *
+ * By default, the rendered contents are appended to the response. You may
+ * specify the named body content segment to set by specifying a $name.
+ *
+ * @param string $script
+ * @param string $name
+ * @return void
+ */
+ public function renderScript($script, $name = null)
+ {
+ if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {
+ return $this->_helper->viewRenderer->renderScript($script, $name);
+ }
+
+ $view = $this->initView();
+ $this->getResponse()->appendBody(
+ $view->render($script),
+ $name
+ );
+ }
+
+ /**
+ * Construct view script path
+ *
+ * Used by render() to determine the path to the view script.
+ *
+ * @param string $action Defaults to action registered in request object
+ * @param bool $noController Defaults to false; i.e. use controller name as subdir in which to search for view script
+ * @return string
+ * @throws Zend_Controller_Exception with bad $action
+ */
+ public function getViewScript($action = null, $noController = null)
+ {
+ if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {
+ $viewRenderer = $this->_helper->getHelper('viewRenderer');
+ $viewRenderer->setNoController($noController);
+ return $viewRenderer->getViewScript($action);
+ }
+
+ $request = $this->getRequest();
+ if (null === $action) {
+ $action = $request->getActionName();
+ } elseif (!is_string($action)) {
+ throw new Zend_Controller_Exception('Invalid action specifier for view render');
+ }
+
+ if (null === $this->_delimiters) {
+ $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
+ $wordDelimiters = $dispatcher->getWordDelimiter();
+ $pathDelimiters = $dispatcher->getPathDelimiter();
+ $this->_delimiters = array_unique(array_merge($wordDelimiters, (array) $pathDelimiters));
+ }
+
+ $action = str_replace($this->_delimiters, '-', $action);
+ $script = $action . '.' . $this->viewSuffix;
+
+ if (!$noController) {
+ $controller = $request->getControllerName();
+ $controller = str_replace($this->_delimiters, '-', $controller);
+ $script = $controller . DIRECTORY_SEPARATOR . $script;
+ }
+
+ return $script;
+ }
+
+ /**
+ * Return the Request object
+ *
+ * @return Zend_Controller_Request_Abstract
+ */
+ public function getRequest()
+ {
+ return $this->_request;
+ }
+
+ /**
+ * Set the Request object
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return Zend_Controller_Action
+ */
+ public function setRequest(Zend_Controller_Request_Abstract $request)
+ {
+ $this->_request = $request;
+ return $this;
+ }
+
+ /**
+ * Return the Response object
+ *
+ * @return Zend_Controller_Response_Abstract
+ */
+ public function getResponse()
+ {
+ return $this->_response;
+ }
+
+ /**
+ * Set the Response object
+ *
+ * @param Zend_Controller_Response_Abstract $response
+ * @return Zend_Controller_Action
+ */
+ public function setResponse(Zend_Controller_Response_Abstract $response)
+ {
+ $this->_response = $response;
+ return $this;
+ }
+
+ /**
+ * Set invocation arguments
+ *
+ * @param array $args
+ * @return Zend_Controller_Action
+ */
+ protected function _setInvokeArgs(array $args = array())
+ {
+ $this->_invokeArgs = $args;
+ return $this;
+ }
+
+ /**
+ * Return the array of constructor arguments (minus the Request object)
+ *
+ * @return array
+ */
+ public function getInvokeArgs()
+ {
+ return $this->_invokeArgs;
+ }
+
+ /**
+ * Return a single invocation argument
+ *
+ * @param string $key
+ * @return mixed
+ */
+ public function getInvokeArg($key)
+ {
+ if (isset($this->_invokeArgs[$key])) {
+ return $this->_invokeArgs[$key];
+ }
+
+ return null;
+ }
+
+ /**
+ * Get a helper by name
+ *
+ * @param string $helperName
+ * @return Zend_Controller_Action_Helper_Abstract
+ */
+ public function getHelper($helperName)
+ {
+ return $this->_helper->{$helperName};
+ }
+
+ /**
+ * Get a clone of a helper by name
+ *
+ * @param string $helperName
+ * @return Zend_Controller_Action_Helper_Abstract
+ */
+ public function getHelperCopy($helperName)
+ {
+ return clone $this->_helper->{$helperName};
+ }
+
+ /**
+ * Set the front controller instance
+ *
+ * @param Zend_Controller_Front $front
+ * @return Zend_Controller_Action
+ */
+ public function setFrontController(Zend_Controller_Front $front)
+ {
+ $this->_frontController = $front;
+ return $this;
+ }
+
+ /**
+ * Retrieve Front Controller
+ *
+ * @return Zend_Controller_Front
+ */
+ public function getFrontController()
+ {
+ // Used cache version if found
+ if (null !== $this->_frontController) {
+ return $this->_frontController;
+ }
+
+ // Grab singleton instance, if class has been loaded
+ if (class_exists('Zend_Controller_Front')) {
+ $this->_frontController = Zend_Controller_Front::getInstance();
+ return $this->_frontController;
+ }
+
+ // Throw exception in all other cases
+ require_once 'Zend/Controller/Exception.php';
+ throw new Zend_Controller_Exception('Front controller class has not been loaded');
+ }
+
+ /**
+ * Pre-dispatch routines
+ *
+ * Called before action method. If using class with
+ * {@link Zend_Controller_Front}, it may modify the
+ * {@link $_request Request object} and reset its dispatched flag in order
+ * to skip processing the current action.
+ *
+ * @return void
+ */
+ public function preDispatch()
+ {
+ }
+
+ /**
+ * Post-dispatch routines
+ *
+ * Called after action method execution. If using class with
+ * {@link Zend_Controller_Front}, it may modify the
+ * {@link $_request Request object} and reset its dispatched flag in order
+ * to process an additional action.
+ *
+ * Common usages for postDispatch() include rendering content in a sitewide
+ * template, link url correction, setting headers, etc.
+ *
+ * @return void
+ */
+ public function postDispatch()
+ {
+ }
+
+ /**
+ * Proxy for undefined methods. Default behavior is to throw an
+ * exception on undefined methods, however this function can be
+ * overridden to implement magic (dynamic) actions, or provide run-time
+ * dispatching.
+ *
+ * @param string $methodName
+ * @param array $args
+ */
+ public function __call($methodName, $args)
+ {
+ if (empty($methodName)) {
+ $msg = 'No action specified and no default action has been defined in __call() for '
+ . get_class($this);
+ } else {
+ $msg = get_class($this) . '::' . $methodName
+ .'() does not exist and was not trapped in __call()';
+ }
+
+ throw new Zend_Controller_Action_Exception($msg);
+ }
+
+ /**
+ * Dispatch the requested action
+ *
+ * @param string $action Method name of action
+ * @return void
+ */
+ public function dispatch($action)
+ {
+ // Notify helpers of action preDispatch state
+ $this->_helper->notifyPreDispatch();
+
+ $this->preDispatch();
+ if ($this->getRequest()->isDispatched()) {
+ // preDispatch() didn't change the action, so we can continue
+ $this->$action();
+ $this->postDispatch();
+ }
+
+ // whats actually important here is that this action controller is
+ // shutting down, regardless of dispatching; notify the helpers of this
+ // state
+ $this->_helper->notifyPostDispatch();
+ }
+
+ /**
+ * Call the action specified in the request object, and return a response
+ *
+ * Not used in the Action Controller implementation, but left for usage in
+ * Page Controller implementations. Dispatches a method based on the
+ * request.
+ *
+ * Returns a Zend_Controller_Response_Abstract object, instantiating one
+ * prior to execution if none exists in the controller.
+ *
+ * {@link preDispatch()} is called prior to the action,
+ * {@link postDispatch()} is called following it.
+ *
+ * @param null|Zend_Controller_Request_Abstract $request Optional request
+ * object to use
+ * @param null|Zend_Controller_Response_Abstract $response Optional response
+ * object to use
+ * @return Zend_Controller_Response_Abstract
+ */
+ public function run(Zend_Controller_Request_Abstract $request = null, Zend_Controller_Response_Abstract $response = null)
+ {
+ if (null !== $request) {
+ $this->setRequest($request);
+ } else {
+ $request = $this->getRequest();
+ }
+
+ if (null !== $response) {
+ $this->setResponse($response);
+ }
+
+ $action = $request->getActionName();
+ if (empty($action)) {
+ $action = 'index';
+ }
+ $action = $action . 'Action';
+
+ $request->setDispatched(true);
+ $this->dispatch($action);
+
+ return $this->getResponse();
+ }
+
+ /**
+ * Gets a parameter from the {@link $_request Request object}. If the
+ * parameter does not exist, NULL will be returned.
+ *
+ * If the parameter does not exist and $default is set, then
+ * $default will be returned instead of NULL.
+ *
+ * @param string $paramName
+ * @param mixed $default
+ * @return mixed
+ */
+ final protected function _getParam($paramName, $default = null)
+ {
+ $value = $this->getRequest()->getParam($paramName);
+ if ((null == $value) && (null !== $default)) {
+ $value = $default;
+ }
+
+ return $value;
+ }
+
+ /**
+ * Set a parameter in the {@link $_request Request object}.
+ *
+ * @param string $paramName
+ * @param mixed $value
+ * @return Zend_Controller_Action
+ */
+ final protected function _setParam($paramName, $value)
+ {
+ $this->getRequest()->setParam($paramName, $value);
+
+ return $this;
+ }
+
+ /**
+ * Determine whether a given parameter exists in the
+ * {@link $_request Request object}.
+ *
+ * @param string $paramName
+ * @return boolean
+ */
+ final protected function _hasParam($paramName)
+ {
+ return null !== $this->getRequest()->getParam($paramName);
+ }
+
+ /**
+ * Return all parameters in the {@link $_request Request object}
+ * as an associative array.
+ *
+ * @return array
+ */
+ final protected function _getAllParams()
+ {
+ return $this->getRequest()->getParams();
+ }
+
+
+ /**
+ * Forward to another controller/action.
+ *
+ * It is important to supply the unformatted names, i.e. "article"
+ * rather than "ArticleController". The dispatcher will do the
+ * appropriate formatting when the request is received.
+ *
+ * If only an action name is provided, forwards to that action in this
+ * controller.
+ *
+ * If an action and controller are specified, forwards to that action and
+ * controller in this module.
+ *
+ * Specifying an action, controller, and module is the most specific way to
+ * forward.
+ *
+ * A fourth argument, $params, will be used to set the request parameters.
+ * If either the controller or module are unnecessary for forwarding,
+ * simply pass null values for them before specifying the parameters.
+ *
+ * @param string $action
+ * @param string $controller
+ * @param string $module
+ * @param array $params
+ * @return void
+ */
+ final protected function _forward($action, $controller = null, $module = null, array $params = null)
+ {
+ $request = $this->getRequest();
+
+ if (null !== $params) {
+ $request->setParams($params);
+ }
+
+ if (null !== $controller) {
+ $request->setControllerName($controller);
+
+ // Module should only be reset if controller has been specified
+ if (null !== $module) {
+ $request->setModuleName($module);
+ }
+ }
+
+ $request->setActionName($action)
+ ->setDispatched(false);
+ }
+
+ /**
+ * Redirect to another URL
+ *
+ * Proxies to {@link Zend_Controller_Action_Helper_Redirector::gotoUrl()}.
+ *
+ * @param string $url
+ * @param array $options Options to be used when redirecting
+ * @return void
+ */
+ protected function _redirect($url, array $options = array())
+ {
+ $this->_helper->redirector->gotoUrl($url, $options);
+ }
+}
diff --git a/libs/Zend/Controller/Action/Exception.php b/libs/Zend/Controller/Action/Exception.php
new file mode 100755
index 0000000000..d23de5eac4
--- /dev/null
+++ b/libs/Zend/Controller/Action/Exception.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Action
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Controller_Exception */
+require_once 'Zend/Controller/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Action
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Controller_Action_Exception extends Zend_Controller_Exception
+{}
+
diff --git a/libs/Zend/Controller/Action/Helper/Abstract.php b/libs/Zend/Controller/Action/Helper/Abstract.php
new file mode 100755
index 0000000000..8de94423b8
--- /dev/null
+++ b/libs/Zend/Controller/Action/Helper/Abstract.php
@@ -0,0 +1,153 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Controller_Exception */
+require_once 'Zend/Controller/Action/Exception.php';
+
+/** Zend_Controller_Action */
+require_once 'Zend/Controller/Action.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Zend_Controller_Action
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Controller_Action_Helper_Abstract
+{
+
+ /**
+ * $_actionController
+ *
+ * @var Zend_Controller_Action
+ */
+ protected $_actionController = null;
+
+ /**
+ * Request object
+ *
+ * @var Zend_Controller_Request_Abstract
+ */
+ protected $_request;
+
+ /**
+ * Response object
+ *
+ * @var Zend_Controller_Response_Abstract
+ */
+ protected $_response;
+
+ /**
+ * setActionController()
+ *
+ * @param Zend_Controller_Action $actionController
+ * @return Zend_Controller_ActionHelper_Abstract
+ */
+ public function setActionController(Zend_Controller_Action $actionController)
+ {
+ $this->_actionController = $actionController;
+ return $this;
+ }
+
+ /**
+ * Retrieve current action controller
+ *
+ * @return Zend_Controller_Action
+ */
+ public function getActionController()
+ {
+ return $this->_actionController;
+ }
+
+ /**
+ * Hook into action controller initialization
+ *
+ * @return void
+ */
+ public function init()
+ {
+ }
+
+ /**
+ * Hook into action controller preDispatch() workflow
+ *
+ * @return void
+ */
+ public function preDispatch()
+ {
+ }
+
+ /**
+ * Hook into action controller postDispatch() workflow
+ *
+ * @return void
+ */
+ public function postDispatch()
+ {
+ }
+
+ /**
+ * getRequest() -
+ *
+ * @return Zend_Controller_Request_Abstract $request
+ */
+ public function getRequest()
+ {
+ if (null === $this->_request) {
+ $this->_request = $this->_actionController->getRequest();
+ }
+
+ return $this->_request;
+ }
+
+ /**
+ * getResponse() -
+ *
+ * @return Zend_Controller_Response_Abstract $response
+ */
+ public function getResponse()
+ {
+ if (null === $this->_response) {
+ $this->_response = $this->_actionController->getResponse();
+ }
+
+ return $this->_response;
+ }
+
+ /**
+ * getName()
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ $full_class_name = get_class($this);
+
+ if (strpos($full_class_name, '_') !== false) {
+ $helper_name = strrchr($full_class_name, '_');
+ return ltrim($helper_name, '_');
+ } else {
+ return $full_class_name;
+ }
+ }
+}
diff --git a/libs/Zend/Controller/Action/Helper/FlashMessenger.php b/libs/Zend/Controller/Action/Helper/FlashMessenger.php
new file mode 100755
index 0000000000..238b2b5a25
--- /dev/null
+++ b/libs/Zend/Controller/Action/Helper/FlashMessenger.php
@@ -0,0 +1,232 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Session */
+require_once 'Zend/Session.php';
+
+/**
+ * Flash Messenger - implement session-based messages
+ *
+ * @uses Zend_Controller_Action_Helper_Abstract
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: $
+ */
+class Zend_Controller_Action_Helper_FlashMessenger extends Zend_Controller_Action_Helper_Abstract implements IteratorAggregate, Countable
+{
+ /**
+ * $_messages - Messages from previous request
+ *
+ * @var array
+ */
+ static protected $_messages = array();
+
+ /**
+ * $_session - Zend_Session storage object
+ *
+ * @var Zend_Session
+ */
+ static protected $_session = null;
+
+ /**
+ * $_messageAdded - Wether a message has been previously added
+ *
+ * @var unknown_type
+ */
+ static protected $_messageAdded = false;
+
+ /**
+ * $_namespace - Instance namespace, default is 'default'
+ *
+ * @var string
+ */
+ protected $_namespace = 'default';
+
+ /**
+ * __construct() - Instance constructor, needed to get iterators, etc
+ *
+ * @param string $namespace
+ */
+ public function __construct()
+ {
+ if (!self::$_session instanceof Zend_Session_Namespace) {
+ self::$_session = new Zend_Session_Namespace($this->getName());
+ foreach (self::$_session as $namespace => $messages) {
+ self::$_messages[$namespace] = $messages;
+ unset(self::$_session->{$namespace});
+ }
+ }
+ }
+
+ /**
+ * postDispatch() - runs after action is dispatched, in this
+ * case, it is resetting the namespace in case we have forwarded to a different
+ * action, Flashmessage will be 'clean' (default namespace)
+ *
+ * @return Zend_Controller_Action_Helper_FlashMessenger
+ */
+ public function postDispatch()
+ {
+ $this->resetNamespace();
+ return $this;
+ }
+
+ /**
+ * setNamespace() - change the namespace messages are added to, useful for
+ * per action controller messaging between requests
+ *
+ * @param string $namespace
+ * @return Zend_Controller_Action_Helper_FlashMessenger
+ */
+ public function setNamespace($namespace = 'default')
+ {
+ $this->_namespace = $namespace;
+ return $this;
+ }
+
+ /**
+ * resetNamespace() - reset the namespace to the default
+ *
+ * @return Zend_Controller_Action_Helper_FlashMessenger
+ */
+ public function resetNamespace()
+ {
+ $this->setNamespace();
+ return $this;
+ }
+
+ /**
+ * addMessage() - Add a message to flash message
+ *
+ * @param string $message
+ * @param string $namespace OPTIONAL
+ */
+ public function addMessage($message)
+ {
+ if (self::$_messageAdded === false) {
+ self::$_session->setExpirationHops(1, null, true);
+ }
+
+ if (!is_array(self::$_session->{$this->_namespace})) {
+ self::$_session->{$this->_namespace} = array();
+ }
+
+ self::$_session->{$this->_namespace}[] = $message;
+
+ return;
+ }
+
+ /**
+ * hasMessages() - Wether a specific namespace has messages
+ *
+ * @param string $namespace
+ * @return bool
+ */
+ public function hasMessages()
+ {
+ return isset(self::$_messages[$this->_namespace]);
+ }
+
+ /**
+ * getMessages() - Get messages from a specific namespace
+ *
+ * @param unknown_type $namespace
+ * @return array
+ */
+ public function getMessages()
+ {
+ if ($this->hasMessages()) {
+ return self::$_messages[$this->_namespace];
+ }
+
+ return array();
+ }
+
+ /**
+ * Clear all messages from the current namespace
+ *
+ * @return bool True if messages were cleared, false if none existed
+ */
+ public function clearMessages()
+ {
+ if ($this->hasMessages()) {
+ unset(self::$_messages[$this->_namespace]);
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * hasCurrentMessages() - check to see if messages have been added to current
+ * namespace within this request
+ *
+ * @return bool
+ */
+ public function hasCurrentMessages()
+ {
+ return isset(self::$_session->{$this->_namespace});
+ }
+
+ /**
+ * getCurrentMessages() - get messages that have been added to the current
+ * namespace within this request
+ *
+ * @return array
+ */
+ public function getCurrentMessages()
+ {
+ if ($this->hasCurrentMessages()) {
+ return self::$_session->{$this->_namespace};
+ }
+
+ return array();
+ }
+
+ /**
+ * getIterator() - complete the IteratorAggregate interface, for iterating
+ *
+ * @return ArrayObject
+ */
+ public function getIterator()
+ {
+ if ($this->hasMessages()) {
+ return new ArrayObject($this->getMessages());
+ }
+
+ return ArrayObject();
+ }
+
+ /**
+ * count() - Complete the countable interface
+ *
+ * @return int
+ */
+ public function count()
+ {
+ if ($this->hasMessages()) {
+ return count($this->getMessages());
+ }
+
+ return 0;
+ }
+}
diff --git a/libs/Zend/Controller/Action/Helper/Redirector.php b/libs/Zend/Controller/Action/Helper/Redirector.php
new file mode 100755
index 0000000000..ebe2e4f680
--- /dev/null
+++ b/libs/Zend/Controller/Action/Helper/Redirector.php
@@ -0,0 +1,482 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Controller_Action_Exception */
+require_once 'Zend/Controller/Action/Exception.php';
+
+/** Zend_Controller_Action_Helper_Abstract */
+require_once 'Zend/Controller/Action/Helper/Abstract.php';
+
+/**
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Zend_Controller_Action
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Controller_Action_Helper_Redirector extends Zend_Controller_Action_Helper_Abstract
+{
+ /**
+ * HTTP status code for redirects
+ * @var int
+ */
+ protected $_code = 302;
+
+ /**
+ * Whether or not calls to _redirect() should exit script execution
+ * @var bool
+ */
+ protected $_exit = true;
+
+ /**
+ * Whether or not _redirect() should attempt to prepend the base URL to the
+ * passed URL (if it's a relative URL)
+ * @var bool
+ */
+ protected $_prependBase = true;
+
+ /**
+ * Url to which to redirect
+ * @var string
+ */
+ protected $_redirectUrl = null;
+
+ /**
+ * Whether or not to use an absolute URI when redirecting
+ * @var bool
+ */
+ protected $_useAbsoluteUri = false;
+
+ /**
+ * Retrieve HTTP status code to emit on {@link _redirect()} call
+ *
+ * @return int
+ */
+ public function getCode()
+ {
+ return $this->_code;
+ }
+
+ /**
+ * Validate HTTP status redirect code
+ *
+ * @param int $code
+ * @return true
+ * @throws Zend_Controller_Action_Exception on invalid HTTP status code
+ */
+ protected function _checkCode($code)
+ {
+ if (!is_int($code) || (300 > $code) || (307 < $code)) {
+ require_once 'Zend/Controller/Exception.php';
+ throw new Zend_Controller_Action_Exception('Invalid redirect HTTP status code (' . $code . ')');
+ }
+
+ return true;
+ }
+
+ /**
+ * Retrieve HTTP status code for {@link _redirect()} behaviour
+ *
+ * @param int $code
+ * @return Zend_Controller_Action_Helper_Redirector
+ */
+ public function setCode($code)
+ {
+ $this->_checkCode($code);
+ $this->_code = $code;
+ return $this;
+ }
+
+ /**
+ * Retrieve flag for whether or not {@link _redirect()} will exit when finished.
+ *
+ * @return bool
+ */
+ public function getExit()
+ {
+ return $this->_exit;
+ }
+
+ /**
+ * Retrieve exit flag for {@link _redirect()} behaviour
+ *
+ * @param bool $flag
+ * @return Zend_Controller_Action_Helper_Redirector
+ */
+ public function setExit($flag)
+ {
+ $this->_exit = ($flag) ? true : false;
+ return $this;
+ }
+
+ /**
+ * Retrieve flag for whether or not {@link _redirect()} will prepend the
+ * base URL on relative URLs
+ *
+ * @return bool
+ */
+ public function getPrependBase()
+ {
+ return $this->_prependBase;
+ }
+
+ /**
+ * Retrieve 'prepend base' flag for {@link _redirect()} behaviour
+ *
+ * @param bool $flag
+ * @return Zend_Controller_Action_Helper_Redirector
+ */
+ public function setPrependBase($flag)
+ {
+ $this->_prependBase = ($flag) ? true : false;
+ return $this;
+ }
+
+ /**
+ * Return use absolute URI flag
+ *
+ * @return boolean
+ */
+ public function getUseAbsoluteUri()
+ {
+ return $this->_useAbsoluteUri;
+ }
+
+ /**
+ * Set use absolute URI flag
+ *
+ * @param bool $flag
+ * @return Zend_Controller_Action_Helper_Redirector
+ */
+ public function setUseAbsoluteUri($flag = true)
+ {
+ $this->_useAbsoluteUri = ($flag) ? true : false;
+ return $this;
+ }
+
+ /**
+ * Set redirect in response object
+ *
+ * @return void
+ */
+ protected function _redirect($url)
+ {
+ $this->_redirectUrl = $url;
+ if ($this->getUseAbsoluteUri() && !preg_match('#^(https?|ftp)://#', $url)) {
+ $host = $_SERVER['HTTP_HOST'];
+ $proto = (empty($_SERVER['HTTPS'])) ? 'http' : 'https';
+ $port = $_SERVER['SERVER_PORT'];
+ $uri = $proto . '://' . $host;
+ if ((('http' == $proto) && (80 != $port)) || (('https' == $proto) && (443 != $port))) {
+ $uri .= ':' . $port;
+ }
+ $url = $uri . '/' . ltrim($url, '/');
+ }
+ $this->getResponse()->setRedirect($url, $this->getCode());
+ }
+
+ /**
+ * Retrieve currently set URL for redirect
+ *
+ * @return string
+ */
+ public function getRedirectUrl()
+ {
+ return $this->_redirectUrl;
+ }
+
+ /**
+ * Determine if the baseUrl should be prepended, and prepend if necessary
+ *
+ * @param string $url
+ * @return string
+ */
+ protected function _prependBase($url)
+ {
+ if ($this->getPrependBase()) {
+ $request = $this->getRequest();
+ if ($request instanceof Zend_Controller_Request_Http) {
+ $base = rtrim($request->getBaseUrl(), '/');
+ if (!empty($base) && ('/' != $base)) {
+ $url = $base . '/' . ltrim($url, '/');
+ }
+ }
+ }
+
+ return $url;
+ }
+
+ /**
+ * Set a redirect URL of the form /module/controller/action/params
+ *
+ * @param string $action
+ * @param string $controller
+ * @param string $module
+ * @param array $params
+ * @return void
+ */
+ public function setGoto($action, $controller = null, $module = null, array $params = array())
+ {
+ $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
+ $request = $this->getRequest();
+
+ if (null === $module) {
+ $module = $request->getModuleName();
+ if ($module == $dispatcher->getDefaultModule()) {
+ $module = '';
+ }
+ }
+
+ if (null === $controller) {
+ $controller = $request->getControllerName();
+ if (empty($controller)) {
+ $controller = $dispatcher->getDefaultControllerName();
+ }
+ }
+
+ $paramsNormalized = array();
+ foreach ($params as $key => $value) {
+ $paramsNormalized[] = $key . '/' . $value;
+ }
+ $paramsString = implode('/', $paramsNormalized);
+
+ $url = $module . '/' . $controller . '/' . $action . '/' . $paramsString;
+ $url = '/' . trim($url, '/');
+
+ $url = $this->_prependBase($url);
+
+ $this->_redirect($url);
+ }
+
+ /**
+ * Build a URL based on a route
+ *
+ * @param array $urlOptions
+ * @param string $name Route name
+ * @param boolean $reset
+ * @return void
+ */
+ public function setGotoRoute(array $urlOptions = array(), $name = null, $reset = false)
+ {
+ $router = Zend_Controller_Front::getInstance()->getRouter();
+
+ if (empty($name)) {
+ try {
+ $name = $router->getCurrentRouteName();
+ } catch (Zend_Controller_Router_Exception $e) {
+ if ($router->hasRoute('default')) {
+ $name = 'default';
+ }
+ }
+ }
+
+ $route = $router->getRoute($name);
+ $request = $this->getRequest();
+
+ $url = rtrim($request->getBaseUrl(), '/') . '/';
+ $url .= $route->assemble($urlOptions, $reset);
+
+ $this->_redirect($url);
+ }
+
+ /**
+ * Set a redirect URL string
+ *
+ * By default, emits a 302 HTTP status header, prepends base URL as defined
+ * in request object if url is relative, and halts script execution by
+ * calling exit().
+ *
+ * $options is an optional associative array that can be used to control
+ * redirect behaviour. The available option keys are:
+ * - exit: boolean flag indicating whether or not to halt script execution when done
+ * - prependBase: boolean flag indicating whether or not to prepend the base URL when a relative URL is provided
+ * - code: integer HTTP status code to use with redirect. Should be between 300 and 307.
+ *
+ * _redirect() sets the Location header in the response object. If you set
+ * the exit flag to false, you can override this header later in code
+ * execution.
+ *
+ * If the exit flag is true (true by default), _redirect() will write and
+ * close the current session, if any.
+ *
+ * @param string $url
+ * @param array $options
+ * @return void
+ */
+ public function setGotoUrl($url, array $options = array())
+ {
+ // prevent header injections
+ $url = str_replace(array("\n", "\r"), '', $url);
+
+ $exit = $this->getExit();
+ $prependBase = $this->getPrependBase();
+ $code = $this->getCode();
+ if (null !== $options) {
+ if (isset($options['exit'])) {
+ $this->setExit(($options['exit']) ? true : false);
+ }
+ if (isset($options['prependBase'])) {
+ $this->setPrependBase(($options['prependBase']) ? true : false);
+ }
+ if (isset($options['code'])) {
+ $this->setCode($options['code']);
+ }
+ }
+
+ // If relative URL, decide if we should prepend base URL
+ if (!preg_match('|^[a-z]+://|', $url)) {
+ $url = $this->_prependBase($url);
+ }
+
+ $this->_redirect($url);
+ }
+
+ /**
+ * Perform a redirect to an action/controller/module with params
+ *
+ * @param string $action
+ * @param string $controller
+ * @param string $module
+ * @param array $params
+ * @return void
+ */
+ public function goto($action, $controller = null, $module = null, array $params = array())
+ {
+ $this->setGoto($action, $controller, $module, $params);
+
+ if ($this->getExit()) {
+ $this->redirectAndExit();
+ }
+ }
+
+ /**
+ * Perform a redirect to an action/controller/module with params, forcing an immdiate exit
+ *
+ * @param mixed $action
+ * @param mixed $controller
+ * @param mixed $module
+ * @param array $params
+ * @return void
+ */
+ public function gotoAndExit($action, $controller = null, $module = null, array $params = array())
+ {
+ $this->setGoto($action, $controller, $module, $params);
+ $this->redirectAndExit();
+ }
+
+ /**
+ * Redirect to a route-based URL
+ *
+ * Uses route's assemble method tobuild the URL; route is specified by $name;
+ * default route is used if none provided.
+ *
+ * @param array $urlOptions Array of key/value pairs used to assemble URL
+ * @param string $name
+ * @param boolean $reset
+ * @return void
+ */
+ public function gotoRoute(array $urlOptions = array(), $name = null, $reset = false)
+ {
+ $this->setGotoRoute($urlOptions, $name, $reset);
+
+ if ($this->getExit()) {
+ $this->redirectAndExit();
+ }
+ }
+
+ /**
+ * Redirect to a route-based URL, and immediately exit
+ *
+ * Uses route's assemble method tobuild the URL; route is specified by $name;
+ * default route is used if none provided.
+ *
+ * @param array $urlOptions Array of key/value pairs used to assemble URL
+ * @param string $name
+ * @param boolean $reset
+ * @return void
+ */
+ public function gotoRouteAndExit(array $urlOptions = array(), $name = null, $reset = false)
+ {
+ $this->setGotoRoute($urlOptions, $name, $reset);
+ $this->redirectAndExit();
+ }
+
+ /**
+ * Perform a redirect to a url
+ *
+ * @param string $url
+ * @param array $options
+ * @return void
+ */
+ public function gotoUrl($url, array $options = array())
+ {
+ $this->setGotoUrl($url, $options);
+
+ if ($this->getExit()) {
+ $this->redirectAndExit();
+ }
+ }
+
+ /**
+ * Set a URL string for a redirect, perform redirect, and immediately exit
+ *
+ * @param string $url
+ * @param array $options
+ * @return void
+ */
+ public function gotoUrlAndExit($url, array $options = array())
+ {
+ $this->gotoUrl($url, $options);
+ $this->redirectAndExit();
+ }
+
+ /**
+ * exit(): Perform exit for redirector
+ *
+ * @return void
+ */
+ public function redirectAndExit()
+ {
+ // Close session, if started
+ if (class_exists('Zend_Session', false) && Zend_Session::isStarted()) {
+ Zend_Session::writeClose();
+ } elseif (isset($_SESSION)) {
+ session_write_close();
+ }
+
+ $this->getResponse()->sendHeaders();
+ exit();
+ }
+
+ /**
+ * direct(): Perform helper when called as
+ * $this->_helper->redirector($action, $controller, $module, $params)
+ *
+ * @param string $action
+ * @param string $controller
+ * @param string $module
+ * @param array $params
+ * @return void
+ */
+ public function direct($action, $controller = null, $module = null, array $params = array())
+ {
+ $this->goto($action, $controller, $module, $params);
+ }
+}
diff --git a/libs/Zend/Controller/Action/Helper/Url.php b/libs/Zend/Controller/Action/Helper/Url.php
new file mode 100755
index 0000000000..9163ba171f
--- /dev/null
+++ b/libs/Zend/Controller/Action/Helper/Url.php
@@ -0,0 +1,128 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Zend_Controller_Action
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Url.php 4826 2007-05-16 19:52:21Z matthew $
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/** Zend_Controller_Action_Helper_Abstract */
+require_once 'Zend/Controller/Action/Helper/Abstract.php';
+
+/** Zend_Controller_Front */
+require_once 'Zend/Controller/Front.php';
+
+/**
+ * Helper for creating URLs for redirects and other tasks
+ *
+ * @uses Zend_Controller_Action_Helper_Abstract
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Zend_Controller_Action
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Controller_Action_Helper_Url extends Zend_Controller_Action_Helper_Abstract
+{
+ /**
+ * Create URL based on default route
+ *
+ * @param string $action
+ * @param string $controller
+ * @param string $module
+ * @param array $params
+ * @return string
+ */
+ public function simple($action, $controller = null, $module = null, array $params = null)
+ {
+ $request = $this->getRequest();
+
+ if (null === $controller) {
+ $controller = $request->getControllerName();
+ }
+
+ if (null === $module) {
+ $module = $request->getModuleName();
+ }
+
+ $url = $controller . '/' . $action;
+ if ($module != Zend_Controller_Front::getInstance()->getDispatcher()->getDefaultModule()) {
+ $url = $module . '/' . $url;
+ }
+
+ if (null !== $params) {
+ $paramPairs = array();
+ foreach ($params as $key => $value) {
+ $paramPairs[] = urlencode($key) . '/' . urlencode($value);
+ }
+ $paramString = implode('/', $paramPairs);
+ $url .= '/' . $paramString;
+ }
+
+ return $url;
+ }
+
+ /**
+ * Assembles a URL based on a given route
+ *
+ * This method will typically be used for more complex operations, as it
+ * ties into the route objects registered with the router.
+ *
+ * @param array $urlOptions Options passed to the assemble method of the Route object.
+ * @param mixed $name The name of a Route to use. If null it will use the current Route
+ * @return string Url for the link href attribute.
+ */
+ public function url($urlOptions = array(), $name = null, $reset = false)
+ {
+ $front = Zend_Controller_Front::getInstance();
+ $router = $front->getRouter();
+
+ if (empty($name)) {
+ try {
+ $name = $router->getCurrentRouteName();
+ } catch (Zend_Controller_Router_Exception $e) {
+ if ($router->hasRoute('default')) {
+ $name = 'default';
+ }
+ }
+ }
+
+ $route = $router->getRoute($name);
+ $request = $this->getRequest();
+
+ $url = rtrim($request->getBaseUrl(), '/') . '/';
+ $url .= $route->assemble($urlOptions, $reset);
+
+ return $url;
+ }
+
+ /**
+ * Perform helper when called as $this->_helper->url() from an action controller
+ *
+ * Proxies to {@link simple()}
+ *
+ * @param string $action
+ * @param string $controller
+ * @param string $module
+ * @param array $params
+ * @return string
+ */
+ public function direct($action, $controller = null, $module = null, array $params = null)
+ {
+ return $this->simple($action, $controller, $module, $params);
+ }
+}
diff --git a/libs/Zend/Controller/Action/Helper/ViewRenderer.php b/libs/Zend/Controller/Action/Helper/ViewRenderer.php
new file mode 100755
index 0000000000..5efc2f8247
--- /dev/null
+++ b/libs/Zend/Controller/Action/Helper/ViewRenderer.php
@@ -0,0 +1,826 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Controller_Action_Helper_Abstract */
+require_once 'Zend/Controller/Action/Helper/Abstract.php';
+
+/** Zend_View_Interface */
+require_once 'Zend/View/Interface.php';
+
+/** Zend_View */
+require_once 'Zend/View.php';
+
+/**
+ * View script integration
+ *
+ * Zend_Controller_Action_Helper_ViewRenderer provides transparent view
+ * integration for action controllers. It allows you to create a view object
+ * once, and populate it throughout all actions. Several global options may be
+ * set:
+ *
+ * - noController: if set true, render() will not look for view scripts in
+ * subdirectories named after the controller
+ * - viewSuffix: what view script filename suffix to use
+ *
+ * The helper autoinitializes the action controller view preDispatch(). It
+ * determines the path to the class file, and then determines the view base
+ * directory from there. It also uses the module name as a class prefix for
+ * helpers and views such that if your module name is 'Search', it will set the
+ * helper class prefix to 'Search_View_Helper' and the filter class prefix to ;
+ * 'Search_View_Filter'.
+ *
+ * Usage:
+ * <code>
+ * // In your bootstrap:
+ * Zend_Controller_Action_HelperBroker::addHelper(new Wopnet_Controller_Action_Helper_Abstract());
+ *
+ * // In your action controller methods:
+ * $viewHelper = $this->_helper->getHelper('view');
+ *
+ * // Don't use controller subdirectories
+ * $viewHelper->setNoController(true);
+ *
+ * // Specify a different script to render:
+ * $this->_helper->view('form');
+ *
+ * </code>
+ *
+ * @uses Zend_Controller_Action_Helper_Abstract
+ * @package Zend_Controller
+ * @subpackage Zend_Controller_Action
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Controller_Action_Helper_ViewRenderer extends Zend_Controller_Action_Helper_Abstract
+{
+ /**
+ * @var Zend_View_Interface
+ */
+ public $view;
+
+ /**
+ * Word delimiters
+ * @var array
+ */
+ protected $_delimiters;
+
+ /**
+ * Front controller instance
+ * @var Zend_Controller_Front
+ */
+ protected $_frontController;
+
+ /**
+ * Whether or not to autorender using controller name as subdirectory;
+ * global setting (not reset at next invocation)
+ * @var boolean
+ */
+ protected $_neverController = false;
+
+ /**
+ * Whether or not to autorender postDispatch; global setting (not reset at
+ * next invocation)
+ * @var boolean
+ */
+ protected $_neverRender = false;
+
+ /**
+ * Whether or not to use a controller name as a subdirectory when rendering
+ * @var boolean
+ */
+ protected $_noController = false;
+
+ /**
+ * Whether or not to autorender postDispatch; per controller/action setting (reset
+ * at next invocation)
+ * @var boolean
+ */
+ protected $_noRender = false;
+
+ /**
+ * Characters representing path delimiters in the controller
+ * @var string|array
+ */
+ protected $_pathDelimiters;
+
+ /**
+ * Which named segment of the response to utilize
+ * @var string
+ */
+ protected $_responseSegment = null;
+
+ /**
+ * Which action view script to render
+ * @var string
+ */
+ protected $_scriptAction = null;
+
+ /**
+ * View object basePath
+ * @var string
+ */
+ protected $_viewBasePathSpec = ':moduleDir/views';
+
+ /**
+ * View script path specification string
+ * @var string
+ */
+ protected $_viewScriptPathSpec = ':controller/:action.:suffix';
+
+ /**
+ * View script path specification string, minus controller segment
+ * @var string
+ */
+ protected $_viewScriptPathNoControllerSpec = ':action.:suffix';
+
+ /**
+ * View script suffix
+ * @var string
+ */
+ protected $_viewSuffix = 'phtml';
+
+ /**
+ * Constructor
+ *
+ * Optionally set view object and options.
+ *
+ * @param Zend_View_Interface $view
+ * @param array $options
+ * @return void
+ */
+ public function __construct(Zend_View_Interface $view = null, array $options = array())
+ {
+ if (null !== $view) {
+ $this->setView($view);
+ }
+
+ if (!empty($options)) {
+ $this->_setOptions($options);
+ }
+ }
+
+ /**
+ * Set the view object
+ *
+ * @param Zend_View_Interface $view
+ * @return Zend_Controller_Action_Helper_ViewRenderer
+ */
+ public function setView(Zend_View_Interface $view)
+ {
+ $this->view = $view;
+ return $this;
+ }
+
+ /**
+ * Retrieve front controller instance
+ *
+ * @return Zend_Controller_Front
+ */
+ public function getFrontController()
+ {
+ if (null === $this->_frontController) {
+ $this->_frontController = Zend_Controller_Front::getInstance();
+ }
+
+ return $this->_frontController;
+ }
+
+ /**
+ * Generate a class prefix for helper and filter classes
+ *
+ * @return string
+ */
+ protected function _generateDefaultPrefix()
+ {
+ if ((null === $this->_actionController) || !strstr(get_class($this->_actionController), '_')) {
+ $prefix = 'Zend_View';
+ } else {
+ $class = get_class($this->_actionController);
+ $prefix = substr($class, 0, strpos($class, '_')) . '_View';
+ }
+
+ return $prefix;
+ }
+
+ /**
+ * Retrieve base path based on location of current action controller
+ *
+ * @return string
+ */
+ protected function _getBasePath()
+ {
+ if (null === $this->_actionController) {
+ return '.' . DIRECTORY_SEPARATOR . 'views';
+ }
+
+ $path = $this->_translateSpec($this->getViewBasePathSpec());
+ return $path;
+ }
+
+ /**
+ * Set options
+ *
+ * @param array $options
+ * @return Zend_Controller_Action_Helper_ViewRenderer
+ */
+ protected function _setOptions(array $options)
+ {
+ foreach ($options as $key => $value)
+ {
+ switch ($key) {
+ case 'neverRender':
+ case 'neverController':
+ case 'noController':
+ case 'noRender':
+ $property = '_' . $key;
+ $this->{$property} = ($value) ? true : false;
+ break;
+ case 'responseSegment':
+ case 'scriptAction':
+ case 'viewBasePathSpec':
+ case 'viewScriptPathSpec':
+ case 'viewScriptPathNoControllerSpec':
+ case 'viewSuffix':
+ $property = '_' . $key;
+ $this->{$property} = (string) $value;
+ break;
+ default:
+ break;
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Initialize the view object
+ *
+ * $options may contain the following keys:
+ * - neverRender - flag dis/enabling postDispatch() autorender (affects all subsequent calls)
+ * - noController - flag indicating whether or not to look for view scripts in subdirectories named after the controller
+ * - noRender - flag indicating whether or not to autorender postDispatch()
+ * - responseSegment - which named response segment to render a view script to
+ * - scriptAction - what action script to render
+ * - viewBasePathSpec - specification to use for determining view base path
+ * - viewScriptPathSpec - specification to use for determining view script paths
+ * - viewScriptPathNoControllerSpec - specification to use for determining view script paths when noController flag is set
+ * - viewSuffix - what view script filename suffix to use
+ *
+ * @param string $path
+ * @param string $prefix
+ * @param array $options
+ * @return void
+ */
+ public function initView($path = null, $prefix = null, array $options = array())
+ {
+ if (null === $this->view) {
+ $this->setView(new Zend_View());
+ }
+
+ // Reset some flags every time
+ $options['noController'] = (isset($options['noController'])) ? $options['noController'] : false;
+ $options['noRender'] = (isset($options['noRender'])) ? $options['noRender'] : false;
+ $this->_scriptAction = null;
+ $this->_responseSegment = null;
+
+ // Set options first; may be used to determine other initializations
+ $this->_setOptions($options);
+
+ // Get base view path
+ if (empty($path)) {
+ $path = $this->_getBasePath();
+ if (empty($path)) {
+ throw new Zend_Controller_Action_Exception('ViewRenderer initialization failed: retrieved view base path is empty');
+ }
+ }
+
+ if (null === $prefix) {
+ $prefix = $this->_generateDefaultPrefix();
+ }
+
+ // Determine if this path has already been registered
+ $currentPaths = $this->view->getScriptPaths();
+ $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
+ $pathExists = false;
+ foreach ($currentPaths as $tmpPath) {
+ if (strstr($tmpPath, $path)) {
+ $pathExists = true;
+ break;
+ }
+ }
+ if (!$pathExists) {
+ $this->view->addBasePath($path, $prefix);
+ }
+
+ // Register view with action controller (unless already registered)
+ if ((null !== $this->_actionController) && (null === $this->_actionController->view)) {
+ $this->_actionController->view = $this->view;
+ $this->_actionController->viewSuffix = $this->_viewSuffix;
+ }
+ }
+
+ /**
+ * init - initialize view
+ *
+ * @return void
+ */
+ public function init()
+ {
+ if ($this->getFrontController()->getParam('noViewRenderer')) {
+ return;
+ }
+
+ $this->initView();
+ }
+
+ /**
+ * Set view basePath specification
+ *
+ * Specification can contain one or more of the following:
+ * - :moduleDir - current module directory
+ * - :controller - name of current controller in the request
+ * - :action - name of current action in the request
+ * - :module - name of current module in the request
+ *
+ * @param string $path
+ * @return Zend_Controller_Action_Helper_ViewRenderer
+ */
+ public function setViewBasePathSpec($path)
+ {
+ $this->_viewBasePathSpec = (string) $path;
+ return $this;
+ }
+
+ /**
+ * Retrieve the current view basePath specification string
+ *
+ * @return string
+ */
+ public function getViewBasePathSpec()
+ {
+ return $this->_viewBasePathSpec;
+ }
+
+ /**
+ * Set view script path specification
+ *
+ * Specification can contain one or more of the following:
+ * - :moduleDir - current module directory
+ * - :controller - name of current controller in the request
+ * - :action - name of current action in the request
+ * - :module - name of current module in the request
+ *
+ * @param string $path
+ * @return Zend_Controller_Action_Helper_ViewRenderer
+ */
+ public function setViewScriptPathSpec($path)
+ {
+ $this->_viewScriptPathSpec = (string) $path;
+ return $this;
+ }
+
+ /**
+ * Retrieve the current view script path specification string
+ *
+ * @return string
+ */
+ public function getViewScriptPathSpec()
+ {
+ return $this->_viewScriptPathSpec;
+ }
+
+ /**
+ * Set view script path specification (no controller variant)
+ *
+ * Specification can contain one or more of the following:
+ * - :moduleDir - current module directory
+ * - :controller - name of current controller in the request
+ * - :action - name of current action in the request
+ * - :module - name of current module in the request
+ *
+ * :controller will likely be ignored in this variant.
+ *
+ * @param string $path
+ * @return Zend_Controller_Action_Helper_ViewRenderer
+ */
+ public function setViewScriptPathNoControllerSpec($path)
+ {
+ $this->_viewScriptPathNoControllerSpec = (string) $path;
+ return $this;
+ }
+
+ /**
+ * Retrieve the current view script path specification string (no controller variant)
+ *
+ * @return string
+ */
+ public function getViewScriptPathNoControllerSpec()
+ {
+ return $this->_viewScriptPathNoControllerSpec;
+ }
+
+ /**
+ * Get a view script based on an action and/or other variables
+ *
+ * Uses values found in current request if no values passed in $vars.
+ *
+ * If {@link $_noController} is set, uses {@link $_viewScriptPathNoControllerSpec};
+ * otherwise, uses {@link $_viewScriptPathSpec}.
+ *
+ * @param string $action
+ * @param array $vars
+ * @return string
+ */
+ public function getViewScript($action = null, array $vars = array())
+ {
+ $request = $this->getRequest();
+ if ((null === $action) && (!isset($vars['action']))) {
+ $action = $this->getScriptAction();
+ if (null === $action) {
+ $action = $request->getActionName();
+ }
+ $vars['action'] = $action;
+ } elseif (null !== $action) {
+ $vars['action'] = $action;
+ }
+
+ $path = ($this->getNoController() || $this->getNeverController())
+ ? $this->_translateSpec($this->getViewScriptPathNoControllerSpec(), $vars)
+ : $this->_translateSpec($this->getViewScriptPathSpec(), $vars);
+
+ return $path;
+ }
+
+ /**
+ * Set the neverRender flag (i.e., globally dis/enable autorendering)
+ *
+ * @param boolean $flag
+ * @return Zend_Controller_Action_Helper_ViewRenderer
+ */
+ public function setNeverRender($flag = true)
+ {
+ $this->_neverRender = ($flag) ? true : false;
+ return $this;
+ }
+
+ /**
+ * Retrieve neverRender flag value
+ *
+ * @return boolean
+ */
+ public function getNeverRender()
+ {
+ return $this->_neverRender;
+ }
+
+ /**
+ * Set the noRender flag (i.e., whether or not to autorender)
+ *
+ * @param boolean $flag
+ * @return Zend_Controller_Action_Helper_ViewRenderer
+ */
+ public function setNoRender($flag = true)
+ {
+ $this->_noRender = ($flag) ? true : false;
+ return $this;
+ }
+
+ /**
+ * Retrieve noRender flag value
+ *
+ * @return boolean
+ */
+ public function getNoRender()
+ {
+ return $this->_noRender;
+ }
+
+ /**
+ * Set the view script to use
+ *
+ * @param string $name
+ * @return Zend_Controller_Action_Helper_ViewRenderer
+ */
+ public function setScriptAction($name)
+ {
+ $this->_scriptAction = (string) $name;
+ return $this;
+ }
+
+ /**
+ * Retrieve view script name
+ *
+ * @return string
+ */
+ public function getScriptAction()
+ {
+ return $this->_scriptAction;
+ }
+
+ /**
+ * Set the response segment name
+ *
+ * @param string $name
+ * @return Zend_Controller_Action_Helper_ViewRenderer
+ */
+ public function setResponseSegment($name)
+ {
+ if (null === $name) {
+ $this->_responseSegment = null;
+ } else {
+ $this->_responseSegment = (string) $name;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Retrieve named response segment name
+ *
+ * @return string
+ */
+ public function getResponseSegment()
+ {
+ return $this->_responseSegment;
+ }
+
+ /**
+ * Set the noController flag (i.e., whether or not to render into controller subdirectories)
+ *
+ * @param boolean $flag
+ * @return Zend_Controller_Action_Helper_ViewRenderer
+ */
+ public function setNoController($flag = true)
+ {
+ $this->_noController = ($flag) ? true : false;
+ return $this;
+ }
+
+ /**
+ * Retrieve noController flag value
+ *
+ * @return boolean
+ */
+ public function getNoController()
+ {
+ return $this->_noController;
+ }
+
+ /**
+ * Set the neverController flag (i.e., whether or not to render into controller subdirectories)
+ *
+ * @param boolean $flag
+ * @return Zend_Controller_Action_Helper_ViewRenderer
+ */
+ public function setNeverController($flag = true)
+ {
+ $this->_neverController = ($flag) ? true : false;
+ return $this;
+ }
+
+ /**
+ * Retrieve neverController flag value
+ *
+ * @return boolean
+ */
+ public function getNeverController()
+ {
+ return $this->_neverController;
+ }
+
+ /**
+ * Set view script suffix
+ *
+ * @param string $suffix
+ * @return Zend_Controller_Action_Helper_ViewRenderer
+ */
+ public function setViewSuffix($suffix)
+ {
+ $this->_viewSuffix = (string) $suffix;
+ return $this;
+ }
+
+ /**
+ * Get view script suffix
+ *
+ * @return string
+ */
+ public function getViewSuffix()
+ {
+ return $this->_viewSuffix;
+ }
+
+ /**
+ * Set options for rendering a view script
+ *
+ * @param string $action View script to render
+ * @param string $name Response named segment to render to
+ * @param boolean $noController Whether or not to render within a subdirectory named after the controller
+ * @return Zend_Controller_Action_Helper_ViewRenderer
+ */
+ public function setRender($action = null, $name = null, $noController = null)
+ {
+ if (null !== $action) {
+ $this->setScriptAction($action);
+ }
+
+ if (null !== $name) {
+ $this->setResponseSegment($name);
+ }
+
+ if (null !== $noController) {
+ $this->setNoController($noController);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Inject values into a spec string
+ *
+ * Allowed variables are:
+ * - :moduleDir - current module directory
+ * - :module - current module name
+ * - :controller - current controller name
+ * - :action - current action name
+ * - :suffix - view script file suffix
+ *
+ * @param string $spec
+ * @param array $vars
+ * @return string
+ */
+ protected function _translateSpec($spec, array $vars = array())
+ {
+ $front = $this->getFrontController();
+ $request = $this->getRequest();
+ $module = $request->getModuleName();
+ $controller = $request->getControllerName();
+ $action = $request->getActionName();
+ $suffix = $this->getViewSuffix();
+
+ // Need to get default module name if null returned, so that we get a
+ // controller directory
+ if (null === $module) {
+ $module = $front->getDispatcher()->getDefaultModule();
+ }
+ $moduleDir = $front->getControllerDirectory($module);
+ if ((null === $moduleDir) || is_array($moduleDir)) {
+ throw new Zend_Controller_Action_Exception('ViewRenderer cannot locate module directory');
+ }
+ $moduleDir = dirname($moduleDir);
+
+ foreach ($vars as $key => $value) {
+ switch ($key) {
+ case 'module':
+ case 'controller':
+ case 'action':
+ case 'moduleDir':
+ case 'suffix':
+ $$key = (string) $value;
+ break;
+ default:
+ break;
+ }
+ }
+
+ // Module, controller, and action names need normalized delimiters
+ $dispatcher = $front->getDispatcher();
+ if (null === $this->_pathDelimiters) {
+ $this->_pathDelimiters = $dispatcher->getPathDelimiter();
+ }
+ if (null === $this->_delimiters) {
+ $wordDelimiters = $dispatcher->getWordDelimiter();
+ $pathDelimiters = $dispatcher->getPathDelimiter();
+ $this->_delimiters = array_unique(array_merge($wordDelimiters, (array) $this->_pathDelimiters));
+ }
+
+ $replacements = array(
+ ':moduleDir' => $moduleDir,
+ ':module' => str_replace($this->_delimiters, '-', strtolower($module)),
+ ':controller' => str_replace($this->_delimiters, '-', strtolower(str_replace($this->_pathDelimiters, '/', $controller))),
+ ':action' => str_replace($this->_delimiters, '-', strtolower($action)),
+ ':suffix' => $suffix
+ );
+ $value = str_replace(array_keys($replacements), array_values($replacements), $spec);
+ $value = preg_replace('/-+/', '-', $value);
+ return $value;
+ }
+
+ /**
+ * Render a view script (optionally to a named response segment)
+ *
+ * Sets the noRender flag to true when called.
+ *
+ * @param string $script
+ * @param string $name
+ * @return void
+ */
+ public function renderScript($script, $name = null)
+ {
+ if (null === $name) {
+ $name = $this->getResponseSegment();
+ }
+
+ $this->getResponse()->appendBody(
+ $this->view->render($script),
+ $name
+ );
+
+ $this->setNoRender();
+ }
+
+ /**
+ * Render a view based on path specifications
+ *
+ * Renders a view based on the view script path specifications.
+ *
+ * @param string $action
+ * @param string $name
+ * @param boolean $noController
+ * @return void
+ */
+ public function render($action = null, $name = null, $noController = null)
+ {
+ $this->setRender($action, $name, $noController);
+ $path = $this->getViewScript();
+ $this->renderScript($path, $name);
+ }
+
+ /**
+ * Render a script based on specification variables
+ *
+ * Pass an action, and one or more specification variables (view script suffix)
+ * to determine the view script path, and render that script.
+ *
+ * @param string $action
+ * @param array $vars
+ * @param string $name
+ * @return void
+ */
+ public function renderBySpec($action = null, array $vars = array(), $name = null)
+ {
+ if (null !== $name) {
+ $this->setResponseSegment($name);
+ }
+
+ $path = $this->getViewScript($action, $vars);
+
+ $this->renderScript($path);
+ }
+
+ /**
+ * postDispatch - auto render a view
+ *
+ * Only autorenders if:
+ * - _noRender is false
+ * - action controller is present
+ * - request has not been re-dispatched (i.e., _forward() has not been called)
+ * - response is not a redirect
+ *
+ * @return void
+ */
+ public function postDispatch()
+ {
+ if ($this->getFrontController()->getParam('noViewRenderer')) {
+ return;
+ }
+
+ if (!$this->_noRender
+ && (null !== $this->_actionController)
+ && $this->getRequest()->isDispatched()
+ && !$this->getResponse()->isRedirect())
+ {
+ $this->render();
+ }
+ }
+
+ /**
+ * Use this helper as a method; proxies to setRender()
+ *
+ * @param string $action
+ * @param string $name
+ * @param boolean $noController
+ * @return void
+ */
+ public function direct($action = null, $name = null, $noController = null)
+ {
+ $this->setRender($action, $name, $noController);
+ }
+}
diff --git a/libs/Zend/Controller/Action/HelperBroker.php b/libs/Zend/Controller/Action/HelperBroker.php
new file mode 100755
index 0000000000..f8f774a029
--- /dev/null
+++ b/libs/Zend/Controller/Action/HelperBroker.php
@@ -0,0 +1,370 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Controller_Action_Exception */
+require_once 'Zend/Controller/Action/Exception.php';
+
+/** Zend_Controller_Action_Helper_Abstract */
+require_once 'Zend/Controller/Action/Helper/Abstract.php';
+
+/** Zend_Loader **/
+require_once 'Zend/Loader.php';
+
+/**
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Zend_Controller_Action
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Controller_Action_HelperBroker
+{
+ /**
+ * $_helpers - Helper array
+ *
+ * @var Zend_Controller_Action_Helper_Abstract[]
+ */
+ static protected $_helpers = array();
+
+ /**
+ * $_paths - paths to Action_Helpers
+ *
+ * @var array
+ */
+ static protected $_paths = array(array(
+ 'dir' => 'Zend/Controller/Action/Helper/',
+ 'prefix' => 'Zend_Controller_Action_Helper_'
+ ));
+
+ /**
+ * $_actionController - ActionController reference
+ *
+ * @var Zend_Controller_Action
+ */
+ protected $_actionController;
+
+ /**
+ * addHelper() - Add helper objects
+ *
+ * @param Zend_Controller_Action_Helper_Abstract $helper
+ * @return void
+ */
+ static public function addHelper(Zend_Controller_Action_Helper_Abstract $helper)
+ {
+ $helper_name = $helper->getName();
+ self::$_helpers[$helper_name] = $helper;
+ return;
+ }
+
+ /**
+ * addPrefix() - Add repository of helpers by prefix
+ *
+ * @param string $prefix
+ */
+ static public function addPrefix($prefix)
+ {
+ $prefix = rtrim($prefix, '_');
+ $path = str_replace('_', DIRECTORY_SEPARATOR, $prefix);
+ self::addPath($path, $prefix);
+ return;
+ }
+
+ /**
+ * resetHelpers()
+ *
+ * @return void
+ */
+ static public function resetHelpers()
+ {
+ self::$_helpers = array();
+ return;
+ }
+
+ /**
+ * addPath() - Add path to repositories where Action_Helpers could be found.
+ *
+ * @param string $path
+ * @param string $prefix Optional; defaults to 'Zend_Controller_Action_Helper'
+ * @return void
+ */
+ static public function addPath($path, $prefix = 'Zend_Controller_Action_Helper')
+ {
+ // make sure it ends in a PATH_SEPARATOR
+ if (substr($path, -1, 1) != DIRECTORY_SEPARATOR) {
+ $path .= DIRECTORY_SEPARATOR;
+ }
+
+ // make sure it ends in a PATH_SEPARATOR
+ $prefix = rtrim($prefix, '_') . '_';
+
+ $info['dir'] = $path;
+ $info['prefix'] = $prefix;
+
+ self::$_paths[] = $info;
+ return;
+ }
+
+ /**
+ * __construct() -
+ *
+ * @param Zend_Controller_Action $actionController
+ * @return void
+ */
+ public function __construct(Zend_Controller_Action $actionController)
+ {
+ $this->_actionController = $actionController;
+ foreach (self::$_helpers as $helper) {
+ $helper->setActionController($actionController);
+ $helper->init();
+ }
+ }
+
+ /**
+ * notifyPreDispatch() - called by action controller dispatch method
+ *
+ * @return void
+ */
+ public function notifyPreDispatch()
+ {
+ foreach (self::$_helpers as $helper) {
+ $helper->preDispatch();
+ }
+ }
+
+ /**
+ * notifyPostDispatch() - called by action controller dispatch method
+ *
+ * @return void
+ */
+ public function notifyPostDispatch()
+ {
+ foreach (self::$_helpers as $helper) {
+ $helper->postDispatch();
+ }
+ }
+
+ /**
+ * Normalize helper name for lookups
+ *
+ * @param string $name
+ * @return string
+ */
+ protected static function _normalizeHelperName($name)
+ {
+ if (strpos($name, '_') !== false) {
+ $name = str_replace(' ', '', ucwords(str_replace('_', ' ', $name)));
+ }
+
+ return ucfirst($name);
+ }
+
+ /**
+ * getHelper() - get helper by name
+ *
+ * @param string $name
+ * @return Zend_Controller_Action_Helper_Abstract
+ */
+ public function getHelper($name)
+ {
+ $name = self::_normalizeHelperName($name);
+
+ if (!array_key_exists($name, self::$_helpers)) {
+ self::_loadHelper($name);
+ }
+
+ $helper = self::$_helpers[$name];
+
+ $initialize = false;
+ if (null === ($actionController = $helper->getActionController())) {
+ $initialize = true;
+ } elseif ($actionController !== $this->_actionController) {
+ $initialize = true;
+ }
+
+ if ($initialize) {
+ $helper->setActionController($this->_actionController)
+ ->init();
+ }
+
+ return $helper;
+ }
+
+ /**
+ * Retrieve or initialize a helper statically
+ *
+ * Retrieves a helper object statically, loading on-demand if the helper
+ * does not already exist in the stack. Always returns a helper, unless
+ * the helper class cannot be found.
+ *
+ * @param string $name
+ * @return Zend_Controller_Action_Helper_Abstract
+ */
+ public static function getStaticHelper($name)
+ {
+ $name = self::_normalizeHelperName($name);
+
+ if (!array_key_exists($name, self::$_helpers)) {
+ self::_loadHelper($name);
+ }
+
+ $helper = self::$_helpers[$name];
+
+ return $helper;
+ }
+
+ /**
+ * getExistingHelper() - get helper by name
+ *
+ * Static method to retrieve helper object. Only retrieves helpers already
+ * initialized with the broker (either via addHelper() or on-demand loading
+ * via getHelper()).
+ *
+ * Throws an exception if the referenced helper does not exist in the
+ * stack; use {@link hasHelper()} to check if the helper is registered
+ * prior to retrieving it.
+ *
+ * @param string $name
+ * @return Zend_Controller_Action_Helper_Abstract
+ * @throws Zend_Controller_Action_Exception
+ */
+ public static function getExistingHelper($name)
+ {
+ $name = self::_normalizeHelperName($name);
+
+ if (array_key_exists($name, self::$_helpers)) {
+ return self::$_helpers[$name];
+ }
+
+ throw new Zend_Controller_Action_Exception('Action helper "' . $name . '" has not been registered with the helper broker');
+ }
+
+ /**
+ * Return all registered helpers as helper => object pairs
+ *
+ * @return array
+ */
+ public static function getExistingHelpers()
+ {
+ return self::$_helpers;
+ }
+
+ /**
+ * Is a particular helper loaded in the broker?
+ *
+ * @param string $name
+ * @return boolean
+ */
+ public static function hasHelper($name)
+ {
+ $name = self::_normalizeHelperName($name);
+ return array_key_exists($name, self::$_helpers);
+ }
+
+ /**
+ * Remove a particular helper from the broker
+ *
+ * @param string $name
+ * @return boolean
+ */
+ public static function removeHelper($name)
+ {
+ $name = self::_normalizeHelperName($name);
+ if (array_key_exists($name, self::$_helpers)) {
+ unset(self::$_helpers[$name]);
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * _loadHelper()
+ *
+ * @param string $name
+ * @return void
+ */
+ protected static function _loadHelper($name)
+ {
+ $file = $name . '.php';
+
+ foreach (self::$_paths as $info) {
+ $dir = $info['dir'];
+ $prefix = $info['prefix'];
+
+ $class = $prefix . $name;
+
+ if (class_exists($class, false)) {
+ $helper = new $class();
+
+ if (!$helper instanceof Zend_Controller_Action_Helper_Abstract) {
+ throw new Zend_Controller_Action_Exception('Helper name ' . $name . ' -> class ' . $class . ' is not of type Zend_Controller_Action_Helper_Abstract');
+ }
+
+ self::$_helpers[$helper->getName()] = $helper;
+ return;
+
+ } elseif (Zend_Loader::isReadable($dir . $file)) {
+ include_once $dir . $file;
+
+ if (class_exists($class, false)) {
+ $helper = new $class();
+ if (!$helper instanceof Zend_Controller_Action_Helper_Abstract) {
+ throw new Zend_Controller_Action_Exception('Helper name ' . $name . ' -> class ' . $class . ' is not of type Zend_Controller_Action_Helper_Abstract');
+ }
+
+ self::$_helpers[$helper->getName()] = $helper;
+ return;
+ }
+ }
+ }
+
+ throw new Zend_Controller_Action_Exception('Action Helper by name ' . $name . ' not found.');
+ }
+
+ /**
+ * __call()
+ *
+ * @param string $method
+ * @param array $args
+ * @return mixed
+ * @throws Zend_Controller_Action_Exception if helper does not have a direct() method
+ */
+ public function __call($method, $args)
+ {
+ $helper = $this->getHelper($method);
+ if (method_exists($helper, 'direct')) {
+ return call_user_func_array(array($helper, 'direct'), $args);
+ }
+
+ throw new Zend_Controller_Action_Exception('Helper "' . $method . '" does not support overloading via direct()');
+ }
+
+ /**
+ * __get()
+ *
+ * @param string $name
+ * @return Zend_Controller_Action_Helper_Abstract
+ */
+ public function __get($name)
+ {
+ return $this->getHelper($name);
+ }
+}
diff --git a/libs/Zend/Controller/Dispatcher/Abstract.php b/libs/Zend/Controller/Dispatcher/Abstract.php
new file mode 100755
index 0000000000..412d56e583
--- /dev/null
+++ b/libs/Zend/Controller/Dispatcher/Abstract.php
@@ -0,0 +1,448 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Dispatcher
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Controller_Dispatcher_Interface */
+require_once 'Zend/Controller/Dispatcher/Interface.php';
+
+/** Zend_Controller_Request_Abstract */
+require_once 'Zend/Controller/Request/Abstract.php';
+
+/** Zend_Controller_Response_Abstract */
+require_once 'Zend/Controller/Response/Abstract.php';
+
+/** Zend_Controller_Front */
+require_once 'Zend/Controller/Front.php';
+
+/**
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Dispatcher
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Controller_Dispatcher_Abstract implements Zend_Controller_Dispatcher_Interface
+{
+ /**
+ * Default action
+ * @var string
+ */
+ protected $_defaultAction = 'index';
+
+ /**
+ * Default controller
+ * @var string
+ */
+ protected $_defaultController = 'index';
+
+ /**
+ * Default module
+ * @var string
+ */
+ protected $_defaultModule = 'default';
+
+ /**
+ * Front Controller instance
+ * @var Zend_Controller_Front
+ */
+ protected $_frontController;
+
+ /**
+ * Array of invocation parameters to use when instantiating action
+ * controllers
+ * @var array
+ */
+ protected $_invokeParams = array();
+
+ /**
+ * Path delimiter character
+ * @var string
+ */
+ protected $_pathDelimiter = '_';
+
+ /**
+ * Response object to pass to action controllers, if any
+ * @var Zend_Controller_Response_Abstract|null
+ */
+ protected $_response = null;
+
+ /**
+ * Word delimiter characters
+ * @var array
+ */
+ protected $_wordDelimiter = array('-', '.');
+
+ /**
+ * Constructor
+ *
+ * @return void
+ */
+ public function __construct(array $params = array())
+ {
+ $this->setParams($params);
+ }
+
+ /**
+ * Formats a string into a controller name. This is used to take a raw
+ * controller name, such as one stored inside a Zend_Controller_Request_Abstract
+ * object, and reformat it to a proper class name that a class extending
+ * Zend_Controller_Action would use.
+ *
+ * @param string $unformatted
+ * @return string
+ */
+ public function formatControllerName($unformatted)
+ {
+ return ucfirst($this->_formatName($unformatted)) . 'Controller';
+ }
+
+ /**
+ * Formats a string into an action name. This is used to take a raw
+ * action name, such as one that would be stored inside a Zend_Controller_Request_Abstract
+ * object, and reformat into a proper method name that would be found
+ * inside a class extending Zend_Controller_Action.
+ *
+ * @param string $unformatted
+ * @return string
+ */
+ public function formatActionName($unformatted)
+ {
+ $formatted = $this->_formatName($unformatted, true);
+ return strtolower(substr($formatted, 0, 1)) . substr($formatted, 1) . 'Action';
+ }
+
+ /**
+ * Verify delimiter
+ *
+ * Verify a delimiter to use in controllers or actions. May be a single
+ * string or an array of strings.
+ *
+ * @param string|array $spec
+ * @return array
+ * @throws Zend_Controller_Dispatcher_Exception with invalid delimiters
+ */
+ public function _verifyDelimiter($spec)
+ {
+ if (is_string($spec)) {
+ return (array) $spec;
+ } elseif (is_array($spec)) {
+ $allStrings = true;
+ foreach ($spec as $delim) {
+ if (!is_string($delim)) {
+ $allStrings = false;
+ break;
+ }
+ }
+
+ if (!$allStrings) {
+ require_once 'Zend/Controller/Dispatcher/Exception.php';
+ throw new Zend_Controller_Dispatcher_Exception('Word delimiter array must contain only strings');
+ }
+
+ return $spec;
+ }
+
+ require_once 'Zend/Controller/Dispatcher/Exception.php';
+ throw new Zend_Controller_Dispatcher_Exception('Invalid word delimiter');
+ }
+
+ /**
+ * Retrieve the word delimiter character(s) used in
+ * controller or action names
+ *
+ * @return array
+ */
+ public function getWordDelimiter()
+ {
+ return $this->_wordDelimiter;
+ }
+
+ /**
+ * Set word delimiter
+ *
+ * Set the word delimiter to use in controllers and actions. May be a
+ * single string or an array of strings.
+ *
+ * @param string|array $spec
+ * @return Zend_Controller_Dispatcher_Abstract
+ */
+ public function setWordDelimiter($spec)
+ {
+ $spec = $this->_verifyDelimiter($spec);
+ $this->_wordDelimiter = $spec;
+
+ return $this;
+ }
+
+ /**
+ * Retrieve the path delimiter character(s) used in
+ * controller names
+ *
+ * @return array
+ */
+ public function getPathDelimiter()
+ {
+ return $this->_pathDelimiter;
+ }
+
+ /**
+ * Set path delimiter
+ *
+ * Set the path delimiter to use in controllers. May be a single string or
+ * an array of strings.
+ *
+ * @param string|array $spec
+ * @return Zend_Controller_Dispatcher_Abstract
+ */
+ public function setPathDelimiter($spec)
+ {
+ if (!is_string($spec)) {
+ require_once 'Zend/Controller/Dispatcher/Exception.php';
+ throw new Zend_Controller_Dispatcher_Exception('Invalid path delimiter');
+ }
+ $this->_pathDelimiter = $spec;
+
+ return $this;
+ }
+
+ /**
+ * Formats a string from a URI into a PHP-friendly name.
+ *
+ * By default, replaces words separated by the word separator character(s)
+ * with camelCaps. If $isAction is false, it also preserves replaces words
+ * separated by the path separation character with an underscore, making
+ * the following word Title cased. All non-alphanumeric characters are
+ * removed.
+ *
+ * @param string $unformatted
+ * @param boolean $isAction Defaults to false
+ * @return string
+ */
+ protected function _formatName($unformatted, $isAction = false)
+ {
+ // preserve directories
+ if (!$isAction) {
+ $segments = explode($this->getPathDelimiter(), $unformatted);
+ } else {
+ $segments = (array) $unformatted;
+ }
+
+ foreach ($segments as $key => $segment) {
+ $segment = str_replace($this->getWordDelimiter(), ' ', strtolower($segment));
+ $segment = preg_replace('/[^a-z0-9 ]/', '', $segment);
+ $segments[$key] = str_replace(' ', '', ucwords($segment));
+ }
+
+ return implode('_', $segments);
+ }
+
+ /**
+ * Retrieve front controller instance
+ *
+ * @return Zend_Controller_Front
+ */
+ public function getFrontController()
+ {
+ if (null === $this->_frontController) {
+ require_once 'Zend/Controller/Front.php';
+ $this->_frontController = Zend_Controller_Front::getInstance();
+ }
+
+ return $this->_frontController;
+ }
+
+ /**
+ * Set front controller instance
+ *
+ * @param Zend_Controller_Front $controller
+ * @return Zend_Controller_Dispatcher_Abstract
+ */
+ public function setFrontController(Zend_Controller_Front $controller)
+ {
+ $this->_frontController = $controller;
+ return $this;
+ }
+
+ /**
+ * Add or modify a parameter to use when instantiating an action controller
+ *
+ * @param string $name
+ * @param mixed $value
+ * @return Zend_Controller_Dispatcher_Abstract
+ */
+ public function setParam($name, $value)
+ {
+ $name = (string) $name;
+ $this->_invokeParams[$name] = $value;
+ return $this;
+ }
+
+ /**
+ * Set parameters to pass to action controller constructors
+ *
+ * @param array $params
+ * @return Zend_Controller_Dispatcher_Abstract
+ */
+ public function setParams(array $params)
+ {
+ $this->_invokeParams = array_merge($this->_invokeParams, $params);
+ return $this;
+ }
+
+ /**
+ * Retrieve a single parameter from the controller parameter stack
+ *
+ * @param string $name
+ * @return mixed
+ */
+ public function getParam($name)
+ {
+ if(isset($this->_invokeParams[$name])) {
+ return $this->_invokeParams[$name];
+ }
+
+ return null;
+ }
+
+ /**
+ * Retrieve action controller instantiation parameters
+ *
+ * @return array
+ */
+ public function getParams()
+ {
+ return $this->_invokeParams;
+ }
+
+ /**
+ * Clear the controller parameter stack
+ *
+ * By default, clears all parameters. If a parameter name is given, clears
+ * only that parameter; if an array of parameter names is provided, clears
+ * each.
+ *
+ * @param null|string|array single key or array of keys for params to clear
+ * @return Zend_Controller_Dispatcher_Abstract
+ */
+ public function clearParams($name = null)
+ {
+ if (null === $name) {
+ $this->_invokeParams = array();
+ } elseif (is_string($name) && isset($this->_invokeParams[$name])) {
+ unset($this->_invokeParams[$name]);
+ } elseif (is_array($name)) {
+ foreach ($name as $key) {
+ if (is_string($key) && isset($this->_invokeParams[$key])) {
+ unset($this->_invokeParams[$key]);
+ }
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Set response object to pass to action controllers
+ *
+ * @param Zend_Controller_Response_Abstract|null $response
+ * @return Zend_Controller_Dispatcher_Abstract
+ */
+ public function setResponse(Zend_Controller_Response_Abstract $response = null)
+ {
+ $this->_response = $response;
+ return $this;
+ }
+
+ /**
+ * Return the registered response object
+ *
+ * @return Zend_Controller_Response_Abstract|null
+ */
+ public function getResponse()
+ {
+ return $this->_response;
+ }
+
+ /**
+ * Set the default controller (minus any formatting)
+ *
+ * @param string $controller
+ * @return Zend_Controller_Dispatcher_Abstract
+ */
+ public function setDefaultControllerName($controller)
+ {
+ $this->_defaultController = (string) $controller;
+ return $this;
+ }
+
+ /**
+ * Retrieve the default controller name (minus formatting)
+ *
+ * @return string
+ */
+ public function getDefaultControllerName()
+ {
+ return $this->_defaultController;
+ }
+
+ /**
+ * Set the default action (minus any formatting)
+ *
+ * @param string $action
+ * @return Zend_Controller_Dispatcher_Abstract
+ */
+ public function setDefaultAction($action)
+ {
+ $this->_defaultAction = (string) $action;
+ return $this;
+ }
+
+ /**
+ * Retrieve the default action name (minus formatting)
+ *
+ * @return string
+ */
+ public function getDefaultAction()
+ {
+ return $this->_defaultAction;
+ }
+
+ /**
+ * Set the default module
+ *
+ * @param string $module
+ * @return Zend_Controller_Dispatcher_Abstract
+ */
+ public function setDefaultModule($module)
+ {
+ $this->_defaultModule = (string) $module;
+ return $this;
+ }
+
+ /**
+ * Retrieve the default module
+ *
+ * @return string
+ */
+ public function getDefaultModule()
+ {
+ return $this->_defaultModule;
+ }
+}
diff --git a/libs/Zend/Controller/Dispatcher/Exception.php b/libs/Zend/Controller/Dispatcher/Exception.php
new file mode 100755
index 0000000000..9a7d790b22
--- /dev/null
+++ b/libs/Zend/Controller/Dispatcher/Exception.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Dispatcher
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Controller_Exception */
+require_once 'Zend/Controller/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Dispatcher
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Controller_Dispatcher_Exception extends Zend_Controller_Exception
+{}
+
diff --git a/libs/Zend/Controller/Dispatcher/Interface.php b/libs/Zend/Controller/Dispatcher/Interface.php
new file mode 100755
index 0000000000..7de9d21895
--- /dev/null
+++ b/libs/Zend/Controller/Dispatcher/Interface.php
@@ -0,0 +1,172 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Controller
+ * @subpackage Dispatcher
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Controller_Request_Abstract
+ */
+require_once 'Zend/Controller/Request/Abstract.php';
+
+/**
+ * Zend_Controller_Response_Abstract
+ */
+require_once 'Zend/Controller/Response/Abstract.php';
+
+/**
+ * @package Zend_Controller
+ * @subpackage Dispatcher
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Controller_Dispatcher_Interface
+{
+ /**
+ * Formats a string into a controller name. This is used to take a raw
+ * controller name, such as one that would be packaged inside a request
+ * object, and reformat it to a proper class name that a class extending
+ * Zend_Controller_Action would use.
+ *
+ * @param string $unformatted
+ * @return string
+ */
+ public function formatControllerName($unformatted);
+
+ /**
+ * Formats a string into an action name. This is used to take a raw
+ * action name, such as one that would be packaged inside a request
+ * object, and reformat into a proper method name that would be found
+ * inside a class extending Zend_Controller_Action.
+ *
+ * @param string $unformatted
+ * @return string
+ */
+ public function formatActionName($unformatted);
+
+ /**
+ * Returns TRUE if an action can be dispatched, or FALSE otherwise.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return boolean
+ */
+ public function isDispatchable(Zend_Controller_Request_Abstract $request);
+
+ /**
+ * Add or modify a parameter with which to instantiate an Action Controller
+ *
+ * @param string $name
+ * @param mixed $value
+ * @return Zend_Controller_Dispatcher_Interface
+ */
+ public function setParam($name, $value);
+
+ /**
+ * Set an array of a parameters to pass to the Action Controller constructor
+ *
+ * @param array $params
+ * @return Zend_Controller_Dispatcher_Interface
+ */
+ public function setParams(array $params);
+
+ /**
+ * Retrieve a single parameter from the controller parameter stack
+ *
+ * @param string $name
+ * @return mixed
+ */
+ public function getParam($name);
+
+ /**
+ * Retrieve the parameters to pass to the Action Controller constructor
+ *
+ * @return array
+ */
+ public function getParams();
+
+ /**
+ * Clear the controller parameter stack
+ *
+ * By default, clears all parameters. If a parameter name is given, clears
+ * only that parameter; if an array of parameter names is provided, clears
+ * each.
+ *
+ * @param null|string|array single key or array of keys for params to clear
+ * @return Zend_Controller_Dispatcher_Interface
+ */
+ public function clearParams($name = null);
+
+ /**
+ * Set the response object to use, if any
+ *
+ * @param Zend_Controller_Response_Abstract|null $response
+ * @return void
+ */
+ public function setResponse(Zend_Controller_Response_Abstract $response = null);
+
+ /**
+ * Retrieve the response object, if any
+ *
+ * @return Zend_Controller_Response_Abstract|null
+ */
+ public function getResponse();
+
+ /**
+ * Add a controller directory to the controller directory stack
+ *
+ * @param string $path
+ * @param string $args
+ * @return Zend_Controller_Dispatcher_Interface
+ */
+ public function addControllerDirectory($path, $args = null);
+
+ /**
+ * Set the directory where controller files are stored
+ *
+ * Specify a string or an array; if an array is specified, all paths will be
+ * added.
+ *
+ * @param string|array $dir
+ * @return Zend_Controller_Dispatcher_Interface
+ */
+ public function setControllerDirectory($path);
+
+ /**
+ * Return the currently set directory(ies) for controller file lookup
+ *
+ * @return array
+ */
+ public function getControllerDirectory();
+
+ /**
+ * Dispatches a request object to a controller/action. If the action
+ * requests a forward to another action, a new request will be returned.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @param Zend_Controller_Response_Abstract $response
+ * @return Zend_Controller_Request_Abstract|boolean
+ */
+ public function dispatch(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response);
+
+ /**
+ * Whether or not a given module is valid
+ *
+ * @param string $module
+ * @return boolean
+ */
+ public function isValidModule($module);
+}
diff --git a/libs/Zend/Controller/Dispatcher/Standard.php b/libs/Zend/Controller/Dispatcher/Standard.php
new file mode 100755
index 0000000000..bb6bb36e20
--- /dev/null
+++ b/libs/Zend/Controller/Dispatcher/Standard.php
@@ -0,0 +1,411 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Dispatcher
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Loader */
+require_once 'Zend/Loader.php';
+
+/** Zend_Controller_Dispatcher_Abstract */
+require_once 'Zend/Controller/Dispatcher/Abstract.php';
+
+/** Zend_Controller_Request_Abstract */
+require_once 'Zend/Controller/Request/Abstract.php';
+
+/** Zend_Controller_Response_Abstract */
+require_once 'Zend/Controller/Response/Abstract.php';
+
+/** Zend_Controller_Action */
+require_once 'Zend/Controller/Action.php';
+
+/**
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Dispatcher
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Controller_Dispatcher_Standard extends Zend_Controller_Dispatcher_Abstract
+{
+ /**
+ * Current dispatchable directory
+ * @var string
+ */
+ protected $_curDirectory;
+
+ /**
+ * Current module (formatted)
+ * @var string
+ */
+ protected $_curModule;
+
+ /**
+ * Constructor: Set current module to default value
+ *
+ * @param array $params
+ * @return void
+ */
+ public function __construct(array $params = array())
+ {
+ parent::__construct($params);
+ $this->_curModule = $this->getDefaultModule();
+ }
+
+ /**
+ * Add a single path to the controller directory stack
+ *
+ * @param string $path
+ * @param string $module
+ * @return Zend_Controller_Dispatcher_Standard
+ */
+ public function addControllerDirectory($path, $module = null)
+ {
+ if (null === $module) {
+ $module = $this->_defaultModule;
+ }
+
+ $this->getFrontController()->addControllerDirectory($path, $module);
+ return $this;
+ }
+
+ /**
+ * Set controller directory
+ *
+ * @param array|string $directory
+ * @return Zend_Controller_Dispatcher_Standard
+ */
+ public function setControllerDirectory($directory)
+ {
+ $this->getFrontController()->setControllerDirectory($directory);
+ return $this;
+ }
+
+ /**
+ * Return the currently set directories for Zend_Controller_Action class
+ * lookup
+ *
+ * If a module is specified, returns just that directory.
+ *
+ * @param string $module Module name
+ * @return array|string Returns array of all directories by default, single
+ * module directory if module argument provided
+ */
+ public function getControllerDirectory($module = null)
+ {
+ $directories = $this->getFrontController()->getControllerDirectory();
+
+ if ((null !== $module) && (isset($directories[$module]))) {
+ return $directories[$module];
+ }
+
+ return $directories;
+ }
+
+ /**
+ * Format the module name.
+ *
+ * @param string $unformatted
+ * @return string
+ */
+ public function formatModuleName($unformatted)
+ {
+ if ($this->_defaultModule == $unformatted) {
+ return $unformatted;
+ }
+
+ return ucfirst($this->_formatName($unformatted));
+ }
+
+ /**
+ * Convert a class name to a filename
+ *
+ * @param string $class
+ * @return string
+ */
+ public function classToFilename($class)
+ {
+ return str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';
+ }
+
+ /**
+ * Returns TRUE if the Zend_Controller_Request_Abstract object can be
+ * dispatched to a controller.
+ *
+ * Use this method wisely. By default, the dispatcher will fall back to the
+ * default controller (either in the module specified or the global default)
+ * if a given controller does not exist. This method returning false does
+ * not necessarily indicate the dispatcher will not still dispatch the call.
+ *
+ * @param Zend_Controller_Request_Abstract $action
+ * @return boolean
+ */
+ public function isDispatchable(Zend_Controller_Request_Abstract $request)
+ {
+ $className = $this->getControllerClass($request);
+ if (!$className) {
+ return true;
+ }
+
+ $fileSpec = $this->classToFilename($className);
+ $dispatchDir = $this->getDispatchDirectory();
+ $test = $dispatchDir . DIRECTORY_SEPARATOR . $fileSpec;
+ return Zend_Loader::isReadable($test);
+ }
+
+ /**
+ * Dispatch to a controller/action
+ *
+ * By default, if a controller is not dispatchable, dispatch() will throw
+ * an exception. If you wish to use the default controller instead, set the
+ * param 'useDefaultControllerAlways' via {@link setParam()}.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @param Zend_Controller_Response_Abstract $response
+ * @return boolean
+ * @throws Zend_Controller_Dispatcher_Exception
+ */
+ public function dispatch(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response)
+ {
+ $this->setResponse($response);
+
+ /**
+ * Get controller class
+ */
+ if (!$this->isDispatchable($request)) {
+ if (!$this->getParam('useDefaultControllerAlways')) {
+ require_once 'Zend/Controller/Dispatcher/Exception.php';
+ throw new Zend_Controller_Dispatcher_Exception('Invalid controller specified (' . $request->getControllerName() . ')');
+ }
+
+ $className = $this->getDefaultControllerClass($request);
+ } else {
+ $className = $this->getControllerClass($request);
+ if (!$className) {
+ $className = $this->getDefaultControllerClass($request);
+ }
+ }
+
+ /**
+ * Load the controller class file
+ */
+ $className = $this->loadClass($className);
+
+ /**
+ * Instantiate controller with request, response, and invocation
+ * arguments; throw exception if it's not an action controller
+ */
+ $controller = new $className($request, $this->getResponse(), $this->getParams());
+ if (!$controller instanceof Zend_Controller_Action) {
+ require_once 'Zend/Controller/Dispatcher/Exception.php';
+ throw new Zend_Controller_Dispatcher_Exception("Controller '$className' is not an instance of Zend_Controller_Action");
+ }
+
+ /**
+ * Retrieve the action name
+ */
+ $action = $this->getActionMethod($request);
+
+ /**
+ * Dispatch the method call
+ */
+ $request->setDispatched(true);
+
+ // by default, buffer output
+ $disableOb = $this->getParam('disableOutputBuffering');
+ $obLevel = ob_get_level();
+ if (empty($disableOb)) {
+ ob_start();
+ }
+
+ try {
+ $controller->dispatch($action);
+ } catch (Exception $e) {
+ // Clean output buffer on error
+ $curObLevel = ob_get_level();
+ if ($curObLevel > $obLevel) {
+ do {
+ ob_get_clean();
+ $curObLevel = ob_get_level();
+ } while ($curObLevel > $obLevel);
+ }
+
+ throw $e;
+ }
+
+ if (empty($disableOb)) {
+ $content = ob_get_clean();
+ $response->appendBody($content);
+ }
+
+ // Destroy the page controller instance and reflection objects
+ $controller = null;
+ }
+
+ /**
+ * Load a controller class
+ *
+ * Attempts to load the controller class file from
+ * {@link getControllerDirectory()}. If the controller belongs to a
+ * module, looks for the module prefix to the controller class.
+ *
+ * @param string $className
+ * @return string Class name loaded
+ * @throws Zend_Controller_Dispatcher_Exception if class not loaded
+ */
+ public function loadClass($className)
+ {
+ $dispatchDir = $this->getDispatchDirectory();
+
+ $loadFile = $dispatchDir . DIRECTORY_SEPARATOR . $this->classToFilename($className);
+ $dir = dirname($loadFile);
+ $file = basename($loadFile);
+
+ try {
+ Zend_Loader::loadFile($file, $dir, true);
+ } catch (Zend_Exception $e) {
+ require_once 'Zend/Controller/Dispatcher/Exception.php';
+ throw new Zend_Controller_Dispatcher_Exception('Cannot load controller class "' . $className . '" from file "' . $file . '" in directory "' . $dir . '"');
+ }
+
+ if ($this->_defaultModule != $this->_curModule) {
+ $className = $this->formatModuleName($this->_curModule) . '_' . $className;
+ }
+
+ if (!class_exists($className)) {
+ require_once 'Zend/Controller/Dispatcher/Exception.php';
+ throw new Zend_Controller_Dispatcher_Exception('Invalid controller class ("' . $className . '")');
+ }
+
+ return $className;
+ }
+
+ /**
+ * Get controller class name
+ *
+ * Try request first; if not found, try pulling from request parameter;
+ * if still not found, fallback to default
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return string|false Returns class name on success
+ */
+ public function getControllerClass(Zend_Controller_Request_Abstract $request)
+ {
+ $controllerName = $request->getControllerName();
+ if (empty($controllerName)) {
+ return false;
+ }
+
+ $className = $this->formatControllerName($controllerName);
+
+ $controllerDirs = $this->getControllerDirectory();
+ $this->_curModule = $this->_defaultModule;
+ $this->_curDirectory = $controllerDirs[$this->_defaultModule];
+ $module = $request->getModuleName();
+ if ($this->isValidModule($module)) {
+ $this->_curModule = $module;
+ $this->_curDirectory = $controllerDirs[$module];
+ }
+
+ return $className;
+ }
+
+ /**
+ * Determine if a given module is valid
+ *
+ * @param string $module
+ * @return bool
+ */
+ public function isValidModule($module)
+ {
+ $controllerDir = $this->getControllerDirectory();
+ return ((null !== $module) && isset($controllerDir[$module]));
+ }
+
+ /**
+ * Retrieve default controller class
+ *
+ * Determines whether the default controller to use lies within the
+ * requested module, or if the global default should be used.
+ *
+ * By default, will only use the module default unless that controller does
+ * not exist; if this is the case, it falls back to the default controller
+ * in the default module.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return string
+ */
+ public function getDefaultControllerClass(Zend_Controller_Request_Abstract $request)
+ {
+ $controller = $this->getDefaultControllerName();
+ $default = $this->formatControllerName($controller);
+ $request->setControllerName($controller)
+ ->setActionName(null);
+
+ $module = $request->getModuleName();
+ $controllerDirs = $this->getControllerDirectory();
+ $this->_curModule = $this->_defaultModule;
+ $this->_curDirectory = $controllerDirs[$this->_defaultModule];
+ if ($this->isValidModule($module)) {
+ $moduleDir = $controllerDirs[$module];
+ $fileSpec = $moduleDir . DIRECTORY_SEPARATOR . $this->classToFilename($default);
+ if (Zend_Loader::isReadable($fileSpec)) {
+ $request->setModuleName($module);
+ $this->_curModule = $this->formatModuleName($module);
+ $this->_curDirectory = $moduleDir;
+ }
+ } else {
+ $request->setModuleName($this->_defaultModule);
+ }
+
+ return $default;
+ }
+
+ /**
+ * Return the value of the currently selected dispatch directory (as set by
+ * {@link getController()})
+ *
+ * @return string
+ */
+ public function getDispatchDirectory()
+ {
+ return $this->_curDirectory;
+ }
+
+ /**
+ * Determine the action name
+ *
+ * First attempt to retrieve from request; then from request params
+ * using action key; default to default action
+ *
+ * Returns formatted action name
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return string
+ */
+ public function getActionMethod(Zend_Controller_Request_Abstract $request)
+ {
+ $action = $request->getActionName();
+ if (empty($action)) {
+ $action = $this->getDefaultAction();
+ $request->setActionName($action);
+ }
+
+ return $this->formatActionName($action);
+ }
+}
diff --git a/libs/Zend/Controller/Exception.php b/libs/Zend/Controller/Exception.php
new file mode 100755
index 0000000000..24d63d0f47
--- /dev/null
+++ b/libs/Zend/Controller/Exception.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Exception */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Controller_Exception extends Zend_Exception
+{}
+
diff --git a/libs/Zend/Controller/Front.php b/libs/Zend/Controller/Front.php
new file mode 100755
index 0000000000..7be77b5add
--- /dev/null
+++ b/libs/Zend/Controller/Front.php
@@ -0,0 +1,951 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Loader */
+require_once 'Zend/Loader.php';
+
+/** Zend_Controller_Action_HelperBroker */
+require_once 'Zend/Controller/Action/HelperBroker.php';
+
+/** Zend_Controller_Action_Helper_ViewRenderer */
+require_once 'Zend/Controller/Action/Helper/ViewRenderer.php';
+
+/** Zend_Controller_Exception */
+require_once 'Zend/Controller/Exception.php';
+
+/** Zend_Controller_Plugin_Broker */
+require_once 'Zend/Controller/Plugin/Broker.php';
+
+/** Zend_Controller_Request_Abstract */
+require_once 'Zend/Controller/Request/Abstract.php';
+
+/** Zend_Controller_Router_Interface */
+require_once 'Zend/Controller/Router/Interface.php';
+
+/** Zend_Controller_Dispatcher_Interface */
+require_once 'Zend/Controller/Dispatcher/Interface.php';
+
+/** Zend_Controller_Plugin_ErrorHandler */
+require_once 'Zend/Controller/Plugin/ErrorHandler.php';
+
+/** Zend_Controller_Response_Abstract */
+require_once 'Zend/Controller/Response/Abstract.php';
+
+/**
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Controller_Front
+{
+ /**
+ * Base URL
+ * @var string
+ */
+ protected $_baseUrl = null;
+
+ /**
+ * Directory|ies where controllers are stored
+ *
+ * @var string|array
+ */
+ protected $_controllerDir = null;
+
+ /**
+ * Instance of Zend_Controller_Dispatcher_Interface
+ * @var Zend_Controller_Dispatcher_Interface
+ */
+ protected $_dispatcher = null;
+
+ /**
+ * Singleton instance
+ *
+ * Marked only as protected to allow extension of the class. To extend,
+ * simply override {@link getInstance()}.
+ *
+ * @var Zend_Controller_Front
+ */
+ protected static $_instance = null;
+
+ /**
+ * Array of invocation parameters to use when instantiating action
+ * controllers
+ * @var array
+ */
+ protected $_invokeParams = array();
+
+ /**
+ * Subdirectory within a module containing controllers; defaults to 'controllers'
+ * @var string
+ */
+ protected $_moduleControllerDirectoryName = 'controllers';
+
+ /**
+ * Instance of Zend_Controller_Plugin_Broker
+ * @var Zend_Controller_Plugin_Broker
+ */
+ protected $_plugins = null;
+
+ /**
+ * Instance of Zend_Controller_Request_Abstract
+ * @var Zend_Controller_Request_Abstract
+ */
+ protected $_request = null;
+
+ /**
+ * Instance of Zend_Controller_Response_Abstract
+ * @var Zend_Controller_Response_Abstract
+ */
+ protected $_response = null;
+
+ /**
+ * Whether or not to return the response prior to rendering output while in
+ * {@link dispatch()}; default is to send headers and render output.
+ * @var boolean
+ */
+ protected $_returnResponse = false;
+
+ /**
+ * Instance of Zend_Controller_Router_Interface
+ * @var Zend_Controller_Router_Interface
+ */
+ protected $_router = null;
+
+ /**
+ * Whether or not exceptions encountered in {@link dispatch()} should be
+ * thrown or trapped in the response object
+ * @var boolean
+ */
+ protected $_throwExceptions = false;
+
+ /**
+ * Constructor
+ *
+ * Instantiate using {@link getInstance()}; front controller is a singleton
+ * object.
+ *
+ * Instantiates the plugin broker.
+ *
+ * @return void
+ */
+ private function __construct()
+ {
+ $this->_plugins = new Zend_Controller_Plugin_Broker();
+ }
+
+ /**
+ * Singleton instance
+ *
+ * @return Zend_Controller_Front
+ */
+ public static function getInstance()
+ {
+ if (null === self::$_instance) {
+ self::$_instance = new self();
+ }
+
+ return self::$_instance;
+ }
+
+ /**
+ * Resets all object properties of the singleton instance
+ *
+ * Primarily used for testing; could be used to chain front controllers.
+ *
+ * @return void
+ */
+ public function resetInstance()
+ {
+ $reflection = new ReflectionObject($this);
+ foreach ($reflection->getProperties() as $property) {
+ $name = $property->getName();
+ switch ($name) {
+ case '_instance':
+ break;
+ case '_controllerDir':
+ case '_invokeParams':
+ $this->{$name} = array();
+ break;
+ case '_plugins':
+ $this->{$name} = new Zend_Controller_Plugin_Broker();
+ break;
+ case '_throwExceptions':
+ case '_returnResponse':
+ $this->{$name} = false;
+ break;
+ case '_moduleControllerDirectoryName':
+ $this->{$name} = 'controllers';
+ break;
+ default:
+ $this->{$name} = null;
+ break;
+ }
+ }
+
+ if (!Zend_Controller_Action_HelperBroker::hasHelper('viewRenderer')) {
+ Zend_Controller_Action_HelperBroker::addHelper(new Zend_Controller_Action_Helper_ViewRenderer());
+ }
+ }
+
+ /**
+ * Convenience feature, calls setControllerDirectory()->setRouter()->dispatch()
+ *
+ * In PHP 5.1.x, a call to a static method never populates $this -- so run()
+ * may actually be called after setting up your front controller.
+ *
+ * @param string|array $controllerDirectory Path to Zend_Controller_Action
+ * controller classes or array of such paths
+ * @return void
+ * @throws Zend_Controller_Exception if called from an object instance
+ */
+ public static function run($controllerDirectory)
+ {
+ self::getInstance()
+ ->setControllerDirectory($controllerDirectory)
+ ->dispatch();
+ }
+
+ /**
+ * Add a controller directory to the controller directory stack
+ *
+ * If $args is presented and is a string, uses it for the array key mapping
+ * to the directory specified.
+ *
+ * @param string $directory
+ * @param string $module Optional argument; module with which to associate directory. If none provided, assumes 'defualt'
+ * @return Zend_Controller_Front
+ * @throws Zend_Controller_Exception if directory not found or readable
+ */
+ public function addControllerDirectory($directory, $module = null)
+ {
+ if (empty($module) || is_numeric($module) || !is_string($module)) {
+ $module = $this->getDispatcher()->getDefaultModule();
+ }
+
+ $this->_controllerDir[$module] = rtrim((string) $directory, '/\\');
+
+ return $this;
+ }
+
+ /**
+ * Set controller directory
+ *
+ * Stores controller directory to pass to dispatcher. May be an array of
+ * directories or a string containing a single directory.
+ *
+ * @param string|array $directory Path to Zend_Controller_Action controller
+ * classes or array of such paths
+ * @param string $module Optional module name to use with string $directory
+ * @return Zend_Controller_Front
+ */
+ public function setControllerDirectory($directory, $module = null)
+ {
+ $this->_controllerDir = array();
+
+ if (is_string($directory)) {
+ $this->addControllerDirectory($directory, $module);
+ } elseif (is_array($directory)) {
+ foreach ((array) $directory as $module => $path) {
+ $this->addControllerDirectory($path, $module);
+ }
+ } else {
+ throw new Zend_Controller_Exception('Controller directory spec must be either a string or an array');
+ }
+
+ return $this;
+ }
+
+ /**
+ * Retrieve controller directory
+ *
+ * Retrieves:
+ * - Array of all controller directories if no $name passed
+ * - String path if $name passed and exists as a key in controller directory array
+ * - null if $name passed but does not exist in controller directory keys
+ *
+ * @param string $name Default null
+ * @return array|string|null
+ */
+ public function getControllerDirectory($name = null)
+ {
+ if (null === $name) {
+ return $this->_controllerDir;
+ }
+
+ $name = (string) $name;
+ if (isset($this->_controllerDir[$name])) {
+ return $this->_controllerDir[$name];
+ }
+
+ return null;
+ }
+
+ /**
+ * Specify a directory as containing modules
+ *
+ * Iterates through the directory, adding any subdirectories as modules;
+ * the subdirectory within each module named after {@link $_moduleControllerDirectoryName}
+ * will be used as the controller directory path.
+ *
+ * @param string $path
+ * @return Zend_Controller_Front
+ */
+ public function addModuleDirectory($path)
+ {
+ $dir = new DirectoryIterator($path);
+ foreach ($dir as $file) {
+ if ($file->isDot() || !$file->isDir()) {
+ continue;
+ }
+
+ $module = $file->getFilename();
+
+ // Don't use SCCS directories as modules
+ if (preg_match('/^[^a-z]/i', $module) || ('CVS' == $module)) {
+ continue;
+ }
+
+ $moduleDir = $file->getPathname() . DIRECTORY_SEPARATOR . $this->getModuleControllerDirectoryName();
+ $this->addControllerDirectory($moduleDir, $module);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Set the directory name within a module containing controllers
+ *
+ * @param string $name
+ * @return Zend_Controller_Front
+ */
+ public function setModuleControllerDirectoryName($name = 'controllers')
+ {
+ $this->_moduleControllerDirectoryName = (string) $name;
+
+ return $this;
+ }
+
+ /**
+ * Return the directory name within a module containing controllers
+ *
+ * @return string
+ */
+ public function getModuleControllerDirectoryName()
+ {
+ return $this->_moduleControllerDirectoryName;
+ }
+
+ /**
+ * Set the default controller (unformatted string)
+ *
+ * @param string $controller
+ * @return Zend_Controller_Front
+ */
+ public function setDefaultControllerName($controller)
+ {
+ $dispatcher = $this->getDispatcher();
+ $dispatcher->setDefaultControllerName($controller);
+ return $this;
+ }
+
+ /**
+ * Retrieve the default controller (unformatted string)
+ *
+ * @return string
+ */
+ public function getDefaultControllerName()
+ {
+ return $this->getDispatcher()->getDefaultControllerName();
+ }
+
+ /**
+ * Set the default action (unformatted string)
+ *
+ * @param string $action
+ * @return Zend_Controller_Front
+ */
+ public function setDefaultAction($action)
+ {
+ $dispatcher = $this->getDispatcher();
+ $dispatcher->setDefaultAction($action);
+ return $this;
+ }
+
+ /**
+ * Retrieve the default action (unformatted string)
+ *
+ * @return string
+ */
+ public function getDefaultAction()
+ {
+ return $this->getDispatcher()->getDefaultAction();
+ }
+
+ /**
+ * Set the default module name
+ *
+ * @param string $module
+ * @return Zend_Controller_Front
+ */
+ public function setDefaultModule($module)
+ {
+ $dispatcher = $this->getDispatcher();
+ $dispatcher->setDefaultModule($module);
+ return $this;
+ }
+
+ /**
+ * Retrieve the default module
+ *
+ * @return string
+ */
+ public function getDefaultModule()
+ {
+ return $this->getDispatcher()->getDefaultModule();
+ }
+
+ /**
+ * Set request class/object
+ *
+ * Set the request object. The request holds the request environment.
+ *
+ * If a class name is provided, it will instantiate it
+ *
+ * @param string|Zend_Controller_Request_Abstract $request
+ * @throws Zend_Controller_Exception if invalid request class
+ * @return Zend_Controller_Front
+ */
+ public function setRequest($request)
+ {
+ if (is_string($request)) {
+ Zend_Loader::loadClass($request);
+ $request = new $request();
+ }
+ if (!$request instanceof Zend_Controller_Request_Abstract) {
+ throw new Zend_Controller_Exception('Invalid request class');
+ }
+
+ $this->_request = $request;
+
+ return $this;
+ }
+
+ /**
+ * Return the request object.
+ *
+ * @return null|Zend_Controller_Request_Abstract
+ */
+ public function getRequest()
+ {
+ return $this->_request;
+ }
+
+ /**
+ * Set router class/object
+ *
+ * Set the router object. The router is responsible for mapping
+ * the request to a controller and action.
+ *
+ * If a class name is provided, instantiates router with any parameters
+ * registered via {@link setParam()} or {@link setParams()}.
+ *
+ * @param string|Zend_Controller_Router_Interface $router
+ * @throws Zend_Controller_Exception if invalid router class
+ * @return Zend_Controller_Front
+ */
+ public function setRouter($router)
+ {
+ if (is_string($router)) {
+ Zend_Loader::loadClass($router);
+ $router = new $router();
+ }
+ if (!$router instanceof Zend_Controller_Router_Interface) {
+ throw new Zend_Controller_Exception('Invalid router class');
+ }
+
+ $this->_router = $router;
+
+ return $this;
+ }
+
+ /**
+ * Return the router object.
+ *
+ * Instantiates a Zend_Controller_Router_Rewrite object if no router currently set.
+ *
+ * @return null|Zend_Controller_Router_Interface
+ */
+ public function getRouter()
+ {
+ if (null == $this->_router) {
+ require_once 'Zend/Controller/Router/Rewrite.php';
+ $this->setRouter(new Zend_Controller_Router_Rewrite());
+ }
+
+ return $this->_router;
+ }
+
+ /**
+ * Set the base URL used for requests
+ *
+ * Use to set the base URL segment of the REQUEST_URI to use when
+ * determining PATH_INFO, etc. Examples:
+ * - /admin
+ * - /myapp
+ * - /subdir/index.php
+ *
+ * Note that the URL should not include the full URI. Do not use:
+ * - http://example.com/admin
+ * - http://example.com/myapp
+ * - http://example.com/subdir/index.php
+ *
+ * If a null value is passed, this can be used as well for autodiscovery (default).
+ *
+ * @param string $base
+ * @return Zend_Controller_Front
+ * @throws Zend_Controller_Exception for non-string $base
+ */
+ public function setBaseUrl($base = null)
+ {
+ if (!is_string($base) && (null !== $base)) {
+ throw new Zend_Controller_Exception('Rewrite base must be a string');
+ }
+
+ $this->_baseUrl = $base;
+
+ return $this;
+ }
+
+ /**
+ * Retrieve the currently set base URL
+ *
+ * @return string
+ */
+ public function getBaseUrl()
+ {
+ return $this->_baseUrl;
+ }
+
+ /**
+ * Set the dispatcher object. The dispatcher is responsible for
+ * taking a Zend_Controller_Dispatcher_Token object, instantiating the controller, and
+ * call the action method of the controller.
+ *
+ * @param Zend_Controller_Dispatcher_Interface $dispatcher
+ * @return Zend_Controller_Front
+ */
+ public function setDispatcher(Zend_Controller_Dispatcher_Interface $dispatcher)
+ {
+ $this->_dispatcher = $dispatcher;
+ return $this;
+ }
+
+ /**
+ * Return the dispatcher object.
+ *
+ * @return Zend_Controller_Dispatcher_Interface
+ */
+ public function getDispatcher()
+ {
+ /**
+ * Instantiate the default dispatcher if one was not set.
+ */
+ if (!$this->_dispatcher instanceof Zend_Controller_Dispatcher_Interface) {
+ require_once 'Zend/Controller/Dispatcher/Standard.php';
+ $this->_dispatcher = new Zend_Controller_Dispatcher_Standard();
+ }
+ return $this->_dispatcher;
+ }
+
+ /**
+ * Set response class/object
+ *
+ * Set the response object. The response is a container for action
+ * responses and headers. Usage is optional.
+ *
+ * If a class name is provided, instantiates a response object.
+ *
+ * @param string|Zend_Controller_Response_Abstract $response
+ * @throws Zend_Controller_Exception if invalid response class
+ * @return Zend_Controller_Front
+ */
+ public function setResponse($response)
+ {
+ if (is_string($response)) {
+ Zend_Loader::loadClass($response);
+ $response = new $response();
+ }
+ if (!$response instanceof Zend_Controller_Response_Abstract) {
+ throw new Zend_Controller_Exception('Invalid response class');
+ }
+
+ $this->_response = $response;
+
+ return $this;
+ }
+
+ /**
+ * Return the response object.
+ *
+ * @return null|Zend_Controller_Response_Abstract
+ */
+ public function getResponse()
+ {
+ return $this->_response;
+ }
+
+ /**
+ * Add or modify a parameter to use when instantiating an action controller
+ *
+ * @param string $name
+ * @param mixed $value
+ * @return Zend_Controller_Front
+ */
+ public function setParam($name, $value)
+ {
+ $name = (string) $name;
+ $this->_invokeParams[$name] = $value;
+ return $this;
+ }
+
+ /**
+ * Set parameters to pass to action controller constructors
+ *
+ * @param array $params
+ * @return Zend_Controller_Front
+ */
+ public function setParams(array $params)
+ {
+ $this->_invokeParams = array_merge($this->_invokeParams, $params);
+ return $this;
+ }
+
+ /**
+ * Retrieve a single parameter from the controller parameter stack
+ *
+ * @param string $name
+ * @return mixed
+ */
+ public function getParam($name)
+ {
+ if(isset($this->_invokeParams[$name])) {
+ return $this->_invokeParams[$name];
+ }
+
+ return null;
+ }
+
+ /**
+ * Retrieve action controller instantiation parameters
+ *
+ * @return array
+ */
+ public function getParams()
+ {
+ return $this->_invokeParams;
+ }
+
+ /**
+ * Clear the controller parameter stack
+ *
+ * By default, clears all parameters. If a parameter name is given, clears
+ * only that parameter; if an array of parameter names is provided, clears
+ * each.
+ *
+ * @param null|string|array single key or array of keys for params to clear
+ * @return Zend_Controller_Front
+ */
+ public function clearParams($name = null)
+ {
+ if (null === $name) {
+ $this->_invokeParams = array();
+ } elseif (is_string($name) && isset($this->_invokeParams[$name])) {
+ unset($this->_invokeParams[$name]);
+ } elseif (is_array($name)) {
+ foreach ($name as $key) {
+ if (is_string($key) && isset($this->_invokeParams[$key])) {
+ unset($this->_invokeParams[$key]);
+ }
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Register a plugin.
+ *
+ * @param Zend_Controller_Plugin_Abstract $plugin
+ * @param int $stackIndex Optional; stack index for plugin
+ * @return Zend_Controller_Front
+ */
+ public function registerPlugin(Zend_Controller_Plugin_Abstract $plugin, $stackIndex = null)
+ {
+ $this->_plugins->registerPlugin($plugin, $stackIndex);
+ return $this;
+ }
+
+ /**
+ * Unregister a plugin.
+ *
+ * @param string|Zend_Controller_Plugin_Abstract $plugin Plugin class or object to unregister
+ * @return Zend_Controller_Front
+ */
+ public function unregisterPlugin($plugin)
+ {
+ $this->_plugins->unregisterPlugin($plugin);
+ return $this;
+ }
+
+ /**
+ * Is a particular plugin registered?
+ *
+ * @param string $class
+ * @return bool
+ */
+ public function hasPlugin($class)
+ {
+ return $this->_plugins->hasPlugin($class);
+ }
+
+ /**
+ * Retrieve a plugin or plugins by class
+ *
+ * @param string $class
+ * @return false|Zend_Controller_Plugin_Abstract|array
+ */
+ public function getPlugin($class)
+ {
+ return $this->_plugins->getPlugin($class);
+ }
+
+ /**
+ * Retrieve all plugins
+ *
+ * @return array
+ */
+ public function getPlugins()
+ {
+ return $this->_plugins->getPlugins();
+ }
+
+ /**
+ * Set whether exceptions encounted in the dispatch loop should be thrown
+ * or caught and trapped in the response object
+ *
+ * Default behaviour is to trap them in the response object; call this
+ * method to have them thrown.
+ *
+ * @param boolean $flag Defaults to true
+ * @return boolean|Zend_Controller_Front Used as a setter, returns object; as a getter, returns boolean
+ */
+ public function throwExceptions($flag = null)
+ {
+ if (true === $flag) {
+ $this->_throwExceptions = true;
+ return $this;
+ } elseif (false === $flag) {
+ $this->_throwExceptions = false;
+ return $this;
+ }
+
+ return $this->_throwExceptions;
+ }
+
+ /**
+ * Set whether {@link dispatch()} should return the response without first
+ * rendering output. By default, output is rendered and dispatch() returns
+ * nothing.
+ *
+ * @param boolean $flag
+ * @return boolean|Zend_Controller_Front Used as a setter, returns object; as a getter, returns boolean
+ */
+ public function returnResponse($flag = null)
+ {
+ if (true === $flag) {
+ $this->_returnResponse = true;
+ return $this;
+ } elseif (false === $flag) {
+ $this->_returnResponse = false;
+ return $this;
+ }
+
+ return $this->_returnResponse;
+ }
+
+ /**
+ * Dispatch an HTTP request to a controller/action.
+ *
+ * @param Zend_Controller_Request_Abstract|null $request
+ * @param Zend_Controller_Response_Abstract|null $response
+ * @return void|Zend_Controller_Response_Abstract Returns response object if returnResponse() is true
+ */
+ public function dispatch(Zend_Controller_Request_Abstract $request = null, Zend_Controller_Response_Abstract $response = null)
+ {
+ if (!$this->getParam('noErrorHandler') && !$this->_plugins->hasPlugin('Zend_Controller_Plugin_ErrorHandler')) {
+ // Register with stack index of 100
+ $this->_plugins->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(), 100);
+ }
+
+ if (!$this->getParam('noViewRenderer') && !Zend_Controller_Action_HelperBroker::hasHelper('viewRenderer')) {
+ Zend_Controller_Action_HelperBroker::addHelper(new Zend_Controller_Action_Helper_ViewRenderer());
+ }
+
+ /**
+ * Instantiate default request object (HTTP version) if none provided
+ */
+ if (null !== $request) {
+ $this->setRequest($request);
+ } elseif ((null === $request) && (null === ($request = $this->getRequest()))) {
+ require_once 'Zend/Controller/Request/Http.php';
+ $request = new Zend_Controller_Request_Http();
+ $this->setRequest($request);
+ }
+
+ /**
+ * Set base URL of request object, if available
+ */
+ if (is_callable(array($this->_request, 'setBaseUrl'))) {
+ if (null !== ($baseUrl = $this->getBaseUrl())) {
+ $this->_request->setBaseUrl($baseUrl);
+ }
+ }
+
+ /**
+ * Instantiate default response object (HTTP version) if none provided
+ */
+ if (null !== $response) {
+ $this->setResponse($response);
+ } elseif ((null === $this->_response) && (null === ($this->_response = $this->getResponse()))) {
+ require_once 'Zend/Controller/Response/Http.php';
+ $response = new Zend_Controller_Response_Http();
+ $this->setResponse($response);
+ }
+
+ /**
+ * Register request and response objects with plugin broker
+ */
+ $this->_plugins
+ ->setRequest($this->_request)
+ ->setResponse($this->_response);
+
+ /**
+ * Initialize router
+ */
+ $router = $this->getRouter();
+ $router->setParams($this->getParams());
+
+ /**
+ * Initialize dispatcher
+ */
+ $dispatcher = $this->getDispatcher();
+ $dispatcher->setParams($this->getParams())
+ ->setResponse($this->_response);
+
+ // Begin dispatch
+ try {
+ /**
+ * Route request to controller/action, if a router is provided
+ */
+
+ /**
+ * Notify plugins of router startup
+ */
+ $this->_plugins->routeStartup($this->_request);
+
+ $router->route($this->_request);
+
+ /**
+ * Notify plugins of router completion
+ */
+ $this->_plugins->routeShutdown($this->_request);
+
+ /**
+ * Notify plugins of dispatch loop startup
+ */
+ $this->_plugins->dispatchLoopStartup($this->_request);
+
+ /**
+ * Attempt to dispatch the controller/action. If the $this->_request
+ * indicates that it needs to be dispatched, move to the next
+ * action in the request.
+ */
+ do {
+ $this->_request->setDispatched(true);
+
+ /**
+ * Notify plugins of dispatch startup
+ */
+ $this->_plugins->preDispatch($this->_request);
+
+ /**
+ * Skip requested action if preDispatch() has reset it
+ */
+ if (!$this->_request->isDispatched()) {
+ continue;
+ }
+
+ /**
+ * Dispatch request
+ */
+ try {
+ $dispatcher->dispatch($this->_request, $this->_response);
+ } catch (Exception $e) {
+ if ($this->throwExceptions()) {
+ throw $e;
+ }
+ $this->_response->setException($e);
+ }
+
+ /**
+ * Notify plugins of dispatch completion
+ */
+ $this->_plugins->postDispatch($this->_request);
+ } while (!$this->_request->isDispatched());
+ } catch (Exception $e) {
+ if ($this->throwExceptions()) {
+ throw $e;
+ }
+
+ $this->_response->setException($e);
+ }
+
+ /**
+ * Notify plugins of dispatch loop completion
+ */
+ try {
+ $this->_plugins->dispatchLoopShutdown();
+ } catch (Exception $e) {
+ if ($this->throwExceptions()) {
+ throw $e;
+ }
+
+ $this->_response->setException($e);
+ }
+
+ if ($this->returnResponse()) {
+ return $this->_response;
+ }
+
+ $this->_response->sendResponse();
+ }
+}
diff --git a/libs/Zend/Controller/Plugin/Abstract.php b/libs/Zend/Controller/Plugin/Abstract.php
new file mode 100755
index 0000000000..326795cc72
--- /dev/null
+++ b/libs/Zend/Controller/Plugin/Abstract.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Plugins
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Controller_Request_Abstract */
+require_once 'Zend/Controller/Request/Abstract.php';
+
+/** Zend_Controller_Response_Abstract */
+require_once 'Zend/Controller/Response/Abstract.php';
+
+/**
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Plugins
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Controller_Plugin_Abstract
+{
+ /**
+ * @var Zend_Controller_Request_Abstract
+ */
+ protected $_request;
+
+ /**
+ * @var Zend_Controller_Response_Abstract
+ */
+ protected $_response;
+
+ /**
+ * Set request object
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return Zend_Controller_Plugin_Abstract
+ */
+ public function setRequest(Zend_Controller_Request_Abstract $request)
+ {
+ $this->_request = $request;
+ return $this;
+ }
+
+ /**
+ * Get request object
+ *
+ * @return Zend_Controller_Request_Abstract $request
+ */
+ public function getRequest()
+ {
+ return $this->_request;
+ }
+
+ /**
+ * Set response object
+ *
+ * @param Zend_Controller_Response_Abstract $response
+ * @return Zend_Controller_Plugin_Abstract
+ */
+ public function setResponse(Zend_Controller_Response_Abstract $response)
+ {
+ $this->_response = $response;
+ return $this;
+ }
+
+ /**
+ * Get response object
+ *
+ * @return Zend_Controller_Response_Abstract $response
+ */
+ public function getResponse()
+ {
+ return $this->_response;
+ }
+
+ /**
+ * Called before Zend_Controller_Front begins evaluating the
+ * request against its routes.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return void
+ */
+ public function routeStartup(Zend_Controller_Request_Abstract $request)
+ {}
+
+ /**
+ * Called after Zend_Controller_Router exits.
+ *
+ * Called after Zend_Controller_Front exits from the router.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return void
+ */
+ public function routeShutdown(Zend_Controller_Request_Abstract $request)
+ {}
+
+ /**
+ * Called before Zend_Controller_Front enters its dispatch loop.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return void
+ */
+ public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
+ {}
+
+ /**
+ * Called before an action is dispatched by Zend_Controller_Dispatcher.
+ *
+ * This callback allows for proxy or filter behavior. By altering the
+ * request and resetting its dispatched flag (via
+ * {@link Zend_Controller_Request_Abstract::setDispatched() setDispatched(false)}),
+ * the current action may be skipped.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return void
+ */
+ public function preDispatch(Zend_Controller_Request_Abstract $request)
+ {}
+
+ /**
+ * Called after an action is dispatched by Zend_Controller_Dispatcher.
+ *
+ * This callback allows for proxy or filter behavior. By altering the
+ * request and resetting its dispatched flag (via
+ * {@link Zend_Controller_Request_Abstract::setDispatched() setDispatched(false)}),
+ * a new action may be specified for dispatching.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return void
+ */
+ public function postDispatch(Zend_Controller_Request_Abstract $request)
+ {}
+
+ /**
+ * Called before Zend_Controller_Front exits its dispatch loop.
+ *
+ * @return void
+ */
+ public function dispatchLoopShutdown()
+ {}
+}
diff --git a/libs/Zend/Controller/Plugin/Broker.php b/libs/Zend/Controller/Plugin/Broker.php
new file mode 100755
index 0000000000..86ee69b7f5
--- /dev/null
+++ b/libs/Zend/Controller/Plugin/Broker.php
@@ -0,0 +1,361 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Plugins
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Controller_Exception */
+require_once 'Zend/Controller/Exception.php';
+
+/** Zend_Controller_Plugin_Abstract */
+require_once 'Zend/Controller/Plugin/Abstract.php';
+
+/** Zend_Controller_Request_Abstract */
+require_once 'Zend/Controller/Request/Abstract.php';
+
+/** Zend_Controller_Response_Abstract */
+require_once 'Zend/Controller/Response/Abstract.php';
+
+/**
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Plugins
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Controller_Plugin_Broker extends Zend_Controller_Plugin_Abstract
+{
+
+ /**
+ * Array of instance of objects extending Zend_Controller_Plugin_Abstract
+ *
+ * @var array
+ */
+ protected $_plugins = array();
+
+
+ /**
+ * Register a plugin.
+ *
+ * @param Zend_Controller_Plugin_Abstract $plugin
+ * @param int $stackIndex
+ * @return Zend_Controller_Plugin_Broker
+ */
+ public function registerPlugin(Zend_Controller_Plugin_Abstract $plugin, $stackIndex = null)
+ {
+ if (false !== array_search($plugin, $this->_plugins, true)) {
+ throw new Zend_Controller_Exception('Plugin already registered');
+ }
+
+ $stackIndex = (int) $stackIndex;
+
+ if ($stackIndex) {
+ if (isset($this->_plugins[$stackIndex])) {
+ throw new Zend_Controller_Exception('Plugin with stackIndex "' . $stackIndex . '" already registered');
+ }
+ $this->_plugins[$stackIndex] = $plugin;
+ } else {
+ $stackIndex = count($this->_plugins);
+ while (isset($this->_plugins[$stackIndex])) {
+ ++$stackIndex;
+ }
+ $this->_plugins[$stackIndex] = $plugin;
+ }
+
+ ksort($this->_plugins);
+
+ return $this;
+ }
+
+ /**
+ * Unregister a plugin.
+ *
+ * @param string|Zend_Controller_Plugin_Abstract $plugin Plugin object or class name
+ * @return Zend_Controller_Plugin_Broker
+ */
+ public function unregisterPlugin($plugin)
+ {
+ if ($plugin instanceof Zend_Controller_Plugin_Abstract) {
+ // Given a plugin object, find it in the array
+ $key = array_search($plugin, $this->_plugins, true);
+ if (false === $key) {
+ throw new Zend_Controller_Exception('Plugin never registered.');
+ }
+ unset($this->_plugins[$key]);
+ } elseif (is_string($plugin)) {
+ // Given a plugin class, find all plugins of that class and unset them
+ foreach ($this->_plugins as $key => $_plugin) {
+ $type = get_class($_plugin);
+ if ($plugin == $type) {
+ unset($this->_plugins[$key]);
+ }
+ }
+ }
+ return $this;
+ }
+
+ /**
+ * Is a plugin of a particular class registered?
+ *
+ * @param string $class
+ * @return bool
+ */
+ public function hasPlugin($class)
+ {
+ $found = array();
+ foreach ($this->_plugins as $plugin) {
+ $type = get_class($plugin);
+ if ($class == $type) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Retrieve a plugin or plugins by class
+ *
+ * @param string $class Class name of plugin(s) desired
+ * @return false|Zend_Controller_Plugin_Abstract|array Returns false if none found, plugin if only one found, and array of plugins if multiple plugins of same class found
+ */
+ public function getPlugin($class)
+ {
+ $found = array();
+ foreach ($this->_plugins as $plugin) {
+ $type = get_class($plugin);
+ if ($class == $type) {
+ $found[] = $plugin;
+ }
+ }
+
+ switch (count($found)) {
+ case 0:
+ return false;
+ case 1:
+ return $found[0];
+ default:
+ return $found;
+ }
+ }
+
+ /**
+ * Retrieve all plugins
+ *
+ * @return array
+ */
+ public function getPlugins()
+ {
+ return $this->_plugins;
+ }
+
+ /**
+ * Set request object, and register with each plugin
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return Zend_Controller_Plugin_Broker
+ */
+ public function setRequest(Zend_Controller_Request_Abstract $request)
+ {
+ $this->_request = $request;
+
+ foreach ($this->_plugins as $plugin) {
+ $plugin->setRequest($request);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Get request object
+ *
+ * @return Zend_Controller_Request_Abstract $request
+ */
+ public function getRequest()
+ {
+ return $this->_request;
+ }
+
+ /**
+ * Set response object
+ *
+ * @param Zend_Controller_Response_Abstract $response
+ * @return Zend_Controller_Plugin_Broker
+ */
+ public function setResponse(Zend_Controller_Response_Abstract $response)
+ {
+ $this->_response = $response;
+
+ foreach ($this->_plugins as $plugin) {
+ $plugin->setResponse($response);
+ }
+
+
+ return $this;
+ }
+
+ /**
+ * Get response object
+ *
+ * @return Zend_Controller_Response_Abstract $response
+ */
+ public function getResponse()
+ {
+ return $this->_response;
+ }
+
+
+ /**
+ * Called before Zend_Controller_Front begins evaluating the
+ * request against its routes.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return void
+ */
+ public function routeStartup(Zend_Controller_Request_Abstract $request)
+ {
+ foreach ($this->_plugins as $plugin) {
+ try {
+ $plugin->routeStartup($request);
+ } catch (Exception $e) {
+ if (Zend_Controller_Front::getInstance()->throwExceptions()) {
+ throw $e;
+ } else {
+ $this->getResponse()->setException($e);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Called before Zend_Controller_Front exits its iterations over
+ * the route set.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return void
+ */
+ public function routeShutdown(Zend_Controller_Request_Abstract $request)
+ {
+ foreach ($this->_plugins as $plugin) {
+ try {
+ $plugin->routeShutdown($request);
+ } catch (Exception $e) {
+ if (Zend_Controller_Front::getInstance()->throwExceptions()) {
+ throw $e;
+ } else {
+ $this->getResponse()->setException($e);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Called before Zend_Controller_Front enters its dispatch loop.
+ *
+ * During the dispatch loop, Zend_Controller_Front keeps a
+ * Zend_Controller_Request_Abstract object, and uses
+ * Zend_Controller_Dispatcher to dispatch the
+ * Zend_Controller_Request_Abstract object to controllers/actions.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return void
+ */
+ public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
+ {
+ foreach ($this->_plugins as $plugin) {
+ try {
+ $plugin->dispatchLoopStartup($request);
+ } catch (Exception $e) {
+ if (Zend_Controller_Front::getInstance()->throwExceptions()) {
+ throw $e;
+ } else {
+ $this->getResponse()->setException($e);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Called before an action is dispatched by Zend_Controller_Dispatcher.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return void
+ */
+ public function preDispatch(Zend_Controller_Request_Abstract $request)
+ {
+ foreach ($this->_plugins as $plugin) {
+ try {
+ $plugin->preDispatch($request);
+ } catch (Exception $e) {
+ if (Zend_Controller_Front::getInstance()->throwExceptions()) {
+ throw $e;
+ } else {
+ $this->getResponse()->setException($e);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Called after an action is dispatched by Zend_Controller_Dispatcher.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return void
+ */
+ public function postDispatch(Zend_Controller_Request_Abstract $request)
+ {
+ foreach ($this->_plugins as $plugin) {
+ try {
+ $plugin->postDispatch($request);
+ } catch (Exception $e) {
+ if (Zend_Controller_Front::getInstance()->throwExceptions()) {
+ throw $e;
+ } else {
+ $this->getResponse()->setException($e);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Called before Zend_Controller_Front exits its dispatch loop.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return void
+ */
+ public function dispatchLoopShutdown()
+ {
+ foreach ($this->_plugins as $plugin) {
+ try {
+ $plugin->dispatchLoopShutdown();
+ } catch (Exception $e) {
+ if (Zend_Controller_Front::getInstance()->throwExceptions()) {
+ throw $e;
+ } else {
+ $this->getResponse()->setException($e);
+ }
+ }
+ }
+ }
+}
diff --git a/libs/Zend/Controller/Plugin/ErrorHandler.php b/libs/Zend/Controller/Plugin/ErrorHandler.php
new file mode 100755
index 0000000000..7bb5db942c
--- /dev/null
+++ b/libs/Zend/Controller/Plugin/ErrorHandler.php
@@ -0,0 +1,253 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Plugins
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Controller_Plugin_Abstract */
+require_once 'Zend/Controller/Plugin/Abstract.php';
+
+/**
+ * Handle exceptions that bubble up based on missing controllers, actions, or
+ * application errors, and forward to an error handler.
+ *
+ * @uses Zend_Controller_Plugin_Abstract
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Plugins
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: ErrorHandler.php 4826 2007-05-16 19:52:21Z matthew $
+ */
+class Zend_Controller_Plugin_ErrorHandler extends Zend_Controller_Plugin_Abstract
+{
+ /**
+ * Const - No controller exception; controller does not exist
+ */
+ const EXCEPTION_NO_CONTROLLER = 'EXCEPTION_NO_CONTROLLER';
+
+ /**
+ * Const - No action exception; controller exists, but action does not
+ */
+ const EXCEPTION_NO_ACTION = 'EXCEPTION_NO_ACTION';
+
+ /**
+ * Const - Other Exception; exceptions thrown by application controllers
+ */
+ const EXCEPTION_OTHER = 'EXCEPTION_OTHER';
+
+ /**
+ * Module to use for errors; defaults to default module in dispatcher
+ * @var string
+ */
+ protected $_errorModule;
+
+ /**
+ * Controller to use for errors; defaults to 'error'
+ * @var string
+ */
+ protected $_errorController = 'error';
+
+ /**
+ * Action to use for errors; defaults to 'error'
+ * @var string
+ */
+ protected $_errorAction = 'error';
+
+ /**
+ * Flag; are we already inside the error handler loop?
+ * @var bool
+ */
+ protected $_isInsideErrorHandlerLoop = false;
+
+ /**
+ * Exception count logged at first invocation of plugin
+ * @var int
+ */
+ protected $_exceptionCountAtFirstEncounter = 0;
+
+ /**
+ * Constructor
+ *
+ * Options may include:
+ * - module
+ * - controller
+ * - action
+ *
+ * @param Array $options
+ * @return void
+ */
+ public function __construct(Array $options = array())
+ {
+ $this->setErrorHandler($options);
+ }
+
+ /**
+ * setErrorHandler() - setup the error handling options
+ *
+ * @param array $options
+ * @return Zend_Controller_Plugin_ErrorHandler
+ */
+ public function setErrorHandler(Array $options = array())
+ {
+ if (isset($options['module'])) {
+ $this->setErrorHandlerModule($options['module']);
+ }
+ if (isset($options['controller'])) {
+ $this->setErrorHandlerController($options['controller']);
+ }
+ if (isset($options['action'])) {
+ $this->setErrorHandlerAction($options['action']);
+ }
+ return $this;
+ }
+
+ /**
+ * Set the module name for the error handler
+ *
+ * @param string $module
+ * @return Zend_Controller_Plugin_ErrorHandler
+ */
+ public function setErrorHandlerModule($module)
+ {
+ $this->_errorModule = (string) $module;
+ return $this;
+ }
+
+ /**
+ * Retrieve the current error handler module
+ *
+ * @return string
+ */
+ public function getErrorHandlerModule()
+ {
+ if (null === $this->_errorModule) {
+ $this->_errorModule = Zend_Controller_Front::getInstance()->getDispatcher()->getDefaultModule();
+ }
+ return $this->_errorModule;
+ }
+
+ /**
+ * Set the controller name for the error handler
+ *
+ * @param string $controller
+ * @return Zend_Controller_Plugin_ErrorHandler
+ */
+ public function setErrorHandlerController($controller)
+ {
+ $this->_errorController = (string) $controller;
+ return $this;
+ }
+
+ /**
+ * Retrieve the current error handler controller
+ *
+ * @return string
+ */
+ public function getErrorHandlerController()
+ {
+ return $this->_errorController;
+ }
+
+ /**
+ * Set the action name for the error handler
+ *
+ * @param string $action
+ * @return Zend_Controller_Plugin_ErrorHandler
+ */
+ public function setErrorHandlerAction($action)
+ {
+ $this->_errorAction = (string) $action;
+ return $this;
+ }
+
+ /**
+ * Retrieve the current error handler action
+ *
+ * @return string
+ */
+ public function getErrorHandlerAction()
+ {
+ return $this->_errorAction;
+ }
+
+ /**
+ * postDispatch() plugin hook -- check for exceptions and dispatch error
+ * handler if necessary
+ *
+ * If the 'noErrorHandler' front controller flag has been set,
+ * returns early.
+ *
+ * @param Zend_Controller_Request_Abstract $request
+ * @return void
+ */
+ public function postDispatch(Zend_Controller_Request_Abstract $request)
+ {
+ $frontController = Zend_Controller_Front::getInstance();
+ if ($frontController->getParam('noErrorHandler')) {
+ return;
+ }
+
+ $response = $this->getResponse();
+
+ if ($this->_isInsideErrorHandlerLoop) {
+ $exceptions = $response->getException();
+ if (count($exceptions) > $this->_exceptionCountAtFirstEncounter) {
+ // Exception thrown by error handler; tell the front controller to throw it
+ $frontController->throwExceptions(true);
+ throw array_pop($exceptions);
+ }
+ }
+
+ // check for an exception AND allow the error handler controller the option to forward
+ if (($response->isException()) && (!$this->_isInsideErrorHandlerLoop)) {
+ $this->_isInsideErrorHandlerLoop = true;
+
+ // Get exception information
+ $error = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
+ $exceptions = $response->getException();
+ $exception = $exceptions[0];
+ $exceptionType = get_class($exception);
+ $error->exception = $exception;
+ switch ($exceptionType) {
+ case 'Zend_Controller_Dispatcher_Exception':
+ $error->type = self::EXCEPTION_NO_CONTROLLER;
+ break;
+ case 'Zend_Controller_Action_Exception':
+ $error->type = self::EXCEPTION_NO_ACTION;
+ break;
+ default:
+ $error->type = self::EXCEPTION_OTHER;
+ break;
+ }
+
+ // Keep a copy of the original request
+ $error->request = clone $request;
+
+ // get a count of the number of exceptions encountered
+ $this->_exceptionCountAtFirstEncounter = count($exceptions);
+
+ // Forward to the error handler
+ $request->setParam('error_handler', $error)
+ ->setModuleName($this->getErrorHandlerModule())
+ ->setControllerName($this->getErrorHandlerController())
+ ->setActionName($this->getErrorHandlerAction())
+ ->setDispatched(false);
+ }
+ }
+}
diff --git a/libs/Zend/Controller/Request/Abstract.php b/libs/Zend/Controller/Request/Abstract.php
new file mode 100755
index 0000000000..78905de406
--- /dev/null
+++ b/libs/Zend/Controller/Request/Abstract.php
@@ -0,0 +1,338 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Controller_Request_Abstract
+{
+ /**
+ * Has the action been dispatched?
+ * @var boolean
+ */
+ protected $_dispatched = false;
+
+ /**
+ * Module
+ * @var string
+ */
+ protected $_module;
+
+ /**
+ * Module key for retrieving module from params
+ * @var string
+ */
+ protected $_moduleKey = 'module';
+
+ /**
+ * Controller
+ * @var string
+ */
+ protected $_controller;
+
+ /**
+ * Controller key for retrieving controller from params
+ * @var string
+ */
+ protected $_controllerKey = 'controller';
+
+ /**
+ * Action
+ * @var string
+ */
+ protected $_action;
+
+ /**
+ * Action key for retrieving action from params
+ * @var string
+ */
+ protected $_actionKey = 'action';
+
+ /**
+ * Request parameters
+ * @var array
+ */
+ protected $_params = array();
+
+ /**
+ * Retrieve the module name
+ *
+ * @return string
+ */
+ public function getModuleName()
+ {
+ if (null === $this->_module) {
+ $this->_module = $this->getParam($this->getModuleKey());
+ }
+
+ return $this->_module;
+ }
+
+ /**
+ * Set the module name to use
+ *
+ * @param string $value
+ * @return Zend_Controller_Request_Abstract
+ */
+ public function setModuleName($value)
+ {
+ $this->_module = $value;
+ return $this;
+ }
+
+ /**
+ * Retrieve the controller name
+ *
+ * @return string
+ */
+ public function getControllerName()
+ {
+ if (null === $this->_controller) {
+ $this->_controller = $this->getParam($this->getControllerKey());
+ }
+
+ return $this->_controller;
+ }
+
+ /**
+ * Set the controller name to use
+ *
+ * @param string $value
+ * @return Zend_Controller_Request_Abstract
+ */
+ public function setControllerName($value)
+ {
+ $this->_controller = $value;
+ return $this;
+ }
+
+ /**
+ * Retrieve the action name
+ *
+ * @return string
+ */
+ public function getActionName()
+ {
+ if (null === $this->_action) {
+ $this->_action = $this->getParam($this->getActionKey());
+ }
+
+ return $this->_action;
+ }
+
+ /**
+ * Set the action name
+ *
+ * @param string $value
+ * @return Zend_Controller_Request_Abstract
+ */
+ public function setActionName($value)
+ {
+ $this->_action = $value;
+ return $this;
+ }
+
+ /**
+ * Retrieve the module key
+ *
+ * @return string
+ */
+ public function getModuleKey()
+ {
+ return $this->_moduleKey;
+ }
+
+ /**
+ * Set the module key
+ *
+ * @param string $key
+ * @return Zend_Controller_Request_Abstract
+ */
+ public function setModuleKey($key)
+ {
+ $this->_moduleKey = (string) $key;
+ return $this;
+ }
+
+ /**
+ * Retrieve the controller key
+ *
+ * @return string
+ */
+ public function getControllerKey()
+ {
+ return $this->_controllerKey;
+ }
+
+ /**
+ * Set the controller key
+ *
+ * @param string $key
+ * @return Zend_Controller_Request_Abstract
+ */
+ public function setControllerKey($key)
+ {
+ $this->_controllerKey = (string) $key;
+ return $this;
+ }
+
+ /**
+ * Retrieve the action key
+ *
+ * @return string
+ */
+ public function getActionKey()
+ {
+ return $this->_actionKey;
+ }
+
+ /**
+ * Set the action key
+ *
+ * @param string $key
+ * @return Zend_Controller_Request_Abstract
+ */
+ public function setActionKey($key)
+ {
+ $this->_actionKey = (string) $key;
+ return $this;
+ }
+
+ /**
+ * Get an action parameter
+ *
+ * @param string $key
+ * @param mixed $default Default value to use if key not found
+ * @return mixed
+ */
+ public function getParam($key, $default = null)
+ {
+ $key = (string) $key;
+ if (isset($this->_params[$key])) {
+ return $this->_params[$key];
+ }
+
+ return $default;
+ }
+
+ /**
+ * Retrieve only user params (i.e, any param specific to the object and not the environment)
+ *
+ * @return array
+ */
+ public function getUserParams()
+ {
+ return $this->_params;
+ }
+
+ /**
+ * Retrieve a single user param (i.e, a param specific to the object and not the environment)
+ *
+ * @param string $key
+ * @param string $default Default value to use if key not found
+ * @return mixed
+ */
+ public function getUserParam($key, $default = null)
+ {
+ if (isset($this->_params[$key])) {
+ return $this->_params[$key];
+ }
+
+ return $default;
+ }
+
+ /**
+ * Set an action parameter
+ *
+ * A $value of null will unset the $key if it exists
+ *
+ * @param string $key
+ * @param mixed $value
+ * @return Zend_Controller_Request_Abstract
+ */
+ public function setParam($key, $value)
+ {
+ $key = (string) $key;
+
+ if ((null === $value) && isset($this->_params[$key])) {
+ unset($this->_params[$key]);
+ } elseif (null !== $value) {
+ $this->_params[$key] = $value;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Get all action parameters
+ *
+ * @return array
+ */
+ public function getParams()
+ {
+ return $this->_params;
+ }
+
+ /**
+ * Set action parameters en masse; does not overwrite
+ *
+ * Null values will unset the associated key.
+ *
+ * @param array $array
+ * @return Zend_Controller_Request_Abstract
+ */
+ public function setParams(array $array)
+ {
+ $this->_params = $this->_params + (array) $array;
+
+ foreach ($this->_params as $key => $value) {
+ if (null === $value) {
+ unset($this->_params[$key]);
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Set flag indicating whether or not request has been dispatched
+ *
+ * @param boolean $flag
+ * @return Zend_Controller_Request_Abstract
+ */
+ public function setDispatched($flag = true)
+ {
+ $this->_dispatched = $flag ? true : false;
+ return $this;
+ }
+
+ /**
+ * Determine if the request has been dispatched
+ *
+ * @return boolean
+ */
+ public function isDispatched()
+ {
+ return $this->_dispatched;
+ }
+}
diff --git a/libs/Zend/Controller/Request/Apache404.php b/libs/Zend/Controller/Request/Apache404.php
new file mode 100755
index 0000000000..260de69129
--- /dev/null
+++ b/libs/Zend/Controller/Request/Apache404.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Controller_Request_Exception */
+require_once 'Zend/Controller/Request/Exception.php';
+
+/** Zend_Controller_Request_Http */
+require_once 'Zend/Controller/Request/Http.php';
+
+/** Zend_Uri */
+require_once 'Zend/Uri.php';
+
+/**
+ * Zend_Controller_Request_Apache404
+ *
+ * HTTP request object for use with Zend_Controller family. Extends basic HTTP
+ * request object to allow for two edge cases when using Apache:
+ * - Using Apache's 404 handler instead of mod_rewrite to direct requests
+ * - Using the PT flag in rewrite rules
+ *
+ * In each case, the URL to check against is found in REDIRECT_URL, not
+ * REQUEST_URI.
+ *
+ * @uses Zend_Controller_Request_Http
+ * @package Zend_Controller
+ * @subpackage Request
+ */
+class Zend_Controller_Request_Apache404 extends Zend_Controller_Request_Http
+{
+ public function setRequestUri($requestUri = null)
+ {
+ if ($requestUri === null) {
+ if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { // check this first so IIS will catch
+ $requestUri = $_SERVER['HTTP_X_REWRITE_URL'];
+ } elseif (isset($_SERVER['REDIRECT_URL'])) { // Check if using mod_rewrite
+ $requestUri = $_SERVER['REDIRECT_URL'];
+ } elseif (isset($_SERVER['REQUEST_URI'])) {
+ $requestUri = $_SERVER['REQUEST_URI'];
+ } elseif (isset($_SERVER['ORIG_PATH_INFO'])) { // IIS 5.0, PHP as CGI
+ $requestUri = $_SERVER['ORIG_PATH_INFO'];
+ if (!empty($_SERVER['QUERY_STRING'])) {
+ $requestUri .= '?' . $_SERVER['QUERY_STRING'];
+ }
+ } else {
+ return $this;
+ }
+ } elseif (!is_string($requestUri)) {
+ return $this;
+ } else {
+ // Set GET items, if available
+ $_GET = array();
+ if (false !== ($pos = strpos($requestUri, '?'))) {
+ // Get key => value pairs and set $_GET
+ $query = substr($requestUri, $pos + 1);
+ parse_str($query, $vars);
+ $_GET = $vars;
+ }
+ }
+
+ $this->_requestUri = $requestUri;
+ return $this;
+ }
+}
diff --git a/libs/Zend/Controller/Request/Exception.php b/libs/Zend/Controller/Request/Exception.php
new file mode 100755
index 0000000000..7dc0cce965
--- /dev/null
+++ b/libs/Zend/Controller/Request/Exception.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Request
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Controller_Exception */
+require_once 'Zend/Controller/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Request
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Controller_Request_Exception extends Zend_Controller_Exception
+{}
+
diff --git a/libs/Zend/Controller/Request/Http.php b/libs/Zend/Controller/Request/Http.php
new file mode 100755
index 0000000000..5100fdcbc7
--- /dev/null
+++ b/libs/Zend/Controller/Request/Http.php
@@ -0,0 +1,759 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Controller_Request_Exception */
+require_once 'Zend/Controller/Request/Exception.php';
+
+/** Zend_Controller_Request_Abstract */
+require_once 'Zend/Controller/Request/Abstract.php';
+
+/** Zend_Uri */
+require_once 'Zend/Uri.php';
+
+/**
+ * Zend_Controller_Request_Http
+ *
+ * HTTP request object for use with Zend_Controller family.
+ *
+ * @uses Zend_Controller_Request_Abstract
+ * @package Zend_Controller
+ * @subpackage Request
+ */
+class Zend_Controller_Request_Http extends Zend_Controller_Request_Abstract
+{
+ /**
+ * REQUEST_URI
+ * @var string;
+ */
+ protected $_requestUri;
+
+ /**
+ * Base URL of request
+ * @var string
+ */
+ protected $_baseUrl = null;
+
+ /**
+ * Base path of request
+ * @var string
+ */
+ protected $_basePath = null;
+
+ /**
+ * PATH_INFO
+ * @var string
+ */
+ protected $_pathInfo = '';
+
+ /**
+ * Instance parameters
+ * @var array
+ */
+ protected $_params = array();
+
+ /**
+ * Alias keys for request parameters
+ * @var array
+ */
+ protected $_aliases = array();
+
+ /**
+ * Constructor
+ *
+ * If a $uri is passed, the object will attempt to populate itself using
+ * that information.
+ *
+ * @param string|Zend_Uri $uri
+ * @return void
+ * @throws Zend_Controller_Request_Exception when invalid URI passed
+ */
+ public function __construct($uri = null)
+ {
+ if (null !== $uri) {
+ if (!$uri instanceof Zend_Uri) {
+ $uri = Zend_Uri::factory($uri);
+ }
+ if ($uri->valid()) {
+ $path = $uri->getPath();
+ $query = $uri->getQuery();
+ if (!empty($query)) {
+ $path .= '?' . $query;
+ }
+
+ $this->setRequestUri($path);
+ } else {
+ require_once 'Zend/Controller/Request/Exception.php';
+ throw new Zend_Controller_Request_Exception('Invalid URI provided to constructor');
+ }
+ } else {
+ $this->setRequestUri();
+ }
+ }
+
+ /**
+ * Access values contained in the superglobals as public members
+ * Order of precedence: 1. GET, 2. POST, 3. COOKIE, 4. SERVER, 5. ENV
+ *
+ * @see http://msdn.microsoft.com/en-us/library/system.web.httprequest.item.aspx
+ * @param string $key
+ * @return mixed
+ */
+ public function __get($key)
+ {
+ switch (true) {
+ case isset($this->_params[$key]):
+ return $this->_params[$key];
+ case isset($_GET[$key]):
+ return $_GET[$key];
+ case isset($_POST[$key]):
+ return $_POST[$key];
+ case isset($_COOKIE[$key]):
+ return $_COOKIE[$key];
+ case ($key == 'REQUEST_URI'):
+ return $this->getRequestUri();
+ case ($key == 'PATH_INFO'):
+ return $this->getPathInfo();
+ case isset($_SERVER[$key]):
+ return $_SERVER[$key];
+ case isset($_ENV[$key]):
+ return $_ENV[$key];
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * Alias to __get
+ *
+ * @param string $key
+ * @return mixed
+ */
+ public function get($key)
+ {
+ return $this->__get($key);
+ }
+
+ /**
+ * Set values
+ *
+ * In order to follow {@link __get()}, which operates on a number of
+ * superglobals, setting values through overloading is not allowed and will
+ * raise an exception. Use setParam() instead.
+ *
+ * @param string $key
+ * @param mixed $value
+ * @return void
+ * @throws Zend_Controller_Request_Exception
+ */
+ public function __set($key, $value)
+ {
+ require_once 'Zend/Controller/Request/Exception.php';
+ throw new Zend_Controller_Request_Exception('Setting values in superglobals not allowed; please use setParam()');
+ }
+
+ /**
+ * Alias to __set()
+ *
+ * @param string $key
+ * @param mixed $value
+ * @return void
+ */
+ public function set($key, $value)
+ {
+ return $this->__set($key, $value);
+ }
+
+ /**
+ * Check to see if a property is set
+ *
+ * @param string $key
+ * @return boolean
+ */
+ public function __isset($key)
+ {
+ switch (true) {
+ case isset($this->_params[$key]):
+ return true;
+ case isset($_GET[$key]):
+ return true;
+ case isset($_POST[$key]):
+ return true;
+ case isset($_COOKIE[$key]):
+ return true;
+ case isset($_SERVER[$key]):
+ return true;
+ case isset($_ENV[$key]):
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Alias to __isset()
+ *
+ * @param string $key
+ * @return boolean
+ */
+ public function has($key)
+ {
+ return $this->__isset($key);
+ }
+
+ /**
+ * Retrieve a member of the $_GET superglobal
+ *
+ * If no $key is passed, returns the entire $_GET array.
+ *
+ * @todo How to retrieve from nested arrays
+ * @param string $key
+ * @param mixed $default Default value to use if key not found
+ * @return mixed Returns null if key does not exist
+ */
+ public function getQuery($key = null, $default = null)
+ {
+ if (null === $key) {
+ return $_GET;
+ }
+
+ return (isset($_GET[$key])) ? $_GET[$key] : $default;
+ }
+
+ /**
+ * Retrieve a member of the $_POST superglobal
+ *
+ * If no $key is passed, returns the entire $_POST array.
+ *
+ * @todo How to retrieve from nested arrays
+ * @param string $key
+ * @param mixed $default Default value to use if key not found
+ * @return mixed Returns null if key does not exist
+ */
+ public function getPost($key = null, $default = null)
+ {
+ if (null === $key) {
+ return $_POST;
+ }
+
+ return (isset($_POST[$key])) ? $_POST[$key] : $default;
+ }
+
+ /**
+ * Retrieve a member of the $_COOKIE superglobal
+ *
+ * If no $key is passed, returns the entire $_COOKIE array.
+ *
+ * @todo How to retrieve from nested arrays
+ * @param string $key
+ * @param mixed $default Default value to use if key not found
+ * @return mixed Returns null if key does not exist
+ */
+ public function getCookie($key = null, $default = null)
+ {
+ if (null === $key) {
+ return $_COOKIE;
+ }
+
+ return (isset($_COOKIE[$key])) ? $_COOKIE[$key] : $default;
+ }
+
+ /**
+ * Retrieve a member of the $_SERVER superglobal
+ *
+ * If no $key is passed, returns the entire $_COOKIE array.
+ *
+ * @param string $key
+ * @param mixed $default Default value to use if key not found
+ * @return mixed Returns null if key does not exist
+ */
+ public function getServer($key = null, $default = null)
+ {
+ if (null === $key) {
+ return $_SERVER;
+ }
+
+ return (isset($_SERVER[$key])) ? $_SERVER[$key] : $default;
+ }
+
+ /**
+ * Retrieve a member of the $_ENV superglobal
+ *
+ * If no $key is passed, returns the entire $_COOKIE array.
+ *
+ * @param string $key
+ * @param mixed $default Default value to use if key not found
+ * @return mixed Returns null if key does not exist
+ */
+ public function getEnv($key = null, $default = null)
+ {
+ if (null === $key) {
+ return $_ENV;
+ }
+
+ return (isset($_ENV[$key])) ? $_ENV[$key] : $default;
+ }
+
+ /**
+ * Set the REQUEST_URI on which the instance operates
+ *
+ * If no request URI is passed, uses the value in $_SERVER['REQUEST_URI'],
+ * $_SERVER['HTTP_X_REWRITE_URL'], or $_SERVER['ORIG_PATH_INFO'] + $_SERVER['QUERY_STRING'].
+ *
+ * @param string $requestUri
+ * @return Zend_Controller_Request_Http
+ */
+ public function setRequestUri($requestUri = null)
+ {
+ if ($requestUri === null) {
+ if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { // check this first so IIS will catch
+ $requestUri = $_SERVER['HTTP_X_REWRITE_URL'];
+ } elseif (isset($_SERVER['REQUEST_URI'])) {
+ $requestUri = $_SERVER['REQUEST_URI'];
+ } elseif (isset($_SERVER['ORIG_PATH_INFO'])) { // IIS 5.0, PHP as CGI
+ $requestUri = $_SERVER['ORIG_PATH_INFO'];
+ if (!empty($_SERVER['QUERY_STRING'])) {
+ $requestUri .= '?' . $_SERVER['QUERY_STRING'];
+ }
+ } else {
+ return $this;
+ }
+ } elseif (!is_string($requestUri)) {
+ return $this;
+ } else {
+ // Set GET items, if available
+ $_GET = array();
+ if (false !== ($pos = strpos($requestUri, '?'))) {
+ // Get key => value pairs and set $_GET
+ $query = substr($requestUri, $pos + 1);
+ parse_str($query, $vars);
+ $_GET = $vars;
+ }
+ }
+
+ $this->_requestUri = $requestUri;
+ return $this;
+ }
+
+ /**
+ * Returns the REQUEST_URI taking into account
+ * platform differences between Apache and IIS
+ *
+ * @return string
+ */
+ public function getRequestUri()
+ {
+ if (empty($this->_requestUri)) {
+ $this->setRequestUri();
+ }
+
+ return $this->_requestUri;
+ }
+
+ /**
+ * Set the base URL of the request; i.e., the segment leading to the script name
+ *
+ * E.g.:
+ * - /admin
+ * - /myapp
+ * - /subdir/index.php
+ *
+ * Do not use the full URI when providing the base. The following are
+ * examples of what not to use:
+ * - http://example.com/admin (should be just /admin)
+ * - http://example.com/subdir/index.php (should be just /subdir/index.php)
+ *
+ * If no $baseUrl is provided, attempts to determine the base URL from the
+ * environment, using SCRIPT_FILENAME, SCRIPT_NAME, PHP_SELF, and
+ * ORIG_SCRIPT_NAME in its determination.
+ *
+ * @param mixed $baseUrl
+ * @return Zend_Controller_Request_Http
+ */
+ public function setBaseUrl($baseUrl = null)
+ {
+ if ((null !== $baseUrl) && !is_string($baseUrl)) {
+ return $this;
+ }
+
+ if ($baseUrl === null) {
+ $filename = basename($_SERVER['SCRIPT_FILENAME']);
+
+ if (basename($_SERVER['SCRIPT_NAME']) === $filename) {
+ $baseUrl = $_SERVER['SCRIPT_NAME'];
+ } elseif (basename($_SERVER['PHP_SELF']) === $filename) {
+ $baseUrl = $_SERVER['PHP_SELF'];
+ } elseif (isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $filename) {
+ $baseUrl = $_SERVER['ORIG_SCRIPT_NAME']; // 1and1 shared hosting compatibility
+ } else {
+ // Backtrack up the script_filename to find the portion matching
+ // php_self
+ $path = $_SERVER['PHP_SELF'];
+ $segs = explode('/', trim($_SERVER['SCRIPT_FILENAME'], '/'));
+ $segs = array_reverse($segs);
+ $index = 0;
+ $last = count($segs);
+ $baseUrl = '';
+ do {
+ $seg = $segs[$index];
+ $baseUrl = '/' . $seg . $baseUrl;
+ ++$index;
+ } while (($last > $index) && (false !== ($pos = strpos($path, $baseUrl))) && (0 != $pos));
+ }
+
+ // Does the baseUrl have anything in common with the request_uri?
+ $requestUri = $this->getRequestUri();
+
+ if (0 === strpos($requestUri, $baseUrl)) {
+ // full $baseUrl matches
+ $this->_baseUrl = $baseUrl;
+ return $this;
+ }
+
+ if (0 === strpos($requestUri, dirname($baseUrl))) {
+ // directory portion of $baseUrl matches
+ $this->_baseUrl = rtrim(dirname($baseUrl), '/');
+ return $this;
+ }
+
+ if (!strpos($requestUri, basename($baseUrl))) {
+ // no match whatsoever; set it blank
+ $this->_baseUrl = '';
+ return $this;
+ }
+
+ // If using mod_rewrite or ISAPI_Rewrite strip the script filename
+ // out of baseUrl. $pos !== 0 makes sure it is not matching a value
+ // from PATH_INFO or QUERY_STRING
+ if ((strlen($requestUri) >= strlen($baseUrl))
+ && ((false !== ($pos = strpos($requestUri, $baseUrl))) && ($pos !== 0)))
+ {
+ $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl));
+ }
+ }
+
+ $this->_baseUrl = rtrim($baseUrl, '/');
+ return $this;
+ }
+
+ /**
+ * Everything in REQUEST_URI before PATH_INFO
+ * <form action="<?=$baseUrl?>/news/submit" method="POST"/>
+ *
+ * @return string
+ */
+ public function getBaseUrl()
+ {
+ if (null === $this->_baseUrl) {
+ $this->setBaseUrl();
+ }
+
+ return $this->_baseUrl;
+ }
+
+ /**
+ * Set the base path for the URL
+ *
+ * @param string|null $basePath
+ * @return Zend_Controller_Request_Http
+ */
+ public function setBasePath($basePath = null)
+ {
+ if ($basePath === null) {
+ $filename = basename($_SERVER['SCRIPT_FILENAME']);
+
+ $baseUrl = $this->getBaseUrl();
+ if (empty($baseUrl)) {
+ $this->_basePath = '';
+ return $this;
+ }
+
+ if (basename($baseUrl) === $filename) {
+ $basePath = dirname($baseUrl);
+ } else {
+ $basePath = $baseUrl;
+ }
+ }
+
+ $this->_basePath = rtrim($basePath, '/');
+ return $this;
+ }
+
+ /**
+ * Everything in REQUEST_URI before PATH_INFO not including the filename
+ * <img src="<?=$basePath?>/images/zend.png"/>
+ *
+ * @return string
+ */
+ public function getBasePath()
+ {
+ if (null === $this->_basePath) {
+ $this->setBasePath();
+ }
+
+ return $this->_basePath;
+ }
+
+ /**
+ * Set the PATH_INFO string
+ *
+ * @param string|null $pathInfo
+ * @return Zend_Controller_Request_Http
+ */
+ public function setPathInfo($pathInfo = null)
+ {
+ if ($pathInfo === null) {
+ $baseUrl = $this->getBaseUrl();
+
+ if (null === ($requestUri = $this->getRequestUri())) {
+ return $this;
+ }
+
+ // Remove the query string from REQUEST_URI
+ if ($pos = strpos($requestUri, '?')) {
+ $requestUri = substr($requestUri, 0, $pos);
+ }
+
+ if ((null !== $baseUrl)
+ && (false === ($pathInfo = substr($requestUri, strlen($baseUrl)))))
+ {
+ // If substr() returns false then PATH_INFO is set to an empty string
+ $pathInfo = '';
+ } elseif (null === $baseUrl) {
+ $pathInfo = $requestUri;
+ }
+ }
+
+ $this->_pathInfo = (string) $pathInfo;
+ return $this;
+ }
+
+ /**
+ * Returns everything between the BaseUrl and QueryString.
+ * This value is calculated instead of reading PATH_INFO
+ * directly from $_SERVER due to cross-platform differences.
+ *
+ * @return string
+ */
+ public function getPathInfo()
+ {
+ if (empty($this->_pathInfo)) {
+ $this->setPathInfo();
+ }
+
+ return $this->_pathInfo;
+ }
+
+ /**
+ * Set a userland parameter
+ *
+ * Uses $key to set a userland parameter. If $key is an alias, the actual
+ * key will be retrieved and used to set the parameter.
+ *
+ * @param mixed $key
+ * @param mixed $value
+ * @return Zend_Controller_Request_Http
+ */
+ public function setParam($key, $value)
+ {
+ $keyName = (null !== ($alias = $this->getAlias($key))) ? $alias : $key;
+
+ parent::setParam($key, $value);
+ return $this;
+ }
+
+ /**
+ * Retrieve a parameter
+ *
+ * Retrieves a parameter from the instance. Priority is in the order of
+ * userland parameters (see {@link setParam()}), $_GET, $_POST. If a
+ * parameter matching the $key is not found, null is returned.
+ *
+ * If the $key is an alias, the actual key aliased will be used.
+ *
+ * @param mixed $key
+ * @param mixed $default Default value to use if key not found
+ * @return mixed
+ */
+ public function getParam($key, $default = null)
+ {
+ $keyName = (null !== ($alias = $this->getAlias($key))) ? $alias : $key;
+
+ if (isset($this->_params[$keyName])) {
+ return $this->_params[$keyName];
+ } elseif ((isset($_GET[$keyName]))) {
+ return $_GET[$keyName];
+ } elseif ((isset($_POST[$keyName]))) {
+ return $_POST[$keyName];
+ }
+
+ return $default;
+ }
+
+ /**
+ * Retrieve an array of parameters
+ *
+ * Retrieves a merged array of parameters, with precedence of userland
+ * params (see {@link setParam()}), $_GET, $POST (i.e., values in the
+ * userland params will take precedence over all others).
+ *
+ * @return array
+ */
+ public function getParams()
+ {
+ $return = $this->_params;
+ if (isset($_GET) && is_array($_GET)) {
+ $return += $_GET;
+ }
+ if (isset($_POST) && is_array($_POST)) {
+ $return += $_POST;
+ }
+ return $return;
+ }
+
+ /**
+ * Set parameters
+ *
+ * Set one or more parameters. Parameters are set as userland parameters,
+ * using the keys specified in the array.
+ *
+ * @param array $params
+ * @return Zend_Controller_Request_Http
+ */
+ public function setParams(array $params)
+ {
+ foreach ($params as $key => $value) {
+ $this->setParam($key, $value);
+ }
+ return $this;
+ }
+
+ /**
+ * Set a key alias
+ *
+ * Set an alias used for key lookups. $name specifies the alias, $target
+ * specifies the actual key to use.
+ *
+ * @param string $name
+ * @param string $target
+ * @return Zend_Controller_Request_Http
+ */
+ public function setAlias($name, $target)
+ {
+ $this->_aliases[$name] = $target;
+ return $this;
+ }
+
+ /**
+ * Retrieve an alias
+ *
+ * Retrieve the actual key represented by the alias $name.
+ *
+ * @param string $name
+ * @return string|null Returns null when no alias exists
+ */
+ public function getAlias($name)
+ {
+ if (isset($this->_aliases[$name])) {
+ return $this->_aliases[$name];
+ }
+
+ return null;
+ }
+
+ /**
+ * Retrieve the list of all aliases
+ *
+ * @return array
+ */
+ public function getAliases()
+ {
+ return $this->_aliases;
+ }
+
+ /**
+ * Return the method by which the request was made
+ *
+ * @return string
+ */
+ public function getMethod()
+ {
+ return $this->getServer('REQUEST_METHOD');
+ }
+
+ /**
+ * Was the request made by POST?
+ *
+ * @return boolean
+ */
+ public function isPost()
+ {
+ if ('POST' == $this->getMethod()) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Return the value of the given HTTP header. Pass the header name as the
+ * plain, HTTP-specified header name. Ex.: Ask for 'Accept' to get the
+ * Accept header, 'Accept-Encoding' to get the Accept-Encoding header.
+ *
+ * @param string HTTP header name
+ * @return string|false HTTP header value, or false if not found
+ * @throws Zend_Controller_Request_Exception
+ */
+ public function getHeader($header)
+ {
+ if (empty($header)) {
+ require_once 'Zend/Controller/Request/Exception.php';
+ throw new Zend_Controller_Request_Exception('An HTTP header name is required');
+ }
+
+ // Try to get it from the $_SERVER array first
+ $temp = 'HTTP_' . strtoupper(str_replace('-', '_', $header));
+ if (!empty($_SERVER[$temp])) {
+ return $_SERVER[$temp];
+ }
+
+ // This seems to be the only way to get the Authorization header on
+ // Apache
+ if (function_exists('apache_request_headers')) {
+ $headers = apache_request_headers();
+ if (!empty($headers[$header])) {
+ return $headers[$header];
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Is the request a Javascript XMLHttpRequest?
+ *
+ * Should work with Prototype/Script.aculo.us, possibly others.
+ *
+ * @return boolean
+ */
+ public function isXmlHttpRequest()
+ {
+ return ($this->getHeader('X_REQUESTED_WITH') == 'XMLHttpRequest');
+ }
+}
diff --git a/libs/Zend/Controller/Response/Abstract.php b/libs/Zend/Controller/Response/Abstract.php
new file mode 100755
index 0000000000..dcf6bdccda
--- /dev/null
+++ b/libs/Zend/Controller/Response/Abstract.php
@@ -0,0 +1,739 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Controller_Response_Abstract
+ *
+ * Base class for Zend_Controller responses
+ *
+ * @package Zend_Controller
+ * @subpackage Response
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Controller_Response_Abstract
+{
+ /**
+ * Body content
+ * @var array
+ */
+ protected $_body = array();
+
+ /**
+ * Exception stack
+ * @var Exception
+ */
+ protected $_exceptions = array();
+
+ /**
+ * Array of headers. Each header is an array with keys 'name' and 'value'
+ * @var array
+ */
+ protected $_headers = array();
+
+ /**
+ * Array of raw headers. Each header is a single string, the entire header to emit
+ * @var array
+ */
+ protected $_headersRaw = array();
+
+ /**
+ * HTTP response code to use in headers
+ * @var int
+ */
+ protected $_httpResponseCode = 200;
+
+ /**
+ * Flag; is this response a redirect?
+ * @var boolean
+ */
+ protected $_isRedirect = false;
+
+ /**
+ * Whether or not to render exceptions; off by default
+ * @var boolean
+ */
+ protected $_renderExceptions = false;
+
+ /**
+ * Flag; if true, when header operations are called after headers have been
+ * sent, an exception will be raised; otherwise, processing will continue
+ * as normal. Defaults to true.
+ *
+ * @see canSendHeaders()
+ * @var boolean
+ */
+ public $headersSentThrowsException = true;
+
+ /**
+ * Set a header
+ *
+ * If $replace is true, replaces any headers already defined with that
+ * $name.
+ *
+ * @param string $name
+ * @param string $value
+ * @param boolean $replace
+ * @return Zend_Controller_Response_Abstract
+ */
+ public function setHeader($name, $value, $replace = false)
+ {
+ $this->canSendHeaders(true);
+ $name = (string) $name;
+ $value = (string) $value;
+
+ if ($replace) {
+ foreach ($this->_headers as $key => $header) {
+ if ($name == $header['name']) {
+ unset($this->_headers[$key]);
+ }
+ }
+ }
+
+ $this->_headers[] = array(
+ 'name' => $name,
+ 'value' => $value,
+ 'replace' => $replace
+ );
+
+ return $this;
+ }
+
+ /**
+ * Set redirect URL
+ *
+ * Sets Location header and response code. Forces replacement of any prior
+ * redirects.
+ *
+ * @param string $url
+ * @param int $code
+ * @return Zend_Controller_Response_Abstract
+ */
+ public function setRedirect($url, $code = 302)
+ {
+ $this->canSendHeaders(true);
+ $this->setHeader('Location', $url, true)
+ ->setHttpResponseCode($code);
+
+ return $this;
+ }
+
+ /**
+ * Is this a redirect?
+ *
+ * @return boolean
+ */
+ public function isRedirect()
+ {
+ return $this->_isRedirect;
+ }
+
+ /**
+ * Return array of headers; see {@link $_headers} for format
+ *
+ * @return array
+ */
+ public function getHeaders()
+ {
+ return $this->_headers;
+ }
+
+ /**
+ * Clear headers
+ *
+ * @return Zend_Controller_Response_Abstract
+ */
+ public function clearHeaders()
+ {
+ $this->_headers = array();
+
+ return $this;
+ }
+
+ /**
+ * Set raw HTTP header
+ *
+ * Allows setting non key => value headers, such as status codes
+ *
+ * @param string $value
+ * @return Zend_Controller_Response_Abstract
+ */
+ public function setRawHeader($value)
+ {
+ $this->canSendHeaders(true);
+ if ('Location' == substr($value, 0, 8)) {
+ $this->_isRedirect = true;
+ }
+ $this->_headersRaw[] = (string) $value;
+ return $this;
+ }
+
+ /**
+ * Retrieve all {@link setRawHeader() raw HTTP headers}
+ *
+ * @return array
+ */
+ public function getRawHeaders()
+ {
+ return $this->_headersRaw;
+ }
+
+ /**
+ * Clear all {@link setRawHeader() raw HTTP headers}
+ *
+ * @return Zend_Controller_Response_Abstract
+ */
+ public function clearRawHeaders()
+ {
+ $this->_headersRaw = array();
+ return $this;
+ }
+
+ /**
+ * Clear all headers, normal and raw
+ *
+ * @return Zend_Controller_Response_Abstract
+ */
+ public function clearAllHeaders()
+ {
+ return $this->clearHeaders()
+ ->clearRawHeaders();
+ }
+
+ /**
+ * Set HTTP response code to use with headers
+ *
+ * @param int $code
+ * @return Zend_Controller_Response_Abstract
+ */
+ public function setHttpResponseCode($code)
+ {
+ if (!is_int($code) || (100 > $code) || (599 < $code)) {
+ require_once 'Zend/Controller/Response/Exception.php';
+ throw new Zend_Controller_Response_Exception('Invalid HTTP response code');
+ }
+
+ if ((300 <= $code) && (307 >= $code)) {
+ $this->_isRedirect = true;
+ } else {
+ $this->_isRedirect = false;
+ }
+
+ $this->_httpResponseCode = $code;
+ return $this;
+ }
+
+ /**
+ * Retrieve HTTP response code
+ *
+ * @return int
+ */
+ public function getHttpResponseCode()
+ {
+ return $this->_httpResponseCode;
+ }
+
+ /**
+ * Can we send headers?
+ *
+ * @param boolean $throw Whether or not to throw an exception if headers have been sent; defaults to false
+ * @return boolean
+ * @throws Zend_Controller_Response_Exception
+ */
+ public function canSendHeaders($throw = false)
+ {
+ $ok = headers_sent($file, $line);
+ if ($ok && $throw && $this->headersSentThrowsException) {
+ require_once 'Zend/Controller/Response/Exception.php';
+ throw new Zend_Controller_Response_Exception('Cannot send headers; headers already sent in ' . $file . ', line ' . $line);
+ }
+
+ return !$ok;
+ }
+
+ /**
+ * Send all headers
+ *
+ * Sends any headers specified. If an {@link setHttpResponseCode() HTTP response code}
+ * has been specified, it is sent with the first header.
+ *
+ * @return Zend_Controller_Response_Abstract
+ */
+ public function sendHeaders()
+ {
+ // Only check if we can send headers if we have headers to send
+ if (count($this->_headersRaw) || count($this->_headers) || (200 != $this->_httpResponseCode)) {
+ $this->canSendHeaders(true);
+ } elseif (200 == $this->_httpResponseCode) {
+ // Haven't changed the response code, and we have no headers
+ return $this;
+ }
+
+ $httpCodeSent = false;
+
+ foreach ($this->_headersRaw as $header) {
+ if (!$httpCodeSent && $this->_httpResponseCode) {
+ header($header, true, $this->_httpResponseCode);
+ $httpCodeSent = true;
+ } else {
+ header($header);
+ }
+ }
+
+ foreach ($this->_headers as $header) {
+ if (!$httpCodeSent && $this->_httpResponseCode) {
+ header($header['name'] . ': ' . $header['value'], $header['replace'], $this->_httpResponseCode);
+ $httpCodeSent = true;
+ } else {
+ header($header['name'] . ': ' . $header['value'], $header['replace']);
+ }
+ }
+
+ if (!$httpCodeSent) {
+ header('HTTP/1.1 ' . $this->_httpResponseCode);
+ $httpCodeSent = true;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Set body content
+ *
+ * If $name is not passed, or is not a string, resets the entire body and
+ * sets the 'default' key to $content.
+ *
+ * If $name is a string, sets the named segment in the body array to
+ * $content.
+ *
+ * @param string $content
+ * @param null|string $name
+ * @return Zend_Controller_Response_Abstract
+ */
+ public function setBody($content, $name = null)
+ {
+ if ((null === $name) || !is_string($name)) {
+ $this->_body = array('default' => (string) $content);
+ } else {
+ $this->_body[$name] = (string) $content;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Append content to the body content
+ *
+ * @param string $content
+ * @param null|string $name
+ * @return Zend_Controller_Response_Abstract
+ */
+ public function appendBody($content, $name = null)
+ {
+ if ((null === $name) || !is_string($name)) {
+ if (isset($this->_body['default'])) {
+ $this->_body['default'] .= (string) $content;
+ } else {
+ return $this->append('default', $content);
+ }
+ } elseif (isset($this->_body[$name])) {
+ $this->_body[$name] .= (string) $content;
+ } else {
+ return $this->append($name, $content);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Clear body array
+ *
+ * With no arguments, clears the entire body array. Given a $name, clears
+ * just that named segment; if no segment matching $name exists, returns
+ * false to indicate an error.
+ *
+ * @param string $name Named segment to clear
+ * @return boolean
+ */
+ public function clearBody($name = null)
+ {
+ if (null !== $name) {
+ $name = (string) $name;
+ if (isset($this->_body[$name])) {
+ unset($this->_body[$name]);
+ return true;
+ }
+
+ return false;
+ }
+
+ $this->_body = array();
+ return true;
+ }
+
+ /**
+ * Return the body content
+ *
+ * If $spec is false, returns the concatenated values of the body content
+ * array. If $spec is boolean true, returns the body content array. If
+ * $spec is a string and matches a named segment, returns the contents of
+ * that segment; otherwise, returns null.
+ *
+ * @param boolean $spec
+ * @return string|array|null
+ */
+ public function getBody($spec = false)
+ {
+ if (false === $spec) {
+ ob_start();
+ $this->outputBody();
+ return ob_get_clean();
+ } elseif (true === $spec) {
+ return $this->_body;
+ } elseif (is_string($spec) && isset($this->_body[$spec])) {
+ return $this->_body[$spec];
+ }
+
+ return null;
+ }
+
+ /**
+ * Append a named body segment to the body content array
+ *
+ * If segment already exists, replaces with $content and places at end of
+ * array.
+ *
+ * @param string $name
+ * @param string $content
+ * @return Zend_Controller_Response_Abstract
+ */
+ public function append($name, $content)
+ {
+ if (!is_string($name)) {
+ require_once 'Zend/Controller/Response/Exception.php';
+ throw new Zend_Controller_Response_Exception('Invalid body segment key ("' . gettype($name) . '")');
+ }
+
+ if (isset($this->_body[$name])) {
+ unset($this->_body[$name]);
+ }
+ $this->_body[$name] = (string) $content;
+ return $this;
+ }
+
+ /**
+ * Prepend a named body segment to the body content array
+ *
+ * If segment already exists, replaces with $content and places at top of
+ * array.
+ *
+ * @param string $name
+ * @param string $content
+ * @return void
+ */
+ public function prepend($name, $content)
+ {
+ if (!is_string($name)) {
+ require_once 'Zend/Controller/Response/Exception.php';
+ throw new Zend_Controller_Response_Exception('Invalid body segment key ("' . gettype($name) . '")');
+ }
+
+ if (isset($this->_body[$name])) {
+ unset($this->_body[$name]);
+ }
+
+ $new = array($name => (string) $content);
+ $this->_body = $new + $this->_body;
+
+ return $this;
+ }
+
+ /**
+ * Insert a named segment into the body content array
+ *
+ * @param string $name
+ * @param string $content
+ * @param string $parent
+ * @param boolean $before Whether to insert the new segment before or
+ * after the parent. Defaults to false (after)
+ * @return Zend_Controller_Response_Abstract
+ */
+ public function insert($name, $content, $parent = null, $before = false)
+ {
+ if (!is_string($name)) {
+ require_once 'Zend/Controller/Response/Exception.php';
+ throw new Zend_Controller_Response_Exception('Invalid body segment key ("' . gettype($name) . '")');
+ }
+
+ if ((null !== $parent) && !is_string($parent)) {
+ require_once 'Zend/Controller/Response/Exception.php';
+ throw new Zend_Controller_Response_Exception('Invalid body segment parent key ("' . gettype($parent) . '")');
+ }
+
+ if (isset($this->_body[$name])) {
+ unset($this->_body[$name]);
+ }
+
+ if ((null === $parent) || !isset($this->_body[$parent])) {
+ return $this->append($name, $content);
+ }
+
+ $ins = array($name => (string) $content);
+ $keys = array_keys($this->_body);
+ $loc = array_search($parent, $keys);
+ if (!$before) {
+ // Increment location if not inserting before
+ ++$loc;
+ }
+
+ if (0 === $loc) {
+ // If location of key is 0, we're prepending
+ $this->_body = $ins + $this->_body;
+ } elseif ($loc >= (count($this->_body))) {
+ // If location of key is maximal, we're appending
+ $this->_body = $this->_body + $ins;
+ } else {
+ // Otherwise, insert at location specified
+ $pre = array_slice($this->_body, 0, $loc);
+ $post = array_slice($this->_body, $loc);
+ $this->_body = $pre + $ins + $post;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Echo the body segments
+ *
+ * @return void
+ */
+ public function outputBody()
+ {
+ foreach ($this->_body as $content) {
+ echo $content;
+ }
+ }
+
+ /**
+ * Register an exception with the response
+ *
+ * @param Exception $e
+ * @return Zend_Controller_Response_Abstract
+ */
+ public function setException(Exception $e)
+ {
+ $this->_exceptions[] = $e;
+ return $this;
+ }
+
+ /**
+ * Retrieve the exception stack
+ *
+ * @return array
+ */
+ public function getException()
+ {
+ return $this->_exceptions;
+ }
+
+ /**
+ * Has an exception been registered with the response?
+ *
+ * @return boolean
+ */
+ public function isException()
+ {
+ return !empty($this->_exceptions);
+ }
+
+ /**
+ * Does the response object contain an exception of a given type?
+ *
+ * @param string $type
+ * @return boolean
+ */
+ public function hasExceptionOfType($type)
+ {
+ foreach ($this->_exceptions as $e) {
+ if ($e instanceof $type) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Does the response object contain an exception with a given message?
+ *
+ * @param string $message
+ * @return boolean
+ */
+ public function hasExceptionOfMessage($message)
+ {
+ foreach ($this->_exceptions as $e) {
+ if ($message == $e->getMessage()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Does the response object contain an exception with a given code?
+ *
+ * @param int $code
+ * @return boolean
+ */
+ public function hasExceptionOfCode($code)
+ {
+ $code = (int) $code;
+ foreach ($this->_exceptions as $e) {
+ if ($code == $e->getCode()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Retrieve all exceptions of a given type
+ *
+ * @param string $type
+ * @return false|array
+ */
+ public function getExceptionByType($type)
+ {
+ $exceptions = array();
+ foreach ($this->_exceptions as $e) {
+ if ($e instanceof $type) {
+ $exceptions[] = $e;
+ }
+ }
+
+ if (empty($exceptions)) {
+ $exceptions = false;
+ }
+
+ return $exceptions;
+ }
+
+ /**
+ * Retrieve all exceptions of a given message
+ *
+ * @param string $message
+ * @return false|array
+ */
+ public function getExceptionByMessage($message)
+ {
+ $exceptions = array();
+ foreach ($this->_exceptions as $e) {
+ if ($message == $e->getMessage()) {
+ $exceptions[] = $e;
+ }
+ }
+
+ if (empty($exceptions)) {
+ $exceptions = false;
+ }
+
+ return $exceptions;
+ }
+
+ /**
+ * Retrieve all exceptions of a given code
+ *
+ * @param mixed $code
+ * @return void
+ */
+ public function getExceptionByCode($code)
+ {
+ $code = (int) $code;
+ $exceptions = array();
+ foreach ($this->_exceptions as $e) {
+ if ($code == $e->getCode()) {
+ $exceptions[] = $e;
+ }
+ }
+
+ if (empty($exceptions)) {
+ $exceptions = false;
+ }
+
+ return $exceptions;
+ }
+
+ /**
+ * Whether or not to render exceptions (off by default)
+ *
+ * If called with no arguments or a null argument, returns the value of the
+ * flag; otherwise, sets it and returns the current value.
+ *
+ * @param boolean $flag Optional
+ * @return boolean
+ */
+ public function renderExceptions($flag = null)
+ {
+ if (null !== $flag) {
+ $this->_renderExceptions = $flag ? true : false;
+ }
+
+ return $this->_renderExceptions;
+ }
+
+ /**
+ * Send the response, including all headers, rendering exceptions if so
+ * requested.
+ *
+ * @return void
+ */
+ public function sendResponse()
+ {
+ $this->sendHeaders();
+
+ if ($this->isException() && $this->renderExceptions()) {
+ $exceptions = '';
+ foreach ($this->getException() as $e) {
+ $exceptions .= $e->__toString() . "\n";
+ }
+ echo $exceptions;
+ return;
+ }
+
+ $this->outputBody();
+ }
+
+ /**
+ * Magic __toString functionality
+ *
+ * Proxies to {@link sendResponse()} and returns response value as string
+ * using output buffering.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ ob_start();
+ $this->sendResponse();
+ return ob_get_clean();
+ }
+}
diff --git a/libs/Zend/Controller/Response/Cli.php b/libs/Zend/Controller/Response/Cli.php
new file mode 100755
index 0000000000..a2feb635fe
--- /dev/null
+++ b/libs/Zend/Controller/Response/Cli.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Controller_Response_Abstract */
+require_once 'Zend/Controller/Response/Abstract.php';
+
+
+/**
+ * Zend_Controller_Response_Cli
+ *
+ * CLI response for controllers
+ *
+ * @uses Zend_Controller_Response_Abstract
+ * @package Zend_Controller
+ * @subpackage Response
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Controller_Response_Cli extends Zend_Controller_Response_Abstract
+{
+ /**
+ * Flag; if true, when header operations are called after headers have been
+ * sent, an exception will be raised; otherwise, processing will continue
+ * as normal. Defaults to false.
+ *
+ * @see canSendHeaders()
+ * @var boolean
+ */
+ public $headersSentThrowsException = false;
+
+
+ /**
+ * Magic __toString functionality
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ if ($this->isException() && $this->renderExceptions()) {
+ $exceptions = '';
+ foreach ($this->getException() as $e) {
+ $exceptions .= $e->__toString() . "\n";
+ }
+ return $exceptions;
+ }
+
+ return $this->_body;
+ }
+}
diff --git a/libs/Zend/Controller/Response/Exception.php b/libs/Zend/Controller/Response/Exception.php
new file mode 100755
index 0000000000..d76a5db13f
--- /dev/null
+++ b/libs/Zend/Controller/Response/Exception.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Controller
+ * @subpackage Request
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Controller_Exception */
+require_once 'Zend/Controller/Exception.php';
+
+
+/**
+ * @package Zend_Controller
+ * @subpackage Response
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Controller_Response_Exception extends Zend_Controller_Exception
+{}
+
diff --git a/libs/Zend/Controller/Response/Http.php b/libs/Zend/Controller/Response/Http.php
new file mode 100755
index 0000000000..61746b6c76
--- /dev/null
+++ b/libs/Zend/Controller/Response/Http.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Controller_Response_Abstract */
+require_once 'Zend/Controller/Response/Abstract.php';
+
+
+/**
+ * Zend_Controller_Response_Http
+ *
+ * HTTP response for controllers
+ *
+ * @uses Zend_Controller_Response_Abstract
+ * @package Zend_Controller
+ * @subpackage Response
+ */
+class Zend_Controller_Response_Http extends Zend_Controller_Response_Abstract
+{
+}
diff --git a/libs/Zend/Controller/Router/Abstract.php b/libs/Zend/Controller/Router/Abstract.php
new file mode 100755
index 0000000000..3bbc84e623
--- /dev/null
+++ b/libs/Zend/Controller/Router/Abstract.php
@@ -0,0 +1,184 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Controller_Router_Interface */
+require_once 'Zend/Controller/Router/Interface.php';
+
+/** Zend_Controller_Front */
+require_once 'Zend/Controller/Front.php';
+
+/** Zend_Controller_Request_Abstract */
+require_once 'Zend/Controller/Request/Abstract.php';
+
+/** Zend_Controller_Request_Http */
+require_once 'Zend/Controller/Request/Http.php';
+
+
+/**
+ * Simple first implementation of a router, to be replaced
+ * with rules-based URI processor.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Controller_Router_Abstract implements Zend_Controller_Router_Interface
+{
+ /**
+ * Front controller instance
+ * @var Zend_Controller_Front
+ */
+ protected $_frontController;
+
+ /**
+ * Array of invocation parameters to use when instantiating action
+ * controllers
+ * @var array
+ */
+ protected $_invokeParams = array();
+
+ /**
+ * Constructor
+ *
+ * @param array $params
+ * @return void
+ */
+ public function __construct(array $params = array())
+ {
+ $this->setParams($params);
+ }
+
+ /**
+ * Add or modify a parameter to use when instantiating an action controller
+ *
+ * @param string $name
+ * @param mixed $value
+ * @return Zend_Controller_Router
+ */
+ public function setParam($name, $value)
+ {
+ $name = (string) $name;
+ $this->_invokeParams[$name] = $value;
+ return $this;
+ }
+
+ /**
+ * Set parameters to pass to action controller constructors
+ *
+ * @param array $params
+ * @return Zend_Controller_Router
+ */
+ public function setParams(array $params)
+ {
+ $this->_invokeParams = array_merge($this->_invokeParams, $params);
+ return $this;
+ }
+
+ /**
+ * Retrieve a single parameter from the controller parameter stack
+ *
+ * @param string $name
+ * @return mixed
+ */
+ public function getParam($name)
+ {
+ if(isset($this->_invokeParams[$name])) {
+ return $this->_invokeParams[$name];
+ }
+
+ return null;
+ }
+
+ /**
+ * Retrieve action controller instantiation parameters
+ *
+ * @return array
+ */
+ public function getParams()
+ {
+ return $this->_invokeParams;
+ }
+
+ /**
+ * Clear the controller parameter stack
+ *
+ * By default, clears all parameters. If a parameter name is given, clears
+ * only that parameter; if an array of parameter names is provided, clears
+ * each.
+ *
+ * @param null|string|array single key or array of keys for params to clear
+ * @return Zend_Controller_Router
+ */
+ public function clearParams($name = null)
+ {
+ if (null === $name) {
+ $this->_invokeParams = array();
+ } elseif (is_string($name) && isset($this->_invokeParams[$name])) {
+ unset($this->_invokeParams[$name]);
+ } elseif (is_array($name)) {
+ foreach ($name as $key) {
+ if (is_string($key) && isset($this->_invokeParams[$key])) {
+ unset($this->_invokeParams[$key]);
+ }
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Retrieve Front Controller
+ *
+ * @return Zend_Controller_Front
+ */
+ public function getFrontController()
+ {
+ // Used cache version if found
+ if (null !== $this->_frontController) {
+ return $this->_frontController;
+ }
+
+ // Grab singleton instance, if class has been loaded
+ if (class_exists('Zend_Controller_Front')) {
+ $this->_frontController = Zend_Controller_Front::getInstance();
+ return $this->_frontController;
+ }
+
+ // Throw exception in all other cases
+ require_once 'Zend/Controller/Router/Exception.php';
+ throw new Zend_Controller_Router_Exception('Front controller class has not been loaded');
+ }
+
+ /**
+ * Set Front Controller
+ *
+ * @param Zend_Controller_Front $controller
+ * @return Zend_Controller_Router_Abstract
+ */
+ public function setFrontController(Zend_Controller_Front $controller)
+ {
+ $this->_frontController = $controller;
+ return $this;
+ }
+}
diff --git a/libs/Zend/Controller/Router/Exception.php b/libs/Zend/Controller/Router/Exception.php
new file mode 100755
index 0000000000..eb32936e37
--- /dev/null
+++ b/libs/Zend/Controller/Router/Exception.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Exception.php 2800 2007-01-16 01:36:23Z bkarwin $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Controller_Exception */
+require_once 'Zend/Controller/Exception.php';
+
+
+/**
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Controller_Router_Exception extends Zend_Controller_Exception
+{}
+
diff --git a/libs/Zend/Controller/Router/Interface.php b/libs/Zend/Controller/Router/Interface.php
new file mode 100755
index 0000000000..4b9d15d5e7
--- /dev/null
+++ b/libs/Zend/Controller/Router/Interface.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Controller_Request_Abstract */
+require_once 'Zend/Controller/Request/Abstract.php';
+
+/** Zend_Controller_Front */
+require_once 'Zend/Controller/Front.php';
+
+/**
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Controller_Router_Interface
+{
+ /**
+ * Processes a request and sets its controller and action. If
+ * no route was possible, an exception is thrown.
+ *
+ * @param Zend_Controller_Request_Abstract
+ * @throws Zend_Controller_Router_Exception
+ * @return Zend_Controller_Request_Abstract|boolean
+ */
+ public function route(Zend_Controller_Request_Abstract $dispatcher);
+
+ /**
+ * Add or modify a parameter with which to instantiate any helper objects
+ *
+ * @param string $name
+ * @param mixed $param
+ * @return Zend_Controller_Router_Interface
+ */
+ public function setParam($name, $value);
+
+ /**
+ * Set an array of a parameters to pass to helper object constructors
+ *
+ * @param array $params
+ * @return Zend_Controller_Router_Interface
+ */
+ public function setParams(array $params);
+
+ /**
+ * Retrieve a single parameter from the controller parameter stack
+ *
+ * @param string $name
+ * @return mixed
+ */
+ public function getParam($name);
+
+ /**
+ * Retrieve the parameters to pass to helper object constructors
+ *
+ * @return array
+ */
+ public function getParams();
+
+ /**
+ * Clear the controller parameter stack
+ *
+ * By default, clears all parameters. If a parameter name is given, clears
+ * only that parameter; if an array of parameter names is provided, clears
+ * each.
+ *
+ * @param null|string|array single key or array of keys for params to clear
+ * @return Zend_Controller_Router_Interface
+ */
+ public function clearParams($name = null);
+}
diff --git a/libs/Zend/Controller/Router/Rewrite.php b/libs/Zend/Controller/Router/Rewrite.php
new file mode 100755
index 0000000000..dda01aa39b
--- /dev/null
+++ b/libs/Zend/Controller/Router/Rewrite.php
@@ -0,0 +1,278 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Rewrite.php 4635 2007-05-01 12:54:13Z martel $
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/** Zend_Loader */
+require_once 'Zend/Loader.php';
+
+/** Zend_Controller_Router_Abstract */
+require_once 'Zend/Controller/Router/Abstract.php';
+
+/** Zend_Controller_Router_Route */
+require_once 'Zend/Controller/Router/Route.php';
+
+/** Zend_Controller_Router_Route_Static */
+require_once 'Zend/Controller/Router/Route/Static.php';
+
+/**
+ * Ruby routing based Router.
+ *
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ * @see http://manuals.rubyonrails.com/read/chapter/65
+ */
+class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract
+{
+ /**
+ * Whether or not to use default routes
+ * @var boolean
+ */
+ protected $_useDefaultRoutes = true;
+
+ /**
+ * Array of routes to match against
+ * @var array
+ */
+ protected $_routes = array();
+
+ /**
+ * Currently matched route
+ * @var Zend_Controller_Router_Route_Interface
+ */
+ protected $_currentRoute = null;
+
+ /**
+ * Add default routes which are used to mimic basic router behaviour
+ */
+ protected function addDefaultRoutes()
+ {
+ if (!$this->hasRoute('default')) {
+
+ $dispatcher = $this->getFrontController()->getDispatcher();
+ $request = $this->getFrontController()->getRequest();
+
+ require_once 'Zend/Controller/Router/Route/Module.php';
+ $compat = new Zend_Controller_Router_Route_Module(array(), $dispatcher, $request);
+
+ $this->_routes = array_merge(array('default' => $compat), $this->_routes);
+ }
+ }
+
+ /**
+ * Add route to the route chain
+ *
+ * @param string Name of the route
+ * @param Zend_Controller_Router_Route_Interface Route
+ */
+ public function addRoute($name, Zend_Controller_Router_Route_Interface $route) {
+ $this->_routes[$name] = $route;
+ }
+
+ /**
+ * Add routes to the route chain
+ *
+ * @param array Array of routes with names as keys and routes as values
+ */
+ public function addRoutes($routes) {
+ foreach ($routes as $name => $route) {
+ $this->addRoute($name, $route);
+ }
+ }
+
+ /**
+ * Create routes out of Zend_Config configuration
+ *
+ * Example INI:
+ * routes.archive.route = "archive/:year/*"
+ * routes.archive.defaults.controller = archive
+ * routes.archive.defaults.action = show
+ * routes.archive.defaults.year = 2000
+ * routes.archive.reqs.year = "\d+"
+ *
+ * routes.news.type = "Zend_Controller_Router_Route_Static"
+ * routes.news.route = "news"
+ * routes.news.defaults.controller = "news"
+ * routes.news.defaults.action = "list"
+ *
+ * And finally after you have created a Zend_Config with above ini:
+ * $router = new Zend_Controller_Router_Rewrite();
+ * $router->addConfig($config, 'routes');
+ *
+ * @param Zend_Config Configuration object
+ * @param string Name of the config section containing route's definitions
+ * @throws Zend_Controller_Router_Exception
+ */
+ public function addConfig(Zend_Config $config, $section)
+ {
+ if ($config->{$section} === null) {
+ throw new Zend_Controller_Router_Exception("No route configuration in section '{$section}'");
+ }
+ foreach ($config->{$section} as $name => $info) {
+
+ $class = (isset($info->type)) ? $info->type : 'Zend_Controller_Router_Route';
+ Zend_Loader::loadClass($class);
+
+ $route = call_user_func(array($class, 'getInstance'), $info);
+ $this->addRoute($name, $route);
+ }
+ }
+
+ /**
+ * Remove a route from the route chain
+ *
+ * @param string Name of the route
+ * @throws Zend_Controller_Router_Exception
+ */
+ public function removeRoute($name) {
+ if (!isset($this->_routes[$name])) {
+ throw new Zend_Controller_Router_Exception("Route $name is not defined");
+ }
+ unset($this->_routes[$name]);
+ }
+
+ /**
+ * Remove all standard default routes
+ *
+ * @param string Name of the route
+ * @param Zend_Controller_Router_Route_Interface Route
+ */
+ public function removeDefaultRoutes() {
+ $this->_useDefaultRoutes = false;
+ }
+
+ /**
+ * Check if named route exists
+ *
+ * @param string Name of the route
+ * @return boolean
+ */
+ public function hasRoute($name)
+ {
+ return isset($this->_routes[$name]);
+ }
+
+ /**
+ * Retrieve a named route
+ *
+ * @param string Name of the route
+ * @throws Zend_Controller_Router_Exception
+ * @return Zend_Controller_Router_Route_Interface Route object
+ */
+ public function getRoute($name)
+ {
+ if (!isset($this->_routes[$name])) {
+ throw new Zend_Controller_Router_Exception("Route $name is not defined");
+ }
+ return $this->_routes[$name];
+ }
+
+ /**
+ * Retrieve a currently matched route
+ *
+ * @throws Zend_Controller_Router_Exception
+ * @return Zend_Controller_Router_Route_Interface Route object
+ */
+ public function getCurrentRoute()
+ {
+ if (!isset($this->_currentRoute)) {
+ throw new Zend_Controller_Router_Exception("Current route is not defined");
+ }
+ return $this->getRoute($this->_currentRoute);
+ }
+
+ /**
+ * Retrieve a name of currently matched route
+ *
+ * @throws Zend_Controller_Router_Exception
+ * @return Zend_Controller_Router_Route_Interface Route object
+ */
+ public function getCurrentRouteName()
+ {
+ if (!isset($this->_currentRoute)) {
+ throw new Zend_Controller_Router_Exception("Current route is not defined");
+ }
+ return $this->_currentRoute;
+ }
+
+ /**
+ * Retrieve an array of routes added to the route chain
+ *
+ * @return array All of the defined routes
+ */
+ public function getRoutes()
+ {
+ return $this->_routes;
+ }
+
+ /**
+ * Find a matching route to the current PATH_INFO and inject
+ * returning values to the Request object.
+ *
+ * @throws Zend_Controller_Router_Exception
+ * @return Zend_Controller_Request_Abstract Request object
+ */
+ public function route(Zend_Controller_Request_Abstract $request)
+ {
+
+ if (!$request instanceof Zend_Controller_Request_Http) {
+ throw new Zend_Controller_Router_Exception('Zend_Controller_Router_Rewrite requires a Zend_Controller_Request_Http-based request object');
+ }
+
+ if ($this->_useDefaultRoutes) {
+ $this->addDefaultRoutes();
+ }
+
+ $pathInfo = $request->getPathInfo();
+
+ /** Find the matching route */
+ foreach (array_reverse($this->_routes) as $name => $route) {
+ if ($params = $route->match($pathInfo)) {
+ $this->_setRequestParams($request, $params);
+ $this->_currentRoute = $name;
+ break;
+ }
+ }
+
+ return $request;
+
+ }
+
+ protected function _setRequestParams($request, $params)
+ {
+ foreach ($params as $param => $value) {
+
+ $request->setParam($param, $value);
+
+ if ($param === $request->getModuleKey()) {
+ $request->setModuleName($value);
+ }
+ if ($param === $request->getControllerKey()) {
+ $request->setControllerName($value);
+ }
+ if ($param === $request->getActionKey()) {
+ $request->setActionName($value);
+ }
+
+ }
+ }
+
+}
diff --git a/libs/Zend/Controller/Router/Route.php b/libs/Zend/Controller/Router/Route.php
new file mode 100755
index 0000000000..8e9dc71d55
--- /dev/null
+++ b/libs/Zend/Controller/Router/Route.php
@@ -0,0 +1,290 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Route.php 4806 2007-05-15 18:06:12Z matthew $
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/** Zend_Controller_Router_Exception */
+require_once 'Zend/Controller/Router/Exception.php';
+
+/** Zend_Controller_Router_Route_Interface */
+require_once 'Zend/Controller/Router/Route/Interface.php';
+
+/**
+ * Route
+ *
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ * @see http://manuals.rubyonrails.com/read/chapter/65
+ */
+class Zend_Controller_Router_Route implements Zend_Controller_Router_Route_Interface
+{
+
+ protected $_urlVariable = ':';
+ protected $_urlDelimiter = '/';
+ protected $_regexDelimiter = '#';
+ protected $_defaultRegex = null;
+
+ protected $_parts;
+ protected $_defaults = array();
+ protected $_requirements = array();
+ protected $_staticCount = 0;
+ protected $_vars = array();
+ protected $_params = array();
+ protected $_values = array();
+
+ /**
+ * Instantiates route based on passed Zend_Config structure
+ */
+ public static function getInstance(Zend_Config $config)
+ {
+ $reqs = ($config->reqs instanceof Zend_Config) ? $config->reqs->toArray() : array();
+ $defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array();
+ return new self($config->route, $defs, $reqs);
+ }
+
+ /**
+ * Prepares the route for mapping by splitting (exploding) it
+ * to a corresponding atomic parts. These parts are assigned
+ * a position which is later used for matching and preparing values.
+ *
+ * @param string Map used to match with later submitted URL path
+ * @param array Defaults for map variables with keys as variable names
+ * @param array Regular expression requirements for variables (keys as variable names)
+ */
+ public function __construct($route, $defaults = array(), $reqs = array())
+ {
+
+ $route = trim($route, $this->_urlDelimiter);
+ $this->_defaults = (array) $defaults;
+ $this->_requirements = (array) $reqs;
+
+ if ($route != '') {
+
+ foreach (explode($this->_urlDelimiter, $route) as $pos => $part) {
+
+ if (substr($part, 0, 1) == $this->_urlVariable) {
+ $name = substr($part, 1);
+ $regex = (isset($reqs[$name]) ? $reqs[$name] : $this->_defaultRegex);
+ $this->_parts[$pos] = array('name' => $name, 'regex' => $regex);
+ $this->_vars[] = $name;
+ } else {
+ $this->_parts[$pos] = array('regex' => $part);
+ if ($part != '*') {
+ $this->_staticCount++;
+ }
+ }
+
+ }
+
+ }
+
+ }
+
+ protected function _getWildcardData($parts, $unique)
+ {
+ $pos = count($parts);
+ if ($pos % 2) {
+ $parts[] = null;
+ }
+ foreach(array_chunk($parts, 2) as $part) {
+ list($var, $value) = $part;
+ $var = urldecode($var);
+ if (!array_key_exists($var, $unique)) {
+ $this->_params[$var] = urldecode($value);
+ $unique[$var] = true;
+ }
+ }
+ }
+
+ /**
+ * Matches a user submitted path with parts defined by a map. Assigns and
+ * returns an array of variables on a successful match.
+ *
+ * @param string Path used to match against this routing map
+ * @return array|false An array of assigned values or a false on a mismatch
+ */
+ public function match($path)
+ {
+
+ $pathStaticCount = 0;
+ $defaults = $this->_defaults;
+
+ if (count($defaults)) {
+ $unique = array_combine(array_keys($defaults), array_fill(0, count($defaults), true));
+ } else {
+ $unique = array();
+ }
+
+ $path = trim($path, $this->_urlDelimiter);
+
+ if ($path != '') {
+
+ $path = explode($this->_urlDelimiter, $path);
+
+ foreach ($path as $pos => $pathPart) {
+
+ if (!isset($this->_parts[$pos])) {
+ return false;
+ }
+
+ if ($this->_parts[$pos]['regex'] == '*') {
+ $parts = array_slice($path, $pos);
+ $this->_getWildcardData($parts, $unique);
+ break;
+ }
+
+ $part = $this->_parts[$pos];
+ $name = isset($part['name']) ? $part['name'] : null;
+ $pathPart = urldecode($pathPart);
+
+ if ($name === null) {
+ if ($part['regex'] != $pathPart) {
+ return false;
+ }
+ } elseif ($part['regex'] === null) {
+ if (strlen($pathPart) == 0) {
+ return false;
+ }
+ } else {
+ $regex = $this->_regexDelimiter . '^' . $part['regex'] . '$' . $this->_regexDelimiter . 'iu';
+ if (!preg_match($regex, $pathPart)) {
+ return false;
+ }
+ }
+
+ if ($name !== null) {
+ // It's a variable. Setting a value
+ $this->_values[$name] = $pathPart;
+ $unique[$name] = true;
+ } else {
+ $pathStaticCount++;
+ }
+
+ }
+
+ }
+
+ $return = $this->_values + $this->_params + $this->_defaults;
+
+ // Check if all static mappings have been met
+ if ($this->_staticCount != $pathStaticCount) {
+ return false;
+ }
+
+ // Check if all map variables have been initialized
+ foreach ($this->_vars as $var) {
+ if (!array_key_exists($var, $return)) {
+ return false;
+ }
+ }
+
+ return $return;
+
+ }
+
+ /**
+ * Assembles user submitted parameters forming a URL path defined by this route
+ *
+ * @param array $data An array of variable and value pairs used as parameters
+ * @param boolean $reset Whether or not to set route defaults with those provided in $data
+ * @return string Route path with user submitted parameters
+ */
+ public function assemble($data = array(), $reset = false)
+ {
+
+ $url = array();
+ $flag = false;
+
+ foreach ($this->_parts as $key => $part) {
+
+ $resetPart = false;
+ if (isset($part['name']) && array_key_exists($part['name'], $data) && $data[$part['name']] === null) {
+ $resetPart = true;
+ }
+
+ if (isset($part['name'])) {
+
+ if (isset($data[$part['name']]) && !$resetPart) {
+ $url[$key] = $data[$part['name']];
+ unset($data[$part['name']]);
+ } elseif (!$reset && !$resetPart && isset($this->_values[$part['name']])) {
+ $url[$key] = $this->_values[$part['name']];
+ } elseif (!$reset && !$resetPart && isset($this->_params[$part['name']])) {
+ $url[$key] = $this->_params[$part['name']];
+ } elseif (isset($this->_defaults[$part['name']])) {
+ $url[$key] = $this->_defaults[$part['name']];
+ } else
+ throw new Zend_Controller_Router_Exception($part['name'] . ' is not specified');
+
+ } else {
+
+ if ($part['regex'] != '*') {
+ $url[$key] = $part['regex'];
+ } else {
+ if (!$reset) $data += $this->_params;
+ foreach ($data as $var => $value) {
+ if ($value !== null) {
+ $url[$var] = $var . $this->_urlDelimiter . $value;
+ $flag = true;
+ }
+ }
+ }
+
+ }
+
+ }
+
+ $return = '';
+
+ foreach (array_reverse($url, true) as $key => $value) {
+ if ($flag || !isset($this->_parts[$key]['name']) || $value !== $this->getDefault($this->_parts[$key]['name'])) {
+ $return = '/' . $value . $return;
+ $flag = true;
+ }
+ }
+
+ return trim($return, '/');
+
+ }
+
+ /**
+ * Return a single parameter of route's defaults
+ *
+ * @param name Array key of the parameter
+ * @return string Previously set default
+ */
+ public function getDefault($name) {
+ if (isset($this->_defaults[$name])) {
+ return $this->_defaults[$name];
+ }
+ return null;
+ }
+
+ /**
+ * Return an array of defaults
+ *
+ * @return array Route defaults
+ */
+ public function getDefaults() {
+ return $this->_defaults;
+ }
+
+}
diff --git a/libs/Zend/Controller/Router/Route/Interface.php b/libs/Zend/Controller/Router/Route/Interface.php
new file mode 100755
index 0000000000..2858f51286
--- /dev/null
+++ b/libs/Zend/Controller/Router/Route/Interface.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Interface.php 3745 2007-03-05 22:14:04Z martel $
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/** Zend_Controller_Router_Exception */
+require_once 'Zend/Controller/Router/Exception.php';
+
+
+/**
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+interface Zend_Controller_Router_Route_Interface {
+ public function match($path);
+ public function assemble($data = array());
+ public static function getInstance(Zend_Config $config);
+}
+
diff --git a/libs/Zend/Controller/Router/Route/Module.php b/libs/Zend/Controller/Router/Route/Module.php
new file mode 100755
index 0000000000..4b0059bbbb
--- /dev/null
+++ b/libs/Zend/Controller/Router/Route/Module.php
@@ -0,0 +1,239 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Module.php 5017 2007-05-27 15:01:58Z martel $
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/** Zend_Controller_Router_Exception */
+require_once 'Zend/Controller/Router/Exception.php';
+
+/** Zend_Controller_Router_Route_Interface */
+require_once 'Zend/Controller/Router/Route/Interface.php';
+
+/**
+ * Module Route
+ *
+ * Default route for module functionality
+ *
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ * @see http://manuals.rubyonrails.com/read/chapter/65
+ */
+class Zend_Controller_Router_Route_Module implements Zend_Controller_Router_Route_Interface
+{
+ /**
+ * @const string URI delimiter
+ */
+ const URI_DELIMITER = '/';
+
+ /**
+ * Default values for the route (ie. module, controller, action, params)
+ * @var array
+ */
+ protected $_defaults;
+
+ protected $_values = array();
+ protected $_moduleValid = false;
+ protected $_keysSet = false;
+
+ /**#@+
+ * Array keys to use for module, controller, and action. Should be taken out of request.
+ * @var string
+ */
+ protected $_moduleKey = 'module';
+ protected $_controllerKey = 'controller';
+ protected $_actionKey = 'action';
+ /**#@-*/
+
+ /**
+ * @var Zend_Controller_Dispatcher_Interface
+ */
+ protected $_dispatcher;
+
+ /**
+ * @var Zend_Controller_Request_Abstract
+ */
+ protected $_request;
+
+ /**
+ * Instantiates route based on passed Zend_Config structure
+ */
+ public static function getInstance(Zend_Config $config)
+ {
+ $defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array();
+ return new self($defs);
+ }
+
+ /**
+ * Constructor
+ *
+ * @param array Defaults for map variables with keys as variable names
+ * @param Zend_Controller_Dispatcher_Interface Dispatcher object
+ * @param Zend_Controller_Request_Abstract Request object
+ */
+ public function __construct(array $defaults = array(),
+ Zend_Controller_Dispatcher_Interface $dispatcher = null,
+ Zend_Controller_Request_Abstract $request = null)
+ {
+ $this->_defaults = $defaults;
+
+ if (isset($request)) {
+ $this->_request = $request;
+ }
+
+ if (isset($dispatcher)) {
+ $this->_dispatcher = $dispatcher;
+ }
+ }
+
+ /**
+ * Set request keys based on values in request object
+ *
+ * @return void
+ */
+ protected function _setRequestKeys()
+ {
+ if (null !== $this->_request) {
+ $this->_moduleKey = $this->_request->getModuleKey();
+ $this->_controllerKey = $this->_request->getControllerKey();
+ $this->_actionKey = $this->_request->getActionKey();
+ }
+
+ if (null !== $this->_dispatcher) {
+ $this->_defaults += array(
+ $this->_controllerKey => $this->_dispatcher->getDefaultControllerName(),
+ $this->_actionKey => $this->_dispatcher->getDefaultAction(),
+ $this->_moduleKey => $this->_dispatcher->getDefaultModule()
+ );
+ }
+
+ $this->_keysSet = true;
+ }
+
+ /**
+ * Matches a user submitted path. Assigns and returns an array of variables
+ * on a successful match.
+ *
+ * If a request object is registered, it uses its setModuleName(),
+ * setControllerName(), and setActionName() accessors to set those values.
+ * Always returns the values as an array.
+ *
+ * @param string Path used to match against this routing map
+ * @return array An array of assigned values or a false on a mismatch
+ */
+ public function match($path)
+ {
+ $this->_setRequestKeys();
+
+ $values = array();
+ $params = array();
+ $path = trim($path, self::URI_DELIMITER);
+
+ if ($path != '') {
+
+ $path = explode(self::URI_DELIMITER, $path);
+
+ if ($this->_dispatcher && $this->_dispatcher->isValidModule($path[0])) {
+ $values[$this->_moduleKey] = array_shift($path);
+ $this->_moduleValid = true;
+ }
+
+ if (count($path) && !empty($path[0])) {
+ $values[$this->_controllerKey] = array_shift($path);
+ }
+
+ if (count($path) && !empty($path[0])) {
+ $values[$this->_actionKey] = array_shift($path);
+ }
+
+ if ($numSegs = count($path)) {
+ for ($i = 0; $i < $numSegs; $i = $i + 2) {
+ $key = urldecode($path[$i]);
+ $val = isset($path[$i + 1]) ? urldecode($path[$i + 1]) : null;
+ $params[$key] = $val;
+ }
+ }
+ }
+
+ $this->_values = $values + $params;
+
+ return $this->_values + $this->_defaults;
+ }
+
+ /**
+ * Assembles user submitted parameters forming a URL path defined by this route
+ *
+ * @param array An array of variable and value pairs used as parameters
+ * @return string Route path with user submitted parameters
+ */
+ public function assemble($data = array(), $reset = false)
+ {
+ if (!$this->_keysSet) {
+ $this->_setRequestKeys();
+ }
+
+ $params = (!$reset) ? $this->_values : array();
+
+ foreach ($data as $key => $value) {
+ if ($value !== null) {
+ $params[$key] = $value;
+ } elseif (isset($params[$key])) {
+ unset($params[$key]);
+ }
+ }
+
+ $params += $this->_defaults;
+
+ $url = '';
+
+ if ($this->_moduleValid || array_key_exists($this->_moduleKey, $data)) {
+ if ($params[$this->_moduleKey] != $this->_defaults[$this->_moduleKey]) {
+ $module = $params[$this->_moduleKey];
+ }
+ }
+ unset($params[$this->_moduleKey]);
+
+ $controller = $params[$this->_controllerKey];
+ unset($params[$this->_controllerKey]);
+
+ $action = $params[$this->_actionKey];
+ unset($params[$this->_actionKey]);
+
+ foreach ($params as $key => $value) {
+ $url .= '/' . $key;
+ $url .= '/' . $value;
+ }
+
+ if (!empty($url) || $action !== $this->_defaults[$this->_actionKey]) {
+ $url = '/' . $action . $url;
+ }
+
+ if (!empty($url) || $controller !== $this->_defaults[$this->_controllerKey]) {
+ $url = '/' . $controller . $url;
+ }
+
+ if (isset($module)) {
+ $url = '/' . $module . $url;
+ }
+
+ return ltrim($url, self::URI_DELIMITER);
+ }
+
+}
diff --git a/libs/Zend/Controller/Router/Route/Regex.php b/libs/Zend/Controller/Router/Route/Regex.php
new file mode 100755
index 0000000000..986f900618
--- /dev/null
+++ b/libs/Zend/Controller/Router/Route/Regex.php
@@ -0,0 +1,185 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id$
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/** Zend_Controller_Router_Route_Interface */
+require_once 'Zend/Controller/Router/Route/Interface.php';
+
+/**
+ * Regex Route
+ *
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Controller_Router_Route_Regex implements Zend_Controller_Router_Route_Interface
+{
+ protected $_regex = null;
+ protected $_defaults = array();
+ protected $_reverse = null;
+
+ protected $_values = array();
+
+ /**
+ * Instantiates route based on passed Zend_Config structure
+ */
+ public static function getInstance(Zend_Config $config)
+ {
+ $defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array();
+ $map = ($config->map instanceof Zend_Config) ? $config->map->toArray() : array();
+ $reverse = (isset($config->reverse)) ? $config->reverse : null;
+ return new self($config->route, $defs, $map, $reverse);
+ }
+
+ public function __construct($route, $defaults = array(), $map = array(), $reverse = null)
+ {
+ $this->_regex = '#^' . $route . '$#i';
+ $this->_defaults = (array) $defaults;
+ $this->_map = (array) $map;
+ $this->_reverse = $reverse;
+ }
+
+ /**
+ * Matches a user submitted path with a previously defined route.
+ * Assigns and returns an array of defaults on a successful match.
+ *
+ * @param string Path used to match against this routing map
+ * @return array|false An array of assigned values or a false on a mismatch
+ */
+ public function match($path)
+ {
+ $path = trim(urldecode($path), '/');
+ $res = preg_match($this->_regex, $path, $values);
+
+ if ($res === 0) return false;
+
+ // array_filter_key()? Why isn't this in a standard PHP function set yet? :)
+ foreach ($values as $i => $value) {
+ if (!is_int($i) || $i === 0) {
+ unset($values[$i]);
+ }
+ }
+
+ $this->_values = $values;
+
+ $values = $this->_getMappedValues($values);
+ $defaults = $this->_getMappedValues($this->_defaults, false, true);
+
+ $return = $values + $defaults;
+
+ return $return;
+ }
+
+ /**
+ * Maps numerically indexed array values to it's associative mapped counterpart.
+ * Or vice versa. Uses user provided map array which consists of index => name
+ * parameter mapping. If map is not found, it returns original array.
+ *
+ * Method strips destination type of keys form source array. Ie. if source array is
+ * indexed numerically then every associative key will be stripped. Vice versa if reversed
+ * is set to true.
+ *
+ * @param array Indexed or associative array of values to map
+ * @param boolean False means translation of index to association. True means reverse.
+ * @param boolean Should wrong type of keys be preserved or stripped.
+ * @return array An array of mapped values
+ */
+ protected function _getMappedValues($values, $reversed = false, $preserve = false)
+ {
+ if (count($this->_map) == 0) {
+ return $values;
+ }
+
+ $return = array();
+
+ foreach ($values as $key => $value) {
+ if (is_int($key) && !$reversed) {
+ if (array_key_exists($key, $this->_map)) {
+ $index = $this->_map[$key];
+ } elseif (false === ($index = array_search($key, $this->_map))) {
+ $index = $key;
+ }
+ $return[$index] = $values[$key];
+ } elseif ($reversed) {
+ $index = (!is_int($key)) ? array_search($key, $this->_map, true) : $key;
+ if (false !== $index) {
+ $return[$index] = $values[$key];
+ }
+ } elseif ($preserve) {
+ $return[$key] = $value;
+ }
+ }
+
+ return $return;
+ }
+
+ /**
+ * Assembles a URL path defined by this route
+ *
+ * @param array An array of name (or index) and value pairs used as parameters
+ * @return string Route path with user submitted parameters
+ */
+ public function assemble($data = array())
+ {
+ if ($this->_reverse === null) {
+ require_once 'Zend/Controller/Router/Exception.php';
+ throw new Zend_Controller_Router_Exception('Cannot assemble. Reversed route is not specified.');
+ }
+
+ $data = $this->_getMappedValues($data, true, false);
+ $data += $this->_getMappedValues($this->_defaults, true, false);
+ $data += $this->_values;
+
+ ksort($data);
+
+ $return = @vsprintf($this->_reverse, $data);
+
+ if ($return === false) {
+ require_once 'Zend/Controller/Router/Exception.php';
+ throw new Zend_Controller_Router_Exception('Cannot assemble. Too few arguments?');
+ }
+
+ return $return;
+
+ }
+
+ /**
+ * Return a single parameter of route's defaults
+ *
+ * @param name Array key of the parameter
+ * @return string Previously set default
+ */
+ public function getDefault($name) {
+ if (isset($this->_defaults[$name])) {
+ return $this->_defaults[$name];
+ }
+ }
+
+ /**
+ * Return an array of defaults
+ *
+ * @return array Route defaults
+ */
+ public function getDefaults() {
+ return $this->_defaults;
+ }
+
+}
diff --git a/libs/Zend/Controller/Router/Route/Static.php b/libs/Zend/Controller/Router/Route/Static.php
new file mode 100755
index 0000000000..7cd0fde381
--- /dev/null
+++ b/libs/Zend/Controller/Router/Route/Static.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Route.php 1847 2006-11-23 11:36:41Z martel $
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/** Zend_Controller_Router_Route_Interface */
+require_once 'Zend/Controller/Router/Route/Interface.php';
+
+/**
+ * StaticRoute is used for managing static URIs.
+ *
+ * It's a lot faster compared to the standard Route implementation.
+ *
+ * @package Zend_Controller
+ * @subpackage Router
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Controller_Router_Route_Static implements Zend_Controller_Router_Route_Interface
+{
+
+ protected $_route = null;
+ protected $_defaults = array();
+
+ /**
+ * Instantiates route based on passed Zend_Config structure
+ */
+ public static function getInstance(Zend_Config $config)
+ {
+ $defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array();
+ return new self($config->route, $defs);
+ }
+
+ /**
+ * Prepares the route for mapping.
+ *
+ * @param string Map used to match with later submitted URL path
+ * @param array Defaults for map variables with keys as variable names
+ */
+ public function __construct($route, $defaults = array())
+ {
+ $this->_route = trim($route, '/');
+ $this->_defaults = (array) $defaults;
+ }
+
+ /**
+ * Matches a user submitted path with a previously defined route.
+ * Assigns and returns an array of defaults on a successful match.
+ *
+ * @param string Path used to match against this routing map
+ * @return array|false An array of assigned values or a false on a mismatch
+ */
+ public function match($path)
+ {
+ if (trim($path, '/') == $this->_route) {
+ return $this->_defaults;
+ }
+ return false;
+ }
+
+ /**
+ * Assembles a URL path defined by this route
+ *
+ * @param array An array of variable and value pairs used as parameters
+ * @return string Route path with user submitted parameters
+ */
+ public function assemble($data = array())
+ {
+ return $this->_route;
+ }
+
+ /**
+ * Return a single parameter of route's defaults
+ *
+ * @param name Array key of the parameter
+ * @return string Previously set default
+ */
+ public function getDefault($name) {
+ if (isset($this->_defaults[$name])) {
+ return $this->_defaults[$name];
+ }
+ return null;
+ }
+
+ /**
+ * Return an array of defaults
+ *
+ * @return array Route defaults
+ */
+ public function getDefaults() {
+ return $this->_defaults;
+ }
+
+}
diff --git a/libs/Zend/Controller/TODO.txt b/libs/Zend/Controller/TODO.txt
new file mode 100755
index 0000000000..a37661211c
--- /dev/null
+++ b/libs/Zend/Controller/TODO.txt
@@ -0,0 +1,2 @@
+Post 0.6 Items:
+- Detect recursion in Controller_Front
diff --git a/libs/Zend/Date.php b/libs/Zend/Date.php
new file mode 100755
index 0000000000..1dad57ef4e
--- /dev/null
+++ b/libs/Zend/Date.php
@@ -0,0 +1,4460 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Date
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Date.php 4902 2007-05-23 19:07:16Z thomas $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Include needed Date classes
+ */
+require_once 'Zend/Date/DateObject.php';
+require_once 'Zend/Date/Exception.php';
+require_once 'Zend/Locale.php';
+require_once 'Zend/Locale/Math.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Date
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Date extends Zend_Date_DateObject {
+
+ private $_Locale = null;
+
+ // Fractional second variables
+ private $_Fractional = 0;
+ private $_Precision = 3;
+
+ private static $_Options = array(
+ 'format_type' => 'iso', // format for date strings 'iso' or 'php'
+ 'fix_dst' => true, // fix dst on summer/winter time change
+ 'extend_month' => false // false - addMonth like SQL, true like excel
+ );
+
+ // Class wide Date Constants
+ // day formats
+ const DAY = 'DAY'; // d - 2 digit day of month, 01-31
+ const DAY_SHORT = 'DAY_SHORT'; // j - 1,2 digit day of month, 1-31
+
+ const DAY_SUFFIX = 'DAY_SUFFIX'; // S - english suffix day of month, st-th
+ const DAY_OF_YEAR = 'DAY_OF_YEAR'; // z - Number of day of year
+
+ const WEEKDAY = 'WEEKDAY'; // l - full day name - locale aware, Monday - Sunday
+ const WEEKDAY_SHORT = 'WEEKDAY_SHORT'; // D - 3 letter day of week - locale aware, Mon-Sun
+ const WEEKDAY_NARROW = 'WEEKDAY_NARROW'; // --- 1 letter day name - locale aware, M-S
+ const WEEKDAY_NAME = 'WEEKDAY_NAME'; // --- 2 letter day name - locale aware,Mo-Su
+
+ const WEEKDAY_8601 = 'WEEKDAY_8601'; // N - digit weekday ISO 8601, 1-7 1 = monday, 7=sunday
+ const WEEKDAY_DIGIT = 'WEEKDAY_DIGIT'; // w - weekday, 0-6 0=sunday, 6=saturday
+
+ // week formats
+ const WEEK = 'WEEK'; // W - number of week ISO8601, 1-53
+
+ // month formats
+ const MONTH = 'MONTH'; // m - 2 digit month, 01-12
+ const MONTH_SHORT = 'MONTH_SHORT'; // n - 1 digit month, no leading zeros, 1-12
+
+ const MONTH_DAYS = 'MONTH_DAYS'; // t - Number of days this month
+
+ const MONTH_NAME = 'MONTH_NAME'; // F - full month name - locale aware, January-December
+ const MONTH_NAME_SHORT = 'MONTH_NAME_SHORT'; // M - 3 letter monthname - locale aware, Jan-Dec
+ const MONTH_NAME_NARROW = 'MONTH_NAME_NARROW'; // --- 1 letter month name - locale aware, J-D
+
+ // year formats
+ const YEAR = 'YEAR'; // Y - 4 digit year
+ const YEAR_SHORT = 'YEAR_SHORT'; // y - 2 digit year, leading zeros 00-99
+
+ const YEAR_8601 = 'YEAR_8601'; // o - number of year ISO8601
+ const YEAR_SHORT_8601= 'YEAR_SHORT_8601';// --- 2 digit number of year ISO8601
+
+ const LEAPYEAR = 'LEAPYEAR'; // L - is leapyear ?, 0-1
+
+ // time formats
+ const MERIDIEM = 'MERIDIEM'; // A,a - AM/PM - locale aware, AM/PM
+ const SWATCH = 'SWATCH'; // B - Swatch Internet Time
+
+ const HOUR = 'HOUR'; // H - 2 digit hour, leading zeros, 00-23
+ const HOUR_SHORT = 'HOUR_SHORT'; // G - 1 digit hour, no leading zero, 0-23
+
+ const HOUR_AM = 'HOUR_AM'; // h - 2 digit hour, leading zeros, 01-12 am/pm
+ const HOUR_SHORT_AM = 'HOUR_SHORT_AM'; // g - 1 digit hour, no leading zero, 1-12 am/pm
+
+ const MINUTE = 'MINUTE'; // i - 2 digit minute, leading zeros, 00-59
+ const MINUTE_SHORT = 'MINUTE_SHORT'; // --- 1 digit minute, no leading zero, 0-59
+
+ const SECOND = 'SECOND'; // s - 2 digit second, leading zeros, 00-59
+ const SECOND_SHORT = 'SECOND_SHORT'; // --- 1 digit second, no leading zero, 0-59
+
+ const MILLISECOND = 'MILLISECOND'; // --- milliseconds
+
+ // timezone formats
+ const TIMEZONE_NAME = 'TIMEZONE_NAME'; // e - timezone string
+ const DAYLIGHT = 'DAYLIGHT'; // I - is Daylight saving time ?, 0-1
+ const GMT_DIFF = 'GMT_DIFF'; // O - GMT difference, -1200 +1200
+ const GMT_DIFF_SEP = 'GMT_DIFF_SEP'; // P - seperated GMT diff, -12:00 +12:00
+ const TIMEZONE = 'TIMEZONE'; // T - timezone, EST, GMT, MDT
+ const TIMEZONE_SECS = 'TIMEZONE_SECS'; // Z - timezone offset in seconds, -43200 +43200
+
+ // date strings
+ const ISO_8601 = 'ISO_8601'; // c - ISO 8601 date string
+ const RFC_2822 = 'RFC_2822'; // r - RFC 2822 date string
+ const TIMESTAMP = 'TIMESTAMP'; // U - unix timestamp
+
+ // additional formats
+ const ERA = 'ERA'; // --- short name of era, locale aware,
+ const ERA_NAME = 'ERA_NAME'; // --- full name of era, locale aware,
+ const DATES = 'DATES'; // --- standard date, locale aware
+ const DATE_FULL = 'DATE_FULL'; // --- full date, locale aware
+ const DATE_LONG = 'DATE_LONG'; // --- long date, locale aware
+ const DATE_MEDIUM = 'DATE_MEDIUM'; // --- medium date, locale aware
+ const DATE_SHORT = 'DATE_SHORT'; // --- short date, locale aware
+ const TIMES = 'TIMES'; // --- standard time, locale aware
+ const TIME_FULL = 'TIME_FULL'; // --- full time, locale aware
+ const TIME_LONG = 'TIME_LONG'; // --- long time, locale aware
+ const TIME_MEDIUM = 'TIME_MEDIUM'; // --- medium time, locale aware
+ const TIME_SHORT = 'TIME_SHORT'; // --- short time, locale aware
+ const ATOM = 'ATOM'; // --- DATE_ATOM
+ const COOKIE = 'COOKIE'; // --- DATE_COOKIE
+ const RFC_822 = 'RFC_822'; // --- DATE_RFC822
+ const RFC_850 = 'RFC_850'; // --- DATE_RFC850
+ const RFC_1036 = 'RFC_1036'; // --- DATE_RFC1036
+ const RFC_1123 = 'RFC_1123'; // --- DATE_RFC1123
+ const RFC_3339 = 'RFC_3339'; // --- DATE_RFC3339
+ const RSS = 'RSS'; // --- DATE_RSS
+ const W3C = 'W3C'; // --- DATE_W3C
+
+
+ /**
+ * Generates the standard date object, could be a unix timestamp, localized date,
+ * string, integer and so on. Also parts of dates or time are supported
+ * Always set the default timezone: http://php.net/date_default_timezone_set
+ * For example, in your bootstrap: date_default_timezone_set('America/Los_Angeles');
+ * For detailed instructions please look in the docu.
+ *
+ * @param string|integer|Zend_Date $date OPTIONAL Date value or value of date part to set
+ ,depending on $part. If null the actual time is set
+ * @param string $part OPTIONAL Defines the input format of $date
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ * @throws Zend_Date_Exception
+ */
+ public function __construct($date = null, $part = null, $locale = null)
+ {
+ if (Zend_Locale::isLocale($date)) {
+ $locale = $date;
+ $date = null;
+ $part = null;
+ } else if (Zend_Locale::isLocale($part)) {
+ $locale = $part;
+ $part = null;
+ }
+
+ $this->setLocale($locale);
+
+ // set the timezone and offset for $this
+ $zone = @date_default_timezone_get();
+ if ($zone !== 'UTC') {
+ $this->setTimezone($zone);
+ }
+
+ if (is_string($date) && defined("self::".$date)) {
+ $part = $date;
+ $date = null;
+ }
+
+ if (is_null($date)) {
+ $date = Zend_Date::now();
+ if (($part !== null) && ($part !== Zend_Date::TIMESTAMP)) {
+ $date = $date->get($part);
+ }
+ }
+
+ if (($date instanceof Zend_TimeSync_Ntp) or
+ ($date instanceof Zend_TimeSync_Sntp)) {
+ $date = $date->getInfo();
+ $date = $this->_getTime($date['offset']);
+ $part = null;
+ }
+
+ // set datepart
+ if (($part !== null && $part !== Zend_Date::TIMESTAMP) or (!is_numeric($date))) {
+ $this->setUnixTimestamp(0);
+ $this->set($date, $part, $this->_Locale);
+ } else {
+ $this->setUnixTimestamp($date);
+ }
+ }
+
+
+ /**
+ * Sets class wide options, if no option was given, the actual set options will be returned
+ *
+ * @param array $options Options to set
+ * @throws Zend_Date_Exception
+ * @return Options array if no option was given
+ */
+ public static function setOptions(array $options = array())
+ {
+ if (empty($options)) {
+ return self::$_Options;
+ }
+ foreach ($options as $name => $value) {
+ $name = strtolower($name);
+
+ if (isset(self::$_Options[$name])) {
+ switch($name) {
+ case 'format_type' :
+ if ((strtolower($value) != 'php') && (strtolower($value) != 'iso')) {
+ throw new Zend_Date_Exception("Unknown format type ($value) for dates, only 'iso' and 'php' supported", $value);
+ }
+ break;
+ case 'fix_dst' :
+ if (!is_bool($value)) {
+ throw new Zend_Date_Exception("'fix_dst' has to be boolean", $value);
+ }
+ break;
+ case 'extend_month' :
+ if (!is_bool($value)) {
+ throw new Zend_Date_Exception("'extend_month' has to be boolean", $value);
+ }
+ break;
+ }
+ self::$_Options[$name] = $value;
+ }
+ else {
+ throw new Zend_Date_Exception("Unknown option: $name = $value");
+ }
+ }
+ }
+
+
+ /**
+ * Returns this object's internal UNIX timestamp (equivalent to Zend_Date::TIMESTAMP).
+ * If the timestamp is too large for integers, then the return value will be a string.
+ * This function does not return the timestamp as an object.
+ * Use clone() or copyPart() instead.
+ *
+ * @return integer|string UNIX timestamp
+ */
+ public function getTimestamp()
+ {
+ return $this->getUnixTimestamp();
+ }
+
+
+ /**
+ * Returns the calculated timestamp
+ * HINT: timestamps are always GMT
+ *
+ * @param string $calc Type of calculation to make
+ * @param string|integer|Zend_Date $stamp Timestamp to calculate, when null the actual timestamp is calculated
+ * @return Zend_Date|integer
+ * @throws Zend_Date_Exception
+ */
+ private function _timestamp($calc, $stamp)
+ {
+ if ($stamp instanceof Zend_Date) {
+ // extract timestamp from object
+ $stamp = $stamp->get(Zend_Date::TIMESTAMP, true);
+ }
+
+ if ($calc === 'set') {
+ $return = $this->setUnixTimestamp($stamp);
+ } else {
+ $return = $this->_calcdetail($calc, $stamp, Zend_Date::TIMESTAMP, null);
+ }
+ if ($calc != 'cmp') {
+ return $this;
+ }
+ return $return;
+ }
+
+
+ /**
+ * Sets a new timestamp
+ *
+ * @param integer|string|Zend_Date $timestamp Timestamp to set
+ * @return Zend_Date
+ * @throws Zend_Date_Exception
+ */
+ public function setTimestamp($timestamp)
+ {
+ return $this->_timestamp('set', $timestamp);
+ }
+
+
+ /**
+ * Adds a timestamp
+ *
+ * @param integer|string $timestamp Timestamp to add
+ * @return Zend_Date
+ * @throws Zend_Date_Exception
+ */
+ public function addTimestamp($timestamp)
+ {
+ return $this->_timestamp('add', $timestamp);
+ }
+
+
+ /**
+ * Subtracts a timestamp
+ *
+ * @param integer|string $timestamp Timestamp to sub
+ * @return Zend_Date
+ * @throws Zend_Date_Exception
+ */
+ public function subTimestamp($timestamp)
+ {
+ return $this->_timestamp('sub', $timestamp);
+ }
+
+
+ /**
+ * Compares two timestamps, returning the difference as integer
+ *
+ * @param integer|string $timestamp Timestamp to compare
+ * @return integer 0 = equal, 1 = later, -1 = earlier
+ * @throws Zend_Date_Exception
+ */
+ public function compareTimestamp($timestamp)
+ {
+ return $this->_timestamp('cmp', $timestamp);
+ }
+
+
+ /**
+ * Returns a string representation of the object
+ * Supported format tokens are:
+ * G - era, y - year, Y - ISO year, M - month, w - week of year, D - day of year, d - day of month
+ * E - day of week, e - number of weekday (1-7), h - hour 1-12, H - hour 0-23, m - minute, s - second
+ * A - milliseconds of day, z - timezone, Z - timezone offset, S - fractional second, a - period of day
+ *
+ * Additionally format tokens but non ISO conform are:
+ * SS - day suffix, eee - php number of weekday(0-6), ddd - number of days per month
+ * l - Leap year, B - swatch internet time, I - daylight saving time, X - timezone offset in seconds
+ * r - RFC2822 format, U - unix timestamp
+ *
+ * Not supported ISO tokens are
+ * u - extended year, Q - quarter, q - quarter, L - stand alone month, W - week of month
+ * F - day of week of month, g - modified julian, c - stand alone weekday, k - hour 0-11, K - hour 1-24
+ * v - wall zone
+ *
+ * @param string $format OPTIONAL Rule for formatting output. If null the default date format is used
+ * @param string $type OPTIONAL Type for the format string which overrides the standard setting
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return string
+ */
+ public function toString($format = null, $type = null, $locale = null)
+ {
+ if (Zend_Locale::isLocale($format)) {
+ $locale = $format;
+ $format = null;
+ }
+
+ if (Zend_Locale::isLocale($type)) {
+ $locale = $type;
+ $type = null;
+ }
+
+ if ($locale === null) {
+ $locale = $this->getLocale();
+ }
+
+ if ($format === null) {
+ $format = Zend_Locale_Format::getDateFormat($locale) . ' ' . Zend_Locale_Format::getTimeFormat($locale);
+ } else if (((self::$_Options['format_type'] == 'php') && ($type === null)) or ($type == 'php')) {
+ $format = Zend_Locale_Format::convertPhpToIsoFormat($format);
+ }
+
+ // get format tokens
+ $j = 0;
+ $comment = false;
+ $output = array();
+ for($i = 0; $i < strlen($format); ++$i) {
+
+ if ($format[$i] == "'") {
+ if ($comment == false) {
+ $comment = true;
+ ++$j;
+ $output[$j] = "'";
+ } else if (isset($format[$i+1]) and ($format[$i+1] == "'")) {
+ $output[$j] .= "'";
+ ++$i;
+ } else {
+ $comment = false;
+ }
+ continue;
+ }
+
+ if (isset($output[$j]) and ($output[$j][0] == $format[$i]) or
+ ($comment == true)) {
+ $output[$j] .= $format[$i];
+ } else {
+ ++$j;
+ $output[$j] = $format[$i];
+ }
+ }
+
+ $notset = false;
+ // fill format tokens with date information
+ for($i = 1; $i <= count($output); ++$i) {
+ // fill fixed tokens
+ switch ($output[$i]) {
+
+ // special formats
+ case 'SS' :
+ $output[$i] = $this->date('S', $this->getUnixTimestamp(), false);
+ break;
+
+ case 'eee' :
+ $output[$i] = $this->date('N', $this->getUnixTimestamp(), false);
+ break;
+
+ case 'ddd' :
+ $output[$i] = $this->date('t', $this->getUnixTimestamp(), false);
+ break;
+
+ case 'l' :
+ $output[$i] = $this->date('L', $this->getUnixTimestamp(), false);
+ break;
+
+ case 'B' :
+ $output[$i] = $this->date('B', $this->getUnixTimestamp(), false);
+ break;
+
+ case 'I' :
+ $output[$i] = $this->date('I', $this->getUnixTimestamp(), false);
+ break;
+
+ case 'X' :
+ $output[$i] = $this->date('Z', $this->getUnixTimestamp(), false);
+ break;
+
+ case 'r' :
+ $output[$i] = $this->date('r', $this->getUnixTimestamp(), false);
+ break;
+
+ case 'U' :
+ $output[$i] = $this->getUnixTimestamp();
+ break;
+
+
+ // eras
+ case 'GGGGG' :
+ $output[$i] = substr($this->get(Zend_Date::ERA, $locale), 0, 1) . ".";
+ break;
+
+ case 'GGGG' :
+ $output[$i] = $this->get(Zend_Date::ERA_NAME, $locale);
+ break;
+
+ case 'GGG' :
+ case 'GG' :
+ case 'G' :
+ $output[$i] = $this->get(Zend_Date::ERA, $locale);
+ break;
+
+
+ // years
+ case 'yy' :
+ $output[$i] = $this->get(Zend_Date::YEAR_SHORT, $locale);
+ break;
+
+
+ // ISO years
+ case 'YY' :
+ $output[$i] = $this->get(Zend_Date::YEAR_SHORT_8601, $locale);
+ break;
+
+
+ // months
+ case 'MMMMM' :
+ $output[$i] = substr($this->get(Zend_Date::MONTH_NAME_NARROW, $locale), 0, 1);
+ break;
+
+ case 'MMMM' :
+ $output[$i] = $this->get(Zend_Date::MONTH_NAME, $locale);
+ break;
+
+ case 'MMM' :
+ $output[$i] = $this->get(Zend_Date::MONTH_NAME_SHORT, $locale);
+ break;
+
+ case 'MM' :
+ $output[$i] = $this->get(Zend_Date::MONTH, $locale);
+ break;
+
+ case 'M' :
+ $output[$i] = $this->get(Zend_Date::MONTH_SHORT, $locale);
+ break;
+
+
+ // week
+ case 'ww' :
+ $output[$i] = str_pad($this->get(Zend_Date::WEEK, $locale), 2, '0', STR_PAD_LEFT);
+ break;
+
+ case 'w' :
+ $output[$i] = $this->get(Zend_Date::WEEK, $locale);
+ break;
+
+
+ // monthday
+ case 'dd' :
+ $output[$i] = $this->get(Zend_Date::DAY, $locale);
+ break;
+
+ case 'd' :
+ $output[$i] = $this->get(Zend_Date::DAY_SHORT, $locale);
+ break;
+
+
+ // yearday
+ case 'DDD' :
+ $output[$i] = str_pad($this->get(Zend_Date::DAY_OF_YEAR, $locale), 3, '0', STR_PAD_LEFT);
+ break;
+
+ case 'DD' :
+ $output[$i] = str_pad($this->get(Zend_Date::DAY_OF_YEAR, $locale), 2, '0', STR_PAD_LEFT);
+ break;
+
+ case 'D' :
+ $output[$i] = $this->get(Zend_Date::DAY_OF_YEAR, $locale);
+ break;
+
+
+ // weekday
+ case 'EEEEE' :
+ $output[$i] = $this->get(Zend_Date::WEEKDAY_NARROW, $locale);
+ break;
+
+ case 'EEEE' :
+ $output[$i] = $this->get(Zend_Date::WEEKDAY, $locale);
+ break;
+
+ case 'EEE' :
+ $output[$i] = $this->get(Zend_Date::WEEKDAY_SHORT, $locale);
+ break;
+
+ case 'EE' :
+ $output[$i] = $this->get(Zend_Date::WEEKDAY_NAME, $locale);
+ break;
+
+ case 'E' :
+ $output[$i] = $this->get(Zend_Date::WEEKDAY_NARROW, $locale);
+ break;
+
+
+ // weekday number
+ case 'ee' :
+ $output[$i] = str_pad($this->get(Zend_Date::WEEKDAY_8601, $locale), 2, '0', STR_PAD_LEFT);
+ break;
+
+ case 'e' :
+ $output[$i] = $this->get(Zend_Date::WEEKDAY_8601, $locale);
+ break;
+
+
+ // period
+ case 'a' :
+ $output[$i] = $this->get(Zend_Date::MERIDIEM, $locale);
+ break;
+
+
+ // hour
+ case 'hh' :
+ $output[$i] = $this->get(Zend_Date::HOUR_AM, $locale);
+ break;
+
+ case 'h' :
+ $output[$i] = $this->get(Zend_Date::HOUR_SHORT_AM, $locale);
+ break;
+
+ case 'HH' :
+ $output[$i] = $this->get(Zend_Date::HOUR, $locale);
+ break;
+
+ case 'H' :
+ $output[$i] = $this->get(Zend_Date::HOUR_SHORT, $locale);
+ break;
+
+
+ // minute
+ case 'mm' :
+ $output[$i] = $this->get(Zend_Date::MINUTE, $locale);
+ break;
+
+ case 'm' :
+ $output[$i] = $this->get(Zend_Date::MINUTE_SHORT, $locale);
+ break;
+
+
+ // second
+ case 'ss' :
+ $output[$i] = $this->get(Zend_Date::SECOND, $locale);
+ break;
+
+ case 's' :
+ $output[$i] = $this->get(Zend_Date::SECOND_SHORT, $locale);
+ break;
+
+ case 'S' :
+ $output[$i] = $this->get(Zend_Date::MILLISECOND, $locale);
+ break;
+
+
+ // zone
+ case 'zzzz' :
+ $output[$i] = $this->get(Zend_Date::TIMEZONE_NAME, $locale);
+ break;
+
+ case 'zzz' :
+ case 'zz' :
+ case 'z' :
+ $output[$i] = $this->get(Zend_Date::TIMEZONE, $locale);
+ break;
+
+
+ // zone offset
+ case 'ZZZZ' :
+ $output[$i] = $this->get(Zend_Date::GMT_DIFF_SEP, $locale);
+ break;
+
+ case 'ZZZ' :
+ case 'ZZ' :
+ case 'Z' :
+ $output[$i] = $this->get(Zend_Date::GMT_DIFF, $locale);
+ break;
+
+ default :
+ $notset = true;
+ break;
+ }
+
+ // fill variable tokens
+ if ($notset == true) {
+ if (($output[$i][0] !== "'") and (preg_match('/y+/', $output[$i]))) {
+ $length = strlen($output[$i]);
+ $output[$i] = $this->get(Zend_Date::YEAR, $locale);
+ $output[$i] = str_pad($output[$i], $length, '0', STR_PAD_LEFT);
+ }
+
+ if (($output[$i][0] !== "'") and (preg_match('/Y+/', $output[$i]))) {
+ $length = strlen($output[$i]);
+ $output[$i] = $this->get(Zend_Date::YEAR_8601, $locale);
+ $output[$i] = str_pad($output[$i], $length, '0', STR_PAD_LEFT);
+ }
+
+ if (($output[$i][0] !== "'") and (preg_match('/A+/', $output[$i]))) {
+ $length = strlen($output[$i]);
+ $seconds = $this->get(Zend_Date::TIMESTAMP, $locale);
+ $month = $this->get(Zend_Date::MONTH_SHORT, $locale);
+ $day = $this->get(Zend_Date::DAY_SHORT, $locale);
+ $year = $this->get(Zend_Date::YEAR, $locale);
+
+ $seconds -= $this->mktime(0, 0, 0, $month, $day, $year, false);
+ $output[$i] = str_pad($seconds, $length, '0', STR_PAD_LEFT);
+ }
+
+ if ($output[$i][0] === "'") {
+ $output[$i] = substr($output[$i], 1);
+ }
+ }
+ $notset = false;
+ }
+
+ return implode('', $output);
+ }
+
+
+ /**
+ * Returns a string representation of the date which is equal with the timestamp
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->toString(null, $this->_Locale);
+ }
+
+
+ /**
+ * Returns a integer representation of the object
+ * But returns false when the given part is no value f.e. Month-Name
+ *
+ * @param string|integer|Zend_Date $part OPTIONAL Defines the date or datepart to return as integer
+ * @return integer|false
+ */
+ public function toValue($part = null)
+ {
+ $result = $this->get($part);
+ if (is_numeric($result)) {
+ return intval("$result");
+ } else {
+ return false;
+ }
+ }
+
+
+ /**
+ * Returns a representation of a date or datepart
+ * This could be for example a localized monthname, the time without date,
+ * the era or only the fractional seconds. There are about 50 different supported date parts.
+ * For a complete list of supported datepart values look into the docu
+ *
+ * @param string $part OPTIONAL Part of the date to return, if null the timestamp is returned
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer|string date or datepart
+ */
+ public function get($part = null, $locale = null)
+ {
+ if ($locale === null) {
+ $locale = $this->getLocale();
+ }
+
+ if (Zend_Locale::isLocale($part)) {
+ $locale = $part;
+ $part = null;
+ }
+
+ if ($part === null) {
+ $part = Zend_Date::TIMESTAMP;
+ }
+
+ if (!defined("self::".$part)) {
+ return $this->toString($part, $locale);
+ }
+
+ switch($part) {
+
+ // day formats
+ case Zend_Date::DAY :
+ return $this->date('d', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::WEEKDAY_SHORT :
+ $weekday = strtolower($this->date('D', $this->getUnixTimestamp(), false));
+ $day = Zend_Locale_Data::getContent($locale, 'day', array('gregorian', 'format', 'wide', $weekday));
+ return substr($day[$weekday], 0, 3);
+ break;
+
+ case Zend_Date::DAY_SHORT :
+ return $this->date('j', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::WEEKDAY :
+ $weekday = strtolower($this->date('D', $this->getUnixTimestamp(), false));
+ $day = Zend_Locale_Data::getContent($locale, 'day', array('gregorian', 'format', 'wide', $weekday));
+ return $day[$weekday];
+ break;
+
+ case Zend_Date::WEEKDAY_8601 :
+ return $this->date('N', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::DAY_SUFFIX :
+ return $this->date('S', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::WEEKDAY_DIGIT :
+ return $this->date('w', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::DAY_OF_YEAR :
+ return $this->date('z', $this->getUnixTimestamp(), false);
+ break;
+
+
+ case Zend_Date::WEEKDAY_NARROW :
+ $weekday = strtolower($this->date('D', $this->getUnixTimestamp(), false));
+ $day = Zend_Locale_Data::getContent($locale, 'day', array('gregorian', 'format', 'abbreviated', $weekday));
+ return substr($day[$weekday], 0, 1);
+ break;
+
+ case Zend_Date::WEEKDAY_NAME :
+ $weekday = strtolower($this->date('D', $this->getUnixTimestamp(), false));
+ $day = Zend_Locale_Data::getContent($locale, 'day', array('gregorian', 'format', 'abbreviated', $weekday));
+ return $day[$weekday];
+ break;
+
+
+ // week formats
+ case Zend_Date::WEEK :
+ return $this->date('W', $this->getUnixTimestamp(), false);
+ break;
+
+
+ // month formats
+ case Zend_Date::MONTH_NAME :
+ $month = $this->date('n', $this->getUnixTimestamp(), false);
+ $mon = Zend_Locale_Data::getContent($locale, 'month', array('gregorian', 'format', 'wide', $month));
+ return $mon[$month];
+ break;
+
+ case Zend_Date::MONTH :
+ return $this->date('m', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::MONTH_NAME_SHORT :
+ $month = $this->date('n', $this->getUnixTimestamp(), false);
+ $mon = Zend_Locale_Data::getContent($locale, 'month', array('gregorian', 'format', 'abbreviated', $month));
+ return $mon[$month];
+ break;
+
+ case Zend_Date::MONTH_SHORT :
+ return $this->date('n', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::MONTH_DAYS :
+ return $this->date('t', $this->getUnixTimestamp(), false);
+ break;
+
+
+ case Zend_Date::MONTH_NAME_NARROW :
+ $month = $this->date('n', $this->getUnixTimestamp(), false);
+ $mon = Zend_Locale_Data::getContent($locale, 'month', array('gregorian', 'format', 'abbreviated', $month));
+ return substr($mon[$month], 0, 1);
+ break;
+
+
+ // year formats
+ case Zend_Date::LEAPYEAR :
+ return $this->date('L', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::YEAR_8601 :
+ return $this->date('o', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::YEAR :
+ return $this->date('Y', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::YEAR_SHORT :
+ return $this->date('y', $this->getUnixTimestamp(), false);
+ break;
+
+
+ case Zend_Date::YEAR_SHORT_8601 :
+ $year = $this->date('o', $this->getUnixTimestamp(), false);
+ return substr($year, -2);
+ break;
+
+
+ // time formats
+ case Zend_Date::MERIDIEM :
+ $am = $this->date('a', $this->getUnixTimestamp(), false);
+ $amlocal = Zend_Locale_Data::getContent($locale, 'daytime', 'gregorian');
+ return $amlocal[$am];
+ break;
+
+ case Zend_Date::SWATCH :
+ return $this->date('B', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::HOUR_SHORT_AM :
+ return $this->date('g', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::HOUR_SHORT :
+ return $this->date('G', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::HOUR_AM :
+ return $this->date('h', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::HOUR :
+ return $this->date('H', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::MINUTE :
+ return $this->date('i', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::SECOND :
+ return $this->date('s', $this->getUnixTimestamp(), false);
+ break;
+
+
+ case Zend_Date::MINUTE_SHORT :
+ return $this->date('i', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::SECOND_SHORT :
+ return $this->date('s', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::MILLISECOND :
+ return $this->_Fractional;
+ break;
+
+
+ // timezone formats
+ case Zend_Date::TIMEZONE_NAME :
+ return $this->date('e', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::DAYLIGHT :
+ return $this->date('I', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::GMT_DIFF :
+ return $this->date('O', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::GMT_DIFF_SEP :
+ return $this->date('P', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::TIMEZONE :
+ return $this->date('T', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::TIMEZONE_SECS :
+ return $this->date('Z', $this->getUnixTimestamp(), false);
+ break;
+
+
+ // date strings
+ case Zend_Date::ISO_8601 :
+ return $this->date('c', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::RFC_2822 :
+ return $this->date('r', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::TIMESTAMP :
+ return $this->getUnixTimestamp();
+ break;
+
+
+ // additional formats
+ case Zend_Date::ERA :
+ $year = $this->date('Y', $this->getUnixTimestamp(), false);
+ if ($year < 0) {
+ $era = Zend_Locale_Data::getContent($locale, 'erashort', array('gregorian', '0'));
+ return $era['0'];
+ }
+ $era = Zend_Locale_Data::getContent($locale, 'erashort', array('gregorian', '1'));
+ return $era['1'];
+ break;
+
+ case Zend_Date::ERA_NAME :
+ $year = $this->date('Y', $this->getUnixTimestamp(), false);
+ if ($year < 0) {
+ $era = Zend_Locale_Data::getContent($locale, 'era', array('gregorian', '0'));
+ return $era['0'];
+ }
+ $era = Zend_Locale_Data::getContent($locale, 'era', array('gregorian', '1'));
+ if (!isset($era['1'])) {
+ return false;
+ }
+ return $era['1'];
+ break;
+
+ case Zend_Date::DATES :
+ return $this->toString(Zend_Locale_Format::getDateFormat($locale), 'iso', $locale);
+ break;
+
+ case Zend_Date::DATE_FULL :
+ $date = Zend_Locale_Data::getContent($locale, 'dateformat', array('gregorian', 'full'));
+ return $this->toString($date['pattern'], 'iso', $locale);
+ break;
+
+ case Zend_Date::DATE_LONG :
+ $date = Zend_Locale_Data::getContent($locale, 'dateformat', array('gregorian', 'long'));
+ return $this->toString($date['pattern'], 'iso', $locale);
+ break;
+
+ case Zend_Date::DATE_MEDIUM :
+ $date = Zend_Locale_Data::getContent($locale, 'dateformat', array('gregorian', 'medium'));
+ return $this->toString($date['pattern'], 'iso', $locale);
+ break;
+
+ case Zend_Date::DATE_SHORT :
+ $date = Zend_Locale_Data::getContent($locale, 'dateformat', array('gregorian', 'short'));
+ return $this->toString($date['pattern'], 'iso', $locale);
+ break;
+
+ case Zend_Date::TIMES :
+ return $this->toString(Zend_Locale_Format::getTimeFormat($locale), 'iso', $locale);
+ break;
+
+ case Zend_Date::TIME_FULL :
+ $time = Zend_Locale_Data::getContent($locale, 'timeformat', array('gregorian', 'full'));
+ return $this->toString($time['pattern'], 'iso', $locale);
+ break;
+
+ case Zend_Date::TIME_LONG :
+ $time = Zend_Locale_Data::getContent($locale, 'timeformat', array('gregorian', 'long'));
+ return $this->toString($time['pattern'], 'iso', $locale);
+ break;
+
+ case Zend_Date::TIME_MEDIUM :
+ $time = Zend_Locale_Data::getContent($locale, 'timeformat', array('gregorian', 'medium'));
+ return $this->toString($time['pattern'], 'iso', $locale);
+ break;
+
+ case Zend_Date::TIME_SHORT :
+ $time = Zend_Locale_Data::getContent($locale, 'timeformat', array('gregorian', 'short'));
+ return $this->toString($time['pattern'], 'iso', $locale);
+ break;
+
+ case Zend_Date::ATOM :
+ return $this->date('Y\-m\-d\TH\:i\:sP', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::COOKIE :
+ return $this->date('l\, d\-M\-y H\:i\:s e', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::RFC_822 :
+ return $this->date('D\, d M y H\:i\:s O', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::RFC_850 :
+ return $this->date('l\, d\-M\-y H\:i\:s e', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::RFC_1036 :
+ return $this->date('D\, d M y H\:i\:s O', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::RFC_1123 :
+ return $this->date('D\, d M Y H\:i\:s O', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::RFC_3339 :
+ return $this->date('Y\-m\-d\TH\:i\:sP', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::RSS :
+ return $this->date('D\, d M Y H\:i\:s O', $this->getUnixTimestamp(), false);
+ break;
+
+ case Zend_Date::W3C :
+ return $this->date('Y\-m\-d\TH\:i\:sP', $this->getUnixTimestamp(), false);
+ break;
+ }
+ }
+
+
+ /**
+ * Return digit from standard names (english)
+ * Faster implementation than locale aware searching
+ */
+ private function getDigitFromName($name)
+ {
+ switch($name) {
+ case "Jan":
+ return 1;
+
+ case "Feb":
+ return 2;
+
+ case "Mar":
+ return 3;
+
+ case "Apr":
+ return 4;
+
+ case "May":
+ return 5;
+
+ case "Jun":
+ return 6;
+
+ case "Jul":
+ return 7;
+
+ case "Aug":
+ return 8;
+
+ case "Sep":
+ return 9;
+
+ case "Oct":
+ return 10;
+
+ case "Nov":
+ return 11;
+
+ case "Dec":
+ return 12;
+
+ default:
+ throw new Zend_Date_Exception('Month ($name) is not a known month');
+ }
+ }
+
+
+ /**
+ * Sets the given date as new date or a given datepart as new datepart returning the new datepart
+ * This could be for example a localized dayname, the date without time,
+ * the month or only the seconds. There are about 50 different supported date parts.
+ * For a complete list of supported datepart values look into the docu
+ *
+ * @param string|integer|Zend_Date $date Date or datepart to set
+ * @param string $part OPTIONAL Part of the date to set, if null the timestamp is set
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer|string new datepart
+ * @throws Zend_Date_Exception
+ */
+ public function set($date, $part = null, $locale = null)
+ {
+ $result = $this->_calculate('set', $date, $part, $locale);
+ return $result;
+ }
+
+
+ /**
+ * Adds a date or datepart to the existing date, by extracting $part from $date,
+ * and modifying this object by adding that part. The $part is then extracted from
+ * this object and returned as an integer or numeric string (for large values, or $part's
+ * corresponding to pre-defined formatted date strings).
+ * This could be for example a ISO 8601 date, the hour the monthname or only the minute.
+ * There are about 50 different supported date parts.
+ * For a complete list of supported datepart values look into the docu.
+ *
+ * @param string|integer|Zend_Date $date Date or datepart to add
+ * @param string $part OPTIONAL Part of the date to add, if null the timestamp is added
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer|string new datepart
+ * @throws Zend_Date_Exception
+ */
+ public function add($date, $part = null, $locale = null)
+ {
+ $this->_calculate('add', $date, $part, $locale);
+ $result = $this->get($part, $locale);
+
+ return $result;
+ }
+
+
+ /**
+ * Subtracts a date from another date.
+ * This could be for example a RFC2822 date, the time,
+ * the year or only the timestamp. There are about 50 different supported date parts.
+ * For a complete list of supported datepart values look into the docu
+ * Be aware: Adding -2 Months is not equal to Subtracting 2 Months !!!
+ *
+ * @param string|integer|Zend_Date $date Date or datepart to subtract
+ * @param string $part OPTIONAL Part of the date to sub, if null the timestamp is subtracted
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer|string new datepart
+ * @throws Zend_Date_Exception
+ */
+ public function sub($date, $part = null, $locale = null)
+ {
+ $this->_calculate('sub', $date, $part, $locale);
+ $result = $this->get($part, $locale);
+
+ return $result;
+ }
+
+
+ /**
+ * Compares a date or datepart with the existing one.
+ * Returns -1 if earlier, 0 if equal and 1 if later.
+ *
+ * @param string|integer|Zend_Date $date Date or datepart to compare with the date object
+ * @param string $part OPTIONAL Part of the date to compare, if null the timestamp is subtracted
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer 0 = equal, 1 = later, -1 = earlier
+ * @throws Zend_Date_Exception
+ */
+ public function compare($date, $part = null, $locale = null)
+ {
+ $compare = $this->_calculate('cmp', $date, $part, $locale);
+
+ if ($compare > 0) {
+ return 1;
+ } else if ($compare < 0) {
+ return -1;
+ }
+ return 0;
+ }
+
+
+ /**
+ * Returns a new instance of Zend_Date with the selected part copied.
+ * To make an exact copy, use PHP's clone keyword.
+ * For a complete list of supported date part values look into the docu.
+ * If a date part is copied, all other date parts are set to standard values.
+ * For example: If only YEAR is copied, the returned date object is equal to
+ * 01-01-YEAR 00:00:00 (01-01-1970 00:00:00 is equal to timestamp 0)
+ * If only HOUR is copied, the returned date object is equal to
+ * 01-01-1970 HOUR:00:00 (so $this contains a timestamp equal to a timestamp of 0 plus HOUR).
+ *
+ * @param string $part Part of the date to compare, if null the timestamp is subtracted
+ * @param string|Zend_Locale $locale OPTIONAL New object's locale. No adjustments to timezone are made.
+ * @return Zend_Date
+ */
+ public function copyPart($part, $locale = null)
+ {
+ $clone = clone $this; // copy all instance variables
+ $clone->setUnixTimestamp(0); // except the timestamp
+ if ($locale != null) {
+ $clone->setLocale($locale); // set an other locale if selected
+ }
+ $clone->set($this, $part);
+ return $clone;
+ }
+
+
+ /**
+ * Calculates the date or object
+ *
+ * @param string $calc Calculation to make
+ * @param string|integer $date Date for calculation
+ * @param string|integer $comp Second date for calculation
+ * @param boolean|integer $dst Use dst correction if option is set
+ * @return integer|string|Zend_Date new timestamp or Zend_Date depending on calculation
+ */
+ private function _assign($calc, $date, $comp = 0, $dst = false)
+ {
+ switch ($calc) {
+ case 'set' :
+ if (!empty($comp)) {
+ $this->setUnixTimestamp(call_user_func(Zend_Locale_Math::$sub, $this->getUnixTimestamp(), $comp));
+ }
+ $this->setUnixTimestamp(call_user_func(Zend_Locale_Math::$add, $this->getUnixTimestamp(), $date));
+ $value = $this->getUnixTimestamp();
+ break;
+ case 'add' :
+ $this->setUnixTimestamp(call_user_func(Zend_Locale_Math::$add, $this->getUnixTimestamp(), $date));
+ $value = $this->getUnixTimestamp();
+ break;
+ case 'sub' :
+ $this->setUnixTimestamp(call_user_func(Zend_Locale_Math::$sub, $this->getUnixTimestamp(), $date));
+ $value = $this->getUnixTimestamp();
+ break;
+ default :
+ // cmp - compare
+ return call_user_func(Zend_Locale_Math::$comp, $comp, $date);
+ break;
+ }
+
+ // dst-correction if 'fix_dst' = true and dst !== false
+ if ((self::$_Options['fix_dst'] === true) and ($dst !== false)) {
+ $hour = $this->get(Zend_Date::HOUR);
+ if ($hour != $dst) {
+ if (($dst == ($hour + 1)) or ($dst == ($hour - 23))) {
+ $value += 3600;
+ } else if (($dst == ($hour - 1)) or ($dst == ($hour + 23))) {
+ $value -= 3600;
+ }
+ $this->setUnixTimestamp($value);
+ }
+ }
+ return $this->getUnixTimestamp();
+ }
+
+
+ /**
+ * Calculates the date or object
+ *
+ * @param string $calc Calculation to make, one of: 'add'|'sub'|'cmp'|'copy'|'set'
+ * @param string|integer|Zend_Date $date Date or datepart to calculate with
+ * @param string $part Part of the date to calculate, if null the timestamp is used
+ * @param string|Zend_Locale $locale Locale for parsing input
+ * @return integer|string|Zend_Date new timestamp
+ * @throws Zend_Date_Exception
+ */
+ private function _calculate($calc, $date, $part, $locale)
+ {
+ if (is_null($date)) {
+ throw new Zend_Date_Exception('parameter $date must be set, null is not allowed');
+ }
+
+ if (Zend_Locale::isLocale($part)) {
+ $locale = $part;
+ $part = null;
+ }
+
+ if ($locale === null) {
+ $locale = $this->getLocale();
+ }
+
+ if ($locale instanceof Zend_Locale) {
+ $locale = $locale->toString();
+ }
+
+ // create date parts
+ $year = $this->get(Zend_Date::YEAR);
+ $month = $this->get(Zend_Date::MONTH_SHORT);
+ $day = $this->get(Zend_Date::DAY_SHORT);
+ $hour = $this->get(Zend_Date::HOUR_SHORT);
+ $minute = $this->get(Zend_Date::MINUTE_SHORT);
+ $second = $this->get(Zend_Date::SECOND_SHORT);
+ // if object extract value
+ if ($date instanceof Zend_Date) {
+
+ $date = $date->get($part, $locale);
+ }
+
+ // $date as object, part of foreign date as own date
+ switch($part) {
+
+ // day formats
+ case Zend_Date::DAY :
+ if (is_numeric($date)) {
+ return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + intval($date), 1970, true),
+ $this->mktime(0, 0, 0, 1, 1 + intval($day), 1970, true), $hour);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, day expected", $date);
+ break;
+
+ case Zend_Date::WEEKDAY_SHORT :
+ $daylist = Zend_Locale_Data::getContent($locale, 'daylist', array('gregorian', 'format', 'wide'));
+ $weekday = (int) $this->get(Zend_Date::WEEKDAY_DIGIT, $locale);
+ $cnt = 0;
+
+ foreach ($daylist as $key => $value) {
+ if (strtoupper(substr($value, 0, 3)) == strtoupper($date)) {
+ $found = $cnt;
+ break;
+ }
+ ++$cnt;
+ }
+
+ // Weekday found
+ if ($cnt < 7) {
+ return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + $found, 1970, true),
+ $this->mktime(0, 0, 0, 1, 1 + $weekday, 1970, true), $hour);
+ }
+
+ // Weekday not found
+ throw new Zend_Date_Exception("invalid date ($date) operand, weekday expected", $date);
+ break;
+
+ case Zend_Date::DAY_SHORT :
+ if (is_numeric($date)) {
+ return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + intval($date), 1970, true),
+ $this->mktime(0, 0, 0, 1, 1 + intval($day), 1970, true), $hour);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, day expected", $date);
+ break;
+
+ case Zend_Date::WEEKDAY :
+ $daylist = Zend_Locale_Data::getContent($locale, 'daylist', array('gregorian', 'format', 'wide'));
+ $weekday = (int) $this->get(Zend_Date::WEEKDAY_DIGIT, $locale);
+ $cnt = 0;
+
+ foreach ($daylist as $key => $value) {
+ if (strtoupper($value) == strtoupper($date)) {
+ $found = $cnt;
+ break;
+ }
+ ++$cnt;
+ }
+
+ // Weekday found
+ if ($cnt < 7) {
+ return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + $found, 1970, true),
+ $this->mktime(0, 0, 0, 1, 1 + $weekday, 1970, true), $hour);
+ }
+
+ // Weekday not found
+ throw new Zend_Date_Exception("invalid date ($date) operand, weekday expected", $date);
+ break;
+
+ case Zend_Date::WEEKDAY_8601 :
+ $weekday = (int) $this->get(Zend_Date::WEEKDAY_DIGIT, $locale);
+ if ((intval($date) > 0) and (intval($date) < 8)) {
+ return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + intval($date), 1970, true),
+ $this->mktime(0, 0, 0, 1, 1 + $weekday, 1970, true), $hour);
+ }
+
+ // Weekday not found
+ throw new Zend_Date_Exception("invalid date ($date) operand, weekday expected", $date);
+ break;
+
+ case Zend_Date::DAY_SUFFIX :
+ throw new Zend_Date_Exception('day suffix not supported', $date);
+ break;
+
+ case Zend_Date::WEEKDAY_DIGIT :
+ $weekday = (int) $this->get(Zend_Date::WEEKDAY_DIGIT, $locale);
+ if ((intval($date) > 0) and (intval($date) < 8)) {
+ return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + $date, 1970, true),
+ $this->mktime(0, 0, 0, 1, 1 + $weekday, 1970, true), $hour);
+ }
+
+ // Weekday not found
+ throw new Zend_Date_Exception("invalid date ($date) operand, weekday expected", $date);
+ break;
+
+ case Zend_Date::DAY_OF_YEAR :
+ if (is_numeric($date)) {
+ return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + $date, 1970, true),
+ $this->mktime(0, 0, 0, $month, 1 + $day, 1970, true), $hour);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, day expected", $date);
+ break;
+
+ case Zend_Date::WEEKDAY_NARROW :
+ $daylist = Zend_Locale_Data::getContent($locale, 'daylist', array('gregorian', 'format', 'abbreviated'));
+ $weekday = (int) $this->get(Zend_Date::WEEKDAY_DIGIT, $locale);
+ $cnt = 0;
+ foreach ($daylist as $key => $value) {
+ if (strtoupper(substr($value, 0, 1)) == strtoupper($date)) {
+ $found = $cnt;
+ break;
+ }
+ ++$cnt;
+ }
+
+ // Weekday found
+ if ($cnt < 7) {
+ return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + $found, 1970, true),
+ $this->mktime(0, 0, 0, 1, 1 + $weekday, 1970, true), $hour);
+ }
+
+ // Weekday not found
+ throw new Zend_Date_Exception("invalid date ($date) operand, weekday expected", $date);
+ break;
+
+ case Zend_Date::WEEKDAY_NAME :
+ $daylist = Zend_Locale_Data::getContent($locale, 'daylist', array('gregorian', 'format', 'abbreviated'));
+ $weekday = (int) $this->get(Zend_Date::WEEKDAY_DIGIT, $locale);
+ $cnt = 0;
+ foreach ($daylist as $key => $value) {
+ if (strtoupper($value) == strtoupper($date)) {
+ $found = $cnt;
+ break;
+ }
+ ++$cnt;
+ }
+
+ // Weekday found
+ if ($cnt < 7) {
+ return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + $found, 1970, true),
+ $this->mktime(0, 0, 0, 1, 1 + $weekday, 1970, true), $hour);
+ }
+
+ // Weekday not found
+ throw new Zend_Date_Exception("invalid date ($date) operand, weekday expected", $date);
+ break;
+
+
+ // week formats
+ case Zend_Date::WEEK :
+ if (is_numeric($date)) {
+ $week = (int) $this->get(Zend_Date::WEEK, $locale);
+ return $this->_assign($calc, parent::mktime(0, 0, 0, 1, 1 + ($date * 7), 1970, true),
+ parent::mktime(0, 0, 0, 1, 1 + ($week * 7), 1970, true), $hour);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, week expected", $date);
+ break;
+
+
+ // month formats
+ case Zend_Date::MONTH_NAME :
+ $monthlist = Zend_Locale_Data::getContent($locale, 'monthlist', array('gregorian', 'format', 'wide'));
+ $cnt = 0;
+ foreach ($monthlist as $key => $value) {
+ if (strtoupper($value) == strtoupper($date)) {
+ $found = $key;
+ break;
+ }
+ ++$cnt;
+ }
+ $date = array_search($date, $monthlist);
+
+ // Monthname found
+ if ($cnt < 12) {
+ $fixday = 0;
+ if ($calc == 'add') {
+ $date += $found;
+ $calc = 'set';
+ if (self::$_Options['extend_month'] == false) {
+ $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false));
+ if ($parts['mday'] != $day) {
+ $fixday -= $parts['mday'];
+ }
+ }
+ } else if ($calc == 'sub') {
+ $date = $month - $found;
+ $calc = 'set';
+ if (self::$_Options['extend_month'] == false) {
+ $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false));
+ if ($parts['mday'] != $day) {
+ $fixday -= $parts['mday'];
+ }
+ }
+ }
+ return $this->_assign($calc, $this->mktime(0, 0, 0, $date, $day + $fixday, $year, true),
+ $this->mktime(0, 0, 0, $month, $day, $year, true), $hour);
+ }
+
+ // Monthname not found
+ throw new Zend_Date_Exception("invalid date ($date) operand, month expected", $date);
+ break;
+
+ case Zend_Date::MONTH :
+ if (is_numeric($date)) {
+ $fixday = 0;
+ if ($calc == 'add') {
+ $date += $month;
+ $calc = 'set';
+ if (self::$_Options['extend_month'] == false) {
+ $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false));
+ if ($parts['mday'] != $day) {
+ $fixday -= $parts['mday'];
+ }
+ }
+ } else if ($calc == 'sub') {
+ $date = $month - $date;
+ $calc = 'set';
+ if (self::$_Options['extend_month'] == false) {
+ $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false));
+ if ($parts['mday'] != $day) {
+ $fixday -= $parts['mday'];
+ }
+ }
+ }
+ return $this->_assign($calc, $this->mktime(0, 0, 0, $date, $day + $fixday, $year, true),
+ $this->mktime(0, 0, 0, $month, $day, $year, true), $hour);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, month expected", $date);
+ break;
+
+ case Zend_Date::MONTH_NAME_SHORT :
+ $monthlist = Zend_Locale_Data::getContent($locale, 'monthlist', array('gregorian', 'format', 'abbreviated'));
+ $cnt = 0;
+ foreach ($monthlist as $key => $value) {
+ if (strtoupper($value) == strtoupper($date)) {
+ $found = $key;
+ break;
+ }
+ ++$cnt;
+ }
+ $date = array_search($date, $monthlist);
+
+ // Monthname found
+ if ($cnt < 12) {
+ $fixday = 0;
+ if ($calc == 'add') {
+ $date += $found;
+ $calc = 'set';
+ if (self::$_Options['extend_month'] == false) {
+ $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false));
+ if ($parts['mday'] != $day) {
+ $fixday -= $parts['mday'];
+ }
+ }
+ } else if ($calc == 'sub') {
+ $date = $month - $found;
+ $calc = 'set';
+ if (self::$_Options['extend_month'] == false) {
+ $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false));
+ if ($parts['mday'] != $day) {
+ $fixday -= $parts['mday'];
+ }
+ }
+ }
+ return $this->_assign($calc, $this->mktime(0, 0, 0, $date, $day + $fixday, $year, true),
+ $this->mktime(0, 0, 0, $month, $day, $year, true), $hour);
+ }
+
+ // Monthname not found
+ throw new Zend_Date_Exception("invalid date ($date) operand, month expected", $date);
+ break;
+
+ case Zend_Date::MONTH_SHORT :
+ if (is_numeric($date)) {
+ $fixday = 0;
+ if ($calc == 'add') {
+ $date += $month;
+ $calc = 'set';
+ if (self::$_Options['extend_month'] == false) {
+ $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false));
+ if ($parts['mday'] != $day) {
+ $fixday -= $parts['mday'];
+ }
+ }
+ } else if ($calc == 'sub') {
+ $date = $month - $date;
+ $calc = 'set';
+ if (self::$_Options['extend_month'] == false) {
+ $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false));
+ if ($parts['mday'] != $day) {
+ $fixday -= $parts['mday'];
+ }
+ }
+ }
+
+ return $this->_assign($calc, $this->mktime(0, 0, 0, $date, $day + $fixday, $year, true),
+ $this->mktime(0, 0, 0, $month, $day, $year, true), $hour);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, month expected", $date);
+ break;
+
+ case Zend_Date::MONTH_DAYS :
+ throw new Zend_Date_Exception('month days not supported', $date);
+ break;
+
+
+ case Zend_Date::MONTH_NAME_NARROW :
+ $monthlist = Zend_Locale_Data::getContent($locale, 'monthlist', array('gregorian', 'stand-alone', 'narrow'));
+ $cnt = 0;
+ foreach ($monthlist as $key => $value) {
+ if (strtoupper($value) == strtoupper($date)) {
+ $found = $key;
+ break;
+ }
+ ++$cnt;
+ }
+ $date = array_search($date, $monthlist);
+
+ // Monthname found
+ if ($cnt < 12) {
+ $fixday = 0;
+ if ($calc == 'add') {
+ $date += $found;
+ $calc = 'set';
+ if (self::$_Options['extend_month'] == false) {
+ $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false));
+ if ($parts['mday'] != $day) {
+ $fixday -= $parts['mday'];
+ }
+ }
+ } else if ($calc == 'sub') {
+ $date = $month - $found;
+ $calc = 'set';
+ if (self::$_Options['extend_month'] == false) {
+ $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false));
+ if ($parts['mday'] != $day) {
+ $fixday -= $parts['mday'];
+ }
+ }
+ }
+ return $this->_assign($calc, $this->mktime(0, 0, 0, $date, $day + $fixday, $year, true),
+ $this->mktime(0, 0, 0, $month, $day, $year, true), $hour);
+ }
+
+ // Monthname not found
+ throw new Zend_Date_Exception("invalid date ($date) operand, month expected", $date);
+ break;
+
+
+ // year formats
+ case Zend_Date::LEAPYEAR :
+ throw new Zend_Date_Exception('leap year not supported', $date);
+ break;
+
+ case Zend_Date::YEAR_8601 :
+ if (is_numeric($date)) {
+ if ($calc == 'add') {
+ $date += $year;
+ $calc = 'set';
+ } else if ($calc == 'sub') {
+ $date = $year - $date;
+ $calc = 'set';
+ }
+ return $this->_assign($calc, $this->mktime(0, 0, 0, $month, $day, intval($date), true),
+ $this->mktime(0, 0, 0, $month, $day, $year, true), false);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, year expected", $date);
+ break;
+
+ case Zend_Date::YEAR :
+ if (is_numeric($date)) {
+ if ($calc == 'add') {
+ $date += $year;
+ $calc = 'set';
+ } else if ($calc == 'sub') {
+ $date = $year - $date;
+ $calc = 'set';
+ }
+ return $this->_assign($calc, $this->mktime(0, 0, 0, $month, $day, intval($date), true),
+ $this->mktime(0, 0, 0, $month, $day, $year, true), false);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, year expected", $date);
+ break;
+
+ case Zend_Date::YEAR_SHORT :
+ if (is_numeric($date)) {
+ $date = intval($date);
+ if (($date >= 0) and ($date <= 100) and ($calc == 'set')) {
+ $date += 1900;
+ if ($date < 1970) {
+ $date += 100;
+ }
+ }
+ if ($calc == 'add') {
+ $date += $year;
+ $calc = 'set';
+ } else if ($calc == 'sub') {
+ $date = $year - $date;
+ $calc = 'set';
+ }
+ return $this->_assign($calc, $this->mktime(0, 0, 0, $month, $day, $date, true),
+ $this->mktime(0, 0, 0, $month, $day, $year, true), false);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, year expected", $date);
+ break;
+
+
+ case Zend_Date::YEAR_SHORT_8601 :
+ if (is_numeric($date)) {
+ $date = intval($date);
+ if (($date >= 0) and ($date <= 100) and ($calc == 'set')) {
+ $date += 1900;
+ if ($date < 1970) {
+ $date += 100;
+ }
+ }
+ if ($calc == 'add') {
+ $date += $year;
+ $calc = 'set';
+ } else if ($calc == 'sub') {
+ $date = $year - $date;
+ $calc = 'set';
+ }
+ return $this->_assign($calc, $this->mktime(0, 0, 0, $month, $day, $date, true),
+ $this->mktime(0, 0, 0, $month, $day, $year, true), false);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, year expected", $date);
+ break;
+
+
+ // time formats
+ case Zend_Date::MERIDIEM :
+ throw new Zend_Date_Exception('meridiem not supported', $date);
+ break;
+
+ case Zend_Date::SWATCH :
+ if (is_numeric($date)) {
+ $rest = intval($date);
+ $hours = floor($rest * 24 / 1000);
+ $rest = $rest - ($hours * 1000 / 24);
+ $minutes = floor($rest * 1440 / 1000);
+ $rest = $rest - ($minutes * 1000 / 1440);
+ $seconds = floor($rest * 86400 / 1000);
+ return $this->_assign($calc, $this->mktime($hours, $minutes, $seconds, 1, 1, 1970, true),
+ $this->mktime($hour, $minute, $second, 1, 1, 1970, true), false);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, swatchstamp expected", $date);
+ break;
+
+ case Zend_Date::HOUR_SHORT_AM :
+ if (is_numeric($date)) {
+ return $this->_assign($calc, $this->mktime(intval($date), 0, 0, 1, 1, 1970, true),
+ $this->mktime($hour, 0, 0, 1, 1, 1970, true), false);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, hour expected", $date);
+ break;
+
+ case Zend_Date::HOUR_SHORT :
+ if (is_numeric($date)) {
+ return $this->_assign($calc, $this->mktime(intval($date), 0, 0, 1, 1, 1970, true),
+ $this->mktime($hour, 0, 0, 1, 1, 1970, true), false);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, hour expected", $date);
+ break;
+
+ case Zend_Date::HOUR_AM :
+ if (is_numeric($date)) {
+ return $this->_assign($calc, $this->mktime(intval($date), 0, 0, 1, 1, 1970, true),
+ $this->mktime($hour, 0, 0, 1, 1, 1970, true), false);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, hour expected", $date);
+ break;
+
+ case Zend_Date::HOUR :
+ if (is_numeric($date)) {
+ return $this->_assign($calc, $this->mktime(intval($date), 0, 0, 1, 1, 1970, true),
+ $this->mktime($hour, 0, 0, 1, 1, 1970, true), false);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, hour expected", $date);
+ break;
+
+ case Zend_Date::MINUTE :
+ if (is_numeric($date)) {
+ return $this->_assign($calc, $this->mktime(0, intval($date), 0, 1, 1, 1970, true),
+ $this->mktime(0, $minute, 0, 1, 1, 1970, true), false);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, minute expected", $date);
+ break;
+
+ case Zend_Date::SECOND :
+ if (is_numeric($date)) {
+ return $this->_assign($calc, $this->mktime(0, 0, intval($date), 1, 1, 1970, true),
+ $this->mktime(0, 0, $second, 1, 1, 1970, true), false);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, second expected", $date);
+ break;
+
+ case Zend_Date::MILLISECOND :
+ if (is_numeric($date)) {
+ switch($calc) {
+ case 'set' :
+ return $this->setMillisecond($date);
+ break;
+ case 'add' :
+ return $this->addMillisecond($date);
+ break;
+ case 'sub' :
+ return $this->subMillisecond($date);
+ break;
+ }
+ return $this->compareMillisecond($date);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, milliseconds expected", $date);
+ break;
+
+ case Zend_Date::MINUTE_SHORT :
+ if (is_numeric($date)) {
+ return $this->_assign($calc, $this->mktime(0, intval($date), 0, 1, 1, 1970, true),
+ $this->mktime(0, $minute, 0, 1, 1, 1970, true), false);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, minute expected", $date);
+ break;
+
+ case Zend_Date::SECOND_SHORT :
+ if (is_numeric($date)) {
+ return $this->_assign($calc, $this->mktime(0, 0, intval($date), 1, 1, 1970, true),
+ $this->mktime(0, 0, $second, 1, 1, 1970, true), false);
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, second expected", $date);
+ break;
+
+
+ // timezone formats
+ // break intentionally omitted
+ case Zend_Date::TIMEZONE_NAME :
+ case Zend_Date::TIMEZONE :
+ case Zend_Date::TIMEZONE_SECS :
+ throw new Zend_Date_Exception('timezone not supported', $date);
+ break;
+
+ case Zend_Date::DAYLIGHT :
+ throw new Zend_Date_Exception('daylight not supported', $date);
+ break;
+
+ case Zend_Date::GMT_DIFF :
+ case Zend_Date::GMT_DIFF_SEP :
+ throw new Zend_Date_Exception('gmtdiff not supported', $date);
+ break;
+
+
+ // date strings
+ case Zend_Date::ISO_8601 :
+
+ $next = 0;
+ if (preg_match('/-\d{4}-\d{2}-\d{2}/', $date, $datematch)) {
+ // -yyyy-mm-dd
+ $minus = true;
+ $result = array('Y' => 1, 'M' => 6, 'd' => 9);
+ $next = 11;
+ } else if (preg_match('/\d{4}-\d{2}-\d{2}/', $date, $datematch)) {
+ // yyyy-mm-dd
+ $result = array('Y' => 0, 'M' => 5, 'd' => 8);
+ $next = 10;
+ } else if (preg_match('/-\d{2}-\d{2}-\d{2}/', $date, $datematch)) {
+ // -yy-mm-dd
+ $minus = true;
+ $result = array('y' => 1, 'M' => 4, 'd' => 7);
+ $next = 9;
+ } else if (preg_match('/\d{2}-\d{2}-\d{2}/', $date, $datematch)) {
+ // yy-mm-dd
+ $result = array('y' => 0, 'M' => 3, 'd' => 6);
+ $next = 8;
+ } else if (preg_match('/-\d{8}/', $date, $datematch)) {
+ // -yyyymmdd
+ $minus = true;
+ $result = array('Y' => 1, 'M' => 5, 'd' => 7);
+ $next = 9;
+ } else if (preg_match('/\d{8}/', $date, $datematch)) {
+ // yyyymmdd
+ $result = array('Y' => 0, 'M' => 4, 'd' => 6);
+ $next = 8;
+ } else if (preg_match('/-\d{6}/', $date, $datematch)) {
+ // -yymmdd
+ $minus = true;
+ $result = array('y' => 1, 'M' => 3, 'd' => 5);
+ $next = 7;
+ } else if (preg_match('/\d{6}/', $date, $datematch)) {
+ // yymmdd
+ $result = array('y' => 0, 'M' => 2, 'd' => 4);
+ $next = 6;
+ }
+ if (strlen($date) > $next) {
+ $date = substr($date, $next);
+ // Thh:mm:ss
+ if (preg_match('/[T,\s]{1}\d{2}:\d{2}:\d{2}/', $date, $timematch)) {
+ // Thh:mm:ss | _hh:mm:ss
+ $result['h'] = 1;
+ $result['m'] = 4;
+ $result['s'] = 7;
+ $next += 9;
+ } else if (preg_match('/\d{2}:\d{2}:\d{2}/', $date, $timematch)) {
+ // hh:mm:ss
+ $result['h'] = 0;
+ $result['m'] = 3;
+ $result['s'] = 6;
+ $next += 8;
+ } else if (preg_match('/[T,\s]{1}\d{2}\d{2}\d{2}/', $date, $timematch)) {
+ // Thhmmss | _hhmmss
+ $result['h'] = 1;
+ $result['m'] = 3;
+ $result['s'] = 5;
+ $next += 7;
+ } else if (preg_match('/\d{2}\d{2}\d{2}/', $date, $timematch)) {
+ // hhmmss | hhmmss
+ $result['h'] = 0;
+ $result['m'] = 2;
+ $result['s'] = 4;
+ $next += 6;
+ }
+ }
+
+ if (!isset($result)) {
+ throw new Zend_Date_Exception("unsupported ISO8601 format ($date)", $date);
+ }
+
+ if(isset($result['M'])) {
+ if (isset($result['Y'])) {
+ $years = substr($datematch[0], $result['Y'], 4);
+ if (isset($minus)) {
+ $years = 0 - $years;
+ }
+ } else {
+ $years = substr($datematch[0], $result['y'], 2);
+ if (isset($minus)) {
+ $years = 0 - $years;
+ }
+ if ($years >= 0) {
+ $years += 1900;
+ if ($years < 1970)
+ $years += 100;
+ }
+ }
+ $months = substr($datematch[0], $result['M'], 2);
+ $days = substr($datematch[0], $result['d'], 2);
+ } else {
+ $years = 1970;
+ $months = 1;
+ $days = 1;
+ }
+ if (isset($result['h'])) {
+ $hours = substr($timematch[0], $result['h'], 2);
+ $minutes = substr($timematch[0], $result['m'], 2);
+ $seconds = substr($timematch[0], $result['s'], 2);
+ } else {
+ $hours = 0;
+ $minutes = 0;
+ $seconds = 0;
+ }
+
+ if ($calc == 'set') {
+ --$months;
+ --$month;
+ --$days;
+ --$day;
+ $years -= 1970;
+ $year -= 1970;
+ }
+
+ return $this->_assign($calc, $this->mktime($hours, $minutes, $seconds, 1 + $months, 1 + $days, 1970 + $years, false),
+ $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, false), false);
+ break;
+
+ case Zend_Date::RFC_2822 :
+ $result = preg_match('/\w{3},\s\d{2}\s\w{3}\s\d{4}\s\d{2}:\d{2}:\d{2}\s\+\d{4}/', $date, $match);
+ if (!$result) {
+ throw new Zend_Date_Exception("no RFC 2822 format ($date)", $date);
+ }
+
+ $days = substr($match[0], 5, 2);
+ $months = $this->getDigitFromName(substr($match[0], 8, 3));
+ $years = substr($match[0], 12, 4);
+ $hours = substr($match[0], 17, 2);
+ $minutes = substr($match[0], 20, 2);
+ $seconds = substr($match[0], 23, 2);
+
+ if ($calc == 'set') {
+ --$months;
+ --$month;
+ --$days;
+ --$day;
+ $years -= 1970;
+ $year -= 1970;
+ }
+ return $this->_assign($calc, $this->mktime($hours, $minutes, $seconds, 1 + $months, 1 + $days, 1970 + $years, false),
+ $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, false), false);
+ break;
+
+ case Zend_Date::TIMESTAMP :
+ if (is_numeric($date)) {
+ return $this->_assign($calc, $date, $this->getUnixTimestamp());
+ }
+ throw new Zend_Date_Exception("invalid date ($date) operand, timestamp expected", $date);
+ break;
+
+
+ // additional formats
+ // break intentionally omitted
+ case Zend_Date::ERA :
+ case Zend_Date::ERA_NAME :
+ throw new Zend_Date_Exception('era not supported', $date);
+ break;
+
+ case Zend_Date::DATES :
+ try {
+ $parsed = Zend_Locale_Format::getDate($date, array('locale' => $locale, 'format_type' => 'iso', 'fix_date' => true));
+
+ if ($calc == 'set') {
+ --$parsed['month'];
+ --$month;
+ --$parsed['day'];
+ --$day;
+ $parsed['year'] -= 1970;
+ $year -= 1970;
+ }
+ return $this->_assign($calc, $this->mktime(0, 0, 0, 1 + $parsed['month'], 1 + $parsed['day'], 1970 + $parsed['year'], true),
+ $this->mktime(0, 0, 0, 1 + $month, 1 + $day, 1970 + $year, true), $hour);
+ } catch (Zend_Locale_Exception $e) {
+ throw new Zend_Date_Exception($e->getMessage(), $date);
+ }
+ break;
+
+ case Zend_Date::DATE_FULL :
+ try {
+ $format = Zend_Locale_Data::getContent($locale, 'dateformat', array('gregorian', 'full'));
+ $parsed = Zend_Locale_Format::getDate($date, array('date_format' => $format['pattern'], 'format_type' => 'iso', 'locale' => $locale));
+
+ if ($calc == 'set') {
+ --$parsed['month'];
+ --$month;
+ --$parsed['day'];
+ --$day;
+ $parsed['year'] -= 1970;
+ $year -= 1970;
+ }
+ return $this->_assign($calc, $this->mktime(0, 0, 0, 1 + $parsed['month'], 1 + $parsed['day'], 1970 + $parsed['year'], true),
+ $this->mktime(0, 0, 0, 1 + $month, 1 + $day, 1970 + $year, true), $hour);
+ } catch (Zend_Locale_Exception $e) {
+ throw new Zend_Date_Exception($e->getMessage(), $date);
+ }
+ break;
+
+ case Zend_Date::DATE_LONG :
+ try {
+ $format = Zend_Locale_Data::getContent($locale, 'dateformat', array('gregorian', 'long'));
+ $parsed = Zend_Locale_Format::getDate($date, array('date_format' => $format['pattern'], 'format_type' => 'iso', 'locale' => $locale));
+
+ if ($calc == 'set') {
+ --$parsed['month'];
+ --$month;
+ --$parsed['day'];
+ --$day;
+ $parsed['year'] -= 1970;
+ $year -= 1970;
+ }
+ return $this->_assign($calc, $this->mktime(0, 0, 0, 1 + $parsed['month'], 1 + $parsed['day'], 1970 + $parsed['year'], true),
+ $this->mktime(0, 0, 0, 1 + $month, 1 + $day, 1970 + $year, true), $hour);
+ } catch (Zend_Locale_Exception $e) {
+ throw new Zend_Date_Exception($e->getMessage(), $date);
+ }
+ break;
+
+ case Zend_Date::DATE_MEDIUM :
+ try {
+ $format = Zend_Locale_Data::getContent($locale, 'dateformat', array('gregorian', 'medium'));
+ $parsed = Zend_Locale_Format::getDate($date, array('date_format' => $format['pattern'], 'format_type' => 'iso', 'locale' => $locale));
+
+ if ($calc == 'set') {
+ --$parsed['month'];
+ --$month;
+ --$parsed['day'];
+ --$day;
+ $parsed['year'] -= 1970;
+ $year -= 1970;
+ }
+ return $this->_assign($calc, $this->mktime(0, 0, 0, 1 + $parsed['month'], 1 + $parsed['day'], 1970 + $parsed['year'], true),
+ $this->mktime(0, 0, 0, 1 + $month, 1 + $day, 1970 + $year, true), $hour);
+ } catch (Zend_Locale_Exception $e) {
+ throw new Zend_Date_Exception($e->getMessage(), $date);
+ }
+ break;
+
+ case Zend_Date::DATE_SHORT :
+ try {
+ $format = Zend_Locale_Data::getContent($locale, 'dateformat', array('gregorian', 'short'));
+ $parsed = Zend_Locale_Format::getDate($date, array('date_format' => $format['pattern'], 'format_type' => 'iso', 'locale' => $locale));
+
+ if ($parsed['year'] < 100) {
+ $parsed['year'] += 1900;
+ if ($parsed['year'] < 1970) {
+ $parsed['year'] += 100;
+ }
+ }
+
+ if ($calc == 'set') {
+ --$parsed['month'];
+ --$month;
+ --$parsed['day'];
+ --$day;
+ $parsed['year'] -= 1970;
+ $year -= 1970;
+ }
+ return $this->_assign($calc, $this->mktime(0, 0, 0, 1 + $parsed['month'], 1 + $parsed['day'], 1970 + $parsed['year'], true),
+ $this->mktime(0, 0, 0, 1 + $month, 1 + $day, 1970 + $year, true), $hour);
+ } catch (Zend_Locale_Exception $e) {
+ throw new Zend_Date_Exception($e->getMessage(), $date);
+ }
+ break;
+
+ case Zend_Date::TIMES :
+ try {
+ if ($calc != 'set') {
+ $month = 1;
+ $day = 1;
+ $year = 1970;
+ }
+ $parsed = Zend_Locale_Format::getTime($date, array('locale' => $locale, 'format_type' => 'iso', 'fix_date' => true));
+ return $this->_assign($calc, $this->mktime($parsed['hour'], $parsed['minute'], $parsed['second'], $month, $day, $year, true),
+ $this->mktime($hour, $minute, $second, $month, $day, $year, true), false);
+ } catch (Zend_Locale_Exception $e) {
+ throw new Zend_Date_Exception($e->getMessage(), $date);
+ }
+ break;
+
+ case Zend_Date::TIME_FULL :
+ try {
+ $format = Zend_Locale_Data::getContent($locale, 'timeformat', array('gregorian', 'full'));
+ $parsed = Zend_Locale_Format::getTime($date, array('date_format' => $format['pattern'], 'format_type' => 'iso', 'locale' => $locale));
+ if ($calc != 'set') {
+ $month = 1;
+ $day = 1;
+ $year = 1970;
+ }
+ return $this->_assign($calc, $this->mktime($parsed['hour'], $parsed['minute'], 0, $month, $day, $year, true),
+ $this->mktime($hour, $minute, $second, $month, $day, $year, true), false);
+ } catch (Zend_Locale_Exception $e) {
+ throw new Zend_Date_Exception($e->getMessage(), $date);
+ }
+ break;
+
+ case Zend_Date::TIME_LONG :
+ try {
+ $format = Zend_Locale_Data::getContent($locale, 'timeformat', array('gregorian', 'long'));
+ $parsed = Zend_Locale_Format::getTime($date, array('date_format' => $format['pattern'], 'format_type' => 'iso', 'locale' => $locale));
+ if ($calc != 'set') {
+ $month = 1;
+ $day = 1;
+ $year = 1970;
+ }
+ return $this->_assign($calc, $this->mktime($parsed['hour'], $parsed['minute'], $parsed['second'], $month, $day, $year, true),
+ $this->mktime($hour, $minute, $second, $month, $day, $year, true), false);
+ } catch (Zend_Locale_Exception $e) {
+ throw new Zend_Date_Exception($e->getMessage(), $date);
+ }
+ break;
+
+ case Zend_Date::TIME_MEDIUM :
+ try {
+ $format = Zend_Locale_Data::getContent($locale, 'timeformat', array('gregorian', 'medium'));
+ $parsed = Zend_Locale_Format::getTime($date, array('date_format' => $format['pattern'], 'format_type' => 'iso', 'locale' => $locale));
+ if ($calc != 'set') {
+ $month = 1;
+ $day = 1;
+ $year = 1970;
+ }
+ return $this->_assign($calc, $this->mktime($parsed['hour'], $parsed['minute'], $parsed['second'], $month, $day, $year, true),
+ $this->mktime($hour, $minute, $second, $month, $day, $year, true), false);
+ } catch (Zend_Locale_Exception $e) {
+ throw new Zend_Date_Exception($e->getMessage(), $date);
+ }
+ break;
+
+ case Zend_Date::TIME_SHORT :
+ try {
+ $format = Zend_Locale_Data::getContent($locale, 'timeformat', array('gregorian', 'short'));
+ $parsed = Zend_Locale_Format::getTime($date, array('date_format' => $format['pattern'], 'format_type' => 'iso', 'locale' => $locale));
+ if ($calc != 'set') {
+ $month = 1;
+ $day = 1;
+ $year = 1970;
+ }
+ return $this->_assign($calc, $this->mktime($parsed['hour'], $parsed['minute'], 0, $month, $day, $year, true),
+ $this->mktime($hour, $minute, $second, $month, $day, $year, true), false);
+ } catch (Zend_Locale_Exception $e) {
+ throw new Zend_Date_Exception($e->getMessage(), $date);
+ }
+ break;
+
+ // ATOM and RFC_3339 are identical
+ case Zend_Date::ATOM :
+ case Zend_Date::RFC_3339:
+ $result = preg_match('/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]{1}\d{2}:\d{2}$/', $date, $match);
+ if (!$result) {
+ throw new Zend_Date_Exception("invalid date ($date) operand, ATOM format expected", $date);
+ }
+
+ $years = substr($match[0], 0, 4);
+ $months = substr($match[0], 5, 2);
+ $days = substr($match[0], 8, 2);
+ $hours = substr($match[0], 11, 2);
+ $minutes = substr($match[0], 14, 2);
+ $seconds = substr($match[0], 17, 2);
+
+ if ($calc == 'set') {
+ --$months;
+ --$month;
+ --$days;
+ --$day;
+ $years -= 1970;
+ $year -= 1970;
+ }
+ return $this->_assign($calc, $this->mktime($hours, $minutes, $seconds, 1 + $months, 1 + $days, 1970 + $years, true),
+ $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, true), false);
+ break;
+
+ case Zend_Date::COOKIE :
+ $result = preg_match('/\w{6,9},\s\d{2}-\w{3}-\d{2}\s\d{2}:\d{2}:\d{2}\s\w{3}/', $date, $match);
+ if (!$result) {
+ throw new Zend_Date_Exception("invalid date ($date) operand, COOKIE format expected", $date);
+ }
+ $match[0] = substr($match[0], strpos($match[0], ' ')+1);
+
+ $days = substr($match[0], 0, 2);
+ $months = $this->getDigitFromName(substr($match[0], 3, 3));
+ $years = substr($match[0], 7, 4);
+ $years += 2000;
+ $hours = substr($match[0], 10, 2);
+ $minutes = substr($match[0], 13, 2);
+ $seconds = substr($match[0], 16, 2);
+
+ if ($calc == 'set') {
+ --$months;
+ --$month;
+ --$days;
+ --$day;
+ $years -= 1970;
+ $year -= 1970;
+ }
+ return $this->_assign($calc, $this->mktime($hours, $minutes, $seconds, 1 + $months, 1 + $days, 1970 + $years, true),
+ $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, true), false);
+ break;
+
+ case Zend_Date::RFC_822 :
+ // new RFC 822 format
+ $result = preg_match('/^\w{3},\s\d{2}\s\w{3}\s\d{2}\s\d{2}:\d{2}:\d{2}\s[+-]{1}\d{4}$/', $date, $match);
+ if (!$result) {
+ // old RFC 822 format
+ $result = preg_match('/\w{3},\s\d{2}\s\w{3}\s\d{2}\s\d{2}:\d{2}:\d{2}\s\w{1,3}/', $date, $match);
+ }
+ if (!$result) {
+ throw new Zend_Date_Exception("invalid date ($date) operand, RFC 822 date format expected", $date);
+ }
+
+ $days = substr($match[0], 5, 2);
+ $months = $this->getDigitFromName(substr($match[0], 8, 3));
+ $years = substr($match[0], 12, 4);
+ $years += 2000;
+ $hours = substr($match[0], 15, 2);
+ $minutes = substr($match[0], 18, 2);
+ $seconds = substr($match[0], 21, 2);
+
+ if ($calc == 'set') {
+ --$months;
+ --$month;
+ --$days;
+ --$day;
+ $years -= 1970;
+ $year -= 1970;
+ }
+ return $this->_assign($calc, $this->mktime($hours, $minutes, $seconds, 1 + $months, 1 + $days, 1970 + $years, false),
+ $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, false), false);
+ break;
+
+ case Zend_Date::RFC_850 :
+ $result = preg_match('/\w{6,9},\s\d{2}-\w{3}-\d{2}\s\d{2}:\d{2}:\d{2}\s\w{3}/', $date, $match);
+ if (!$result) {
+ throw new Zend_Date_Exception("invalid date ($date) operand, RFC 850 date format expected", $date);
+ }
+
+ $match[0] = substr($match[0], strpos($match[0], ' ')+1);
+
+ $days = substr($match[0], 0, 2);
+ $months = $this->getDigitFromName(substr($match[0], 3, 3));
+ $years = substr($match[0], 7, 4);
+ $years += 2000;
+ $hours = substr($match[0], 10, 2);
+ $minutes = substr($match[0], 13, 2);
+ $seconds = substr($match[0], 16, 2);
+
+ if ($calc == 'set') {
+ --$months;
+ --$month;
+ --$days;
+ --$day;
+ $years -= 1970;
+ $year -= 1970;
+ }
+ return $this->_assign($calc, $this->mktime($hours, $minutes, $seconds, 1 + $months, 1 + $days, 1970 + $years, true),
+ $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, true), false);
+ break;
+
+ case Zend_Date::RFC_1036 :
+ $result = preg_match('/^\w{3},\s\d{2}\s\w{3}\s\d{2}\s\d{2}:\d{2}:\d{2}\s[+-]{1}\d{4}$/', $date, $match);
+ if (!$result) {
+ throw new Zend_Date_Exception("invalid date ($date) operand, RFC 1036 date format expected", $date);
+ }
+
+ $days = substr($match[0], 5, 2);
+ $months = $this->getDigitFromName(substr($match[0], 8, 3));
+ $years = substr($match[0], 12, 4);
+ $years += 2000;
+ $hours = substr($match[0], 15, 2);
+ $minutes = substr($match[0], 18, 2);
+ $seconds = substr($match[0], 21, 2);
+
+ if ($calc == 'set') {
+ --$months;
+ --$month;
+ --$days;
+ --$day;
+ $years -= 1970;
+ $year -= 1970;
+ }
+ return $this->_assign($calc, $this->mktime($hours, $minutes, $seconds, 1 + $months, 1 + $days, 1970 + $years, true),
+ $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, true), false);
+ break;
+
+ case Zend_Date::RFC_1123 :
+ $result = preg_match('/^\w{3},\s\d{2}\s\w{3}\s\d{4}\s\d{2}:\d{2}:\d{2}\s[+-]{1}\d{4}$/', $date, $match);
+ if (!$result) {
+ throw new Zend_Date_Exception("invalid date ($date) operand, RFC 1123 date format expected", $date);
+ }
+
+ $days = substr($match[0], 5, 2);
+ $months = $this->getDigitFromName(substr($match[0], 8, 3));
+ $years = substr($match[0], 12, 4);
+ $hours = substr($match[0], 17, 2);
+ $minutes = substr($match[0], 20, 2);
+ $seconds = substr($match[0], 23, 2);
+
+ if ($calc == 'set') {
+ --$months;
+ --$month;
+ --$days;
+ --$day;
+ $years -= 1970;
+ $year -= 1970;
+ }
+ return $this->_assign($calc, $this->mktime($hours, $minutes, $seconds, 1 + $months, 1 + $days, 1970 + $years, true),
+ $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, true), false);
+ break;
+
+ case Zend_Date::RSS :
+ $result = preg_match('/^\w{3},\s\d{2}\s\w{3}\s\d{4}\s\d{2}:\d{2}:\d{2}\s[+-]{1}\d{4}$/', $date, $match);
+ if (!$result) {
+ throw new Zend_Date_Exception("invalid date ($date) operand, RSS date format expected", $date);
+ }
+
+ $days = substr($match[0], 5, 2);
+ $months = $this->getDigitFromName(substr($match[0], 8, 3));
+ $years = substr($match[0], 12, 4);
+ $hours = substr($match[0], 17, 2);
+ $minutes = substr($match[0], 20, 2);
+ $seconds = substr($match[0], 23, 2);
+
+ if ($calc == 'set') {
+ --$months;
+ --$month;
+ --$days;
+ --$day;
+ $years -= 1970;
+ $year -= 1970;
+ }
+ return $this->_assign($calc, $this->mktime($hours, $minutes, $seconds, 1 + $months, 1 + $days, 1970 + $years, true),
+ $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, true), false);
+ break;
+
+ case Zend_Date::W3C :
+ $result = preg_match('/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]{1}\d{2}:\d{2}$/', $date, $match);
+ if (!$result) {
+ throw new Zend_Date_Exception("invalid date ($date) operand, W3C date format expected", $date);
+ }
+
+ $years = substr($match[0], 0, 4);
+ $months = substr($match[0], 5, 2);
+ $days = substr($match[0], 8, 2);
+ $hours = substr($match[0], 11, 2);
+ $minutes = substr($match[0], 14, 2);
+ $seconds = substr($match[0], 17, 2);
+
+ if ($calc == 'set') {
+ --$months;
+ --$month;
+ --$days;
+ --$day;
+ $years -= 1970;
+ $year -= 1970;
+ }
+ return $this->_assign($calc, $this->mktime($hours, $minutes, $seconds, 1 + $months, 1 + $days, 1970 + $years, true),
+ $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, true), false);
+ break;
+
+ default :
+ if (!is_numeric($date)) {
+ try {
+ if (self::$_Options['format_type'] == 'php') {
+ $part = Zend_Locale_Format::convertPhpToIsoFormat($part);
+ }
+ $parsed = Zend_Locale_Format::getDate($date, array('date_format' => $part, 'locale' => $locale, 'fix_date' => true, 'format_type' => 'iso'));
+ if ($calc == 'set') {
+ if (isset($parsed['month'])) {
+ --$parsed['month'];
+ } else {
+ $parsed['month'] = 0;
+ }
+ if (isset($parsed['day'])) {
+ --$parsed['day'];
+ } else {
+ $parsed['day'] = 0;
+ }
+ if (isset($parsed['year'])) {
+ $parsed['year'] -= 1970;
+ } else {
+ $parsed['year'] = 0;
+ }
+ }
+ return $this->_assign($calc, $this->mktime(
+ isset($parsed['hour']) ? $parsed['hour'] : 0,
+ isset($parsed['minute']) ? $parsed['minute'] : 0,
+ isset($parsed['second']) ? $parsed['second'] : 0,
+ 1 + $parsed['month'], 1 + $parsed['day'], 1970 + $parsed['year'],
+ false), $this->getUnixTimestamp(), false);
+ } catch (Zend_Locale_Exception $e) {
+ throw new Zend_Date_Exception($e->getMessage(), $date);
+ }
+ }
+ return $this->_assign($calc, $date, $this->getUnixTimestamp(), false);
+ break;
+ }
+ }
+
+
+ /**
+ * Returns true when both date objects or date parts are equal.
+ * For example:
+ * 15.May.2000 <-> 15.June.2000 Equals only for Day or Year... all other will return false
+ *
+ * @param string|integer|Zend_Date $date Date or datepart to equal with
+ * @param string $part OPTIONAL Part of the date to compare, if null the timestamp is used
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return boolean
+ * @throws Zend_Date_Exception
+ */
+ public function equals($date, $part = null, $locale = null)
+ {
+ $result = $this->compare($date, $part, $locale);
+
+ if ($result == 0) {
+ return true;
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns if the given date or datepart is earlier
+ * For example:
+ * 15.May.2000 <-> 13.June.1999 will return true for day, year and date, but not for month
+ *
+ * @param string|integer|Zend_Date $date Date or datepart to compare with
+ * @param string $part OPTIONAL Part of the date to compare, if null the timestamp is used
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return boolean
+ * @throws Zend_Date_Exception
+ */
+ public function isEarlier($date, $part = null, $locale = null)
+ {
+ $result = $this->compare($date, $part, $locale);
+
+ if ($result == -1) {
+ return true;
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns if the given date or datepart is later
+ * For example:
+ * 15.May.2000 <-> 13.June.1999 will return true for month but false for day, year and date
+ * Returns if the given date is later
+ *
+ * @param string|integer|Zend_Date $date Date or datepart to compare with
+ * @param string $part OPTIONAL Part of the date to compare, if null the timestamp is used
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return boolean
+ * @throws Zend_Date_Exception
+ */
+ public function isLater($date, $part = null, $locale = null)
+ {
+ $result = $this->compare($date, $part, $locale);
+
+ if ($result == 1) {
+ return true;
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns only the time of the date as new Zend_Date object
+ * For example:
+ * 15.May.2000 10:11:23 will return a dateobject equal to 01.Jan.1970 10:11:23
+ *
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ */
+ public function getTime($locale = null)
+ {
+ return $this->copyPart(Zend_Date::TIME_MEDIUM, $locale);
+ }
+
+
+ /**
+ * Returns the calculated time
+ *
+ * @param string $calc Calculation to make
+ * @param string|integer|Zend_Date $time Time to calculate with, if null the actual time is taken
+ * @param string $format Timeformat for parsing input
+ * @param string|Zend_Locale $locale Locale for parsing input
+ * @return integer|Zend_Date new time
+ * @throws Zend_Date_Exception
+ */
+ private function _time($calc, $time, $format, $locale)
+ {
+ if (is_null($time)) {
+ throw new Zend_Date_Exception('parameter $time must be set, null is not allowed');
+ }
+
+ if ($locale === null) {
+ $locale = $this->getLocale();
+ }
+
+ if ($time instanceof Zend_Date) {
+ // extract time from object
+ $time = $time->get(Zend_Date::TIME_MEDIUM, $locale);
+ } else {
+ if (self::$_Options['format_type'] == 'php') {
+ $format = Zend_Locale_Format::convertPhpToIsoFormat($format);
+ }
+ try {
+ $parsed = Zend_Locale_Format::getTime($time, array('date_format' => $format, 'locale' => $locale, 'format_type' => 'iso'));
+ } catch (Zend_Locale_Exception $e) {
+ throw new Zend_Date_Exception($e->getMessage());
+ }
+ $time = new Zend_Date(0, Zend_Date::TIMESTAMP, $locale);
+ $time->set($parsed['hour'], Zend_Date::HOUR);
+ $time->set($parsed['minute'], Zend_Date::MINUTE);
+ $time->set($parsed['second'], Zend_Date::SECOND);
+ $time = $time->get(Zend_Date::TIME_MEDIUM, $locale);
+ }
+
+ $return = $this->_calcdetail($calc, $time, Zend_Date::TIME_MEDIUM, $locale);
+ if ($calc != 'cmp') {
+ return $this;
+ }
+ return $return;
+ }
+
+
+ /**
+ * Sets a new time for the date object. Format defines how to parse the time string.
+ * Also a complete date can be given, but only the time is used for setting.
+ * For example: dd.MMMM.yyTHH:mm' and 'ss sec'-> 10.May.07T25:11 and 44 sec => 1h11min44sec + 1 day
+ * Returned is the new date object and the existing date is left as it was before
+ *
+ * @param string|integer|Zend_Date $time Time to set
+ * @param string $format OPTIONAL Timeformat for parsing input
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new time
+ * @throws Zend_Date_Exception
+ */
+ public function setTime($time, $format = null, $locale = null)
+ {
+ return $this->_time('set', $time, $format, $locale);
+ }
+
+
+ /**
+ * Adds a time to the existing date. Format defines how to parse the time string.
+ * If only parts are given the other parts are set to 0.
+ * If no format is given, the standardformat of this locale is used.
+ * For example: HH:mm:ss -> 10 -> +10 hours
+ *
+ * @param string|integer|Zend_Date $time Time to add
+ * @param string $format OPTIONAL Timeformat for parsing input
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new time
+ * @throws Zend_Date_Exception
+ */
+ public function addTime($time, $format = null, $locale = null)
+ {
+ return $this->_time('add', $time, $format, $locale);
+ }
+
+
+ /**
+ * Subtracts a time from the existing date. Format defines how to parse the time string.
+ * If only parts are given the other parts are set to 0.
+ * If no format is given, the standardformat of this locale is used.
+ * For example: HH:mm:ss -> 10 -> -10 hours
+ *
+ * @param string|integer|Zend_Date $time Time to sub
+ * @param string $format OPTIONAL Timeformat for parsing input
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new time
+ * @throws Zend_Date_Exception
+ */
+ public function subTime($time, $format = null, $locale = null)
+ {
+ return $this->_time('sub', $time, $format, $locale);
+ }
+
+
+ /**
+ * Compares the time from the existing date. Format defines how to parse the time string.
+ * If only parts are given the other parts are set to default.
+ * If no format us given, the standardformat of this locale is used.
+ * For example: HH:mm:ss -> 10 -> 10 hours
+ *
+ * @param string|integer|Zend_Date $time Time to compare
+ * @param string $format OPTIONAL Timeformat for parsing input
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer 0 = equal, 1 = later, -1 = earlier
+ * @throws Zend_Date_Exception
+ */
+ public function compareTime($time, $format = null, $locale = null)
+ {
+ return $this->_time('cmp', $time, $format, $locale);
+ }
+
+
+ /**
+ * Returns a clone of $this, with the time part set to 00:00:00.
+ *
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ */
+ public function getDate($locale = null)
+ {
+ return $this->copyPart(Zend_Date::DATE_FULL, $locale);
+ }
+
+
+ /**
+ * Returns the calculated date
+ *
+ * @param string $calc Calculation to make
+ * @param string|integer|Zend_Date $date Date to calculate with, if null the actual date is taken
+ * @param string $format Date format for parsing
+ * @param string|Zend_Locale $locale Locale for parsing input
+ * @return integer|Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ private function _date($calc, $date, $format, $locale)
+ {
+ if (is_null($date)) {
+ throw new Zend_Date_Exception('parameter $date must be set, null is not allowed');
+ }
+
+ if ($locale === null) {
+ $locale = $this->getLocale();
+ }
+
+ if ($date instanceof Zend_Date) {
+ // extract date from object
+ $date = $date->get(Zend_Date::DATE_FULL, $locale);
+ } else {
+ if (self::$_Options['format_type'] == 'php') {
+ $format = Zend_Locale_Format::convertPhpToIsoFormat($format);
+ }
+ try {
+ $parsed = Zend_Locale_Format::getDate($date, array('date_format' => $format, 'locale' => $locale, 'format_type' => 'iso'));
+ } catch (Zend_Locale_Exception $e) {
+ throw new Zend_Date_Exception($e->getMessage());
+ }
+ $date = new Zend_Date(0, Zend_Date::TIMESTAMP, $locale);
+ $date->set($parsed['year'], Zend_Date::YEAR);
+ $date->set($parsed['month'], Zend_Date::MONTH);
+ $date->set($parsed['day'], Zend_Date::DAY);
+ $date = $date->get(Zend_Date::DATE_FULL, $locale);
+ }
+
+ $return = $this->_calcdetail($calc, $date, Zend_Date::DATE_FULL, $locale);
+ if ($calc != 'cmp') {
+ return $this;
+ }
+ return $return;
+ }
+
+
+ /**
+ * Sets a new date for the date object. Format defines how to parse the date string.
+ * Also a complete date with time can be given, but only the date is used for setting.
+ * For example: MMMM.yy HH:mm-> May.07 22:11 => 01.May.07 00:00
+ * Returned is the new date object and the existing time is left as it was before
+ *
+ * @param string|integer|Zend_Date $time Date to set
+ * @param string $format OPTIONAL Date format for parsing
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer|Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function setDate($date, $format = null, $locale = null)
+ {
+ return $this->_date('set', $date, $format, $locale);
+ }
+
+
+ /**
+ * Adds a date to the existing date object. Format defines how to parse the date string.
+ * If only parts are given the other parts are set to 0.
+ * If no format is given, the standardformat of this locale is used.
+ * For example: MM.dd.YYYY -> 10 -> +10 months
+ *
+ * @param string|integer|Zend_Date $time Date to add
+ * @param string $format OPTIONAL Date format for parsing input
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function addDate($date, $format = null, $locale = null)
+ {
+ return $this->_date('add', $date, $format, $locale);
+ }
+
+
+ /**
+ * Subtracts a date from the existing date object. Format defines how to parse the date string.
+ * If only parts are given the other parts are set to 0.
+ * If no format is given, the standardformat of this locale is used.
+ * For example: MM.dd.YYYY -> 10 -> -10 months
+ * Be aware: Subtracting 2 months is not equal to Adding -2 months !!!
+ *
+ * @param string|integer|Zend_Date $time Date to sub
+ * @param string $format OPTIONAL Date format for parsing input
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function subDate($date, $format = null, $locale = null)
+ {
+ return $this->_date('sub', $date, $format, $locale);
+ }
+
+
+ /**
+ * Compares the date from the existing date object, ignoring the time.
+ * Format defines how to parse the date string.
+ * If only parts are given the other parts are set to 0.
+ * If no format is given, the standardformat of this locale is used.
+ * For example: 10.01.2000 => 10.02.1999 -> false
+ *
+ * @param string|integer|Zend_Date $time Date to compare
+ * @param string $format OPTIONAL Date format for parsing input
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function compareDate($date, $format = null, $locale = null)
+ {
+
+ return $this->_date('cmp', $date, $format, $locale);
+ }
+
+
+ /**
+ * Returns the full ISO 8601 date from the date object.
+ * Always the complete ISO 8601 specifiction is used. If an other ISO date is needed
+ * (ISO 8601 defines several formats) use toString() instead.
+ * This function does not return the ISO date as object. Use copy() instead.
+ *
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return string
+ */
+ public function getIso($locale = null)
+ {
+ return $this->get(Zend_Date::ISO_8601, $locale);
+ }
+
+
+ /**
+ * Sets a new date for the date object. Not given parts are set to default.
+ * Only supported ISO 8601 formats are accepted.
+ * For example: 050901 -> 01.Sept.2005 00:00:00, 20050201T10:00:30 -> 01.Feb.2005 10h00m30s
+ * Returned is the new date object
+ *
+ * @param string|integer|Zend_Date $date ISO Date to set
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer|Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function setIso($date, $locale = null)
+ {
+ return $this->_calcvalue('set', $date, 'iso', Zend_Date::ISO_8601, $locale);
+ }
+
+
+ /**
+ * Adds a ISO date to the date object. Not given parts are set to default.
+ * Only supported ISO 8601 formats are accepted.
+ * For example: 050901 -> + 01.Sept.2005 00:00:00, 10:00:00 -> +10h
+ * Returned is the new date object
+ *
+ * @param string|integer|Zend_Date $date ISO Date to add
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer|Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function addIso($date, $locale = null)
+ {
+ return $this->_calcvalue('add', $date, 'iso', Zend_Date::ISO_8601, $locale);
+ }
+
+
+ /**
+ * Subtracts a ISO date from the date object. Not given parts are set to default.
+ * Only supported ISO 8601 formats are accepted.
+ * For example: 050901 -> - 01.Sept.2005 00:00:00, 10:00:00 -> -10h
+ * Returned is the new date object
+ *
+ * @param string|integer|Zend_Date $date ISO Date to sub
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer|Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function subIso($date, $locale = null)
+ {
+ return $this->_calcvalue('sub', $date, 'iso', Zend_Date::ISO_8601, $locale);
+ }
+
+
+ /**
+ * Compares a ISO date with the date object. Not given parts are set to default.
+ * Only supported ISO 8601 formats are accepted.
+ * For example: 050901 -> - 01.Sept.2005 00:00:00, 10:00:00 -> -10h
+ * Returns if equal, earlier or later
+ *
+ * @param string|integer|Zend_Date $date ISO Date to sub
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer 0 = equal, 1 = later, -1 = earlier
+ * @throws Zend_Date_Exception
+ */
+ public function compareIso($date, $locale = null)
+ {
+ return $this->_calcvalue('cmp', $date, 'iso', Zend_Date::ISO_8601, $locale);
+ }
+
+
+ /**
+ * Returns a RFC 822 compilant datestring from the date object.
+ * This function does not return the RFC date as object. Use copy() instead.
+ *
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return string
+ */
+ public function getArpa($locale = null)
+ {
+ return $this->get(Zend_Date::RFC_822, $locale);
+ }
+
+
+ /**
+ * Sets a RFC 822 date as new date for the date object.
+ * Only RFC 822 compilant date strings are accepted.
+ * For example: Sat, 14 Feb 09 00:31:30 +0100
+ * Returned is the new date object
+ *
+ * @param string|integer|Zend_Date $date RFC 822 to set
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer|Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function setArpa($date, $locale = null)
+ {
+ return $this->_calcvalue('set', $date, 'arpa', Zend_Date::RFC_822, $locale);
+ }
+
+
+ /**
+ * Adds a RFC 822 date to the date object.
+ * ARPA messages are used in emails or HTTP Headers.
+ * Only RFC 822 compilant date strings are accepted.
+ * For example: Sat, 14 Feb 09 00:31:30 +0100
+ * Returned is the new date object
+ *
+ * @param string|integer|Zend_Date $date RFC 822 Date to add
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer|Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function addArpa($date, $locale = null)
+ {
+ return $this->_calcvalue('add', $date, 'arpa', Zend_Date::RFC_822, $locale);
+ }
+
+
+ /**
+ * Subtracts a RFC 822 date from the date object.
+ * ARPA messages are used in emails or HTTP Headers.
+ * Only RFC 822 compilant date strings are accepted.
+ * For example: Sat, 14 Feb 09 00:31:30 +0100
+ * Returned is the new date object
+ *
+ * @param string|integer|Zend_Date $date RFC 822 Date to sub
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer|Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function subArpa($date, $locale = null)
+ {
+ return $this->_calcvalue('sub', $date, 'arpa', Zend_Date::RFC_822, $locale);
+ }
+
+
+ /**
+ * Compares a RFC 822 compilant date with the date object.
+ * ARPA messages are used in emails or HTTP Headers.
+ * Only RFC 822 compilant date strings are accepted.
+ * For example: Sat, 14 Feb 09 00:31:30 +0100
+ * Returns if equal, earlier or later
+ *
+ * @param string|integer|Zend_Date $date RFC 822 Date to sub
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer 0 = equal, 1 = later, -1 = earlier
+ * @throws Zend_Date_Exception
+ */
+ public function compareArpa($date, $locale = null)
+ {
+ return $this->_calcvalue('cmp', $date, 'arpa', Zend_Date::RFC_822, $locale);
+ }
+
+
+ /**
+ * Check if location is supported
+ *
+ * @param $location array - locations array
+ * @return $horizon float
+ */
+ private function _checkLocation($location)
+ {
+ if (!isset($location['longitude']) or !isset($location['latitude'])) {
+ throw new Zend_Date_Exception('Location must include \'longitude\' and \'latitude\'', $location);
+ }
+ if (($location['longitude'] > 180) or ($location['longitude'] < -180)) {
+ throw new Zend_Date_Exception('Longitude must be between -180 and 180', $location);
+ }
+ if (($location['latitude'] > 90) or ($location['latitude'] < -90)) {
+ throw new Zend_Date_Exception('Latitude must be between -90 and 90', $location);
+ }
+
+ if (!isset($location['horizon'])){
+ $location['horizon'] = 'effective';
+ }
+
+ switch ($location['horizon']) {
+ case 'civil' :
+ return -0.104528;
+ break;
+ case 'nautic' :
+ return -0.207912;
+ break;
+ case 'astronomic' :
+ return -0.309017;
+ break;
+ default :
+ return -0.0145439;
+ break;
+ }
+ }
+
+
+ /**
+ * Returns the time of sunrise for this date and a given location as new date object
+ * For a list of cities and correct locations use the class Zend_Date_Cities
+ *
+ * @param $location array - location of sunrise
+ * ['horizon'] -> civil, nautic, astronomical, effective (default)
+ * ['longitude'] -> longitude of location
+ * ['latitude'] -> latitude of location
+ * @return Zend_Date
+ * @throws Zend_Date_Exception
+ */
+ public function getSunrise($location)
+ {
+ $horizon = $this->_checkLocation($location);
+ $result = clone $this;
+ $result->set($this->calcSun($location, $horizon, true), 'Zend_Date::TIMESTAMP');
+ return $result;
+ }
+
+
+ /**
+ * Returns the time of sunset for this date and a given location as new date object
+ * For a list of cities and correct locations use the class Zend_Date_Cities
+ *
+ * @param $location array - location of sunset
+ * ['horizon'] -> civil, nautic, astronomical, effective (default)
+ * ['longitude'] -> longitude of location
+ * ['latitude'] -> latitude of location
+ * @return Zend_Date
+ * @throws Zend_Date_Exception
+ */
+ public function getSunset($location)
+ {
+ $horizon = $this->_checkLocation($location);
+ $result = clone $this;
+ $result->set($this->calcSun($location, $horizon, false), 'Zend_Date::TIMESTAMP');
+ return $result;
+ }
+
+
+ /**
+ * Returns an array with the sunset and sunrise dates for all horizon types
+ * For a list of cities and correct locations use the class Zend_Date_Cities
+ *
+ * @param $location array - location of suninfo
+ * ['horizon'] -> civil, nautic, astronomical, effective (default)
+ * ['longitude'] -> longitude of location
+ * ['latitude'] -> latitude of location
+ * @return array - [sunset|sunrise][effective|civil|nautic|astronomic]
+ * @throws Zend_Date_Exception
+ */
+ public function getSunInfo($location)
+ {
+ $suninfo = array();
+ for ($i = 0; $i < 4; ++$i) {
+ switch ($i) {
+ case 0 :
+ $location['horizon'] = 'effective';
+ break;
+ case 1 :
+ $location['horizon'] = 'civil';
+ break;
+ case 2 :
+ $location['horizon'] = 'nautic';
+ break;
+ case 3 :
+ $location['horizon'] = 'astronomic';
+ break;
+ }
+ $horizon = $this->_checkLocation($location);
+ $result = clone $this;
+ $result->set($this->calcSun($location, $horizon, true), 'Zend_Date::TIMESTAMP');
+ $suninfo['sunrise'][$location['horizon']] = $result;
+ $result = clone $this;
+ $result->set($this->calcSun($location, $horizon, false), 'Zend_Date::TIMESTAMP');
+ $suninfo['sunset'][$location['horizon']] = $result;
+ }
+ return $suninfo;
+ }
+
+
+ /**
+ * Check a given year for leap year.
+ *
+ * @param integer|Zend_Date $year Year to check
+ * @return boolean
+ */
+ public static function checkLeapYear($year)
+ {
+ if ($year instanceof Zend_Date) {
+ $year = (int) $year->get(Zend_Date::YEAR);
+ }
+ if (!is_numeric($year)) {
+ throw new Zend_Date_Exception("year ($year) has to be integer for isLeapYear()", $year);
+ }
+
+ return (bool) parent::isYearLeapYear($year);
+ }
+
+
+ /**
+ * Returns true, if the year is a leap year.
+ *
+ * @return boolean
+ */
+ public function isLeapYear()
+ {
+ return self::checkLeapYear($this);
+ }
+
+
+ /**
+ * Returns if the set date is todays date
+ *
+ * @return boolean
+ */
+ public function isToday()
+ {
+ $today = $this->date('Ymd', $this->_getTime());
+ $day = $this->date('Ymd', $this->getUnixTimestamp());
+ return ($today == $day);
+ }
+
+
+ /**
+ * Returns if the set date is yesterdays date
+ *
+ * @return boolean
+ */
+ public function isYesterday()
+ {
+ list($year, $month, $day) = explode('-', $this->date('Y-m-d', $this->_getTime()));
+ // adjusts for leap days and DST changes that are timezone specific
+ $yesterday = $this->date('Ymd', $this->mktime(0, 0, 0, $month, $day -1, $year));
+ $day = $this->date('Ymd', $this->getUnixTimestamp());
+ return $day == $yesterday;
+ }
+
+
+ /**
+ * Returns if the set date is tomorrows date
+ *
+ * @return boolean
+ */
+ public function isTomorrow()
+ {
+ list($year, $month, $day) = explode('-', $this->date('Y-m-d', $this->_getTime()));
+ // adjusts for leap days and DST changes that are timezone specific
+ $tomorrow = $this->date('Ymd', $this->mktime(0, 0, 0, $month, $day +1, $year));
+ $day = $this->date('Ymd', $this->getUnixTimestamp());
+ return $day == $tomorrow;
+ }
+
+
+ /**
+ * Returns the actual date as new date object
+ *
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ */
+ public static function now($locale = null)
+ {
+ return new Zend_Date(time(), Zend_Date::TIMESTAMP, $locale);
+ }
+
+
+ /**
+ * Calculate date details
+ *
+ * @param string $calc Calculation to make
+ * @param string|integer|Zend_Date $date Date or Part to calculate
+ * @param string $part Datepart for Calculation
+ * @param string|Zend_Locale $locale Locale for parsing input
+ * @return integer|string new date
+ * @throws Zend_Date_Exception
+ */
+ private function _calcdetail($calc, $date, $type, $locale)
+ {
+ switch($calc) {
+ case 'set' :
+ return $this->set($date, $type, $locale);
+ break;
+ case 'add' :
+ return $this->add($date, $type, $locale);
+ break;
+ case 'sub' :
+ return $this->sub($date, $type, $locale);
+ break;
+ }
+ return $this->compare($date, $type, $locale);
+ }
+
+ /**
+ * Internal calculation, returns the requested date type
+ *
+ * @param string $calc Calculation to make
+ * @param string|integer|Zend_Date $value Datevalue to calculate with, if null the actual value is taken
+ * @param string|Zend_Locale $locale Locale for parsing input
+ * @return integer|Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ private function _calcvalue($calc, $value, $type, $parameter, $locale)
+ {
+ if (is_null($value)) {
+ throw new Zend_Date_Exception("parameter $type must be set, null is not allowed");
+ }
+
+ if ($locale === null) {
+ $locale = $this->getLocale();
+ }
+
+ if ($value instanceof Zend_Date) {
+ // extract year from object
+ $year = $value->get($parameter, $locale);
+ } else if (!is_numeric($value) && ($type != 'iso') && ($type != 'arpa')) {
+ throw new Zend_Date_Exception("invalid $type ($value) operand", $value);
+ }
+
+ $return = $this->_calcdetail($calc, $value, $parameter, $locale);
+ if ($calc != 'cmp') {
+ return $this;
+ }
+ return $return;
+ }
+
+
+ /**
+ * Returns only the year from the date object as new object.
+ * For example: 10.May.2000 10:30:00 -> 01.Jan.2000 00:00:00
+ *
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ */
+ public function getYear($locale = null)
+ {
+ return $this->copyPart(Zend_Date::YEAR, $locale);
+ }
+
+
+ /**
+ * Sets a new year
+ * If the year is between 0 and 69, 2000 will be set (2000-2069)
+ * If the year if between 70 and 99, 1999 will be set (1970-1999)
+ * 3 or 4 digit years are set as expected. If you need to set year 0-99
+ * use set() instead.
+ * Returned is the new date object
+ *
+ * @param string|integer|Zend_Date $date Year to set
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function setYear($year, $locale = null)
+ {
+ return $this->_calcvalue('set', $year, 'year', Zend_Date::YEAR, $locale);
+ }
+
+
+ /**
+ * Adds the year to the existing date object
+ * If the year is between 0 and 69, 2000 will be added (2000-2069)
+ * If the year if between 70 and 99, 1999 will be added (1970-1999)
+ * 3 or 4 digit years are added as expected. If you need to add years from 0-99
+ * use add() instead.
+ * Returned is the new date object
+ *
+ * @param string|integer|Zend_Date $date Year to add
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function addYear($year, $locale = null)
+ {
+ return $this->_calcvalue('add', $year, 'year', Zend_Date::YEAR, $locale);
+ }
+
+
+ /**
+ * Subs the year from the existing date object
+ * If the year is between 0 and 69, 2000 will be subtracted (2000-2069)
+ * If the year if between 70 and 99, 1999 will be subtracted (1970-1999)
+ * 3 or 4 digit years are subtracted as expected. If you need to subtract years from 0-99
+ * use sub() instead.
+ * Returned is the new date object
+ *
+ * @param string|integer|Zend_Date $date Year to sub
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function subYear($year, $locale = null)
+ {
+ return $this->_calcvalue('sub', $year, 'year', Zend_Date::YEAR, $locale);
+ }
+
+
+ /**
+ * Compares the year with the existing date object, ignoring other date parts.
+ * For example: 10.03.2000 -> 15.02.2000 -> true
+ * Returns if equal, earlier or later
+ *
+ * @param string|integer|Zend_Date $year Year to compare
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer 0 = equal, 1 = later, -1 = earlier
+ * @throws Zend_Date_Exception
+ */
+ public function compareYear($year, $locale = null)
+ {
+ return $this->_calcvalue('cmp', $year, 'year', Zend_Date::YEAR, $locale);
+ }
+
+
+ /**
+ * Returns only the month from the date object as new object.
+ * For example: 10.May.2000 10:30:00 -> 01.May.1970 00:00:00
+ *
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ */
+ public function getMonth($locale = null)
+ {
+ return $this->copyPart(Zend_Date::MONTH, $locale);
+ }
+
+
+ /**
+ * Returns the calculated month
+ *
+ * @param string $calc Calculation to make
+ * @param string|integer|Zend_Date $month Month to calculate with, if null the actual month is taken
+ * @param string|Zend_Locale $locale Locale for parsing input
+ * @return integer|Zend_Date new time
+ * @throws Zend_Date_Exception
+ */
+ private function _month($calc, $month, $locale)
+ {
+ if (is_null($month)) {
+ throw new Zend_Date_Exception('parameter $month must be set, null is not allowed');
+ }
+
+ if ($locale === null) {
+ $locale = $this->getLocale();
+ }
+
+ if ($month instanceof Zend_Date) {
+ // extract month from object
+ $found = $month->get(Zend_Date::MONTH_SHORT, $locale);
+ } else {
+ if (is_numeric($month)) {
+ $found = $month;
+ } else {
+ $monthlist = Zend_Locale_Data::getContent($locale, 'monthlist', array('gregorian', 'format', 'wide'));
+ $monthlist2 = Zend_Locale_Data::getContent($locale, 'monthlist', array('gregorian', 'format', 'abbreviated'));
+
+ $monthlist = array_merge($monthlist, $monthlist2);
+ $found = 0;
+ $cnt = 0;
+ foreach ($monthlist as $key => $value) {
+ if (strtoupper($value) == strtoupper($month)) {
+ $found = $key + 1;
+ break;
+ }
+ ++$cnt;
+ }
+ if ($found == 0) {
+ foreach ($monthlist2 as $key => $value) {
+ if (strtoupper(substr($value, 0, 1)) == strtoupper($month)) {
+ $found = $key + 1;
+ break;
+ }
+ ++$cnt;
+ }
+ }
+ if ($found == 0) {
+ throw new Zend_Date_Exception("unknown month name ($month)", $month);
+ }
+ }
+ }
+ $return = $this->_calcdetail($calc, $found, Zend_Date::MONTH_SHORT, $locale);
+ if ($calc != 'cmp') {
+ return $this;
+ }
+ return $return;
+ }
+
+
+ /**
+ * Sets a new month
+ * The month can be a number or a string. Setting months lower then 0 and greater then 12
+ * will result in adding or subtracting the relevant year. (12 months equal one year)
+ * If a localized monthname is given it will be parsed with the default locale or the optional
+ * set locale.
+ * Returned is the new date object
+ *
+ * @param string|integer|Zend_Date $month Month to set
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function setMonth($month, $locale = null)
+ {
+ return $this->_month('set', $month, $locale);
+ }
+
+
+ /**
+ * Adds months to the existing date object.
+ * The month can be a number or a string. Adding months lower then 0 and greater then 12
+ * will result in adding or subtracting the relevant year. (12 months equal one year)
+ * If a localized monthname is given it will be parsed with the default locale or the optional
+ * set locale.
+ * Returned is the new date object
+ *
+ * @param string|integer|Zend_Date $month Month to add
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function addMonth($month, $locale = null)
+ {
+ return $this->_month('add', $month, $locale);
+ }
+
+
+ /**
+ * Subtracts months from the existing date object.
+ * The month can be a number or a string. Subtracting months lower then 0 and greater then 12
+ * will result in adding or subtracting the relevant year. (12 months equal one year)
+ * If a localized monthname is given it will be parsed with the default locale or the optional
+ * set locale.
+ * Returned is the new date object
+ *
+ * @param string|integer|Zend_Date $month Month to sub
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function subMonth($month, $locale = null)
+ {
+ return $this->_month('sub', $month, $locale);
+ }
+
+
+ /**
+ * Compares the month with the existing date object, ignoring other date parts.
+ * For example: 10.03.2000 -> 15.03.1950 -> true
+ * Returns if equal, earlier or later
+ *
+ * @param string|integer|Zend_Date $month Month to compare
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer 0 = equal, 1 = later, -1 = earlier
+ * @throws Zend_Date_Exception
+ */
+ public function compareMonth($month, $locale = null)
+ {
+ return $this->_month('cmp', $month, $locale);
+ }
+
+
+ /**
+ * Returns the day as new date object
+ * Example: 20.May.1986 -> 20.Jan.1970 00:00:00
+ *
+ * @param $locale string|Zend_Locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ */
+ public function getDay($locale = null)
+ {
+ return $this->copyPart(Zend_Date::DAY_SHORT, $locale);
+ }
+
+
+ /**
+ * Returns the calculated day
+ *
+ * @param $calc string Type of calculation to make
+ * @param $day string|integer|Zend_Date Day to calculate, when null the actual day is calculated
+ * @param $locale string|Zend_Locale Locale for parsing input
+ * @return Zend_Date|integer
+ */
+ private function _day($calc, $day, $locale)
+ {
+ if (is_null($day)) {
+ throw new Zend_Date_Exception('parameter $day must be set, null is not allowed');
+ }
+
+ if ($locale === null) {
+ $locale = $this->getLocale();
+ }
+
+ if ($day instanceof Zend_Date) {
+ $day = $day->get(Zend_Date::DAY_SHORT, $locale);
+ }
+
+ if (is_numeric($day)) {
+ $type = Zend_Date::DAY_SHORT;
+ } else {
+ switch (strlen($day)) {
+ case 1 :
+ $type = Zend_Date::WEEKDAY_NARROW;
+ break;
+ case 2:
+ $type = Zend_Date::WEEKDAY_NAME;
+ break;
+ case 3:
+ $type = Zend_Date::WEEKDAY_SHORT;
+ break;
+ default:
+ $type = Zend_Date::WEEKDAY;
+ break;
+ }
+ }
+ $return = $this->_calcdetail($calc, $day, $type, $locale);
+ if ($calc != 'cmp') {
+ return $this;
+ }
+ return $return;
+ }
+
+
+ /**
+ * Sets a new day
+ * The day can be a number or a string. Setting days lower then 0 or greater than the number of this months days
+ * will result in adding or subtracting the relevant month.
+ * If a localized dayname is given it will be parsed with the default locale or the optional
+ * set locale.
+ * Returned is the new date object
+ * Example: setDay('Montag', 'de_AT'); will set the monday of this week as day.
+ *
+ * @param string|integer|Zend_Date $month Day to set
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function setDay($day, $locale = null)
+ {
+ return $this->_day('set', $day, $locale);
+ }
+
+
+ /**
+ * Adds days to the existing date object.
+ * The day can be a number or a string. Adding days lower then 0 or greater than the number of this months days
+ * will result in adding or subtracting the relevant month.
+ * If a localized dayname is given it will be parsed with the default locale or the optional
+ * set locale.
+ * Returned is the new date object
+ * Example: addDay('Montag', 'de_AT'); will add the number of days until the next monday
+ *
+ * @param string|integer|Zend_Date $month Day to add
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function addDay($day, $locale = null)
+ {
+ return $this->_day('add', $day, $locale);
+ }
+
+
+ /**
+ * Subtracts days from the existing date object.
+ * The day can be a number or a string. Subtracting days lower then 0 or greater than the number of this months days
+ * will result in adding or subtracting the relevant month.
+ * If a localized dayname is given it will be parsed with the default locale or the optional
+ * set locale.
+ * Returned is the new date object
+ * Example: subDay('Montag', 'de_AT'); will sub the number of days until the previous monday
+ *
+ * @param string|integer|Zend_Date $month Day to sub
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function subDay($day, $locale = null)
+ {
+ return $this->_day('sub', $day, $locale);
+ }
+
+
+ /**
+ * Compares the day with the existing date object, ignoring other date parts.
+ * For example: 'Monday', 'en' -> 08.Jan.2007 -> 0
+ * Returns if equal, earlier or later
+ *
+ * @param string|integer|Zend_Date $day Day to compare
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer 0 = equal, 1 = later, -1 = earlier
+ * @throws Zend_Date_Exception
+ */
+ public function compareDay($day, $locale = null)
+ {
+ return $this->_day('cmp', $day, $locale);
+ }
+
+
+ /**
+ * Returns the weekday as new date object
+ * Weekday is always from 1-7
+ * Example: 09-Jan-2007 -> 2 = Tuesday -> 02-Jan-1970 (when 02.01.1970 is also Tuesday)
+ *
+ * @param $locale string|Zend_Locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ */
+ public function getWeekday($locale = null)
+ {
+ return $this->copyPart(Zend_Date::WEEKDAY, $locale);
+ }
+
+
+ /**
+ * Returns the calculated weekday
+ *
+ * @param $calc string Type of calculation to make
+ * @param $weekday string|integer|Zend_Date Weekday to calculate, when null the actual weekday is calculated
+ * @param $locale string|Zend_Locale Locale for parsing input
+ * @return Zend_Date|integer
+ * @throws Zend_Date_Exception
+ */
+ private function _weekday($calc, $weekday, $locale)
+ {
+ if (is_null($weekday)) {
+ throw new Zend_Date_Exception('parameter $weekday must be set, null is not allowed');
+ }
+
+ if ($locale === null) {
+ $locale = $this->getLocale();
+ }
+
+ if ($weekday instanceof Zend_Date) {
+ $weekday = $weekday->get(Zend_Date::WEEKDAY_DIGIT, $locale);
+ }
+
+ if (is_numeric($weekday)) {
+ $type = Zend_Date::WEEKDAY_DIGIT;
+ } else {
+ switch(strlen($weekday)) {
+ case 1:
+ $type = Zend_Date::WEEKDAY_NARROW;
+ break;
+ case 2:
+ $type = Zend_Date::WEEKDAY_NAME;
+ break;
+ case 3:
+ $type = Zend_Date::WEEKDAY_SHORT;
+ break;
+ default:
+ $type = Zend_Date::WEEKDAY;
+ break;
+ }
+ }
+ $return = $this->_calcdetail($calc, $weekday, $type, $locale);
+ if ($calc != 'cmp') {
+ return $this;
+ }
+ return $return;
+ }
+
+
+ /**
+ * Sets a new weekday
+ * The weekday can be a number or a string. If a localized weekday name is given,
+ * then it will be parsed as a date in $locale (defaults to the same locale as $this).
+ * Returned is the new date object.
+ * Example: setWeekday(3); will set the wednesday of this week as day.
+ *
+ * @param string|integer|Zend_Date $month Weekday to set
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function setWeekday($weekday, $locale = null)
+ {
+ return $this->_weekday('set', $weekday, $locale);
+ }
+
+
+ /**
+ * Adds weekdays to the existing date object.
+ * The weekday can be a number or a string.
+ * If a localized dayname is given it will be parsed with the default locale or the optional
+ * set locale.
+ * Returned is the new date object
+ * Example: addWeekday(3); will add the difference of days from the begining of the month until
+ * wednesday.
+ *
+ * @param string|integer|Zend_Date $month Weekday to add
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function addWeekday($weekday, $locale = null)
+ {
+ return $this->_weekday('add', $weekday, $locale);
+ }
+
+
+ /**
+ * Subtracts weekdays from the existing date object.
+ * The weekday can be a number or a string.
+ * If a localized dayname is given it will be parsed with the default locale or the optional
+ * set locale.
+ * Returned is the new date object
+ * Example: subWeekday(3); will subtract the difference of days from the begining of the month until
+ * wednesday.
+ *
+ * @param string|integer|Zend_Date $month Weekday to sub
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function subWeekday($weekday, $locale = null)
+ {
+ return $this->_weekday('sub', $weekday, $locale);
+ }
+
+
+ /**
+ * Compares the weekday with the existing date object, ignoring other date parts.
+ * For example: 'Monday', 'en' -> 08.Jan.2007 -> 0
+ * Returns if equal, earlier or later
+ *
+ * @param string|integer|Zend_Date $weekday Weekday to compare
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer 0 = equal, 1 = later, -1 = earlier
+ * @throws Zend_Date_Exception
+ */
+ public function compareWeekday($weekday, $locale = null)
+ {
+ return $this->_weekday('cmp', $weekday, $locale);
+ }
+
+
+ /**
+ * Returns the day of year as new date object
+ * Example: 02.Feb.1986 10:00:00 -> 02.Feb.1970 00:00:00
+ *
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ */
+ public function getDayOfYear($locale = null)
+ {
+ return $this->copyPart(Zend_Date::DAY_OF_YEAR, $locale);
+ }
+
+
+ /**
+ * Sets a new day of year
+ * The day of year is always a number.
+ * Returned is the new date object
+ * Example: 04.May.2004 -> setDayOfYear(10) -> 10.Jan.2004
+ *
+ * @param string|integer|Zend_Date $day Day of Year to set
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function setDayOfYear($day, $locale = null)
+ {
+ return $this->_calcvalue('set', $day, 'day of year', Zend_Date::DAY_OF_YEAR, $locale);
+ }
+
+
+ /**
+ * Adds a day of year to the existing date object.
+ * The day of year is always a number.
+ * Returned is the new date object
+ * Example: addDayOfYear(10); will add 10 days to the existing date object.
+ *
+ * @param string|integer|Zend_Date $day Day of Year to add
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function addDayOfYear($day, $locale = null)
+ {
+ return $this->_calcvalue('add', $day, 'day of year', Zend_Date::DAY_OF_YEAR, $locale);
+ }
+
+
+ /**
+ * Subtracts a day of year from the existing date object.
+ * The day of year is always a number.
+ * Returned is the new date object
+ * Example: subDayOfYear(10); will subtract 10 days from the existing date object.
+ *
+ * @param string|integer|Zend_Date $day Day of Year to sub
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function subDayOfYear($day, $locale = null)
+ {
+ return $this->_calcvalue('sub', $day, 'day of year', Zend_Date::DAY_OF_YEAR, $locale);
+ }
+
+
+ /**
+ * Compares the day of year with the existing date object.
+ * For example: compareDayOfYear(33) -> 02.Feb.2007 -> 0
+ * Returns if equal, earlier or later
+ *
+ * @param string|integer|Zend_Date $day Day of Year to compare
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer 0 = equal, 1 = later, -1 = earlier
+ * @throws Zend_Date_Exception
+ */
+ public function compareDayOfYear($day, $locale = null)
+ {
+ return $this->_calcvalue('cmp', $day, 'day of year', Zend_Date::DAY_OF_YEAR, $locale);
+ }
+
+
+ /**
+ * Returns the hour as new date object
+ * Example: 02.Feb.1986 10:30:25 -> 01.Jan.1970 10:00:00
+ *
+ * @param $locale string|Zend_Locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ */
+ public function getHour($locale = null)
+ {
+ return $this->copyPart(Zend_Date::HOUR, $locale);
+ }
+
+
+ /**
+ * Sets a new hour
+ * The hour is always a number.
+ * Returned is the new date object
+ * Example: 04.May.1993 13:07:25 -> setHour(7); -> 04.May.1993 07:07:25
+ *
+ * @param string|integer|Zend_Date $hour Hour to set
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function setHour($hour, $locale = null)
+ {
+ return $this->_calcvalue('set', $hour, 'hour', Zend_Date::HOUR_SHORT, $locale);
+ }
+
+
+ /**
+ * Adds hours to the existing date object.
+ * The hour is always a number.
+ * Returned is the new date object
+ * Example: 04.May.1993 13:07:25 -> addHour(12); -> 05.May.1993 01:07:25
+ *
+ * @param string|integer|Zend_Date $hour Hour to add
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function addHour($hour, $locale = null)
+ {
+ return $this->_calcvalue('add', $hour, 'hour', Zend_Date::HOUR_SHORT, $locale);
+ }
+
+
+ /**
+ * Subtracts hours from the existing date object.
+ * The hour is always a number.
+ * Returned is the new date object
+ * Example: 04.May.1993 13:07:25 -> subHour(6); -> 05.May.1993 07:07:25
+ *
+ * @param string|integer|Zend_Date $hour Hour to sub
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function subHour($hour, $locale = null)
+ {
+ return $this->_calcvalue('sub', $hour, 'hour', Zend_Date::HOUR_SHORT, $locale);
+ }
+
+
+ /**
+ * Compares the hour with the existing date object.
+ * For example: 10:30:25 -> compareHour(10) -> 0
+ * Returns if equal, earlier or later
+ *
+ * @param string|integer|Zend_Date $hour Hour to compare
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer 0 = equal, 1 = later, -1 = earlier
+ * @throws Zend_Date_Exception
+ */
+ public function compareHour($hour, $locale = null)
+ {
+ return $this->_calcvalue('cmp', $hour, 'hour', Zend_Date::HOUR_SHORT, $locale);
+ }
+
+
+ /**
+ * Returns the minute as new date object
+ * Example: 02.Feb.1986 10:30:25 -> 01.Jan.1970 00:30:00
+ *
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ */
+ public function getMinute($locale = null)
+ {
+ return $this->copyPart(Zend_Date::MINUTE, $locale);
+ }
+
+
+ /**
+ * Sets a new minute
+ * The minute is always a number.
+ * Returned is the new date object
+ * Example: 04.May.1993 13:07:25 -> setMinute(29); -> 04.May.1993 13:29:25
+ *
+ * @param string|integer|Zend_Date $minute Minute to set
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function setMinute($minute, $locale = null)
+ {
+ return $this->_calcvalue('set', $minute, 'minute', Zend_Date::MINUTE_SHORT, $locale);
+ }
+
+
+ /**
+ * Adds minutes to the existing date object.
+ * The minute is always a number.
+ * Returned is the new date object
+ * Example: 04.May.1993 13:07:25 -> addMinute(65); -> 04.May.1993 13:12:25
+ *
+ * @param string|integer|Zend_Date $minute Minute to add
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function addMinute($minute, $locale = null)
+ {
+ return $this->_calcvalue('add', $minute, 'minute', Zend_Date::MINUTE_SHORT, $locale);
+ }
+
+
+ /**
+ * Subtracts minutes from the existing date object.
+ * The minute is always a number.
+ * Returned is the new date object
+ * Example: 04.May.1993 13:07:25 -> subMinute(9); -> 04.May.1993 12:58:25
+ *
+ * @param string|integer|Zend_Date $minute Minute to sub
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function subMinute($minute, $locale = null)
+ {
+ return $this->_calcvalue('sub', $minute, 'minute', Zend_Date::MINUTE_SHORT, $locale);
+ }
+
+
+ /**
+ * Compares the minute with the existing date object.
+ * For example: 10:30:25 -> compareMinute(30) -> 0
+ * Returns if equal, earlier or later
+ *
+ * @param string|integer|Zend_Date $minute Hour to compare
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer 0 = equal, 1 = later, -1 = earlier
+ * @throws Zend_Date_Exception
+ */
+ public function compareMinute($minute, $locale = null)
+ {
+ return $this->_calcvalue('cmp', $minute, 'minute', Zend_Date::MINUTE_SHORT, $locale);
+ }
+
+
+ /**
+ * Returns the second as new date object
+ * Example: 02.Feb.1986 10:30:25 -> 01.Jan.1970 00:00:25
+ *
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ */
+ public function getSecond($locale = null)
+ {
+ return $this->copyPart(Zend_Date::SECOND, $locale);
+ }
+
+
+ /**
+ * Sets new seconds to the existing date object.
+ * The second is always a number.
+ * Returned is the new date object
+ * Example: 04.May.1993 13:07:25 -> setSecond(100); -> 04.May.1993 13:08:40
+ *
+ * @param string|integer|Zend_Date $second Second to set
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function setSecond($second, $locale = null)
+ {
+ return $this->_calcvalue('set', $second, 'second', Zend_Date::SECOND_SHORT, $locale);
+ }
+
+
+ /**
+ * Adds seconds to the existing date object.
+ * The second is always a number.
+ * Returned is the new date object
+ * Example: 04.May.1993 13:07:25 -> addSecond(65); -> 04.May.1993 13:08:30
+ *
+ * @param string|integer|Zend_Date $second Second to add
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function addSecond($second, $locale = null)
+ {
+ return $this->_calcvalue('add', $second, 'second', Zend_Date::SECOND_SHORT, $locale);
+ }
+
+
+ /**
+ * Subtracts seconds from the existing date object.
+ * The second is always a number.
+ * Returned is the new date object
+ * Example: 04.May.1993 13:07:25 -> subSecond(10); -> 04.May.1993 13:07:15
+ *
+ * @param string|integer|Zend_Date $second Second to sub
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date new date
+ * @throws Zend_Date_Exception
+ */
+ public function subSecond($second, $locale = null)
+ {
+ return $this->_calcvalue('sub', $second, 'second', Zend_Date::SECOND_SHORT, $locale);
+ }
+
+
+ /**
+ * Compares the second with the existing date object.
+ * For example: 10:30:25 -> compareSecond(25) -> 0
+ * Returns if equal, earlier or later
+ *
+ * @param string|integer|Zend_Date $second Second to compare
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer 0 = equal, 1 = later, -1 = earlier
+ * @throws Zend_Date_Exception
+ */
+ public function compareSecond($second, $locale = null)
+ {
+ return $this->_calcvalue('cmp', $second, 'second', Zend_Date::SECOND_SHORT, $locale);
+ }
+
+
+ /**
+ * Returns the precision for fractional seconds
+ *
+ * @return integer
+ */
+ public function getFractionalPrecision()
+ {
+ return $this->_Precision;
+ }
+
+
+ /**
+ * Sets a new precision for fractional seconds
+ *
+ * @param integer $precision Precision for the fractional datepart 3 = milliseconds
+ * @throws Zend_Date_Exception
+ */
+ public function setFractionalPrecision($precision)
+ {
+ if (!intval($precision) or ($precision < 0) or ($precision > 9)) {
+ throw new Zend_Date_Exception("precision ($precision) must be a positive integer less than 10", $precision);
+ }
+ $this->_Precision = (int) $precision;
+ }
+
+
+ /**
+ * Returns the milliseconds of the date object
+ *
+ * @return integer
+ */
+ public function getMilliSecond()
+ {
+ return $this->_Fractional;
+ }
+
+
+ /**
+ * Sets new milliseconds for the date object
+ * Example: setMilliSecond(550, 2) -> equals +5 Sec +50 MilliSec
+ *
+ * @param integer|Zend_Date $milli OPTIONAL Millisecond to set, when null the actual millisecond is set
+ * @param integer $precision OPTIONAL Fraction precision of the given milliseconds
+ * @return integer|string
+ */
+ public function setMilliSecond($milli = null, $precision = null)
+ {
+ if ($milli === null) {
+ list($milli, $time) = explode(" ", microtime());
+ $milli = intval($milli);
+ $precision = 6;
+ } else if (!is_numeric($milli)) {
+ throw new Zend_Date_Exception("invalid milli second ($milli) operand", $milli);
+ }
+
+ if ($precision === null) {
+ $precision = $this->_Precision;
+ } else if (!is_int($precision) || $precision < 1 || $precision > 9) {
+ throw new Zend_Date_Exception("precision ($precision) must be a positive integer less than 10", $precision);
+ }
+
+ $this->_Fractional = 0;
+ $this->addMilliSecond($milli, $precision);
+ return $this->_Fractional;
+ }
+
+
+ /**
+ * Adds milliseconds to the date object
+ *
+ * @param integer|Zend_Date $milli OPTIONAL Millisecond to add, when null the actual millisecond is added
+ * @param integer $precision OPTIONAL Fractional precision for the given milliseconds
+ * @return integer|string
+ */
+ public function addMilliSecond($milli = null, $precision = null)
+ {
+ if ($milli === null) {
+ list($milli, $time) = explode(" ", microtime());
+ $milli = intval($milli);
+ } else if (!is_numeric($milli)) {
+ throw new Zend_Date_Exception("invalid milli second ($milli) operand", $milli);
+ }
+
+ if ($precision === null) {
+ $precision = $this->_Precision;
+ } else if (!is_int($precision) || $precision < 1 || $precision > 9) {
+ throw new Zend_Date_Exception("precision ($precision) must be a positive integer less than 10", $precision);
+ }
+
+ if ($precision != $this->_Precision) {
+ if ($precision > $this->_Precision) {
+ $diff = $precision - $this->_Precision;
+ $milli = (int) ($milli / (10 * $diff));
+ } else {
+ $diff = $this->_Precision - $precision;
+ $milli = (int) ($milli * (10 * $diff));
+ }
+ }
+
+ $this->_Fractional += $milli;
+ // add/sub milliseconds + add/sub seconds
+
+ $max = pow(10, $this->_Precision);
+ // milli includes seconds
+ if ($this->_Fractional > $max) {
+ while ($this->_Fractional > $max) {
+ $this->addSecond(1);
+ $this->_Fractional -= $max;
+ }
+ }
+
+ if ($this->_Fractional < 0) {
+ while ($this->_Fractional < 0) {
+ $this->subSecond(1);
+ $this->_Fractional += $max;
+ }
+ }
+ return $this->_Fractional;
+ }
+
+
+ /**
+ * Subtracts a millisecond
+ *
+ * @param integer|Zend_Date $milli OPTIONAL Millisecond to sub, when null the actual millisecond is subtracted
+ * @param integer $precision OPTIONAL Fractional precision for the given milliseconds
+ * @return integer
+ */
+ public function subMilliSecond($milli = null, $precision = null)
+ {
+ return $this->addMilliSecond(0 - $milli);
+ }
+
+
+ /**
+ * Compares only the millisecond part, returning the difference
+ *
+ * @param integer|Zend_Date $milli OPTIONAL Millisecond to compare, when null the actual millisecond is compared
+ * @param integer $precision OPTIONAL Fractional precision for the given milliseconds
+ * @return integer
+ */
+ public function compareMilliSecond($milli = null, $precision = null)
+ {
+ if ($milli === null) {
+ list($milli, $time) = explode(" ", microtime());
+ $milli = intval($milli);
+ } else if (!is_numeric($milli)) {
+ throw new Zend_Date_Exception("invalid milli second ($milli) operand", $milli);
+ }
+
+ if ($precision === null) {
+ $precision = $this->_Precision;
+ } else if (!is_int($precision) || $precision < 1 || $precision > 9) {
+ throw new Zend_Date_Exception("precision ($precision) must be a positive integer less than 10", $precision);
+ }
+
+ if ($precision === 0) {
+ throw new Zend_Date_Exception('precision is 0');
+ }
+
+ if ($precision != $this->_Precision) {
+ if ($precision > $this->_Precision) {
+ $diff = $precision - $this->_Precision;
+ $milli = (int) ($milli / (10 * $diff));
+ } else {
+ $diff = $this->_Precision - $precision;
+ $milli = (int) ($milli * (10 * $diff));
+ }
+ }
+
+ $comp = $this->_Fractional - $milli;
+ if ($comp < 0) {
+ return -1;
+ } else if ($comp > 0) {
+ return 1;
+ }
+ return 0;
+ }
+
+
+ /**
+ * Returns the week as new date object using monday as begining of the week
+ * Example: 12.Jan.2007 -> 08.Jan.1970 00:00:00
+ *
+ * @param $locale string|Zend_Locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ */
+ public function getWeek($locale = null)
+ {
+ return $this->copyPart(Zend_Date::WEEK, $locale);
+ }
+
+
+ /**
+ * Sets a new week. The week is always a number. The day of week is not changed.
+ * Returned is the new date object
+ * Example: 09.Jan.2007 13:07:25 -> setWeek(1); -> 02.Jan.2007 13:07:25
+ *
+ * @param string|integer|Zend_Date $week Week to set
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ * @throws Zend_Date_Exception
+ */
+ public function setWeek($week, $locale = null)
+ {
+ return $this->_calcvalue('set', $week, 'week', Zend_Date::WEEK, $locale);
+ }
+
+
+ /**
+ * Adds a week. The week is always a number. The day of week is not changed.
+ * Returned is the new date object
+ * Example: 09.Jan.2007 13:07:25 -> addWeek(1); -> 16.Jan.2007 13:07:25
+ *
+ * @param string|integer|Zend_Date $week Week to add
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ * @throws Zend_Date_Exception
+ */
+ public function addWeek($week, $locale = null)
+ {
+ return $this->_calcvalue('add', $week, 'week', Zend_Date::WEEK, $locale);
+ }
+
+
+ /**
+ * Subtracts a week. The week is always a number. The day of week is not changed.
+ * Returned is the new date object
+ * Example: 09.Jan.2007 13:07:25 -> subWeek(1); -> 02.Jan.2007 13:07:25
+ *
+ * @param string|integer|Zend_Date $week Week to sub
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return Zend_Date
+ * @throws Zend_Date_Exception
+ */
+ public function subWeek($week, $locale = null)
+ {
+ return $this->_calcvalue('sub', $week, 'week', Zend_Date::WEEK, $locale);
+ }
+
+
+ /**
+ * Compares only the week part, returning the difference
+ * Returned is the new date object
+ * Returns if equal, earlier or later
+ * Example: 09.Jan.2007 13:07:25 -> compareWeek(2); -> 0
+ *
+ * @param string|integer|Zend_Date $week Week to compare
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return integer 0 = equal, 1 = later, -1 = earlier
+ * @throws Zend_Date_Exception
+ */
+ public function compareWeek($week, $locale = null)
+ {
+ return $this->_calcvalue('cmp', $week, 'week', Zend_Date::WEEK, $locale);
+ }
+
+
+ /**
+ * Sets a new standard locale for the date object.
+ * This locale will be used for all functions
+ * Returned is the really set locale.
+ * Example: 'de_XX' will be set to 'de' because 'de_XX' does not exist
+ * 'xx_YY' will be set to 'root' because 'xx' does not exist
+ *
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input
+ * @return string
+ */
+ public function setLocale($locale = null)
+ {
+ if ($locale instanceof Zend_Locale) {
+ $this->_Locale = $locale;
+ } else if (!$locale = Zend_Locale::isLocale($locale, true)) {
+ throw new Zend_Date_Exception("Given locale ($locale) does not exist", $locale);
+ } else {
+ $this->_Locale = new Zend_Locale($locale);
+ }
+ return $this->getLocale();
+ }
+
+
+ /**
+ * Returns the actual set locale
+ *
+ * @return string
+ */
+ public function getLocale()
+ {
+ return $this->_Locale->toString();
+ }
+
+
+ /**
+ * Checks if the given date is a real date or datepart.
+ * Returns false is a expected datepart is missing or a datepart exceeds its possible border.
+ * But the check will only be done for the expected dateparts which are given by format.
+ * If no format is given the standard dateformat for the actual locale is used.
+ * f.e. 30.February.2007 will return false if format is 'dd.MMMM.YYYY'
+ *
+ * @param string $date Date to parse for correctness
+ * @param string $format OPTIONAL Format for parsing the date string
+ * @param string|Zend_Locale $locale OPTIONAL Locale for parsing date parts
+ * @return boolean True when all date parts are correct
+ */
+ public static function isDate($date, $format = null, $locale = null)
+ {
+ if (Zend_Locale::isLocale($format)) {
+ $locale = $format;
+ $format = null;
+ }
+
+ if ($locale === null) {
+ $locale = new Zend_Locale();
+ $locale = $locale->toString();
+ }
+
+ if ($format === null) {
+ $format = Zend_Locale_Format::getDateFormat($locale);
+ } else if (self::$_Options['format_type'] == 'php') {
+ $format = Zend_Locale_Format::convertPhpToIsoFormat($format);
+ }
+
+ try {
+ $parsed = Zend_Locale_Format::getDate($date, array('locale' => $locale, 'date_format' => $format, 'format_type' => 'iso', 'fix_date' => false));
+ } catch (Zend_Locale_Exception $e) {
+ // date can not be parsed
+ return false;
+ }
+
+ if (((strpos($format, 'Y') !== false) or (strpos($format, 'y') !== false)) and (!isset($parsed['year']))) {
+ // year expected but not found
+ return false;
+ }
+ if ((strpos($format, 'M') !== false) and (!isset($parsed['month']))) {
+ // month expected but not found
+ return false;
+ }
+ if ((strpos($format, 'd') !== false) and (!isset($parsed['day']))) {
+ // day expected but not found
+ return false;
+ }
+ if (((strpos($format, 'H') !== false) or (strpos($format, 'h') !== false)) and (!isset($parsed['hour']))) {
+ // hour expected but not found
+ return false;
+ }
+ if ((strpos($format, 'm') !== false) and (!isset($parsed['minute']))) {
+ // minute expected but not found
+ return false;
+ }
+ if ((strpos($format, 's') !== false) and (!isset($parsed['second']))) {
+ // second expected but not found
+ return false;
+ }
+
+ // set not given dateparts
+ if (!isset($parsed['hour'])) {
+ $parsed['hour'] = 0;
+ }
+ if (!isset($parsed['minute'])) {
+ $parsed['minute'] = 0;
+ }
+ if (!isset($parsed['second'])) {
+ $parsed['second'] = 0;
+ }
+ if (!isset($parsed['month'])) {
+ $parsed['month'] = 1;
+ }
+ if (!isset($parsed['day'])) {
+ $parsed['day'] = 1;
+ }
+ if (!isset($parsed['year'])) {
+ $parsed['year'] = 1970;
+ }
+ $date = new Zend_Date($locale);
+ $timestamp = $date->mktime($parsed['hour'], $parsed['minute'], $parsed['second'],
+ $parsed['month'], $parsed['day'], $parsed['year']);
+
+ if ($parsed['year'] != $date->date('Y', $timestamp)) {
+ // given year differs from parsed year
+ return false;
+ }
+ if ($parsed['month'] != $date->date('n', $timestamp)) {
+ // given month differs from parsed month
+ return false;
+ }
+ if ($parsed['day'] != $date->date('j', $timestamp)) {
+ // given day differs from parsed day
+ return false;
+ }
+ if ($parsed['hour'] != $date->date('G', $timestamp)) {
+ // given hour differs from parsed hour
+ return false;
+ }
+ if ($parsed['minute'] != $date->date('i', $timestamp)) {
+ // given minute differs from parsed minute
+ return false;
+ }
+ if ($parsed['second'] != $date->date('s', $timestamp)) {
+ // given second differs from parsed second
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/libs/Zend/Date/Cities.php b/libs/Zend/Date/Cities.php
new file mode 100755
index 0000000000..a6e1ccd939
--- /dev/null
+++ b/libs/Zend/Date/Cities.php
@@ -0,0 +1,315 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Date
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: DateObject.php 2511 2006-12-26 22:54:37Z bkarwin $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Additional data for sunset/sunrise calculations
+ * Holds the geographical data for all capital cities and many others worldwide
+ * Original data from http://www.fallingrain.com/world/
+ *
+ * @category Zend
+ * @package Zend_Date
+ * @subpackage Zend_Date_Cities
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Date_Cities {
+
+ public static $Cities = array(
+ 'Abidjan' => array('latitude' => 5.3411111, 'longitude' => -4.0280556),
+ 'Abu Dhabi' => array('latitude' => 24.4666667, 'longitude' => 54.3666667),
+ 'Abuja' => array('latitude' => 9.1758333, 'longitude' => 7.1808333),
+ 'Accra' => array('latitude' => 5.55, 'longitude' => -0.2166667),
+ 'Adamstown' => array('latitude' => -25.0666667, 'longitude' => -130.0833333),
+ 'Addis Ababa' => array('latitude' => 9.0333333, 'longitude' => 38.7),
+ 'Adelaide' => array('latitude' => -34.9333333, 'longitude' => 138.6),
+ 'Algiers' => array('latitude' => 36.7630556, 'longitude' => 3.0505556),
+ 'Alofi' => array('latitude' => -19.0166667, 'longitude' => -169.9166667),
+ 'Amman' => array('latitude' => 31.95, 'longitude' => 35.9333333),
+ 'Amsterdam' => array('latitude' => 52.35, 'longitude' => 4.9166667),
+ 'Andorra la Vella' => array('latitude' => 42.5, 'longitude' => 1.5166667),
+ 'Ankara' => array('latitude' => 39.9272222, 'longitude' => 32.8644444),
+ 'Antananarivo' => array('latitude' => -18.9166667, 'longitude' => 47.5166667),
+ 'Apia' => array('latitude' => -13.8333333, 'longitude' => -171.7333333),
+ 'Ashgabat' => array('latitude' => 37.95, 'longitude' => 58.3833333),
+ 'Asmara' => array('latitude' => 15.3333333, 'longitude' => 38.9333333),
+ 'Astana' => array('latitude' => 51.1811111, 'longitude' => 71.4277778),
+ 'Asunción' => array('latitude' => -25.2666667, 'longitude' => -57.6666667),
+ 'Athens' => array('latitude' => 37.9833333, 'longitude' => 23.7333333),
+ 'Auckland' => array('latitude' => -36.8666667, 'longitude' => 174.7666667),
+ 'Avarua' => array('latitude' => -21.2, 'longitude' => -159.7666667),
+ 'Baghdad' => array('latitude' => 33.3386111, 'longitude' => 44.3938889),
+ 'Baku' => array('latitude' => 40.3952778, 'longitude' => 49.8822222),
+ 'Bamako' => array('latitude' => 12.65, 'longitude' => -8),
+ 'Bandar Seri Begawan' => array('latitude' => 4.8833333, 'longitude' => 114.9333333),
+ 'Bankok' => array('latitude' => 13.5833333, 'longitude' => 100.2166667),
+ 'Bangui' => array('latitude' => 4.3666667, 'longitude' => 18.5833333),
+ 'Banjul' => array('latitude' => 13.4530556, 'longitude' => -16.5775),
+ 'Basel' => array('latitude' => 47.5666667, 'longitude' => 7.6),
+ 'Basseterre' => array('latitude' => 17.3, 'longitude' => -62.7166667),
+ 'Beijing' => array('latitude' => 39.9288889, 'longitude' => 116.3883333),
+ 'Beirut' => array('latitude' => 33.8719444, 'longitude' => 35.5097222),
+ 'Belgrade' => array('latitude' => 44.8186111, 'longitude' => 20.4680556),
+ 'Belmopan' => array('latitude' => 17.25, 'longitude' => -88.7666667),
+ 'Berlin' => array('latitude' => 52.5166667, 'longitude' => 13.4),
+ 'Bern' => array('latitude' => 46.9166667, 'longitude' => 7.4666667),
+ 'Bishkek' => array('latitude' => 42.8730556, 'longitude' => 74.6002778),
+ 'Bissau' => array('latitude' => 11.85, 'longitude' => -15.5833333),
+ 'Bloemfontein' => array('latitude' => -29.1333333, 'longitude' => 26.2),
+ 'Bogotá' => array('latitude' => 4.6, 'longitude' => -74.0833333),
+ 'Brasilia' => array('latitude' => -15.7833333, 'longitude' => -47.9166667),
+ 'Bratislava' => array('latitude' => 48.15, 'longitude' => 17.1166667),
+ 'Brazzaville' => array('latitude' => -4.2591667, 'longitude' => 15.2847222),
+ 'Bridgetown' => array('latitude' => 13.1, 'longitude' => -59.6166667),
+ 'Brisbane' => array('latitude' => -27.5, 'longitude' => 153.0166667),
+ 'Brussels' => array('latitude' => 50.8333333, 'longitude' => 4.3333333),
+ 'Bucharest' => array('latitude' => 44.4333333, 'longitude' => 26.1),
+ 'Budapest' => array('latitude' => 47.5, 'longitude' => 19.0833333),
+ 'Buenos Aires' => array('latitude' => -34.5875, 'longitude' => -58.6725),
+ 'Bujumbura' => array('latitude' => -3.3761111, 'longitude' => 29.36),
+ 'Cairo' => array('latitude' => 30.05, 'longitude' => 31.25),
+ 'Calgary' => array('latitude' => 51.0833333, 'longitude' => -114.0833333),
+ 'Canberra' => array('latitude' => -35.2833333, 'longitude' => 149.2166667),
+ 'Cape Town' => array('latitude' => -33.9166667, 'longitude' => 18.4166667),
+ 'Caracas' => array('latitude' => 10.5, 'longitude' => -66.9166667),
+ 'Castries' => array('latitude' => 14, 'longitude' => -61),
+ 'Charlotte Amalie' => array('latitude' => 18.34389, 'longitude' => -64.93111),
+ 'Chicago' => array('latitude' => 41.85, 'longitude' => -87.65),
+ 'Chisinau' => array('latitude' => 47.055556, 'longitude' => 28.8575),
+ 'Cockburn Town' => array('latitude' => 21.4666667, 'longitude' => -71.1333333),
+ 'Colombo' => array('latitude' => 6.9319444, 'longitude' => 79.8477778),
+ 'Conakry' => array('latitude' => 9.5091667, 'longitude' => -13.7122222),
+ 'Copenhagen' => array('latitude' => 55.6666667, 'longitude' => 12.5833333),
+ 'Cotonou' => array('latitude' => 6.35, 'longitude' => 2.4333333),
+ 'Dakar' => array('latitude' => 14.6708333, 'longitude' => -17.4380556),
+ 'Damascus' => array('latitude' => 33.5, 'longitude' => 36.3),
+ 'Dar es Salaam' => array('latitude' => -6.8, 'longitude' => 39.2833333),
+ 'Dhaka' => array('latitude' => 23.7230556, 'longitude' => 90.4086111),
+ 'Dili' => array('latitude' => -8.5586111, 'longitude' => 125.5736111),
+ 'Djibouti' => array('latitude' => 11.595, 'longitude' => 43.1480556),
+ 'Dodoma' => array('latitude' => -6.1833333, 'longitude' => 35.75),
+ 'Doha' => array('latitude' => 25.2866667, 'longitude' => 51.5333333),
+ 'Dubai' => array('latitude' => 25.2522222, 'longitude' => 55.28),
+ 'Dublin' => array('latitude' => 53.3330556, 'longitude' => -6.2488889),
+ 'Dushanbe' => array('latitude' => 38.56, 'longitude' => 68.7738889 ),
+ 'Fagatogo' => array('latitude' => -14.2825, 'longitude' => -170.69),
+ 'Fongafale' => array('latitude' => -8.5166667, 'longitude' => 179.2166667),
+ 'Freetown' => array('latitude' => 8.49, 'longitude' => -13.2341667),
+ 'Gaborone' => array('latitude' => -24.6463889, 'longitude' => 25.9119444),
+ 'Geneva' => array('latitude' => 46.2, 'longitude' => 6.1666667),
+ 'George Town' => array('latitude' => 19.3, 'longitude' => -81.3833333),
+ 'Georgetown' => array('latitude' => 6.8, 'longitude' => -58.1666667),
+ 'Gibraltar' => array('latitude' => 36.1333333, 'longitude' => -5.35),
+ 'Glasgow' => array('latitude' => 55.8333333, 'longitude' => -4.25),
+ 'Guatemala la Nueva' => array('latitude' => 14.6211111, 'longitude' => -90.5269444),
+ 'Hagatna' => array('latitude' => 13.47417, 'longitude' => 144.74778),
+ 'The Hague' => array('latitude' => 52.0833333, 'longitude' => 4.3),
+ 'Hamilton' => array('latitude' => 32.2941667, 'longitude' => -64.7838889),
+ 'Hanoi' => array('latitude' => 21.0333333, 'longitude' => 105.85),
+ 'Harare' => array('latitude' => -17.8177778, 'longitude' => 31.0447222),
+ 'Havana' => array('latitude' => 23.1319444, 'longitude' => -82.3641667),
+ 'Helsinki' => array('latitude' => 60.1755556, 'longitude' => 24.9341667),
+ 'Honiara' => array('latitude' => -9.4333333, 'longitude' => 159.95),
+ 'Islamabad' => array('latitude' => 30.8486111, 'longitude' => 72.4944444),
+ 'Istanbul' => array('latitude' => 41.0186111, 'longitude' => 28.9647222),
+ 'Jakarta' => array('latitude' => -6.1744444, 'longitude' => 106.8294444),
+ 'Jamestown' => array('latitude' => -15.9333333, 'longitude' => -5.7166667),
+ 'Jerusalem' => array('latitude' => 31.7666667, 'longitude' => 35.2333333),
+ 'Johannesburg' => array('latitude' => -26.2, 'longitude' => 28.0833333),
+ 'Kabul' => array('latitude' => 34.5166667, 'longitude' => 69.1833333),
+ 'Kampala' => array('latitude' => 0.3155556, 'longitude' => 32.5655556),
+ 'Kathmandu' => array('latitude' => 27.7166667, 'longitude' => 85.3166667),
+ 'Khartoum' => array('latitude' => 15.5880556, 'longitude' => 32.5341667),
+ 'Kigali' => array('latitude' => -1.9536111, 'longitude' => 30.0605556),
+ 'Kingston' => array('latitude' => -29.05, 'longitude' => 167.95),
+ 'Kingstown' => array('latitude' => 13.1333333, 'longitude' => -61.2166667),
+ 'Kinshasa' => array('latitude' => -4.3, 'longitude' => 15.3),
+ 'Kolkata' => array('latitude' => 22.5697222, 'longitude' => 88.3697222),
+ 'Kuala Lumpur' => array('latitude' => 3.1666667, 'longitude' => 101.7),
+ 'Kuwait City' => array('latitude' => 29.3697222, 'longitude' => 47.9783333),
+ 'Kiev' => array('latitude' => 50.4333333, 'longitude' => 30.5166667),
+ 'La Paz' => array('latitude' => -16.5, 'longitude' => -68.15),
+ 'Libreville' => array('latitude' => 0.3833333, 'longitude' => 9.45),
+ 'Lilongwe' => array('latitude' => -13.9833333, 'longitude' => 33.7833333),
+ 'Lima' => array('latitude' => -12.05, 'longitude' => -77.05),
+ 'Lisbon' => array('latitude' => 38.7166667, 'longitude' => -9.1333333),
+ 'Ljubljana' => array('latitude' => 46.0552778, 'longitude' => 14.5144444),
+ 'Lobamba' => array('latitude' => -26.4666667, 'longitude' => 31.2),
+ 'Lomé' => array('latitude' => 9.7166667, 'longitude' => 38.3),
+ 'London' => array('latitude' => 51.5, 'longitude' => -0.1166667),
+ 'Los Angeles' => array('latitude' => 34.05222, 'longitude' => -118.24278),
+ 'Luanda' => array('latitude' => -8.8383333, 'longitude' => 13.2344444),
+ 'Lusaka' => array('latitude' => -15.4166667, 'longitude' => 28.2833333),
+ 'Luxembourg' => array('latitude' => 49.6116667, 'longitude' => 6.13),
+ 'Madrid' => array('latitude' => 40.4, 'longitude' => -3.6833333),
+ 'Majuro' => array('latitude' => 7.1, 'longitude' => 171.3833333),
+ 'Malabo' => array('latitude' => 3.75, 'longitude' => 8.7833333),
+ 'Managua' => array('latitude' => 12.1508333, 'longitude' => -86.2683333),
+ 'Manama' => array('latitude' => 26.2361111, 'longitude' => 50.5830556),
+ 'Manila' => array('latitude' => 14.6041667, 'longitude' => 120.9822222),
+ 'Maputo' => array('latitude' => -25.9652778, 'longitude' => 32.5891667),
+ 'Maseru' => array('latitude' => -29.3166667, 'longitude' => 27.4833333),
+ 'Mbabane' => array('latitude' => -26.3166667, 'longitude' => 31.1333333),
+ 'Melbourne' => array('latitude' => -37.8166667, 'longitude' => 144.9666667),
+ 'Melekeok' => array('latitude' => 7.4933333, 'longitude' => 134.6341667),
+ 'Mexiko City' => array('latitude' => 19.4341667, 'longitude' => -99.1386111),
+ 'Minsk' => array('latitude' => 53.9, 'longitude' => 27.5666667),
+ 'Mogadishu' => array('latitude' => 2.0666667, 'longitude' => 45.3666667),
+ 'Monaco' => array('latitude' => 43.7333333, 'longitude' => 7.4166667),
+ 'Monrovia' => array('latitude' => 6.3105556, 'longitude' => -10.8047222),
+ 'Montevideo' => array('latitude' => -34.8580556, 'longitude' => -56.1708333),
+ 'Montreal' => array('latitude' => 45.5, 'longitude' => -73.5833333),
+ 'Moroni' => array('latitude' => -11.7041667, 'longitude' => 43.2402778),
+ 'Moscow' => array('latitude' => 55.7522222, 'longitude' => 37.6155556),
+ 'Muscat' => array('latitude' => 23.6133333, 'longitude' => 58.5933333),
+ 'Nairobi' => array('latitude' => -1.3166667, 'longitude' => 36.8333333),
+ 'Nassau' => array('latitude' => 25.0833333, 'longitude' => -77.35),
+ 'N´Djamena' => array('latitude' => 12.1130556, 'longitude' => 15.0491667),
+ 'New Dehli' => array('latitude' => 28.6, 'longitude' => 77.2),
+ 'New York' => array('latitude' => 40.71417, 'longitude' => -74.00639),
+ 'Newcastle' => array('latitude' => -32.9166667, 'longitude' => 151.75),
+ 'Niamey' => array('latitude' => 13.6666667, 'longitude' => 1.7833333),
+ 'Nicosia' => array('latitude' => 35.1666667, 'longitude' => 33.3666667),
+ 'Nouakchott' => array('latitude' => 18.0863889, 'longitude' => -15.9752778),
+ 'Noumea' => array('latitude' => -22.2666667, 'longitude' => 166.45),
+ 'Nuku´alofa' => array('latitude' => -21.1333333, 'longitude' => -175.2),
+ 'Nuuk' => array('latitude' => 64.1833333, 'longitude' => -51.75),
+ 'Oranjestad' => array('latitude' => 12.5166667, 'longitude' => -70.0333333),
+ 'Oslo' => array('latitude' => 59.9166667, 'longitude' => 10.75),
+ 'Ouagadougou' => array('latitude' => 12.3702778, 'longitude' => -1.5247222),
+ 'Palikir' => array('latitude' => 6.9166667, 'longitude' => 158.15),
+ 'Panama City' => array('latitude' => 8.9666667, 'longitude' => -79.5333333),
+ 'Papeete' => array('latitude' => -17.5333333, 'longitude' => -149.5666667),
+ 'Paramaribo' => array('latitude' => 5.8333333, 'longitude' => -55.1666667),
+ 'Paris' => array('latitude' => 48.8666667, 'longitude' => 2.3333333),
+ 'Perth' => array('latitude' => -31.9333333, 'longitude' => 115.8333333),
+ 'Phnom Penh' => array('latitude' => 11.55, 'longitude' => 104.9166667),
+ 'Podgorica' => array('latitude' => 43.7752778, 'longitude' => 19.6827778),
+ 'Port Louis' => array('latitude' => -20.1666667, 'longitude' => 57.5),
+ 'Port Moresby' => array('latitude' => -9.4647222, 'longitude' => 147.1925),
+ 'Port-au-Prince' => array('latitude' => 18.5391667, 'longitude' => -72.335),
+ 'Port of Spain' => array('latitude' => 10.6666667, 'longitude' => -61.5),
+ 'Porto-Novo' => array('latitude' => 6.4833333, 'longitude' => 2.6166667),
+ 'Prague' => array('latitude' => 50.0833333, 'longitude' => 14.4666667),
+ 'Praia' => array('latitude' => 14.9166667, 'longitude' => -23.5166667),
+ 'Pretoria' => array('latitude' => -25.7069444, 'longitude' => 28.2294444),
+ 'Pyongyang' => array('latitude' => 39.0194444, 'longitude' => 125.7547222),
+ 'Quito' => array('latitude' => -0.2166667, 'longitude' => -78.5),
+ 'Rabat' => array('latitude' => 34.0252778, 'longitude' => -6.8361111),
+ 'Reykjavik' => array('latitude' => 64.15, 'longitude' => -21.95),
+ 'Riga' => array('latitude' => 56.95, 'longitude' => 24.1),
+ 'Rio de Janero' => array('latitude' => -22.9, 'longitude' => -43.2333333),
+ 'Road Town' => array('latitude' => 18.4166667, 'longitude' => -64.6166667),
+ 'Rome' => array('latitude' => 41.9, 'longitude' => 12.4833333),
+ 'Roseau' => array('latitude' => 15.3, 'longitude' => -61.4),
+ 'Rotterdam' => array('latitude' => 51.9166667, 'longitude' => 4.5),
+ 'Salvador' => array('latitude' => -12.9833333, 'longitude' => -38.5166667),
+ 'San José' => array('latitude' => 9.9333333, 'longitude' => -84.0833333),
+ 'San Juan' => array('latitude' => 18.46833, 'longitude' => -66.10611),
+ 'San Marino' => array('latitude' => 43.5333333, 'longitude' => 12.9666667),
+ 'San Salvador' => array('latitude' => 13.7086111, 'longitude' => -89.2030556),
+ 'Sanaá' => array('latitude' => 15.3547222, 'longitude' => 44.2066667),
+ 'Santa Cruz' => array('latitude' => -17.8, 'longitude' => -63.1666667),
+ 'Santiago' => array('latitude' => -33.45, 'longitude' => -70.6666667),
+ 'Santo Domingo' => array('latitude' => 18.4666667, 'longitude' => -69.9),
+ 'Sao Paulo' => array('latitude' => -23.5333333, 'longitude' => -46.6166667),
+ 'Sarajevo' => array('latitude' => 43.85, 'longitude' => 18.3833333),
+ 'Seoul' => array('latitude' => 37.5663889, 'longitude' => 126.9997222),
+ 'Shanghai' => array('latitude' => 31.2222222, 'longitude' => 121.4580556),
+ 'Sydney' => array('latitude' => -33.8833333, 'longitude' => 151.2166667),
+ 'Singapore' => array('latitude' => 1.2930556, 'longitude' => 103.8558333),
+ 'Skopje' => array('latitude' => 42, 'longitude' => 21.4333333),
+ 'Sofia' => array('latitude' => 42.6833333, 'longitude' => 23.3166667),
+ 'St. George´s' => array('latitude' => 12.05, 'longitude' => -61.75),
+ 'St. John´s' => array('latitude' => 17.1166667, 'longitude' => -61.85),
+ 'Stanley' => array('latitude' => -51.7, 'longitude' => -57.85),
+ 'Stockholm' => array('latitude' => 59.3333333, 'longitude' => 18.05),
+ 'Suva' => array('latitude' => -18.1333333, 'longitude' => 178.4166667),
+ 'Taipei' => array('latitude' => 25.0166667, 'longitude' => 121.45),
+ 'Tallinn' => array('latitude' => 59.4338889, 'longitude' => 24.7280556),
+ 'Tashkent' => array('latitude' => 41.3166667, 'longitude' => 69.25),
+ 'Tbilisi' => array('latitude' => 41.725, 'longitude' => 44.7908333),
+ 'Tegucigalpa' => array('latitude' => 14.1, 'longitude' => -87.2166667),
+ 'Tehran' => array('latitude' => 35.6719444, 'longitude' => 51.4244444),
+ 'The Hague' => array('latitude' => 52.0833333, 'longitude' => 4.3),
+ 'Thimphu' => array('latitude' => 27.4833333, 'longitude' => 89.6),
+ 'Tirana' => array('latitude' => 41.3275, 'longitude' => 19.8188889),
+ 'Tiraspol' => array('latitude' => 46.8402778, 'longitude' => 29.6433333),
+ 'Tokyo' => array('latitude' => 35.685, 'longitude' => 139.7513889),
+ 'Toronto' => array('latitude' => 43.6666667, 'longitude' => -79.4166667),
+ 'Tórshavn' => array('latitude' => 62.0166667, 'longitude' => -6.7666667),
+ 'Tripoli' => array('latitude' => 32.8925, 'longitude' => 13.18),
+ 'Tunis' => array('latitude' => 36.8027778, 'longitude' => 10.1797222),
+ 'Ulaanbaatar' => array('latitude' => 47.9166667, 'longitude' => 106.9166667),
+ 'Vaduz' => array('latitude' => 47.1333333, 'longitude' => 9.5166667),
+ 'Valletta' => array('latitude' => 35.8997222, 'longitude' => 14.5147222),
+ 'Valparaiso' => array('latitude' => -33.0477778, 'longitude' => -71.6011111),
+ 'Vancouver' => array('latitude' => 49.25, 'longitude' => -123.1333333),
+ 'Vatican City' => array('latitude' => 41.9, 'longitude' => 12.4833333),
+ 'Victoria' => array('latitude' => -4.6166667, 'longitude' => 55.45),
+ 'Vienna' => array('latitude' => 48.2, 'longitude' => 16.3666667),
+ 'Vientaine' => array('latitude' => 17.9666667, 'longitude' => 102.6),
+ 'Vilnius' => array('latitude' => 54.6833333, 'longitude' => 25.3166667),
+ 'Warsaw' => array('latitude' => 52.25, 'longitude' => 21),
+ 'Washington dc' => array('latitude' => 38.895, 'longitude' => -77.03667),
+ 'Wellington' => array('latitude' => -41.3, 'longitude' => 174.7833333),
+ 'Willemstad' => array('latitude' => 12.1, 'longitude' => -68.9166667),
+ 'Windhoek' => array('latitude' => -22.57, 'longitude' => 17.0836111),
+ 'Yamoussoukro' => array('latitude' => 6.8166667, 'longitude' => -5.2833333),
+ 'Yaoundé' => array('latitude' => 3.8666667, 'longitude' => 11.5166667),
+ 'Yerevan' => array('latitude' => 40.1811111, 'longitude' => 44.5136111),
+ 'Zürich' => array('latitude' => 47.3666667, 'longitude' => 8.55),
+ 'Zagreb' => array('latitude' => 45.8, 'longitude' => 16)
+ );
+
+ /**
+ * Returns the location from the selected city
+ *
+ * @param string $city - city to get location for
+ * @param string $horizon - horizon to use :
+ * default: effective
+ * others are civil, nautic, astronomic
+ * @return array
+ * @throws Zend_Date_Exception
+ */
+ public static function City($city, $horizon = false) {
+ foreach (self::$Cities as $key => $value) {
+ if (strtolower($key) == strtolower($city)) {
+ $return = $value;
+ $return['horizon'] = $horizon;
+ return $return;
+ }
+ }
+ /**
+ * @see Zend_Date_Exception
+ */
+ require_once 'Zend/Date/Exception.php';
+ throw new Zend_Date_Exception('unknown city');
+ }
+
+ /**
+ * Return a list with all known cities
+ *
+ * @return array
+ */
+ public static function getCityList() {
+ return array_keys(self::$Cities);
+ }
+}
diff --git a/libs/Zend/Date/DateObject.php b/libs/Zend/Date/DateObject.php
new file mode 100755
index 0000000000..b5744d8095
--- /dev/null
+++ b/libs/Zend/Date/DateObject.php
@@ -0,0 +1,1013 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Date
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: DateObject.php 4786 2007-05-12 15:31:30Z thomas $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Include needed Date classes
+ */
+require_once 'Zend/Date/Exception.php';
+
+/**
+ * @category Zend
+ * @package Zend_Date
+ * @subpackage Zend_Date_DateObject
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Date_DateObject {
+
+
+ /**
+ * UNIX Timestamp
+ */
+ private $_unixTimestamp;
+
+
+ /**
+ * active timezone
+ */
+ private $_timezone = 'UTC';
+ private $_offset = 0;
+ private $_syncronised = 0;
+
+
+ /**
+ * Table of Monthdays
+ */
+ private static $_monthTable = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
+
+
+ /**
+ * Table of Years
+ */
+ private static $_yearTable = array(
+ 1970 => 0, 1960 => -315619200, 1950 => -631152000,
+ 1940 => -946771200, 1930 => -1262304000, 1920 => -1577923200,
+ 1910 => -1893456000, 1900 => -2208988800, 1890 => -2524521600,
+ 1880 => -2840140800, 1870 => -3155673600, 1860 => -3471292800,
+ 1850 => -3786825600, 1840 => -4102444800, 1830 => -4417977600,
+ 1820 => -4733596800, 1810 => -5049129600, 1800 => -5364662400,
+ 1790 => -5680195200, 1780 => -5995814400, 1770 => -6311347200,
+ 1760 => -6626966400, 1750 => -6942499200, 1740 => -7258118400,
+ 1730 => -7573651200, 1720 => -7889270400, 1710 => -8204803200,
+ 1700 => -8520336000, 1690 => -8835868800, 1680 => -9151488000,
+ 1670 => -9467020800, 1660 => -9782640000, 1650 => -10098172800,
+ 1640 => -10413792000, 1630 => -10729324800, 1620 => -11044944000,
+ 1610 => -11360476800, 1600 => -11676096000);
+
+
+ /**
+ * Set this object to have a new UNIX timestamp.
+ *
+ * @param string|integer $timestamp OPTIONAL timestamp; defaults to local time using time()
+ * @return string|integer old timestamp
+ * @throws Zend_Date_Exception
+ */
+ protected function setUnixTimestamp($timestamp = null)
+ {
+ $old = $this->_unixTimestamp;
+
+ if (is_numeric($timestamp)) {
+ $this->_unixTimestamp = $timestamp;
+ } else if ($timestamp === null) {
+ $this->_unixTimestamp = time();
+ } else {
+ throw new Zend_Date_Exception('\'' . $timestamp . '\' is not a valid UNIX timestamp', $timestamp);
+ }
+
+ return $old;
+ }
+
+
+ /**
+ * Returns this object's UNIX timestamp
+ * A timestamp greater then the integer range will be returned as string
+ * This function does not return the timestamp as object. Use copy() instead.
+ *
+ * @return integer|string timestamp
+ */
+ protected function getUnixTimestamp()
+ {
+ if ($this->_unixTimestamp === intval($this->_unixTimestamp)) {
+ return (int) $this->_unixTimestamp;
+ } else {
+ return (string) $this->_unixTimestamp;
+ }
+ }
+
+ /**
+ * Internal function.
+ * Returns time(). This method exists to allow unit tests to work-around methods that might otherwise
+ * be hard-coded to use time(). For example, this makes it possible to test isYesterday() in Date.php.
+ *
+ * @param integer $sync OPTIONAL time syncronisation value
+ * @return integer timestamp
+ */
+ protected function _getTime($sync = null)
+ {
+ if ($sync !== null) {
+ $this->_syncronised = round($sync);
+ }
+ return (time() + $this->_syncronised);
+ }
+
+
+ /**
+ * Internal mktime function used by Zend_Date.
+ * The timestamp returned by mktime() can exceed the precision of traditional UNIX timestamps,
+ * by allowing PHP to auto-convert to using a float value.
+ *
+ * Returns a timestamp relative to 1970/01/01 00:00:00 GMT/UTC.
+ * DST (Summer/Winter) is depriciated since php 5.1.0.
+ * Year has to be 4 digits otherwise it would be recognised as
+ * year 70 AD instead of 1970 AD as expected !!
+ *
+ * @param integer $hour
+ * @param integer $minute
+ * @param integer $second
+ * @param integer $month
+ * @param integer $day
+ * @param integer $year
+ * @param boolean $gmt OPTIONAL true = other arguments are for UTC time, false = arguments are for local time/date
+ * @return integer|float timestamp (number of seconds elapsed relative to 1970/01/01 00:00:00 GMT/UTC)
+ */
+ protected function mktime($hour, $minute, $second, $month, $day, $year, $gmt = false)
+ {
+ // complete date but in 32bit timestamp - use PHP internal
+ if ((1901 < $year) and ($year < 2038)) {
+
+ $oldzone = @date_default_timezone_get();
+ // Timezone also includes DST settings, therefor substracting the GMT offset is not enough
+ // We have to set the correct timezone to get the right value
+ if (($this->_timezone != $oldzone) and ($gmt === false)) {
+ $second -= $this->_offset;
+ date_default_timezone_set($this->_timezone);
+ }
+
+ $result = ($gmt) ? @gmmktime($hour, $minute, $second, $month, $day, $year)
+ : @mktime($hour, $minute, $second, $month, $day, $year);
+ date_default_timezone_set($oldzone);
+
+ return $result;
+ }
+
+ // after here we are handling 64bit timestamps
+ // get difference from local to gmt
+ $difference = ($gmt) ? 0
+ : $this->_offset;
+
+ // date to integer
+ $day = intval($day);
+ $month = intval($month);
+ $year = intval($year);
+
+ // correct months > 12 and months < 1
+ if ($month > 12) {
+ $overlap = floor($month / 12);
+ $year += $overlap;
+ $month -= $overlap * 12;
+ } else {
+ $overlap = ceil((1 - $month) / 12);
+ $year -= $overlap;
+ $month += $overlap * 12;
+ }
+
+ $date = 0;
+ if ($year >= 1970) {
+
+ // Date is after UNIX epoch
+ // go through leapyears
+ // add months from letest given year
+ for ($count = 1970; $count <= $year; $count++) {
+ $leapyear = self::isYearLeapYear($count);
+ if ($count < $year) {
+
+ $date += 365;
+ if ($leapyear === true) {
+ $date++;
+ }
+
+ } else {
+
+ for ($mcount = 0; $mcount < ($month - 1); $mcount++) {
+ $date += self::$_monthTable[$mcount];
+ if (($leapyear === true) and ($mcount == 1)) {
+ $date++;
+ }
+
+ }
+ }
+ }
+
+ $date += $day - 1;
+
+ return (($date * 86400) + ($hour * 3600) + ($minute * 60) + $second + $difference);
+ } else {
+
+ // Date is before UNIX epoch
+ // go through leapyears
+ // add months from latest given year
+ for ($count = 1969; $count >= $year; $count--) {
+
+ $leapyear = self::isYearLeapYear($count);
+ if ($count > $year)
+ {
+ $date += 365;
+ if ($leapyear === true)
+ $date++;
+ } else {
+
+ for ($mcount = 11; $mcount > ($month - 1); $mcount--) {
+ $date += self::$_monthTable[$mcount];
+ if (($leapyear === true) and ($mcount == 1)) {
+ $date++;
+ }
+
+ }
+ }
+ }
+
+ $date += (self::$_monthTable[$month - 1] - $day);
+ $date = -(($date * 86400) + (86400 - (($hour * 3600) + ($minute * 60) + $second))) + $difference;
+
+ // gregorian correction for 5.Oct.1582
+ if ($date < -12220185600) {
+ $date += 864000;
+ } else if ($date < -12219321600) {
+ $date = -12219321600;
+ }
+
+ return $date;
+ }
+ }
+
+
+ /**
+ * Returns true, if given $year is a leap year.
+ *
+ * @param integer $year
+ * @return boolean true, if year is leap year
+ */
+ protected static function isYearLeapYear($year)
+ {
+ // all leapyears can be divided through 4
+ if (($year % 4) != 0) {
+ return false;
+ }
+
+ // all leapyears can be divided through 400
+ if ($year % 400 == 0) {
+ return true;
+ } else if (($year > 1582) and ($year % 100 == 0)) {
+ return false;
+ }
+
+ return true;
+ }
+
+
+ /**
+ * Internal mktime function used by Zend_Date for handling 64bit timestamps.
+ *
+ * Returns a formatted date for a given timestamp.
+ *
+ * @param string $format format for output
+ * @param mixed $timestamp
+ * @param boolean $gmt OPTIONAL true = other arguments are for UTC time, false = arguments are for local time/date
+ * @return string
+ */
+ protected function date($format, $timestamp = null, $gmt = false)
+ {
+ if ($timestamp === null) {
+
+ $oldzone = @date_default_timezone_get();
+ if ($this->_timezone != $oldzone) {
+ date_default_timezone_set($this->_timezone);
+ }
+
+ $result = ($gmt) ? @gmdate($format) : @date($format);
+ date_default_timezone_set($oldzone);
+
+ return $result;
+ }
+
+ if (abs($timestamp) <= 0x7FFFFFFF) {
+
+ $oldzone = @date_default_timezone_get();
+ if ($this->_timezone != $oldzone) {
+ date_default_timezone_set($this->_timezone);
+ }
+
+ $result = ($gmt) ? @gmdate($format, $timestamp) : @date($format, $timestamp);
+ date_default_timezone_set($oldzone);
+
+ return $result;
+ }
+
+ // check on false or null alone failes
+ if (empty($gmt)) {
+ $timestamp -= $this->_offset;
+ }
+
+ $date = $this->getDateParts($timestamp, true);
+ $length = strlen($format);
+ $output = '';
+
+ for ($i = 0; $i < $length; $i++) {
+
+ switch($format[$i]) {
+
+ // day formats
+ case 'd': // day of month, 2 digits, with leading zero, 01 - 31
+ $output .= (($date['mday'] < 10) ? '0' . $date['mday'] : $date['mday']);
+ break;
+
+ case 'D': // day of week, 3 letters, Mon - Sun
+ $output .= date('D', 86400 * (3 + self::dayOfWeek($date['year'], $date['mon'], $date['mday'])));
+ break;
+
+ case 'j': // day of month, without leading zero, 1 - 31
+ $output .= $date['mday'];
+ break;
+
+ case 'l': // day of week, full string name, Sunday - Saturday
+ $output .= date('l', 86400 * (3 + self::dayOfWeek($date['year'], $date['mon'], $date['mday'])));
+ break;
+
+ case 'N': // ISO 8601 numeric day of week, 1 - 7
+ $day = self::dayOfWeek($date['year'], $date['mon'], $date['mday']);
+ if ($day == 0) {
+ $day = 7;
+ }
+ $output .= $day;
+ break;
+
+ case 'S': // english suffix for day of month, st nd rd th
+ if (($date['mday'] % 10) == 1) {
+ $output .= 'st';
+ } else if ((($date['mday'] % 10) == 2) and ($date['mday'] != 12)) {
+ $output .= 'nd';
+ } else if (($date['mday'] % 10) == 3) {
+ $output .= 'rd';
+ } else {
+ $output .= 'th';
+ }
+ break;
+
+ case 'w': // numeric day of week, 0 - 6
+ $output .= self::dayOfWeek($date['year'], $date['mon'], $date['mday']);
+ break;
+
+ case 'z': // day of year, 0 - 365
+ $output .= $date['yday'];
+ break;
+
+
+ // week formats
+ case 'W': // ISO 8601, week number of year
+ $output .= $this->weekNumber($date['year'], $date['mon'], $date['mday']);
+ break;
+
+
+ // month formats
+ case 'F': // string month name, january - december
+ $output .= date('F', mktime(0, 0, 0, $date['mon'], 2, 1971));
+ break;
+
+ case 'm': // number of month, with leading zeros, 01 - 12
+ $output .= (($date['mon'] < 10) ? '0' . $date['mon'] : $date['mon']);
+ break;
+
+ case 'M': // 3 letter month name, Jan - Dec
+ $output .= date('M',mktime(0, 0, 0, $date['mon'], 2, 1971));
+ break;
+
+ case 'n': // number of month, without leading zeros, 1 - 12
+ $output .= $date['mon'];
+ break;
+
+ case 't': // number of day in month
+ $output .= self::$_monthTable[$date['mon'] - 1];
+ break;
+
+
+ // year formats
+ case 'L': // is leap year ?
+ $output .= (self::isYearLeapYear($date['year'])) ? '1' : '0';
+ break;
+
+ case 'o': // ISO 8601 year number
+ $week = $this->weekNumber($date['year'], $date['mon'], $date['mday']);
+ if (($week > 50) and ($date['mon'] == 1)) {
+ $output .= ($date['year'] - 1);
+ } else {
+ $output .= $date['year'];
+ }
+ break;
+
+ case 'Y': // year number, 4 digits
+ $output .= $date['year'];
+ break;
+
+ case 'y': // year number, 2 digits
+ $output .= substr($date['year'], strlen($date['year']) - 2, 2);
+ break;
+
+
+ // time formats
+ case 'a': // lower case am/pm
+ $output .= (($date['hours'] >= 12) ? 'pm' : 'am');
+ break;
+
+ case 'A': // upper case am/pm
+ $output .= (($date['hours'] >= 12) ? 'PM' : 'AM');
+ break;
+
+ case 'B': // swatch internet time
+ $dayseconds = ($date['hours'] * 3600) + ($date['minutes'] * 60) + $date['seconds'];
+ if ($gmt === true) {
+ $dayseconds += 3600;
+ }
+ $output .= (int) (($dayseconds % 86400) / 86.4);
+ break;
+
+ case 'g': // hours without leading zeros, 12h format
+ if ($date['hours'] > 12) {
+ $hour = $date['hours'] - 12;
+ } else {
+ if ($date['hours'] == 0) {
+ $hour = '12';
+ } else {
+ $hour = $date['hours'];
+ }
+ }
+ $output .= $hour;
+ break;
+
+ case 'G': // hours without leading zeros, 24h format
+ $output .= $date['hours'];
+ break;
+
+ case 'h': // hours with leading zeros, 12h format
+ if ($date['hours'] > 12) {
+ $hour = $date['hours'] - 12;
+ } else {
+ if ($date['hours'] == 0) {
+ $hour = '12';
+ } else {
+ $hour = $date['hours'];
+ }
+ }
+ $output .= (($hour < 10) ? '0'.$hour : $hour);
+ break;
+
+ case 'H': // hours with leading zeros, 24h format
+ $output .= (($date['hours'] < 10) ? '0' . $date['hours'] : $date['hours']);
+ break;
+
+ case 'i': // minutes with leading zeros
+ $output .= (($date['minutes'] < 10) ? '0' . $date['minutes'] : $date['minutes']);
+ break;
+
+ case 's': // seconds with leading zeros
+ $output .= (($date['seconds'] < 10) ? '0' . $date['seconds'] : $date['seconds']);
+ break;
+
+
+ // timezone formats
+ case 'e': // timezone identifier
+ if ($gmt === true) {
+ $output .= gmdate('e', mktime($date['hours'], $date['minutes'], $date['seconds'],
+ $date['mon'], $date['mday'], 2000));
+ } else {
+ $output .= date('e', mktime($date['hours'], $date['minutes'], $date['seconds'],
+ $date['mon'], $date['mday'], 2000));
+ }
+ break;
+
+ case 'I': // daylight saving time or not
+ if ($gmt === true) {
+ $output .= gmdate('I', mktime($date['hours'], $date['minutes'], $date['seconds'],
+ $date['mon'], $date['mday'], 2000));
+ } else {
+ $output .= date('I', mktime($date['hours'], $date['minutes'], $date['seconds'],
+ $date['mon'], $date['mday'], 2000));
+ }
+ break;
+
+ case 'O': // difference to GMT in hours
+ $gmtstr = ($gmt === true) ? 0 : $this->_offset;
+ $output .= sprintf('%s%04d', ($gmtstr <= 0) ? '+' : '-', abs($gmtstr) / 36);
+ break;
+
+ case 'P': // difference to GMT with colon
+ $gmtstr = ($gmt === true) ? 0 : $this->_offset;
+ $gmtstr = sprintf('%s%04d', ($gmtstr <= 0) ? '+' : '-', abs($gmtstr) / 36);
+ $output = $output . substr($gmtstr, 0, 3) . ':' . substr($gmtstr, 3);
+ break;
+
+ case 'T': // timezone settings
+ if ($gmt === true) {
+ $output .= gmdate('T', mktime($date['hours'], $date['minutes'], $date['seconds'],
+ $date['mon'], $date['mday'], 2000));
+ } else {
+ $output .= date('T', mktime($date['hours'], $date['minutes'], $date['seconds'],
+ $date['mon'], $date['mday'], 2000));
+ }
+ break;
+
+ case 'Z': // timezone offset in seconds
+ $output .= ($gmt === true) ? 0 : -$this->_offset;
+ break;
+
+
+ // complete time formats
+ case 'c': // ISO 8601 date format
+ $difference = $this->_offset;
+ $difference = sprintf('%s%04d', ($difference <= 0) ? '+' : '-', abs($difference) / 36);
+ $output .= $date['year'] . '-'
+ . (($date['mon'] < 10) ? '0' . $date['mon'] : $date['mon']) . '-'
+ . (($date['mday'] < 10) ? '0' . $date['mday'] : $date['mday']) . 'T'
+ . (($date['hours'] < 10) ? '0' . $date['hours'] : $date['hours']) . ':'
+ . (($date['minutes'] < 10) ? '0' . $date['minutes'] : $date['minutes']) . ':'
+ . (($date['seconds'] < 10) ? '0' . $date['seconds'] : $date['seconds'])
+ . $difference;
+ break;
+
+ case 'r': // RFC 2822 date format
+ $difference = $this->_offset;
+ $difference = sprintf('%s%04d', ($difference <= 0) ? '+' : '-', abs($difference) / 36);
+ $output .= gmdate('D', 86400 * (3 + self::dayOfWeek($date['year'], $date['mon'], $date['mday']))) . ', '
+ . (($date['mday'] < 10) ? '0' . $date['mday'] : $date['mday']) . ' '
+ . date('M', mktime(0, 0, 0, $date['mon'], 2, 1971)) . ' '
+ . $date['year'] . ' '
+ . (($date['hours'] < 10) ? '0' . $date['hours'] : $date['hours']) . ':'
+ . (($date['minutes'] < 10) ? '0' . $date['minutes'] : $date['minutes']) . ':'
+ . (($date['seconds'] < 10) ? '0' . $date['seconds'] : $date['seconds']) . ' '
+ . $difference;
+ break;
+
+ case 'U': // Unix timestamp
+ $output .= $timestamp;
+ break;
+
+
+ // special formats
+ case "\\": // next letter to print with no format
+ $i++;
+ if ($i < $length) {
+ $output .= $format[$i];
+ }
+ break;
+
+ default: // letter is no format so add it direct
+ $output .= $format[$i];
+ break;
+ }
+ }
+
+ return $output;
+ }
+
+
+ /**
+ * Returns the day of week for a Gregorian calendar date.
+ * 0 = sunday, 6 = saturday
+ *
+ * @param integer $year
+ * @param integer $month
+ * @param integer $day
+ * @return integer dayOfWeek
+ */
+ protected static function dayOfWeek($year, $month, $day)
+ {
+ if ((1901 < $year) and ($year < 2038)) {
+ return (int) date('w', mktime(0, 0, 0, $month, $day, $year));
+ }
+
+ // gregorian correction
+ $correction = 0;
+ if (($year < 1582) or (($year == 1582) and (($month < 10) or (($month == 10) && ($day < 15))))) {
+ $correction = 3;
+ }
+
+ if ($month > 2) {
+ $month -= 2;
+ } else {
+ $month += 10;
+ $year--;
+ }
+
+ $day = floor((13 * $month - 1) / 5) + $day + ($year % 100) + floor(($year % 100) / 4);
+ $day += floor(($year / 100) / 4) - 2 * floor($year / 100) + 77 + $correction;
+
+ return (int) ($day - 7 * floor($day / 7));
+ }
+
+
+ /**
+ * Internal getDateParts function for handling 64bit timestamps, similar to:
+ * http://www.php.net/getdate
+ *
+ * Returns an array of date parts for $timestamp, relative to 1970/01/01 00:00:00 GMT/UTC.
+ *
+ * $fast specifies ALL date parts should be returned (slower)
+ * Default is false, and excludes $dayofweek, weekday, month and timestamp from parts returned.
+ *
+ * @param mixed $timestamp
+ * @param boolean $fast OPTIONAL defaults to fast (false), resulting in fewer date parts
+ * @return array
+ */
+ protected function getDateParts($timestamp = null, $fast = null)
+ {
+ // actual timestamp
+ if ($timestamp === null) {
+ return getdate();
+ }
+
+ // 32bit timestamp
+ if (abs($timestamp) <= 0x7FFFFFFF) {
+ return @getdate($timestamp);
+ }
+
+ $otimestamp = $timestamp;
+ $numday = 0;
+ $month = 0;
+ // gregorian correction
+ if ($timestamp < -12219321600) {
+ $timestamp -= 864000;
+ }
+
+ // timestamp lower 0
+ if ($timestamp < 0) {
+ $sec = 0;
+ $act = 1970;
+
+ // iterate through 10 years table, increasing speed
+ foreach(self::$_yearTable as $year => $seconds) {
+ if ($timestamp >= $seconds) {
+ $i = $act;
+ break;
+ }
+ $sec = $seconds;
+ $act = $year;
+ }
+
+ $timestamp -= $sec;
+ if (!isset($i)) {
+ $i = $act;
+ }
+
+ // iterate the max last 10 years
+ do {
+ --$i;
+ $day = $timestamp;
+
+ $timestamp += 31536000;
+ $leapyear = self::isYearLeapYear($i);
+ if ($leapyear === true) {
+ $timestamp += 86400;
+ }
+
+ if ($timestamp >= 0) {
+ $year = $i;
+ break;
+ }
+ } while ($timestamp < 0);
+
+ $secondsPerYear = 86400 * ($leapyear ? 366 : 365) + $day;
+
+ $timestamp = $day;
+ // iterate through months
+ for ($i = 12; --$i >= 0;) {
+ $day = $timestamp;
+
+ $timestamp += self::$_monthTable[$i] * 86400;
+ if (($leapyear === true) and ($i == 1)) {
+ $timestamp += 86400;
+ }
+
+ if ($timestamp >= 0) {
+ $month = $i;
+ $numday = self::$_monthTable[$i];
+ if (($leapyear === true) and ($i == 1)) {
+ ++$numday;
+ }
+ break;
+ }
+ }
+
+ $timestamp = $day;
+ $numberdays = $numday + ceil(($timestamp + 1) / 86400);
+
+ $timestamp += ($numday - $numberdays + 1) * 86400;
+ $hours = floor($timestamp / 3600);
+ } else {
+
+ // iterate through years
+ for ($i = 1970;;$i++) {
+ $day = $timestamp;
+
+ $timestamp -= 31536000;
+ $leapyear = self::isYearLeapYear($i);
+ if ($leapyear === true) {
+ $timestamp -= 86400;
+ }
+
+ if ($timestamp < 0) {
+ $year = $i;
+ break;
+ }
+ }
+
+ $secondsPerYear = $day;
+
+ $timestamp = $day;
+ // iterate through months
+ for ($i = 0; $i <= 11; $i++) {
+ $day = $timestamp;
+ $timestamp -= self::$_monthTable[$i] * 86400;
+
+ if (($leapyear === true) and ($i == 1)) {
+ $timestamp -= 86400;
+ }
+
+ if ($timestamp < 0) {
+ $month = $i;
+ $numday = self::$_monthTable[$i];
+ if (($leapyear === true) and ($i == 1)) {
+ ++$numday;
+ }
+ break;
+ }
+ }
+
+ $timestamp = $day;
+ $numberdays = ceil(($timestamp + 1) / 86400);
+ $timestamp = $timestamp - ($numberdays - 1) * 86400;
+ $hours = floor($timestamp / 3600);
+ }
+
+ $timestamp -= $hours * 3600;
+
+ $month += 1;
+ $minutes = floor($timestamp / 60);
+ $seconds = $timestamp - $minutes * 60;
+
+ if ($fast === true) {
+ return array(
+ 'seconds' => $seconds,
+ 'minutes' => $minutes,
+ 'hours' => $hours,
+ 'mday' => $numberdays,
+ 'mon' => $month,
+ 'year' => $year,
+ 'yday' => floor($secondsPerYear / 86400),
+ );
+ }
+
+ $dayofweek = self::dayOfWeek($year, $month, $numberdays);
+
+ return array(
+ 'seconds' => $seconds,
+ 'minutes' => $minutes,
+ 'hours' => $hours,
+ 'mday' => $numberdays,
+ 'wday' => $dayofweek,
+ 'mon' => $month,
+ 'year' => $year,
+ 'yday' => floor($secondsPerYear / 86400),
+ 'weekday' => gmdate('l', 86400 * (3 + $dayofweek)),
+ 'month' => gmdate('F', mktime(0, 0, 0, $month, 1, 1971)),
+ 0 => $otimestamp
+ );
+ }
+
+
+ /**
+ * Internal getWeekNumber function for handling 64bit timestamps
+ *
+ * Returns the ISO 8601 week number of a given date
+ *
+ * @param integer $year
+ * @param integer $month
+ * @param integer $day
+ * @return integer
+ */
+ protected function weekNumber($year, $month, $day)
+ {
+ if ((1901 < $year) and ($year < 2038)) {
+ return (int) date('W', mktime(0, 0, 0, $month, $day, $year));
+ }
+
+ $dayofweek = self::dayOfWeek($year, $month, $day);
+ $firstday = self::dayOfWeek($year, 1, 1);
+ if (($month == 1) and (($firstday < 1) or ($firstday > 4)) and ($day < 4)) {
+ $firstday = self::dayOfWeek($year - 1, 1, 1);
+ $month = 12;
+ $day = 31;
+
+ } else if (($month == 12) and ((self::dayOfWeek($year + 1, 1, 1) < 5) and
+ (self::dayOfWeek($year + 1, 1, 1) > 0))) {
+ return 1;
+ }
+
+ return intval (((self::dayOfWeek($year, 1, 1) < 5) and (self::dayOfWeek($year, 1, 1) > 0)) +
+ 4 * ($month - 1) + (2 * ($month - 1) + ($day - 1) + $firstday - $dayofweek + 6) * 36 / 256);
+ }
+
+
+ /**
+ * Internal _range function
+ * Sets the value $a to be in the range of [0, $b]
+ *
+ * @param float $a - value to correct
+ * @param float $b - maximum range to set
+ */
+ private function _range($a, $b) {
+ while ($a < 0) {
+ $a += $b;
+ }
+ while ($a >= $b) {
+ $a -= $b;
+ }
+ return $a;
+ }
+
+
+ /**
+ * Calculates the sunrise or sunset based on a location
+ *
+ * @param array $location Location for calculation MUST include 'latitude', 'longitude', 'horizon'
+ * @param bool $horizon true: sunrise; false: sunset
+ * @return mixed - false: midnight sun, integer:
+ */
+ protected function calcSun($location, $horizon, $rise = false)
+ {
+ // timestamp within 32bit
+ if (abs($this->_unixTimestamp) <= 0x7FFFFFFF) {
+ if ($rise === false) {
+ return date_sunset($this->_unixTimestamp, SUNFUNCS_RET_TIMESTAMP, $location['latitude'],
+ $location['longitude'], 90 + $horizon, $this->_offset / 3600);
+ }
+ return date_sunrise($this->_unixTimestamp, SUNFUNCS_RET_TIMESTAMP, $location['latitude'],
+ $location['longitude'], 90 + $horizon, $this->_offset / 3600);
+ }
+
+ // self calculation - timestamp bigger than 32bit
+ // fix circle values
+ $quarterCircle = 0.5 * M_PI;
+ $halfCircle = M_PI;
+ $threeQuarterCircle = 1.5 * M_PI;
+ $fullCircle = 2 * M_PI;
+
+ // radiant conversion for coordinates
+ $radLatitude = $location['latitude'] * $halfCircle / 180;
+ $radLongitude = $location['longitude'] * $halfCircle / 180;
+
+ // get solar coordinates
+ $tmpRise = $rise ? $quarterCircle : $threeQuarterCircle;
+ $radDay = $this->date('z',$this->_unixTimestamp) + ($tmpRise - $radLongitude) / $fullCircle;
+
+ // solar anomoly and longitude
+ $solAnomoly = $radDay * 0.017202 - 0.0574039;
+ $solLongitude = $solAnomoly + 0.0334405 * sin($solAnomoly);
+ $solLongitude += 4.93289 + 3.49066E-4 * sin(2 * $solAnomoly);
+
+ // get quadrant
+ $solLongitude = $this->_range($solLongitude, $fullCircle);
+
+ if (($solLongitude / $quarterCircle) - intval($solLongitude / $quarterCircle) == 0) {
+ $solLongitude += 4.84814E-6;
+ }
+
+ // solar ascension
+ $solAscension = sin($solLongitude) / cos($solLongitude);
+ $solAscension = atan2(0.91746 * $solAscension, 1);
+
+ // adjust quadrant
+ if ($solLongitude > $threeQuarterCircle) {
+ $solAscension += $fullCircle;
+ } else if ($solLongitude > $quarterCircle) {
+ $solAscension += $halfCircle;
+ }
+
+ // solar declination
+ $solDeclination = 0.39782 * sin($solLongitude);
+ $solDeclination /= sqrt(-$solDeclination * $solDeclination + 1);
+ $solDeclination = atan2($solDeclination, 1);
+
+ $solHorizon = $horizon - sin($solDeclination) * sin($radLatitude);
+ $solHorizon /= cos($solDeclination) * cos($radLatitude);
+
+ // midnight sun, always night
+ if (abs($solHorizon) > 1) {
+ return false;
+ }
+
+ $solHorizon /= sqrt(-$solHorizon * $solHorizon + 1);
+ $solHorizon = $quarterCircle - atan2($solHorizon, 1);
+
+ if ($rise) {
+ $solHorizon = $fullCircle - $solHorizon;
+ }
+
+ // time calculation
+ $localTime = $solHorizon + $solAscension - 0.0172028 * $radDay - 1.73364;
+ $universalTime = $localTime - $radLongitude;
+
+ // determinate quadrant
+ $universalTime = $this->_range($universalTime, $fullCircle);
+
+ // radiant to hours
+ $universalTime *= 24 / $fullCircle;
+
+ // convert to time
+ $hour = intval($universalTime);
+ $universalTime = ($universalTime - $hour) * 60;
+ $min = intval($universalTime);
+ $universalTime = ($universalTime - $min) * 60;
+ $sec = intval($universalTime);
+
+ return $this->mktime($hour, $min, $sec, $this->date('m', $this->_unixTimestamp),
+ $this->date('j', $this->_unixTimestamp), $this->date('Y', $this->_unixTimestamp),
+ -1, true);
+ }
+
+
+ /**
+ * Sets a new timezone for calculation of $this object's gmt offset.
+ * For a list of supported timezones look here: http://php.net/timezones
+ * If no timezone can be detected or the given timezone is wrong UTC will be set.
+ *
+ * @param string $zone OPTIONAL timezone for date calculation; defaults to date_default_timezone_get()
+ * @return string actual set timezone string
+ * @throws Zend_Date_Exception
+ */
+ public function setTimezone($zone = null)
+ {
+ $oldzone = @date_default_timezone_get();
+ if ($zone === null) {
+ $zone = $oldzone;
+ }
+
+ // throw an error on false input, but only if the new date extension is avaiable
+ if (function_exists('timezone_open')) {
+ if (!@timezone_open($zone)) {
+ throw new Zend_Date_Exception("timezone ($zone) is not a known timezone", $zone);
+ }
+ }
+ // this can generate an error if the date extension is not avaiable and a false timezone is given
+ $result = date_default_timezone_set($zone);
+ if ($result === true) {
+ $this->_offset = mktime(0, 0, 0, 1, 2, 1970) - gmmktime(0, 0, 0, 1, 2, 1970);
+ $this->_timezone = $zone;
+ }
+ date_default_timezone_set($oldzone);
+
+ return $result;
+ }
+
+
+ /**
+ * Return the timezone of $this object.
+ * The timezone is initially set when the object is instantiated.
+ *
+ * @return string actual set timezone string
+ */
+ public function getTimezone()
+ {
+ return $this->_timezone;
+ }
+
+
+ /**
+ * Return the offset to GMT of $this object's timezone.
+ * The offset to GMT is initially set when the object is instantiated using the currently,
+ * in effect, default timezone for PHP functions.
+ *
+ * @return integer seconds difference between GMT timezone and timezone when object was instantiated
+ */
+ public function getGmtOffset()
+ {
+ return $this->_offset;
+ }
+}
diff --git a/libs/Zend/Date/Exception.php b/libs/Zend/Date/Exception.php
new file mode 100755
index 0000000000..282c755696
--- /dev/null
+++ b/libs/Zend/Date/Exception.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Date
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Exception.php 3827 2007-03-08 18:26:49Z darby $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Date
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Date_Exception extends Zend_Exception
+{
+ protected $operand = null;
+
+ public function __construct($message, $op = null)
+ {
+ $this->operand = $op;
+ parent::__construct($message);
+ }
+
+ public function getOperand()
+ {
+ return $this->operand;
+ }
+}
diff --git a/libs/Zend/Db.php b/libs/Zend/Db.php
new file mode 100755
index 0000000000..caee84f28f
--- /dev/null
+++ b/libs/Zend/Db.php
@@ -0,0 +1,177 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Db.php 5100 2007-06-04 19:02:22Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Loader
+ */
+require_once 'Zend/Loader.php';
+
+/**
+ * @see Zend_Db_Exception
+ */
+require_once 'Zend/Db/Exception.php';
+
+
+/**
+ * Class for connecting to SQL databases and performing common operations.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db
+{
+
+ const CASE_FOLDING = 'caseFolding';
+
+ const AUTO_QUOTE_IDENTIFIERS = 'autoQuoteIdentifiers';
+
+ /**
+ * PDO constant values discovered by this script result:
+ *
+ * $list = array(
+ * 'PARAM_BOOL', 'PARAM_NULL', 'PARAM_INT', 'PARAM_STR', 'PARAM_LOB',
+ * 'PARAM_STMT', 'PARAM_INPUT_OUTPUT', 'FETCH_LAZY', 'FETCH_ASSOC',
+ * 'FETCH_NUM', 'FETCH_BOTH', 'FETCH_OBJ', 'FETCH_BOUND',
+ * 'FETCH_COLUMN', 'FETCH_CLASS', 'FETCH_INTO', 'FETCH_FUNC',
+ * 'FETCH_GROUP', 'FETCH_UNIQUE', 'FETCH_CLASSTYPE', 'FETCH_SERIALIZE',
+ * 'FETCH_NAMED', 'ATTR_AUTOCOMMIT', 'ATTR_PREFETCH', 'ATTR_TIMEOUT',
+ * 'ATTR_ERRMODE', 'ATTR_SERVER_VERSION', 'ATTR_CLIENT_VERSION',
+ * 'ATTR_SERVER_INFO', 'ATTR_CONNECTION_STATUS', 'ATTR_CASE',
+ * 'ATTR_CURSOR_NAME', 'ATTR_CURSOR', 'ATTR_ORACLE_NULLS',
+ * 'ATTR_PERSISTENT', 'ATTR_STATEMENT_CLASS', 'ATTR_FETCH_TABLE_NAMES',
+ * 'ATTR_FETCH_CATALOG_NAMES', 'ATTR_DRIVER_NAME',
+ * 'ATTR_STRINGIFY_FETCHES', 'ATTR_MAX_COLUMN_LEN', 'ERRMODE_SILENT',
+ * 'ERRMODE_WARNING', 'ERRMODE_EXCEPTION', 'CASE_NATURAL',
+ * 'CASE_LOWER', 'CASE_UPPER', 'NULL_NATURAL', 'NULL_EMPTY_STRING',
+ * 'NULL_TO_STRING', 'ERR_NONE', 'FETCH_ORI_NEXT',
+ * 'FETCH_ORI_PRIOR', 'FETCH_ORI_FIRST', 'FETCH_ORI_LAST',
+ * 'FETCH_ORI_ABS', 'FETCH_ORI_REL', 'CURSOR_FWDONLY', 'CURSOR_SCROLL',
+ * 'ERR_CANT_MAP', 'ERR_SYNTAX', 'ERR_CONSTRAINT', 'ERR_NOT_FOUND',
+ * 'ERR_ALREADY_EXISTS', 'ERR_NOT_IMPLEMENTED', 'ERR_MISMATCH',
+ * 'ERR_TRUNCATED', 'ERR_DISCONNECTED', 'ERR_NO_PERM',
+ * );
+ *
+ * $const = array();
+ * foreach ($list as $name) {
+ * $const[$name] = constant("PDO::$name");
+ * }
+ * var_export($const);
+ */
+ const ATTR_AUTOCOMMIT = 0;
+ const ATTR_CASE = 8;
+ const ATTR_CLIENT_VERSION = 5;
+ const ATTR_CONNECTION_STATUS = 7;
+ const ATTR_CURSOR = 10;
+ const ATTR_CURSOR_NAME = 9;
+ const ATTR_DRIVER_NAME = 16;
+ const ATTR_ERRMODE = 3;
+ const ATTR_FETCH_CATALOG_NAMES = 15;
+ const ATTR_FETCH_TABLE_NAMES = 14;
+ const ATTR_MAX_COLUMN_LEN = 18;
+ const ATTR_ORACLE_NULLS = 11;
+ const ATTR_PERSISTENT = 12;
+ const ATTR_PREFETCH = 1;
+ const ATTR_SERVER_INFO = 6;
+ const ATTR_SERVER_VERSION = 4;
+ const ATTR_STATEMENT_CLASS = 13;
+ const ATTR_STRINGIFY_FETCHES = 17;
+ const ATTR_TIMEOUT = 2;
+ const CASE_LOWER = 2;
+ const CASE_NATURAL = 0;
+ const CASE_UPPER = 1;
+ const CURSOR_FWDONLY = 0;
+ const CURSOR_SCROLL = 1;
+ const ERR_ALREADY_EXISTS = NULL;
+ const ERR_CANT_MAP = NULL;
+ const ERR_CONSTRAINT = NULL;
+ const ERR_DISCONNECTED = NULL;
+ const ERR_MISMATCH = NULL;
+ const ERR_NO_PERM = NULL;
+ const ERR_NONE = '00000';
+ const ERR_NOT_FOUND = NULL;
+ const ERR_NOT_IMPLEMENTED = NULL;
+ const ERR_SYNTAX = NULL;
+ const ERR_TRUNCATED = NULL;
+ const ERRMODE_EXCEPTION = 2;
+ const ERRMODE_SILENT = 0;
+ const ERRMODE_WARNING = 1;
+ const FETCH_ASSOC = 2;
+ const FETCH_BOTH = 4;
+ const FETCH_BOUND = 6;
+ const FETCH_CLASS = 8;
+ const FETCH_CLASSTYPE = 262144;
+ const FETCH_COLUMN = 7;
+ const FETCH_FUNC = 10;
+ const FETCH_GROUP = 65536;
+ const FETCH_INTO = 9;
+ const FETCH_LAZY = 1;
+ const FETCH_NAMED = 11;
+ const FETCH_NUM = 3;
+ const FETCH_OBJ = 5;
+ const FETCH_ORI_ABS = 4;
+ const FETCH_ORI_FIRST = 2;
+ const FETCH_ORI_LAST = 3;
+ const FETCH_ORI_NEXT = 0;
+ const FETCH_ORI_PRIOR = 1;
+ const FETCH_ORI_REL = 5;
+ const FETCH_SERIALIZE = 524288;
+ const FETCH_UNIQUE = 196608;
+ const NULL_EMPTY_STRING = 1;
+ const NULL_NATURAL = 0;
+ const NULL_TO_STRING = NULL;
+ const PARAM_BOOL = 5;
+ const PARAM_INPUT_OUTPUT = -2147483648;
+ const PARAM_INT = 1;
+ const PARAM_LOB = 3;
+ const PARAM_NULL = 0;
+ const PARAM_STMT = 4;
+ const PARAM_STR = 2;
+
+ /**
+ * Factory for Zend_Db_Adapter_Abstract classes.
+ *
+ * Additional keys are processed as key-value pairs for the adapter config array.
+ *
+ * @param string $adapterName Name of the adapter to return: 'pdo_mysql' -> Zend_Db_Adapter_Pdo_Mysql
+ * @param array $config OPTIONAL; an array of adapter configuration keys.
+ * @return Zend_Db_Adapter_Abstract
+ * @throws Zend_Db_Exception
+ */
+ public static function factory($adapterName, array $config = array())
+ {
+ if (!is_string($adapterName) or !strlen($adapterName)) {
+ throw new Zend_Db_Exception('Adapter name must be specified in a string.');
+ }
+
+ $adapterName = strtolower($adapterName); // normalize input
+ $adapterName = 'Zend_Db_Adapter_' .
+ str_replace(' ', '_' , ucwords(str_replace('_', ' ', $adapterName)));
+
+ Zend_Loader::loadClass($adapterName);
+
+ return new $adapterName($config);
+ }
+
+}
diff --git a/libs/Zend/Db/Adapter/Abstract.php b/libs/Zend/Db/Adapter/Abstract.php
new file mode 100755
index 0000000000..ab45a643f1
--- /dev/null
+++ b/libs/Zend/Db/Adapter/Abstract.php
@@ -0,0 +1,911 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Abstract.php 5503 2007-06-29 18:18:06Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Db
+ */
+require_once 'Zend/Db.php';
+
+/**
+ * @see Zend_Db_Profiler
+ */
+require_once 'Zend/Db/Profiler.php';
+
+/**
+ * @see Zend_Db_Select
+ */
+require_once 'Zend/Db/Select.php';
+
+
+/**
+ * Class for connecting to SQL databases and performing common operations.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Db_Adapter_Abstract
+{
+
+ /**
+ * User-provided configuration
+ *
+ * @var array
+ */
+ protected $_config = array();
+
+ /**
+ * Fetch mode
+ *
+ * @var integer
+ */
+ protected $_fetchMode = Zend_Db::FETCH_ASSOC;
+
+ /**
+ * Query profiler
+ *
+ * @var Zend_Db_Profiler
+ */
+ protected $_profiler;
+
+ /**
+ * Database connection
+ *
+ * @var object|resource|null
+ */
+ protected $_connection = null;
+
+ /**
+ * Specifies the case of column names retrieved in queries
+ * Options
+ * Zend_Db::CASE_NATURAL (default)
+ * Zend_Db::CASE_LOWER
+ * Zend_Db::CASE_UPPER
+ *
+ * @access protected
+ */
+ protected $_caseFolding = Zend_Db::CASE_NATURAL;
+
+ /**
+ * Specifies whether the adapter automatically quotes identifiers.
+ * If true, most SQL generated by Zend_Db classes applies
+ * identifier quoting automatically.
+ * If false, developer must quote identifiers themselves
+ * by calling quoteIdentifier().
+ *
+ * @access protected
+ */
+ protected $_autoQuoteIdentifiers = true;
+
+ /**
+ * Constructor.
+ *
+ * $config is an array of key/value pairs containing configuration
+ * options. These options are common to most adapters:
+ *
+ * dbname => (string) The name of the database to user
+ * username => (string) Connect to the database as this username.
+ * password => (string) Password associated with the username.
+ * host => (string) What host to connect to, defaults to localhost
+ *
+ * Some options are used on a case-by-case basis by adapters:
+ *
+ * port => (string) The port of the database
+ * persistent => (boolean) Whether to use a persistent connection or not, defaults to false
+ * protocol => (string) The network protocol, defaults to TCPIP
+ * caseFolding => (int)
+ *
+ * @param array $config An array of configuration keys.
+ * @throws Zend_Db_Adapter_Exception
+ */
+ public function __construct(array $config = array())
+ {
+ $this->_checkRequiredOptions($config);
+
+ $options = array(
+ Zend_Db::CASE_FOLDING => $this->_caseFolding,
+ Zend_DB::AUTO_QUOTE_IDENTIFIERS => $this->_autoQuoteIdentifiers
+ );
+ $driver_options = array();
+
+ // normalize the config and merge it with the defaults
+ if (array_key_exists('options', $config)) {
+ // can't use array_merge() because keys might be integers
+ foreach ((array) $config['options'] as $key => $value) {
+ $options[$key] = $value;
+ }
+ }
+ if (array_key_exists('driver_options', $config)) {
+ // can't use array_merge() because keys might be integers
+ foreach ((array) $config['driver_options'] as $key => $value) {
+ $driver_options[$key] = $value;
+ }
+ }
+ $this->_config = array_merge($this->_config, $config);
+ $this->_config['options'] = $options;
+ $this->_config['driver_options'] = $driver_options;
+
+ // obtain the case setting, if there is one
+ if (array_key_exists(Zend_Db::CASE_FOLDING, $options)) {
+ $case = (int) $options[Zend_Db::CASE_FOLDING];
+ switch ($case) {
+ case Zend_Db::CASE_LOWER:
+ case Zend_Db::CASE_UPPER:
+ case Zend_Db::CASE_NATURAL:
+ $this->_caseFolding = $case;
+ break;
+ default:
+ require_once 'Zend/Db/Adapter/Exception.php';
+ throw new Zend_Db_Adapter_Exception("Case must be one of the following constants: Zend_Db::CASE_NATURAL, Zend_Db::CASE_LOWER, Zend_Db::CASE_UPPER");
+ }
+ }
+
+ // obtain quoting property if there is one
+ if (array_key_exists(Zend_Db::AUTO_QUOTE_IDENTIFIERS, $options)) {
+ $this->_autoQuoteIdentifiers = (bool) $options[Zend_Db::AUTO_QUOTE_IDENTIFIERS];
+ }
+
+ // create a profiler object
+ $enabled = false;
+ if (array_key_exists('profiler', $this->_config)) {
+ $enabled = (bool) $this->_config['profiler'];
+ unset($this->_config['profiler']);
+ }
+
+ $this->_profiler = new Zend_Db_Profiler($enabled);
+ }
+
+ /**
+ * Check for config options that are mandatory.
+ * Throw exceptions if any are missing.
+ *
+ * @param array $config
+ * @throws Zend_Db_Adapter_Exception
+ */
+ protected function _checkRequiredOptions(array $config)
+ {
+ // we need at least a dbname
+ if (! array_key_exists('dbname', $config)) {
+ require_once 'Zend/Db/Adapter/Exception.php';
+ throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'dbname' that names the database instance.");
+ }
+
+ if (! array_key_exists('password', $config)) {
+ /**
+ * @see Zend_Db_Adapter_Exception
+ */
+ require_once 'Zend/Db/Adapter/Exception.php';
+ throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'password' for login credentials.");
+ }
+
+ if (! array_key_exists('username', $config)) {
+ /**
+ * @see Zend_Db_Adapter_Exception
+ */
+ require_once 'Zend/Db/Adapter/Exception.php';
+ throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'username' for login credentials.");
+ }
+ }
+
+ /**
+ * Returns the underlying database connection object or resource.
+ * If not presently connected, this initiates the connection.
+ *
+ * @return object|resource|null
+ */
+ public function getConnection()
+ {
+ $this->_connect();
+ return $this->_connection;
+ }
+
+ /**
+ * Returns the profiler for this adapter.
+ *
+ * @return Zend_Db_Profiler
+ */
+ public function getProfiler()
+ {
+ return $this->_profiler;
+ }
+
+ /**
+ * Prepares and executes an SQL statement with bound data.
+ *
+ * @param mixed $sql The SQL statement with placeholders.
+ * May be a string or Zend_Db_Select.
+ * @param mixed $bind An array of data to bind to the placeholders.
+ * @return Zend_Db_Statement_Interface
+ */
+ public function query($sql, $bind = array())
+ {
+ // connect to the database if needed
+ $this->_connect();
+
+ // is the $sql a Zend_Db_Select object?
+ if ($sql instanceof Zend_Db_Select) {
+ $sql = $sql->__toString();
+ }
+
+ // make sure $bind to an array;
+ // don't use (array) typecasting because
+ // because $bind may be a Zend_Db_Expr object
+ if (!is_array($bind)) {
+ $bind = array($bind);
+ }
+
+ // prepare and execute the statement with profiling
+ $stmt = $this->prepare($sql);
+ $stmt->execute($bind);
+
+ // return the results embedded in the prepared statement object
+ $stmt->setFetchMode($this->_fetchMode);
+ return $stmt;
+ }
+
+ /**
+ * Leave autocommit mode and begin a transaction.
+ *
+ * @return bool True
+ */
+ public function beginTransaction()
+ {
+ $this->_connect();
+ $q = $this->_profiler->queryStart('begin', Zend_Db_Profiler::TRANSACTION);
+ $this->_beginTransaction();
+ $this->_profiler->queryEnd($q);
+ return true;
+ }
+
+ /**
+ * Commit a transaction and return to autocommit mode.
+ *
+ * @return bool True
+ */
+ public function commit()
+ {
+ $this->_connect();
+ $q = $this->_profiler->queryStart('commit', Zend_Db_Profiler::TRANSACTION);
+ $this->_commit();
+ $this->_profiler->queryEnd($q);
+ return true;
+ }
+
+ /**
+ * Roll back a transaction and return to autocommit mode.
+ *
+ * @return bool True
+ */
+ public function rollBack()
+ {
+ $this->_connect();
+ $q = $this->_profiler->queryStart('rollback', Zend_Db_Profiler::TRANSACTION);
+ $this->_rollBack();
+ $this->_profiler->queryEnd($q);
+ return true;
+ }
+
+ /**
+ * Inserts a table row with specified data.
+ *
+ * @param mixed $table The table to insert data into.
+ * @param array $bind Column-value pairs.
+ * @return int The number of affected rows.
+ */
+ public function insert($table, array $bind)
+ {
+ // extract and quote col names from the array keys
+ $cols = array();
+ $vals = array();
+ foreach ($bind as $col => $val) {
+ $cols[] = $this->quoteIdentifier($col, true);
+ if ($val instanceof Zend_Db_Expr) {
+ $vals[] = $val->__toString();
+ unset($bind[$col]);
+ } else {
+ $vals[] = '?';
+ }
+ }
+
+ // build the statement
+ $sql = "INSERT INTO "
+ . $this->quoteIdentifier($table, true)
+ . ' (' . implode(', ', $cols) . ') '
+ . 'VALUES (' . implode(', ', $vals) . ')';
+
+ // execute the statement and return the number of affected rows
+ $stmt = $this->query($sql, array_values($bind));
+ $result = $stmt->rowCount();
+ return $result;
+ }
+
+ /**
+ * Updates table rows with specified data based on a WHERE clause.
+ *
+ * @param mixed $table The table to update.
+ * @param array $bind Column-value pairs.
+ * @param mixed $where UPDATE WHERE clause(s).
+ * @return int The number of affected rows.
+ */
+ public function update($table, array $bind, $where = '')
+ {
+ /**
+ * Build "col = ?" pairs for the statement,
+ * except for Zend_Db_Expr which is treated literally.
+ */
+ $set = array();
+ foreach ($bind as $col => $val) {
+ if ($val instanceof Zend_Db_Expr) {
+ $val = $val->__toString();
+ unset($bind[$col]);
+ } else {
+ $val = '?';
+ }
+ $set[] = $this->quoteIdentifier($col, true) . ' = ' . $val;
+ }
+
+ $where = $this->_whereExpr($where);
+
+ /**
+ * Build the UPDATE statement
+ */
+ $sql = "UPDATE "
+ . $this->quoteIdentifier($table, true)
+ . ' SET ' . implode(', ', $set)
+ . (($where) ? " WHERE $where" : '');
+
+ /**
+ * Execute the statement and return the number of affected rows
+ */
+ $stmt = $this->query($sql, array_values($bind));
+ $result = $stmt->rowCount();
+ return $result;
+ }
+
+ /**
+ * Deletes table rows based on a WHERE clause.
+ *
+ * @param mixed $table The table to update.
+ * @param mixed $where DELETE WHERE clause(s).
+ * @return int The number of affected rows.
+ */
+ public function delete($table, $where = '')
+ {
+ $where = $this->_whereExpr($where);
+
+ /**
+ * Build the DELETE statement
+ */
+ $sql = "DELETE FROM "
+ . $this->quoteIdentifier($table, true)
+ . (($where) ? " WHERE $where" : '');
+
+ /**
+ * Execute the statement and return the number of affected rows
+ */
+ $stmt = $this->query($sql);
+ $result = $stmt->rowCount();
+ return $result;
+ }
+
+ /**
+ * Convert an array, string, or Zend_Db_Expr object
+ * into a string to put in a WHERE clause.
+ *
+ * @param mixed $where
+ * @return string
+ */
+ protected function _whereExpr($where)
+ {
+ if (empty($where)) {
+ return $where;
+ }
+ if (!is_array($where)) {
+ $where = array($where);
+ }
+ foreach ($where as &$term) {
+ if ($term instanceof Zend_Db_Expr) {
+ $term = $term->__toString();
+ }
+ $term = '(' . $term . ')';
+ }
+ $where = implode(' AND ', $where);
+ return $where;
+ }
+
+ /**
+ * Creates and returns a new Zend_Db_Select object for this adapter.
+ *
+ * @return Zend_Db_Select
+ */
+ public function select()
+ {
+ return new Zend_Db_Select($this);
+ }
+
+ /**
+ * Get the fetch mode.
+ *
+ * @return int
+ */
+ public function getFetchMode()
+ {
+ return $this->_fetchMode;
+ }
+
+ /**
+ * Fetches all SQL result rows as a sequential array.
+ * Uses the current fetchMode for the adapter.
+ *
+ * @param string|Zend_Db_Select $sql An SQL SELECT statement.
+ * @param mixed $bind Data to bind into SELECT placeholders.
+ * @return array
+ */
+ public function fetchAll($sql, $bind = array())
+ {
+ $stmt = $this->query($sql, $bind);
+ $result = $stmt->fetchAll($this->_fetchMode);
+ return $result;
+ }
+
+ /**
+ * Fetches all SQL result rows as an associative array.
+ *
+ * The first column is the key, the entire row array is the
+ * value.
+ *
+ * @param string|Zend_Db_Select $sql An SQL SELECT statement.
+ * @param mixed $bind Data to bind into SELECT placeholders.
+ * @return string
+ */
+ public function fetchAssoc($sql, $bind = array())
+ {
+ $stmt = $this->query($sql, $bind);
+ $data = array();
+ while ($row = $stmt->fetch($this->_fetchMode)) {
+ $tmp = array_values(array_slice($row, 0, 1));
+ $data[$tmp[0]] = $row;
+ }
+ return $data;
+ }
+
+ /**
+ * Fetches the first column of all SQL result rows as an array.
+ *
+ * The first column in each row is used as the array key.
+ *
+ * @param string|Zend_Db_Select $sql An SQL SELECT statement.
+ * @param mixed $bind Data to bind into SELECT placeholders.
+ * @return array
+ */
+ public function fetchCol($sql, $bind = array())
+ {
+ $stmt = $this->query($sql, $bind);
+ $result = $stmt->fetchAll(Zend_Db::FETCH_COLUMN, 0);
+ return $result;
+ }
+
+ /**
+ * Fetches all SQL result rows as an array of key-value pairs.
+ *
+ * The first column is the key, the second column is the
+ * value.
+ *
+ * @param string|Zend_Db_Select $sql An SQL SELECT statement.
+ * @param mixed $bind Data to bind into SELECT placeholders.
+ * @return string
+ */
+ public function fetchPairs($sql, $bind = array())
+ {
+ $stmt = $this->query($sql, $bind);
+ $data = array();
+ while ($row = $stmt->fetch(Zend_Db::FETCH_NUM)) {
+ $data[$row[0]] = $row[1];
+ }
+ return $data;
+ }
+
+ /**
+ * Fetches the first column of the first row of the SQL result.
+ *
+ * @param string|Zend_Db_Select $sql An SQL SELECT statement.
+ * @param mixed $bind Data to bind into SELECT placeholders.
+ * @return string
+ */
+ public function fetchOne($sql, $bind = array())
+ {
+ $stmt = $this->query($sql, $bind);
+ $result = $stmt->fetchColumn(0);
+ return $result;
+ }
+
+ /**
+ * Fetches the first row of the SQL result.
+ * Uses the current fetchMode for the adapter.
+ *
+ * @param string|Zend_Db_Select $sql An SQL SELECT statement.
+ * @param mixed $bind Data to bind into SELECT placeholders.
+ * @return array
+ */
+ public function fetchRow($sql, $bind = array())
+ {
+ $stmt = $this->query($sql, $bind);
+ $result = $stmt->fetch($this->_fetchMode);
+ return $result;
+ }
+
+ /**
+ * Quote a raw string.
+ *
+ * @param string $value Raw string
+ * @return string Quoted string
+ */
+ protected function _quote($value)
+ {
+ if (is_numeric($value)) {
+ return $value;
+ }
+ return "'" . addcslashes($value, "\000\n\r\\'\"\032") . "'";
+ }
+
+ /**
+ * Safely quotes a value for an SQL statement.
+ *
+ * If an array is passed as the value, the array values are quoted
+ * and then returned as a comma-separated string.
+ *
+ * @param mixed $value The value to quote.
+ * @return mixed An SQL-safe quoted value (or string of separated values).
+ */
+ public function quote($value)
+ {
+ $this->_connect();
+
+ if ($value instanceof Zend_Db_Expr) {
+ return $value->__toString();
+ }
+
+ if (is_array($value)) {
+ foreach ($value as &$val) {
+ $val = $this->quote($val);
+ }
+ return implode(', ', $value);
+ }
+
+ return $this->_quote($value);
+ }
+
+ /**
+ * Quotes a value and places into a piece of text at a placeholder.
+ *
+ * The placeholder is a question-mark; all placeholders will be replaced
+ * with the quoted value. For example:
+ *
+ * <code>
+ * $text = "WHERE date < ?";
+ * $date = "2005-01-02";
+ * $safe = $sql->quoteInto($text, $date);
+ * // $safe = "WHERE date < '2005-01-02'"
+ * </code>
+ *
+ * @param string $text The text with a placeholder.
+ * @param mixed $value The value to quote.
+ * @return mixed An SQL-safe quoted value placed into the orignal text.
+ */
+ public function quoteInto($text, $value)
+ {
+ return str_replace('?', $this->quote($value), $text);
+ }
+
+ /**
+ * Quotes an identifier.
+ *
+ * Accepts a string representing a qualified indentifier. For Example:
+ * <code>
+ * $adapter->quoteIdentifier('myschema.mytable')
+ * </code>
+ * Returns: "myschema"."mytable"
+ *
+ * Or, an array of one or more identifiers that may form a qualified identifier:
+ * <code>
+ * $adapter->quoteIdentifier(array('myschema','my.table'))
+ * </code>
+ * Returns: "myschema"."my.table"
+ *
+ * The actual quote character surrounding the identifiers may vary depending on
+ * the adapter.
+ *
+ * @param string|array|Zend_Db_Expr $ident The identifier.
+ * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
+ * @return string The quoted identifier.
+ */
+ public function quoteIdentifier($ident, $auto=false)
+ {
+ return $this->_quoteIdentifierAs($ident, null, $auto);
+ }
+
+ /**
+ * Quote a column identifier and alias.
+ *
+ * @param string|array|Zend_Db_Expr $ident The identifier or expression.
+ * @param string $alias An alias for the column.
+ * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
+ * @return string The quoted identifier and alias.
+ */
+ public function quoteColumnAs($ident, $alias, $auto=false)
+ {
+ return $this->_quoteIdentifierAs($ident, $alias, $auto);
+ }
+
+ /**
+ * Quote a table identifier and alias.
+ *
+ * @param string|array|Zend_Db_Expr $ident The identifier or expression.
+ * @param string $alias An alias for the table.
+ * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
+ * @return string The quoted identifier and alias.
+ */
+ public function quoteTableAs($ident, $alias, $auto=false)
+ {
+ return $this->_quoteIdentifierAs($ident, $alias, $auto);
+ }
+
+ /**
+ * Quote an identifier and an optional alias.
+ *
+ * @param string|array|Zend_Db_Expr $ident The identifier or expression.
+ * @param string $alias An optional alias.
+ * @param string $as The string to add between the identifier/expression and the alias.
+ * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
+ * @return string The quoted identifier and alias.
+ */
+ protected function _quoteIdentifierAs($ident, $alias = null, $auto = false, $as = ' AS ')
+ {
+ if ($ident instanceof Zend_Db_Expr) {
+ $quoted = $ident->__toString();
+ } else {
+ if (is_string($ident)) {
+ $ident = explode('.', $ident);
+ }
+ if (is_array($ident)) {
+ $segments = array();
+ foreach ($ident as $segment) {
+ if ($segment instanceof Zend_Db_Expr) {
+ $segments[] = $segment->__toString();
+ } else {
+ $segments[] = $this->_quoteIdentifier($segment, $auto);
+ }
+ }
+ if ($alias !== null && end($ident) == $alias) {
+ $alias = null;
+ }
+ $quoted = implode('.', $segments);
+ } else {
+ $quoted = $this->_quoteIdentifier($ident, $auto);
+ }
+ }
+ if ($alias !== null) {
+ $quoted .= $as . $this->_quoteIdentifier($alias, $auto);
+ }
+ return $quoted;
+ }
+
+ /**
+ * Quote an identifier.
+ *
+ * @param string $value The identifier or expression.
+ * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
+ * @return string The quoted identifier and alias.
+ */
+ protected function _quoteIdentifier($value, $auto=false)
+ {
+ if ($auto === false || $this->_autoQuoteIdentifiers === true) {
+ $q = $this->getQuoteIdentifierSymbol();
+ return ($q . str_replace("$q", "$q$q", $value) . $q);
+ }
+ return $value;
+ }
+
+ /**
+ * Returns the symbol the adapter uses for delimited identifiers.
+ *
+ * @return string
+ */
+ public function getQuoteIdentifierSymbol()
+ {
+ return '"';
+ }
+
+ /**
+ * Return the most recent value from the specified sequence in the database.
+ * This is supported only on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null.
+ *
+ * @param string $sequenceName
+ * @return integer
+ */
+ public function lastSequenceId($sequenceName)
+ {
+ return null;
+ }
+
+ /**
+ * Generate a new value from the specified sequence in the database, and return it.
+ * This is supported only on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null.
+ *
+ * @param string $sequenceName
+ * @return integer
+ */
+ public function nextSequenceId($sequenceName)
+ {
+ return null;
+ }
+
+ /**
+ * Helper method to change the case of the strings used
+ * when returning result sets in FETCH_ASSOC and FETCH_BOTH
+ * modes.
+ *
+ * This is not intended to be used by application code,
+ * but the method must be public so the Statement class
+ * can invoke it.
+ *
+ * @param string $key
+ * @returns string
+ */
+ public function foldCase($key)
+ {
+ switch ($this->_caseFolding) {
+ case Zend_Db::CASE_LOWER:
+ return strtolower((string) $key);
+ case Zend_Db::CASE_UPPER:
+ return strtoupper((string) $key);
+ case Zend_Db::CASE_NATURAL:
+ default:
+ return (string) $key;
+ }
+ }
+
+ /**
+ * Abstract Methods
+ */
+
+ /**
+ * Returns a list of the tables in the database.
+ *
+ * @return array
+ */
+ abstract public function listTables();
+
+ /**
+ * Returns the column descriptions for a table.
+ *
+ * The return value is an associative array keyed by the column name,
+ * as returned by the RDBMS.
+ *
+ * The value of each array element is an associative array
+ * with the following keys:
+ *
+ * SCHEMA_NAME => string; name of database or schema
+ * TABLE_NAME => string;
+ * COLUMN_NAME => string; column name
+ * COLUMN_POSITION => number; ordinal position of column in table
+ * DATA_TYPE => string; SQL datatype name of column
+ * DEFAULT => string; default expression of column, null if none
+ * NULLABLE => boolean; true if column can have nulls
+ * LENGTH => number; length of CHAR/VARCHAR
+ * SCALE => number; scale of NUMERIC/DECIMAL
+ * PRECISION => number; precision of NUMERIC/DECIMAL
+ * UNSIGNED => boolean; unsigned property of an integer type
+ * PRIMARY => boolean; true if column is part of the primary key
+ * PRIMARY_POSITION => integer; position of column in primary key
+ *
+ * @param string $tableName
+ * @param string $schemaName OPTIONAL
+ * @return array
+ */
+ abstract public function describeTable($tableName, $schemaName = null);
+
+ /**
+ * Creates a connection to the database.
+ *
+ * @return void
+ */
+ abstract protected function _connect();
+
+ /**
+ * Force the connection to close.
+ *
+ * @return void
+ */
+ abstract public function closeConnection();
+
+ /**
+ * Prepare a statement and return a PDOStatement-like object.
+ *
+ * @param string|Zend_Db_Select $sql SQL query
+ * @return Zend_Db_Statment|PDOStatement
+ */
+ abstract public function prepare($sql);
+
+ /**
+ * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
+ *
+ * As a convention, on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
+ * from the arguments and returns the last id generated by that sequence.
+ * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
+ * returns the last value generated for such a column, and the table name
+ * argument is disregarded.
+ *
+ * @param string $tableName OPTIONAL Name of table.
+ * @param string $primaryKey OPTIONAL Name of primary key column.
+ * @return integer
+ */
+ abstract public function lastInsertId($tableName = null, $primaryKey = null);
+
+ /**
+ * Begin a transaction.
+ */
+ abstract protected function _beginTransaction();
+
+ /**
+ * Commit a transaction.
+ */
+ abstract protected function _commit();
+
+ /**
+ * Roll-back a transaction.
+ */
+ abstract protected function _rollBack();
+
+ /**
+ * Set the fetch mode.
+ *
+ * @param integer $mode
+ */
+ abstract public function setFetchMode($mode);
+
+ /**
+ * Adds an adapter-specific LIMIT clause to the SELECT statement.
+ *
+ * @param mixed $sql
+ * @param integer $count
+ * @param integer $offset
+ * @return string
+ */
+ abstract public function limit($sql, $count, $offset = 0);
+
+ /**
+ * Check if the adapter supports real SQL parameters.
+ *
+ * @param string $type 'positional' or 'named'
+ * @return bool
+ */
+ abstract public function supportsParameters($type);
+
+}
diff --git a/libs/Zend/Db/Adapter/Db2.php b/libs/Zend/Db/Adapter/Db2.php
new file mode 100755
index 0000000000..46eb4975be
--- /dev/null
+++ b/libs/Zend/Db/Adapter/Db2.php
@@ -0,0 +1,606 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ *
+ */
+
+/**
+ * @see Zend_Db
+ */
+require_once 'Zend/Db.php';
+
+/**
+ * @see Zend_Db_Adapter_Abstract
+ */
+require_once 'Zend/Db/Adapter/Abstract.php';
+
+/**
+ * @see Zend_Db_Statement_Db2
+ */
+require_once 'Zend/Db/Statement/Db2.php';
+
+
+/**
+ * @package Zend_Db
+ * @copyright Copyright (c) 2005-2007 Zend Technologies Inc. (http://www.zend.com)
+ * @license Zend Framework License version 1.0
+ * @author Joscha Feth <jffeth@de.ibm.com>
+ * @author Salvador Ledezma <ledezma@us.ibm.com>
+ */
+
+class Zend_Db_Adapter_Db2 extends Zend_Db_Adapter_Abstract
+{
+ /**
+ * User-provided configuration.
+ *
+ * Basic keys are:
+ *
+ * username => (string) Connect to the database as this username.
+ * password => (string) Password associated with the username.
+ * host => (string) What host to connect to (default 127.0.0.1)
+ * dbname => (string) The name of the database to user
+ * protocol => (string) Protocol to use, defaults to "TCPIP"
+ * port => (integer) Port number to use for TCP/IP if protocol is "TCPIP"
+ * persistent => (boolean) Set TRUE to use a persistent connection (db2_pconnect)
+ *
+ * @var array
+ */
+ protected $_config = array(
+ 'dbname' => null,
+ 'username' => null,
+ 'password' => null,
+ 'host' => 'localhost',
+ 'port' => '50000',
+ 'protocol' => 'TCPIP',
+ 'persistent' => false
+ );
+
+ /**
+ * Execution mode
+ *
+ * @var int execution flag (DB2_AUTOCOMMIT_ON or DB2_AUTOCOMMIT_OFF)
+ * @access protected
+ */
+ protected $_execute_mode = DB2_AUTOCOMMIT_ON;
+
+ /**
+ * Table name of the last accessed table for an insert operation
+ * This is a DB2-Adapter-specific member variable with the utmost
+ * probability you might not find it in other adapters...
+ *
+ * @var string
+ * @access protected
+ */
+ protected $_lastInsertTable = null;
+
+ /**
+ * Creates a connection resource.
+ *
+ * @return void
+ */
+ protected function _connect()
+ {
+ if (is_resource($this->_connection)) {
+ // connection already exists
+ return;
+ }
+
+ if (!extension_loaded('ibm_db2')) {
+ /**
+ * @see Zend_Db_Adapter_Db2_Exception
+ */
+ require_once 'Zend/Db/Adapter/Db2/Exception.php';
+ throw new Zend_DB_Adapter_Db2_Exception('The IBM DB2 extension is required for this adapter but not loaded');
+ }
+
+ if ($this->_config['persistent']) {
+ // use persistent connection
+ $conn_func_name = 'db2_pconnect';
+ } else {
+ // use "normal" connection
+ $conn_func_name = 'db2_connect';
+ }
+
+ if (!isset($this->_config['driver_options']['autocommit'])) {
+ // set execution mode
+ $this->_config['driver_options']['autocommit'] = &$this->_execute_mode;
+ }
+
+ if (isset($this->_config['options'][Zend_Db::CASE_FOLDING])) {
+ $caseAttrMap = array(
+ Zend_Db::CASE_NATURAL => DB2_CASE_NATURAL,
+ Zend_Db::CASE_UPPER => DB2_CASE_UPPER,
+ Zend_Db::CASE_LOWER => DB2_CASE_LOWER
+ );
+ $this->_config['driver_options']['DB2_ATTR_CASE'] = $caseAttrMap[$this->_config['options'][Zend_Db::CASE_FOLDING]];
+ }
+
+ if ($this->_config['host'] !== 'localhost') {
+ // if the host isn't localhost, use extended connection params
+ $dbname = 'DRIVER={IBM DB2 ODBC DRIVER}' .
+ ';DATABASE=' . $this->_config['dbname'] .
+ ';HOSTNAME=' . $this->_config['host'] .
+ ';PORT=' . $this->_config['port'] .
+ ';PROTOCOL=' . $this->_config['protocol'] .
+ ';UID=' . $this->_config['username'] .
+ ';PWD=' . $this->_config['password'] .';';
+ $this->_connection = $conn_func_name(
+ $dbname,
+ null,
+ null,
+ $this->_config['driver_options']
+ );
+ } else {
+ // host is localhost, so use standard connection params
+ $this->_connection = $conn_func_name(
+ $this->_config['dbname'],
+ $this->_config['username'],
+ $this->_config['password'],
+ $this->_config['driver_options']
+ );
+ }
+
+ // check the connection
+ if (!$this->_connection) {
+ /**
+ * @see Zend_Db_Adapter_Db2_Exception
+ */
+ require_once 'Zend/Db/Adapter/Db2/Exception.php';
+ throw new Zend_Db_Adapter_Db2_Exception(db2_conn_errormsg(), db2_conn_error());
+ }
+ }
+
+ /**
+ * Force the connection to close.
+ *
+ * @return void
+ */
+ public function closeConnection()
+ {
+ db2_close($this->_connection);
+ $this->_connection = null;
+ }
+
+ /**
+ * Returns an SQL statement for preparation.
+ *
+ * @param string $sql The SQL statement with placeholders.
+ * @return Zend_Db_Statement_Db2
+ */
+ public function prepare($sql)
+ {
+ $this->_connect();
+ $stmt = new Zend_Db_Statement_Db2($this, $sql);
+ $stmt->setFetchMode($this->_fetchMode);
+ return $stmt;
+ }
+
+ /**
+ * Gets the execution mode
+ *
+ * @return int the execution mode (DB2_AUTOCOMMIT_ON or DB2_AUTOCOMMIT_OFF)
+ */
+ public function _getExecuteMode()
+ {
+ return $this->_execute_mode;
+ }
+
+ /**
+ * @param integer $mode
+ * @return void
+ */
+ public function _setExecuteMode($mode)
+ {
+ switch ($mode) {
+ case DB2_AUTOCOMMIT_OFF:
+ case DB2_AUTOCOMMIT_ON:
+ $this->_execute_mode = $mode;
+ db2_autocommit($this->_connection, $mode);
+ break;
+ default:
+ /**
+ * @see Zend_Db_Adapter_Db2_Exception
+ */
+ require_once 'Zend/Db/Adapter/Db2/Exception.php';
+ throw new Zend_Db_Adapter_Db2_Exception("execution mode not supported");
+ break;
+ }
+ }
+
+ /**
+ * Quote a raw string.
+ *
+ * @param string $value Raw string
+ * @return string Quoted string
+ */
+ protected function _quote($value)
+ {
+ if (is_numeric($value)) {
+ return $value;
+ }
+ /**
+ * Use db2_escape_string() if it is present in the IBM DB2 extension.
+ * But some supported versions of PHP do not include this function,
+ * so fall back to default quoting in the parent class.
+ */
+ if (function_exists('db2_escape_string')) {
+ return "'" . db2_escape_string($value) . "'";
+ }
+ return parent::_quote($value);
+ }
+
+ /**
+ * @return string
+ */
+ public function getQuoteIdentifierSymbol()
+ {
+ $this->_connect();
+ $info = db2_server_info($this->_connection);
+ $identQuote = $info->IDENTIFIER_QUOTE_CHAR;
+ return $identQuote;
+ }
+
+ /**
+ * Returns a list of the tables in the database.
+ *
+ * @return array
+ */
+ public function listTables()
+ {
+ $this->_connect();
+
+ // take the most general case and assume no z/OS
+ // since listTables() takes no parameters
+ $stmt = db2_tables($this->_connection);
+
+ $tables = array();
+
+ while ($row = db2_fetch_assoc($stmt)) {
+ $tables[] = $row['TABLE_NAME'];
+ }
+
+ return $tables;
+ }
+
+ /**
+ * Returns the column descriptions for a table.
+ *
+ * The return value is an associative array keyed by the column name,
+ * as returned by the RDBMS.
+ *
+ * The value of each array element is an associative array
+ * with the following keys:
+ *
+ * SCHEMA_NAME => string; name of database or schema
+ * TABLE_NAME => string;
+ * COLUMN_NAME => string; column name
+ * COLUMN_POSITION => number; ordinal position of column in table
+ * DATA_TYPE => string; SQL datatype name of column
+ * DEFAULT => string; default expression of column, null if none
+ * NULLABLE => boolean; true if column can have nulls
+ * LENGTH => number; length of CHAR/VARCHAR
+ * SCALE => number; scale of NUMERIC/DECIMAL
+ * PRECISION => number; precision of NUMERIC/DECIMAL
+ * UNSIGNED => boolean; unsigned property of an integer type
+ * PRIMARY => boolean; true if column is part of the primary key
+ * PRIMARY_POSITION => integer; position of column in primary key
+ * IDENTITY => integer; true if column is auto-generated with unique values
+ *
+ * @todo Discover integer unsigned property.
+ *
+ * @param string $tableName
+ * @param string $schemaName OPTIONAL
+ * @return array
+ */
+ public function describeTable($tableName, $schemaName = null)
+ {
+ $sql = "SELECT DISTINCT c.tabschema, c.tabname, c.colname, c.colno,
+ c.typename, c.default, c.nulls, c.length, c.scale,
+ c.identity, tc.type AS tabconsttype, k.colseq
+ FROM syscat.columns c
+ LEFT JOIN (syscat.keycoluse k JOIN syscat.tabconst tc
+ ON (k.tabschema = tc.tabschema
+ AND k.tabname = tc.tabname
+ AND tc.type = 'P'))
+ ON (c.tabschema = k.tabschema
+ AND c.tabname = k.tabname
+ AND c.colname = k.colname)
+ WHERE "
+ . $this->quoteInto('UPPER(c.tabname) = UPPER(?)', $tableName);
+ if ($schemaName) {
+ $sql .= $this->quoteInto(' AND UPPER(c.tabschema) = UPPER(?)', $schemaName);
+ }
+ $sql .= " ORDER BY c.colno";
+
+ $desc = array();
+ $stmt = $this->query($sql);
+
+ /**
+ * To avoid case issues, fetch using FETCH_NUM
+ */
+ $result = $stmt->fetchAll(Zend_Db::FETCH_NUM);
+
+ /**
+ * The ordering of columns is defined by the query so we can map
+ * to variables to improve readability
+ */
+ $tabschema = 0;
+ $tabname = 1;
+ $colname = 2;
+ $colno = 3;
+ $typename = 4;
+ $default = 5;
+ $nulls = 6;
+ $length = 7;
+ $scale = 8;
+ $identityCol = 9;
+ $tabconstype = 10;
+ $colseq = 11;
+
+ foreach ($result as $key => $row) {
+ list ($primary, $primaryPosition, $identity) = array(false, null, false);
+ if ($row[$tabconstype] == 'P') {
+ $primary = true;
+ $primaryPosition = $row[$colseq];
+ }
+ /**
+ * In IBM DB2, an column can be IDENTITY
+ * even if it is not part of the PRIMARY KEY.
+ */
+ if ($row[$identityCol] == 'Y') {
+ $identity = true;
+ }
+
+ // only colname needs to be case adjusted
+ $desc[$this->foldCase($row[$colname])] = array(
+ 'SCHEMA_NAME' => $this->foldCase($row[$tabschema]),
+ 'TABLE_NAME' => $this->foldCase($row[$tabname]),
+ 'COLUMN_NAME' => $this->foldCase($row[$colname]),
+ 'COLUMN_POSITION' => $row[$colno]+1,
+ 'DATA_TYPE' => $row[$typename],
+ 'DEFAULT' => $row[$default],
+ 'NULLABLE' => (bool) ($row[$nulls] == 'Y'),
+ 'LENGTH' => $row[$length],
+ 'SCALE' => $row[$scale],
+ 'PRECISION' => ($row[$typename] == 'DECIMAL' ? $row[$length] : 0),
+ 'UNSIGNED' => null, // @todo
+ 'PRIMARY' => $primary,
+ 'PRIMARY_POSITION' => $primaryPosition,
+ 'IDENTITY' => $identity
+ );
+ }
+
+ return $desc;
+ }
+
+ /**
+ * Return the most recent value from the specified sequence in the database.
+ * This is supported only on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null.
+ *
+ * @param string $sequenceName
+ * @return integer
+ */
+ public function lastSequenceId($sequenceName)
+ {
+ $this->_connect();
+ $sql = 'SELECT PREVVAL FOR '.$this->quoteIdentifier($sequenceName, true).' AS VAL FROM SYSIBM.SYSDUMMY1';
+ $value = $this->fetchOne($sql);
+ return $value;
+ }
+
+ /**
+ * Generate a new value from the specified sequence in the database, and return it.
+ * This is supported only on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null.
+ *
+ * @param string $sequenceName
+ * @return integer
+ */
+ public function nextSequenceId($sequenceName)
+ {
+ $this->_connect();
+ $sql = 'SELECT NEXTVAL FOR '.$this->quoteIdentifier($sequenceName, true).' AS VAL FROM SYSIBM.SYSDUMMY1';
+ $value = $this->fetchOne($sql);
+ return $value;
+ }
+
+ /**
+ * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
+ *
+ * As a convention, on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
+ * from the arguments and returns the last id generated by that sequence.
+ * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
+ * returns the last value generated for such a column, and the table name
+ * argument is disregarded.
+ *
+ * The IDENTITY_VAL_LOCAL() function gives the last generated identity value
+ * in the current process, even if it was for a GENERATED column.
+ *
+ * @param string $tableName OPTIONAL
+ * @param string $primaryKey OPTIONAL
+ * @return integer
+ */
+ public function lastInsertId($tableName = null, $primaryKey = null)
+ {
+ $this->_connect();
+
+ if ($tableName !== null) {
+ $sequenceName = $tableName;
+ if ($primaryKey) {
+ $sequenceName .= "_$primaryKey";
+ }
+ $sequenceName .= '_seq';
+ return $this->lastSequenceId($sequenceName);
+ }
+
+ $sql = 'SELECT IDENTITY_VAL_LOCAL() AS VAL FROM SYSIBM.SYSDUMMY1';
+ $value = $this->fetchOne($sql);
+ return $value;
+ }
+
+ /**
+ * Begin a transaction.
+ *
+ * @return void
+ */
+ protected function _beginTransaction()
+ {
+ $this->_setExecuteMode(DB2_AUTOCOMMIT_OFF);
+ }
+
+ /**
+ * Commit a transaction.
+ *
+ * @return void
+ */
+ protected function _commit()
+ {
+ if (!db2_commit($this->_connection)) {
+ /**
+ * @see Zend_Db_Adapter_Db2_Exception
+ */
+ require_once 'Zend/Db/Adapter/Db2/Exception.php';
+ throw new Zend_Db_Adapter_Db2_Exception(
+ db2_conn_errormsg($this->_connection),
+ db2_conn_error($this->_connection));
+ }
+
+ $this->_setExecuteMode(DB2_AUTOCOMMIT_ON);
+ }
+
+ /**
+ * Rollback a transaction.
+ *
+ * @return void
+ */
+ protected function _rollBack()
+ {
+ if (!db2_rollback($this->_connection)) {
+ /**
+ * @see Zend_Db_Adapter_Db2_Exception
+ */
+ require_once 'Zend/Db/Adapter/Db2/Exception.php';
+ throw new Zend_Db_Adapter_Db2_Exception(
+ db2_conn_errormsg($this->_connection),
+ db2_conn_error($this->_connection));
+ }
+ $this->_setExecuteMode(DB2_AUTOCOMMIT_ON);
+ }
+
+ /**
+ * Set the fetch mode.
+ *
+ * @param integer $mode
+ * @return void
+ */
+ public function setFetchMode($mode)
+ {
+ switch ($mode) {
+ case Zend_Db::FETCH_NUM: // seq array
+ case Zend_Db::FETCH_ASSOC: // assoc array
+ case Zend_Db::FETCH_BOTH: // seq+assoc array
+ case Zend_Db::FETCH_OBJ: // object
+ $this->_fetchMode = $mode;
+ break;
+ case Zend_Db::FETCH_BOUND: // bound to PHP variable
+ /**
+ * @see Zend_Db_Adapter_Db2_Exception
+ */
+ require_once 'Zend/Db/Adapter/Db2/Exception.php';
+ throw new Zend_Db_Adapter_Db2_Exception('FETCH_BOUND is not supported yet');
+ break;
+ default:
+ /**
+ * @see Zend_Db_Adapter_Db2_Exception
+ */
+ require_once 'Zend/Db/Adapter/Db2/Exception.php';
+ throw new Zend_Db_Adapter_Db2_Exception("Invalid fetch mode '$mode' specified");
+ break;
+ }
+ }
+
+ /**
+ * Adds an adapter-specific LIMIT clause to the SELECT statement.
+ *
+ * @param string $sql
+ * @param integer $count
+ * @param integer $offset OPTIONAL
+ * @return string
+ */
+ public function limit($sql, $count, $offset = 0)
+ {
+ $count = intval($count);
+ if ($count <= 0) {
+ /**
+ * @see Zend_Db_Adapter_Db2_Exception
+ */
+ require_once 'Zend/Db/Adapter/Db2/Exception.php';
+ throw new Zend_Db_Adapter_Db2_Exception("LIMIT argument count=$count is not valid");
+ }
+
+ $offset = intval($offset);
+ if ($offset < 0) {
+ /**
+ * @see Zend_Db_Adapter_Db2_Exception
+ */
+ require_once 'Zend/Db/Adapter/Db2/Exception.php';
+ throw new Zend_Db_Adapter_Db2_Exception("LIMIT argument offset=$offset is not valid");
+ }
+
+ if ($offset == 0) {
+ $limit_sql = $sql . " FETCH FIRST $count ROWS ONLY";
+ return $limit_sql;
+ }
+
+ /**
+ * DB2 does not implement the LIMIT clause as some RDBMS do.
+ * We have to simulate it with subqueries and ROWNUM.
+ * Unfortunately because we use the column wildcard "*",
+ * this puts an extra column into the query result set.
+ */
+ $limit_sql = "SELECT z2.*
+ FROM (
+ SELECT ROW_NUMBER() OVER() AS \"ZEND_DB_ROWNUM\", z1.*
+ FROM (
+ " . $sql . "
+ ) z1
+ ) z2
+ WHERE z2.zend_db_rownum BETWEEN " . ($offset+1) . " AND " . ($offset+$count);
+ return $limit_sql;
+ }
+
+ /**
+ * Check if the adapter supports real SQL parameters.
+ *
+ * @param string $type 'positional' or 'named'
+ * @return bool
+ */
+ public function supportsParameters($type)
+ {
+ switch ($type) {
+ case 'positional':
+ return true;
+ case 'named':
+ default:
+ return false;
+ }
+ }
+
+}
diff --git a/libs/Zend/Db/Adapter/Db2/Exception.php b/libs/Zend/Db/Adapter/Db2/Exception.php
new file mode 100755
index 0000000000..98d6311eca
--- /dev/null
+++ b/libs/Zend/Db/Adapter/Db2/Exception.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * Zend_Db_Adapter_Exception
+ */
+require_once 'Zend/Db/Adapter/Exception.php';
+
+/**
+ * Zend_Db_Adapter_Db2_Exception
+ *
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ * @author Joscha Feth <jffeth@de.ibm.com>
+ * @author Salvador Ledezma <ledezma@us.ibm.com>
+ */
+class Zend_Db_Adapter_Db2_Exception extends Zend_Db_Adapter_Exception
+{
+ protected $code = '00000';
+ protected $message = 'unknown exception';
+
+ function __construct($msg = 'unknown exception', $state = '00000') {
+ $this->message = $msg;
+ $this->code = $state;
+ }
+}
diff --git a/libs/Zend/Db/Adapter/Exception.php b/libs/Zend/Db/Adapter/Exception.php
new file mode 100755
index 0000000000..19cbb082e1
--- /dev/null
+++ b/libs/Zend/Db/Adapter/Exception.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Db_Exception
+ */
+require_once 'Zend/Db/Exception.php';
+
+/**
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Adapter_Exception extends Zend_Db_Exception
+{
+ protected $_chainedException = null;
+
+ public function __construct($message = null, Exception $e = null)
+ {
+ if ($e) {
+ $this->_chainedException = $e;
+ $this->code = $e->getCode();
+ }
+ parent::__construct($message);
+ }
+
+ public function getChainedException()
+ {
+ return $this->_chainedException;
+ }
+
+}
diff --git a/libs/Zend/Db/Adapter/Mysqli.php b/libs/Zend/Db/Adapter/Mysqli.php
new file mode 100755
index 0000000000..51b8f29c27
--- /dev/null
+++ b/libs/Zend/Db/Adapter/Mysqli.php
@@ -0,0 +1,432 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Mysqli.php 5503 2007-06-29 18:18:06Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Db_Adapter_Abstract
+ */
+require_once 'Zend/Db/Adapter/Abstract.php';
+
+/**
+ * @see Zend_Db_Profiler
+ */
+require_once 'Zend/Db/Profiler.php';
+
+/**
+ * @see Zend_Db_Select
+ */
+require_once 'Zend/Db/Select.php';
+
+/**
+ * @see Zend_Db_Statement_Mysqli
+ */
+require_once 'Zend/Db/Statement/Mysqli.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Adapter_Mysqli extends Zend_Db_Adapter_Abstract
+{
+
+ /**
+ * Quote a raw string.
+ *
+ * @param string $value Raw string
+ * @return string Quoted string
+ */
+ protected function _quote($value)
+ {
+ if (is_numeric($value)) {
+ return $value;
+ }
+ $this->_connect();
+ return "'" . $this->_connection->real_escape_string($value) . "'";
+ }
+
+ /**
+ * Returns the symbol the adapter uses for delimiting identifiers.
+ *
+ * @return string
+ */
+ public function getQuoteIdentifierSymbol()
+ {
+ return "`";
+ }
+
+ /**
+ * Returns a list of the tables in the database.
+ *
+ * @return array
+ */
+ public function listTables()
+ {
+ $result = array();
+ // Use mysqli extension API, because SHOW doesn't work
+ // well as a prepared statement on MySQL 4.1.
+ $sql = 'SHOW TABLES';
+ if ($queryResult = $this->getConnection()->query($sql)) {
+ while ($row = $queryResult->fetch_row()) {
+ $result[] = $row[0];
+ }
+ $queryResult->close();
+ } else {
+ /**
+ * @see Zend_Db_Adapter_Mysqli_Exception
+ */
+ require_once 'Zend/Db/Adapter/Mysqli/Exception.php';
+ throw new Zend_Db_Adapter_Mysqli_Exception($this->getConnection()->error);
+ }
+ return $result;
+ }
+
+ /**
+ * Returns the column descriptions for a table.
+ *
+ * The return value is an associative array keyed by the column name,
+ * as returned by the RDBMS.
+ *
+ * The value of each array element is an associative array
+ * with the following keys:
+ *
+ * SCHEMA_NAME => string; name of database or schema
+ * TABLE_NAME => string;
+ * COLUMN_NAME => string; column name
+ * COLUMN_POSITION => number; ordinal position of column in table
+ * DATA_TYPE => string; SQL datatype name of column
+ * DEFAULT => string; default expression of column, null if none
+ * NULLABLE => boolean; true if column can have nulls
+ * LENGTH => number; length of CHAR/VARCHAR
+ * SCALE => number; scale of NUMERIC/DECIMAL
+ * PRECISION => number; precision of NUMERIC/DECIMAL
+ * UNSIGNED => boolean; unsigned property of an integer type
+ * PRIMARY => boolean; true if column is part of the primary key
+ * PRIMARY_POSITION => integer; position of column in primary key
+ * IDENTITY => integer; true if column is auto-generated with unique values
+ *
+ * @param string $tableName
+ * @param string $schemaName OPTIONAL
+ * @return array
+ */
+ public function describeTable($tableName, $schemaName = null)
+ {
+ /**
+ * @todo: use INFORMATION_SCHEMA someday when
+ * MySQL's implementation isn't too slow.
+ */
+
+ if ($schemaName) {
+ $sql = 'DESCRIBE ' . $this->quoteIdentifier("$schemaName.$tableName", true);
+ } else {
+ $sql = 'DESCRIBE ' . $this->quoteIdentifier($tableName, true);
+ }
+
+ /**
+ * Use mysqli extension API, because DESCRIBE doesn't work
+ * well as a prepared statement on MySQL 4.1.
+ */
+ if ($queryResult = $this->getConnection()->query($sql)) {
+ while ($row = $queryResult->fetch_assoc()) {
+ $result[] = $row;
+ }
+ $queryResult->close();
+ } else {
+ /**
+ * @see Zend_Db_Adapter_Mysqli_Exception
+ */
+ require_once 'Zend/Db/Adapter/Mysqli/Exception.php';
+ throw new Zend_Db_Adapter_Mysqli_Exception($this->getConnection()->error);
+ }
+
+ $desc = array();
+
+ $row_defaults = array(
+ 'Length' => null,
+ 'Scale' => null,
+ 'Precision' => null,
+ 'Unsigned' => null,
+ 'Primary' => false,
+ 'PrimaryPosition' => null,
+ 'Identity' => false
+ );
+ $i = 1;
+ $p = 1;
+ foreach ($result as $key => $row) {
+ $row = array_merge($row_defaults, $row);
+ if (preg_match('/unsigned/', $row['Type'])) {
+ $row['Unsigned'] = true;
+ }
+ if (preg_match('/^((?:var)?char)\((\d+)\)/', $row['Type'], $matches)) {
+ $row['Type'] = $matches[1];
+ $row['Length'] = $matches[2];
+ } else if (preg_match('/^decimal\((\d+),(\d+)\)/', $row['Type'], $matches)) {
+ $row['Type'] = 'decimal';
+ $row['Precision'] = $matches[1];
+ $row['Scale'] = $matches[2];
+ } else if (preg_match('/^((?:big|medium|small|tiny)?int)\((\d+)\)/', $row['Type'], $matches)) {
+ $row['Type'] = $matches[1];
+ /**
+ * The optional argument of a MySQL int type is not precision
+ * or length; it is only a hint for display width.
+ */
+ }
+ if (strtoupper($row['Key']) == 'PRI') {
+ $row['Primary'] = true;
+ $row['PrimaryPosition'] = $p;
+ if ($row['Extra'] == 'auto_increment') {
+ $row['Identity'] = true;
+ } else {
+ $row['Identity'] = false;
+ }
+ ++$p;
+ }
+ $desc[$this->foldCase($row['Field'])] = array(
+ 'SCHEMA_NAME' => null, // @todo
+ 'TABLE_NAME' => $this->foldCase($tableName),
+ 'COLUMN_NAME' => $this->foldCase($row['Field']),
+ 'COLUMN_POSITION' => $i,
+ 'DATA_TYPE' => $row['Type'],
+ 'DEFAULT' => $row['Default'],
+ 'NULLABLE' => (bool) ($row['Null'] == 'YES'),
+ 'LENGTH' => $row['Length'],
+ 'SCALE' => $row['Scale'],
+ 'PRECISION' => $row['Precision'],
+ 'UNSIGNED' => $row['Unsigned'],
+ 'PRIMARY' => $row['Primary'],
+ 'PRIMARY_POSITION' => $row['PrimaryPosition'],
+ 'IDENTITY' => $row['Identity']
+ );
+ ++$i;
+ }
+ return $desc;
+ }
+
+ /**
+ * Creates a connection to the database.
+ *
+ * @return void
+ * @throws Zend_Db_Adapter_Mysqli_Exception
+ */
+ protected function _connect()
+ {
+ if ($this->_connection) {
+ return;
+ }
+
+ if (isset($this->_config['port'])) {
+ $port = (integer) $this->_config['port'];
+ } else {
+ $port = null;
+ }
+
+ // Suppress connection warnings here.
+ // Throw an exception instead.
+ @$this->_connection = new mysqli(
+ $this->_config['host'],
+ $this->_config['username'],
+ $this->_config['password'],
+ $this->_config['dbname'],
+ $port
+ );
+ if ($this->_connection === false || mysqli_connect_errno()) {
+ /**
+ * @see Zend_Db_Adapter_Mysqli_Exception
+ */
+ require_once 'Zend/Db/Adapter/Mysqli/Exception.php';
+ throw new Zend_Db_Adapter_Mysqli_Exception(mysqli_connect_error());
+ }
+ }
+
+ /**
+ * Force the connection to close.
+ *
+ * @return void
+ */
+ public function closeConnection()
+ {
+ $this->_connection->close();
+ $this->_connection = null;
+ }
+
+ /**
+ * Prepare a statement and return a PDOStatement-like object.
+ *
+ * @param string $sql SQL query
+ * @return Zend_Db_Statement_Mysqli
+ */
+ public function prepare($sql)
+ {
+ $this->_connect();
+ $stmt = new Zend_Db_Statement_Mysqli($this, $sql);
+ $stmt->setFetchMode($this->_fetchMode);
+ return $stmt;
+ }
+
+ /**
+ * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
+ *
+ * As a convention, on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
+ * from the arguments and returns the last id generated by that sequence.
+ * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
+ * returns the last value generated for such a column, and the table name
+ * argument is disregarded.
+ *
+ * MySQL does not support sequences, so $tableName and $primaryKey are ignored.
+ *
+ * @param string $tableName OPTIONAL Name of table.
+ * @param string $primaryKey OPTIONAL Name of primary key column.
+ * @return integer
+ */
+ public function lastInsertId($tableName = null, $primaryKey = null)
+ {
+ $mysqli = $this->_connection;
+ return $mysqli->insert_id;
+ }
+
+ /**
+ * Begin a transaction.
+ *
+ * @return void
+ */
+ protected function _beginTransaction()
+ {
+ $this->_connect();
+ $this->_connection->autocommit(false);
+ }
+
+ /**
+ * Commit a transaction.
+ *
+ * @return void
+ */
+ protected function _commit()
+ {
+ $this->_connect();
+ $this->_connection->commit();
+ $this->_connection->autocommit(true);
+ }
+
+ /**
+ * Roll-back a transaction.
+ *
+ * @return void
+ */
+ protected function _rollBack()
+ {
+ $this->_connect();
+ $this->_connection->rollback();
+ $this->_connection->autocommit(true);
+ }
+
+ /**
+ * Set the fetch mode.
+ *
+ * @param int $mode
+ * @return void
+ */
+ public function setFetchMode($mode)
+ {
+ switch ($mode) {
+ case Zend_Db::FETCH_LAZY:
+ case Zend_Db::FETCH_ASSOC:
+ case Zend_Db::FETCH_NUM:
+ case Zend_Db::FETCH_BOTH:
+ case Zend_Db::FETCH_NAMED:
+ case Zend_Db::FETCH_OBJ:
+ $this->_fetchMode = $mode;
+ break;
+ case Zend_Db::FETCH_BOUND: // bound to PHP variable
+ /**
+ * @see Zend_Db_Adapter_Mysqli_Exception
+ */
+ require_once 'Zend/Db/Adapter/Mysqli/Exception.php';
+ throw new Zend_Db_Adapter_Mysqli_Exception('FETCH_BOUND is not supported yet');
+ break;
+ default:
+ /**
+ * @see Zend_Db_Adapter_Mysqli_Exception
+ */
+ require_once 'Zend/Db/Adapter/Mysqli/Exception.php';
+ throw new Zend_Db_Adapter_Mysqli_Exception("Invalid fetch mode '$mode' specified");
+ }
+ }
+
+ /**
+ * Adds an adapter-specific LIMIT clause to the SELECT statement.
+ *
+ * @param string $sql
+ * @param int $count
+ * @param int $offset OPTIONAL
+ * @return string
+ */
+ public function limit($sql, $count, $offset = 0)
+ {
+ $count = intval($count);
+ if ($count <= 0) {
+ /**
+ * @see Zend_Db_Adapter_Mysqli_Exception
+ */
+ require_once 'Zend/Db/Adapter/Mysqli/Exception.php';
+ throw new Zend_Db_Adapter_Mysqli_Exception("LIMIT argument count=$count is not valid");
+ }
+
+ $offset = intval($offset);
+ if ($offset < 0) {
+ /**
+ * @see Zend_Db_Adapter_Mysqli_Exception
+ */
+ require_once 'Zend/Db/Adapter/Mysqli/Exception.php';
+ throw new Zend_Db_Adapter_Mysqli_Exception("LIMIT argument offset=$offset is not valid");
+ }
+
+ $sql .= " LIMIT $count";
+ if ($offset > 0) {
+ $sql .= " OFFSET $offset";
+ }
+
+ return $sql;
+ }
+
+ /**
+ * Check if the adapter supports real SQL parameters.
+ *
+ * @param string $type 'positional' or 'named'
+ * @return bool
+ */
+ public function supportsParameters($type)
+ {
+ switch ($type) {
+ case 'positional':
+ return true;
+ case 'named':
+ default:
+ return false;
+ }
+ }
+
+}
diff --git a/libs/Zend/Db/Adapter/Mysqli/Exception.php b/libs/Zend/Db/Adapter/Mysqli/Exception.php
new file mode 100755
index 0000000000..9687362bd0
--- /dev/null
+++ b/libs/Zend/Db/Adapter/Mysqli/Exception.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ *
+ */
+
+/**
+ * Zend
+ */
+require_once 'Zend/Db/Adapter/Exception.php';
+
+/**
+ * Zend_Db_Adapter_Mysqli_Exception
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Adapter_Mysqli_Exception extends Zend_Db_Adapter_Exception
+{
+}
diff --git a/libs/Zend/Db/Adapter/Oracle.php b/libs/Zend/Db/Adapter/Oracle.php
new file mode 100755
index 0000000000..3b3fc8c59d
--- /dev/null
+++ b/libs/Zend/Db/Adapter/Oracle.php
@@ -0,0 +1,593 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * @see Zend_Db_Adapter_Abstract
+ */
+require_once 'Zend/Db/Adapter/Abstract.php';
+
+/**
+ * @see Zend_Db_Statement_Oracle
+ */
+require_once 'Zend/Db/Statement/Oracle.php';
+
+/**
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Adapter_Oracle extends Zend_Db_Adapter_Abstract
+{
+ /**
+ * User-provided configuration.
+ *
+ * Basic keys are:
+ *
+ * username => (string) Connect to the database as this username.
+ * password => (string) Password associated with the username.
+ * dbname => Either the name of the local Oracle instance, or the
+ * name of the entry in tnsnames.ora to which you want to connect.
+ *
+ * @var array
+ */
+ protected $_config = array(
+ 'dbname' => null,
+ 'username' => null,
+ 'password' => null,
+ );
+
+ /**
+ * @var integer
+ */
+ protected $_execute_mode = OCI_COMMIT_ON_SUCCESS;
+
+ /**
+ * Creates a connection resource.
+ *
+ * @return void
+ * @throws Zend_Db_Adapter_Oracle_Exception
+ */
+ protected function _connect()
+ {
+ if (is_resource($this->_connection)) {
+ // connection already exists
+ return;
+ }
+
+ if (!extension_loaded('oci8')) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Adapter/Oracle/Exception.php';
+ throw new Zend_DB_Adapter_Oracle_Exception('The OCI8 extension is required for this adapter but not loaded');
+ }
+
+ if (isset($this->_config['dbname'])) {
+ $this->_connection = @oci_connect(
+ $this->_config['username'],
+ $this->_config['password'],
+ $this->_config['dbname']);
+ } else {
+ $this->_connection = oci_connect(
+ $this->_config['username'],
+ $this->_config['password']);
+ }
+
+ // check the connection
+ if (!$this->_connection) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Adapter/Oracle/Exception.php';
+ throw new Zend_Db_Adapter_Oracle_Exception(oci_error());
+ }
+ }
+
+ /**
+ * Force the connection to close.
+ *
+ * @return void
+ */
+ public function closeConnection()
+ {
+ if (is_resource($this->_connection)) {
+ oci_close($this->_connection);
+ }
+ $this->_connection = null;
+ }
+
+ /**
+ * Returns an SQL statement for preparation.
+ *
+ * @param string $sql The SQL statement with placeholders.
+ * @return Zend_Db_Statement_Oracle
+ */
+ public function prepare($sql)
+ {
+ $this->_connect();
+ $stmt = new Zend_Db_Statement_Oracle($this, $sql);
+ $stmt->setFetchMode($this->_fetchMode);
+ return $stmt;
+ }
+
+ /**
+ * Quote a raw string.
+ *
+ * @param string $value Raw string
+ * @return string Quoted string
+ */
+ protected function _quote($value)
+ {
+ if (is_numeric($value)) {
+ return $value;
+ }
+ $value = str_replace("'", "''", $value);
+ return "'" . addcslashes($value, "\000\n\r\\\032") . "'";
+ }
+
+ /**
+ * Quote a table identifier and alias.
+ *
+ * @param string|array|Zend_Db_Expr $ident The identifier or expression.
+ * @param string $alias An alias for the table.
+ * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
+ * @return string The quoted identifier and alias.
+ */
+ public function quoteTableAs($ident, $alias, $auto=false)
+ {
+ // Oracle doesn't allow the 'AS' keyword between the table identifier/expression and alias.
+ return $this->_quoteIdentifierAs($ident, $alias, $auto, ' ');
+ }
+
+ /**
+ * Return the most recent value from the specified sequence in the database.
+ * This is supported only on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null.
+ *
+ * @param string $sequenceName
+ * @return integer
+ */
+ public function lastSequenceId($sequenceName)
+ {
+ $this->_connect();
+ $sql = 'SELECT '.$this->quoteIdentifier($sequenceName, true).'.CURRVAL FROM dual';
+ $value = $this->fetchOne($sql);
+ return $value;
+ }
+
+ /**
+ * Generate a new value from the specified sequence in the database, and return it.
+ * This is supported only on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null.
+ *
+ * @param string $sequenceName
+ * @return integer
+ */
+ public function nextSequenceId($sequenceName)
+ {
+ $this->_connect();
+ $sql = 'SELECT '.$this->quoteIdentifier($sequenceName, true).'.NEXTVAL FROM dual';
+ $value = $this->fetchOne($sql);
+ return $value;
+ }
+
+ /**
+ * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
+ *
+ * As a convention, on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
+ * from the arguments and returns the last id generated by that sequence.
+ * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
+ * returns the last value generated for such a column, and the table name
+ * argument is disregarded.
+ *
+ * Oracle does not support IDENTITY columns, so if the sequence is not
+ * specified, this method returns null.
+ *
+ * @param string $tableName OPTIONAL Name of table.
+ * @param string $primaryKey OPTIONAL Name of primary key column.
+ * @return integer
+ */
+ public function lastInsertId($tableName = null, $primaryKey = null)
+ {
+ if ($tableName !== null) {
+ $sequenceName = $tableName;
+ if ($primaryKey) {
+ $sequenceName .= "_$primaryKey";
+ }
+ $sequenceName .= '_seq';
+ return $this->lastSequenceId($sequenceName);
+ }
+
+ // No support for IDENTITY columns; return null
+ return null;
+ }
+
+ /**
+ * Returns a list of the tables in the database.
+ *
+ * @return array
+ */
+ public function listTables()
+ {
+ $this->_connect();
+ $data = $this->fetchCol('SELECT table_name FROM all_tables');
+ return $data;
+ }
+
+ /**
+ * Returns the column descriptions for a table.
+ *
+ * The return value is an associative array keyed by the column name,
+ * as returned by the RDBMS.
+ *
+ * The value of each array element is an associative array
+ * with the following keys:
+ *
+ * SCHEMA_NAME => string; name of schema
+ * TABLE_NAME => string;
+ * COLUMN_NAME => string; column name
+ * COLUMN_POSITION => number; ordinal position of column in table
+ * DATA_TYPE => string; SQL datatype name of column
+ * DEFAULT => string; default expression of column, null if none
+ * NULLABLE => boolean; true if column can have nulls
+ * LENGTH => number; length of CHAR/VARCHAR
+ * SCALE => number; scale of NUMERIC/DECIMAL
+ * PRECISION => number; precision of NUMERIC/DECIMAL
+ * UNSIGNED => boolean; unsigned property of an integer type
+ * PRIMARY => boolean; true if column is part of the primary key
+ * PRIMARY_POSITION => integer; position of column in primary key
+ * IDENTITY => integer; true if column is auto-generated with unique values
+ *
+ * @todo Discover integer unsigned property.
+ *
+ * @param string $tableName
+ * @param string $schemaName OPTIONAL
+ * @return array
+ */
+ public function describeTable($tableName, $schemaName = null)
+ {
+ $sql = "SELECT TC.TABLE_NAME, TB.OWNER, TC.COLUMN_NAME, TC.DATA_TYPE,
+ TC.DATA_DEFAULT, TC.NULLABLE, TC.COLUMN_ID, TC.DATA_LENGTH,
+ TC.DATA_SCALE, TC.DATA_PRECISION, C.CONSTRAINT_TYPE, CC.POSITION
+ FROM ALL_TAB_COLUMNS TC
+ LEFT JOIN (ALL_CONS_COLUMNS CC JOIN ALL_CONSTRAINTS C
+ ON (CC.CONSTRAINT_NAME = C.CONSTRAINT_NAME AND CC.TABLE_NAME = C.TABLE_NAME AND C.CONSTRAINT_TYPE = 'P'))
+ ON TC.TABLE_NAME = CC.TABLE_NAME AND TC.COLUMN_NAME = CC.COLUMN_NAME
+ JOIN ALL_TABLES TB ON (TB.TABLE_NAME = TC.TABLE_NAME AND TB.OWNER = TC.OWNER)
+ WHERE "
+ . $this->quoteInto('UPPER(TC.TABLE_NAME) = UPPER(?)', $tableName);
+ if ($schemaName) {
+ $sql .= $this->quoteInto(' AND UPPER(TB.OWNER) = UPPER(?)', $schemaName);
+ }
+ $sql .= ' ORDER BY TC.COLUMN_ID';
+
+ $stmt = $this->query($sql);
+
+ /**
+ * Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection
+ */
+ $result = $stmt->fetchAll(Zend_Db::FETCH_NUM);
+
+ $table_name = 0;
+ $owner = 1;
+ $column_name = 2;
+ $data_type = 3;
+ $data_default = 4;
+ $nullable = 5;
+ $column_id = 6;
+ $data_length = 7;
+ $data_scale = 8;
+ $data_precision = 9;
+ $constraint_type = 10;
+ $position = 11;
+
+ $desc = array();
+ foreach ($result as $key => $row) {
+ list ($primary, $primaryPosition, $identity) = array(false, null, false);
+ if ($row[$constraint_type] == 'P') {
+ $primary = true;
+ $primaryPosition = $row[$position];
+ /**
+ * Oracle does not support auto-increment keys.
+ */
+ $identity = false;
+ }
+ $desc[$this->foldCase($row[$column_name])] = array(
+ 'SCHEMA_NAME' => $this->foldCase($row[$owner]),
+ 'TABLE_NAME' => $this->foldCase($row[$table_name]),
+ 'COLUMN_NAME' => $this->foldCase($row[$column_name]),
+ 'COLUMN_POSITION' => $row[$column_id],
+ 'DATA_TYPE' => $row[$data_type],
+ 'DEFAULT' => $row[$data_default],
+ 'NULLABLE' => (bool) ($row[$nullable] == 'Y'),
+ 'LENGTH' => $row[$data_length],
+ 'SCALE' => $row[$data_scale],
+ 'PRECISION' => $row[$data_precision],
+ 'UNSIGNED' => null, // @todo
+ 'PRIMARY' => $primary,
+ 'PRIMARY_POSITION' => $primaryPosition,
+ 'IDENTITY' => $identity
+ );
+ }
+ return $desc;
+ }
+
+ /**
+ * Leave autocommit mode and begin a transaction.
+ *
+ * @return void
+ */
+ protected function _beginTransaction()
+ {
+ $this->_setExecuteMode(OCI_DEFAULT);
+ }
+
+ /**
+ * Commit a transaction and return to autocommit mode.
+ *
+ * @return void
+ * @throws Zend_Db_Adapter_Oracle_Exception
+ */
+ protected function _commit()
+ {
+ if (!oci_commit($this->_connection)) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Adapter/Oracle/Exception.php';
+ throw new Zend_Db_Adapter_Oracle_Exception(oci_error($this->_connection));
+ }
+ $this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS);
+ }
+
+ /**
+ * Roll back a transaction and return to autocommit mode.
+ *
+ * @return void
+ * @throws Zend_Db_Adapter_Oracle_Exception
+ */
+ protected function _rollBack()
+ {
+ if (!oci_rollback($this->_connection)) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Adapter/Oracle/Exception.php';
+ throw new Zend_Db_Adapter_Oracle_Exception(oci_error($this->_connection));
+ }
+ $this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS);
+ }
+
+ /**
+ * Set the fetch mode.
+ *
+ * @todo Support FETCH_CLASS and FETCH_INTO.
+ *
+ * @param integer $mode A fetch mode.
+ * @return void
+ * @throws Zend_Db_Adapter_Exception
+ */
+ public function setFetchMode($mode)
+ {
+ switch ($mode) {
+ case Zend_Db::FETCH_NUM: // seq array
+ case Zend_Db::FETCH_ASSOC: // assoc array
+ case Zend_Db::FETCH_BOTH: // seq+assoc array
+ case Zend_Db::FETCH_OBJ: // object
+ $this->_fetchMode = $mode;
+ break;
+ case Zend_Db::FETCH_BOUND: // bound to PHP variable
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Adapter/Oracle/Exception.php';
+ throw new Zend_Db_Adapter_Oracle_Exception('FETCH_BOUND is not supported yet');
+ break;
+ default:
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Adapter/Oracle/Exception.php';
+ throw new Zend_Db_Adapter_Oracle_Exception("Invalid fetch mode '$mode' specified");
+ break;
+ }
+ }
+
+ /**
+ * Adds an adapter-specific LIMIT clause to the SELECT statement.
+ *
+ * @param string $sql
+ * @param integer $count
+ * @param integer $offset OPTIONAL
+ * @return string
+ * @throws Zend_Db_Adapter_Oracle_Exception
+ */
+ public function limit($sql, $count, $offset = 0)
+ {
+ $count = intval($count);
+ if ($count <= 0) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Adapter/Oracle/Exception.php';
+ throw new Zend_Db_Adapter_Oracle_Exception("LIMIT argument count=$count is not valid");
+ }
+
+ $offset = intval($offset);
+ if ($offset < 0) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Adapter/Oracle/Exception.php';
+ throw new Zend_Db_Adapter_Oracle_Exception("LIMIT argument offset=$offset is not valid");
+ }
+
+ /**
+ * Oracle does not implement the LIMIT clause as some RDBMS do.
+ * We have to simulate it with subqueries and ROWNUM.
+ * Unfortunately because we use the column wildcard "*",
+ * this puts an extra column into the query result set.
+ */
+ $limit_sql = "SELECT z2.*
+ FROM (
+ SELECT ROWNUM AS zend_db_rownum, z1.*
+ FROM (
+ " . $sql . "
+ ) z1
+ ) z2
+ WHERE z2.zend_db_rownum BETWEEN " . ($offset+1) . " AND " . ($offset+$count);
+ return $limit_sql;
+ }
+
+ /**
+ * @param integer $mode
+ * @throws Zend_Db_Adapter_Oracle_Exception
+ */
+ private function _setExecuteMode($mode)
+ {
+ switch($mode) {
+ case OCI_COMMIT_ON_SUCCESS:
+ case OCI_DEFAULT:
+ case OCI_DESCRIBE_ONLY:
+ $this->_execute_mode = $mode;
+ break;
+ default:
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Adapter/Oracle/Exception.php';
+ throw new Zend_Db_Adapter_Oracle_Exception("Invalid execution mode '$mode' specified");
+ break;
+ }
+ }
+
+ /**
+ * @return int
+ */
+ public function _getExecuteMode()
+ {
+ return $this->_execute_mode;
+ }
+
+ /**
+ * Inserts a table row with specified data.
+ *
+ * Oracle does not support anonymous ('?') binds.
+ *
+ * @param mixed $table The table to insert data into.
+ * @param array $bind Column-value pairs.
+ * @return int The number of affected rows.
+ */
+ public function insert($table, array $bind)
+ {
+ $i = 0;
+ // extract and quote col names from the array keys
+ $cols = array();
+ $vals = array();
+ foreach ($bind as $col => $val) {
+ $cols[] = $this->quoteIdentifier($col, true);
+ if ($val instanceof Zend_Db_Expr) {
+ $vals[] = $val->__toString();
+ unset($bind[$col]);
+ } else {
+ $vals[] = ':'.$col.$i;
+ unset($bind[$col]);
+ $bind[':'.$col.$i] = $val;
+ }
+ $i++;
+ }
+
+ // build the statement
+ $sql = "INSERT INTO "
+ . $this->quoteIdentifier($table, true)
+ . ' (' . implode(', ', $cols) . ') '
+ . 'VALUES (' . implode(', ', $vals) . ')';
+
+ // execute the statement and return the number of affected rows
+ $stmt = $this->query($sql, $bind);
+ $result = $stmt->rowCount();
+ return $result;
+ }
+
+ /**
+ * Updates table rows with specified data based on a WHERE clause.
+ *
+ * @param mixed $table The table to update.
+ * @param array $bind Column-value pairs.
+ * @param array|string $where UPDATE WHERE clause(s).
+ * @return int The number of affected rows.
+ */
+ public function update($table, array $bind, $where = '')
+ {
+ $i = 0;
+ // build "col = ?" pairs for the statement
+ $set = array();
+ foreach ($bind as $col => $val) {
+ if ($val instanceof Zend_Db_Expr) {
+ $val = $val->__toString();
+ unset($bind[$col]);
+ } else {
+ unset($bind[$col]);
+ $bind[':'.$col.$i] = $val;
+ $val = ':'.$col.$i;
+ }
+ $set[] = $this->quoteIdentifier($col, true) . ' = ' . $val;
+ $i++;
+ }
+
+ if (is_array($where)) {
+ $where = implode(' AND ', $where);
+ }
+
+ // build the statement
+ $sql = "UPDATE "
+ . $this->quoteIdentifier($table, true)
+ . ' SET ' . implode(', ', $set)
+ . (($where) ? " WHERE $where" : '');
+
+ // execute the statement and return the number of affected rows
+ $stmt = $this->query($sql, $bind);
+ $result = $stmt->rowCount();
+ return $result;
+ }
+
+ /**
+ * Check if the adapter supports real SQL parameters.
+ *
+ * @param string $type 'positional' or 'named'
+ * @return bool
+ */
+ public function supportsParameters($type)
+ {
+ switch ($type) {
+ case 'named':
+ return true;
+ case 'positional':
+ default:
+ return false;
+ }
+ }
+
+}
+
diff --git a/libs/Zend/Db/Adapter/Oracle/Exception.php b/libs/Zend/Db/Adapter/Oracle/Exception.php
new file mode 100755
index 0000000000..a136940283
--- /dev/null
+++ b/libs/Zend/Db/Adapter/Oracle/Exception.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Db_Adapter_Exception
+ */
+require_once 'Zend/Db/Adapter/Exception.php';
+
+/**
+ * Zend_Db_Adapter_Oracle_Exception
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Adapter_Oracle_Exception extends Zend_Db_Adapter_Exception
+{
+ protected $message = 'Unknown exception';
+ protected $code = 0;
+
+ function __construct($error = null, $code = 0) {
+ if (is_array($error)) {
+ if (!isset($error['offset'])) {
+ $this->message = $error['code'] .' '. $error['message'];
+ } else {
+ $this->message = $error['code'] .' '. $error['message']." "
+ . substr($error['sqltext'], 0, $error['offset'])
+ . "*"
+ . substr($error['sqltext'], $error['offset']);
+ }
+ $this->code = $error['code'];
+ } else if (is_string($error)) {
+ $this->message = $error;
+ }
+ if (!$this->code && $code) {
+ $this->code = $code;
+ }
+ }
+}
diff --git a/libs/Zend/Db/Adapter/Pdo/Abstract.php b/libs/Zend/Db/Adapter/Pdo/Abstract.php
new file mode 100755
index 0000000000..96f49c99a6
--- /dev/null
+++ b/libs/Zend/Db/Adapter/Pdo/Abstract.php
@@ -0,0 +1,303 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Abstract.php 5503 2007-06-29 18:18:06Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Db_Adapter_Abstract
+ */
+require_once 'Zend/Db/Adapter/Abstract.php';
+
+
+/**
+ * @see Zend_Db_Statement_Pdo
+ */
+require_once 'Zend/Db/Statement/Pdo.php';
+
+
+/**
+ * Class for connecting to SQL databases and performing common operations using PDO.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract
+{
+
+ /**
+ * Creates a PDO DSN for the adapter from $this->_config settings.
+ *
+ * @return string
+ */
+ protected function _dsn()
+ {
+ // baseline of DSN parts
+ $dsn = $this->_config;
+
+ // don't pass the username, password, and driver_options in the DSN
+ unset($dsn['username']);
+ unset($dsn['password']);
+ unset($dsn['options']);
+ unset($dsn['driver_options']);
+
+ // use all remaining parts in the DSN
+ foreach ($dsn as $key => $val) {
+ $dsn[$key] = "$key=$val";
+ }
+
+ return $this->_pdoType . ':' . implode(';', $dsn);
+ }
+
+ /**
+ * Creates a PDO object and connects to the database.
+ *
+ * @return void
+ * @throws Zend_Db_Adapter_Exception
+ */
+ protected function _connect()
+ {
+ // if we already have a PDO object, no need to re-connect.
+ if ($this->_connection) {
+ return;
+ }
+
+ // get the dsn first, because some adapters alter the $_pdoType
+ $dsn = $this->_dsn();
+
+ // check for PDO extension
+ if (!extension_loaded('pdo')) {
+ /**
+ * @see Zend_Db_Adapter_Exception
+ */
+ require_once 'Zend/Db/Adapter/Exception.php';
+ throw new Zend_Db_Adapter_Exception('The PDO extension is required for this adapter but not loaded');
+ }
+
+ // check the PDO driver is available
+ if (!in_array($this->_pdoType, PDO::getAvailableDrivers())) {
+ /**
+ * @see Zend_Db_Adapter_Exception
+ */
+ require_once 'Zend/Db/Adapter/Exception.php';
+ throw new Zend_Db_Adapter_Exception('The ' . $this->_pdoType . ' driver is not currently installed');
+ }
+
+ // create PDO connection
+ $q = $this->_profiler->queryStart('connect', Zend_Db_Profiler::CONNECT);
+
+ try {
+ $this->_connection = new PDO(
+ $dsn,
+ $this->_config['username'],
+ $this->_config['password'],
+ $this->_config['driver_options']
+ );
+
+ $this->_profiler->queryEnd($q);
+
+ // set the PDO connection to perform case-folding on array keys, or not
+ $this->_connection->setAttribute(PDO::ATTR_CASE, $this->_caseFolding);
+
+ // always use exceptions.
+ $this->_connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+ } catch (PDOException $e) {
+ /**
+ * @see Zend_Db_Adapter_Exception
+ */
+ require_once 'Zend/Db/Adapter/Exception.php';
+ throw new Zend_Db_Adapter_Exception($e->getMessage(), $e);
+ }
+
+ }
+
+ /**
+ * Force the connection to close.
+ *
+ * @return void
+ */
+ public function closeConnection()
+ {
+ $this->_connection = null;
+ }
+
+ /**
+ * Prepares an SQL statement.
+ *
+ * @param string $sql The SQL statement with placeholders.
+ * @param array $bind An array of data to bind to the placeholders.
+ * @return PDOStatement
+ */
+ public function prepare($sql)
+ {
+ $this->_connect();
+ $stmt = new Zend_Db_Statement_Pdo($this, $sql);
+ $stmt->setFetchMode($this->_fetchMode);
+ return $stmt;
+ }
+
+ /**
+ * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
+ *
+ * As a convention, on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
+ * from the arguments and returns the last id generated by that sequence.
+ * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
+ * returns the last value generated for such a column, and the table name
+ * argument is disregarded.
+ *
+ * On RDBMS brands that don't support sequences, $tableName and $primaryKey
+ * are ignored.
+ *
+ * @param string $tableName OPTIONAL Name of table.
+ * @param string $primaryKey OPTIONAL Name of primary key column.
+ * @return integer
+ */
+ public function lastInsertId($tableName = null, $primaryKey = null)
+ {
+ $this->_connect();
+ return $this->_connection->lastInsertId();
+ }
+
+ /**
+ * Special handling for PDO query().
+ * All bind parameter names must begin with ':'
+ *
+ * @param string|Zend_Db_Select $sql The SQL statement with placeholders.
+ * @param array $bind An array of data to bind to the placeholders.
+ * @return Zend_Db_Pdo_Statement
+ * @throws Zend_Db_Adapter_Exception To re-throw PDOException.
+ */
+ public function query($sql, $bind = array())
+ {
+ if (is_array($bind)) {
+ foreach ($bind as $name => $value) {
+ if (!is_int($name) && !preg_match('/^:/', $name)) {
+ $newName = ":$name";
+ unset($bind[$name]);
+ $bind[$newName] = $value;
+ }
+ }
+ }
+
+ try {
+ return parent::query($sql, $bind);
+ } catch (PDOException $e) {
+ /**
+ * @see Zend_Db_Statement_Exception
+ */
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Quote a raw string.
+ *
+ * @param string $value Raw string
+ * @return string Quoted string
+ */
+ protected function _quote($value)
+ {
+ if (is_numeric($value)) {
+ return $value;
+ }
+ $this->_connect();
+ return $this->_connection->quote($value);
+ }
+
+ /**
+ * Begin a transaction.
+ */
+ protected function _beginTransaction()
+ {
+ $this->_connect();
+ $this->_connection->beginTransaction();
+ }
+
+ /**
+ * Commit a transaction.
+ */
+ protected function _commit()
+ {
+ $this->_connect();
+ $this->_connection->commit();
+ }
+
+ /**
+ * Roll-back a transaction.
+ */
+ protected function _rollBack() {
+ $this->_connect();
+ $this->_connection->rollBack();
+ }
+
+ /**
+ * Set the PDO fetch mode.
+ *
+ * @todo Support FETCH_CLASS and FETCH_INTO.
+ *
+ * @param int $mode A PDO fetch mode.
+ * @return void
+ */
+ public function setFetchMode($mode)
+ {
+ switch ($mode) {
+ case PDO::FETCH_LAZY:
+ case PDO::FETCH_ASSOC:
+ case PDO::FETCH_NUM:
+ case PDO::FETCH_BOTH:
+ case PDO::FETCH_NAMED:
+ case PDO::FETCH_OBJ:
+ $this->_fetchMode = $mode;
+ break;
+ default:
+ /**
+ * @see Zend_Db_Adapter_Exception
+ */
+ require_once 'Zend/Db/Adapter/Exception.php';
+ throw new Zend_Db_Adapter_Exception("Invalid fetch mode '$mode' specified");
+ break;
+ }
+ }
+
+ /**
+ * Check if the adapter supports real SQL parameters.
+ *
+ * @param string $type 'positional' or 'named'
+ * @return bool
+ */
+ public function supportsParameters($type)
+ {
+ switch ($type) {
+ case 'positional':
+ case 'named':
+ default:
+ return true;
+ }
+ }
+
+}
+
diff --git a/libs/Zend/Db/Adapter/Pdo/Mssql.php b/libs/Zend/Db/Adapter/Pdo/Mssql.php
new file mode 100755
index 0000000000..1fdd356324
--- /dev/null
+++ b/libs/Zend/Db/Adapter/Pdo/Mssql.php
@@ -0,0 +1,290 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Db_Adapter_Pdo_Abstract
+ */
+require_once 'Zend/Db/Adapter/Pdo/Abstract.php';
+
+/**
+ * Zend_Db_Adapter_Exception
+ */
+require_once 'Zend/Db/Adapter/Exception.php';
+
+/**
+ * Class for connecting to Microsoft SQL Server databases and performing common operations.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Adapter_Pdo_Mssql extends Zend_Db_Adapter_Pdo_Abstract
+{
+ /**
+ * PDO type.
+ *
+ * @var string
+ */
+ protected $_pdoType = 'mssql';
+
+ /**
+ * Creates a PDO DSN for the adapter from $this->_config settings.
+ *
+ * @return string
+ */
+ protected function _dsn()
+ {
+ // baseline of DSN parts
+ $dsn = $this->_config;
+
+ // don't pass the username and password in the DSN
+ unset($dsn['username']);
+ unset($dsn['password']);
+ unset($dsn['driver_options']);
+
+ if (isset($dsn['port'])) {
+ $dsn['host'] .= ',' . $port;
+ unset($dsn['port']);
+ }
+
+ // this driver supports multiple DSN prefixes
+ // @see http://www.php.net/manual/en/ref.pdo-dblib.connection.php
+ if (isset($dsn['pdoType'])) {
+ switch (strtolower($dsn['pdoType'])) {
+ case 'freetds':
+ case 'sybase':
+ $this->_pdoType = 'sybase';
+ break;
+ case 'mssql':
+ $this->_pdoType = 'mssql';
+ break;
+ case 'dblib':
+ default:
+ $this->_pdoType = 'dblib';
+ break;
+ }
+ unset($dsn['pdoType']);
+ }
+
+ // use all remaining parts in the DSN
+ foreach ($dsn as $key => $val) {
+ $dsn[$key] = "$key=$val";
+ }
+
+ $dsn = $this->_pdoType . ':' . implode(';', $dsn);
+ return $dsn;
+ }
+
+ /**
+ * @return void
+ */
+ protected function _connect()
+ {
+ if ($this->_connection) {
+ return;
+ }
+ parent::_connect();
+ $this->_connection->exec('SET QUOTED_IDENTIFIER ON');
+ }
+
+ /**
+ * Returns a list of the tables in the database.
+ *
+ * @return array
+ */
+ public function listTables()
+ {
+ $sql = "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name";
+ return $this->fetchCol($sql);
+ }
+
+ /**
+ * Returns the column descriptions for a table.
+ *
+ * The return value is an associative array keyed by the column name,
+ * as returned by the RDBMS.
+ *
+ * The value of each array element is an associative array
+ * with the following keys:
+ *
+ * SCHEMA_NAME => string; name of database or schema
+ * TABLE_NAME => string;
+ * COLUMN_NAME => string; column name
+ * COLUMN_POSITION => number; ordinal position of column in table
+ * DATA_TYPE => string; SQL datatype name of column
+ * DEFAULT => string; default expression of column, null if none
+ * NULLABLE => boolean; true if column can have nulls
+ * LENGTH => number; length of CHAR/VARCHAR
+ * SCALE => number; scale of NUMERIC/DECIMAL
+ * PRECISION => number; precision of NUMERIC/DECIMAL
+ * UNSIGNED => boolean; unsigned property of an integer type
+ * PRIMARY => boolean; true if column is part of the primary key
+ * PRIMARY_POSITION => integer; position of column in primary key
+ * PRIMARY_AUTO => integer; position of auto-generated column in primary key
+ *
+ * @todo Discover column primary key position.
+ * @todo Discover integer unsigned property.
+ *
+ * @param string $tableName
+ * @param string $schemaName OPTIONAL
+ * @return array
+ */
+ public function describeTable($tableName, $schemaName = null)
+ {
+ /**
+ * Discover metadata information about this table.
+ */
+ $sql = "exec sp_columns @table_name = " . $this->quoteIdentifier($tableName, true);
+ $stmt = $this->query($sql);
+ $result = $stmt->fetchAll(Zend_Db::FETCH_NUM);
+
+ $table_name = 2;
+ $column_name = 3;
+ $type_name = 5;
+ $precision = 6;
+ $length = 7;
+ $scale = 8;
+ $nullable = 10;
+ $column_def = 12;
+ $column_position = 16;
+
+ /**
+ * Discover primary key column(s) for this table.
+ */
+ $sql = "exec sp_pkeys @table_name = " . $this->quoteIdentifier($tableName, true);
+ $stmt = $this->query($sql);
+ $primaryKeysResult = $stmt->fetchAll(Zend_Db::FETCH_NUM);
+ $pkey_column_name = 3;
+ $pkey_key_seq = 4;
+ foreach ($primaryKeysResult as $pkeysRow) {
+ $primaryKeyColumn[$pkeysRow[$pkey_column_name]] = $pkeysRow[$pkey_key_seq];
+ }
+
+ $desc = array();
+ $p = 1;
+ foreach ($result as $key => $row) {
+ $identity = false;
+ $words = explode(' ', $row[$type_name], 2);
+ if (isset($words[0])) {
+ $type = $words[0];
+ if (isset($words[1])) {
+ $identity = (bool) preg_match('/identity/', $words[1]);
+ }
+ }
+
+ $isPrimary = array_key_exists($row[$column_name], $primaryKeyColumn);
+ if ($isPrimary) {
+ $primaryPosition = $primaryKeyColumn[$row[$column_name]];
+ } else {
+ $primaryPosition = null;
+ }
+
+ $desc[$this->foldCase($row[$column_name])] = array(
+ 'SCHEMA_NAME' => null, // @todo
+ 'TABLE_NAME' => $this->foldCase($row[$table_name]),
+ 'COLUMN_NAME' => $this->foldCase($row[$column_name]),
+ 'COLUMN_POSITION' => (int) $row[$column_position],
+ 'DATA_TYPE' => $type,
+ 'DEFAULT' => $row[$column_def],
+ 'NULLABLE' => (bool) $row[$nullable],
+ 'LENGTH' => $row[$length],
+ 'SCALE' => $row[$scale],
+ 'PRECISION' => $row[$precision],
+ 'UNSIGNED' => null, // @todo
+ 'PRIMARY' => $isPrimary,
+ 'PRIMARY_POSITION' => $primaryPosition,
+ 'IDENTITY' => $identity
+ );
+ }
+ return $desc;
+ }
+
+ /**
+ * Adds an adapter-specific LIMIT clause to the SELECT statement.
+ *
+ * @link http://lists.bestpractical.com/pipermail/rt-devel/2005-June/007339.html
+ *
+ * @param string $sql
+ * @param integer $count
+ * @param integer $offset OPTIONAL
+ * @return string
+ */
+ public function limit($sql, $count, $offset = 0)
+ {
+ $count = intval($count);
+ if ($count <= 0) {
+ throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid");
+ }
+
+ $offset = intval($offset);
+ if ($offset < 0) {
+ throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid");
+ }
+
+ $orderby = stristr($sql, 'ORDER BY');
+ if ($orderby !== false) {
+ $sort = (stripos($orderby, 'desc') !== false) ? 'desc' : 'asc';
+ $order = str_ireplace('ORDER BY', '', $orderby);
+ $order = trim(preg_replace('/ASC|DESC/i', '', $order));
+ }
+
+ $sql = preg_replace('/^SELECT\s/i', 'SELECT TOP ' . ($count+$offset) . ' ', $sql);
+
+ $sql = 'SELECT * FROM (SELECT TOP ' . $count . ' * FROM (' . $sql . ') AS inner_tbl';
+ if ($orderby !== false) {
+ $sql .= ' ORDER BY ' . $order . ' ';
+ $sql .= (stripos($sort, 'asc') !== false) ? 'DESC' : 'ASC';
+ }
+ $sql .= ') AS outer_tbl';
+ if ($orderby !== false) {
+ $sql .= ' ORDER BY ' . $order . ' ' . $sort;
+ }
+
+ return $sql;
+ }
+
+ /**
+ * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
+ *
+ * As a convention, on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
+ * from the arguments and returns the last id generated by that sequence.
+ * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
+ * returns the last value generated for such a column, and the table name
+ * argument is disregarded.
+ *
+ * Microsoft SQL Server does not support sequences, so the arguments to
+ * this method are ignored.
+ *
+ * @param string $tableName OPTIONAL Name of table.
+ * @param string $primaryKey OPTIONAL Name of primary key column.
+ * @return integer
+ * @throws Zend_Db_Adapter_Exception
+ */
+ public function lastInsertId($tableName = null, $primaryKey = null)
+ {
+ $sql = 'SELECT SCOPE_IDENTITY()';
+ return (int)$this->fetchOne($sql);
+ }
+
+}
diff --git a/libs/Zend/Db/Adapter/Pdo/Mysql.php b/libs/Zend/Db/Adapter/Pdo/Mysql.php
new file mode 100755
index 0000000000..dc20d3644d
--- /dev/null
+++ b/libs/Zend/Db/Adapter/Pdo/Mysql.php
@@ -0,0 +1,200 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Db_Adapter_Pdo
+ */
+require_once 'Zend/Db/Adapter/Pdo/Abstract.php';
+
+/**
+ * Zend_Db_Adapter_Exception
+ */
+require_once 'Zend/Db/Adapter/Exception.php';
+
+/**
+ * Class for connecting to MySQL databases and performing common operations.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Abstract
+{
+
+ /**
+ * PDO type.
+ *
+ * @var string
+ */
+ protected $_pdoType = 'mysql';
+
+ /**
+ * @return string
+ */
+ public function getQuoteIdentifierSymbol()
+ {
+ return "`";
+ }
+
+ /**
+ * Returns a list of the tables in the database.
+ *
+ * @return array
+ */
+ public function listTables()
+ {
+ return $this->fetchCol('SHOW TABLES');
+ }
+
+ /**
+ * Returns the column descriptions for a table.
+ *
+ * The return value is an associative array keyed by the column name,
+ * as returned by the RDBMS.
+ *
+ * The value of each array element is an associative array
+ * with the following keys:
+ *
+ * SCHEMA_NAME => string; name of database or schema
+ * TABLE_NAME => string;
+ * COLUMN_NAME => string; column name
+ * COLUMN_POSITION => number; ordinal position of column in table
+ * DATA_TYPE => string; SQL datatype name of column
+ * DEFAULT => string; default expression of column, null if none
+ * NULLABLE => boolean; true if column can have nulls
+ * LENGTH => number; length of CHAR/VARCHAR
+ * SCALE => number; scale of NUMERIC/DECIMAL
+ * PRECISION => number; precision of NUMERIC/DECIMAL
+ * UNSIGNED => boolean; unsigned property of an integer type
+ * PRIMARY => boolean; true if column is part of the primary key
+ * PRIMARY_POSITION => integer; position of column in primary key
+ * IDENTITY => integer; true if column is auto-generated with unique values
+ *
+ * @param string $tableName
+ * @param string $schemaName OPTIONAL
+ * @return array
+ */
+ public function describeTable($tableName, $schemaName = null)
+ {
+ // @todo: use INFORMATION_SCHEMA someday when MySQL's
+ // implementation has reasonably good performance and
+ // the version with this improvement is in wide use.
+
+ if ($schemaName) {
+ $sql = 'DESCRIBE ' . $this->quoteIdentifier("$schemaName.$tableName", true);
+ } else {
+ $sql = 'DESCRIBE ' . $this->quoteIdentifier($tableName, true);
+ }
+ $stmt = $this->query($sql);
+
+ // Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection
+ $result = $stmt->fetchAll(Zend_Db::FETCH_NUM);
+
+ $field = 0;
+ $type = 1;
+ $null = 2;
+ $key = 3;
+ $default = 4;
+ $extra = 5;
+
+ $desc = array();
+ $i = 1;
+ $p = 1;
+ foreach ($result as $row) {
+ list($length, $scale, $precision, $unsigned, $primary, $primaryPosition, $identity)
+ = array(null, null, null, null, false, null, false);
+ if (preg_match('/unsigned/', $row[$type])) {
+ $unsigned = true;
+ }
+ if (preg_match('/^((?:var)?char)\((\d+)\)/', $row[$type], $matches)) {
+ $row[$type] = $matches[1];
+ $length = $matches[2];
+ } else if (preg_match('/^decimal\((\d+),(\d+)\)/', $row[$type], $matches)) {
+ $row[$type] = 'decimal';
+ $precision = $matches[1];
+ $scale = $matches[2];
+ } else if (preg_match('/^((?:big|medium|small|tiny)?int)\((\d+)\)/', $row[$type], $matches)) {
+ $row[$type] = $matches[1];
+ // The optional argument of a MySQL int type is not precision
+ // or length; it is only a hint for display width.
+ }
+ if (strtoupper($row[$key]) == 'PRI') {
+ $primary = true;
+ $primaryPosition = $p;
+ if ($row[$extra] == 'auto_increment') {
+ $identity = true;
+ } else {
+ $identity = false;
+ }
+ ++$p;
+ }
+ $desc[$this->foldCase($row[$field])] = array(
+ 'SCHEMA_NAME' => null, // @todo
+ 'TABLE_NAME' => $this->foldCase($tableName),
+ 'COLUMN_NAME' => $this->foldCase($row[$field]),
+ 'COLUMN_POSITION' => $i,
+ 'DATA_TYPE' => $row[$type],
+ 'DEFAULT' => $row[$default],
+ 'NULLABLE' => (bool) ($row[$null] == 'YES'),
+ 'LENGTH' => $length,
+ 'SCALE' => $scale,
+ 'PRECISION' => $precision,
+ 'UNSIGNED' => $unsigned,
+ 'PRIMARY' => $primary,
+ 'PRIMARY_POSITION' => $primaryPosition,
+ 'IDENTITY' => $identity
+ );
+ ++$i;
+ }
+ return $desc;
+ }
+
+ /**
+ * Adds an adapter-specific LIMIT clause to the SELECT statement.
+ *
+ * @param string $sql
+ * @param integer $count
+ * @param integer $offset OPTIONAL
+ * @return string
+ */
+ public function limit($sql, $count, $offset = 0)
+ {
+ $count = intval($count);
+ if ($count <= 0) {
+ throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid");
+ }
+
+ $offset = intval($offset);
+ if ($offset < 0) {
+ throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid");
+ }
+
+ $sql .= " LIMIT $count";
+ if ($offset > 0) {
+ $sql .= " OFFSET $offset";
+ }
+
+ return $sql;
+ }
+
+}
diff --git a/libs/Zend/Db/Adapter/Pdo/Oci.php b/libs/Zend/Db/Adapter/Pdo/Oci.php
new file mode 100755
index 0000000000..c2f6c67443
--- /dev/null
+++ b/libs/Zend/Db/Adapter/Pdo/Oci.php
@@ -0,0 +1,310 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Db_Adapter_Pdo
+ */
+require_once 'Zend/Db/Adapter/Pdo/Abstract.php';
+
+/**
+ * Zend_Db_Adapter_Exception
+ */
+require_once 'Zend/Db/Adapter/Exception.php';
+
+/**
+ * Class for connecting to Oracle databases and performing common operations.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Adapter_Pdo_Oci extends Zend_Db_Adapter_Pdo_Abstract
+{
+
+ /**
+ * PDO type.
+ *
+ * @var string
+ */
+ protected $_pdoType = 'oci';
+
+ /**
+ * Creates a PDO DSN for the adapter from $this->_config settings.
+ *
+ * @return string
+ */
+ protected function _dsn()
+ {
+ // baseline of DSN parts
+ $dsn = $this->_config;
+
+ $tns = 'dbname=';
+ if (isset($dsn['host'])) {
+ $tns .= '//' . $dsn['host'];
+ if (isset($dsn['port'])) {
+ $tns .= ':' . $dsn['port'];
+ }
+ $tns .= '/';
+ }
+ $tns .= $dsn['dbname'];
+
+ return $this->_pdoType . ':' . $tns;
+ }
+
+ /**
+ * Quote a raw string.
+ * Most PDO drivers have an implementation for the quote() method,
+ * but the Oracle OCI driver must use the same implementation as the
+ * Zend_Db_Adapter_Abstract class.
+ *
+ * @param string $value Raw string
+ * @return string Quoted string
+ */
+ protected function _quote($value)
+ {
+ if (is_numeric($value)) {
+ return $value;
+ }
+ return "'" . addcslashes($value, "\000\n\r\\'\"\032") . "'";
+ }
+
+ /**
+ * Quote a table identifier and alias.
+ *
+ * @param string|array|Zend_Db_Expr $ident The identifier or expression.
+ * @param string $alias An alias for the table.
+ * @return string The quoted identifier and alias.
+ */
+ public function quoteTableAs($ident, $alias, $auto=false)
+ {
+ // Oracle doesn't allow the 'AS' keyword between the table identifier/expression and alias.
+ return $this->_quoteIdentifierAs($ident, $alias, $auto, ' ');
+ }
+
+ /**
+ * Returns a list of the tables in the database.
+ *
+ * @return array
+ */
+ public function listTables()
+ {
+ $data = $this->fetchCol('SELECT table_name FROM all_tables');
+ return $data;
+ }
+
+ /**
+ * Returns the column descriptions for a table.
+ *
+ * The return value is an associative array keyed by the column name,
+ * as returned by the RDBMS.
+ *
+ * The value of each array element is an associative array
+ * with the following keys:
+ *
+ * SCHEMA_NAME => string; name of schema
+ * TABLE_NAME => string;
+ * COLUMN_NAME => string; column name
+ * COLUMN_POSITION => number; ordinal position of column in table
+ * DATA_TYPE => string; SQL datatype name of column
+ * DEFAULT => string; default expression of column, null if none
+ * NULLABLE => boolean; true if column can have nulls
+ * LENGTH => number; length of CHAR/VARCHAR
+ * SCALE => number; scale of NUMERIC/DECIMAL
+ * PRECISION => number; precision of NUMERIC/DECIMAL
+ * UNSIGNED => boolean; unsigned property of an integer type
+ * PRIMARY => boolean; true if column is part of the primary key
+ * PRIMARY_POSITION => integer; position of column in primary key
+ * IDENTITY => integer; true if column is auto-generated with unique values
+ *
+ * @todo Discover integer unsigned property.
+ *
+ * @param string $tableName
+ * @param string $schemaName OPTIONAL
+ * @return array
+ */
+ public function describeTable($tableName, $schemaName = null)
+ {
+ $sql = "SELECT TC.TABLE_NAME, TB.OWNER, TC.COLUMN_NAME, TC.DATA_TYPE,
+ TC.DATA_DEFAULT, TC.NULLABLE, TC.COLUMN_ID, TC.DATA_LENGTH,
+ TC.DATA_SCALE, TC.DATA_PRECISION, C.CONSTRAINT_TYPE, CC.POSITION
+ FROM ALL_TAB_COLUMNS TC
+ LEFT JOIN (ALL_CONS_COLUMNS CC JOIN ALL_CONSTRAINTS C
+ ON (CC.CONSTRAINT_NAME = C.CONSTRAINT_NAME AND CC.TABLE_NAME = C.TABLE_NAME AND C.CONSTRAINT_TYPE = 'P'))
+ ON TC.TABLE_NAME = CC.TABLE_NAME AND TC.COLUMN_NAME = CC.COLUMN_NAME
+ JOIN ALL_TABLES TB ON (TB.TABLE_NAME = TC.TABLE_NAME AND TB.OWNER = TC.OWNER)
+ WHERE TC.TABLE_NAME = ".$this->quote($tableName);
+ if ($schemaName) {
+ $sql .= " AND TB.OWNER = ".$this->quote($schemaName);
+ }
+ $sql .= ' ORDER BY TC.COLUMN_ID';
+
+ $stmt = $this->query($sql);
+
+ /**
+ * Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection
+ */
+ $result = $stmt->fetchAll(Zend_Db::FETCH_NUM);
+
+ $table_name = 0;
+ $owner = 1;
+ $column_name = 2;
+ $data_type = 3;
+ $data_default = 4;
+ $nullable = 5;
+ $column_id = 6;
+ $data_length = 7;
+ $data_scale = 8;
+ $data_precision = 9;
+ $constraint_type = 10;
+ $position = 11;
+
+ $desc = array();
+ foreach ($result as $key => $row) {
+ list ($primary, $primaryPosition, $identity) = array(false, null, false);
+ if ($row[$constraint_type] == 'P') {
+ $primary = true;
+ $primaryPosition = $row[$position];
+ /**
+ * Oracle does not support auto-increment keys.
+ */
+ $identity = false;
+ }
+ $desc[$this->foldCase($row[$column_name])] = array(
+ 'SCHEMA_NAME' => $this->foldCase($row[$owner]),
+ 'TABLE_NAME' => $this->foldCase($row[$table_name]),
+ 'COLUMN_NAME' => $this->foldCase($row[$column_name]),
+ 'COLUMN_POSITION' => $row[$column_id],
+ 'DATA_TYPE' => $row[$data_type],
+ 'DEFAULT' => $row[$data_default],
+ 'NULLABLE' => (bool) ($row[$nullable] == 'Y'),
+ 'LENGTH' => $row[$data_length],
+ 'SCALE' => $row[$data_scale],
+ 'PRECISION' => $row[$data_precision],
+ 'UNSIGNED' => null, // @todo
+ 'PRIMARY' => $primary,
+ 'PRIMARY_POSITION' => $primaryPosition,
+ 'IDENTITY' => $identity
+ );
+ }
+ return $desc;
+ }
+
+ /**
+ * Return the most recent value from the specified sequence in the database.
+ * This is supported only on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null.
+ *
+ * @param string $sequenceName
+ * @return integer
+ */
+ public function lastSequenceId($sequenceName)
+ {
+ $this->_connect();
+ $value = $this->fetchOne('SELECT '.$this->quoteIdentifier($sequenceName, true).'.CURRVAL FROM dual');
+ return $value;
+ }
+
+ /**
+ * Generate a new value from the specified sequence in the database, and return it.
+ * This is supported only on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null.
+ *
+ * @param string $sequenceName
+ * @return integer
+ */
+ public function nextSequenceId($sequenceName)
+ {
+ $this->_connect();
+ $value = $this->fetchOne('SELECT '.$this->quoteIdentifier($sequenceName, true).'.NEXTVAL FROM dual');
+ return $value;
+ }
+
+ /**
+ * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
+ *
+ * As a convention, on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
+ * from the arguments and returns the last id generated by that sequence.
+ * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
+ * returns the last value generated for such a column, and the table name
+ * argument is disregarded.
+ *
+ * Oracle does not support IDENTITY columns, so if the sequence is not
+ * specified, this method returns null.
+ *
+ * @param string $tableName OPTIONAL Name of table.
+ * @param string $primaryKey OPTIONAL Name of primary key column.
+ * @return integer
+ * @throws Zend_Db_Adapter_Oracle_Exception
+ */
+ public function lastInsertId($tableName = null, $primaryKey = null)
+ {
+ if ($tableName !== null) {
+ $sequenceName = $tableName;
+ if ($primaryKey) {
+ $sequenceName .= $this->foldCase("_$primaryKey");
+ }
+ $sequenceName .= $this->foldCase('_SEQ');
+ return $this->lastSequenceId($sequenceName);
+ }
+ return $this->_connection->lastInsertId($tableName);
+ }
+
+ /**
+ * Adds an adapter-specific LIMIT clause to the SELECT statement.
+ *
+ * @param string $sql
+ * @param integer $count
+ * @param integer $offset
+ * @return string
+ */
+ public function limit($sql, $count, $offset = 0)
+ {
+ $count = intval($count);
+ if ($count <= 0) {
+ throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid");
+ }
+
+ $offset = intval($offset);
+ if ($offset < 0) {
+ throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid");
+ }
+
+ /**
+ * Oracle does not implement the LIMIT clause as some RDBMS do.
+ * We have to simulate it with subqueries and ROWNUM.
+ * Unfortunately because we use the column wildcard "*",
+ * this puts an extra column into the query result set.
+ */
+ $limit_sql = "SELECT z2.*
+ FROM (
+ SELECT ROWNUM AS zend_db_rownum, z1.*
+ FROM (
+ " . $sql . "
+ ) z1
+ ) z2
+ WHERE z2.zend_db_rownum BETWEEN " . ($offset+1) . " AND " . ($offset+$count);
+ return $limit_sql;
+ }
+
+}
diff --git a/libs/Zend/Db/Adapter/Pdo/Pgsql.php b/libs/Zend/Db/Adapter/Pdo/Pgsql.php
new file mode 100755
index 0000000000..eb0e8e24ac
--- /dev/null
+++ b/libs/Zend/Db/Adapter/Pdo/Pgsql.php
@@ -0,0 +1,281 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Pgsql.php 5296 2007-06-13 23:20:37Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Db_Adapter_Pdo_Abstract
+ */
+require_once 'Zend/Db/Adapter/Pdo/Abstract.php';
+
+
+/**
+ * Class for connecting to PostgreSQL databases and performing common operations.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Adapter_Pdo_Pgsql extends Zend_Db_Adapter_Pdo_Abstract
+{
+
+ /**
+ * PDO type.
+ *
+ * @var string
+ */
+ protected $_pdoType = 'pgsql';
+
+ /**
+ * Returns a list of the tables in the database.
+ *
+ * @return array
+ */
+ public function listTables()
+ {
+ // @todo use a better query with joins instead of subqueries
+ $sql = "SELECT c.relname AS table_name "
+ . "FROM pg_class c, pg_user u "
+ . "WHERE c.relowner = u.usesysid AND c.relkind = 'r' "
+ . "AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname) "
+ . "AND c.relname !~ '^(pg_|sql_)' "
+ . "UNION "
+ . "SELECT c.relname AS table_name "
+ . "FROM pg_class c "
+ . "WHERE c.relkind = 'r' "
+ . "AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname) "
+ . "AND NOT EXISTS (SELECT 1 FROM pg_user WHERE usesysid = c.relowner) "
+ . "AND c.relname !~ '^pg_'";
+
+ return $this->fetchCol($sql);
+ }
+
+ /**
+ * Returns the column descriptions for a table.
+ *
+ * The return value is an associative array keyed by the column name,
+ * as returned by the RDBMS.
+ *
+ * The value of each array element is an associative array
+ * with the following keys:
+ *
+ * SCHEMA_NAME => string; name of database or schema
+ * TABLE_NAME => string;
+ * COLUMN_NAME => string; column name
+ * COLUMN_POSITION => number; ordinal position of column in table
+ * DATA_TYPE => string; SQL datatype name of column
+ * DEFAULT => string; default expression of column, null if none
+ * NULLABLE => boolean; true if column can have nulls
+ * LENGTH => number; length of CHAR/VARCHAR
+ * SCALE => number; scale of NUMERIC/DECIMAL
+ * PRECISION => number; precision of NUMERIC/DECIMAL
+ * UNSIGNED => boolean; unsigned property of an integer type
+ * PRIMARY => boolean; true if column is part of the primary key
+ * PRIMARY_POSITION => integer; position of column in primary key
+ * IDENTITY => integer; true if column is auto-generated with unique values
+ *
+ * @todo Discover integer unsigned property.
+ *
+ * @param string $tableName
+ * @param string $schemaName OPTIONAL
+ * @return array
+ */
+ public function describeTable($tableName, $schemaName = null)
+ {
+ $sql = "SELECT
+ a.attnum,
+ n.nspname,
+ c.relname,
+ a.attname AS colname,
+ t.typname AS type,
+ a.atttypmod,
+ FORMAT_TYPE(a.atttypid, a.atttypmod) AS complete_type,
+ d.adsrc AS default_value,
+ a.attnotnull AS notnull,
+ a.attlen AS length,
+ co.contype,
+ ARRAY_TO_STRING(co.conkey, ',') AS conkey
+ FROM pg_attribute AS a
+ JOIN pg_class AS c ON a.attrelid = c.oid
+ JOIN pg_namespace AS n ON c.relnamespace = n.oid
+ JOIN pg_type AS t ON a.atttypid = t.oid
+ LEFT OUTER JOIN pg_constraint AS co ON (co.conrelid = c.oid
+ AND a.attnum = ANY(co.conkey) AND co.contype = 'p')
+ LEFT OUTER JOIN pg_attrdef AS d ON d.adrelid = c.oid AND d.adnum = a.attnum
+ WHERE a.attnum > 0 AND c.relname = ".$this->quote($tableName);
+ if ($schemaName) {
+ $sql .= " AND n.nspname = ".$this->quote($schemaName);
+ }
+ $sql .= ' ORDER BY a.attnum';
+
+ $stmt = $this->query($sql);
+
+ // Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection
+ $result = $stmt->fetchAll(Zend_Db::FETCH_NUM);
+
+ $attnum = 0;
+ $nspname = 1;
+ $relname = 2;
+ $colname = 3;
+ $type = 4;
+ $atttypemod = 5;
+ $complete_type = 6;
+ $default_value = 7;
+ $notnull = 8;
+ $length = 9;
+ $contype = 10;
+ $conkey = 11;
+
+ $desc = array();
+ foreach ($result as $key => $row) {
+ if ($row[$type] == 'varchar') {
+ if (preg_match('/character varying(?:\((\d+)\))?/', $row[$complete_type], $matches)) {
+ if (isset($matches[1])) {
+ $row[$length] = $matches[1];
+ } else {
+ $row[$length] = null; // unlimited
+ }
+ }
+ }
+ list($primary, $primaryPosition, $identity) = array(false, null, false);
+ if ($row[$contype] == 'p') {
+ $primary = true;
+ $primaryPosition = array_search($row[$attnum], explode(',', $row[$conkey])) + 1;
+ $identity = (bool) (preg_match('/^nextval/', $row[$default_value]));
+ }
+ $desc[$this->foldCase($row[$colname])] = array(
+ 'SCHEMA_NAME' => $this->foldCase($row[$nspname]),
+ 'TABLE_NAME' => $this->foldCase($row[$relname]),
+ 'COLUMN_NAME' => $this->foldCase($row[$colname]),
+ 'COLUMN_POSITION' => $row[$attnum],
+ 'DATA_TYPE' => $row[$type],
+ 'DEFAULT' => $row[$default_value],
+ 'NULLABLE' => (bool) ($row[$notnull] != 't'),
+ 'LENGTH' => $row[$length],
+ 'SCALE' => null, // @todo
+ 'PRECISION' => null, // @todo
+ 'UNSIGNED' => null, // @todo
+ 'PRIMARY' => $primary,
+ 'PRIMARY_POSITION' => $primaryPosition,
+ 'IDENTITY' => $identity
+ );
+ }
+ return $desc;
+ }
+
+
+ /**
+ * Adds an adapter-specific LIMIT clause to the SELECT statement.
+ *
+ * @param string $sql
+ * @param integer $count
+ * @param integer $offset OPTIONAL
+ * @return string
+ */
+ public function limit($sql, $count, $offset = 0)
+ {
+ $count = intval($count);
+ if ($count <= 0) {
+ /**
+ * @see Zend_Db_Adapter_Exception
+ */
+ require_once 'Zend/Db/Adapter/Exception.php';
+ throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid");
+ }
+
+ $offset = intval($offset);
+ if ($offset < 0) {
+ /**
+ * @see Zend_Db_Adapter_Exception
+ */
+ require_once 'Zend/Db/Adapter/Exception.php';
+ throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid");
+ }
+
+ $sql .= " LIMIT $count";
+ if ($offset > 0) {
+ $sql .= " OFFSET $offset";
+ }
+
+ return $sql;
+ }
+
+ /**
+ * Return the most recent value from the specified sequence in the database.
+ * This is supported only on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null.
+ *
+ * @param string $sequenceName
+ * @return integer
+ */
+ public function lastSequenceId($sequenceName)
+ {
+ $this->_connect();
+ $value = $this->fetchOne("SELECT CURRVAL(".$this->quote($sequenceName).")");
+ return $value;
+ }
+
+ /**
+ * Generate a new value from the specified sequence in the database, and return it.
+ * This is supported only on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null.
+ *
+ * @param string $sequenceName
+ * @return integer
+ */
+ public function nextSequenceId($sequenceName)
+ {
+ $this->_connect();
+ $value = $this->fetchOne("SELECT NEXTVAL(".$this->quote($sequenceName).")");
+ return $value;
+ }
+
+ /**
+ * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
+ *
+ * As a convention, on RDBMS brands that support sequences
+ * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
+ * from the arguments and returns the last id generated by that sequence.
+ * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
+ * returns the last value generated for such a column, and the table name
+ * argument is disregarded.
+ *
+ * @param string $tableName OPTIONAL Name of table.
+ * @param string $primaryKey OPTIONAL Name of primary key column.
+ * @return integer
+ */
+ public function lastInsertId($tableName = null, $primaryKey = null)
+ {
+ if ($tableName !== null) {
+ $sequenceName = $tableName;
+ if ($primaryKey) {
+ $sequenceName .= "_$primaryKey";
+ }
+ $sequenceName .= '_seq';
+ return $this->lastSequenceId($sequenceName);
+ }
+ return $this->_connection->lastInsertId($tableName);
+ }
+
+}
diff --git a/libs/Zend/Db/Adapter/Pdo/Sqlite.php b/libs/Zend/Db/Adapter/Pdo/Sqlite.php
new file mode 100755
index 0000000000..3a56ce5986
--- /dev/null
+++ b/libs/Zend/Db/Adapter/Pdo/Sqlite.php
@@ -0,0 +1,262 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Db_Adapter_Pdo_Abstract
+ */
+require_once 'Zend/Db/Adapter/Pdo/Abstract.php';
+
+/**
+ * Zend_Db_Adapter_Exception
+ */
+require_once 'Zend/Db/Adapter/Exception.php';
+
+/**
+ * Class for connecting to SQLite2 and SQLite3 databases and performing common operations.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Adapter_Pdo_Sqlite extends Zend_Db_Adapter_Pdo_Abstract
+{
+
+ /**
+ * PDO type
+ *
+ * @var string
+ */
+ protected $_pdoType = 'sqlite';
+
+ /**
+ * Constructor.
+ *
+ * $config is an array of key/value pairs containing configuration
+ * options. Note that the SQLite options are different than most of
+ * the other PDO adapters in that no username or password are needed.
+ * Also, an extra config key "sqlite2" specifies compatibility mode.
+ *
+ * dbname => (string) The name of the database to user (required,
+ * use :memory: for memory-based database)
+ *
+ * sqlite2 => (boolean) PDO_SQLITE defaults to SQLite 3. For compatibility
+ * with an older SQLite 2 database, set this to TRUE.
+ *
+ * @param array $config An array of configuration keys.
+ */
+ public function __construct(array $config = array())
+ {
+ if (isset($config['sqlite2']) && $config['sqlite2']) {
+ $this->_pdoType = 'sqlite2';
+ }
+
+ // SQLite uses no username/password. Stub to satisfy parent::_connect()
+ $this->_config['username'] = null;
+ $this->_config['password'] = null;
+
+ return parent::__construct($config);
+ }
+
+ /**
+ * Check for config options that are mandatory.
+ * Throw exceptions if any are missing.
+ *
+ * @param array $config
+ * @throws Zend_Db_Adapter_Exception
+ */
+ protected function _checkRequiredOptions(array $config)
+ {
+ // we need at least a dbname
+ if (! array_key_exists('dbname', $config)) {
+ require_once 'Zend/Db/Adapter/Exception.php';
+ throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'dbname' that names the database instance.");
+ }
+ }
+
+ /**
+ * DSN builder
+ */
+ protected function _dsn()
+ {
+ return $this->_pdoType .':'. $this->_config['dbname'];
+ }
+
+ /**
+ * Special configuration for SQLite behavior: make sure that result sets
+ * contain keys like 'column' instead of 'table.column'.
+ *
+ * @throws Zend_Db_Adapter_Exception
+ */
+ protected function _connect()
+ {
+ /**
+ * if we already have a PDO object, no need to re-connect.
+ */
+ if ($this->_connection) {
+ return;
+ }
+
+ parent::_connect();
+
+ $retval = $this->_connection->exec('PRAGMA full_column_names=0');
+ if ($retval === false) {
+ $error = $this->_connection->errorInfo();
+ require_once 'Zend/Db/Adapter/Exception.php';
+ throw new Zend_Db_Adapter_Exception($error[2]);
+ }
+
+ $retval = $this->_connection->exec('PRAGMA short_column_names=1');
+ if ($retval === false) {
+ $error = $this->_connection->errorInfo();
+ require_once 'Zend/Db/Adapter/Exception.php';
+ throw new Zend_Db_Adapter_Exception($error[2]);
+ }
+ }
+
+ /**
+ * Returns a list of the tables in the database.
+ *
+ * @return array
+ */
+ public function listTables()
+ {
+ $sql = "SELECT name FROM sqlite_master WHERE type='table' "
+ . "UNION ALL SELECT name FROM sqlite_temp_master "
+ . "WHERE type='table' ORDER BY name";
+
+ return $this->fetchCol($sql);
+ }
+
+ /**
+ * Returns the column descriptions for a table.
+ *
+ * The return value is an associative array keyed by the column name,
+ * as returned by the RDBMS.
+ *
+ * The value of each array element is an associative array
+ * with the following keys:
+ *
+ * SCHEMA_NAME => string; name of database or schema
+ * TABLE_NAME => string;
+ * COLUMN_NAME => string; column name
+ * COLUMN_POSITION => number; ordinal position of column in table
+ * DATA_TYPE => string; SQL datatype name of column
+ * DEFAULT => string; default expression of column, null if none
+ * NULLABLE => boolean; true if column can have nulls
+ * LENGTH => number; length of CHAR/VARCHAR
+ * SCALE => number; scale of NUMERIC/DECIMAL
+ * PRECISION => number; precision of NUMERIC/DECIMAL
+ * UNSIGNED => boolean; unsigned property of an integer type
+ * PRIMARY => boolean; true if column is part of the primary key
+ * PRIMARY_POSITION => integer; position of column in primary key
+ * IDENTITY => integer; true if column is auto-generated with unique values
+ *
+ * @param string $tableName
+ * @param string $schemaName OPTIONAL
+ * @return array
+ */
+ public function describeTable($tableName, $schemaName = null)
+ {
+ if ($schemaName) {
+ $sql = "PRAGMA table_info($schemaName.$tableName)";
+ } else {
+ $sql = "PRAGMA table_info($tableName)";
+ }
+
+ $stmt = $this->query($sql);
+
+ /**
+ * Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection
+ */
+ $result = $stmt->fetchAll(Zend_Db::FETCH_NUM);
+
+ $cid = 0;
+ $name = 1;
+ $type = 2;
+ $notnull = 3;
+ $dflt_value = 4;
+ $pk = 5;
+
+ $desc = array();
+
+ $p = 1;
+ foreach ($result as $key => $row) {
+ list($primary, $primaryPosition, $identity) = array(false, null, false);
+ if ((bool) $row[$pk]) {
+ $primary = true;
+ $primaryPosition = $p;
+ /**
+ * SQLite INTEGER primary key is always auto-increment.
+ */
+ $identity = (bool) ($row[$type] == 'INTEGER');
+ ++$p;
+ }
+ $desc[$this->foldCase($row[$name])] = array(
+ 'SCHEMA_NAME' => $this->foldCase($schemaName),
+ 'TABLE_NAME' => $this->foldCase($tableName),
+ 'COLUMN_NAME' => $this->foldCase($row[$name]),
+ 'COLUMN_POSITION' => $row[$cid]+1,
+ 'DATA_TYPE' => $row[$type],
+ 'DEFAULT' => $row[$dflt_value],
+ 'NULLABLE' => ! (bool) $row[$notnull],
+ 'LENGTH' => null, // @todo
+ 'SCALE' => null, // @todo
+ 'PRECISION' => null, // @todo
+ 'UNSIGNED' => null, // @todo
+ 'PRIMARY' => $primary,
+ 'PRIMARY_POSITION' => $primaryPosition,
+ 'IDENTITY' => $identity
+ );
+ }
+ return $desc;
+ }
+
+ /**
+ * Adds an adapter-specific LIMIT clause to the SELECT statement.
+ *
+ * @param string $sql
+ * @param integer $count
+ * @param integer $offset OPTIONAL
+ * @return string
+ */
+ public function limit($sql, $count, $offset = 0)
+ {
+ $count = intval($count);
+ if ($count <= 0) {
+ throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid");
+ }
+
+ $offset = intval($offset);
+ if ($offset < 0) {
+ throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid");
+ }
+
+ $sql .= " LIMIT $count";
+ if ($offset > 0) {
+ $sql .= " OFFSET $offset";
+ }
+
+ return $sql;
+ }
+
+}
diff --git a/libs/Zend/Db/Exception.php b/libs/Zend/Db/Exception.php
new file mode 100755
index 0000000000..f954509607
--- /dev/null
+++ b/libs/Zend/Db/Exception.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+/**
+ * @category Zend
+ * @package Zend_Db
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Exception extends Zend_Exception
+{
+}
diff --git a/libs/Zend/Db/Expr.php b/libs/Zend/Db/Expr.php
new file mode 100755
index 0000000000..b68ee73f7a
--- /dev/null
+++ b/libs/Zend/Db/Expr.php
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Expr
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Expr.php 4527 2007-04-17 22:49:14Z darby $
+ */
+
+
+/**
+ * Class for SQL SELECT fragments.
+ *
+ * This class simply holds a string, so that fragments of SQL statements can be
+ * distinguished from identifiers and values that should be implicitly quoted
+ * when interpolated into SQL statements.
+ *
+ * For example, when specifying a primary key value when inserting into a new
+ * row, some RDBMS brands may require you to use an expression to generate the
+ * new value of a sequence. If this expression is treated as an identifier,
+ * it will be quoted and the expression will not be evaluated. Another example
+ * is that you can use Zend_Db_Expr in the Zend_Db_Select::order() method to
+ * order by an expression instead of simply a column name.
+ *
+ * The way this works is that in each context in which a column name can be
+ * specified to methods of Zend_Db classes, if the value is an instance of
+ * Zend_Db_Expr instead of a plain string, then the expression is not quoted.
+ * If it is a plain string, it is assumed to be a plain column name.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Expr
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Expr
+{
+ /**
+ * Storage for the SQL expression.
+ *
+ * @var string
+ */
+ protected $_expression;
+
+ /**
+ * Instantiate an expression, which is just a string stored as
+ * an instance member variable.
+ *
+ * @param string $expression The string containing a SQL expression.
+ */
+ public function __construct($expression)
+ {
+ $this->_expression = (string) $expression;
+ }
+
+ /**
+ * @return string The string of the SQL expression stored in this object.
+ */
+ public function __toString()
+ {
+ return $this->_expression;
+ }
+
+}
diff --git a/libs/Zend/Db/Profiler.php b/libs/Zend/Db/Profiler.php
new file mode 100755
index 0000000000..daf4dc0c59
--- /dev/null
+++ b/libs/Zend/Db/Profiler.php
@@ -0,0 +1,461 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Profiler
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Profiler.php 5401 2007-06-21 01:30:53Z bkarwin $
+ */
+
+
+/**
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Profiler
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Profiler
+{
+
+ /**
+ * A connection operation or selecting a database.
+ */
+ const CONNECT = 1;
+
+ /**
+ * Any general database query that does not fit into the other constants.
+ */
+ const QUERY = 2;
+
+ /**
+ * Adding new data to the database, such as SQL's INSERT.
+ */
+ const INSERT = 4;
+
+ /**
+ * Updating existing information in the database, such as SQL's UPDATE.
+ *
+ */
+ const UPDATE = 8;
+
+ /**
+ * An operation related to deleting data in the database,
+ * such as SQL's DELETE.
+ */
+ const DELETE = 16;
+
+ /**
+ * Retrieving information from the database, such as SQL's SELECT.
+ */
+ const SELECT = 32;
+
+ /**
+ * Transactional operation, such as start transaction, commit, or rollback.
+ */
+ const TRANSACTION = 64;
+
+
+ /**
+ * Array of Zend_Db_Profiler_Query objects.
+ *
+ * @var array
+ */
+ protected $_queryProfiles = array();
+
+ /**
+ * Stores enabled state of the profiler. If set to False, calls to
+ * queryStart() will simply be ignored.
+ *
+ * @var boolean
+ */
+ protected $_enabled = false;
+
+ /**
+ * Stores the number of seconds to filter. NULL if filtering by time is
+ * disabled. If an integer is stored here, profiles whose elapsed time
+ * is less than this value in seconds will be unset from
+ * the self::$_queryProfiles array.
+ *
+ * @var integer
+ */
+ protected $_filterElapsedSecs = null;
+
+ /**
+ * Logical OR of any of the filter constants. NULL if filtering by query
+ * type is disable. If an integer is stored here, it is the logical OR of
+ * any of the query type constants. When the query ends, if it is not
+ * one of the types specified, it will be unset from the
+ * self::$_queryProfiles array.
+ *
+ * @var integer
+ */
+ protected $_filterTypes = null;
+
+ /**
+ * Class constructor. The profiler is disabled by default unless it is
+ * specifically enabled by passing in $enabled here or calling setEnabled().
+ *
+ * @param boolean $enabled
+ * @return void
+ */
+ public function __construct($enabled = false)
+ {
+ $this->setEnabled($enabled);
+ }
+
+ /**
+ * Enable or disable the profiler. If $enable is false, the profiler
+ * is disabled and will not log any queries sent to it.
+ *
+ * @param boolean $enable
+ * @return Zend_Db_Profiler Provides a fluent interface
+ */
+ public function setEnabled($enable)
+ {
+ $this->_enabled = (boolean) $enable;
+
+ return $this;
+ }
+
+ /**
+ * Get the current state of enable. If True is returned,
+ * the profiler is enabled.
+ *
+ * @return boolean
+ */
+ public function getEnabled()
+ {
+ return $this->_enabled;
+ }
+
+ /**
+ * Sets a minimum number of seconds for saving query profiles. If this
+ * is set, only those queries whose elapsed time is equal or greater than
+ * $minimumSeconds will be saved. To save all queries regardless of
+ * elapsed time, set $minimumSeconds to null.
+ *
+ * @param integer $minimumSeconds OPTIONAL
+ * @return Zend_Db_Profiler Provides a fluent interface
+ */
+ public function setFilterElapsedSecs($minimumSeconds = null)
+ {
+ if (null === $minimumSeconds) {
+ $this->_filterElapsedSecs = null;
+ } else {
+ $this->_filterElapsedSecs = (integer) $minimumSeconds;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Returns the minimum number of seconds for saving query profiles, or null if
+ * query profiles are saved regardless of elapsed time.
+ *
+ * @return integer|null
+ */
+ public function getFilterElapsedSecs()
+ {
+ return $this->_filterElapsedSecs;
+ }
+
+ /**
+ * Sets the types of query profiles to save. Set $queryType to one of
+ * the Zend_Db_Profiler::* constants to only save profiles for that type of
+ * query. To save more than one type, logical OR them together. To
+ * save all queries regardless of type, set $queryType to null.
+ *
+ * @param integer $queryTypes OPTIONAL
+ * @return Zend_Db_Profiler Provides a fluent interface
+ */
+ public function setFilterQueryType($queryTypes = null)
+ {
+ $this->_filterTypes = $queryTypes;
+
+ return $this;
+ }
+
+ /**
+ * Returns the types of query profiles saved, or null if queries are saved regardless
+ * of their types.
+ *
+ * @return integer|null
+ * @see Zend_Db_Profiler::setFilterQueryType()
+ */
+ public function getFilterQueryType()
+ {
+ return $this->_filterTypes;
+ }
+
+ /**
+ * Clears the history of any past query profiles. This is relentless
+ * and will even clear queries that were started and may not have
+ * been marked as ended.
+ *
+ * @return Zend_Db_Profiler Provides a fluent interface
+ */
+ public function clear()
+ {
+ $this->_queryProfiles = array();
+
+ return $this;
+ }
+
+ /**
+ * @param integer $queryId
+ * @return integer or null
+ */
+ public function queryClone(Zend_Db_Profiler_Query $query)
+ {
+ $this->_queryProfiles[] = clone $query;
+
+ end($this->_queryProfiles);
+
+ return key($this->_queryProfiles);
+ }
+
+ /**
+ * Starts a query. Creates a new query profile object (Zend_Db_Profiler_Query)
+ * and returns the "query profiler handle". Run the query, then call
+ * queryEnd() and pass it this handle to make the query as ended and
+ * record the time. If the profiler is not enabled, this takes no
+ * action and immediately returns null.
+ *
+ * @param string $queryText SQL statement
+ * @param integer $queryType OPTIONAL Type of query, one of the Zend_Db_Profiler::* constants
+ * @return integer|null
+ */
+ public function queryStart($queryText, $queryType = null)
+ {
+ if (!$this->_enabled) {
+ return null;
+ }
+
+ // make sure we have a query type
+ if (null === $queryType) {
+ switch (strtolower(substr($queryText, 0, 6))) {
+ case 'insert':
+ $queryType = self::INSERT;
+ break;
+ case 'update':
+ $queryType = self::UPDATE;
+ break;
+ case 'delete':
+ $queryType = self::DELETE;
+ break;
+ case 'select':
+ $queryType = self::SELECT;
+ break;
+ default:
+ $queryType = self::QUERY;
+ break;
+ }
+ }
+
+ /**
+ * @see Zend_Db_Profiler_Query
+ */
+ require_once 'Zend/Db/Profiler/Query.php';
+ $this->_queryProfiles[] = new Zend_Db_Profiler_Query($queryText, $queryType);
+
+ end($this->_queryProfiles);
+
+ return key($this->_queryProfiles);
+ }
+
+ /**
+ * Ends a query. Pass it the handle that was returned by queryStart().
+ * This will mark the query as ended and save the time.
+ *
+ * @param integer $queryId
+ * @throws Zend_Db_Profiler_Exception
+ * @return void
+ */
+ public function queryEnd($queryId)
+ {
+ // Don't do anything if the Zend_Db_Profiler is not enabled.
+ if (!$this->_enabled) {
+ return;
+ }
+
+ // Check for a valid query handle.
+ if (!isset($this->_queryProfiles[$queryId])) {
+ /**
+ * @see Zend_Db_Profiler_Exception
+ */
+ require_once 'Zend/Db/Profiler/Exception.php';
+ throw new Zend_Db_Profiler_Exception("Profiler has no query with handle '$queryId'.");
+ }
+
+ $qp = $this->_queryProfiles[$queryId];
+
+ // Ensure that the query profile has not already ended
+ if ($qp->hasEnded()) {
+ /**
+ * @see Zend_Db_Profiler_Exception
+ */
+ require_once 'Zend/Db/Profiler/Exception.php';
+ throw new Zend_Db_Profiler_Exception("Query with profiler handle '$queryId' has already ended.");
+ }
+
+ // End the query profile so that the elapsed time can be calculated.
+ $qp->end();
+
+ /**
+ * If filtering by elapsed time is enabled, only keep the profile if
+ * it ran for the minimum time.
+ */
+ if (null !== $this->_filterElapsedSecs && $qp->getElapsedSecs() < $this->_filterElapsedSecs) {
+ unset($this->_queryProfiles[$queryId]);
+ return;
+ }
+
+ /**
+ * If filtering by query type is enabled, only keep the query if
+ * it was one of the allowed types.
+ */
+ if (null !== $this->_filterTypes && !($qp->getQueryType() & $this->_filterTypes)) {
+ unset($this->_queryProfiles[$queryId]);
+ return;
+ }
+ }
+
+ /**
+ * Get a profile for a query. Pass it the same handle that was returned
+ * by queryStart() and it will return a Zend_Db_Profiler_Query object.
+ *
+ * @param integer $queryId
+ * @throws Zend_Db_Profiler_Exception
+ * @return Zend_Db_Profiler_Query
+ */
+ public function getQueryProfile($queryId)
+ {
+ if (!array_key_exists($queryId, $this->_queryProfiles)) {
+ /**
+ * @see Zend_Db_Profiler_Exception
+ */
+ require_once 'Zend/Db/Profiler/Exception.php';
+ throw new Zend_Db_Profiler_Exception("Query handle '$queryId' not found in profiler log.");
+ }
+
+ return $this->_queryProfiles[$queryId];
+ }
+
+ /**
+ * Get an array of query profiles (Zend_Db_Profiler_Query objects). If $queryType
+ * is set to one of the Zend_Db_Profiler::* constants then only queries of that
+ * type will be returned. Normally, queries that have not yet ended will
+ * not be returned unless $showUnfinished is set to True. If no
+ * queries were found, False is returned. The returned array is indexed by the query
+ * profile handles.
+ *
+ * @param integer $queryType
+ * @param boolean $showUnfinished
+ * @return array|false
+ */
+ public function getQueryProfiles($queryType = null, $showUnfinished = false)
+ {
+ $queryProfiles = array();
+ foreach ($this->_queryProfiles as $key => $qp) {
+ if ($queryType === null) {
+ $condition = true;
+ } else {
+ $condition = ($qp->getQueryType() & $queryType);
+ }
+
+ if (($qp->hasEnded() || $showUnfinished) && $condition) {
+ $queryProfiles[$key] = $qp;
+ }
+ }
+
+ if (empty($queryProfiles)) {
+ $queryProfiles = false;
+ }
+
+ return $queryProfiles;
+ }
+
+ /**
+ * Get the total elapsed time (in seconds) of all of the profiled queries.
+ * Only queries that have ended will be counted. If $queryType is set to
+ * one or more of the Zend_Db_Profiler::* constants, the elapsed time will be calculated
+ * only for queries of the given type(s).
+ *
+ * @param integer $queryType OPTIONAL
+ * @return float
+ */
+ public function getTotalElapsedSecs($queryType = null)
+ {
+ $elapsedSecs = 0;
+ foreach ($this->_queryProfiles as $key => $qp) {
+ if (null === $queryType) {
+ $condition = true;
+ } else {
+ $condition = ($qp->getQueryType() & $queryType);
+ }
+ if (($qp->hasEnded()) && $condition) {
+ $elapsedSecs += $qp->getElapsedSecs();
+ }
+ }
+ return $elapsedSecs;
+ }
+
+ /**
+ * Get the total number of queries that have been profiled. Only queries that have ended will
+ * be counted. If $queryType is set to one of the Zend_Db_Profiler::* constants, only queries of
+ * that type will be counted.
+ *
+ * @param integer $queryType OPTIONAL
+ * @return integer
+ */
+ public function getTotalNumQueries($queryType = null)
+ {
+ if (null === $queryType) {
+ return count($this->_queryProfiles);
+ }
+
+ $numQueries = 0;
+ foreach ($this->_queryProfiles as $qp) {
+ if ($qp->hasEnded() && ($qp->getQueryType() & $queryType)) {
+ $numQueries++;
+ }
+ }
+
+ return $numQueries;
+ }
+
+ /**
+ * Get the Zend_Db_Profiler_Query object for the last query that was run, regardless if it has
+ * ended or not. If the query has not ended, its end time will be null. If no queries have
+ * been profiled, false is returned.
+ *
+ * @return Zend_Db_Profiler_Query|false
+ */
+ public function getLastQueryProfile()
+ {
+ if (empty($this->_queryProfiles)) {
+ return false;
+ }
+
+ end($this->_queryProfiles);
+
+ return current($this->_queryProfiles);
+ }
+
+}
+
diff --git a/libs/Zend/Db/Profiler/Exception.php b/libs/Zend/Db/Profiler/Exception.php
new file mode 100755
index 0000000000..718dc8afad
--- /dev/null
+++ b/libs/Zend/Db/Profiler/Exception.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Profiler
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Exception.php 4679 2007-05-02 22:17:39Z darby $
+ */
+
+
+/**
+ * @see Zend_Db_Exception
+ */
+require_once 'Zend/Db/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Profiler
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Profiler_Exception extends Zend_Db_Exception
+{
+}
+
diff --git a/libs/Zend/Db/Profiler/Query.php b/libs/Zend/Db/Profiler/Query.php
new file mode 100755
index 0000000000..4efc58c368
--- /dev/null
+++ b/libs/Zend/Db/Profiler/Query.php
@@ -0,0 +1,190 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Profiler
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Query.php 5401 2007-06-21 01:30:53Z bkarwin $
+ */
+
+
+/**
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Profiler
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Profiler_Query
+{
+
+ /**
+ * SQL query string or user comment, set by $query argument in constructor.
+ *
+ * @var string
+ */
+ protected $_query = '';
+
+ /**
+ * One of the Zend_Db_Profiler constants for query type, set by $queryType argument in constructor.
+ *
+ * @var integer
+ */
+ protected $_queryType = 0;
+
+ /**
+ * Unix timestamp with microseconds when instantiated.
+ *
+ * @var float
+ */
+ protected $_startedMicrotime = null;
+
+ /**
+ * Unix timestamp with microseconds when self::queryEnd() was called.
+ *
+ * @var integer
+ */
+ protected $_endedMicrotime = null;
+
+ /**
+ * @var array
+ */
+ protected $_boundParams = array();
+
+ /**
+ * @var array
+ */
+ protected $_parameterValues = array();
+
+ /**
+ * Class constructor. A query is about to be started, save the query text ($query) and its
+ * type (one of the Zend_Db_Profiler::* constants).
+ *
+ * @param string $query
+ * @param integer $queryType
+ * @return void
+ */
+ public function __construct($query, $queryType)
+ {
+ $this->_query = $query;
+ $this->_queryType = $queryType;
+ // by default, and for backward-compatibility, start the click ticking
+ $this->start();
+ }
+
+ /**
+ * Clone handler for the query object.
+ * @return void
+ */
+ public function __clone()
+ {
+ $this->_parameterValues = array();
+ $this->_endedMicrotime = null;
+ $this->start();
+ }
+
+ /**
+ * Starts the elapsed time click ticking.
+ * This can be called subsequent to object creation,
+ * to restart the clock. For instance, this is useful
+ * right before executing a prepared query.
+ *
+ * @return void
+ */
+ public function start()
+ {
+ $this->_startedMicrotime = microtime(true);
+ }
+
+ /**
+ * Ends the query and records the time so that the elapsed time can be determined later.
+ *
+ * @return void
+ */
+ public function end()
+ {
+ $this->_parameterValues = array();
+ foreach ($this->_boundParams as $key => $value) {
+ $this->_parameterValues[$key] = $value;
+ }
+ $this->_endedMicrotime = microtime(true);
+ }
+
+ /**
+ * Returns true if and only if the query has ended.
+ *
+ * @return boolean
+ */
+ public function hasEnded()
+ {
+ return $this->_endedMicrotime !== null;
+ }
+
+ /**
+ * Get the original SQL text of the query.
+ *
+ * @return string
+ */
+ public function getQuery()
+ {
+ return $this->_query;
+ }
+
+ /**
+ * Get the type of this query (one of the Zend_Db_Profiler::* constants)
+ *
+ * @return integer
+ */
+ public function getQueryType()
+ {
+ return $this->_queryType;
+ }
+
+ /**
+ * @param string $key
+ * @param mixed $param
+ * @return void
+ */
+ public function bindParam($param, &$variable)
+ {
+ $this->_boundParams[$param] =& $variable;
+ }
+
+ /**
+ * @return array
+ */
+ public function getQueryParams()
+ {
+ return $this->_parameterValues;
+ }
+
+ /**
+ * Get the elapsed time (in seconds) that the query ran.
+ * If the query has not yet ended, false is returned.
+ *
+ * @return float|false
+ */
+ public function getElapsedSecs()
+ {
+ if (null === $this->_endedMicrotime) {
+ return false;
+ }
+
+ return $this->_endedMicrotime - $this->_startedMicrotime;
+ }
+}
+
diff --git a/libs/Zend/Db/Select.php b/libs/Zend/Db/Select.php
new file mode 100755
index 0000000000..897ad80278
--- /dev/null
+++ b/libs/Zend/Db/Select.php
@@ -0,0 +1,852 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Select
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Select.php 5308 2007-06-14 17:18:45Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Db_Adapter_Abstract
+ */
+require_once 'Zend/Db/Adapter/Abstract.php';
+
+/**
+ * @see Zend_Db_Expr
+ */
+require_once 'Zend/Db/Expr.php';
+
+
+/**
+ * Class for SQL SELECT generation and results.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Select
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Select
+{
+
+ const DISTINCT = 'distinct';
+ const FOR_UPDATE = 'forupdate';
+ const COLUMNS = 'columns';
+ const FROM = 'from';
+ const WHERE = 'where';
+ const GROUP = 'group';
+ const HAVING = 'having';
+ const ORDER = 'order';
+ const LIMIT_COUNT = 'limitcount';
+ const LIMIT_OFFSET = 'limitoffset';
+
+ const INNER_JOIN = 'inner join';
+ const LEFT_JOIN = 'left join';
+ const RIGHT_JOIN = 'right join';
+ const FULL_JOIN = 'full join';
+ const CROSS_JOIN = 'cross join';
+ const NATURAL_JOIN = 'natural join';
+
+ /**
+ * Zend_Db_Adapter_Abstract object.
+ *
+ * @var Zend_Db_Adapter_Abstract
+ */
+ protected $_adapter;
+
+ /**
+ * The initial values for the $_parts array.
+ *
+ * @var array
+ */
+ protected static $_partsInit = array(
+ self::DISTINCT => false,
+ self::FOR_UPDATE => false,
+ self::COLUMNS => array(),
+ self::FROM => array(),
+ self::WHERE => array(),
+ self::GROUP => array(),
+ self::HAVING => array(),
+ self::ORDER => array(),
+ self::LIMIT_COUNT => null,
+ self::LIMIT_OFFSET => null,
+ );
+
+ /**
+ * The component parts of a SELECT statement.
+ * Initialized to the $_partsInit array in the constructor.
+ *
+ * @var array
+ */
+ protected $_parts = array();
+
+ /**
+ * Tracks which columns are being select from each table and join.
+ *
+ * @var array
+ */
+ protected $_tableCols = array();
+
+ /**
+ * Class constructor
+ *
+ * @param Zend_Db_Adapter_Abstract $adapter
+ */
+ public function __construct(Zend_Db_Adapter_Abstract $adapter)
+ {
+ $this->_adapter = $adapter;
+ $this->_parts = self::$_partsInit;
+ }
+
+ /**
+ * Converts this object to an SQL SELECT string.
+ *
+ * @return string This object as a SELECT string.
+ */
+ public function __toString()
+ {
+ // initial SELECT [DISTINCT] [FOR UPDATE]
+ $sql = 'SELECT';
+ if ($this->_parts[self::DISTINCT]) {
+ $sql .= ' DISTINCT';
+ }
+ if ($this->_parts[self::FOR_UPDATE]) {
+ $sql .= ' FOR UPDATE';
+ }
+ $sql .= "\n\t";
+
+ // add columns
+ $columns = array();
+ foreach ($this->_parts[self::COLUMNS] as $columnEntry) {
+ list($correlationName, $column, $alias) = $columnEntry;
+ if ($column instanceof Zend_Db_Expr) {
+ $columns[] = $this->_adapter->quoteColumnAs($column, $alias, true);
+ } else {
+ if ($column == '*') {
+ $column = new Zend_Db_Expr('*');
+ $alias = null;
+ }
+ if (empty($correlationName)) {
+ $columns[] = $this->_adapter->quoteColumnAs($column, $alias, true);
+ } else {
+ $columns[] = $this->_adapter->quoteColumnAs(array($correlationName, $column), $alias, true);
+ }
+ }
+ }
+ $sql .= implode(",\n\t", $columns);
+
+ // from these joined tables
+ if ($this->_parts[self::FROM]) {
+ $from = array();
+ foreach ($this->_parts[self::FROM] as $correlationName => $table) {
+ $tmp = '';
+ if (empty($from)) {
+ // Add schema if available
+ if (null !== $table['schema']) {
+ $tmp .= $this->_adapter->quoteIdentifier($table['schema'], true) . '.';
+ }
+ // First table is named alone ignoring join information
+ $tmp .= $this->_adapter->quoteTableAs($table['tableName'], $correlationName, true);
+ } else {
+ // Subsequent tables may have joins
+ if (! empty($table['joinType'])) {
+ $tmp .= ' ' . strtoupper($table['joinType']) . ' ';
+ }
+ // Add schema if available
+ if (null !== $table['schema']) {
+ $tmp .= $this->_adapter->quoteIdentifier($table['schema'], true) . '.';
+ }
+ $tmp .= $this->_adapter->quoteTableAs($table['tableName'], $correlationName, true);
+ if (! empty($table['joinCondition'])) {
+ $tmp .= ' ON ' . $table['joinCondition'];
+ }
+ }
+ // add the table name and condition
+ // add to the list
+ $from[] = $tmp;
+ }
+ // add the list of all joins
+ if (!empty($from)) {
+ $sql .= "\nFROM " . implode("\n", $from);
+ }
+
+ // with these where conditions
+ if ($this->_parts[self::WHERE]) {
+ $sql .= "\nWHERE\n\t";
+ $sql .= implode("\n\t", $this->_parts[self::WHERE]);
+ }
+
+ // grouped by these columns
+ if ($this->_parts[self::GROUP]) {
+ $sql .= "\nGROUP BY\n\t";
+ $l = array();
+ foreach ($this->_parts[self::GROUP] as $term) {
+ $l[] = $this->_adapter->quoteIdentifier($term, true);
+ }
+ $sql .= implode(",\n\t", $l);
+ }
+
+ // having these conditions
+ if ($this->_parts[self::HAVING]) {
+ $sql .= "\nHAVING\n\t";
+ $sql .= implode("\n\t", $this->_parts[self::HAVING]);
+ }
+
+ }
+
+ // ordered by these columns
+ if ($this->_parts[self::ORDER]) {
+ $sql .= "\nORDER BY\n\t";
+ $l = array();
+ foreach ($this->_parts[self::ORDER] as $term) {
+ if (is_array($term)) {
+ $l[] = $this->_adapter->quoteIdentifier($term[0], true) . ' ' . $term[1];
+ } else {
+ $l[] = $this->_adapter->quoteIdentifier($term, true);
+ }
+ }
+ $sql .= implode(",\n\t", $l);
+ }
+
+ // determine offset
+ $count = 0;
+ $offset = 0;
+ if (!empty($this->_parts[self::LIMIT_OFFSET])) {
+ $offset = (int) $this->_parts[self::LIMIT_OFFSET];
+ // this should be reduced to the max integer PHP can support
+ $count = intval(9223372036854775807);
+ }
+
+ // determine count
+ if (!empty($this->_parts[self::LIMIT_COUNT])) {
+ $count = (int) $this->_parts[self::LIMIT_COUNT];
+ }
+
+ // add limits clause
+ if ($count > 0) {
+ $sql .= "\n";
+ $sql = trim($this->_adapter->limit($sql, $count, $offset));
+ }
+
+ return $sql;
+ }
+
+ /**
+ * Makes the query SELECT DISTINCT.
+ *
+ * @param bool $flag Whether or not the SELECT is DISTINCT (default true).
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function distinct($flag = true)
+ {
+ $this->_parts[self::DISTINCT] = (bool) $flag;
+ return $this;
+ }
+
+ /**
+ * Makes the query SELECT FOR UPDATE.
+ *
+ * @param bool $flag Whether or not the SELECT is FOR UPDATE (default true).
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function forUpdate($flag = true)
+ {
+ $this->_parts[self::FOR_UPDATE] = (bool) $flag;
+ return $this;
+ }
+
+ /**
+ * Adds a FROM table and optional columns to the query.
+ *
+ * The first parameter $name can be a simple string, in which case the
+ * correlation name is generated automatically. If you want to specify
+ * the correlation name, the first parameter must be an associative
+ * array in which the key is the physical table name, and the value is
+ * the correlation name. For example, array('table' => 'alias').
+ * The correlation name is prepended to all columns fetched for this
+ * table.
+ *
+ * The second parameter can be a single string or Zend_Db_Expr object,
+ * or else an array of strings or Zend_Db_Expr objects.
+ *
+ * The first parameter can be null or an empty string, in which case
+ * no correlation name is generated or prepended to the columns named
+ * in the second parameter.
+ *
+ * @param array|string|Zend_Db_Expr $name The table name or an associative array relating table name to
+ * correlation name.
+ * @param array|string|Zend_Db_Expr $cols The columns to select from this table.
+ * @param string $schema The schema name to specify, if any.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function from($name, $cols = '*', $schema = null)
+ {
+ return $this->joinInner($name, null, $cols, $schema);
+ }
+
+ /**
+ * Populate the {@link $_parts} 'join' key
+ *
+ * Does the dirty work of populating the join key.
+ *
+ * The $name and $cols parameters follow the same logic
+ * as described in the from() method.
+ *
+ * @param null|string $type Type of join; inner, left, and null are currently supported
+ * @param array|string|Zend_Db_Expr $name Table name
+ * @param string $cond Join on this condition
+ * @param array|string $cols The columns to select from the joined table
+ * @param string $schema The database name to specify, if any.
+ * @return Zend_Db_Select This Zend_Db_Select object
+ * @throws Zend_Db_Select_Exception
+ */
+ protected function _join($type, $name, $cond, $cols, $schema = null)
+ {
+ $joinTypes = array(self::INNER_JOIN, self::LEFT_JOIN, self::RIGHT_JOIN, self::FULL_JOIN, self::CROSS_JOIN, self::NATURAL_JOIN);
+ if (!in_array($type, $joinTypes)) {
+ /**
+ * @see Zend_Db_Select_Exception
+ */
+ require_once 'Zend/Db/Select/Exception.php';
+ throw new Zend_Db_Select_Exception("Invalid join type '$type'");
+ }
+
+ if (empty($name)) {
+ $correlationName = $tableName = '';
+ } else if (is_array($name)) {
+ // Must be array($correlationName => $tableName) or array($ident, ...)
+ foreach ($name as $_correlationName => $_tableName) {
+ if (is_string($_correlationName)) {
+ // We assume the key is the correlation name and value is the table name
+ $tableName = $_tableName;
+ $correlationName = $_correlationName;
+ } else {
+ // We assume just an array of identifiers, with no correlation name
+ $tableName = $name;
+ $correlationName = $this->_uniqueCorrelation($tableName);
+ }
+ break;
+ }
+ } else if ($name instanceof Zend_Db_Expr) {
+ $tableName = $name;
+ $correlationName = $this->_uniqueCorrelation('t');
+ } else if (preg_match('/^(.+)\s+AS\s+(.+)$/i', $name, $m)) {
+ $tableName = $m[1];
+ $correlationName = $m[2];
+ } else {
+ $tableName = $name;
+ $correlationName = $this->_uniqueCorrelation($tableName);
+ }
+
+ // Schema from table name overrides schema argument
+ if (false !== strpos($tableName, '.')) {
+ list($schema, $tableName) = explode('.', $tableName);
+ }
+
+ if (!empty($correlationName)) {
+ if (array_key_exists($correlationName, $this->_parts[self::FROM])) {
+ /**
+ * @see Zend_Db_Select_Exception
+ */
+ require_once 'Zend/Db/Select/Exception.php';
+ throw new Zend_Db_Select_Exception("You cannot define a correlation name '$correlationName' more than once");
+ }
+
+ $this->_parts[self::FROM][$correlationName] = array(
+ 'joinType' => $type,
+ 'schema' => $schema,
+ 'tableName' => $tableName,
+ 'joinCondition' => $cond
+ );
+ }
+
+ // add to the columns from this joined table
+ $this->_tableCols($correlationName, $cols);
+
+ return $this;
+ }
+
+ /**
+ * Generate a unique correlation name
+ *
+ * @param string|array $name A qualified identifier.
+ * @return string A unique correlation name.
+ */
+ private function _uniqueCorrelation($name)
+ {
+ if (is_array($name)) {
+ $c = end($name);
+ } else {
+ // Extract just the last name of a qualified table name
+ $dot = strrpos($name,'.');
+ $c = ($dot === false) ? $name : substr($name, $dot+1);
+ }
+ for ($i = 2; array_key_exists($c, $this->_parts[self::FROM]); ++$i) {
+ $c = $name . '_' . (string) $i;
+ }
+ return $c;
+ }
+
+ /**
+ * Adds a JOIN table and columns to the query.
+ *
+ * The $name and $cols parameters follow the same logic
+ * as described in the from() method.
+ *
+ * @param array|string|Zend_Db_Expr $name The table name.
+ * @param string $cond Join on this condition.
+ * @param array|string $cols The columns to select from the joined table.
+ * @param string $schema The database name to specify, if any.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function join($name, $cond, $cols = '*', $schema = null)
+ {
+ return $this->joinInner($name, $cond, $cols);
+ }
+
+ /**
+ * Add an INNER JOIN table and colums to the query
+ * Rows in both tables are matched according to the expression
+ * in the $cond argument. The result set is comprised
+ * of all cases where rows from the left table match
+ * rows from the right table.
+ *
+ * The $name and $cols parameters follow the same logic
+ * as described in the from() method.
+ *
+ * @param array|string|Zend_Db_Expr $name The table name.
+ * @param string $cond Join on this condition.
+ * @param array|string $cols The columns to select from the joined table.
+ * @param string $schema The database name to specify, if any.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function joinInner($name, $cond, $cols = '*', $schema = null)
+ {
+ return $this->_join(self::INNER_JOIN, $name, $cond, $cols, $schema);
+ }
+
+ /**
+ * Add a LEFT OUTER JOIN table and colums to the query
+ * All rows from the left operand table are included,
+ * matching rows from the right operand table included,
+ * and the columns from the right operand table are filled
+ * with NULLs if no row exists matching the left table.
+ *
+ * The $name and $cols parameters follow the same logic
+ * as described in the from() method.
+ *
+ * @param array|string|Zend_Db_Expr $name The table name.
+ * @param string $cond Join on this condition.
+ * @param array|string $cols The columns to select from the joined table.
+ * @param string $schema The database name to specify, if any.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function joinLeft($name, $cond, $cols = '*', $schema = null)
+ {
+ return $this->_join(self::LEFT_JOIN, $name, $cond, $cols, $schema);
+ }
+
+ /**
+ * Add a RIGHT OUTER JOIN table and colums to the query.
+ * Right outer join is the complement of left outer join.
+ * All rows from the right operand table are included,
+ * matching rows from the left operand table included,
+ * and the columns from the left operand table are filled
+ * with NULLs if no row exists matching the right table.
+ *
+ * The $name and $cols parameters follow the same logic
+ * as described in the from() method.
+ *
+ * @param array|string|Zend_Db_Expr $name The table name.
+ * @param string $cond Join on this condition.
+ * @param array|string $cols The columns to select from the joined table.
+ * @param string $schema The database name to specify, if any.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function joinRight($name, $cond, $cols = '*', $schema = null)
+ {
+ return $this->_join(self::RIGHT_JOIN, $name, $cond, $cols, $schema);
+ }
+
+ /**
+ * Add a FULL OUTER JOIN table and colums to the query.
+ * A full outer join is like combining a left outer join
+ * and a right outer join. All rows from both tables are
+ * included, paired with each other on the same row of the
+ * result set if they satisfy the join condition, and otherwise
+ * paired with NULLs in place of columns from the other table.
+ *
+ * The $name and $cols parameters follow the same logic
+ * as described in the from() method.
+ *
+ * @param array|string|Zend_Db_Expr $name The table name.
+ * @param string $cond Join on this condition.
+ * @param array|string $cols The columns to select from the joined table.
+ * @param string $schema The database name to specify, if any.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function joinFull($name, $cond, $cols = '*', $schema = null)
+ {
+ return $this->_join(self::FULL_JOIN, $name, $cond, $cols, $schema);
+ }
+
+ /**
+ * Add a CROSS JOIN table and colums to the query.
+ * A cross join is a cartesian product; there is no join condition.
+ *
+ * The $name and $cols parameters follow the same logic
+ * as described in the from() method.
+ *
+ * @param array|string|Zend_Db_Expr $name The table name.
+ * @param array|string $cols The columns to select from the joined table.
+ * @param string $schema The database name to specify, if any.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function joinCross($name, $cols = '*', $schema = null)
+ {
+ return $this->_join(self::CROSS_JOIN, $name, null, $cols, $schema);
+ }
+
+ /**
+ * Add a NATURAL JOIN table and colums to the query.
+ * A natural join assumes an equi-join across any column(s)
+ * that appear with the same name in both tables.
+ * Only natural inner joins are supported by this API,
+ * even though SQL permits natural outer joins as well.
+ *
+ * The $name and $cols parameters follow the same logic
+ * as described in the from() method.
+ *
+ * @param array|string|Zend_Db_Expr $name The table name.
+ * @param array|string $cols The columns to select from the joined table.
+ * @param string $schema The database name to specify, if any.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function joinNatural($name, $cols = '*', $schema = null)
+ {
+ return $this->_join(self::NATURAL_JOIN, $name, null, $cols, $schema);
+ }
+
+ /**
+ * Adds a WHERE condition to the query by AND.
+ *
+ * If a value is passed as the second param, it will be quoted
+ * and replaced into the condition wherever a question-mark
+ * appears. Array values are quoted and comma-separated.
+ *
+ * <code>
+ * // simplest but non-secure
+ * $select->where("id = $id");
+ *
+ * // secure (ID is quoted but matched anyway)
+ * $select->where('id = ?', $id);
+ *
+ * // alternatively, with named binding
+ * $select->where('id = :id');
+ * </code>
+ *
+ * Note that it is more correct to use named bindings in your
+ * queries for values other than strings. When you use named
+ * bindings, don't forget to pass the values when actually
+ * making a query:
+ *
+ * <code>
+ * $db->fetchAll($select, array('id' => 5));
+ * </code>
+ *
+ * @param string $cond The WHERE condition.
+ * @param string $val A single value to quote into the condition.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function where($cond)
+ {
+ if (func_num_args() > 1) {
+ $val = func_get_arg(1);
+ $cond = $this->_adapter->quoteInto($cond, $val);
+ }
+
+ if ($this->_parts[self::WHERE]) {
+ $this->_parts[self::WHERE][] = "AND ($cond)";
+ } else {
+ $this->_parts[self::WHERE][] = "($cond)";
+ }
+
+ return $this;
+ }
+
+ /**
+ * Adds a WHERE condition to the query by OR.
+ *
+ * Otherwise identical to where().
+ *
+ * @param string $cond The WHERE condition.
+ * @param string $val A value to quote into the condition.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ *
+ * @see where()
+ */
+ public function orWhere($cond)
+ {
+ if (func_num_args() > 1) {
+ $val = func_get_arg(1);
+ $cond = $this->_adapter->quoteInto($cond, $val);
+ }
+
+ if ($this->_parts[self::WHERE]) {
+ $this->_parts[self::WHERE][] = "OR ($cond)";
+ } else {
+ $this->_parts[self::WHERE][] = "($cond)";
+ }
+
+ return $this;
+ }
+
+ /**
+ * Adds grouping to the query.
+ *
+ * @param array|string $spec The column(s) to group by.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function group($spec)
+ {
+ if (!is_array($spec)) {
+ $spec = array($spec);
+ }
+
+ foreach ($spec as $val) {
+ if (preg_match('/\(.*\)/', (string) $val)) {
+ $val = new Zend_Db_Expr($val);
+ }
+ $this->_parts[self::GROUP][] = $val;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Adds a HAVING condition to the query by AND.
+ *
+ * If a value is passed as the second param, it will be quoted
+ * and replaced into the condition wherever a question-mark
+ * appears. See {@link where()} for an example
+ *
+ * @param string $cond The HAVING condition.
+ * @param string|Zend_Db_Expr $val A single value to quote into the condition.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function having($cond)
+ {
+ if (func_num_args() > 1) {
+ $val = func_get_arg(1);
+ $cond = $this->_adapter->quoteInto($cond, $val);
+ }
+
+ if ($this->_parts[self::HAVING]) {
+ $this->_parts[self::HAVING][] = "AND ($cond)";
+ } else {
+ $this->_parts[self::HAVING][] = "($cond)";
+ }
+
+ return $this;
+ }
+
+ /**
+ * Adds a HAVING condition to the query by OR.
+ *
+ * Otherwise identical to orHaving().
+ *
+ * @param string $cond The HAVING condition.
+ * @param string $val A single value to quote into the condition.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ *
+ * @see having()
+ */
+ public function orHaving($cond)
+ {
+ if (func_num_args() > 1) {
+ $val = func_get_arg(1);
+ $cond = $this->_adapter->quoteInto($cond, $val);
+ }
+
+ if ($this->_parts[self::HAVING]) {
+ $this->_parts[self::HAVING][] = "OR ($cond)";
+ } else {
+ $this->_parts[self::HAVING][] = "($cond)";
+ }
+
+ return $this;
+ }
+
+ /**
+ * Adds a row order to the query.
+ *
+ * @param mixed $spec The column(s) and direction to order by.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function order($spec)
+ {
+ if (!is_array($spec)) {
+ $spec = array($spec);
+ }
+
+ // force 'ASC' or 'DESC' on each order spec, default is ASC.
+ foreach ($spec as $val) {
+ if ($val instanceof Zend_Db_Expr) {
+ $expr = $val->__toString();
+ if (empty($expr)) {
+ continue;
+ }
+ $this->_parts[self::ORDER][] = $val;
+ } else {
+ if (empty($val)) {
+ continue;
+ }
+ $direction = 'ASC';
+ if (preg_match('/(.*)\s+(ASC|DESC)\s*$/i', $val, $matches)) {
+ $val = trim($matches[1]);
+ $direction = $matches[2];
+ }
+ if (preg_match('/\(.*\)/', $val)) {
+ $val = new Zend_Db_Expr($val);
+ }
+ $this->_parts[self::ORDER][] = array($val, $direction);
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Sets a limit count and offset to the query.
+ *
+ * @param int $count OPTIONAL The number of rows to return.
+ * @param int $offset OPTIONAL Start returning after this many rows.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function limit($count = null, $offset = null)
+ {
+ $this->_parts[self::LIMIT_COUNT] = (int) $count;
+ $this->_parts[self::LIMIT_OFFSET] = (int) $offset;
+ return $this;
+ }
+
+ /**
+ * Sets the limit and count by page number.
+ *
+ * @param int $page Limit results to this page number.
+ * @param int $rowCount Use this many rows per page.
+ * @return Zend_Db_Select This Zend_Db_Select object.
+ */
+ public function limitPage($page, $rowCount)
+ {
+ $page = ($page > 0) ? $page : 1;
+ $rowCount = ($rowCount > 0) ? $rowCount : 1;
+ $this->_parts[self::LIMIT_COUNT] = (int) $rowCount;
+ $this->_parts[self::LIMIT_OFFSET] = (int) $rowCount * ($page - 1);
+ return $this;
+ }
+
+ /**
+ * Adds to the internal table-to-column mapping array.
+ *
+ * @param string $tbl The table/join the columns come from.
+ * @param array|string $cols The list of columns; preferably as
+ * an array, but possibly as a string containing one column.
+ * @return void
+ */
+ protected function _tableCols($correlationName, $cols)
+ {
+ if (!is_array($cols)) {
+ $cols = array($cols);
+ }
+ if ($correlationName == null) {
+ $correlationName = '';
+ }
+
+ foreach ($cols as $alias => $col) {
+ $currentCorrelationName = $correlationName;
+ if (is_string($col)) {
+ // Check for a column matching "<column> AS <alias>" and extract the alias name
+ if (preg_match('/^(.+)\s+AS\s+(.+)$/i', $col, $m)) {
+ $col = $m[1];
+ $alias = $m[2];
+ }
+ // Check for columns that look like functions and convert to Zend_Db_Expr
+ if (preg_match('/\(.*\)/', $col)) {
+ $col = new Zend_Db_Expr($col);
+ } elseif (preg_match('/(.+)\.(.+)/', $col, $m)) {
+ $currentCorrelationName = $m[1];
+ $col = $m[2];
+ }
+ }
+ $this->_parts[self::COLUMNS][] = array($currentCorrelationName, $col, is_string($alias) ? $alias : null);
+ }
+ }
+
+ /**
+ * Get part of the structured information for the currect query.
+ *
+ * @param string $part
+ * @return mixed
+ * @throws Zend_Db_Select_Exception
+ */
+ public function getPart($part)
+ {
+ $part = strtolower($part);
+ if (!array_key_exists($part, $this->_parts)) {
+ /**
+ * @see Zend_Db_Select_Exception
+ */
+ require_once 'Zend/Db/Select/Exception.php';
+ throw new Zend_Db_Select_Exception("Invalid Select part '$part'");
+ }
+ return $this->_parts[ $part ];
+ }
+
+ /**
+ * @param integer $fetchMode OPTIONAL
+ * @return PDO_Statement|Zend_Db_Statement
+ */
+ public function query($fetchMode = null)
+ {
+ $stmt = $this->_adapter->query($this);
+ if ($fetchMode == null) {
+ $fetchMode = $this->_adapter->getFetchMode();
+ }
+ $stmt->setFetchMode($fetchMode);
+ return $stmt;
+ }
+
+ /**
+ * Clear parts of the Select object, or an individual part.
+ *
+ * @param string $part OPTIONAL
+ * @return Zend_Db_Select
+ */
+ public function reset($part = null)
+ {
+ if ($part == null) {
+ $this->_parts = self::$_partsInit;
+ } else if (array_key_exists($part, self::$_partsInit)) {
+ $this->_parts[$part] = self::$_partsInit[$part];
+ }
+ return $this;
+ }
+
+}
diff --git a/libs/Zend/Db/Select/Exception.php b/libs/Zend/Db/Select/Exception.php
new file mode 100755
index 0000000000..902bfadafc
--- /dev/null
+++ b/libs/Zend/Db/Select/Exception.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Select
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Db_Exception
+ */
+require_once 'Zend/Db/Exception.php';
+
+/**
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Select
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+class Zend_Db_Select_Exception extends Zend_Db_Exception
+{
+}
+
diff --git a/libs/Zend/Db/Statement.php b/libs/Zend/Db/Statement.php
new file mode 100755
index 0000000000..feabe77106
--- /dev/null
+++ b/libs/Zend/Db/Statement.php
@@ -0,0 +1,445 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * @see Zend_Db
+ */
+require_once 'Zend/Db.php';
+
+/**
+ * @see Zend_Db_Statement_Interface
+ */
+require_once 'Zend/Db/Statement/Interface.php';
+
+/**
+ * Abstract class to emulate a PDOStatement for native database adapters.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Db_Statement implements Zend_Db_Statement_Interface
+{
+
+ /**
+ * @var Zend_Db_Adapter_Abstract
+ */
+ protected $_adapter = null;
+
+ /**
+ * The current fetch mode.
+ *
+ * @var integer
+ */
+ protected $_fetchMode = Zend_Db::FETCH_ASSOC;
+
+ /**
+ * Attributes.
+ *
+ * @var array
+ */
+ protected $_attribute = array();
+
+ /**
+ * Column result bindings.
+ *
+ * @var array
+ */
+ protected $_bindColumn = array();
+
+ /**
+ * Query parameter bindings; covers bindParam() and bindValue().
+ *
+ * @var array
+ */
+ protected $_bindParam = array();
+
+ /**
+ * SQL string split into an array at placeholders.
+ *
+ * @var array
+ */
+ protected $_sqlSplit = array();
+
+ /**
+ * Parameter placeholders in the SQL string by position in the split array.
+ *
+ * @var array
+ */
+ protected $_sqlParam = array();
+
+ /**
+ * @var Zend_Db_Profiler_Query
+ */
+ protected $_queryProfile = null;
+
+ /**
+ * Constructor for a statement.
+ *
+ * @param Zend_Db_Adapter_Abstract $adapter
+ * @param mixed $sql Either a string or Zend_Db_Select.
+ */
+ public function __construct($adapter, $sql)
+ {
+ $this->_adapter = $adapter;
+ if ($sql instanceof Zend_Db_Select) {
+ $sql = $sql->__toString();
+ }
+ $this->_parseParameters($sql);
+ $this->_prepare($sql);
+ if (($q = $this->_adapter->getProfiler()->queryStart($sql)) !== null) {
+ $this->_queryProfile = $this->_adapter->getProfiler()->getQueryProfile($q);
+ }
+ }
+
+ /**
+ * @param string $sql
+ * @return void
+ */
+ protected function _parseParameters($sql)
+ {
+ $sql = $this->_stripQuoted($sql);
+
+ // split into text and params
+ $this->_sqlSplit = preg_split('/(\?|\:[a-z_]+)/',
+ $sql, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
+
+ // map params
+ $this->_sqlParam = array();
+ foreach ($this->_sqlSplit as $key => $val) {
+ if ($val == '?') {
+ if ($this->_adapter->supportsParameters('positional') === false) {
+ /**
+ * @see Zend_Db_Statement_Exception
+ */
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception("Invalid bind-variable position '$val'");
+ }
+ } else if ($val[0] == ':') {
+ if ($this->_adapter->supportsParameters('named') === false) {
+ /**
+ * @see Zend_Db_Statement_Exception
+ */
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception("Invalid bind-variable position '$val'");
+ }
+ }
+ $this->_sqlParam[] = $val;
+ }
+
+ // set up for binding
+ $this->_bindParam = array();
+ }
+
+ /**
+ * Remove parts of a SQL string that contain quoted strings
+ * of values or identifiers.
+ *
+ * @param string $sql
+ * @return string
+ */
+ protected function _stripQuoted($sql)
+ {
+ // get the character for delimited id quotes,
+ // this is usually " but in MySQL is `
+ $d = $this->_adapter->quoteIdentifier('a');
+ $d = $d[0];
+ // get the value used as an escaped delimited id quote,
+ // e.g. \" or "" or \`
+ $de = $this->_adapter->quoteIdentifier($d);
+ $de = substr($de, 1, 2);
+ $de = str_replace('\\', '\\\\', $de);
+
+ // get the character for value quoting
+ // this should be '
+ $q = $this->_adapter->quote('a');
+ $q = $q[0];
+ // get the value used as an escaped quote,
+ // e.g. \' or ''
+ $qe = $this->_adapter->quote($q);
+ $qe = substr($q, 1, 2);
+ $qe = str_replace('\\', '\\\\', $qe);
+
+ // get a version of the SQL statement with all quoted
+ // values and delimited identifiers stripped out
+ // remove "foo\"bar"
+ $sql = preg_replace("/$d($de|[^$d])*$d/", '', $sql);
+ // remove 'foo\'bar'
+ $sql = preg_replace("/$q($qe|[^$q])*$q/", '', $sql);
+
+ return $sql;
+ }
+
+ /**
+ * Bind a column of the statement result set to a PHP variable.
+ *
+ * @param string $column Name the column in the result set, either by
+ * position or by name.
+ * @param mixed $param Reference to the PHP variable containing the value.
+ * @param mixed $type OPTIONAL
+ * @return bool
+ */
+ public function bindColumn($column, &$param, $type = null)
+ {
+ $this->_bindColumn[$column] =& $param;
+ return true;
+ }
+
+ /**
+ * Binds a parameter to the specified variable name.
+ *
+ * @param mixed $parameter Name the parameter, either integer or string.
+ * @param mixed $variable Reference to PHP variable containing the value.
+ * @param mixed $type OPTIONAL Datatype of SQL parameter.
+ * @param mixed $length OPTIONAL Length of SQL parameter.
+ * @param mixed $options OPTIONAL Other options.
+ * @return bool
+ */
+ public function bindParam($parameter, &$variable, $type = null, $length = null, $options = null)
+ {
+ if (!is_int($parameter) && !is_string($parameter)) {
+ /**
+ * @see Zend_Db_Statement_Exception
+ */
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception('Invalid bind-variable position');
+ }
+
+ $position = null;
+ if (($intval = (int) $parameter) > 0 && $this->_adapter->supportsParameters('positional')) {
+ if ($intval >= 1 || $intval <= count($this->_sqlParam)) {
+ $position = $intval;
+ }
+ } else if ($this->_adapter->supportsParameters('named')) {
+ if ($parameter[0] != ':') {
+ $parameter = ':' . $parameter;
+ }
+ if (in_array($parameter, $this->_sqlParam) !== false) {
+ $position = $parameter;
+ }
+ }
+
+ if ($position === null) {
+ /**
+ * @see Zend_Db_Statement_Exception
+ */
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception("Invalid bind-variable position '$parameter'");
+ }
+
+ // Finally we are assured that $position is valid
+ $this->_bindParam[$position] =& $variable;
+ if ($this->_queryProfile) {
+ $this->_queryProfile->bindParam($position, $variable);
+ }
+ return $this->_bindParam($position, $variable, $type, $length, $options);
+ }
+
+ /**
+ * Binds a value to a parameter.
+ *
+ * @param mixed $parameter Name the parameter, either integer or string.
+ * @param mixed $value Scalar value to bind to the parameter.
+ * @param mixed $type OPTIONAL Datatype of the parameter.
+ * @return bool
+ */
+ public function bindValue($parameter, $value, $type = null)
+ {
+ return $this->bindParam($parameter, $value);
+ }
+
+ /**
+ * Executes a prepared statement.
+ *
+ * @param array $params OPTIONAL Values to bind to parameter placeholders.
+ * @return bool
+ */
+ public function execute(array $params = null)
+ {
+ if ($this->_queryProfile) {
+ if ($this->_queryProfile->hasEnded()) {
+ $prof = $this->_adapter->getProfiler();
+ $q = $prof->queryClone($this->_queryProfile);
+ $this->_queryProfile = $prof->getQueryProfile($q);
+ }
+ if ($params !== null) {
+ foreach ($params as $param => $variable) {
+ if (is_int($param)) {
+ $param++;
+ }
+ $this->_queryProfile->bindParam($param, $variable);
+ }
+ }
+ $this->_queryProfile->start();
+ }
+
+ $retval = true;
+ if ($params !== null) {
+ $retval = $this->_execute($params);
+ } else {
+ $retval = $this->_execute();
+ }
+
+ if ($this->_queryProfile) {
+ $this->_queryProfile->end();
+ }
+ return $retval;
+ }
+
+ /**
+ * Returns an array containing all of the result set rows.
+ *
+ * @param int $style OPTIONAL Fetch mode.
+ * @param int $col OPTIONAL Column number, if fetch mode is by column.
+ * @return array Collection of rows, each in a format by the fetch mode.
+ */
+ public function fetchAll($style = null, $col = null)
+ {
+ $data = array();
+ if ($style === Zend_Db::FETCH_COLUMN && $col === null) {
+ $col = 0;
+ }
+ if ($col === null) {
+ while ($row = $this->fetch($style)) {
+ $data[] = $row;
+ }
+ } else {
+ while ($val = $this->fetchColumn($col)) {
+ $data[] = $val;
+ }
+ }
+ return $data;
+ }
+
+ /**
+ * Returns a single column from the next row of a result set.
+ *
+ * @param int $col OPTIONAL Position of the column to fetch.
+ * @return string
+ */
+ public function fetchColumn($col = 0)
+ {
+ $data = array();
+ $col = (int) $col;
+ $row = $this->fetch(Zend_Db::FETCH_NUM);
+ if (is_array($row)) {
+ return $row[$col];
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Fetches the next row and returns it as an object.
+ *
+ * @param string $class OPTIONAL Name of the class to create.
+ * @param array $config OPTIONAL Constructor arguments for the class.
+ * @return mixed One object instance of the specified class.
+ */
+ public function fetchObject($class = 'stdClass', array $config = array())
+ {
+ $obj = new $class($config);
+ $row = $this->fetch(Zend_Db::FETCH_ASSOC);
+ foreach ($row as $key => $val) {
+ $obj->$key = $val;
+ }
+ return $obj;
+ }
+
+ /**
+ * Retrieve a statement attribute.
+ *
+ * @param string $key Attribute name.
+ * @return mixed Attribute value.
+ */
+ public function getAttribute($key)
+ {
+ if (array_key_exists($key, $this->_attribute)) {
+ return $this->_attribute[$key];
+ }
+ }
+
+ /**
+ * Set a statement attribute.
+ *
+ * @param string $key Attribute name.
+ * @param mixed $val Attribute value.
+ * @return bool
+ */
+ public function setAttribute($key, $val)
+ {
+ $this->_attribute[$key] = $val;
+ }
+
+ /**
+ * Set the default fetch mode for this statement.
+ *
+ * @param int $mode The fetch mode.
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function setFetchMode($mode)
+ {
+ switch ($mode) {
+ case Zend_Db::FETCH_NUM:
+ case Zend_Db::FETCH_ASSOC:
+ case Zend_Db::FETCH_BOTH:
+ case Zend_Db::FETCH_OBJ:
+ $this->_fetchMode = $mode;
+ break;
+ case Zend_Db::FETCH_BOUND:
+ default:
+ $this->closeCursor();
+ /**
+ * @see Zend_Db_Statement_Exception
+ */
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception('invalid fetch mode');
+ break;
+ }
+ }
+
+ /**
+ * Helper function to map retrieved row
+ * to bound column variables
+ *
+ * @param array $row
+ * @return bool True
+ */
+ public function _fetchBound($row)
+ {
+ foreach ($row as $key => $value) {
+ // bindColumn() takes 1-based integer positions
+ // but fetch() returns 0-based integer indexes
+ if (is_int($key)) {
+ $key++;
+ }
+ // set results only to variables that were bound previously
+ if (isset($this->_bindColumn[$key])) {
+ $this->_bindColumn[$key] = $value;
+ }
+ }
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Db/Statement/Db2.php b/libs/Zend/Db/Statement/Db2.php
new file mode 100755
index 0000000000..62aaa54b34
--- /dev/null
+++ b/libs/Zend/Db/Statement/Db2.php
@@ -0,0 +1,356 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * @see Zend_Db_Statement
+ */
+require_once 'Zend/Db/Statement.php';
+
+/**
+ * Extends for DB2 native adapter.
+ *
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ * @author Joscha Feth <jffeth@de.ibm.com>
+ * @author Salvador Ledezma <ledezma@us.ibm.com>
+ */
+class Zend_Db_Statement_Db2 extends Zend_Db_Statement
+{
+ /**
+ * Statement resource handle.
+ */
+ protected $_stmt = null;
+
+ /**
+ * Column names.
+ */
+ protected $_keys;
+
+ /**
+ * Fetched result values.
+ */
+ protected $_values;
+
+ /**
+ * Prepare a statement handle.
+ *
+ * @param string $sql
+ * @return void
+ * @throws Zend_Db_Statement_Db2_Exception
+ */
+ public function _prepare($sql)
+ {
+ $connection = $this->_adapter->getConnection();
+
+ $this->_stmt = db2_prepare($connection, $sql);
+
+ if (!$this->_stmt) {
+ /**
+ * @see Zend_Db_Statement_Db2_Exception
+ */
+ require_once 'Zend/Db/Statement/Db2/Exception.php';
+ throw new Zend_Db_Statement_Db2_Exception(
+ db2_stmt_errormsg(),
+ db2_stmt_error()
+ );
+ }
+ }
+
+ /**
+ * Binds a parameter to the specified variable name.
+ *
+ * @param mixed $parameter Name the parameter, either integer or string.
+ * @param mixed $variable Reference to PHP variable containing the value.
+ * @param mixed $type OPTIONAL Datatype of SQL parameter.
+ * @param mixed $length OPTIONAL Length of SQL parameter.
+ * @param mixed $options OPTIONAL Other options.
+ * @return bool
+ * @throws Zend_Db_Statement_Db2_Exception
+ */
+ public function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null)
+ {
+ if ($type === null) {
+ $type = DB2_PARAM_IN;
+ }
+
+ if (isset($options['data-type'])) {
+ $datatype = $options['data-type'];
+ } else {
+ $datatype = DB2_CHAR;
+ }
+
+ if (!db2_bind_param($this->_stmt, $position, "variable", $type, $datatype)) {
+ /**
+ * @see Zend_Db_Statement_Db2_Exception
+ */
+ require_once 'Zend/Db/Statement/Db2/Exception.php';
+ throw new Zend_Db_Statement_Db2_Exception(
+ db2_stmt_errormsg($this->_stmt),
+ db2_stmt_error($this->_stmt)
+ );
+ }
+
+ return true;
+ }
+
+ /**
+ * Closes the cursor, allowing the statement to be executed again.
+ *
+ * @return bool
+ */
+ public function closeCursor()
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+ db2_free_stmt($this->_stmt);
+ $this->_stmt = false;
+ return true;
+ }
+
+
+ /**
+ * Returns the number of columns in the result set.
+ * Returns null if the statement has no result set metadata.
+ *
+ * @return int The number of columns.
+ */
+ public function columnCount()
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+ return db2_num_fields($this->_stmt);
+ }
+
+ /**
+ * Retrieves the error code, if any, associated with the last operation on
+ * the statement handle.
+ *
+ * @return string error code.
+ */
+ public function errorCode()
+ {
+ if (!$this->_stmt) {
+ return '0000';
+ }
+
+ return db2_stmt_error($this->_stmt);
+ }
+
+ /**
+ * Retrieves an array of error information, if any, associated with the
+ * last operation on the statement handle.
+ *
+ * @return array
+ */
+ public function errorInfo()
+ {
+ if (!$this->_stmt) {
+ return array(false, 0, '');
+ }
+
+ /*
+ * Return three-valued array like PDO. But DB2 does not distinguish
+ * between SQLCODE and native RDBMS error code, so repeat the SQLCODE.
+ */
+ return array(
+ db2_stmt_error($this->_stmt),
+ db2_stmt_error($this->_stmt),
+ db2_stmt_errormsg($this->_stmt)
+ );
+ }
+
+ /**
+ * Executes a prepared statement.
+ *
+ * @param array $params OPTIONAL Values to bind to parameter placeholders.
+ * @return bool
+ * @throws Zend_Db_Statement_Db2_Exception
+ */
+ public function _execute(array $params = null)
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+
+ $retval = true;
+ if ($params !== null) {
+ $retval = @db2_execute($this->_stmt, $params);
+ } else {
+ $retval = @db2_execute($this->_stmt);
+ }
+
+ if ($retval === false) {
+ /**
+ * @see Zend_Db_Statement_Db2_Exception
+ */
+ require_once 'Zend/Db/Statement/Db2/Exception.php';
+ throw new Zend_Db_Statement_Db2_Exception(
+ db2_stmt_errormsg($this->_stmt),
+ db2_stmt_error($this->_stmt));
+ }
+
+ $this->_keys = array();
+ if ($field_num = $this->columnCount()) {
+ for ($i = 0; $i < $field_num; $i++) {
+ $name = db2_field_name($this->_stmt, $i);
+ $this->_keys[] = $name;
+ }
+ }
+
+ $this->_values = array();
+ if ($this->_keys) {
+ $this->_values = array_fill(0, count($this->_keys), null);
+ }
+
+ return $retval;
+ }
+
+ /**
+ * Fetches a row from the result set.
+ *
+ * @param int $style OPTIONAL Fetch mode for this fetch operation.
+ * @param int $cursor OPTIONAL Absolute, relative, or other.
+ * @param int $offset OPTIONAL Number for absolute or relative cursors.
+ * @return mixed Array, object, or scalar depending on fetch mode.
+ * @throws Zend_Db_Statement_Db2_Exception
+ */
+ public function fetch($style = null, $cursor = null, $offset = null)
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+
+ if ($style === null) {
+ $style = $this->_fetchMode;
+ }
+
+ switch ($style) {
+ case Zend_Db::FETCH_NUM :
+ $row = db2_fetch_array($this->_stmt);
+ break;
+ case Zend_Db::FETCH_ASSOC :
+ $row = db2_fetch_assoc($this->_stmt);
+ break;
+ case Zend_Db::FETCH_BOTH :
+ $row = db2_fetch_both($this->_stmt);
+ break;
+ case Zend_Db::FETCH_OBJ :
+ $row = db2_fetch_object($this->_stmt);
+ break;
+ case Zend_Db::FETCH_BOUND:
+ $row = db2_fetch_both($this->_stmt);
+ if ($row !== false) {
+ return $this->_fetchBound($row);
+ }
+ break;
+ default:
+ /**
+ * @see Zend_Db_Statement_Db2_Exception
+ */
+ require_once 'Zend/Db/Statement/Db2/Exception.php';
+ throw new Zend_Db_Statement_Db2_Exception("Invalid fetch mode '$style' specified");
+ break;
+ }
+
+ return $row;
+ }
+
+ /**
+ * Fetches the next row and returns it as an object.
+ *
+ * @param string $class OPTIONAL Name of the class to create.
+ * @param array $config OPTIONAL Constructor arguments for the class.
+ * @return mixed One object instance of the specified class.
+ */
+ public function fetchObject($class = 'stdClass', array $config = array())
+ {
+ $obj = $this->fetch(Zend_Db::FETCH_OBJ);
+ return $obj;
+ }
+
+ /**
+ * Retrieves the next rowset (result set) for a SQL statement that has
+ * multiple result sets. An example is a stored procedure that returns
+ * the results of multiple queries.
+ *
+ * @return bool
+ * @throws Zend_Db_Statement_Db2_Exception
+ */
+ public function nextRowset()
+ {
+ /**
+ * @see Zend_Db_Statement_Db2_Exception
+ */
+ require_once 'Zend/Db/Statement/Db2/Exception.php';
+ throw new Zend_Db_Statement_Db2_Exception(__FUNCTION__ . '() is not implemented');
+ }
+
+ /**
+ * Returns the number of rows affected by the execution of the
+ * last INSERT, DELETE, or UPDATE statement executed by this
+ * statement object.
+ *
+ * @return int The number of rows affected.
+ */
+ public function rowCount()
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+
+ $num = @db2_num_rows($this->_stmt);
+
+ if ($num === false) {
+ return 0;
+ }
+
+ return $num;
+ }
+
+ /**
+ * Returns an array containing all of the result set rows.
+ *
+ * @param int $style OPTIONAL Fetch mode.
+ * @param int $col OPTIONAL Column number, if fetch mode is by column.
+ * @return array Collection of rows, each in a format by the fetch mode.
+ *
+ * Behaves like parent, but if limit()
+ * is used, the final result removes the extra column
+ * 'zend_db_rownum'
+ */
+ public function fetchAll($style = null, $col = null)
+ {
+ $data = parent::fetchAll($style, $col);
+ $results = array();
+ $remove = $this->_adapter->foldCase('ZEND_DB_ROWNUM');
+
+ foreach ($data as $row) {
+ if (is_array($row) && array_key_exists($remove, $row)) {
+ unset($row[$remove]);
+ }
+ $results[] = $row;
+ }
+ return $results;
+ }
+}
diff --git a/libs/Zend/Db/Statement/Db2/Exception.php b/libs/Zend/Db/Statement/Db2/Exception.php
new file mode 100755
index 0000000000..d34f63558b
--- /dev/null
+++ b/libs/Zend/Db/Statement/Db2/Exception.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * Zend_Db_Statement_Exception
+ */
+require_once 'Zend/Db/Statement/Exception.php';
+
+/**
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ * @author Joscha Feth <jffeth@de.ibm.com>
+ * @author Salvador Ledezma <ledezma@us.ibm.com>
+ */
+
+class Zend_Db_Statement_Db2_Exception extends Zend_Db_Statement_Exception
+{
+ /**
+ * @var string
+ */
+ protected $code = '00000';
+
+ /**
+ * @var string
+ */
+ protected $message = 'unknown exception';
+
+ /**
+ * @param string $msg
+ * @param string $state
+ */
+ function __construct($msg = 'unknown exception', $state = '00000')
+ {
+ $this->message = $msg;
+ $this->code = $state;
+ }
+
+}
+
diff --git a/libs/Zend/Db/Statement/Exception.php b/libs/Zend/Db/Statement/Exception.php
new file mode 100755
index 0000000000..e59e45a54d
--- /dev/null
+++ b/libs/Zend/Db/Statement/Exception.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * @see Zend_Db_Exception
+ */
+require_once 'Zend/Db/Exception.php';
+
+/**
+ * Zend_Db_Statement_Exception
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Statement_Exception extends Zend_Db_Exception
+{
+}
diff --git a/libs/Zend/Db/Statement/Interface.php b/libs/Zend/Db/Statement/Interface.php
new file mode 100755
index 0000000000..4a2411b136
--- /dev/null
+++ b/libs/Zend/Db/Statement/Interface.php
@@ -0,0 +1,202 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Emulates a PDOStatement for native database adapters.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Db_Statement_Interface
+{
+
+ /**
+ * Bind a column of the statement result set to a PHP variable.
+ *
+ * @param string $column Name the column in the result set, either by
+ * position or by name.
+ * @param mixed $param Reference to the PHP variable containing the value.
+ * @param mixed $type OPTIONAL
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function bindColumn($column, &$param, $type = null);
+
+ /**
+ * Binds a parameter to the specified variable name.
+ *
+ * @param mixed $parameter Name the parameter, either integer or string.
+ * @param mixed $variable Reference to PHP variable containing the value.
+ * @param mixed $type OPTIONAL Datatype of SQL parameter.
+ * @param mixed $length OPTIONAL Length of SQL parameter.
+ * @param mixed $options OPTIONAL Other options.
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function bindParam($parameter, &$variable, $type = null, $length = null, $options = null);
+
+ /**
+ * Binds a value to a parameter.
+ *
+ * @param mixed $parameter Name the parameter, either integer or string.
+ * @param mixed $value Scalar value to bind to the parameter.
+ * @param mixed $type OPTIONAL Datatype of the parameter.
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function bindValue($parameter, $value, $type = null);
+
+ /**
+ * Closes the cursor, allowing the statement to be executed again.
+ *
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function closeCursor();
+
+ /**
+ * Returns the number of columns in the result set.
+ * Returns null if the statement has no result set metadata.
+ *
+ * @return int The number of columns.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function columnCount();
+
+ /**
+ * Retrieves the error code, if any, associated with the last operation on
+ * the statement handle.
+ *
+ * @return string error code.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function errorCode();
+
+ /**
+ * Retrieves an array of error information, if any, associated with the
+ * last operation on the statement handle.
+ *
+ * @return array
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function errorInfo();
+
+ /**
+ * Executes a prepared statement.
+ *
+ * @param array $params OPTIONAL Values to bind to parameter placeholders.
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function execute(array $params = array());
+
+ /**
+ * Fetches a row from the result set.
+ *
+ * @param int $style OPTIONAL Fetch mode for this fetch operation.
+ * @param int $cursor OPTIONAL Absolute, relative, or other.
+ * @param int $offset OPTIONAL Number for absolute or relative cursors.
+ * @return mixed Array, object, or scalar depending on fetch mode.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function fetch($style = null, $cursor = null, $offset = null);
+
+ /**
+ * Returns an array containing all of the result set rows.
+ *
+ * @param int $style OPTIONAL Fetch mode.
+ * @param int $col OPTIONAL Column number, if fetch mode is by column.
+ * @return array Collection of rows, each in a format by the fetch mode.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function fetchAll($style = null, $col = null);
+
+ /**
+ * Returns a single column from the next row of a result set.
+ *
+ * @param int $col OPTIONAL Position of the column to fetch.
+ * @return string
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function fetchColumn($col = 0);
+
+ /**
+ * Fetches the next row and returns it as an object.
+ *
+ * @param string $class OPTIONAL Name of the class to create.
+ * @param array $config OPTIONAL Constructor arguments for the class.
+ * @return mixed One object instance of the specified class.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function fetchObject($class = 'stdClass', array $config = array());
+
+ /**
+ * Retrieve a statement attribute.
+ *
+ * @param string $key Attribute name.
+ * @return mixed Attribute value.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function getAttribute($key);
+
+ /**
+ * Retrieves the next rowset (result set) for a SQL statement that has
+ * multiple result sets. An example is a stored procedure that returns
+ * the results of multiple queries.
+ *
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function nextRowset();
+
+ /**
+ * Returns the number of rows affected by the execution of the
+ * last INSERT, DELETE, or UPDATE statement executed by this
+ * statement object.
+ *
+ * @return int The number of rows affected.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function rowCount();
+
+ /**
+ * Set a statement attribute.
+ *
+ * @param string $key Attribute name.
+ * @param mixed $val Attribute value.
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function setAttribute($key, $val);
+
+ /**
+ * Set the default fetch mode for this statement.
+ *
+ * @param int $mode The fetch mode.
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function setFetchMode($mode);
+
+}
diff --git a/libs/Zend/Db/Statement/Mysqli.php b/libs/Zend/Db/Statement/Mysqli.php
new file mode 100755
index 0000000000..5219741ac5
--- /dev/null
+++ b/libs/Zend/Db/Statement/Mysqli.php
@@ -0,0 +1,344 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Mysqli.php 5401 2007-06-21 01:30:53Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Db_Statement
+ */
+require_once 'Zend/Db/Statement.php';
+
+
+/**
+ * Extends for Mysqli
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Statement_Mysqli extends Zend_Db_Statement
+{
+
+ /**
+ * The mysqli_stmt object.
+ *
+ * @var mysqli_stmt
+ */
+ protected $_stmt;
+
+ /**
+ * Column names.
+ *
+ * @var array
+ */
+ protected $_keys;
+
+ /**
+ * Fetched result values.
+ *
+ * @var array
+ */
+ protected $_values;
+
+ /**
+ * @var array
+ */
+ protected $_meta = null;
+
+ /**
+ * @param string $sql
+ * @return void
+ * @throws Zend_Db_Statement_Mysqli_Exception
+ */
+ public function _prepare($sql)
+ {
+ $mysqli = $this->_adapter->getConnection();
+
+ $this->_stmt = $mysqli->prepare($sql);
+
+ if ($this->_stmt === false || $mysqli->errno) {
+ /**
+ * @see Zend_Db_Statement_Mysqli_Exception
+ */
+ require_once 'Zend/Db/Statement/Mysqli/Exception.php';
+ throw new Zend_Db_Statement_Mysqli_Exception("Mysqli prepare error: " . $mysqli->error);
+ }
+ }
+
+ /**
+ * Binds a parameter to the specified variable name.
+ *
+ * @param mixed $parameter Name the parameter, either integer or string.
+ * @param mixed $variable Reference to PHP variable containing the value.
+ * @param mixed $type OPTIONAL Datatype of SQL parameter.
+ * @param mixed $length OPTIONAL Length of SQL parameter.
+ * @param mixed $options OPTIONAL Other options.
+ * @return bool
+ * @throws Zend_Db_Statement_Db2_Exception
+ */
+ protected function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null)
+ {
+ return true;
+ }
+
+ /**
+ * Closes the cursor, allowing the statement to be executed again.
+ *
+ * @return bool
+ */
+ public function closeCursor()
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+ $this->_stmt->reset();
+ return true;
+ }
+
+ /**
+ * Returns the number of columns in the result set.
+ * Returns null if the statement has no result set metadata.
+ *
+ * @return int The number of columns.
+ */
+ public function columnCount()
+ {
+ if (isset($this->_meta) && $this->_meta) {
+ return $this->_meta->field_count;
+ }
+ return 0;
+ }
+
+ /**
+ * Retrieves the error code, if any, associated with the last operation on
+ * the statement handle.
+ *
+ * @return string error code.
+ */
+ public function errorCode()
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+ return substr($this->_stmt->sqlstate, 0, 5);
+ }
+
+ /**
+ * Retrieves an array of error information, if any, associated with the
+ * last operation on the statement handle.
+ *
+ * @return array
+ */
+ public function errorInfo()
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+ return array(
+ substr($this->_stmt->sqlstate, 0, 5),
+ $this->_stmt->errno,
+ $this->_stmt->error,
+ );
+ }
+
+ /**
+ * Executes a prepared statement.
+ *
+ * @param array $params OPTIONAL Values to bind to parameter placeholders.
+ * @return bool
+ * @throws Zend_Db_Statement_Mysqli_Exception
+ */
+ public function _execute(array $params = null)
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+ // retain metadata
+ if ($this->_meta === null) {
+ $this->_meta = $this->_stmt->result_metadata();
+ if ($this->_stmt->errno) {
+ /**
+ * @see Zend_Db_Statement_Mysqli_Exception
+ */
+ require_once 'Zend/Db/Statement/Mysqli/Exception.php';
+ throw new Zend_Db_Statement_Mysqli_Exception("Mysqli statement metadata error: " . $this->_stmt->error);
+ }
+ }
+
+ // statements that have no result set do not return metadata
+ if ($this->_meta !== false) {
+
+ // get the column names that will result
+ $this->_keys = array();
+ foreach ($this->_meta->fetch_fields() as $col) {
+ $this->_keys[] = $this->_adapter->foldCase($col->name);
+ }
+
+ // set up a binding space for result variables
+ $this->_values = array_fill(0, count($this->_keys), null);
+
+ // set up references to the result binding space.
+ // just passing $this->_values in the call_user_func_array()
+ // below won't work, you need references.
+ $refs = array();
+ foreach ($this->_values as $i => &$f) {
+ $refs[$i] = &$f;
+ }
+
+ // bind to the result variables
+ call_user_func_array(
+ array($this->_stmt, 'bind_result'),
+ $this->_values
+ );
+ }
+
+ // if no params were given as an argument to execute(),
+ // then default to the _bindParam array
+ if ($params === null) {
+ $params = $this->_bindParam;
+ }
+ // send $params as input parameters to the statement
+ if ($params) {
+ array_unshift($params, str_repeat('s', count($params)));
+ call_user_func_array(
+ array($this->_stmt, 'bind_param'),
+ $params
+ );
+ }
+
+ // execute the statement
+ $retval = $this->_stmt->execute();
+ if ($retval === false) {
+ /**
+ * @see Zend_Db_Statement_Mysqli_Exception
+ */
+ require_once 'Zend/Db/Statement/Mysqli/Exception.php';
+ throw new Zend_Db_Statement_Mysqli_Exception("Mysqli statement execute error : " . $this->_stmt->error);
+ }
+ return $retval;
+ }
+
+ /**
+ * Fetches a row from the result set.
+ *
+ * @param int $style OPTIONAL Fetch mode for this fetch operation.
+ * @param int $cursor OPTIONAL Absolute, relative, or other.
+ * @param int $offset OPTIONAL Number for absolute or relative cursors.
+ * @return mixed Array, object, or scalar depending on fetch mode.
+ * @throws Zend_Db_Statement_Mysqli_Exception
+ */
+ public function fetch($style = null, $cursor = null, $offset = null)
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+ // fetch the next result
+ $retval = $this->_stmt->fetch();
+ switch ($retval) {
+ case null: // end of data
+ case false: // error occurred
+ $this->_stmt->reset();
+ return $retval;
+ default:
+ // fallthrough
+ }
+
+ // make sure we have a fetch mode
+ if ($style === null) {
+ $style = $this->_fetchMode;
+ }
+
+ // dereference the result values, otherwise things like fetchAll()
+ // return the same values for every entry (because of the reference).
+ $values = array();
+ foreach ($this->_values as $key => $val) {
+ $values[] = $val;
+ }
+
+ $row = false;
+ switch ($style) {
+ case Zend_Db::FETCH_NUM:
+ $row = $values;
+ break;
+ case Zend_Db::FETCH_ASSOC:
+ $row = array_combine($this->_keys, $values);
+ break;
+ case Zend_Db::FETCH_BOTH:
+ $assoc = array_combine($this->_keys, $values);
+ $row = array_merge($values, $assoc);
+ break;
+ case Zend_Db::FETCH_OBJ:
+ $row = (object) array_combine($this->_keys, $values);
+ break;
+ case Zend_Db::FETCH_BOUND:
+ $assoc = array_combine($this->_keys, $values);
+ $row = array_merge($values, $assoc);
+ return $this->_fetchBound($row);
+ break;
+ default:
+ /**
+ * @see Zend_Db_Statement_Mysqli_Exception
+ */
+ require_once 'Zend/Db/Statement/Mysqli/Exception.php';
+ throw new Zend_Db_Statement_Mysqli_Exception("Invalid fetch mode '$style' specified");
+ break;
+ }
+
+ return $row;
+ }
+
+ /**
+ * Retrieves the next rowset (result set) for a SQL statement that has
+ * multiple result sets. An example is a stored procedure that returns
+ * the results of multiple queries.
+ *
+ * @return bool
+ * @throws Zend_Db_Statement_Mysqli_Exception
+ */
+ public function nextRowset()
+ {
+ /**
+ * @see Zend_Db_Statement_Mysqli_Exception
+ */
+ require_once 'Zend/Db/Statement/Mysqli/Exception.php';
+ throw new Zend_Db_Statement_Mysqli_Exception(__FUNCTION__.'() is not implemented');
+ }
+
+ /**
+ * Returns the number of rows affected by the execution of the
+ * last INSERT, DELETE, or UPDATE statement executed by this
+ * statement object.
+ *
+ * @return int The number of rows affected.
+ */
+ public function rowCount()
+ {
+ if (!$this->_adapter) {
+ return false;
+ }
+ $mysqli = $this->_adapter->getConnection();
+ return $mysqli->affected_rows;
+ }
+
+}
diff --git a/libs/Zend/Db/Statement/Mysqli/Exception.php b/libs/Zend/Db/Statement/Mysqli/Exception.php
new file mode 100755
index 0000000000..ac4db90834
--- /dev/null
+++ b/libs/Zend/Db/Statement/Mysqli/Exception.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * Zend_Db_Statement_Exception
+ */
+require_once 'Zend/Db/Statement/Exception.php';
+
+/**
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+class Zend_Db_Statement_Mysqli_Exception extends Zend_Db_Statement_Exception
+{
+}
+
diff --git a/libs/Zend/Db/Statement/Oracle.php b/libs/Zend/Db/Statement/Oracle.php
new file mode 100755
index 0000000000..884a9c03b8
--- /dev/null
+++ b/libs/Zend/Db/Statement/Oracle.php
@@ -0,0 +1,531 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * @see Zend_Db_Statement
+ */
+require_once 'Zend/Db/Statement.php';
+
+/**
+ * Extends for Oracle.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Statement_Oracle extends Zend_Db_Statement
+{
+
+ /**
+ * The connection_stmt object.
+ */
+ protected $_stmt;
+
+ /**
+ * Column names.
+ */
+ protected $_keys;
+
+ /**
+ * Fetched result values.
+ */
+ protected $_values;
+
+ /**
+ * Prepares statement handle
+ *
+ * @param string $sql
+ * @return void
+ * @throws Zend_Db_Statement_Oracle_Exception
+ */
+ protected function _prepare($sql)
+ {
+ $connection = $this->_adapter->getConnection();
+ $this->_stmt = oci_parse($connection, $sql);
+ if (!$this->_stmt) {
+ /**
+ * @see Zend_Db_Statement_Oracle_Exception
+ */
+ require_once 'Zend/Db/Statement/Oracle/Exception.php';
+ throw new Zend_Db_Statement_Oracle_Exception(oci_error($connection));
+ }
+ }
+
+ /**
+ * Binds a parameter to the specified variable name.
+ *
+ * @param mixed $parameter Name the parameter, either integer or string.
+ * @param mixed $variable Reference to PHP variable containing the value.
+ * @param mixed $type OPTIONAL Datatype of SQL parameter.
+ * @param mixed $length OPTIONAL Length of SQL parameter.
+ * @param mixed $options OPTIONAL Other options.
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ protected function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null)
+ {
+ // default value
+ if ($type === NULL) {
+ $type = SQLT_CHR;
+ }
+
+ // default value
+ if ($length === NULL) {
+ $length = -1;
+ }
+
+ $retval = @oci_bind_by_name($this->_stmt, $parameter, $variable, $length, $type);
+ if ($retval === false) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Statement/Oracle/Exception.php';
+ throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt));
+ }
+
+ return true;
+ }
+
+ /**
+ * Closes the cursor, allowing the statement to be executed again.
+ *
+ * @return bool
+ */
+ public function closeCursor()
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+
+ oci_free_statement($this->_stmt);
+ $this->_stmt = false;
+ return true;
+ }
+
+ /**
+ * Returns the number of columns in the result set.
+ * Returns null if the statement has no result set metadata.
+ *
+ * @return int The number of columns.
+ */
+ public function columnCount()
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+
+ return oci_num_fields($this->_stmt);
+ }
+
+
+ /**
+ * Retrieves the error code, if any, associated with the last operation on
+ * the statement handle.
+ *
+ * @return string error code.
+ */
+ public function errorCode()
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+
+ $error = oci_error($this->_stmt);
+
+ if (!$error) {
+ return false;
+ }
+
+ return $error['code'];
+ }
+
+
+ /**
+ * Retrieves an array of error information, if any, associated with the
+ * last operation on the statement handle.
+ *
+ * @return array
+ */
+ public function errorInfo()
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+
+ $error = oci_error($this->_stmt);
+ if (!$error) {
+ return false;
+ }
+
+ if (isset($error['sqltext'])) {
+ return array(
+ $error['code'],
+ $error['message'],
+ $error['offset'],
+ $error['sqltext'],
+ );
+ } else {
+ return array(
+ $error['code'],
+ $error['message'],
+ );
+ }
+ }
+
+
+ /**
+ * Executes a prepared statement.
+ *
+ * @param array $params OPTIONAL Values to bind to parameter placeholders.
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function _execute(array $params = null)
+ {
+ $connection = $this->_adapter->getConnection();
+ if (!$this->_stmt) {
+ return false;
+ }
+
+ if (! $this->_stmt) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Statement/Oracle/Exception.php';
+ throw new Zend_Db_Statement_Oracle_Exception(oci_error($connection));
+ }
+
+ if ($params !== null) {
+ if (!is_array($params)) {
+ $params = array($params);
+ }
+ $error = false;
+ foreach (array_keys($params) as $name) {
+ if (!@oci_bind_by_name($this->_stmt, $name, $params[$name], -1)) {
+ $error = true;
+ break;
+ }
+ }
+ if ($error) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Statement/Oracle/Exception.php';
+ throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt));
+ }
+ }
+
+ $retval = @oci_execute($this->_stmt, $this->_adapter->_getExecuteMode());
+ if ($retval === false) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Statement/Oracle/Exception.php';
+ throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt));
+ }
+
+ $this->_keys = Array();
+ if ($field_num = oci_num_fields($this->_stmt)) {
+ for ($i = 1; $i <= $field_num; $i++) {
+ $name = oci_field_name($this->_stmt, $i);
+ $this->_keys[] = $name;
+ }
+ }
+
+ $this->_values = Array();
+ if ($this->_keys) {
+ $this->_values = array_fill(0, count($this->_keys), null);
+ }
+
+ return $retval;
+ }
+
+ /**
+ * Fetches a row from the result set.
+ *
+ * @param int $style OPTIONAL Fetch mode for this fetch operation.
+ * @param int $cursor OPTIONAL Absolute, relative, or other.
+ * @param int $offset OPTIONAL Number for absolute or relative cursors.
+ * @return mixed Array, object, or scalar depending on fetch mode.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function fetch($style = null, $cursor = null, $offset = null)
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+
+ if ($style === null) {
+ $style = $this->_fetchMode;
+ }
+
+ switch ($style) {
+ case Zend_Db::FETCH_NUM:
+ $row = oci_fetch_row($this->_stmt);
+ break;
+ case Zend_Db::FETCH_ASSOC:
+ $row = oci_fetch_assoc($this->_stmt);
+ break;
+ case Zend_Db::FETCH_BOTH:
+ $row = oci_fetch_array($this->_stmt, OCI_BOTH);
+ break;
+ case Zend_Db::FETCH_OBJ:
+ $row = oci_fetch_object($this->_stmt);
+ break;
+ case Zend_Db::FETCH_BOUND:
+ $row = oci_fetch_array($this->_stmt, OCI_BOTH);
+ if ($row !== false) {
+ return $this->_fetchBound($row);
+ }
+ break;
+ default:
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Statement/Oracle/Exception.php';
+ throw new Zend_Db_Statement_Oracle_Exception(
+ array(
+ 'code' => 'HYC00',
+ 'message' => "Invalid fetch mode '$style' specified"
+ )
+ );
+ break;
+ }
+
+ if (! $row && $error = oci_error($this->_stmt)) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Statement/Oracle/Exception.php';
+ throw new Zend_Db_Statement_Oracle_Exception($error);
+ }
+
+ return $row;
+ }
+
+ /**
+ * Returns an array containing all of the result set rows.
+ *
+ * @param int $style OPTIONAL Fetch mode.
+ * @param int $col OPTIONAL Column number, if fetch mode is by column.
+ * @return array Collection of rows, each in a format by the fetch mode.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function fetchAll($style = null, $col = 0)
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+
+ // make sure we have a fetch mode
+ if ($style === null) {
+ $style = $this->_fetchMode;
+ }
+
+ $flags = OCI_FETCHSTATEMENT_BY_ROW;
+
+ switch ($style) {
+ case Zend_Db::FETCH_BOTH:
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Statement/Oracle/Exception.php';
+ throw new Zend_Db_Statement_Oracle_Exception(
+ array(
+ 'code' => 'HYC00',
+ 'message' => "OCI8 driver does not support fetchAll(FETCH_BOTH), use fetch() in a loop instead"
+ )
+ );
+ // notreached
+ $flags |= OCI_NUM;
+ $flags |= OCI_ASSOC;
+ break;
+ case Zend_Db::FETCH_NUM:
+ $flags |= OCI_NUM;
+ break;
+ case Zend_Db::FETCH_ASSOC:
+ $flags |= OCI_ASSOC;
+ break;
+ case Zend_Db::FETCH_OBJ:
+ break;
+ case Zend_Db::FETCH_COLUMN:
+ $flags = $flags &~ OCI_FETCHSTATEMENT_BY_ROW;
+ $flags |= OCI_FETCHSTATEMENT_BY_COLUMN;
+ $flags |= OCI_NUM;
+ break;
+ default:
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Statement/Oracle/Exception.php';
+ throw new Zend_Db_Statement_Oracle_Exception(
+ array(
+ 'code' => 'HYC00',
+ 'message' => "Invalid fetch mode '$style' specified"
+ )
+ );
+ break;
+ }
+
+ $result = Array();
+ if ($flags != OCI_FETCHSTATEMENT_BY_ROW) { /* not Zend_Db::FETCH_OBJ */
+ if (! ($rows = oci_fetch_all($this->_stmt, $result, 0, -1, $flags) )) {
+ if ($error = oci_error($this->_stmt)) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Statement/Oracle/Exception.php';
+ throw new Zend_Db_Statement_Oracle_Exception($error);
+ }
+ if (!$rows) {
+ return array();
+ }
+ }
+ if ($style == Zend_Db::FETCH_COLUMN) {
+ $result = $result[$col];
+ }
+ } else {
+ while (($row = oci_fetch_object($this->_stmt)) !== false) {
+ $result [] = $row;
+ }
+ if ($error = oci_error($this->_stmt)) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Statement/Oracle/Exception.php';
+ throw new Zend_Db_Statement_Oracle_Exception($error);
+ }
+ }
+
+ return $result;
+ }
+
+
+ /**
+ * Returns a single column from the next row of a result set.
+ *
+ * @param int $col OPTIONAL Position of the column to fetch.
+ * @return string
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function fetchColumn($col = 0)
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+
+ if (!oci_fetch($this->_stmt)) {
+ /* TODO ERROR */
+ }
+
+ $data = oci_result($this->_stmt, $col+1); //1-based
+ if ($data === false) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Statement/Oracle/Exception.php';
+ throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt));
+ }
+ return $data;
+ }
+
+
+ /**
+ * Fetches the next row and returns it as an object.
+ *
+ * @param string $class OPTIONAL Name of the class to create.
+ * @param array $config OPTIONAL Constructor arguments for the class.
+ * @return mixed One object instance of the specified class.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function fetchObject($class = 'stdClass', array $config = array())
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+
+ $obj = oci_fetch_object($this->_stmt);
+
+ if ($obj === false) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Statement/Oracle/Exception.php';
+ throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt));
+ }
+
+ /* @todo XXX handle parameters */
+
+ return $obj;
+ }
+
+ /**
+ * Retrieves the next rowset (result set) for a SQL statement that has
+ * multiple result sets. An example is a stored procedure that returns
+ * the results of multiple queries.
+ *
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function nextRowset()
+ {
+ /**
+ * @see Zend_Db_Statement_Oracle_Exception
+ */
+ require_once 'Zend/Db/Statement/Oracle/Exception.php';
+ throw new Zend_Db_Statement_Oracle_Exception(
+ array(
+ 'code' => 'HYC00',
+ 'message' => 'Optional feature not implemented'
+ )
+ );
+ }
+
+ /**
+ * Returns the number of rows affected by the execution of the
+ * last INSERT, DELETE, or UPDATE statement executed by this
+ * statement object.
+ *
+ * @return int The number of rows affected.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function rowCount()
+ {
+ if (!$this->_stmt) {
+ return false;
+ }
+
+ $num_rows = oci_num_rows($this->_stmt);
+
+ if ($num_rows === false) {
+ /**
+ * @see Zend_Db_Adapter_Oracle_Exception
+ */
+ require_once 'Zend/Db/Statement/Oracle/Exception.php';
+ throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt));
+ }
+
+ return $num_rows;
+ }
+
+}
diff --git a/libs/Zend/Db/Statement/Oracle/Exception.php b/libs/Zend/Db/Statement/Oracle/Exception.php
new file mode 100755
index 0000000000..433948ab50
--- /dev/null
+++ b/libs/Zend/Db/Statement/Oracle/Exception.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Db_Statement_Exception
+ */
+require_once 'Zend/Db/Statement/Exception.php';
+
+/**
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+class Zend_Db_Statement_Oracle_Exception extends Zend_Db_Statement_Exception
+{
+ protected $message = 'Unknown exception';
+ protected $code = 0;
+
+ function __construct($error = null, $code = 0)
+ {
+ if (is_array($error)) {
+ if (!isset($error['offset'])) {
+ $this->message = $error['code']." ".$error['message'];
+ } else {
+ $this->message = $error['code']." ".$error['message']." ";
+ $this->message .= substr($error['sqltext'], 0, $error['offset']);
+ $this->message .= "*";
+ $this->message .= substr($error['sqltext'], $error['offset']);
+ }
+ $this->code = $error['code'];
+ }
+ if (!$this->code && $code) {
+ $this->code = $code;
+ }
+ }
+}
+
diff --git a/libs/Zend/Db/Statement/Pdo.php b/libs/Zend/Db/Statement/Pdo.php
new file mode 100755
index 0000000000..ee122741ef
--- /dev/null
+++ b/libs/Zend/Db/Statement/Pdo.php
@@ -0,0 +1,422 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Mysqli.php 4874 2007-05-19 01:26:32Z bkarwin $
+ */
+
+/**
+ * @see Zend_Db_Statement
+ */
+require_once 'Zend/Db/Statement.php';
+
+/**
+ * Proxy class to wrap a PDOStatement object.
+ * Matches the interface of PDOStatement. All methods simply proxy to the
+ * matching method in PDOStatement. PDOExceptions thrown by PDOStatement
+ * are re-thrown as Zend_Db_Statement_Exception.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Statement
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Statement_Pdo extends Zend_Db_Statement
+{
+
+ /**
+ * The mysqli_stmt object.
+ *
+ * @var PDOStatement
+ */
+ protected $_stmt;
+
+ /**
+ * @var int
+ */
+ protected $_fetchMode = PDO::FETCH_ASSOC;
+
+ /**
+ * Prepare a string SQL statement and create a statement object.
+ *
+ * @param string $sql
+ * @return void
+ * @throws Zend_Db_Statement_Exception
+ */
+ protected function _prepare($sql)
+ {
+ try {
+ $this->_stmt = $this->_adapter->getConnection()->prepare($sql);
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Bind a column of the statement result set to a PHP variable.
+ *
+ * @param string $column Name the column in the result set, either by
+ * position or by name.
+ * @param mixed $param Reference to the PHP variable containing the value.
+ * @param mixed $type OPTIONAL
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function bindColumn($column, &$param, $type = null)
+ {
+ try {
+ if (is_null($type)) {
+ return $this->_stmt->bindColumn($column, $param);
+ } else {
+ return $this->_stmt->bindColumn($column, $param, $type);
+ }
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Binds a parameter to the specified variable name.
+ *
+ * @param mixed $parameter Name the parameter, either integer or string.
+ * @param mixed $variable Reference to PHP variable containing the value.
+ * @param mixed $type OPTIONAL Datatype of SQL parameter.
+ * @param mixed $length OPTIONAL Length of SQL parameter.
+ * @param mixed $options OPTIONAL Other options.
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ protected function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null)
+ {
+ try {
+ return $this->_stmt->bindParam($parameter, $variable, $type, $length, $options);
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Binds a value to a parameter.
+ *
+ * @param mixed $parameter Name the parameter, either integer or string.
+ * @param mixed $value Scalar value to bind to the parameter.
+ * @param mixed $type OPTIONAL Datatype of the parameter.
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function bindValue($parameter, $value, $type = null)
+ {
+ if (is_string($parameter) && $parameter[0] != ':') {
+ $parameter = ":$parameter";
+ }
+ try {
+ if (is_null($type)) {
+ return $this->_stmt->bindValue($parameter, $value);
+ } else {
+ return $this->_stmt->bindValue($parameter, $value, $type);
+ }
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Closes the cursor, allowing the statement to be executed again.
+ *
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function closeCursor()
+ {
+ try {
+ return $this->_stmt->closeCursor();
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Returns the number of columns in the result set.
+ * Returns null if the statement has no result set metadata.
+ *
+ * @return int The number of columns.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function columnCount()
+ {
+ try {
+ return $this->_stmt->columnCount();
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Retrieves the error code, if any, associated with the last operation on
+ * the statement handle.
+ *
+ * @return string error code.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function errorCode()
+ {
+ try {
+ return $this->_stmt->errorCode();
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Retrieves an array of error information, if any, associated with the
+ * last operation on the statement handle.
+ *
+ * @return array
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function errorInfo()
+ {
+ try {
+ return $this->_stmt->errorInfo();
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Executes a prepared statement.
+ *
+ * @param array $params OPTIONAL Values to bind to parameter placeholders.
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function _execute(array $params = null)
+ {
+ try {
+ if ($params !== null) {
+ return $this->_stmt->execute($params);
+ } else {
+ return $this->_stmt->execute();
+ }
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Fetches a row from the result set.
+ *
+ * @param int $style OPTIONAL Fetch mode for this fetch operation.
+ * @param int $cursor OPTIONAL Absolute, relative, or other.
+ * @param int $offset OPTIONAL Number for absolute or relative cursors.
+ * @return mixed Array, object, or scalar depending on fetch mode.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function fetch($style = null, $cursor = null, $offset = null)
+ {
+ if ($style === null) {
+ $style = $this->_fetchMode;
+ }
+ try {
+ return $this->_stmt->fetch($style, $cursor, $offset);
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Returns an array containing all of the result set rows.
+ *
+ * @param int $style OPTIONAL Fetch mode.
+ * @param int $col OPTIONAL Column number, if fetch mode is by column.
+ * @return array Collection of rows, each in a format by the fetch mode.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function fetchAll($style = null, $col = null)
+ {
+ if ($style === null) {
+ $style = $this->_fetchMode;
+ }
+ try {
+ if ($style == PDO::FETCH_COLUMN) {
+ if ($col === null) {
+ $col = 0;
+ }
+ return $this->_stmt->fetchAll($style, $col);
+ } else {
+ return $this->_stmt->fetchAll($style);
+ }
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Returns a single column from the next row of a result set.
+ *
+ * @param int $col OPTIONAL Position of the column to fetch.
+ * @return string
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function fetchColumn($col = 0)
+ {
+ try {
+ return $this->_stmt->fetchColumn($col);
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Fetches the next row and returns it as an object.
+ *
+ * @param string $class OPTIONAL Name of the class to create.
+ * @param array $config OPTIONAL Constructor arguments for the class.
+ * @return mixed One object instance of the specified class.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function fetchObject($class = 'stdClass', array $config = array())
+ {
+ try {
+ return $this->_stmt->fetchObject($class, $config);
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Retrieve a statement attribute.
+ *
+ * @param integer $key Attribute name.
+ * @return mixed Attribute value.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function getAttribute($key)
+ {
+ try {
+ return $this->_stmt->getAttribute($key);
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Returns metadata for a column in a result set.
+ *
+ * @param int $column
+ * @return mixed
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function getColumnMeta($column)
+ {
+ try {
+ return $this->_stmt->getColumnMeta();
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Retrieves the next rowset (result set) for a SQL statement that has
+ * multiple result sets. An example is a stored procedure that returns
+ * the results of multiple queries.
+ *
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function nextRowset()
+ {
+ try {
+ return $this->_stmt->nextRowset();
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Returns the number of rows affected by the execution of the
+ * last INSERT, DELETE, or UPDATE statement executed by this
+ * statement object.
+ *
+ * @return int The number of rows affected.
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function rowCount()
+ {
+ try {
+ return $this->_stmt->rowCount();
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Set a statement attribute.
+ *
+ * @param string $key Attribute name.
+ * @param mixed $val Attribute value.
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function setAttribute($key, $val)
+ {
+ try {
+ return $this->_stmt->setAttribute($key, $val);
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+ /**
+ * Set the default fetch mode for this statement.
+ *
+ * @param int $mode The fetch mode.
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function setFetchMode($mode)
+ {
+ $this->_fetchMode = $mode;
+ try {
+ return $this->_stmt->setFetchMode($mode);
+ } catch (PDOException $e) {
+ require_once 'Zend/Db/Statement/Exception.php';
+ throw new Zend_Db_Statement_Exception($e->getMessage());
+ }
+ }
+
+}
diff --git a/libs/Zend/Db/Table.php b/libs/Zend/Db/Table.php
new file mode 100755
index 0000000000..ccd2599f4e
--- /dev/null
+++ b/libs/Zend/Db/Table.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Db_Table_Abstract
+ */
+require_once 'Zend/Db/Table/Abstract.php';
+
+/**
+ * Class for SQL table interface.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @deprecated since 0.9
+ */
+abstract class Zend_Db_Table extends Zend_Db_Table_Abstract
+{
+}
diff --git a/libs/Zend/Db/Table/Abstract.php b/libs/Zend/Db/Table/Abstract.php
new file mode 100755
index 0000000000..90bbcbb3c2
--- /dev/null
+++ b/libs/Zend/Db/Table/Abstract.php
@@ -0,0 +1,1110 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Abstract.php 5502 2007-06-29 18:15:35Z bkarwin $
+ */
+
+/**
+ * @see Zend_Db_Adapter_Abstract
+ */
+require_once 'Zend/Db/Adapter/Abstract.php';
+
+/**
+ * @see Zend_Db
+ */
+require_once 'Zend/Db.php';
+
+/**
+ * Class for SQL table interface.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Db_Table_Abstract
+{
+
+ const ADAPTER = 'db';
+ const SCHEMA = 'schema';
+ const NAME = 'name';
+ const PRIMARY = 'primary';
+ const COLS = 'cols';
+ const METADATA = 'metadata';
+ const METADATA_CACHE = 'metadataCache';
+ const ROW_CLASS = 'rowClass';
+ const ROWSET_CLASS = 'rowsetClass';
+ const REFERENCE_MAP = 'referenceMap';
+ const DEPENDENT_TABLES = 'dependentTables';
+ const SEQUENCE = 'sequence';
+
+ const COLUMNS = 'columns';
+ const REF_TABLE_CLASS = 'refTableClass';
+ const REF_COLUMNS = 'refColumns';
+ const ON_DELETE = 'onDelete';
+ const ON_UPDATE = 'onUpdate';
+
+ const CASCADE = 'cascade';
+ const RESTRICT = 'restrict';
+ const SET_NULL = 'setNull';
+
+ /**
+ * Default Zend_Db_Adapter_Abstract object.
+ *
+ * @var Zend_Db_Adapter_Abstract
+ */
+ protected static $_defaultDb;
+
+ /**
+ * Default cache for information provided by the adapter's describeTable() method.
+ *
+ * @var Zend_Cache_Core
+ */
+ protected static $_defaultMetadataCache = null;
+
+ /**
+ * Zend_Db_Adapter_Abstract object.
+ *
+ * @var Zend_Db_Adapter_Abstract
+ */
+ protected $_db;
+
+ /**
+ * The schema name (default null means current schema)
+ *
+ * @var array
+ */
+ protected $_schema = null;
+
+ /**
+ * The table name.
+ *
+ * @var array
+ */
+ protected $_name = null;
+
+ /**
+ * The table column names derived from Zend_Db_Adapter_Abstract::describeTable().
+ *
+ * @var array
+ */
+ protected $_cols;
+
+ /**
+ * The primary key column or columns.
+ * A compound key should be declared as an array.
+ * You may declare a single-column primary key
+ * as a string.
+ *
+ * @var mixed
+ */
+ protected $_primary = null;
+
+ /**
+ * If your primary key is a compound key, and one of the columns uses
+ * an auto-increment or sequence-generated value, set _identity
+ * to the ordinal index in the $_primary array for that column.
+ * Note this index is the position of the column in the primary key,
+ * not the position of the column in the table. The primary key
+ * array is 1-based.
+ *
+ * @var integer
+ */
+ protected $_identity = 1;
+
+ /**
+ * Define the logic for new values in the primary key.
+ * May be a string, boolean true, or boolean false.
+ *
+ * @var mixed
+ */
+ protected $_sequence = true;
+
+ /**
+ * Information provided by the adapter's describeTable() method.
+ *
+ * @var array
+ */
+ protected $_metadata = array();
+
+ /**
+ * Cache for information provided by the adapter's describeTable() method.
+ *
+ * @var Zend_Cache_Core
+ */
+ protected $_metadataCache = null;
+
+ /**
+ * Classname for row
+ *
+ * @var string
+ */
+ protected $_rowClass = 'Zend_Db_Table_Row';
+
+ /**
+ * Classname for rowset
+ *
+ * @var string
+ */
+ protected $_rowsetClass = 'Zend_Db_Table_Rowset';
+
+ /**
+ * Associative array map of declarative referential integrity rules.
+ * This array has one entry per foreign key in the current table.
+ * Each key is a mnemonic name for one reference rule.
+ *
+ * Each value is also an associative array, with the following keys:
+ * - columns = array of names of column(s) in the child table.
+ * - refTableClass = class name of the parent table.
+ * - refColumns = array of names of column(s) in the parent table,
+ * in the same order as those in the 'columns' entry.
+ * - onDelete = "cascade" means that a delete in the parent table also
+ * causes a delete of referencing rows in the child table.
+ * - onUpdate = "cascade" means that an update of primary key values in
+ * the parent table also causes an update of referencing
+ * rows in the child table.
+ *
+ * @var array
+ */
+ protected $_referenceMap = array();
+
+ /**
+ * Simple array of class names of tables that are "children" of the current
+ * table, in other words tables that contain a foreign key to this one.
+ * Array elements are not table names; they are class names of classes that
+ * extend Zend_Db_Table_Abstract.
+ *
+ * @var array
+ */
+ protected $_dependentTables = array();
+
+ /**
+ * Constructor.
+ *
+ * Supported params for $config are:
+ * - db = user-supplied instance of database connector,
+ * or key name of registry instance.
+ * - name = table name.
+ * - primary = string or array of primary key(s).
+ * - rowClass = row class name.
+ * - rowsetClass = rowset class name.
+ * - referenceMap = array structure to declare relationship
+ * to parent tables.
+ * - dependentTables = array of child tables.
+ * - metadataCache = cache for information from adapter describeTable().
+ *
+ * @param mixed $config Array of user-specified config options, or just the Db Adapter.
+ * @return void
+ */
+ public function __construct($config = array())
+ {
+ /**
+ * Allow a scalar argument to be the Adapter object or Registry key.
+ */
+ if (!is_array($config)) {
+ $config = array(self::ADAPTER => $config);
+ }
+
+ foreach ($config as $key => $value) {
+ switch ($key) {
+ case self::ADAPTER:
+ $this->_setAdapter($value);
+ break;
+ case self::SCHEMA:
+ $this->_schema = (string) $value;
+ break;
+ case self::NAME:
+ $this->_name = (string) $value;
+ break;
+ case self::PRIMARY:
+ $this->_primary = (array) $value;
+ break;
+ case self::ROW_CLASS:
+ $this->setRowClass($value);
+ break;
+ case self::ROWSET_CLASS:
+ $this->setRowsetClass($value);
+ break;
+ case self::REFERENCE_MAP:
+ $this->setReferences($value);
+ break;
+ case self::DEPENDENT_TABLES:
+ $this->setDependentTables($value);
+ break;
+ case self::METADATA_CACHE:
+ $this->_setMetadataCache($value);
+ break;
+ case self::SEQUENCE:
+ $this->_setSequence($value);
+ break;
+ default:
+ // ignore unrecognized configuration directive
+ break;
+ }
+ }
+
+ $this->_setup();
+ }
+
+ /**
+ * @param string $classname
+ * @return Zend_Db_Table_Abstract Provides a fluent interface
+ */
+ public function setRowClass($classname)
+ {
+ $this->_rowClass = (string) $classname;
+
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getRowClass()
+ {
+ return $this->_rowClass;
+ }
+
+ /**
+ * @param string $classname
+ * @return Zend_Db_Table_Abstract Provides a fluent interface
+ */
+ public function setRowsetClass($classname)
+ {
+ $this->_rowsetClass = (string) $classname;
+
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getRowsetClass()
+ {
+ return $this->_rowsetClass;
+ }
+
+ /**
+ * @param array $referenceMap
+ * @return Zend_Db_Table_Abstract Provides a fluent interface
+ */
+ public function setReferences(array $referenceMap)
+ {
+ $this->_referenceMap = $referenceMap;
+
+ return $this;
+ }
+
+ /**
+ * @param string $tableClassname
+ * @param string $ruleKey OPTIONAL
+ * @return array
+ * @throws Zend_Db_Table_Exception
+ */
+ public function getReference($tableClassname, $ruleKey = null)
+ {
+ $thisClass = get_class($this);
+ $refMap = $this->_getReferenceMapNormalized();
+ if ($ruleKey !== null) {
+ if (!isset($refMap[$ruleKey])) {
+ require_once "Zend/Db/Table/Exception.php";
+ throw new Zend_Db_Table_Exception("No reference rule \"$ruleKey\" from table $thisClass to table $tableClassname");
+ }
+ if ($refMap[$ruleKey][self::REF_TABLE_CLASS] != $tableClassname) {
+ require_once "Zend/Db/Table/Exception.php";
+ throw new Zend_Db_Table_Exception("Reference rule \"$ruleKey\" does not reference table $tableClassname");
+ }
+ return $refMap[$ruleKey];
+ }
+ foreach ($refMap as $reference) {
+ if ($reference[self::REF_TABLE_CLASS] == $tableClassname) {
+ return $reference;
+ }
+ }
+ require_once "Zend/Db/Table/Exception.php";
+ throw new Zend_Db_Table_Exception("No reference from table $thisClass to table $tableClassname");
+ }
+
+ /**
+ * @param array $dependentTables
+ * @return Zend_Db_Table_Abstract Provides a fluent interface
+ */
+ public function setDependentTables(array $dependentTables)
+ {
+ $this->_dependentTables = $dependentTables;
+
+ return $this;
+ }
+
+ /**
+ * @return array
+ */
+ public function getDependentTables()
+ {
+ return $this->_dependentTables;
+ }
+
+ /**
+ * Sets the default Zend_Db_Adapter_Abstract for all Zend_Db_Table objects.
+ *
+ * @param mixed $db Either an Adapter object, or a string naming a Registry key
+ * @return void
+ */
+ public static final function setDefaultAdapter($db = null)
+ {
+ Zend_Db_Table_Abstract::$_defaultDb = self::_setupAdapter($db);
+ }
+
+ /**
+ * Gets the default Zend_Db_Adapter_Abstract for all Zend_Db_Table objects.
+ *
+ * @return Zend_Db_Adapter_Abstract or null
+ */
+ public static final function getDefaultAdapter()
+ {
+ return self::$_defaultDb;
+ }
+
+ /**
+ * @param mixed $db Either an Adapter object, or a string naming a Registry key
+ * @return Zend_Db_Table_Abstract Provides a fluent interface
+ */
+ protected final function _setAdapter($db)
+ {
+ $this->_db = self::_setupAdapter($db);
+ return $this;
+ }
+
+ /**
+ * Gets the Zend_Db_Adapter_Abstract for this particular Zend_Db_Table object.
+ *
+ * @return Zend_Db_Adapter_Abstract
+ */
+ public final function getAdapter()
+ {
+ return $this->_db;
+ }
+
+ /**
+ * @param mixed $db Either an Adapter object, or a string naming a Registry key
+ * @return Zend_Db_Adapter_Abstract
+ * @throws Zend_Db_Table_Exception
+ */
+ protected static final function _setupAdapter($db)
+ {
+ if ($db === null) {
+ return null;
+ }
+ if (is_string($db)) {
+ require_once 'Zend/Registry.php';
+ $db = Zend_Registry::get($db);
+ }
+ if (!$db instanceof Zend_Db_Adapter_Abstract) {
+ require_once 'Zend/Db/Table/Exception.php';
+ throw new Zend_Db_Table_Exception('Argument must be of type Zend_Db_Adapter_Abstract, or a Registry key where a Zend_Db_Adapter_Abstract object is stored');
+ }
+ return $db;
+ }
+
+ /**
+ * Sets the default metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable().
+ *
+ * If $defaultMetadataCache is null, then no metadata cache is used by default.
+ *
+ * @param mixed $metadataCache Either a Cache object, or a string naming a Registry key
+ * @return void
+ */
+ public static function setDefaultMetadataCache($metadataCache = null)
+ {
+ self::$_defaultMetadataCache = self::_setupMetadataCache($metadataCache);
+ }
+
+ /**
+ * Gets the default metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable().
+ *
+ * @return Zend_Cache_Core or null
+ */
+ public static function getDefaultMetadataCache()
+ {
+ return self::$_defaultMetadataCache;
+ }
+
+ /**
+ * Sets the metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable().
+ *
+ * If $metadataCache is null, then no metadata cache is used. Since there is no opportunity to reload metadata
+ * after instantiation, this method need not be public, particularly because that it would have no effect
+ * results in unnecessary API complexity. To configure the metadata cache, use the metadataCache configuration
+ * option for the class constructor upon instantiation.
+ *
+ * @param mixed $metadataCache Either a Cache object, or a string naming a Registry key
+ * @return Zend_Db_Table_Abstract Provides a fluent interface
+ */
+ protected function _setMetadataCache($metadataCache)
+ {
+ $this->_metadataCache = self::_setupMetadataCache($metadataCache);
+ return $this;
+ }
+
+ /**
+ * Gets the metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable().
+ *
+ * @return Zend_Cache_Core or null
+ */
+ public function getMetadataCache()
+ {
+ return $this->_metadataCache;
+ }
+
+ /**
+ * @param mixed $metadataCache Either a Cache object, or a string naming a Registry key
+ * @return Zend_Cache_Core
+ * @throws Zend_Db_Table_Exception
+ */
+ protected static final function _setupMetadataCache($metadataCache)
+ {
+ if ($metadataCache === null) {
+ return null;
+ }
+ if (is_string($metadataCache)) {
+ require_once 'Zend/Registry.php';
+ $metadataCache = Zend_Registry::get($metadataCache);
+ }
+ if (!$metadataCache instanceof Zend_Cache_Core) {
+ require_once 'Zend/Db/Table/Exception.php';
+ throw new Zend_Db_Table_Exception('Argument must be of type Zend_Cache_Core, or a Registry key where a Zend_Cache_Core object is stored');
+ }
+ return $metadataCache;
+ }
+
+ /**
+ * Sets the sequence member, which defines the behavior for generating
+ * primary key values in new rows.
+ * - If this is a string, then the string names the sequence object.
+ * - If this is boolean true, then the key uses an auto-incrementing
+ * or identity mechanism.
+ * - If this is boolean false, then the key is user-defined.
+ * Use this for natural keys, for example.
+ *
+ * @param mixed $sequence
+ * @return Zend_Db_Table_Adapter_Abstract Provides a fluent interface
+ */
+ protected function _setSequence($sequence)
+ {
+ $this->_sequence = $sequence;
+
+ return $this;
+ }
+
+ /**
+ * Turnkey for initialization of a table object.
+ * Calls other protected methods for individual tasks, to make it easier
+ * for a subclass to override part of the setup logic.
+ *
+ * @return void
+ */
+ protected function _setup()
+ {
+ $this->_setupDatabaseAdapter();
+ $this->_setupTableName();
+ $this->_setupMetadata();
+ $this->_setupPrimaryKey();
+ }
+
+ /**
+ * Initialize database adapter.
+ *
+ * @return void
+ */
+ protected function _setupDatabaseAdapter()
+ {
+ if (! $this->_db) {
+ $this->_db = self::getDefaultAdapter();
+ }
+ }
+
+ /**
+ * Initialize table and schema names.
+ *
+ * If the table name is not set in the class definition,
+ * use the class name itself as the table name.
+ *
+ * A schema name provided with the table name (e.g., "schema.table") overrides
+ * any existing value for $this->_schema.
+ *
+ * @return void
+ */
+ protected function _setupTableName()
+ {
+ if (! $this->_name) {
+ $this->_name = get_class($this);
+ } else if (strpos($this->_name, '.')) {
+ list($this->_schema, $this->_name) = explode('.', $this->_name);
+ }
+ }
+
+ /**
+ * Initializes metadata.
+ *
+ * If metadata cannot be loaded from cache, adapter's describeTable() method is called to discover metadata
+ * information. Returns true if and only if the metadata are loaded from cache.
+ *
+ * @return boolean
+ * @throws Zend_Db_Table_Exception
+ */
+ protected function _setupMetadata()
+ {
+ // Assume that metadata will be loaded from cache
+ $isMetadataFromCache = true;
+
+ // If $this has no metadata cache but the class has a default metadata cache
+ if (null === $this->_metadataCache && null !== self::$_defaultMetadataCache) {
+ // Make $this use the default metadata cache of the class
+ $this->_setMetadataCache(self::$_defaultMetadataCache);
+ }
+
+ // If $this has a metadata cache
+ if (null !== $this->_metadataCache) {
+ // Define the cache identifier where the metadata are saved
+ $cacheId = md5("$this->_schema.$this->_name");
+ }
+
+ // If $this has no metadata cache or metadata cache misses
+ if (null === $this->_metadataCache || !($metadata = $this->_metadataCache->load($cacheId))) {
+ // Metadata are not loaded from cache
+ $isMetadataFromCache = false;
+ // Fetch metadata from the adapter's describeTable() method
+ $metadata = $this->_db->describeTable($this->_name, $this->_schema);
+ // If $this has a metadata cache, then cache the metadata
+ if (null !== $this->_metadataCache && !$this->_metadataCache->save($metadata, $cacheId)) {
+ /**
+ * @see Zend_Db_Table_Exception
+ */
+ require_once 'Zend/Db/Table/Exception.php';
+ throw new Zend_Db_Table_Exception('Failed saving metadata to metadataCache');
+ }
+ }
+
+ // Assign the metadata to $this
+ $this->_metadata = $metadata;
+
+ // Update the columns
+ $this->_cols = array_keys($this->_metadata);
+
+ // Return whether the metadata were loaded from cache
+ return $isMetadataFromCache;
+ }
+
+ /**
+ * Initialize primary key from metadata.
+ * If $_primary is not defined, discover primary keys
+ * from the information returned by describeTable().
+ *
+ * @return void
+ * @throws Zend_Db_Table_Exception
+ */
+ protected function _setupPrimaryKey()
+ {
+ if (!$this->_primary) {
+ $this->_primary = array();
+ foreach ($this->_metadata as $col) {
+ if ($col['PRIMARY']) {
+ $this->_primary[ $col['PRIMARY_POSITION'] ] = $col['COLUMN_NAME'];
+ if ($col['IDENTITY']) {
+ $this->_identity = $col['PRIMARY_POSITION'];
+ }
+ }
+ }
+ // if no primary key was specified and none was found in the metadata
+ // then throw an exception.
+ if (empty($this->_primary)) {
+ require_once 'Zend/Db/Table/Exception.php';
+ throw new Zend_Db_Table_Exception('A table must have a primary key, but none was found');
+ }
+ } else if (!is_array($this->_primary)) {
+ $this->_primary = array(1 => $this->_primary);
+ } else if (isset($this->_primary[0])) {
+ array_unshift($this->_primary, null);
+ unset($this->_primary[0]);
+ }
+
+ if (! array_intersect((array) $this->_primary, $this->_cols) == (array) $this->_primary) {
+ require_once 'Zend/Db/Table/Exception.php';
+ throw new Zend_Db_Table_Exception("Primary key column(s) ("
+ . implode(',', (array) $this->_primary)
+ . ") are not columns in this table ("
+ . implode(',', $this->_cols)
+ . ")");
+ }
+
+ $primary = (array) $this->_primary;
+ $pkIdentity = $primary[(int) $this->_identity];
+
+ /**
+ * Special case for PostgreSQL: a SERIAL key implicitly uses a sequence
+ * object whose name is "<table>_<column>_seq".
+ */
+ if ($this->_sequence === true && $this->_db instanceof Zend_Db_Adapter_Pdo_Pgsql) {
+ $this->_sequence = "{$this->_name}_{$pkIdentity}_seq";
+ }
+ }
+
+ /**
+ * Returns a normalized version of the reference map
+ *
+ * @return array
+ */
+ protected function _getReferenceMapNormalized()
+ {
+ $referenceMapNormalized = array();
+
+ foreach ($this->_referenceMap as $rule => $map) {
+
+ $referenceMapNormalized[$rule] = array();
+
+ foreach ($map as $key => $value) {
+ switch ($key) {
+
+ // normalize COLUMNS and REF_COLUMNS to arrays
+ case self::COLUMNS:
+ case self::REF_COLUMNS:
+ if (!is_array($value)) {
+ $referenceMapNormalized[$rule][$key] = array($value);
+ } else {
+ $referenceMapNormalized[$rule][$key] = $value;
+ }
+ break;
+
+ // other values are copied as-is
+ default:
+ $referenceMapNormalized[$rule][$key] = $value;
+ break;
+ }
+ }
+ }
+
+ return $referenceMapNormalized;
+ }
+
+ /**
+ * Returns table information.
+ *
+ * @return array
+ */
+ public function info()
+ {
+ return array(
+ self::SCHEMA => $this->_schema,
+ self::NAME => $this->_name,
+ self::COLS => (array) $this->_cols,
+ self::PRIMARY => (array) $this->_primary,
+ self::METADATA => $this->_metadata,
+ self::ROW_CLASS => $this->_rowClass,
+ self::ROWSET_CLASS => $this->_rowsetClass,
+ self::REFERENCE_MAP => $this->_referenceMap,
+ self::DEPENDENT_TABLES => $this->_dependentTables,
+ self::SEQUENCE => $this->_sequence
+ );
+ }
+
+ /**
+ * Inserts a new row.
+ *
+ * @param array $data Column-value pairs.
+ * @return mixed The primary key of the row inserted.
+ */
+ public function insert(array $data)
+ {
+ /**
+ * Zend_Db_Table assumes that if you have a compound primary key
+ * and one of the columns in the key uses a sequence,
+ * it's the _first_ column in the compound key.
+ */
+ $primary = (array) $this->_primary;
+ $pkIdentity = $primary[(int)$this->_identity];
+
+ /**
+ * If this table uses a database sequence object and the data does not
+ * specify a value, then get the next ID from the sequence and add it
+ * to the row. We assume that only the first column in a compound
+ * primary key takes a value from a sequence.
+ */
+ if (is_string($this->_sequence) && !isset($data[$pkIdentity])) {
+ $data[$pkIdentity] = $this->_db->nextSequenceId($this->_sequence);
+ }
+
+ /**
+ * INSERT the new row.
+ */
+ $this->_db->insert($this->_name, $data);
+
+ if (isset($data[$pkIdentity])) {
+ /**
+ * Return the primary key value or array of values(s) if the
+ * primary key is compound. This handles the case of natural keys
+ * and sequence-driven keys. This also covers the case of
+ * auto-increment keys when the user specifies a value, thus
+ * overriding the auto-increment logic.
+ */
+ $pkData = array_intersect_key($data, array_flip($primary));
+ if (count($primary) == 1) {
+ return current($pkData);
+ } else {
+ return $pkData;
+ }
+ }
+
+ if ($this->_sequence === true) {
+ /**
+ * Return the most recent ID generated by an auto-increment
+ * or IDENTITY column.
+ */
+ return $this->_db->lastInsertId();
+ }
+
+ /**
+ * The last case: the user did not specify a value for the primary
+ * key, nor is this table class declared to use an auto-increment key.
+ * Since the insert did not fail, we can assume this is one of the edge
+ * cases, which may include:
+ * - the table has no primary key defined;
+ * - the database table uses a trigger to set a primary key value;
+ * - the RDBMS permits primary keys to be NULL or have a value set
+ * to the column's DEFAULT
+ */
+ return null;
+ }
+
+ /**
+ * Updates existing rows.
+ *
+ * @param array $data Column-value pairs.
+ * @param array|string $where An SQL WHERE clause, or an array of SQL WHERE clauses.
+ * @return int The number of rows updated.
+ */
+ public function update(array $data, $where)
+ {
+ return $this->_db->update($this->_name, $data, $where);
+ }
+
+ /**
+ * Called by a row object for the parent table's class during save() method.
+ *
+ * @param string $parentTableClassname
+ * @param array $oldPrimaryKey
+ * @param array $newPrimaryKey
+ * @return int
+ */
+ public function _cascadeUpdate($parentTableClassname, array $oldPrimaryKey, array $newPrimaryKey)
+ {
+ $rowsAffected = 0;
+ foreach ($this->_getReferenceMapNormalized() as $rule => $map) {
+ if ($map[self::REF_TABLE_CLASS] == $parentTableClassname && isset($map[self::ON_UPDATE])) {
+ switch ($map[self::ON_UPDATE]) {
+ case self::CASCADE:
+ $newRefs = array();
+ for ($i = 0; $i < count($map[self::COLUMNS]); ++$i) {
+ $col = $this->_db->foldCase($map[self::COLUMNS][$i]);
+ $refCol = $this->_db->foldCase($map[self::REF_COLUMNS][$i]);
+ if (array_key_exists($refCol, $newPrimaryKey)) {
+ $newRefs[$col] = $newPrimaryKey[$refCol];
+ }
+ $where[] = $this->_db->quoteInto(
+ $this->_db->quoteIdentifier($col, true) . ' = ?',
+ $oldPrimaryKey[$refCol]
+ );
+ }
+ $rowsAffected += $this->update($newRefs, $where);
+ break;
+ default:
+ // no action
+ break;
+ }
+ }
+ }
+ return $rowsAffected;
+ }
+
+ /**
+ * Deletes existing rows.
+ *
+ * @param array|string $where SQL WHERE clause(s).
+ * @return int The number of rows deleted.
+ */
+ public function delete($where)
+ {
+ return $this->_db->delete($this->_name, $where);
+ }
+
+ /**
+ * Called by parent table's class during delete() method.
+ *
+ * @param string $parentTableClassname
+ * @param array $primaryKey
+ * @return int Number of affected rows
+ */
+ public function _cascadeDelete($parentTableClassname, array $primaryKey)
+ {
+ $rowsAffected = 0;
+ foreach ($this->_getReferenceMapNormalized() as $rule => $map) {
+ if ($map[self::REF_TABLE_CLASS] == $parentTableClassname && isset($map[self::ON_DELETE])) {
+ switch ($map[self::ON_DELETE]) {
+ case self::CASCADE:
+ for ($i = 0; $i < count($map[self::COLUMNS]); ++$i) {
+ $col = $this->_db->foldCase($map[self::COLUMNS][$i]);
+ $refCol = $this->_db->foldCase($map[self::REF_COLUMNS][$i]);
+ $where[] = $this->_db->quoteInto(
+ $this->_db->quoteIdentifier($col, true) . ' = ?',
+ $primaryKey[$refCol]
+ );
+ }
+ $rowsAffected += $this->delete($where);
+ break;
+ default:
+ // no action
+ break;
+ }
+ }
+ }
+ return $rowsAffected;
+ }
+
+ /**
+ * Fetches rows by primary key.
+ * The arguments specify the primary key values.
+ * If the table has a multi-column primary key, you must
+ * pass as many arguments as the count of column in the
+ * primary key.
+ *
+ * To find multiple rows by primary key, the argument
+ * should be an array. If the table has a multi-column
+ * primary key, all arguments must be arrays with the
+ * same number of elements.
+ *
+ * The find() method always returns a Rowset object,
+ * even if only one row was found.
+ *
+ * @param mixed The value(s) of the primary key.
+ * @return Zend_Db_Table_Rowset_Abstract Row(s) matching the criteria.
+ * @throws Zend_Db_Table_Exception
+ */
+ public function find()
+ {
+ $args = func_get_args();
+ $keyNames = array_values((array) $this->_primary);
+
+ if (empty($args)) {
+ require_once 'Zend/Db/Table/Exception.php';
+ throw new Zend_Db_Table_Exception("No value(s) specified for the primary key");
+ }
+
+ if (count($args) != count($keyNames)) {
+ require_once 'Zend/Db/Table/Exception.php';
+ throw new Zend_Db_Table_Exception("Missing value(s) for the primary key");
+ }
+
+ $whereList = array();
+ $numberTerms = 0;
+ foreach ($args as $keyPosition => $keyValues) {
+ // Coerce the values to an array.
+ // Don't simply typecast to array, because the values
+ // might be Zend_Db_Expr objects.
+ if (!is_array($keyValues)) {
+ $keyValues = array($keyValues);
+ }
+ if ($numberTerms == 0) {
+ $numberTerms = count($keyValues);
+ } else if (count($keyValues) != $numberTerms) {
+ require_once 'Zend/Db/Table/Exception.php';
+ throw new Zend_Db_Table_Exception("Missing value(s) for the primary key");
+ }
+ for ($i = 0; $i < count($keyValues); ++$i) {
+ $whereList[$i][$keyPosition] = $keyValues[$i];
+ }
+ }
+
+ $whereClause = null;
+ if (count($whereList)) {
+ $whereOrTerms = array();
+ foreach ($whereList as $keyValueSets) {
+ $whereAndTerms = array();
+ foreach ($keyValueSets as $keyPosition => $keyValue) {
+ $whereAndTerms[] = $this->_db->quoteInto(
+ $this->_db->quoteIdentifier($keyNames[$keyPosition], true) . ' = ?',
+ $keyValue
+ );
+ }
+ $whereOrTerms[] = '(' . implode(' AND ', $whereAndTerms) . ')';
+ }
+ $whereClause = '(' . implode(' OR ', $whereOrTerms) . ')';
+ }
+
+ return $this->fetchAll($whereClause);
+ }
+
+ /**
+ * Fetches all rows.
+ *
+ * Honors the Zend_Db_Adapter fetch mode.
+ *
+ * @param string|array $where OPTIONAL An SQL WHERE clause.
+ * @param string|array $order OPTIONAL An SQL ORDER clause.
+ * @param int $count OPTIONAL An SQL LIMIT count.
+ * @param int $offset OPTIONAL An SQL LIMIT offset.
+ * @return Zend_Db_Table_Rowset_Abstract The row results per the Zend_Db_Adapter fetch mode.
+ */
+ public function fetchAll($where = null, $order = null, $count = null, $offset = null)
+ {
+ $data = array(
+ 'table' => $this,
+ 'data' => $this->_fetch($where, $order, $count, $offset),
+ 'rowClass' => $this->_rowClass,
+ 'stored' => true
+ );
+
+ Zend_Loader::loadClass($this->_rowsetClass);
+ return new $this->_rowsetClass($data);
+ }
+
+ /**
+ * Fetches one row in an object of type Zend_Db_Table_Row_Abstract,
+ * or returns Boolean false if no row matches the specified criteria.
+ *
+ * @param string|array $where OPTIONAL An SQL WHERE clause.
+ * @param string|array $order OPTIONAL An SQL ORDER clause.
+ * @return Zend_Db_Table_Row_Abstract The row results per the
+ * Zend_Db_Adapter fetch mode, or null if no row found.
+ */
+ public function fetchRow($where = null, $order = null)
+ {
+ $keys = array_values((array) $this->_primary);
+ $vals = array_fill(0, count($keys), null);
+ $primary = array_combine($keys, $vals);
+
+ $rows = $this->_fetch($where, $order, 1);
+
+ if (count($rows) == 0) {
+ return null;
+ }
+
+ $data = array(
+ 'table' => $this,
+ 'data' => $rows[0],
+ 'stored' => true
+ );
+
+ Zend_Loader::loadClass($this->_rowClass);
+ return new $this->_rowClass($data);
+ }
+
+ /**
+ * Fetches a new blank row (not from the database).
+ *
+ * @return Zend_Db_Table_Row_Abstract
+ * @deprecated since 0.9.3 - use createRow() instead.
+ */
+ public function fetchNew()
+ {
+ return $this->createRow();
+ }
+
+ /**
+ * Fetches a new blank row (not from the database).
+ *
+ * @param array $data OPTIONAL data to populate in the new row.
+ * @return Zend_Db_Table_Row_Abstract
+ */
+ public function createRow(array $data = array())
+ {
+ $defaults = array_combine($this->_cols, array_fill(0, count($this->_cols), null));
+ $keys = array_flip($this->_cols);
+ $data = array_intersect_key($data, $keys);
+ $data = array_merge($defaults, $data);
+
+ /**
+ * If the primary key can be generated automatically, and no value was
+ * specified in the user-supplied data, then omit it from the tuple.
+ */
+ $primary = (array) $this->_primary;
+ $pkIdentity = $primary[(int)$this->_identity];
+ if ($data[$pkIdentity] === null) {
+ unset($data[$pkIdentity]);
+ }
+
+ $config = array(
+ 'table' => $this,
+ 'data' => $data,
+ 'stored' => false
+ );
+
+ Zend_Loader::loadClass($this->_rowClass);
+ return new $this->_rowClass($config);
+ }
+
+ /**
+ * Support method for fetching rows.
+ *
+ * @param string|array $where OPTIONAL An SQL WHERE clause.
+ * @param string|array $order OPTIONAL An SQL ORDER clause.
+ * @param int $count OPTIONAL An SQL LIMIT count.
+ * @param int $offset OPTIONAL An SQL LIMIT offset.
+ * @return array The row results, in FETCH_ASSOC mode.
+ */
+ protected function _fetch($where = null, $order = null, $count = null, $offset = null)
+ {
+ // selection tool
+ $select = $this->_db->select();
+
+ // the FROM clause
+ $select->from($this->_name, $this->_cols, $this->_schema);
+
+ // the WHERE clause
+ $where = (array) $where;
+ foreach ($where as $key => $val) {
+ // is $key an int?
+ if (is_int($key)) {
+ // $val is the full condition
+ $select->where($val);
+ } else {
+ // $key is the condition with placeholder,
+ // and $val is quoted into the condition
+ $select->where($key, $val);
+ }
+ }
+
+ // the ORDER clause
+ if (!is_array($order)) {
+ $order = array($order);
+ }
+ foreach ($order as $val) {
+ $select->order($val);
+ }
+
+ // the LIMIT clause
+ $select->limit($count, $offset);
+
+ // return the results
+ $stmt = $this->_db->query($select);
+ $data = $stmt->fetchAll(Zend_Db::FETCH_ASSOC);
+ return $data;
+ }
+
+}
diff --git a/libs/Zend/Db/Table/Exception.php b/libs/Zend/Db/Table/Exception.php
new file mode 100755
index 0000000000..8010f09b3a
--- /dev/null
+++ b/libs/Zend/Db/Table/Exception.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Db_Exception
+ */
+require_once 'Zend/Db/Exception.php';
+
+/**
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Table_Exception extends Zend_Db_Exception
+{
+}
+
diff --git a/libs/Zend/Db/Table/Row.php b/libs/Zend/Db/Table/Row.php
new file mode 100755
index 0000000000..f7ceaa02e3
--- /dev/null
+++ b/libs/Zend/Db/Table/Row.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Row.php 4527 2007-04-17 22:49:14Z darby $
+ */
+
+
+/**
+ * @see Zend_Db_Table_Row_Abstract
+ */
+require_once 'Zend/Db/Table/Row/Abstract.php';
+
+
+/**
+ * Reference concrete class that extends Zend_Db_Table_Row_Abstract.
+ * Developers may also create their own classes that extend the abstract class.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Table_Row extends Zend_Db_Table_Row_Abstract
+{
+}
diff --git a/libs/Zend/Db/Table/Row/Abstract.php b/libs/Zend/Db/Table/Row/Abstract.php
new file mode 100755
index 0000000000..c2f42fbca9
--- /dev/null
+++ b/libs/Zend/Db/Table/Row/Abstract.php
@@ -0,0 +1,903 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Abstract.php 5486 2007-06-28 22:53:25Z bkarwin $
+ */
+
+/**
+ * @see Zend_Db
+ */
+require_once 'Zend/Db.php';
+
+/**
+ * @see Zend_Loader
+ */
+require_once 'Zend/Loader.php';
+
+/**
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Db_Table_Row_Abstract
+{
+
+ /**
+ * The data for each column in the row (column_name => value).
+ * The keys must match the physical names of columns in the
+ * table for which this row is defined.
+ *
+ * @var array
+ */
+ protected $_data = array();
+
+ /**
+ * This is set to a copy of $_data when the data is fetched from
+ * a database, specified as a new tuple in the constructor, or
+ * when dirty data is posted to the database with save().
+ *
+ * @var array
+ */
+ protected $_cleanData = array();
+
+ /**
+ * Zend_Db_Table_Abstract parent class or instance.
+ *
+ * @var Zend_Db_Table_Abstract
+ */
+ protected $_table = null;
+
+ /**
+ * Connected is true if we have a reference to a live
+ * Zend_Db_Table_Abstract object.
+ * This is false after the Rowset has been deserialized.
+ *
+ * @var boolean
+ */
+ protected $_connected = true;
+
+ /**
+ * Name of the class of the Zend_Db_Table_Abstract object.
+ *
+ * @var string
+ */
+ protected $_tableClass = null;
+
+ /**
+ * Primary row key(s).
+ *
+ * @var array
+ */
+ protected $_primary;
+
+ /**
+ * Constructor.
+ *
+ * Supported params for $config are:-
+ * - table = class name or object of type Zend_Db_Table_Abstract
+ * - data = values of columns in this row.
+ *
+ * @param array $config OPTIONAL Array of user-specified config options.
+ * @return void
+ * @throws Zend_Db_Table_Row_Exception
+ */
+ public function __construct(array $config = array())
+ {
+ if (isset($config['table']) && $config['table'] instanceof Zend_Db_Table_Abstract) {
+ $this->_table = $config['table'];
+ $this->_tableClass = get_class($this->_table);
+ }
+
+ if (isset($config['data'])) {
+ if (!is_array($config['data'])) {
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception('Data must be an array');
+ }
+ $this->_data = $config['data'];
+ }
+ if (isset($config['stored']) && $config['stored'] === true) {
+ $this->_cleanData = $this->_data;
+ }
+
+ // Retrieve primary keys from table schema
+ if ($table = $this->_getTable()) {
+ $info = $table->info();
+ $this->_primary = (array) $info['primary'];
+ }
+ }
+
+ /**
+ * Transform a column name from the user-specified form
+ * to the physical form used in the database.
+ * You can override this method in a custom Row class
+ * to implement column name mappings, for example inflection.
+ *
+ * @param string $columnName Column name given.
+ * @return string The column name after transformation applied (none by default).
+ * @throws Zend_Db_Table_Row_Exception if the $columnName is not a string.
+ */
+ protected function _transformColumn($columnName)
+ {
+ if (!is_string($columnName)) {
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception('Specified column is not a string');
+ }
+ // Perform no transformation by default
+ return $columnName;
+ }
+
+ /**
+ * Retrieve row field value
+ *
+ * @param string $columnName The user-specified column name.
+ * @return string The corresponding column value.
+ * @throws Zend_Db_Table_Row_Exception if the $columnName is not a column in the row.
+ */
+ public function __get($columnName)
+ {
+ $columnName = $this->_transformColumn($columnName);
+ if (!array_key_exists($columnName, $this->_data)) {
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception("Specified column \"$columnName\" is not in the row");
+ }
+ return $this->_data[$columnName];
+ }
+
+ /**
+ * Set row field value
+ *
+ * @param string $columnName The column key.
+ * @param mixed $value The value for the property.
+ * @return void
+ * @throws Zend_Db_Table_Row_Exception
+ */
+ public function __set($columnName, $value)
+ {
+ $columnName = $this->_transformColumn($columnName);
+ if (!array_key_exists($columnName, $this->_data)) {
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception("Specified column \"$columnName\" is not in the row");
+ }
+ $this->_data[$columnName] = $value;
+ }
+
+ /**
+ * Test existence of row field
+ *
+ * @param string $columnName The column key.
+ * @return boolean
+ */
+ public function __isset($columnName)
+ {
+ $columnName = $this->_transformColumn($columnName);
+ return array_key_exists($columnName, $this->_data);
+ }
+
+ /**
+ * Store table, primary key and data in serialized object
+ *
+ * @return array
+ */
+ public function __sleep()
+ {
+ return array('_tableClass', '_primary', '_data', '_cleanData');
+ }
+
+ /**
+ * Setup to do on wakeup.
+ * A de-serialized Row should not be assumed to have access to a live
+ * database connection, so set _connected = false.
+ *
+ * @return void
+ */
+ public function __wakeup()
+ {
+ $this->_connected = false;
+ }
+
+ /**
+ * Returns the table object, or null if this is disconnected row
+ *
+ * @return Zend_Db_Table_Abstract|null
+ */
+ public function getTable()
+ {
+ return $this->_table;
+ }
+
+ /**
+ * Set the table object, to re-establish a live connection
+ * to the database for a Row that has been de-serialized.
+ *
+ * @param Zend_Db_Table_Abstract $table
+ * @return boolean
+ * @throws Zend_Db_Table_Row_Exception
+ */
+ public function setTable(Zend_Db_Table_Abstract $table)
+ {
+ if ($table == null) {
+ $this->_table = null;
+ $this->_connected = false;
+ return false;
+ }
+
+ $tableClass = get_class($table);
+ if (! $table instanceof $this->_tableClass) {
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception("The specified Table is of class $tableClass, expecting class to be instance of $this->_tableClass");
+ }
+
+ $this->_table = $table;
+ $this->_tableClass = $tableClass;
+
+ $info = $this->_table->info();
+
+ if ($info['cols'] != array_keys($this->_data)) {
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception('The specified Table does not have the same columns as the Row');
+ }
+
+ if (! array_intersect((array) $this->_primary, $info['primary']) == (array) $this->_primary) {
+
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception("The specified Table '$tableClass' does not have the same primary key as the Row");
+ }
+
+ $this->_connected = true;
+ return true;
+ }
+
+ /**
+ * Query the class name of the Table object for which this
+ * Row was created.
+ *
+ * @return string
+ */
+ public function getTableClass()
+ {
+ return $this->_tableClass;
+ }
+
+ /**
+ * Saves the properties to the database.
+ *
+ * This performs an intelligent insert/update, and reloads the
+ * properties with fresh data from the table on success.
+ *
+ * @return mixed The primary key value(s), as an associative array if the
+ * key is compound, or a scalar if the key is single-column.
+ */
+ public function save()
+ {
+ /**
+ * If the _cleanData array is empty,
+ * this is an INSERT of a new row.
+ * Otherwise it is an UPDATE.
+ */
+ if (empty($this->_cleanData)) {
+ return $this->_doInsert();
+ } else {
+ return $this->_doUpdate();
+ }
+ }
+
+ /**
+ * @return mixed The primary key value(s), as an associative array if the
+ * key is compound, or a scalar if the key is single-column.
+ */
+ protected function _doInsert()
+ {
+ /**
+ * Run pre-INSERT logic
+ */
+ $this->_insert();
+
+ /**
+ * Execute the INSERT (this may throw an exception)
+ */
+ $primaryKey = $this->_getTable()->insert($this->_data);
+
+ /**
+ * Normalize the result to an array indexed by primary key column(s).
+ * The table insert() method may return a scalar.
+ */
+ if (is_array($primaryKey)) {
+ $newPrimaryKey = $primaryKey;
+ } else {
+ $newPrimaryKey = array(current((array)$this->_primary) => $primaryKey);
+ }
+
+ /**
+ * Save the new primary key value in _data. The primary key may have
+ * been generated by a sequence or auto-increment mechanism, and this
+ * merge should be done before the _postInsert() method is run, so the
+ * new values are available for logging, etc.
+ */
+ $this->_data = array_merge($this->_data, $newPrimaryKey);
+
+ /**
+ * Run post-INSERT logic
+ */
+ $this->_postInsert();
+
+ /**
+ * Update the _cleanData to reflect that the data has been inserted.
+ */
+ $this->_refresh();
+
+ return $primaryKey;
+ }
+
+ /**
+ * @return mixed The primary key value(s), as an associative array if the
+ * key is compound, or a scalar if the key is single-column.
+ */
+ protected function _doUpdate()
+ {
+ /**
+ * Get expressions for a WHERE clause
+ * based on the primary key value(s).
+ */
+ $where = $this->_getWhereQuery(false);
+
+ /**
+ * Run pre-UPDATE logic
+ */
+ $this->_update();
+
+ /**
+ * Compare the data to the clean data to discover
+ * which columns have been changed.
+ */
+ $diffData = array_diff_assoc($this->_data, $this->_cleanData);
+
+ /**
+ * Were any of the changed columns part of the primary key?
+ */
+ $pkDiffData = array_intersect_key($diffData, array_flip((array)$this->_primary));
+
+ /**
+ * Execute cascading updates against dependent tables.
+ * Do this only if primary key value(s) were changed.
+ */
+ if (count($pkDiffData) > 0) {
+ $depTables = $this->_getTable()->getDependentTables();
+ if (!empty($depTables)) {
+ $db = $this->_getTable()->getAdapter();
+ $pkNew = $this->_getPrimaryKey(true);
+ $pkOld = $this->_getPrimaryKey(false);
+ $thisClass = get_class($this);
+ foreach ($depTables as $tableClass) {
+ try {
+ Zend_Loader::loadClass($tableClass);
+ } catch (Zend_Exception $e) {
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception($e->getMessage());
+ }
+ $t = new $tableClass(array('db' => $db));
+ $t->_cascadeUpdate($this->getTableClass(), $pkOld, $pkNew);
+ }
+ }
+ }
+
+ /**
+ * Execute the UPDATE (this may throw an exception)
+ * Do this only if data values were changed.
+ * Use the $diffData variable, so the UPDATE statement
+ * includes SET terms only for data values that changed.
+ */
+ $result = 0;
+ if (count($diffData) > 0) {
+ $result = $this->_getTable()->update($diffData, $where);
+ }
+
+ /**
+ * Run post-UPDATE logic. Do this before the _refresh()
+ * so the _postUpdate() function can tell the difference
+ * between changed data and clean (pre-changed) data.
+ */
+ $this->_postUpdate();
+
+ /**
+ * Refresh the data just in case triggers in the RDBMS changed
+ * any columns. Also this resets the _cleanData.
+ */
+ $this->_refresh();
+
+ /**
+ * Return the primary key value(s) as an array
+ * if the key is compound or a scalar if the key
+ * is a scalar.
+ */
+ $primaryKey = $this->_getPrimaryKey(true);
+ if (count($primaryKey) == 1) {
+ return current($primaryKey);
+ } else {
+ return $primaryKey;
+ }
+ }
+
+ /**
+ * Deletes existing rows.
+ *
+ * @return int The number of rows deleted.
+ */
+ public function delete()
+ {
+ $where = $this->_getWhereQuery();
+
+ /**
+ * Execute pre-DELETE logic
+ */
+ $this->_delete();
+
+ /**
+ * Execute cascading deletes against dependent tables
+ */
+ $depTables = $this->_getTable()->getDependentTables();
+ if (!empty($depTables)) {
+ $db = $this->_getTable()->getAdapter();
+ $pk = $this->_getPrimaryKey();
+ $thisClass = get_class($this);
+ foreach ($depTables as $tableClass) {
+ try {
+ Zend_Loader::loadClass($tableClass);
+ } catch (Zend_Exception $e) {
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception($e->getMessage());
+ }
+ $t = new $tableClass(array('db' => $db));
+ $t->_cascadeDelete($this->getTableClass(), $pk);
+ }
+ }
+
+ /**
+ * Execute the DELETE (this may throw an exception)
+ */
+ $result = $this->_getTable()->delete($where);
+
+ /**
+ * Execute post-DELETE logic
+ */
+ $this->_postDelete();
+
+ /**
+ * Reset all fields to null to indicate that the row is not there
+ */
+ $this->_data = array_combine(
+ array_keys($this->_data),
+ array_fill(0, count($this->_data), null)
+ );
+
+ return $result;
+ }
+
+ /**
+ * Returns the column/value data as an array.
+ *
+ * @return array
+ */
+ public function toArray()
+ {
+ return $this->_data;
+ }
+
+ /**
+ * Sets all data in the row from an array.
+ *
+ * @param array $data
+ * @return Zend_Db_Table_Row_Abstract Provides a fluent interface
+ */
+ public function setFromArray(array $data)
+ {
+ foreach ($data as $columnName => $value) {
+ $this->$columnName = $value;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Retrieves an instance of the parent table.
+ *
+ * @return Zend_Db_Table_Abstract
+ */
+ protected function _getTable()
+ {
+ if (!$this->_connected) {
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception('Cannot save a Row unless it is connected');
+ }
+ return $this->_table;
+ }
+
+ /**
+ * Retrieves an associative array of primary keys.
+ *
+ * @param bool $dirty
+ * @return array
+ */
+ protected function _getPrimaryKey($dirty = true)
+ {
+ $primary = array_flip($this->_primary);
+ if ($dirty) {
+ return array_intersect_key($this->_data, $primary);
+ } else {
+ return array_intersect_key($this->_cleanData, $primary);
+ }
+ }
+
+ /**
+ * Constructs where statement for retrieving row(s).
+ *
+ * @return array
+ */
+ protected function _getWhereQuery($dirty = true)
+ {
+ $where = array();
+ $db = $this->_getTable()->getAdapter();
+ $primaryKey = $this->_getPrimaryKey($dirty);
+
+ // retrieve recently updated row using primary keys
+ foreach ($primaryKey as $columnName => $val) {
+ $where[] = $db->quoteInto($db->quoteIdentifier($columnName, true) . ' = ?', $val);
+ }
+
+ return $where;
+ }
+
+ /**
+ * Refreshes properties from the database.
+ *
+ * @return void
+ */
+ protected function _refresh()
+ {
+ $where = $this->_getWhereQuery();
+ $row = $this->_getTable()->fetchRow($where);
+
+ if (null === $row) {
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception('Cannot refresh row as parent is missing');
+ }
+
+ $this->_data = $row->toArray();
+ $this->_cleanData = $this->_data;
+ }
+
+ /**
+ * Allows pre-insert logic to be applied to row.
+ * Subclasses may override this method.
+ *
+ * @return void
+ */
+ protected function _insert()
+ {
+ }
+
+ /**
+ * Allows post-insert logic to be applied to row.
+ * Subclasses may override this method.
+ *
+ * @return void
+ */
+ protected function _postInsert()
+ {
+ }
+
+ /**
+ * Allows pre-update logic to be applied to row.
+ * Subclasses may override this method.
+ *
+ * @return void
+ */
+ protected function _update()
+ {
+ }
+
+ /**
+ * Allows post-update logic to be applied to row.
+ * Subclasses may override this method.
+ *
+ * @return void
+ */
+ protected function _postUpdate()
+ {
+ }
+
+ /**
+ * Allows pre-delete logic to be applied to row.
+ * Subclasses may override this method.
+ *
+ * @return void
+ */
+ protected function _delete()
+ {
+ }
+
+ /**
+ * Allows post-delete logic to be applied to row.
+ * Subclasses may override this method.
+ *
+ * @return void
+ */
+ protected function _postDelete()
+ {
+ }
+
+ /**
+ * Prepares a table reference for lookup.
+ *
+ * Ensures all reference keys are set and properly formatted.
+ *
+ * @param Zend_Db_Table_Abstract $dependentTable
+ * @param Zend_Db_Table_Abstract $parentTable
+ * @param string $ruleKey
+ * @return array
+ */
+ protected function _prepareReference(Zend_Db_Table_Abstract $dependentTable, Zend_Db_Table_Abstract $parentTable, $ruleKey)
+ {
+ $map = $dependentTable->getReference(get_class($parentTable), $ruleKey);
+
+ if (!is_array($map[Zend_Db_Table_Abstract::COLUMNS])) {
+ $map[Zend_Db_Table_Abstract::COLUMNS] = (array) $map[Zend_Db_Table_Abstract::COLUMNS];
+ }
+
+ if (!isset($map[Zend_Db_Table_Abstract::REF_COLUMNS])) {
+ $parentInfo = $parentTable->info();
+ $map[Zend_Db_Table_Abstract::REF_COLUMNS] = (array) $parentInfo['primary'];
+ }
+
+ if (!is_array($map[Zend_Db_Table_Abstract::REF_COLUMNS])) {
+ $map[Zend_Db_Table_Abstract::REF_COLUMNS] = (array) $map[Zend_Db_Table_Abstract::REF_COLUMNS];
+ }
+
+ return $map;
+ }
+
+ /**
+ * Query a dependent table to retrieve rows matching the current row.
+ *
+ * @param string|Zend_Db_Table_Abstract $dependentTable
+ * @param string OPTIONAL $ruleKey
+ * @return Zend_Db_Table_Rowset_Abstract Query result from $dependentTable
+ * @throws Zend_Db_Table_Row_Exception If $dependentTable is not a table or is not loadable.
+ */
+ public function findDependentRowset($dependentTable, $ruleKey = null)
+ {
+ $db = $this->_getTable()->getAdapter();
+
+ if (is_string($dependentTable)) {
+ try {
+ Zend_Loader::loadClass($dependentTable);
+ } catch (Zend_Exception $e) {
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception($e->getMessage());
+ }
+ $dependentTable = new $dependentTable(array('db' => $db));
+ }
+ if (! $dependentTable instanceof Zend_Db_Table_Abstract) {
+ $type = gettype($dependentTable);
+ if ($type == 'object') {
+ $type = get_class($dependentTable);
+ }
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception("Dependent table must be a Zend_Db_Table_Abstract, but it is $type");
+ }
+
+ $map = $this->_prepareReference($dependentTable, $this->_getTable(), $ruleKey);
+
+ for ($i = 0; $i < count($map[Zend_Db_Table_Abstract::COLUMNS]); ++$i) {
+ $cond = $db->quoteIdentifier($map[Zend_Db_Table_Abstract::COLUMNS][$i], true) . ' = ?';
+ $where[$cond] = $this->_data[$db->foldCase($map[Zend_Db_Table_Abstract::REF_COLUMNS][$i])];
+ }
+ return $dependentTable->fetchAll($where);
+ }
+
+ /**
+ * Query a parent table to retrieve the single row matching the current row.
+ *
+ * @param string|Zend_Db_Table_Abstract $parentTable
+ * @param string OPTIONAL $ruleKey
+ * @return Zend_Db_Table_Row_Abstract Query result from $parentTable
+ * @throws Zend_Db_Table_Row_Exception If $parentTable is not a table or is not loadable.
+ */
+ public function findParentRow($parentTable, $ruleKey = null)
+ {
+ $db = $this->_getTable()->getAdapter();
+
+ if (is_string($parentTable)) {
+ try {
+ Zend_Loader::loadClass($parentTable);
+ } catch (Zend_Exception $e) {
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception($e->getMessage());
+ }
+ $parentTable = new $parentTable(array('db' => $db));
+ }
+ if (! $parentTable instanceof Zend_Db_Table_Abstract) {
+ $type = gettype($parentTable);
+ if ($type == 'object') {
+ $type = get_class($parentTable);
+ }
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception("Parent table must be a Zend_Db_Table_Abstract, but it is $type");
+ }
+
+ $map = $this->_prepareReference($this->_getTable(), $parentTable, $ruleKey);
+
+ for ($i = 0; $i < count($map[Zend_Db_Table_Abstract::COLUMNS]); ++$i) {
+ $cond = $db->quoteIdentifier($map[Zend_Db_Table_Abstract::REF_COLUMNS][$i], true) . ' = ?';
+ $where[$cond] = $this->_data[$db->foldCase($map[Zend_Db_Table_Abstract::COLUMNS][$i])];
+ }
+ return $parentTable->fetchRow($where);
+ }
+
+ /**
+ * @param string|Zend_Db_Table_Abstract $matchTable
+ * @param string|Zend_Db_Table_Abstract $intersectionTable
+ * @param string OPTIONAL $primaryRefRule
+ * @param string OPTIONAL $matchRefRule
+ * @return Zend_Db_Table_Rowset_Abstract Query result from $matchTable
+ * @throws Zend_Db_Table_Row_Exception If $matchTable or $intersectionTable is not a table class or is not loadable.
+ */
+ public function findManyToManyRowset($matchTable, $intersectionTable, $callerRefRule = null, $matchRefRule = null)
+ {
+ $db = $this->_getTable()->getAdapter();
+
+ if (is_string($intersectionTable)) {
+ try {
+ Zend_Loader::loadClass($intersectionTable);
+ } catch (Zend_Exception $e) {
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception($e->getMessage());
+ }
+ $intersectionTable = new $intersectionTable(array('db' => $db));
+ }
+ if (! $intersectionTable instanceof Zend_Db_Table_Abstract) {
+ $type = gettype($intersectionTable);
+ if ($type == 'object') {
+ $type = get_class($intersectionTable);
+ }
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception("Intersection table must be a Zend_Db_Table_Abstract, but it is $type");
+ }
+
+ if (is_string($matchTable)) {
+ try {
+ Zend_Loader::loadClass($matchTable);
+ } catch (Zend_Exception $e) {
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception($e->getMessage());
+ }
+ $matchTable = new $matchTable(array('db' => $db));
+ }
+ if (! $matchTable instanceof Zend_Db_Table_Abstract) {
+ $type = gettype($matchTable);
+ if ($type == 'object') {
+ $type = get_class($matchTable);
+ }
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception("Match table must be a Zend_Db_Table_Abstract, but it is $type");
+ }
+
+ $interInfo = $intersectionTable->info();
+ $interName = $interInfo['name'];
+ $matchInfo = $matchTable->info();
+ $matchName = $matchInfo['name'];
+
+ $matchMap = $this->_prepareReference($intersectionTable, $matchTable, $matchRefRule);
+
+ for ($i = 0; $i < count($matchMap[Zend_Db_Table_Abstract::COLUMNS]); ++$i) {
+ $interCol = $db->quoteIdentifier('i', true) . '.' . $db->quoteIdentifier($matchMap[Zend_Db_Table_Abstract::COLUMNS][$i], true);
+ $matchCol = $db->quoteIdentifier('m', true) . '.' . $db->quoteIdentifier($matchMap[Zend_Db_Table_Abstract::REF_COLUMNS][$i], true);
+ $joinCond[] = "$interCol = $matchCol";
+ }
+ $joinCond = implode(' AND ', $joinCond);
+
+ $select = $db->select()
+ ->from(array('i' => $interName), array())
+ ->join(array('m' => $matchName), $joinCond, '*');
+
+ $callerMap = $this->_prepareReference($intersectionTable, $this->_getTable(), $callerRefRule);
+
+ for ($i = 0; $i < count($callerMap[Zend_Db_Table_Abstract::COLUMNS]); ++$i) {
+ $interCol = $db->quoteIdentifier('i', true) . '.' . $db->quoteIdentifier($callerMap[Zend_Db_Table_Abstract::COLUMNS][$i], true);
+ $value = $this->_data[$db->foldCase($callerMap[Zend_Db_Table_Abstract::REF_COLUMNS][$i])];
+ $select->where("$interCol = ?", $value);
+ }
+ $stmt = $select->query();
+
+ $config = array(
+ 'table' => $matchTable,
+ 'data' => $stmt->fetchAll(Zend_Db::FETCH_ASSOC),
+ 'rowClass' => $matchTable->getRowClass(),
+ 'stored' => true
+ );
+
+ $rowsetClass = $matchTable->getRowsetClass();
+ try {
+ Zend_Loader::loadClass($rowsetClass);
+ } catch (Zend_Exception $e) {
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception($e->getMessage());
+ }
+ $rowset = new $rowsetClass($config);
+ return $rowset;
+ }
+
+ /**
+ * Turn magic function calls into non-magic function calls
+ * to the above methods.
+ *
+ * @param string $method
+ * @param array $args
+ * @return Zend_Db_Table_Row_Abstract|Zend_Db_Table_Rowset_Abstract
+ * @throws Zend_Db_Table_Row_Exception If an invalid method is called.
+ */
+ protected function __call($method, array $args)
+ {
+
+ /**
+ * Recognize methods for Has-Many cases:
+ * findParent<Class>()
+ * findParent<Class>By<Rule>()
+ * Use the non-greedy pattern repeat modifier e.g. \w+?
+ */
+ if (preg_match('/^findParent(\w+?)(?:By(\w+))?$/', $method, $matches)) {
+ $class = $matches[1];
+ $ruleKey1 = isset($matches[2]) ? $matches[2] : null;
+ return $this->findParentRow($class, $ruleKey1);
+ }
+
+ /**
+ * Recognize methods for Many-to-Many cases:
+ * find<Class1>Via<Class2>()
+ * find<Class1>Via<Class2>By<Rule>()
+ * find<Class1>Via<Class2>By<Rule1>And<Rule2>()
+ * Use the non-greedy pattern repeat modifier e.g. \w+?
+ */
+ if (preg_match('/^find(\w+?)Via(\w+?)(?:By(\w+?)(?:And(\w+))?)?$/', $method, $matches)) {
+ $class = $matches[1];
+ $viaClass = $matches[2];
+ $ruleKey1 = isset($matches[3]) ? $matches[3] : null;
+ $ruleKey2 = isset($matches[4]) ? $matches[4] : null;
+ return $this->findManyToManyRowset($class, $viaClass, $ruleKey1, $ruleKey2);
+ }
+
+ /**
+ * Recognize methods for Belongs-To cases:
+ * find<Class>()
+ * find<Class>By<Rule>()
+ * Use the non-greedy pattern repeat modifier e.g. \w+?
+ */
+ if (preg_match('/^find(\w+?)(?:By(\w+))?$/', $method, $matches)) {
+ $class = $matches[1];
+ $ruleKey1 = isset($matches[2]) ? $matches[2] : null;
+ return $this->findDependentRowset($class, $ruleKey1);
+ }
+
+ require_once 'Zend/Db/Table/Row/Exception.php';
+ throw new Zend_Db_Table_Row_Exception("Unrecognized method '$method()'");
+ }
+
+}
diff --git a/libs/Zend/Db/Table/Row/Exception.php b/libs/Zend/Db/Table/Row/Exception.php
new file mode 100755
index 0000000000..e50e73e8cb
--- /dev/null
+++ b/libs/Zend/Db/Table/Row/Exception.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Db_Table_Exception
+ */
+require_once 'Zend/Db/Table/Exception.php';
+
+/**
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Table_Row_Exception extends Zend_Db_Table_Exception
+{
+}
+
diff --git a/libs/Zend/Db/Table/Rowset.php b/libs/Zend/Db/Table/Rowset.php
new file mode 100755
index 0000000000..185ff08a3c
--- /dev/null
+++ b/libs/Zend/Db/Table/Rowset.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Rowset.php 4527 2007-04-17 22:49:14Z darby $
+ */
+
+
+/**
+ * @see Zend_Db_Table_Rowset_Abstract
+ */
+require_once 'Zend/Db/Table/Rowset/Abstract.php';
+
+
+/**
+ * Reference concrete class that extends Zend_Db_Table_Rowset_Abstract.
+ * Developers may also create their own classes that extend the abstract class.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Db_Table_Rowset extends Zend_Db_Table_Rowset_Abstract
+{
+}
diff --git a/libs/Zend/Db/Table/Rowset/Abstract.php b/libs/Zend/Db/Table/Rowset/Abstract.php
new file mode 100755
index 0000000000..7532c39969
--- /dev/null
+++ b/libs/Zend/Db/Table/Rowset/Abstract.php
@@ -0,0 +1,308 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Abstract.php 4697 2007-05-03 21:23:16Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Db_Table_Row
+ */
+require_once 'Zend/Db/Table/Row.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Db
+ * @subpackage Table
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Db_Table_Rowset_Abstract implements Iterator, Countable
+{
+ /**
+ * The original data for each row.
+ *
+ * @var array
+ */
+ protected $_data = array();
+
+ /**
+ * Zend_Db_Table_Abstract object.
+ *
+ * @var Zend_Db_Table_Abstract
+ */
+ protected $_table;
+
+ /**
+ * Connected is true if we have a reference to a live
+ * Zend_Db_Table_Abstract object.
+ * This is false after the Rowset has been deserialized.
+ *
+ * @var boolean
+ */
+ protected $_connected = true;
+
+ /**
+ * Zend_Db_Table_Abstract class name.
+ *
+ * @var string
+ */
+ protected $_tableClass;
+
+ /**
+ * Zend_Db_Table_Row_Abstract class name.
+ *
+ * @var string
+ */
+ protected $_rowClass = 'Zend_Db_Table_Row';
+
+ /**
+ * Iterator pointer.
+ *
+ * @var integer
+ */
+ protected $_pointer = 0;
+
+ /**
+ * How many data rows there are.
+ *
+ * @var integer
+ */
+ protected $_count;
+
+ /**
+ * Collection of instantiated Zend_Db_Table_Row objects.
+ *
+ * @var array
+ */
+ protected $_rows = array();
+
+ /**
+ * @var boolean
+ */
+ protected $_stored = false;
+
+ /**
+ * Constructor.
+ */
+ public function __construct(array $config)
+ {
+ if (isset($config['table'])) {
+ $this->_table = $config['table'];
+ $this->_tableClass = get_class($this->_table);
+ }
+ if (isset($config['rowClass'])) {
+ $this->_rowClass = $config['rowClass'];
+ }
+ if (isset($config['data'])) {
+ $this->_data = $config['data'];
+ }
+ if (isset($config['stored'])) {
+ $this->_stored = $config['stored'];
+ }
+
+ // set the count of rows
+ $this->_count = count($this->_data);
+ }
+
+ /**
+ * Store data, class names, and state in serialized object
+ *
+ * @return array
+ */
+ public function __sleep()
+ {
+ return array('_data', '_tableClass', '_rowClass', '_pointer', '_count', '_rows', '_stored');
+ }
+
+ /**
+ * Setup to do on wakeup.
+ * A de-serialized Rowset should not be assumed to have access to a live
+ * database connection, so set _connected = false.
+ *
+ * @return void
+ */
+ public function __wakeup()
+ {
+ $this->_connected = false;
+ }
+
+ /**
+ * Returns the table object, or null if this is disconnected rowset
+ *
+ * @return Zend_Db_Table_Abstract|null
+ */
+ public function getTable()
+ {
+ return $this->_table;
+ }
+
+ /**
+ * Set the table object, to re-establish a live connection
+ * to the database for a Rowset that has been de-serialized.
+ *
+ * @param Zend_Db_Table_Abstract $table
+ * @return boolean
+ * @throws Zend_Db_Table_Row_Exception
+ */
+ public function setTable(Zend_Db_Table_Abstract $table)
+ {
+ $this->_table = $table;
+ $this->_connected = false;
+ // @todo This works only if we have iterated through
+ // the result set once to instantiate the rows.
+ foreach ($this->_rows as $row) {
+ $connected = $row->setTable($table);
+ if ($connected == true) {
+ $this->_connected = true;
+ }
+ }
+ return $this->_connected;
+ }
+
+ /**
+ * Query the class name of the Table object for which this
+ * Rowset was created.
+ *
+ * @return string
+ */
+ public function getTableClass()
+ {
+ return $this->_tableClass;
+ }
+
+ /**
+ * Rewind the Iterator to the first element.
+ * Similar to the reset() function for arrays in PHP.
+ * Required by interface Iterator.
+ *
+ * @return void
+ */
+ public function rewind()
+ {
+ $this->_pointer = 0;
+ }
+
+ /**
+ * Return the current element.
+ * Similar to the current() function for arrays in PHP
+ * Required by interface Iterator.
+ *
+ * @return Zend_Db_Table_Row_Abstract current element from the collection
+ */
+ public function current()
+ {
+ if ($this->valid() === false) {
+ return null;
+ }
+
+ // do we already have a row object for this position?
+ if (empty($this->_rows[$this->_pointer])) {
+ $this->_rows[$this->_pointer] = new $this->_rowClass(
+ array(
+ 'table' => $this->_table,
+ 'data' => $this->_data[$this->_pointer],
+ 'stored' => $this->_stored
+ )
+ );
+ }
+
+ // return the row object
+ return $this->_rows[$this->_pointer];
+ }
+
+ /**
+ * Return the identifying key of the current element.
+ * Similar to the key() function for arrays in PHP.
+ * Required by interface Iterator.
+ *
+ * @return int
+ */
+ public function key()
+ {
+ return $this->_pointer;
+ }
+
+ /**
+ * Move forward to next element.
+ * Similar to the next() function for arrays in PHP.
+ * Required by interface Iterator.
+ *
+ * @return void
+ */
+ public function next()
+ {
+ ++$this->_pointer;
+ }
+
+ /**
+ * Check if there is a current element after calls to rewind() or next().
+ * Used to check if we've iterated to the end of the collection.
+ * Required by interface Iterator.
+ *
+ * @return bool False if there's nothing more to iterate over
+ */
+ public function valid()
+ {
+ return $this->_pointer < $this->_count;
+ }
+
+ /**
+ * Returns the number of elements in the collection.
+ *
+ * Implements Countable::count()
+ *
+ * @return int
+ */
+ public function count()
+ {
+ return $this->_count;
+ }
+
+ /**
+ * Returns true if and only if count($this) > 0.
+ *
+ * @return bool
+ * @deprecated since 0.9.3; use count() instead
+ */
+ public function exists()
+ {
+ return $this->_count > 0;
+ }
+
+ /**
+ * Returns all data as an array.
+ *
+ * Updates the $_data property with current row object values.
+ *
+ * @return array
+ */
+ public function toArray()
+ {
+ // @todo This works only if we have iterated through
+ // the result set once to instantiate the rows.
+ foreach ($this->_rows as $i => $row) {
+ $this->_data[$i] = $row->toArray();
+ }
+ return $this->_data;
+ }
+
+}
diff --git a/libs/Zend/Debug.php b/libs/Zend/Debug.php
new file mode 100755
index 0000000000..79f4317163
--- /dev/null
+++ b/libs/Zend/Debug.php
@@ -0,0 +1,103 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Debug
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Concrete class for handling view scripts.
+ *
+ * @category Zend
+ * @package Zend_Debug
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+class Zend_Debug
+{
+
+ /**
+ * @var string
+ */
+ protected static $_sapi = null;
+
+ /**
+ * Get the current value of the debug output environment.
+ * This defaults to the value of PHP_SAPI.
+ *
+ * @return string;
+ */
+ public static function getSapi()
+ {
+ if (self::$_sapi === null) {
+ self::$_sapi = PHP_SAPI;
+ }
+ return self::$_sapi;
+ }
+
+ /**
+ * Set the debug ouput environment.
+ * Setting a value of null causes Zend_Debug to use PHP_SAPI.
+ *
+ * @param string $sapi
+ * @return void;
+ */
+ public static function setSapi($sapi)
+ {
+ self::$_sapi = $sapi;
+ }
+
+ /**
+ * Debug helper function. This is a wrapper for var_dump() that adds
+ * the <pre /> tags, cleans up newlines and indents, and runs
+ * htmlentities() before output.
+ *
+ * @param mixed $var The variable to dump.
+ * @param string $label OPTIONAL Label to prepend to output.
+ * @param bool $echo OPTIONAL Echo output if true.
+ * @return string
+ */
+ public static function dump($var, $label=null, $echo=true)
+ {
+ // format the label
+ $label = ($label===null) ? '' : rtrim($label) . ' ';
+
+ // var_dump the variable into a buffer and keep the output
+ ob_start();
+ var_dump($var);
+ $output = ob_get_clean();
+
+ // neaten the newlines and indents
+ $output = preg_replace("/\]\=\>\n(\s+)/m", "] => ", $output);
+ if (self::getSapi() == 'cli') {
+ $output = PHP_EOL . $label
+ . PHP_EOL . $output
+ . PHP_EOL;
+ } else {
+ $output = '<pre>'
+ . $label
+ . htmlspecialchars($output, ENT_QUOTES)
+ . '</pre>';
+ }
+
+ if ($echo) {
+ echo($output);
+ }
+ return $output;
+ }
+
+}
diff --git a/libs/Zend/Exception.php b/libs/Zend/Exception.php
new file mode 100755
index 0000000000..637f91b8de
--- /dev/null
+++ b/libs/Zend/Exception.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * @category Zend
+ * @package Zend
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Exception extends Exception
+{}
+
diff --git a/libs/Zend/Feed.php b/libs/Zend/Feed.php
new file mode 100755
index 0000000000..3a2ff9d9fe
--- /dev/null
+++ b/libs/Zend/Feed.php
@@ -0,0 +1,395 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Feed.php 4729 2007-05-06 14:01:06Z thomas $
+ */
+
+
+/**
+ * Feed utility class
+ *
+ * Base Zend_Feed class, containing constants and the Zend_Http_Client instance
+ * accessor.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Feed
+{
+
+ /**
+ * HTTP client object to use for retrieving feeds
+ *
+ * @var Zend_Http_Client
+ */
+ protected static $_httpClient = null;
+
+ /**
+ * Override HTTP PUT and DELETE request methods?
+ *
+ * @var boolean
+ */
+ protected static $_httpMethodOverride = false;
+
+ /**
+ * @var array
+ */
+ protected static $_namespaces = array(
+ 'opensearch' => 'http://a9.com/-/spec/opensearchrss/1.0/',
+ 'atom' => 'http://www.w3.org/2005/Atom',
+ 'rss' => 'http://blogs.law.harvard.edu/tech/rss',
+ );
+
+
+ /**
+ * Set the HTTP client instance
+ *
+ * Sets the HTTP client object to use for retrieving the feeds.
+ *
+ * @param Zend_Http_Client $httpClient
+ * @return void
+ */
+ public static function setHttpClient(Zend_Http_Client $httpClient)
+ {
+ self::$_httpClient = $httpClient;
+ }
+
+
+ /**
+ * Gets the HTTP client object. If none is set, a new Zend_Http_Client will be used.
+ *
+ * @return Zend_Http_Client_Abstract
+ */
+ public static function getHttpClient()
+ {
+ if (!self::$_httpClient instanceof Zend_Http_Client) {
+ /**
+ * @see Zend_Http_Client
+ */
+ require_once 'Zend/Http/Client.php';
+ self::$_httpClient = new Zend_Http_Client();
+ }
+
+ return self::$_httpClient;
+ }
+
+
+ /**
+ * Toggle using POST instead of PUT and DELETE HTTP methods
+ *
+ * Some feed implementations do not accept PUT and DELETE HTTP
+ * methods, or they can't be used because of proxies or other
+ * measures. This allows turning on using POST where PUT and
+ * DELETE would normally be used; in addition, an
+ * X-Method-Override header will be sent with a value of PUT or
+ * DELETE as appropriate.
+ *
+ * @param boolean $override Whether to override PUT and DELETE.
+ * @return void
+ */
+ public static function setHttpMethodOverride($override = true)
+ {
+ self::$_httpMethodOverride = $override;
+ }
+
+
+ /**
+ * Get the HTTP override state
+ *
+ * @return boolean
+ */
+ public static function getHttpMethodOverride()
+ {
+ return self::$_httpMethodOverride;
+ }
+
+
+ /**
+ * Get the full version of a namespace prefix
+ *
+ * Looks up a prefix (atom:, etc.) in the list of registered
+ * namespaces and returns the full namespace URI if
+ * available. Returns the prefix, unmodified, if it's not
+ * registered.
+ *
+ * @return string
+ */
+ public static function lookupNamespace($prefix)
+ {
+ return isset(self::$_namespaces[$prefix]) ?
+ self::$_namespaces[$prefix] :
+ $prefix;
+ }
+
+
+ /**
+ * Add a namespace and prefix to the registered list
+ *
+ * Takes a prefix and a full namespace URI and adds them to the
+ * list of registered namespaces for use by
+ * Zend_Feed::lookupNamespace().
+ *
+ * @param string $prefix The namespace prefix
+ * @param string $namespaceURI The full namespace URI
+ * @return void
+ */
+ public static function registerNamespace($prefix, $namespaceURI)
+ {
+ self::$_namespaces[$prefix] = $namespaceURI;
+ }
+
+
+ /**
+ * Imports a feed located at $uri.
+ *
+ * @param string $uri
+ * @throws Zend_Feed_Exception
+ * @return Zend_Feed_Abstract
+ */
+ public static function import($uri)
+ {
+ $client = self::getHttpClient();
+ $client->setUri($uri);
+ $response = $client->request('GET');
+ if ($response->getStatus() !== 200) {
+ /**
+ * @see Zend_Feed_Exception
+ */
+ require_once 'Zend/Feed/Exception.php';
+ throw new Zend_Feed_Exception('Feed failed to load, got response code ' . $response->getStatus());
+ }
+ $feed = $response->getBody();
+ return self::importString($feed);
+ }
+
+
+ /**
+ * Imports a feed represented by $string.
+ *
+ * @param string $string
+ * @throws Zend_Feed_Exception
+ * @return Zend_Feed_Abstract
+ */
+ public static function importString($string)
+ {
+ // Load the feed as an XML DOMDocument object
+ @ini_set('track_errors', 1);
+ $doc = new DOMDocument();
+ $success = @$doc->loadXML($string);
+ @ini_restore('track_errors');
+
+ if (!$success) {
+ /**
+ * @see Zend_Feed_Exception
+ */
+ require_once 'Zend/Feed/Exception.php';
+ throw new Zend_Feed_Exception("DOMDocument cannot parse XML: $php_errormsg");
+ }
+
+ // Try to find the base feed element or a single <entry> of an Atom feed
+ if ($doc->getElementsByTagName('feed')->item(0) ||
+ $doc->getElementsByTagName('entry')->item(0)) {
+ /**
+ * @see Zend_Feed_Atom
+ */
+ require_once 'Zend/Feed/Atom.php';
+ // return a newly created Zend_Feed_Atom object
+ return new Zend_Feed_Atom(null, $string);
+ }
+
+ // Try to find the base feed element of an RSS feed
+ if ($doc->getElementsByTagName('channel')->item(0)) {
+ /**
+ * @see Zend_Feed_Rss
+ */
+ require_once 'Zend/Feed/Rss.php';
+ // return a newly created Zend_Feed_Rss object
+ return new Zend_Feed_Rss(null, $string);
+ }
+
+ // $string does not appear to be a valid feed of the supported types
+ /**
+ * @see Zend_Feed_Exception
+ */
+ require_once 'Zend/Feed/Exception.php';
+ throw new Zend_Feed_Exception('Invalid or unsupported feed format');
+ }
+
+
+ /**
+ * Imports a feed from a file located at $filename.
+ *
+ * @param string $filename
+ * @throws Zend_Feed_Exception
+ * @return Zend_Feed_Abstract
+ */
+ public static function importFile($filename)
+ {
+ @ini_set('track_errors', 1);
+ $feed = @file_get_contents($filename);
+ @ini_restore('track_errors');
+ if ($feed === false) {
+ /**
+ * @see Zend_Feed_Exception
+ */
+ require_once 'Zend/Feed/Exception.php';
+ throw new Zend_Feed_Exception("File could not be loaded: $php_errormsg");
+ }
+ return self::importString($feed);
+ }
+
+
+ /**
+ * Attempts to find feeds at $uri referenced by <link ... /> tags. Returns an
+ * array of the feeds referenced at $uri.
+ *
+ * @todo Allow findFeeds() to follow one, but only one, code 302.
+ *
+ * @param string $uri
+ * @throws Zend_Feed_Exception
+ * @return array
+ */
+ public static function findFeeds($uri)
+ {
+ // Get the HTTP response from $uri and save the contents
+ $client = self::getHttpClient();
+ $client->setUri($uri);
+ $response = $client->request();
+ if ($response->getStatus() !== 200) {
+ /**
+ * @see Zend_Feed_Exception
+ */
+ require_once 'Zend/Feed/Exception.php';
+ throw new Zend_Feed_Exception("Failed to access $uri, got response code " . $response->getStatus());
+ }
+ $contents = $response->getBody();
+
+ // Parse the contents for appropriate <link ... /> tags
+ @ini_set('track_errors', 1);
+ $pattern = '~(<link[^>]+)/?>~i';
+ $result = @preg_match_all($pattern, $contents, $matches);
+ @ini_restore('track_errors');
+ if ($result === false) {
+ /**
+ * @see Zend_Feed_Exception
+ */
+ require_once 'Zend/Feed/Exception.php';
+ throw new Zend_Feed_Exception("Internal error: $php_errormsg");
+ }
+
+ // Try to fetch a feed for each link tag that appears to refer to a feed
+ $feeds = array();
+ if (isset($matches[1]) && count($matches[1]) > 0) {
+ foreach ($matches[1] as $link) {
+ // force string to be an utf-8 one
+ if (!mb_check_encoding($link, 'UTF-8')) {
+ $link = mb_convert_encoding($link, 'UTF-8');
+ }
+ $xml = @simplexml_load_string(rtrim($link, ' /') . ' />');
+ if ($xml === false) {
+ continue;
+ }
+ $attributes = $xml->attributes();
+ if (!isset($attributes['rel']) || !@preg_match('~^(?:alternate|service\.feed)~i', $attributes['rel'])) {
+ continue;
+ }
+ if (!isset($attributes['type']) ||
+ !@preg_match('~^application/(?:atom|rss|rdf)\+xml~', $attributes['type'])) {
+ continue;
+ }
+ if (!isset($attributes['href'])) {
+ continue;
+ }
+ try {
+ // checks if we need to canonize the given uri
+ try {
+ $uri = Zend_Uri::factory((string) $attributes['href']);
+ } catch (Zend_Uri_Exception $e) {
+ // canonize the uri
+ $path = (string) $attributes['href'];
+ $query = $fragment = '';
+ if (substr($path, 0, 1) != '/') {
+ // add the current root path to this one
+ $path = rtrim($client->getUri()->getPath(), '/') . '/' . $path;
+ }
+ if (strpos($path, '?') !== false) {
+ list($path, $query) = explode('?', $path, 2);
+ }
+ if (strpos($query, '#') !== false) {
+ list($query, $fragment) = explode('#', $query, 2);
+ }
+ $uri = Zend_Uri::factory($client->getUri(true));
+ $uri->setPath($path);
+ $uri->setQuery($query);
+ $uri->setFragment($fragment);
+ }
+
+ $feed = self::import($uri);
+ } catch (Exception $e) {
+ continue;
+ }
+ $feeds[] = $feed;
+ }
+ }
+
+ // Return the fetched feeds
+ return $feeds;
+ }
+
+ /**
+ * Construct a new Zend_Feed_Abstract object from a custom array
+ *
+ * @param array $data
+ * @param string $format (rss|atom) the requested output format
+ * @return Zend_Feed_Abstract
+ */
+ public static function importArray(array $data, $format = 'atom')
+ {
+ $obj = 'Zend_Feed_' . ucfirst(strtolower($format));
+ /**
+ * @see Zend_Loader
+ */
+ require_once 'Zend/Loader.php';
+ Zend_Loader::loadClass($obj);
+ Zend_Loader::loadClass('Zend_Feed_Builder');
+
+ return new $obj(null, null, new Zend_Feed_Builder($data));
+ }
+
+ /**
+ * Construct a new Zend_Feed_Abstract object from a Zend_Feed_Builder_Interface data source
+ *
+ * @param Zend_Feed_Builder_Interface $builder this object will be used to extract the data of the feed
+ * @param string $format (rss|atom) the requested output format
+ * @return Zend_Feed_Abstract
+ */
+ public static function importBuilder(Zend_Feed_Builder_Interface $builder, $format = 'atom')
+ {
+ $obj = 'Zend_Feed_' . ucfirst(strtolower($format));
+ /**
+ * @see Zend_Loader
+ */
+ require_once 'Zend/Loader.php';
+ Zend_Loader::loadClass($obj);
+
+ return new $obj(null, null, $builder);
+ }
+}
diff --git a/libs/Zend/Feed/Abstract.php b/libs/Zend/Feed/Abstract.php
new file mode 100755
index 0000000000..ca3a46022c
--- /dev/null
+++ b/libs/Zend/Feed/Abstract.php
@@ -0,0 +1,242 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Abstract.php 3941 2007-03-14 21:36:13Z darby $
+ */
+
+
+/**
+ * @see Zend_Feed_Element
+ */
+require_once 'Zend/Feed/Element.php';
+
+
+/**
+ * The Zend_Feed_Abstract class is an abstract class representing feeds.
+ *
+ * Zend_Feed_Abstract implements two core PHP 5 interfaces: ArrayAccess and
+ * Iterator. In both cases the collection being treated as an array is
+ * considered to be the entry collection, such that iterating over the
+ * feed takes you through each of the feed.s entries.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Feed_Abstract extends Zend_Feed_Element implements Iterator
+{
+ /**
+ * Current index on the collection of feed entries for the
+ * Iterator implementation.
+ *
+ * @var integer
+ */
+ protected $_entryIndex = 0;
+
+ /**
+ * Cache of feed entries.
+ *
+ * @var array
+ */
+ protected $_entries;
+
+ /**
+ * Feed constructor
+ *
+ * The Zend_Feed_Abstract constructor takes the URI of a feed or a
+ * feed represented as a string and loads it as XML.
+ *
+ * @throws Zend_Feed_Exception If loading the feed failed.
+ *
+ * @param string $uri The full URI of the feed to load, or NULL if not retrieved via HTTP or as an array.
+ * @param string $string The feed as a string, or NULL if retrieved via HTTP or as an array.
+ * @param Zend_Feed_Builder_Interface $builder The feed as a builder instance or NULL if retrieved as a string or via HTTP.
+ * @return void
+ */
+ public function __construct($uri = null, $string = null, Zend_Feed_Builder_Interface $builder = null)
+ {
+ if ($uri !== null) {
+ // Retrieve the feed via HTTP
+ $client = Zend_Feed::getHttpClient();
+ $client->setUri($uri);
+ $response = $client->request('GET');
+ if ($response->getStatus() !== 200) {
+ throw new Zend_Feed_Exception('Feed failed to load, got response code ' . $response->getStatus());
+ }
+ $this->_element = $response->getBody();
+ $this->__wakeup();
+ } elseif ($string !== null) {
+ // Retrieve the feed from $string
+ $this->_element = $string;
+ $this->__wakeup();
+ } else {
+ // Generate the feed from the array
+ $header = $builder->getHeader();
+ $this->_element = new DOMDocument('1.0', $header['charset']);
+ $root = $this->_mapFeedHeaders($header);
+ $this->_mapFeedEntries($root, $builder->getEntries());
+ $this->_element = $root;
+ $this->_buildEntryCache();
+ }
+ }
+
+
+ /**
+ * Load the feed as an XML DOMDocument object
+ *
+ * @return void
+ */
+ public function __wakeup()
+ {
+ @ini_set('track_errors', 1);
+ $doc = new DOMDocument();
+ $success = @$doc->loadXML($this->_element);
+ @ini_restore('track_errors');
+
+ if (!$success) {
+ throw new Zend_Feed_Exception("DOMDocument cannot parse XML: $php_errormsg");
+ }
+
+ $this->_element = $doc;
+ }
+
+
+ /**
+ * Prepare for serialiation
+ *
+ * @return array
+ */
+ public function __sleep()
+ {
+ $this->_element = $this->saveXML();
+
+ return array('_element');
+ }
+
+
+ /**
+ * Cache the individual feed elements so they don't need to be
+ * searched for on every operation.
+ *
+ * @return void
+ */
+ protected function _buildEntryCache()
+ {
+ $this->_entries = array();
+ foreach ($this->_element->childNodes as $child) {
+ if ($child->localName == $this->_entryElementName) {
+ $this->_entries[] = $child;
+ }
+ }
+ }
+
+
+ /**
+ * Get the number of entries in this feed object.
+ *
+ * @return integer Entry count.
+ */
+ public function count()
+ {
+ return count($this->_entries);
+ }
+
+
+ /**
+ * Required by the Iterator interface.
+ *
+ * @return void
+ */
+ public function rewind()
+ {
+ $this->_entryIndex = 0;
+ }
+
+
+ /**
+ * Required by the Iterator interface.
+ *
+ * @return mixed The current row, or null if no rows.
+ */
+ public function current()
+ {
+ return new $this->_entryClassName(
+ null,
+ $this->_entries[$this->_entryIndex]);
+ }
+
+
+ /**
+ * Required by the Iterator interface.
+ *
+ * @return mixed The current row number (starts at 0), or NULL if no rows
+ */
+ public function key()
+ {
+ return $this->_entryIndex;
+ }
+
+
+ /**
+ * Required by the Iterator interface.
+ *
+ * @return mixed The next row, or null if no more rows.
+ */
+ public function next()
+ {
+ ++$this->_entryIndex;
+ }
+
+
+ /**
+ * Required by the Iterator interface.
+ *
+ * @return boolean Whether the iteration is valid
+ */
+ public function valid()
+ {
+ return 0 <= $this->_entryIndex && $this->_entryIndex < $this->count();
+ }
+
+ /**
+ * Generate the header of the feed when working in write mode
+ *
+ * @param array $array the data to use
+ * @return DOMElement root node
+ */
+ abstract protected function _mapFeedHeaders($array);
+
+ /**
+ * Generate the entries of the feed when working in write mode
+ *
+ * @param DOMElement $root the root node to use
+ * @param array $array the data to use
+ * @return DOMElement root node
+ */
+ abstract protected function _mapFeedEntries(DOMElement $root, $array);
+
+ /**
+ * Send feed to a http client with the correct header
+ *
+ * @throws Zend_Feed_Exception if headers have already been sent
+ * @return void
+ */
+ abstract public function send();
+}
diff --git a/libs/Zend/Feed/Atom.php b/libs/Zend/Feed/Atom.php
new file mode 100755
index 0000000000..bff2d426a6
--- /dev/null
+++ b/libs/Zend/Feed/Atom.php
@@ -0,0 +1,381 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Atom.php 4733 2007-05-06 19:41:25Z thomas $
+ */
+
+
+/**
+ * @see Zend_Feed_Abstract
+ */
+require_once 'Zend/Feed/Abstract.php';
+
+/**
+ * @see Zend_Feed_Entry_Atom
+ */
+require_once 'Zend/Feed/Entry/Atom.php';
+
+
+/**
+ * Atom feed class
+ *
+ * The Zend_Feed_Atom class is a concrete subclass of the general
+ * Zend_Feed_Abstract class, tailored for representing an Atom
+ * feed. It shares all of the same methods with its abstract
+ * parent. The distinction is made in the format of data that
+ * Zend_Feed_Atom expects, and as a further pointer for users as to
+ * what kind of feed object they have been passed.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Feed_Atom extends Zend_Feed_Abstract
+{
+
+ /**
+ * The classname for individual feed elements.
+ *
+ * @var string
+ */
+ protected $_entryClassName = 'Zend_Feed_Entry_Atom';
+
+ /**
+ * The element name for individual feed elements (Atom <entry>
+ * elements).
+ *
+ * @var string
+ */
+ protected $_entryElementName = 'entry';
+
+ /**
+ * The default namespace for Atom feeds.
+ *
+ * @var string
+ */
+ protected $_defaultNamespace = 'atom';
+
+
+ /**
+ * Override Zend_Feed_Abstract to set up the $_element and $_entries aliases.
+ *
+ * @return void
+ */
+ public function __wakeup()
+ {
+ parent::__wakeup();
+
+ // Find the base feed element and create an alias to it.
+ $element = $this->_element->getElementsByTagName('feed')->item(0);
+ if (!$element) {
+ // Try to find a single <entry> instead.
+ $element = $this->_element->getElementsByTagName($this->_entryElementName)->item(0);
+ if (!$element) {
+ throw new Zend_Feed_Exception('No root <feed> or <' . $this->_entryElementName
+ . '> element found, cannot parse feed.');
+ }
+
+ $doc = new DOMDocument($this->_element->version,
+ $this->_element->actualEncoding);
+ $feed = $doc->appendChild($doc->createElement('feed'));
+ $feed->appendChild($doc->importNode($element, true));
+ $element = $feed;
+ }
+
+ $this->_element = $element;
+
+ // Find the entries and save a pointer to them for speed and
+ // simplicity.
+ $this->_buildEntryCache();
+ }
+
+
+ /**
+ * Easy access to <link> tags keyed by "rel" attributes.
+ *
+ * If $elt->link() is called with no arguments, we will attempt to
+ * return the value of the <link> tag(s) like all other
+ * method-syntax attribute access. If an argument is passed to
+ * link(), however, then we will return the "href" value of the
+ * first <link> tag that has a "rel" attribute matching $rel:
+ *
+ * $elt->link(): returns the value of the link tag.
+ * $elt->link('self'): returns the href from the first <link rel="self"> in the entry.
+ *
+ * @param string $rel The "rel" attribute to look for.
+ * @return mixed
+ */
+ public function link($rel = null)
+ {
+ if ($rel === null) {
+ return parent::__call('link', null);
+ }
+
+ // index link tags by their "rel" attribute.
+ $links = parent::__get('link');
+ if (!is_array($links)) {
+ if ($links instanceof Zend_Feed_Element) {
+ $links = array($links);
+ } else {
+ return $links;
+ }
+ }
+
+ foreach ($links as $link) {
+ if (empty($link['rel'])) {
+ continue;
+ }
+ if ($rel == $link['rel']) {
+ return $link['href'];
+ }
+ }
+
+ return null;
+ }
+
+
+ /**
+ * Make accessing some individual elements of the feed easier.
+ *
+ * Special accessors 'entry' and 'entries' are provided so that if
+ * you wish to iterate over an Atom feed's entries, you can do so
+ * using foreach ($feed->entries as $entry) or foreach
+ * ($feed->entry as $entry).
+ *
+ * @param string $var The property to access.
+ * @return mixed
+ */
+ public function __get($var)
+ {
+ switch ($var) {
+ case 'entry':
+ // fall through to the next case
+ case 'entries':
+ return $this;
+
+ default:
+ return parent::__get($var);
+ }
+ }
+
+ /**
+ * Generate the header of the feed when working in write mode
+ *
+ * @param array $array the data to use
+ * @return DOMElement root node
+ */
+ protected function _mapFeedHeaders($array)
+ {
+ $feed = $this->_element->createElement('feed');
+ $feed->setAttribute('xmlns', 'http://www.w3.org/2005/Atom');
+
+ $id = $this->_element->createElement('id', $array->link);
+ $feed->appendChild($id);
+
+ $title = $this->_element->createElement('title');
+ $title->appendChild($this->_element->createCDATASection($array->title));
+ $feed->appendChild($title);
+
+ if (isset($array->author)) {
+ $author = $this->_element->createElement('author');
+ $name = $this->_element->createElement('name', $array->author);
+ $author->appendChild($name);
+ if (isset($array->email)) {
+ $email = $this->_element->createElement('email', $array->email);
+ $author->appendChild($email);
+ }
+ $feed->appendChild($author);
+ }
+
+ $updated = isset($array->lastUpdate) ? $array->lastUpdate : time();
+ $updated = $this->_element->createElement('updated', date(DATE_ATOM, $updated));
+ $feed->appendChild($updated);
+
+ if (isset($array->published)) {
+ $published = $this->_element->createElement('published', date(DATE_ATOM, $array->published));
+ $feed->appendChild($published);
+ }
+
+ $link = $this->_element->createElement('link');
+ $link->setAttribute('rel', 'self');
+ $link->setAttribute('href', $array->link);
+ if (isset($array->language)) {
+ $link->setAttribute('hreflang', $array->language);
+ }
+ $feed->appendChild($link);
+
+ if (isset($array->description)) {
+ $subtitle = $this->_element->createElement('subtitle');
+ $subtitle->appendChild($this->_element->createCDATASection($array->description));
+ $feed->appendChild($subtitle);
+ }
+
+ if (isset($array->copyright)) {
+ $copyright = $this->_element->createElement('rights', $array->copyright);
+ $feed->appendChild($copyright);
+ }
+
+ if (isset($array->image)) {
+ $image = $this->_element->createElement('logo', $array->image);
+ $feed->appendChild($image);
+ }
+
+ $generator = !empty($array->generator) ? $array->generator : 'Zend_Feed';
+ $generator = $this->_element->createElement('generator', $generator);
+ $feed->appendChild($generator);
+
+ return $feed;
+ }
+
+ /**
+ * Generate the entries of the feed when working in write mode
+ *
+ * The following nodes are constructed for each feed entry
+ * <entry>
+ * <id>url to feed entry</id>
+ * <title>entry title</title>
+ * <updated>last update</updated>
+ * <link rel="alternate" href="url to feed entry" />
+ * <summary>short text</summary>
+ * <content>long version, can contain html</content>
+ * </entry>
+ *
+ * @param array $array the data to use
+ * @param DOMElement $root the root node to use
+ * @return void
+ */
+ protected function _mapFeedEntries(DOMElement $root, $array)
+ {
+ foreach ($array as $dataentry) {
+ $entry = $this->_element->createElement('entry');
+
+ $id = $this->_element->createElement('id', isset($dataentry->guid) ? $dataentry->guid : $dataentry->link);
+ $entry->appendChild($id);
+
+ $title = $this->_element->createElement('title');
+ $title->appendChild($this->_element->createCDATASection($dataentry->title));
+ $entry->appendChild($title);
+
+ $updated = isset($dataentry->lastUpdate) ? $dataentry->lastUpdate : time();
+ $updated = $this->_element->createElement('updated', date(DATE_ATOM, $updated));
+ $entry->appendChild($updated);
+
+ $link = $this->_element->createElement('link');
+ $link->setAttribute('rel', 'alternate');
+ $link->setAttribute('href', $dataentry->link);
+ $entry->appendChild($link);
+
+ $summary = $this->_element->createElement('summary');
+ $summary->appendChild($this->_element->createCDATASection($dataentry->description));
+ $entry->appendChild($summary);
+
+ if (isset($dataentry->content)) {
+ $content = $this->_element->createElement('content');
+ $content->setAttribute('type', 'html');
+ $content->appendChild($this->_element->createCDATASection($dataentry->content));
+ $entry->appendChild($content);
+ }
+
+ if (isset($dataentry->category)) {
+ foreach ($dataentry->category as $category) {
+ $node = $this->_element->createElement('category');
+ $node->setAttribute('term', $category['term']);
+ if (isset($category['scheme'])) {
+ $node->setAttribute('scheme', $category['scheme']);
+ }
+ $entry->appendChild($node);
+ }
+ }
+
+ if (isset($dataentry->source)) {
+ $source = $this->_element->createElement('source');
+ $title = $this->_element->createElement('title', $dataentry->source['title']);
+ $source->appendChild($title);
+ $link = $this->_element->createElement('link', $dataentry->source['title']);
+ $link->setAttribute('rel', 'alternate');
+ $link->setAttribute('href', $dataentry->source['url']);
+ $source->appendChild($link);
+ }
+
+ if (isset($dataentry->enclosure)) {
+ foreach ($dataentry->enclosure as $enclosure) {
+ $node = $this->_element->createElement('link');
+ $node->setAttribute('rel', 'enclosure');
+ $node->setAttribute('href', $enclosure['url']);
+ if (isset($enclosure['type'])) {
+ $node->setAttribute('type', $enclosure['type']);
+ }
+ if (isset($enclosure['length'])) {
+ $node->setAttribute('length', $enclosure['length']);
+ }
+ $entry->appendChild($node);
+ }
+ }
+
+ if (isset($dataentry->comments)) {
+ $comments = $this->_element->createElementNS('http://wellformedweb.org/CommentAPI/',
+ 'wfw:comment',
+ $dataentry->comments);
+ $entry->appendChild($comments);
+ }
+ if (isset($dataentry->commentRss)) {
+ $comments = $this->_element->createElementNS('http://wellformedweb.org/CommentAPI/',
+ 'wfw:commentRss',
+ $dataentry->commentRss);
+ $entry->appendChild($comments);
+ }
+
+ $root->appendChild($entry);
+ }
+ }
+
+ /**
+ * Override Zend_Feed_Element to allow formated feeds
+ *
+ * @return string
+ */
+ public function saveXML()
+ {
+ // Return a complete document including XML prologue.
+ $doc = new DOMDocument($this->_element->ownerDocument->version,
+ $this->_element->ownerDocument->actualEncoding);
+ $doc->appendChild($doc->importNode($this->_element, true));
+ $doc->formatOutput = true;
+
+ return $doc->saveXML();
+ }
+
+ /**
+ * Send feed to a http client with the correct header
+ *
+ * @throws Zend_Feed_Exception if headers have already been sent
+ * @return void
+ */
+ public function send()
+ {
+ if (headers_sent()) {
+ throw new Zend_Feed_Exception('Cannot send ATOM because headers have already been sent.');
+ }
+
+ header('Content-type: application/atom+xml; charset: ' . $this->_element->ownerDocument->actualEncoding);
+
+ echo $this->saveXML();
+ }
+}
diff --git a/libs/Zend/Feed/Builder.php b/libs/Zend/Feed/Builder.php
new file mode 100755
index 0000000000..74b8864303
--- /dev/null
+++ b/libs/Zend/Feed/Builder.php
@@ -0,0 +1,383 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Builder.php 3941 2007-03-14 21:36:13Z darby $
+ */
+
+
+/**
+ * @see Zend_Feed_Builder_Interface
+ */
+require_once 'Zend/Feed/Builder/Interface.php';
+
+
+/**
+ * @see Zend_Feed_Builder_Header
+ */
+require_once 'Zend/Feed/Builder/Header.php';
+
+
+/**
+ * @see Zend_Feed_Builder_Entry
+ */
+require_once 'Zend/Feed/Builder/Entry.php';
+
+
+/**
+ * @see Zend_Feed_Exception
+ */
+require_once 'Zend/Feed/Exception.php';
+
+
+/**
+ * A simple implementation of Zend_Feed_Builder_Interface.
+ *
+ * Users are encouraged to make their own classes to implement Zend_Feed_Builder_Interface
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Feed_Builder implements Zend_Feed_Builder_Interface
+{
+ /**
+ * The data of the feed
+ *
+ * @var $_data array
+ */
+ private $_data;
+
+ /**
+ * Header of the feed
+ *
+ * @var $_header Zend_Feed_Builder_Header
+ */
+ private $_header;
+
+ /**
+ * List of the entries of the feed
+ *
+ * @var $_entries array
+ */
+ private $_entries = array();
+
+ /**
+ * Constructor. The $data array must conform to the following format:
+ * <code>
+ * array(
+ * 'title' => 'title of the feed', //required
+ * 'link' => 'canonical url to the feed', //required
+ * 'lastUpdate' => 'timestamp of the update date', // optional
+ * 'published' => 'timestamp of the publication date', //optional
+ * 'charset' => 'charset', // required
+ * 'description' => 'short description of the feed', //optional
+ * 'author' => 'author/publisher of the feed', //optional
+ * 'email' => 'email of the author', //optional
+ * 'webmaster' => 'email address for person responsible for technical issues' // optional, ignored if atom is used
+ * 'copyright' => 'copyright notice', //optional
+ * 'image' => 'url to image', //optional
+ * 'generator' => 'generator', // optional
+ * 'language' => 'language the feed is written in', // optional
+ * 'ttl' => 'how long in minutes a feed can be cached before refreshing', // optional, ignored if atom is used
+ * 'rating' => 'The PICS rating for the channel.', // optional, ignored if atom is used
+ * 'cloud' => array(
+ * 'domain' => 'domain of the cloud, e.g. rpc.sys.com' // required
+ * 'port' => 'port to connect to' // optional, default to 80
+ * 'path' => 'path of the cloud, e.g. /RPC2 //required
+ * 'registerProcedure' => 'procedure to call, e.g. myCloud.rssPleaseNotify' // required
+ * 'protocol' => 'protocol to use, e.g. soap or xml-rpc' // required
+ * ), a cloud to be notified of updates // optional, ignored if atom is used
+ * 'textInput' => array(
+ * 'title' => 'the label of the Submit button in the text input area' // required,
+ * 'description' => 'explains the text input area' // required
+ * 'name' => 'the name of the text object in the text input area' // required
+ * 'link' => 'the URL of the CGI script that processes text input requests' // required
+ * ) // a text input box that can be displayed with the feed // optional, ignored if atom is used
+ * 'skipHours' => array(
+ * 'hour in 24 format', // e.g 13 (1pm)
+ * // up to 24 rows whose value is a number between 0 and 23
+ * ) // Hint telling aggregators which hours they can skip // optional, ignored if atom is used
+ * 'skipDays ' => array(
+ * 'a day to skip', // e.g Monday
+ * // up to 7 rows whose value is a Monday, Tuesday, Wednesday, Thursday, Friday, Saturday or Sunday
+ * ) // Hint telling aggregators which days they can skip // optional, ignored if atom is used
+ * 'itunes' => array(
+ * 'author' => 'Artist column' // optional, default to the main author value
+ * 'owner' => array(
+ * 'name' => 'name of the owner' // optional, default to main author value
+ * 'email' => 'email of the owner' // optional, default to main email value
+ * ) // Owner of the podcast // optional
+ * 'image' => 'album/podcast art' // optional, default to the main image value
+ * 'subtitle' => 'short description' // optional, default to the main description value
+ * 'summary' => 'longer description' // optional, default to the main description value
+ * 'block' => 'Prevent an episode from appearing (yes|no)' // optional
+ * 'category' => array(
+ * array('main' => 'main category', // required
+ * 'sub' => 'sub category' // optional
+ * ),
+ * // up to 3 rows
+ * ) // 'Category column and in iTunes Music Store Browse' // required
+ * 'explicit' => 'parental advisory graphic (yes|no|clean)' // optional
+ * 'keywords' => 'a comma separated list of 12 keywords maximum' // optional
+ * 'new-feed-url' => 'used to inform iTunes of new feed URL location' // optional
+ * ) // Itunes extension data // optional, ignored if atom is used
+ * 'entries' => array(
+ * array(
+ * 'title' => 'title of the feed entry', //required
+ * 'link' => 'url to a feed entry', //required
+ * 'description' => 'short version of a feed entry', // only text, no html, required
+ * 'guid' => 'id of the article, if not given link value will used', //optional
+ * 'content' => 'long version', // can contain html, optional
+ * 'lastUpdate' => 'timestamp of the publication date', // optional
+ * 'comments' => 'comments page of the feed entry', // optional
+ * 'commentRss' => 'the feed url of the associated comments', // optional
+ * 'source' => array(
+ * 'title' => 'title of the original source' // required,
+ * 'url' => 'url of the original source' // required
+ * ) // original source of the feed entry // optional
+ * 'category' => array(
+ * array(
+ * 'term' => 'first category label' // required,
+ * 'scheme' => 'url that identifies a categorization scheme' // optional
+ * ),
+ * array(
+ * //data for the second category and so on
+ * )
+ * ) // list of the attached categories // optional
+ * 'enclosure' => array(
+ * array(
+ * 'url' => 'url of the linked enclosure' // required
+ * 'type' => 'mime type of the enclosure' // optional
+ * 'length' => 'length of the linked content in octets' // optional
+ * ),
+ * array(
+ * //data for the second enclosure and so on
+ * )
+ * ) // list of the enclosures of the feed entry // optional
+ * ),
+ * array(
+ * //data for the second entry and so on
+ * )
+ * )
+ * );
+ * </code>
+ *
+ * @param array $data
+ * @return void
+ */
+ public function __construct(array $data)
+ {
+ $this->_data = $data;
+ $this->_createHeader($data);
+ if (isset($data['entries'])) {
+ $this->_createEntries($data['entries']);
+ }
+ }
+
+ /**
+ * Returns an instance of Zend_Feed_Builder_Header
+ * describing the header of the feed
+ *
+ * @return Zend_Feed_Builder_Header
+ */
+ public function getHeader()
+ {
+ return $this->_header;
+ }
+
+ /**
+ * Returns an array of Zend_Feed_Builder_Entry instances
+ * describing the entries of the feed
+ *
+ * @return array of Zend_Feed_Builder_Entry
+ */
+ public function getEntries()
+ {
+ return $this->_entries;
+ }
+
+ /**
+ * Create the Zend_Feed_Builder_Header instance
+ *
+ * @param array $data
+ * @throws Zend_Feed_Builder_Exception
+ * @return void
+ */
+ private function _createHeader(array $data)
+ {
+ $mandatories = array('title', 'link', 'charset');
+ foreach ($mandatories as $mandatory) {
+ if (!isset($data[$mandatory])) {
+ throw new Zend_Feed_Builder_Exception("$mandatory key is missing");
+ }
+ }
+ $this->_header = new Zend_Feed_Builder_Header($data['title'], $data['link'], $data['charset']);
+ if (isset($data['lastUpdate'])) {
+ $this->_header->setLastUpdate($data['lastUpdate']);
+ }
+ if (isset($data['published'])) {
+ $this->_header->setPublishedDate($data['published']);
+ }
+ if (isset($data['description'])) {
+ $this->_header->setDescription($data['description']);
+ }
+ if (isset($data['author'])) {
+ $this->_header->setAuthor($data['author']);
+ }
+ if (isset($data['email'])) {
+ $this->_header->setEmail($data['email']);
+ }
+ if (isset($data['webmaster'])) {
+ $this->_header->setWebmaster($data['webmaster']);
+ }
+ if (isset($data['copyright'])) {
+ $this->_header->setCopyright($data['copyright']);
+ }
+ if (isset($data['image'])) {
+ $this->_header->setImage($data['image']);
+ }
+ if (isset($data['generator'])) {
+ $this->_header->setGenerator($data['generator']);
+ }
+ if (isset($data['language'])) {
+ $this->_header->setLanguage($data['language']);
+ }
+ if (isset($data['ttl'])) {
+ $this->_header->setTtl($data['ttl']);
+ }
+ if (isset($data['rating'])) {
+ $this->_header->setRating($data['rating']);
+ }
+ if (isset($data['cloud'])) {
+ $mandatories = array('domain', 'path', 'registerProcedure', 'protocol');
+ foreach ($mandatories as $mandatory) {
+ if (!isset($data['cloud'][$mandatory])) {
+ throw new Zend_Feed_Builder_Exception("you have to define $mandatory property of your cloud");
+ }
+ }
+ $uri_str = 'http://' . $data['cloud']['domain'] . $data['cloud']['path'];
+ $this->_header->setCloud($uri_str, $data['cloud']['registerProcedure'], $data['cloud']['protocol']);
+ }
+ if (isset($data['textInput'])) {
+ $mandatories = array('title', 'description', 'name', 'link');
+ foreach ($mandatories as $mandatory) {
+ if (!isset($data['textInput'][$mandatory])) {
+ throw new Zend_Feed_Builder_Exception("you have to define $mandatory property of your textInput");
+ }
+ }
+ $this->_header->setTextInput($data['textInput']['title'],
+ $data['textInput']['description'],
+ $data['textInput']['name'],
+ $data['textInput']['link']);
+ }
+ if (isset($data['skipHours'])) {
+ $this->_header->setSkipHours($data['skipHours']);
+ }
+ if (isset($data['skipDays'])) {
+ $this->_header->setSkipDays($data['skipDays']);
+ }
+ if (isset($data['itunes'])) {
+ $itunes = new Zend_Feed_Builder_Header_Itunes($data['itunes']['category']);
+ if (isset($data['itunes']['author'])) {
+ $itunes->setAuthor($data['itunes']['author']);
+ }
+ if (isset($data['itunes']['owner'])) {
+ $name = isset($data['itunes']['owner']['name']) ? $data['itunes']['owner']['name'] : '';
+ $email = isset($data['itunes']['owner']['email']) ? $data['itunes']['owner']['email'] : '';
+ $itunes->setOwner($name, $email);
+ }
+ if (isset($data['itunes']['image'])) {
+ $itunes->setImage($data['itunes']['image']);
+ }
+ if (isset($data['itunes']['subtitle'])) {
+ $itunes->setSubtitle($data['itunes']['subtitle']);
+ }
+ if (isset($data['itunes']['summary'])) {
+ $itunes->setSummary($data['itunes']['summary']);
+ }
+ if (isset($data['itunes']['block'])) {
+ $itunes->setBlock($data['itunes']['block']);
+ }
+ if (isset($data['itunes']['explicit'])) {
+ $itunes->setExplicit($data['itunes']['explicit']);
+ }
+ if (isset($data['itunes']['keywords'])) {
+ $itunes->setKeywords($data['itunes']['keywords']);
+ }
+ if (isset($data['itunes']['new-feed-url'])) {
+ $itunes->setNewFeedUrl($data['itunes']['new-feed-url']);
+ }
+
+ $this->_header->setITunes($itunes);
+ }
+ }
+
+ /**
+ * Create the array of article entries
+ *
+ * @param array $data
+ * @throws Zend_Feed_Builder_Exception
+ * @return void
+ */
+ private function _createEntries(array $data)
+ {
+ foreach ($data as $row) {
+ $mandatories = array('title', 'link', 'description');
+ foreach ($mandatories as $mandatory) {
+ if (!isset($row[$mandatory])) {
+ throw new Zend_Feed_Builder_Exception("$mandatory key is missing");
+ }
+ }
+ $entry = new Zend_Feed_Builder_Entry($row['title'], $row['link'], $row['description']);
+ if (isset($row['guid'])) {
+ $entry->setId($row['guid']);
+ }
+ if (isset($row['content'])) {
+ $entry->setContent($row['content']);
+ }
+ if (isset($row['lastUpdate'])) {
+ $entry->setLastUpdate($row['lastUpdate']);
+ }
+ if (isset($row['comments'])) {
+ $entry->setCommentsUrl($row['comments']);
+ }
+ if (isset($row['commentRss'])) {
+ $entry->setCommentsRssUrl($row['commentRss']);
+ }
+ if (isset($row['source'])) {
+ $mandatories = array('title', 'url');
+ foreach ($mandatories as $mandatory) {
+ if (!isset($row['source'][$mandatory])) {
+ throw new Zend_Feed_Builder_Exception("$mandatory key of source property is missing");
+ }
+ }
+ $entry->setSource($row['source']['title'], $row['source']['url']);
+ }
+ if (isset($row['category'])) {
+ $entry->setCategories($row['category']);
+ }
+ if (isset($row['enclosure'])) {
+ $entry->setEnclosures($row['enclosure']);
+ }
+
+ $this->_entries[] = $entry;
+ }
+ }
+} \ No newline at end of file
diff --git a/libs/Zend/Feed/Builder/Entry.php b/libs/Zend/Feed/Builder/Entry.php
new file mode 100755
index 0000000000..f895f0d08c
--- /dev/null
+++ b/libs/Zend/Feed/Builder/Entry.php
@@ -0,0 +1,283 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Entry.php 3941 2007-03-14 21:36:13Z darby $
+ */
+
+
+/**
+ * @see Zend_Feed_Builder_Exception
+ */
+require_once 'Zend/Feed/Builder/Exception.php';
+
+
+/**
+ * An entry of a custom build feed
+ *
+ * Classes implementing the Zend_Feed_Builder_Interface interface
+ * uses this class to describe an entry of a feed
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Feed_Builder_Entry extends ArrayObject
+{
+ /**
+ * Create a new builder entry
+ *
+ * @param string $title
+ * @param string $link
+ * @param string $description short version of the entry, no html
+ * @return void
+ */
+ public function __construct($title, $link, $description)
+ {
+ $this->offsetSet('title', $title);
+ $this->offsetSet('link', $link);
+ $this->offsetSet('description', $description);
+ $this->setLastUpdate(time());
+ }
+
+ /**
+ * Read only properties accessor
+ *
+ * @param string $name property to read
+ * @return mixed
+ */
+ public function __get($name)
+ {
+ if (!$this->offsetExists($name)) {
+ return NULL;
+ }
+
+ return $this->offsetGet($name);
+ }
+
+ /**
+ * Write properties accessor
+ *
+ * @param string $name name of the property to set
+ * @param mixed $value value to set
+ * @return void
+ */
+ public function __set($name, $value)
+ {
+ $this->offsetSet($name, $value);
+ }
+
+ /**
+ * Isset accessor
+ *
+ * @param string $key
+ * @return boolean
+ */
+ public function __isset($key)
+ {
+ return $this->offsetExists($key);
+ }
+
+ /**
+ * Unset accessor
+ *
+ * @param string $key
+ * @return void
+ */
+ public function __unset($key)
+ {
+ if ($this->offsetExists($key)) {
+ $this->offsetUnset($key);
+ }
+ }
+
+ /**
+ * Sets the id/guid of the entry
+ *
+ * @param string $id
+ * @return Zend_Feed_Builder_Entry
+ */
+ public function setId($id)
+ {
+ $this->offsetSet('guid', $id);
+ return $this;
+ }
+
+ /**
+ * Sets the full html content of the entry
+ *
+ * @param string $content
+ * @return Zend_Feed_Builder_Entry
+ */
+ public function setContent($content)
+ {
+ $this->offsetSet('content', $content);
+ return $this;
+ }
+
+ /**
+ * Timestamp of the update date
+ *
+ * @param int $lastUpdate
+ * @return Zend_Feed_Builder_Entry
+ */
+ public function setLastUpdate($lastUpdate)
+ {
+ $this->offsetSet('lastUpdate', $lastUpdate);
+ return $this;
+ }
+
+ /**
+ * Sets the url of the commented page associated to the entry
+ *
+ * @param string $comments
+ * @return Zend_Feed_Builder_Entry
+ */
+ public function setCommentsUrl($comments)
+ {
+ $this->offsetSet('comments', $comments);
+ return $this;
+ }
+
+ /**
+ * Sets the url of the comments feed link
+ *
+ * @param string $commentRss
+ * @return Zend_Feed_Builder_Entry
+ */
+ public function setCommentsRssUrl($commentRss)
+ {
+ $this->offsetSet('commentRss', $commentRss);
+ return $this;
+ }
+
+ /**
+ * Defines a reference to the original source
+ *
+ * @param string $title
+ * @param string $url
+ * @return Zend_Feed_Builder_Entry
+ */
+ public function setSource($title, $url)
+ {
+ $this->offsetSet('source', array('title' => $title,
+ 'url' => $url));
+ return $this;
+ }
+
+ /**
+ * Sets the categories of the entry
+ * Format of the array:
+ * <code>
+ * array(
+ * array(
+ * 'term' => 'first category label',
+ * 'scheme' => 'url that identifies a categorization scheme' // optional
+ * ),
+ * // second category and so one
+ * )
+ * </code>
+ *
+ * @param array $categories
+ * @return Zend_Feed_Builder_Entry
+ */
+ public function setCategories(array $categories)
+ {
+ foreach ($categories as $category) {
+ $this->addCategory($category);
+ }
+ return $this;
+ }
+
+ /**
+ * Add a category to the entry
+ *
+ * @param array $category see Zend_Feed_Builder_Entry::setCategories() for format
+ * @return Zend_Feed_Builder_Entry
+ * @throws Zend_Feed_Builder_Exception
+ */
+ public function addCategory(array $category)
+ {
+ if (empty($category['term'])) {
+ throw new Zend_Feed_Builder_Exception("you have to define the name of the category");
+ }
+
+ if (!$this->offsetExists('category')) {
+ $categories = array($category);
+ } else {
+ $categories = $this->offsetGet('category');
+ $categories[] = $category;
+ }
+ $this->offsetSet('category', $categories);
+ return $this;
+ }
+
+ /**
+ * Sets the enclosures of the entry
+ * Format of the array:
+ * <code>
+ * array(
+ * array(
+ * 'url' => 'url of the linked enclosure',
+ * 'type' => 'mime type of the enclosure' // optional
+ * 'length' => 'length of the linked content in octets' // optional
+ * ),
+ * // second enclosure and so one
+ * )
+ * </code>
+ *
+ * @param array $enclosures
+ * @return Zend_Feed_Builder_Entry
+ * @throws Zend_Feed_Builder_Exception
+ */
+ public function setEnclosures(array $enclosures)
+ {
+ foreach ($enclosures as $enclosure) {
+ if (empty($enclosure['url'])) {
+ throw new Zend_Feed_Builder_Exception("you have to supply an url for your enclosure");
+ }
+ $type = isset($enclosure['type']) ? $enclosure['type'] : '';
+ $length = isset($enclosure['length']) ? $enclosure['length'] : '';
+ $this->addEnclosure($enclosure['url'], $type, $length);
+ }
+ return $this;
+ }
+
+ /**
+ * Add an enclosure to the entry
+ *
+ * @param string $url
+ * @param string $type
+ * @param string $length
+ * @return Zend_Feed_Builder_Entry
+ */
+ public function addEnclosure($url, $type = '', $length = '')
+ {
+ if (!$this->offsetExists('enclosure')) {
+ $enclosure = array();
+ } else {
+ $enclosure = $this->offsetGet('enclosure');
+ }
+ $enclosure[] = array('url' => $url,
+ 'type' => $type,
+ 'length' => $length);
+ $this->offsetSet('enclosure', $enclosure);
+ return $this;
+ }
+}
diff --git a/libs/Zend/Feed/Builder/Exception.php b/libs/Zend/Feed/Builder/Exception.php
new file mode 100755
index 0000000000..a9b9c0ccf3
--- /dev/null
+++ b/libs/Zend/Feed/Builder/Exception.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Exception.php 3941 2007-03-14 21:36:13Z darby $
+ */
+
+
+/**
+ * @see Zend_Feed_Exception
+ */
+require_once 'Zend/Feed/Exception.php';
+
+
+/**
+ * Zend_Feed_Builder exception class
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Feed_Builder_Exception extends Zend_Feed_Exception
+{
+}
diff --git a/libs/Zend/Feed/Builder/Header.php b/libs/Zend/Feed/Builder/Header.php
new file mode 100755
index 0000000000..57e3df7150
--- /dev/null
+++ b/libs/Zend/Feed/Builder/Header.php
@@ -0,0 +1,396 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Header.php 3941 2007-03-14 21:36:13Z darby $
+ */
+
+
+/**
+ * @see Zend_Loader
+ */
+require_once 'Zend/Loader.php';
+
+
+/**
+ * @see Zend_Feed_Builder_Exception
+ */
+require_once 'Zend/Feed/Builder/Exception.php';
+
+
+/**
+ * @see Zend_Feed_Builder_Header_Itunes
+ */
+require_once 'Zend/Feed/Builder/Header/Itunes.php';
+
+
+/**
+ * @see Zend_Uri
+ */
+require_once 'Zend/Uri.php';
+
+
+/**
+ * Header of a custom build feed
+ *
+ * Classes implementing the Zend_Feed_Builder_Interface interface
+ * uses this class to describe the header of a feed
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Feed_Builder_Header extends ArrayObject
+{
+ /**
+ * Constructor
+ *
+ * @param string $title title of the feed
+ * @param string $link canonical url of the feed
+ * @param string $charset charset of the textual data
+ * @return void
+ */
+ public function __construct($title, $link, $charset = 'utf-8')
+ {
+ $this->offsetSet('title', $title);
+ $this->offsetSet('link', $link);
+ $this->offsetSet('charset', $charset);
+ $this->setLastUpdate(time())
+ ->setGenerator('Zend_Feed');
+ }
+
+ /**
+ * Read only properties accessor
+ *
+ * @param string $name property to read
+ * @return mixed
+ */
+ public function __get($name)
+ {
+ if (!$this->offsetExists($name)) {
+ return NULL;
+ }
+
+ return $this->offsetGet($name);
+ }
+
+ /**
+ * Write properties accessor
+ *
+ * @param string $name name of the property to set
+ * @param mixed $value value to set
+ * @return void
+ */
+ public function __set($name, $value)
+ {
+ $this->offsetSet($name, $value);
+ }
+
+ /**
+ * Isset accessor
+ *
+ * @param string $key
+ * @return boolean
+ */
+ public function __isset($key)
+ {
+ return $this->offsetExists($key);
+ }
+
+ /**
+ * Unset accessor
+ *
+ * @param string $key
+ * @return void
+ */
+ public function __unset($key)
+ {
+ if ($this->offsetExists($key)) {
+ $this->offsetUnset($key);
+ }
+ }
+
+ /**
+ * Timestamp of the update date
+ *
+ * @param int $lastUpdate
+ * @return Zend_Feed_Builder_Header
+ */
+ public function setLastUpdate($lastUpdate)
+ {
+ $this->offsetSet('lastUpdate', $lastUpdate);
+ return $this;
+ }
+
+ /**
+ * Timestamp of the publication date
+ *
+ * @param int $published
+ * @return Zend_Feed_Builder_Header
+ */
+ public function setPublishedDate($published)
+ {
+ $this->offsetSet('published', $published);
+ return $this;
+ }
+
+ /**
+ * Short description of the feed
+ *
+ * @param string $description
+ * @return Zend_Feed_Builder_Header
+ */
+ public function setDescription($description)
+ {
+ $this->offsetSet('description', $description);
+ return $this;
+ }
+
+ /**
+ * Sets the author of the feed
+ *
+ * @param string $author
+ * @return Zend_Feed_Builder_Header
+ */
+ public function setAuthor($author)
+ {
+ $this->offsetSet('author', $author);
+ return $this;
+ }
+
+ /**
+ * Sets the author's email
+ *
+ * @param string $email
+ * @return Zend_Feed_Builder_Header
+ * @throws Zend_Feed_Builder_Exception
+ */
+ public function setEmail($email)
+ {
+ Zend_Loader::loadClass('Zend_Validate_EmailAddress');
+ $validate = new Zend_Validate_EmailAddress();
+ if (!$validate->isValid($email)) {
+ throw new Zend_Feed_Builder_Exception("you have to set a valid email address into the email property");
+ }
+ $this->offsetSet('email', $email);
+ return $this;
+ }
+
+ /**
+ * Sets the copyright notice
+ *
+ * @param string $copyright
+ * @return Zend_Feed_Builder_Header
+ */
+ public function setCopyright($copyright)
+ {
+ $this->offsetSet('copyright', $copyright);
+ return $this;
+ }
+
+ /**
+ * Sets the image of the feed
+ *
+ * @param string $image
+ * @return Zend_Feed_Builder_Header
+ */
+ public function setImage($image)
+ {
+ $this->offsetSet('image', $image);
+ return $this;
+ }
+
+ /**
+ * Sets the generator of the feed
+ *
+ * @param string $generator
+ * @return Zend_Feed_Builder_Header
+ */
+ public function setGenerator($generator)
+ {
+ $this->offsetSet('generator', $generator);
+ return $this;
+ }
+
+ /**
+ * Sets the language of the feed
+ *
+ * @param string $language
+ * @return Zend_Feed_Builder_Header
+ */
+ public function setLanguage($language)
+ {
+ $this->offsetSet('language', $language);
+ return $this;
+ }
+
+ /**
+ * Email address for person responsible for technical issues
+ * Ignored if atom is used
+ *
+ * @param string $webmaster
+ * @return Zend_Feed_Builder_Header
+ * @throws Zend_Feed_Builder_Exception
+ */
+ public function setWebmaster($webmaster)
+ {
+ Zend_Loader::loadClass('Zend_Validate_EmailAddress');
+ $validate = new Zend_Validate_EmailAddress();
+ if (!$validate->isValid($webmaster)) {
+ throw new Zend_Feed_Builder_Exception("you have to set a valid email address into the webmaster property");
+ }
+ $this->offsetSet('webmaster', $webmaster);
+ return $this;
+ }
+
+ /**
+ * How long in minutes a feed can be cached before refreshing
+ * Ignored if atom is used
+ *
+ * @param int $ttl
+ * @return Zend_Feed_Builder_Header
+ * @throws Zend_Feed_Builder_Exception
+ */
+ public function setTtl($ttl)
+ {
+ Zend_Loader::loadClass('Zend_Validate_Int');
+ $validate = new Zend_Validate_Int();
+ if (!$validate->isValid($ttl)) {
+ throw new Zend_Feed_Builder_Exception("you have to set an integer value to the ttl property");
+ }
+ $this->offsetSet('ttl', $ttl);
+ return $this;
+ }
+
+ /**
+ * PICS rating for the feed
+ * Ignored if atom is used
+ *
+ * @param string $rating
+ * @return Zend_Feed_Builder_Header
+ */
+ public function setRating($rating)
+ {
+ $this->offsetSet('rating', $rating);
+ return $this;
+ }
+
+ /**
+ * Cloud to be notified of updates of the feed
+ * Ignored if atom is used
+ *
+ * @param string|Zend_Uri_Http $uri
+ * @param string $procedure procedure to call, e.g. myCloud.rssPleaseNotify
+ * @param string $protocol protocol to use, e.g. soap or xml-rpc
+ * @return Zend_Feed_Builder_Header
+ * @throws Zend_Feed_Builder_Exception
+ */
+ public function setCloud($uri, $procedure, $protocol)
+ {
+ if (is_string($uri) && Zend_Uri_Http::check($uri)) {
+ $uri = Zend_Uri::factory($uri);
+ }
+ if (!$uri instanceof Zend_Uri_Http) {
+ throw new Zend_Feed_Builder_Exception('Passed parameter is not a valid HTTP URI');
+ }
+ if (!$uri->getPort()) {
+ $uri->setPort(80);
+ }
+ $this->offsetSet('cloud', array('uri' => $uri,
+ 'procedure' => $procedure,
+ 'protocol' => $protocol));
+ return $this;
+ }
+
+ /**
+ * A text input box that can be displayed with the feed
+ * Ignored if atom is used
+ *
+ * @param string $title the label of the Submit button in the text input area
+ * @param string $description explains the text input area
+ * @param string $name the name of the text object in the text input area
+ * @param string $link the URL of the CGI script that processes text input requests
+ * @return Zend_Feed_Builder_Header
+ */
+ public function setTextInput($title, $description, $name, $link)
+ {
+ $this->offsetSet('textInput', array('title' => $title,
+ 'description' => $description,
+ 'name' => $name,
+ 'link' => $link));
+ return $this;
+ }
+
+ /**
+ * Hint telling aggregators which hours they can skip
+ * Ignored if atom is used
+ *
+ * @param array $hours list of hours in 24 format
+ * @return Zend_Feed_Builder_Header
+ * @throws Zend_Feed_Builder_Exception
+ */
+ public function setSkipHours(array $hours)
+ {
+ if (count($hours) > 24) {
+ throw new Zend_Feed_Builder_Exception("you can not have more than 24 rows in the skipHours property");
+ }
+ foreach ($hours as $hour) {
+ if ($hour < 0 || $hour > 23) {
+ throw new Zend_Feed_Builder_Exception("$hour has te be between 0 and 23");
+ }
+ }
+ $this->offsetSet('skipHours', $hours);
+ return $this;
+ }
+
+ /**
+ * Hint telling aggregators which days they can skip
+ * Ignored if atom is used
+ *
+ * @param array $days list of days to skip, e.g. Monday
+ * @return Zend_Feed_Builder_Header
+ * @throws Zend_Feed_Builder_Exception
+ */
+ public function setSkipDays(array $days)
+ {
+ if (count($days) > 7) {
+ throw new Zend_Feed_Builder_Exception("you can not have more than 7 days in the skipDays property");
+ }
+ $valid = array('monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday');
+ foreach ($days as $day) {
+ if (!in_array(strtolower($day), $valid)) {
+ throw new Zend_Feed_Builder_Exception("$day is not a valid day");
+ }
+ }
+ $this->offsetSet('skipDays', $days);
+ return $this;
+ }
+
+ /**
+ * Sets the iTunes rss extension
+ *
+ * @param Zend_Feed_Builder_Header_Itunes $itunes
+ * @return Zend_Feed_Builder_Header
+ */
+ public function setITunes(Zend_Feed_Builder_Header_Itunes $itunes)
+ {
+ $this->offsetSet('itunes', $itunes);
+ return $this;
+ }
+}
diff --git a/libs/Zend/Feed/Builder/Header/Itunes.php b/libs/Zend/Feed/Builder/Header/Itunes.php
new file mode 100755
index 0000000000..2480b201bf
--- /dev/null
+++ b/libs/Zend/Feed/Builder/Header/Itunes.php
@@ -0,0 +1,267 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Itunes.php 3941 2007-03-14 21:36:13Z darby $
+ */
+
+
+/**
+ * @see Zend_Feed_Builder_Exception
+ */
+require_once 'Zend/Feed/Builder/Exception.php';
+
+
+/**
+ * ITunes rss extension
+ *
+ * Classes used to describe the itunes channel extension
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Feed_Builder_Header_Itunes extends ArrayObject
+{
+ /**
+ * Constructor
+ *
+ * @param array $categories Categories columns and in iTunes Music Store Browse
+ * @return void
+ */
+ public function __construct(array $categories)
+ {
+ $this->setCategories($categories);
+ }
+
+ /**
+ * Sets the categories column and in iTunes Music Store Browse
+ * $categories must conform to the following format:
+ * <code>
+ * array(array('main' => 'main category',
+ * 'sub' => 'sub category' // optionnal
+ * ),
+ * // up to 3 rows
+ * )
+ * </code>
+ *
+ * @param array $categories
+ * @return Zend_Feed_Builder_Header_Itunes
+ * @throws Zend_Feed_Builder_Exception
+ */
+ public function setCategories(array $categories)
+ {
+ $nb = count($categories);
+ if (0 === $nb) {
+ throw new Zend_Feed_Builder_Exception("you have to set at least one itunes category");
+ }
+ if ($nb > 3) {
+ throw new Zend_Feed_Builder_Exception("you have to set at most three itunes categories");
+ }
+ foreach ($categories as $i => $category) {
+ if (empty($category['main'])) {
+ throw new Zend_Feed_Builder_Exception("you have to set the main category (category #$i)");
+ }
+ }
+ $this->offsetSet('category', $categories);
+ return $this;
+ }
+
+ /**
+ * Sets the artist value, default to the feed's author value
+ *
+ * @param string $author
+ * @return Zend_Feed_Builder_Header_Itunes
+ */
+ public function setAuthor($author)
+ {
+ $this->offsetSet('author', $author);
+ return $this;
+ }
+
+ /**
+ * Sets the owner of the postcast
+ *
+ * @param string $name default to the feed's author value
+ * @param string $email default to the feed's email value
+ * @return Zend_Feed_Builder_Header_Itunes
+ * @throws Zend_Feed_Builder_Exception
+ */
+ public function setOwner($name = '', $email = '')
+ {
+ if (!empty($email)) {
+ Zend_Loader::loadClass('Zend_Validate_EmailAddress');
+ $validate = new Zend_Validate_EmailAddress();
+ if (!$validate->isValid($email)) {
+ throw new Zend_Feed_Builder_Exception("you have to set a valid email address into the itunes owner's email property");
+ }
+ }
+ $this->offsetSet('owner', array('name' => $name, 'email' => $email));
+ return $this;
+ }
+
+ /**
+ * Sets the album/podcast art picture
+ * Default to the feed's image value
+ *
+ * @param string $image
+ * @return Zend_Feed_Builder_Header_Itunes
+ */
+ public function setImage($image)
+ {
+ $this->offsetSet('image', $image);
+ return $this;
+ }
+
+ /**
+ * Sets the short description of the podcast
+ * Default to the feed's description
+ *
+ * @param string $subtitle
+ * @return Zend_Feed_Builder_Header_Itunes
+ */
+ public function setSubtitle($subtitle)
+ {
+ $this->offsetSet('subtitle', $subtitle);
+ return $this;
+ }
+
+ /**
+ * Sets the longer description of the podcast
+ * Default to the feed's description
+ *
+ * @param string $summary
+ * @return Zend_Feed_Builder_Header_Itunes
+ */
+ public function setSummary($summary)
+ {
+ $this->offsetSet('summary', $summary);
+ return $this;
+ }
+
+ /**
+ * Prevent a feed from appearing
+ *
+ * @param string $block can be 'yes' or 'no'
+ * @return Zend_Feed_Builder_Header_Itunes
+ * @throws Zend_Feed_Builder_Exception
+ */
+ public function setBlock($block)
+ {
+ $block = strtolower($block);
+ if (!in_array($block, array('yes', 'no'))) {
+ throw new Zend_Feed_Builder_Exception("you have to set yes or no to the itunes block property");
+ }
+ $this->offsetSet('block', $block);
+ return $this;
+ }
+
+ /**
+ * Configuration of the parental advisory graphic
+ *
+ * @param string $explicit can be 'yes', 'no' or 'clean'
+ * @return Zend_Feed_Builder_Header_Itunes
+ * @throws Zend_Feed_Builder_Exception
+ */
+ public function setExplicit($explicit)
+ {
+ $explicit = strtolower($explicit);
+ if (!in_array($explicit, array('yes', 'no', 'clean'))) {
+ throw new Zend_Feed_Builder_Exception("you have to set yes, no or clean to the itunes explicit property");
+ }
+ $this->offsetSet('explicit', $explicit);
+ return $this;
+ }
+
+ /**
+ * Sets a comma separated list of 12 keywords maximum
+ *
+ * @param string $keywords
+ * @return Zend_Feed_Builder_Header_Itunes
+ */
+ public function setKeywords($keywords)
+ {
+ $this->offsetSet('keywords', $keywords);
+ return $this;
+ }
+
+ /**
+ * Sets the new feed URL location
+ *
+ * @param string $url
+ * @return Zend_Feed_Builder_Header_Itunes
+ */
+ public function setNewFeedUrl($url)
+ {
+ $this->offsetSet('new_feed_url', $url);
+ return $this;
+ }
+
+ /**
+ * Read only properties accessor
+ *
+ * @param string $name property to read
+ * @return mixed
+ */
+ public function __get($name)
+ {
+ if (!$this->offsetExists($name)) {
+ return NULL;
+ }
+
+ return $this->offsetGet($name);
+ }
+
+ /**
+ * Write properties accessor
+ *
+ * @param string $name name of the property to set
+ * @param mixed $value value to set
+ * @return void
+ */
+ public function __set($name, $value)
+ {
+ $this->offsetSet($name, $value);
+ }
+
+ /**
+ * Isset accessor
+ *
+ * @param string $key
+ * @return boolean
+ */
+ public function __isset($key)
+ {
+ return $this->offsetExists($key);
+ }
+
+ /**
+ * Unset accessor
+ *
+ * @param string $key
+ * @return void
+ */
+ public function __unset($key)
+ {
+ if ($this->offsetExists($key)) {
+ $this->offsetUnset($key);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/libs/Zend/Feed/Builder/Interface.php b/libs/Zend/Feed/Builder/Interface.php
new file mode 100755
index 0000000000..7471a4daca
--- /dev/null
+++ b/libs/Zend/Feed/Builder/Interface.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 3941 2007-03-14 21:36:13Z darby $
+ */
+
+
+/**
+ * Input feed data interface
+ *
+ * Classes implementing this interface can be passe to Zend_Feed::importBuilder
+ * as an input data source for the Zend_Feed construction
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Feed_Builder_Interface
+{
+ /**
+ * Returns an instance of Zend_Feed_Builder_Header
+ * describing the header of the feed
+ *
+ * @return Zend_Feed_Builder_Header
+ */
+ public function getHeader();
+
+ /**
+ * Returns an array of Zend_Feed_Builder_Entry instances
+ * describing the entries of the feed
+ *
+ * @return array of Zend_Feed_Builder_Entry
+ */
+ public function getEntries();
+}
diff --git a/libs/Zend/Feed/Element.php b/libs/Zend/Feed/Element.php
new file mode 100755
index 0000000000..d4bece584d
--- /dev/null
+++ b/libs/Zend/Feed/Element.php
@@ -0,0 +1,403 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Element.php 3941 2007-03-14 21:36:13Z darby $
+ */
+
+
+/**
+ * Wraps a DOMElement allowing for SimpleXML-like access to attributes.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Feed_Element implements ArrayAccess
+{
+
+ /**
+ * @var DOMElement
+ */
+ protected $_element;
+
+ /**
+ * @var Zend_Feed_Element
+ */
+ protected $_parentElement;
+
+ /**
+ * @var boolean
+ */
+ protected $_appended = true;
+
+
+ /**
+ * Zend_Feed_Element constructor.
+ *
+ * @param DOMElement $element The DOM element we're encapsulating.
+ * @return void
+ */
+ public function __construct($element = null)
+ {
+ $this->_element = $element;
+ }
+
+
+ /**
+ * Get a DOM representation of the element
+ *
+ * Returns the underlying DOM object, which can then be
+ * manipulated with full DOM methods.
+ *
+ * @return DOMDocument
+ */
+ public function getDOM()
+ {
+ return $this->_element;
+ }
+
+
+ /**
+ * Update the object from a DOM element
+ *
+ * Take a DOMElement object, which may be originally from a call
+ * to getDOM() or may be custom created, and use it as the
+ * DOM tree for this Zend_Feed_Element.
+ *
+ * @param DOMElement $element
+ * @return void
+ */
+ public function setDOM(DOMElement $element)
+ {
+ $this->_element = $this->_element->ownerDocument->importNode($element, true);
+ }
+
+ /**
+ * Set the parent element of this object to another
+ * Zend_Feed_Element.
+ *
+ * @param Zend_Feed_Element $element
+ * @return void
+ */
+ public function setParent(Zend_Feed_Element $element)
+ {
+ $this->_parentElement = $element;
+ $this->_appended = false;
+ }
+
+
+ /**
+ * Appends this element to its parent if necessary.
+ *
+ * @return void
+ */
+ protected function ensureAppended()
+ {
+ if (!$this->_appended) {
+ $this->_parentElement->getDOM()->appendChild($this->_element);
+ $this->_appended = true;
+ $this->_parentElement->ensureAppended();
+ }
+ }
+
+
+ /**
+ * Get an XML string representation of this element
+ *
+ * Returns a string of this element's XML, including the XML
+ * prologue.
+ *
+ * @return string
+ */
+ public function saveXML()
+ {
+ // Return a complete document including XML prologue.
+ $doc = new DOMDocument($this->_element->ownerDocument->version,
+ $this->_element->ownerDocument->actualEncoding);
+ $doc->appendChild($doc->importNode($this->_element, true));
+ return $doc->saveXML();
+ }
+
+
+ /**
+ * Get the XML for only this element
+ *
+ * Returns a string of this element's XML without prologue.
+ *
+ * @return string
+ */
+ public function saveXMLFragment()
+ {
+ return $this->_element->ownerDocument->saveXML($this->_element);
+ }
+
+
+ /**
+ * Map variable access onto the underlying entry representation.
+ *
+ * Get-style access returns a Zend_Feed_Element representing the
+ * child element accessed. To get string values, use method syntax
+ * with the __call() overriding.
+ *
+ * @param string $var The property to access.
+ * @return mixed
+ */
+ public function __get($var)
+ {
+ $nodes = $this->_children($var);
+ $length = count($nodes);
+
+ if ($length == 1) {
+ return new Zend_Feed_Element($nodes[0]);
+ } elseif ($length > 1) {
+ return array_map(create_function('$e', 'return new Zend_Feed_Element($e);'), $nodes);
+ } else {
+ // When creating anonymous nodes for __set chaining, don't
+ // call appendChild() on them. Instead we pass the current
+ // element to them as an extra reference; the child is
+ // then responsible for appending itself when it is
+ // actually set. This way "if ($foo->bar)" doesn't create
+ // a phantom "bar" element in our tree.
+ if (strpos($var, ':') !== false) {
+ list($ns, $elt) = explode(':', $var, 2);
+ $node = $this->_element->ownerDocument->createElementNS(Zend_Feed::lookupNamespace($ns), $elt);
+ } else {
+ $node = $this->_element->ownerDocument->createElement($var);
+ }
+ $node = new Zend_Feed_Element($node);
+ $node->setParent($this);
+ return $node;
+ }
+ }
+
+
+ /**
+ * Map variable sets onto the underlying entry representation.
+ *
+ * @param string $var The property to change.
+ * @param string $val The property's new value.
+ * @return void
+ */
+ public function __set($var, $val)
+ {
+ $this->ensureAppended();
+
+ $nodes = $this->_children($var);
+ if (!$nodes) {
+ if (strpos($var, ':') !== false) {
+ list($ns, $elt) = explode(':', $var, 2);
+ $node = $this->_element->ownerDocument->createElementNS(Zend_Feed::lookupNamespace($ns), $var, $val);
+ $this->_element->appendChild($node);
+ } else {
+ $node = $this->_element->ownerDocument->createElement($var, $val);
+ $this->_element->appendChild($node);
+ }
+ } elseif (count($nodes) > 1) {
+ throw new Zend_Feed_Exception('Cannot set the value of multiple tags simultaneously.');
+ } else {
+ $nodes[0]->nodeValue = $val;
+ }
+ }
+
+
+ /**
+ * Map isset calls onto the underlying entry representation.
+ *
+ * @param string $var
+ * @return boolean
+ */
+ public function __isset($var)
+ {
+ // Look for access of the form {ns:var}. We don't use
+ // _children() here because we can break out of the loop
+ // immediately once we find something.
+ if (strpos($var, ':') !== false) {
+ list($ns, $elt) = explode(':', $var, 2);
+ foreach ($this->_element->childNodes as $child) {
+ if ($child->localName == $elt && $child->prefix == $ns) {
+ return true;
+ }
+ }
+ } else {
+ foreach ($this->_element->childNodes as $child) {
+ if ($child->localName == $var) {
+ return true;
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Get the value of an element with method syntax.
+ *
+ * Map method calls to get the string value of the requested
+ * element. If there are multiple elements that match, this will
+ * return an array of those objects.
+ *
+ * @param string $var The element to get the string value of.
+ * @param mixed $unused This parameter is not used.
+ * @return mixed The node's value, null, or an array of nodes.
+ */
+ public function __call($var, $unused)
+ {
+ $nodes = $this->_children($var);
+
+ if (!$nodes) {
+ return null;
+ } elseif (count($nodes) > 1) {
+ return $nodes;
+ } else {
+ return $nodes[0]->nodeValue;
+ }
+ }
+
+
+ /**
+ * Remove all children matching $var.
+ *
+ * @param string $var
+ * @return void
+ */
+ public function __unset($var)
+ {
+ $nodes = $this->_children($var);
+ foreach ($nodes as $node) {
+ $parent = $node->parentNode;
+ $parent->removeChild($node);
+ }
+ }
+
+
+ /**
+ * Returns the nodeValue of this element when this object is used
+ * in a string context.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->_element->nodeValue;
+ }
+
+
+ /**
+ * Finds children with tagnames matching $var
+ *
+ * Similar to SimpleXML's children() method.
+ *
+ * @param string $var Tagname to match, can be either namespace:tagName or just tagName.
+ * @return array
+ */
+ protected function _children($var)
+ {
+ $found = array();
+
+ // Look for access of the form {ns:var}.
+ if (strpos($var, ':') !== false) {
+ list($ns, $elt) = explode(':', $var, 2);
+ foreach ($this->_element->childNodes as $child) {
+ if ($child->localName == $elt && $child->prefix == $ns) {
+ $found[] = $child;
+ }
+ }
+ } else {
+ foreach ($this->_element->childNodes as $child) {
+ if ($child->localName == $var) {
+ $found[] = $child;
+ }
+ }
+ }
+
+ return $found;
+ }
+
+
+ /**
+ * Required by the ArrayAccess interface.
+ *
+ * @param string $offset
+ * @return boolean
+ */
+ public function offsetExists($offset)
+ {
+ if (strpos($offset, ':') !== false) {
+ list($ns, $attr) = explode(':', $offset, 2);
+ return $this->_element->hasAttributeNS(Zend_Feed::lookupNamespace($ns), $attr);
+ } else {
+ return $this->_element->hasAttribute($offset);
+ }
+ }
+
+
+ /**
+ * Required by the ArrayAccess interface.
+ *
+ * @param string $offset
+ * @return string
+ */
+ public function offsetGet($offset)
+ {
+ if (strpos($offset, ':') !== false) {
+ list($ns, $attr) = explode(':', $offset, 2);
+ return $this->_element->getAttributeNS(Zend_Feed::lookupNamespace($ns), $attr);
+ } else {
+ return $this->_element->getAttribute($offset);
+ }
+ }
+
+
+ /**
+ * Required by the ArrayAccess interface.
+ *
+ * @param string $offset
+ * @param string $value
+ * @return string
+ */
+ public function offsetSet($offset, $value)
+ {
+ $this->ensureAppended();
+
+ if (strpos($offset, ':') !== false) {
+ list($ns, $attr) = explode(':', $offset, 2);
+ return $this->_element->setAttributeNS(Zend_Feed::lookupNamespace($ns), $attr, $value);
+ } else {
+ return $this->_element->setAttribute($offset, $value);
+ }
+ }
+
+
+ /**
+ * Required by the ArrayAccess interface.
+ *
+ * @param string $offset
+ * @return boolean
+ */
+ public function offsetUnset($offset)
+ {
+ if (strpos($offset, ':') !== false) {
+ list($ns, $attr) = explode(':', $offset, 2);
+ return $this->_element->removeAttributeNS(Zend_Feed::lookupNamespace($ns), $attr);
+ } else {
+ return $this->_element->removeAttribute($offset);
+ }
+ }
+
+}
diff --git a/libs/Zend/Feed/Entry/Abstract.php b/libs/Zend/Feed/Entry/Abstract.php
new file mode 100755
index 0000000000..84a215427f
--- /dev/null
+++ b/libs/Zend/Feed/Entry/Abstract.php
@@ -0,0 +1,106 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id:$
+ */
+
+
+/**
+ * @see Zend_Feed
+ */
+require_once 'Zend/Feed.php';
+
+/**
+ * @see Zend_Feed_Element
+ */
+require_once 'Zend/Feed/Element.php';
+
+
+/**
+ * Zend_Feed_Entry_Abstract represents a single entry in an Atom or RSS
+ * feed.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Feed_Entry_Abstract extends Zend_Feed_Element
+{
+ /**
+ * Root XML element for entries. Subclasses must define this to a
+ * non-null value.
+ *
+ * @var string
+ */
+ protected $_rootElement;
+
+ /**
+ * Root namespace for entries. Subclasses may define this to a
+ * non-null value.
+ *
+ * @var string
+ */
+ protected $_rootNamespace = null;
+
+
+ /**
+ * Zend_Feed_Entry_Abstract constructor
+ *
+ * The Zend_Feed_Entry_Abstract constructor takes the URI of the feed the entry
+ * is part of, and optionally an XML construct (usually a
+ * SimpleXMLElement, but it can be an XML string or a DOMNode as
+ * well) that contains the contents of the entry.
+ *
+ * @param string $uri
+ * @param SimpleXMLElement|DOMNode|string $element
+ * @return void
+ */
+ public function __construct($uri = null, $element = null)
+ {
+ if (!($element instanceof DOMElement)) {
+ if ($element) {
+ // Load the feed as an XML DOMDocument object
+ @ini_set('track_errors', 1);
+ $doc = new DOMDocument();
+ $success = @$doc->loadXML($element);
+ @ini_restore('track_errors');
+
+ if (!$success) {
+ throw new Zend_Feed_Exception("DOMDocument cannot parse XML: $php_errormsg");
+ }
+
+ $element = $doc->getElementsByTagName($this->_rootElement)->item(0);
+ if (!$element) {
+ throw new Zend_Feed_Exception('No root <' . $this->_rootElement . '> element found, cannot parse feed.');
+ }
+ } else {
+ $doc = new DOMDocument('1.0', 'utf-8');
+ if ($this->_rootNamespace !== null) {
+ $element = $doc->createElementNS(Zend_Feed::lookupNamespace($this->_rootNamespace), $this->_rootElement);
+ } else {
+ $element = $doc->createElement($this->_rootElement);
+ }
+ }
+ }
+
+ parent::__construct($element);
+ }
+
+}
diff --git a/libs/Zend/Feed/Entry/Atom.php b/libs/Zend/Feed/Entry/Atom.php
new file mode 100755
index 0000000000..a7a18dc681
--- /dev/null
+++ b/libs/Zend/Feed/Entry/Atom.php
@@ -0,0 +1,231 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: EntryAtom.php 3941 2007-03-14 21:36:13Z darby $
+ */
+
+
+/**
+ * @see Zend_Feed_Entry_Abstract
+ */
+require_once 'Zend/Feed/Entry/Abstract.php';
+
+
+/**
+ * Concrete class for working with Atom entries.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Feed_Entry_Atom extends Zend_Feed_Entry_Abstract
+{
+ /**
+ * Root XML element for Atom entries.
+ *
+ * @var string
+ */
+ protected $_rootElement = 'entry';
+
+ /**
+ * Root namespace for Atom entries.
+ *
+ * @var string
+ */
+ protected $_rootNamespace = 'atom';
+
+
+ /**
+ * Delete an atom entry.
+ *
+ * Delete tries to delete this entry from its feed. If the entry
+ * does not contain a link rel="edit", we throw an error (either
+ * the entry does not yet exist or this is not an editable
+ * feed). If we have a link rel="edit", we do the empty-body
+ * HTTP DELETE to that URI and check for a response of 2xx.
+ * Usually the response would be 204 No Content, but the Atom
+ * Publishing Protocol permits it to be 200 OK.
+ *
+ * @throws Zend_Feed_Exception
+ * @return void
+ */
+ public function delete()
+ {
+ // Look for link rel="edit" in the entry object.
+ $deleteUri = $this->link('edit');
+ if (!$deleteUri) {
+ throw new Zend_Feed_Exception('Cannot delete entry; no link rel="edit" is present.');
+ }
+
+ // DELETE
+ $client = Zend_Feed::getHttpClient();
+ do {
+ $client->setUri($deleteUri);
+ if (Zend_Feed::getHttpMethodOverride()) {
+ $client->setHeader('X-HTTP-Method-Override', 'DELETE');
+ $response = $client->request('POST');
+ } else {
+ $response = $client->request('DELETE');
+ }
+ $httpStatus = $response->getStatus();
+ switch ((int) $httpStatus / 100) {
+ // Success
+ case 2:
+ return true;
+ // Redirect
+ case 3:
+ $deleteUri = $response->getHeader('Location');
+ continue;
+ // Error
+ default:
+ throw new Zend_Feed_Exception("Expected response code 2xx, got $httpStatus");
+ }
+ } while (true);
+ }
+
+
+ /**
+ * Save a new or updated Atom entry.
+ *
+ * Save is used to either create new entries or to save changes to
+ * existing ones. If we have a link rel="edit", we are changing
+ * an existing entry. In this case we re-serialize the entry and
+ * PUT it to the edit URI, checking for a 200 OK result.
+ *
+ * For posting new entries, you must specify the $postUri
+ * parameter to save() to tell the object where to post itself.
+ * We use $postUri and POST the serialized entry there, checking
+ * for a 201 Created response. If the insert is successful, we
+ * then parse the response from the POST to get any values that
+ * the server has generated: an id, an updated time, and its new
+ * link rel="edit".
+ *
+ * @param string $postUri Location to POST for creating new entries.
+ * @throws Zend_Feed_Exception
+ * @return void
+ */
+ public function save($postUri = null)
+ {
+ if ($this->id()) {
+ // If id is set, look for link rel="edit" in the
+ // entry object and PUT.
+ $editUri = $this->link('edit');
+ if (!$editUri) {
+ throw new Zend_Feed_Exception('Cannot edit entry; no link rel="edit" is present.');
+ }
+
+ $client = Zend_Feed::getHttpClient();
+ $client->setUri($editUri);
+ if (Zend_Feed::getHttpMethodOverride()) {
+ $client->setHeaders(array('X-HTTP-Method-Override: PUT',
+ 'Content-Type: application/atom+xml'));
+ $client->setRawData($this->saveXML());
+ $response = $client->request('POST');
+ } else {
+ $client->setHeaders('Content-Type', 'application/atom+xml');
+ $client->setRawData($this->saveXML());
+ $response = $client->request('PUT');
+ }
+ if ($response->getStatus() !== 200) {
+ throw new Zend_Feed_Exception('Expected response code 200, got ' . $response->getStatus());
+ }
+ } else {
+ if ($postUri === null) {
+ throw new Zend_Feed_Exception('PostURI must be specified to save new entries.');
+ }
+ $client = Zend_Feed::getHttpClient();
+ $client->setUri($postUri);
+ $client->setRawData($this->saveXML());
+ $response = $client->request('POST');
+
+ if ($response->getStatus() !== 201) {
+ throw new Zend_Feed_Exception('Expected response code 201, got '
+ . $response->getStatus());
+ }
+ }
+
+ // Update internal properties using $client->responseBody;
+ @ini_set('track_errors', 1);
+ $newEntry = @DOMDocument::loadXML($response->getBody());
+ @ini_restore('track_errors');
+ if (!$newEntry) {
+ throw new Zend_Feed_Exception('XML cannot be parsed: ' . $php_errormsg);
+ }
+
+ $newEntry = $newEntry->getElementsByTagName($this->_rootElement)->item(0);
+ if (!$newEntry) {
+ throw new Zend_Feed_Exception('No root <feed> element found in server response:'
+ . "\n\n" . $client->responseBody);
+ }
+
+ if ($this->_element->parentNode) {
+ $oldElement = $this->_element;
+ $this->_element = $oldElement->ownerDocument->importNode($newEntry, true);
+ $oldElement->parentNode->replaceChild($this->_element, $oldElement);
+ } else {
+ $this->_element = $newEntry;
+ }
+ }
+
+
+ /**
+ * Easy access to <link> tags keyed by "rel" attributes.
+ *
+ * If $elt->link() is called with no arguments, we will attempt to
+ * return the value of the <link> tag(s) like all other
+ * method-syntax attribute access. If an argument is passed to
+ * link(), however, then we will return the "href" value of the
+ * first <link> tag that has a "rel" attribute matching $rel:
+ *
+ * $elt->link(): returns the value of the link tag.
+ * $elt->link('self'): returns the href from the first <link rel="self"> in the entry.
+ *
+ * @param string $rel The "rel" attribute to look for.
+ * @return mixed
+ */
+ public function link($rel = null)
+ {
+ if ($rel === null) {
+ return parent::__call('link', null);
+ }
+
+ // index link tags by their "rel" attribute.
+ $links = parent::__get('link');
+ if (!is_array($links)) {
+ if ($links instanceof Zend_Feed_Element) {
+ $links = array($links);
+ } else {
+ return $links;
+ }
+ }
+
+ foreach ($links as $link) {
+ if (empty($link['rel'])) {
+ continue;
+ }
+ if ($rel == $link['rel']) {
+ return $link['href'];
+ }
+ }
+
+ return null;
+ }
+
+}
diff --git a/libs/Zend/Feed/Entry/Rss.php b/libs/Zend/Feed/Entry/Rss.php
new file mode 100755
index 0000000000..efc5c20700
--- /dev/null
+++ b/libs/Zend/Feed/Entry/Rss.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id:$
+ */
+
+
+/**
+ * @see Zend_Feed_Entry_Abstract
+ */
+require_once 'Zend/Feed/Entry/Abstract.php';
+
+
+/**
+ * Concrete class for working with RSS items.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Feed_Entry_Rss extends Zend_Feed_Entry_Abstract
+{
+ /**
+ * Root XML element for RSS items.
+ *
+ * @var string
+ */
+ protected $_rootElement = 'item';
+
+}
diff --git a/libs/Zend/Feed/Exception.php b/libs/Zend/Feed/Exception.php
new file mode 100755
index 0000000000..3b2d0db342
--- /dev/null
+++ b/libs/Zend/Feed/Exception.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Exception.php 3941 2007-03-14 21:36:13Z darby $
+ */
+
+
+/**
+ * @see Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * Feed exceptions
+ *
+ * Class to represent exceptions that occur during Feed operations.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Feed_Exception extends Zend_Exception
+{}
+
diff --git a/libs/Zend/Feed/Rss.php b/libs/Zend/Feed/Rss.php
new file mode 100755
index 0000000000..0a98bb99f3
--- /dev/null
+++ b/libs/Zend/Feed/Rss.php
@@ -0,0 +1,496 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Rss.php 4733 2007-05-06 19:41:25Z thomas $
+ */
+
+
+/**
+ * @see Zend_Feed_Abstract
+ */
+require_once 'Zend/Feed/Abstract.php';
+
+/**
+ * @see Zend_Feed_Entry_Rss
+ */
+require_once 'Zend/Feed/Entry/Rss.php';
+
+
+/**
+ * RSS channel class
+ *
+ * The Zend_Feed_Rss class is a concrete subclass of
+ * Zend_Feed_Abstract meant for representing RSS channels. It does not
+ * add any methods to its parent, just provides a classname to check
+ * against with the instanceof operator, and expects to be handling
+ * RSS-formatted data instead of Atom.
+ *
+ * @category Zend
+ * @package Zend_Feed
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Feed_Rss extends Zend_Feed_Abstract
+{
+ /**
+ * The classname for individual channel elements.
+ *
+ * @var string
+ */
+ protected $_entryClassName = 'Zend_Feed_Entry_Rss';
+
+ /**
+ * The element name for individual channel elements (RSS <item>s).
+ *
+ * @var string
+ */
+ protected $_entryElementName = 'item';
+
+ /**
+ * The default namespace for RSS channels.
+ *
+ * @var string
+ */
+ protected $_defaultNamespace = 'rss';
+
+ /**
+ * Override Zend_Feed_Abstract to set up the $_element and $_entries aliases.
+ *
+ * @throws Zend_Feed_Exception
+ * @return void
+ */
+ public function __wakeup()
+ {
+ parent::__wakeup();
+
+ // Find the base channel element and create an alias to it.
+ $this->_element = $this->_element->getElementsByTagName('channel')->item(0);
+ if (!$this->_element) {
+ throw new Zend_Feed_Exception('No root <channel> element found, cannot parse channel.');
+ }
+
+ // Find the entries and save a pointer to them for speed and
+ // simplicity.
+ $this->_buildEntryCache();
+ }
+
+
+ /**
+ * Make accessing some individual elements of the channel easier.
+ *
+ * Special accessors 'item' and 'items' are provided so that if
+ * you wish to iterate over an RSS channel's items, you can do so
+ * using foreach ($channel->items as $item) or foreach
+ * ($channel->item as $item).
+ *
+ * @param string $var The property to access.
+ * @return mixed
+ */
+ public function __get($var)
+ {
+ switch ($var) {
+ case 'item':
+ // fall through to the next case
+ case 'items':
+ return $this;
+
+ default:
+ return parent::__get($var);
+ }
+ }
+
+ /**
+ * Generate the header of the feed when working in write mode
+ *
+ * @param array $array the data to use
+ * @return DOMElement root node
+ */
+ protected function _mapFeedHeaders($array)
+ {
+ $channel = $this->_element->createElement('channel');
+
+ $title = $this->_element->createElement('title');
+ $title->appendChild($this->_element->createCDATASection($array->title));
+ $channel->appendChild($title);
+
+ $link = $this->_element->createElement('link', $array->link);
+ $channel->appendChild($link);
+
+ $desc = isset($array->description) ? $array->description : '';
+ $description = $this->_element->createElement('description');
+ $description->appendChild($this->_element->createCDATASection($desc));
+ $channel->appendChild($description);
+
+ $pubdate = isset($array->lastUpdate) ? $array->lastUpdate : time();
+ $pubdate = $this->_element->createElement('pubDate', gmdate('r', $pubdate));
+ $channel->appendChild($pubdate);
+
+ if (isset($array->published)) {
+ $lastBuildDate = $this->_element->createElement('lastBuildDate', gmdate('r', $array->published));
+ }
+
+ $editor = '';
+ if (!empty($array->email)) {
+ $editor .= $array->email;
+ }
+ if (!empty($array->author)) {
+ $editor .= ' (' . $array->author . ')';
+ }
+ if (!empty($editor)) {
+ $author = $this->_element->createElement('managingEditor', ltrim($editor));
+ $channel->appendChild($author);
+ }
+ if (isset($array->webmaster)) {
+ $channel->appendChild($this->_element->createElement('webMaster', $array->webmaster));
+ }
+
+ if (!empty($array->copyright)) {
+ $copyright = $this->_element->createElement('copyright', $array->copyright);
+ $channel->appendChild($copyright);
+ }
+
+ if (!empty($array->image)) {
+ $image = $this->_element->createElement('image');
+ $url = $this->_element->createElement('url', $array->image);
+ $image->appendChild($url);
+ $imagetitle = $this->_element->createElement('title', $array->title);
+ $image->appendChild($imagetitle);
+ $imagelink = $this->_element->createElement('link', $array->link);
+ $image->appendChild($imagelink);
+
+ $channel->appendChild($image);
+ }
+
+ $generator = !empty($array->generator) ? $array->generator : 'Zend_Feed';
+ $generator = $this->_element->createElement('generator', $generator);
+ $channel->appendChild($generator);
+
+ if (!empty($array->language)) {
+ $language = $this->_element->createElement('language', $array->language);
+ $channel->appendChild($language);
+ }
+
+ $doc = $this->_element->createElement('docs', 'http://blogs.law.harvard.edu/tech/rss');
+ $channel->appendChild($doc);
+
+ if (isset($array->cloud)) {
+ $cloud = $this->_element->createElement('cloud');
+ $cloud->setAttribute('domain', $array->cloud['uri']->getHost());
+ $cloud->setAttribute('port', $array->cloud['uri']->getPort());
+ $cloud->setAttribute('path', $array->cloud['uri']->getPath());
+ $cloud->setAttribute('registerProcedure', $array->cloud['procedure']);
+ $cloud->setAttribute('protocol', $array->cloud['protocol']);
+ $channel->appendChild($cloud);
+ }
+
+ if (isset($array->rating)) {
+ $rating = $this->_element->createElement('rating', $array->rating);
+ $channel->appendChild($rating);
+ }
+
+ if (isset($array->textInput)) {
+ $textinput = $this->_element->createElement('textInput');
+ $textinput->appendChild($this->_element->createElement('title', $array->textInput['title']));
+ $textinput->appendChild($this->_element->createElement('description', $array->textInput['description']));
+ $textinput->appendChild($this->_element->createElement('name', $array->textInput['name']));
+ $textinput->appendChild($this->_element->createElement('link', $array->textInput['link']));
+ $channel->appendChild($textinput);
+ }
+
+ if (isset($array->skipHours)) {
+ $skipHours = $this->_element->createElement('skipHours');
+ foreach ($array->skipHours as $hour) {
+ $skipHours->appendChild($this->_element->createElement('hour', $hour));
+ }
+ $channel->appendChild($skipHours);
+ }
+
+ if (isset($array->skipDays)) {
+ $skipDays = $this->_element->createElement('skipDays');
+ foreach ($array->skipDays as $day) {
+ $skipDays->appendChild($this->_element->createElement('day', $day));
+ }
+ $channel->appendChild($skipDays);
+ }
+
+ if (isset($array->itunes)) {
+ $this->_buildiTunes($channel, $array);
+ }
+
+ return $channel;
+ }
+
+ /**
+ * Adds the iTunes extensions to a root node
+ *
+ * @param DOMElement $root
+ * @param array $array
+ * @return void
+ */
+ private function _buildiTunes(DOMElement $root, $array)
+ {
+ /* author node */
+ $author = '';
+ if (isset($array->itunes->author)) {
+ $author = $array->itunes->author;
+ } elseif (isset($array->author)) {
+ $author = $array->author;
+ }
+ if (!empty($author)) {
+ $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:author', $author);
+ $root->appendChild($node);
+ }
+
+ /* owner node */
+ $author = '';
+ $email = '';
+ if (isset($array->itunes->owner)) {
+ if (isset($array->itunes->owner['name'])) {
+ $author = $array->itunes->owner['name'];
+ }
+ if (isset($array->itunes->owner['email'])) {
+ $email = $array->itunes->owner['email'];
+ }
+ }
+ if (empty($author) && isset($array->author)) {
+ $author = $array->author;
+ }
+ if (empty($email) && isset($array->email)) {
+ $email = $array->email;
+ }
+ if (!empty($author) || !empty($email)) {
+ $owner = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:owner');
+ if (!empty($author)) {
+ $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:name', $author);
+ $owner->appendChild($node);
+ }
+ if (!empty($email)) {
+ $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:email', $email);
+ $owner->appendChild($node);
+ }
+ $root->appendChild($owner);
+ }
+ $image = '';
+ if (isset($array->itunes->image)) {
+ $image = $array->itunes->image;
+ } elseif (isset($array->image)) {
+ $image = $array->image;
+ }
+ if (!empty($image)) {
+ $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:image');
+ $node->setAttribute('href', $image);
+ $root->appendChild($node);
+ }
+ $subtitle = '';
+ if (isset($array->itunes->subtitle)) {
+ $subtitle = $array->itunes->subtitle;
+ } elseif (isset($array->description)) {
+ $subtitle = $array->description;
+ }
+ if (!empty($subtitle)) {
+ $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:subtitle', $subtitle);
+ $root->appendChild($node);
+ }
+ $summary = '';
+ if (isset($array->itunes->summary)) {
+ $summary = $array->itunes->summary;
+ } elseif (isset($array->description)) {
+ $summary = $array->description;
+ }
+ if (!empty($summary)) {
+ $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:summary', $summary);
+ $root->appendChild($node);
+ }
+ if (isset($array->itunes->block)) {
+ $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:block', $array->itunes->block);
+ $root->appendChild($node);
+ }
+ if (isset($array->itunes->explicit)) {
+ $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:explicit', $array->itunes->explicit);
+ $root->appendChild($node);
+ }
+ if (isset($array->itunes->keywords)) {
+ $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:keywords', $array->itunes->keywords);
+ $root->appendChild($node);
+ }
+ if (isset($array->itunes->new_feed_url)) {
+ $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:new-feed-url', $array->itunes->new_feed_url);
+ $root->appendChild($node);
+ }
+ if (isset($array->itunes->category)) {
+ foreach ($array->itunes->category as $i => $category) {
+ $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:category');
+ $node->setAttribute('text', $category['main']);
+ $root->appendChild($node);
+ $add_end_category = false;
+ if (!empty($category['sub'])) {
+ $add_end_category = true;
+ $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:category');
+ $node->setAttribute('text', $category['sub']);
+ $root->appendChild($node);
+ }
+ if ($i > 0 || $add_end_category) {
+ $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:category');
+ $root->appendChild($node);
+ }
+ }
+ }
+ }
+
+ /**
+ * Generate the entries of the feed when working in write mode
+ *
+ * The following nodes are constructed for each feed entry
+ * <item>
+ * <title>entry title</title>
+ * <link>url to feed entry</link>
+ * <guid>url to feed entry</guid>
+ * <description>short text</description>
+ * <content:encoded>long version, can contain html</content:encoded>
+ * </item>
+ *
+ * @param DOMElement $root the root node to use
+ * @param array $array the data to use
+ * @return void
+ */
+ protected function _mapFeedEntries(DOMElement $root, $array)
+ {
+ Zend_Feed::registerNamespace('content', 'http://purl.org/rss/1.0/modules/content/');
+
+ foreach ($array as $dataentry) {
+ $item = $this->_element->createElement('item');
+
+ $title = $this->_element->createElement('title');
+ $title->appendChild($this->_element->createCDATASection($dataentry->title));
+ $item->appendChild($title);
+
+ $link = $this->_element->createElement('link', $dataentry->link);
+ $item->appendChild($link);
+
+ if (isset($dataentry->guid)) {
+ $guid = $this->_element->createElement('guid', $dataentry->guid);
+ $item->appendChild($guid);
+ }
+
+ $description = $this->_element->createElement('description');
+ $description->appendChild($this->_element->createCDATASection($dataentry->description));
+ $item->appendChild($description);
+
+ if (isset($dataentry->content)) {
+ $content = $this->_element->createElement('content:encoded');
+ $content->appendChild($this->_element->createCDATASection($dataentry->content));
+ $item->appendChild($content);
+ }
+
+ $pubdate = isset($dataentry->lastUpdate) ? $dataentry->lastUpdate : time();
+ $pubdate = $this->_element->createElement('pubDate', gmdate('r', $pubdate));
+ $item->appendChild($pubdate);
+
+ if (isset($dataentry->category)) {
+ foreach ($dataentry->category as $category) {
+ $node = $this->_element->createElement('category', $category['term']);
+ if (isset($category['scheme'])) {
+ $node->setAttribute('domain', $category['scheme']);
+ }
+ $item->appendChild($node);
+ }
+ }
+
+ if (isset($dataentry->source)) {
+ $source = $this->_element->createElement('source', $dataentry->source['title']);
+ $source->setAttribute('url', $dataentry->source['url']);
+ $item->appendChild($source);
+ }
+
+ if (isset($dataentry->comments)) {
+ $comments = $this->_element->createElement('comments', $dataentry->comments);
+ $item->appendChild($comments);
+ }
+ if (isset($dataentry->commentRss)) {
+ $comments = $this->_element->createElementNS('http://wellformedweb.org/CommentAPI/',
+ 'wfw:commentRss',
+ $dataentry->commentRss);
+ $item->appendChild($comments);
+ }
+
+
+ if (isset($dataentry->enclosure)) {
+ foreach ($dataentry->enclosure as $enclosure) {
+ $node = $this->_element->createElement('enclosure');
+ $node->setAttribute('url', $enclosure['url']);
+ if (isset($enclosure['type'])) {
+ $node->setAttribute('type', $enclosure['type']);
+ }
+ if (isset($enclosure['length'])) {
+ $node->setAttribute('length', $enclosure['length']);
+ }
+ $item->appendChild($node);
+ }
+ }
+
+ $root->appendChild($item);
+ }
+ }
+
+ /**
+ * Override Zend_Feed_Element to include <rss> root node
+ *
+ * @return string
+ */
+ public function saveXML()
+ {
+ // Return a complete document including XML prologue.
+ $doc = new DOMDocument($this->_element->ownerDocument->version,
+ $this->_element->ownerDocument->actualEncoding);
+ $root = $doc->createElement('rss');
+
+ // Use rss version 2.0
+ $root->setAttribute('version', '2.0');
+
+ // Content namespace
+ $root->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:content', 'http://purl.org/rss/1.0/modules/content/');
+ $root->appendChild($doc->importNode($this->_element, true));
+
+ // Append root node
+ $doc->appendChild($root);
+
+ // Format output
+ $doc->formatOutput = true;
+
+ return $doc->saveXML();
+ }
+
+ /**
+ * Send feed to a http client with the correct header
+ *
+ * @throws Zend_Feed_Exception if headers have already been sent
+ * @return void
+ */
+ public function send()
+ {
+ if (headers_sent()) {
+ throw new Zend_Feed_Exception('Cannot send RSS because headers have already been sent.');
+ }
+
+ header('Content-type: application/rss+xml; charset: ' . $this->_element->ownerDocument->actualEncoding);
+
+ echo $this->saveXML();
+ }
+
+}
diff --git a/libs/Zend/Filter.php b/libs/Zend/Filter.php
new file mode 100755
index 0000000000..d8f81f68cb
--- /dev/null
+++ b/libs/Zend/Filter.php
@@ -0,0 +1,107 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Filter.php 4974 2007-05-25 21:11:56Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Filter_Interface
+ */
+require_once 'Zend/Filter/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Filter implements Zend_Filter_Interface
+{
+ /**
+ * Filter chain
+ *
+ * @var array
+ */
+ protected $_filters = array();
+
+ /**
+ * Adds a filter to the end of the chain
+ *
+ * @param Zend_Filter_Interface $filter
+ * @return Zend_Filter Provides a fluent interface
+ */
+ public function addFilter(Zend_Filter_Interface $filter)
+ {
+ $this->_filters[] = $filter;
+ return $this;
+ }
+
+ /**
+ * Returns $value filtered through each filter in the chain
+ *
+ * Filters are run in the order in which they were added to the chain (FIFO)
+ *
+ * @param mixed $value
+ * @return mixed
+ */
+ public function filter($value)
+ {
+ $valueFiltered = $value;
+ foreach ($this->_filters as $filter) {
+ $valueFiltered = $filter->filter($valueFiltered);
+ }
+ return $valueFiltered;
+ }
+
+ /**
+ * @param mixed $value
+ * @param string $classBaseName
+ * @param array $args OPTIONAL
+ * @param mixed $namespaces OPTIONAL
+ * @return boolean
+ * @throws Zend_Filter_Exception
+ */
+ public static function get($value, $classBaseName, array $args = array(), $namespaces = array())
+ {
+ $namespaces = array_merge(array('Zend_Filter'), (array) $namespaces);
+ foreach ($namespaces as $namespace) {
+ $className = $namespace . '_' . ucfirst($classBaseName);
+ try {
+ require_once 'Zend/Loader.php';
+ Zend_Loader::loadClass($className);
+ $class = new ReflectionClass($className);
+ if ($class->implementsInterface('Zend_Filter_Interface')) {
+ if ($class->hasMethod('__construct')) {
+ $object = $class->newInstanceArgs($args);
+ } else {
+ $object = $class->newInstance();
+ }
+ return $object->filter($value);
+ }
+ } catch (Zend_Exception $ze) {
+ // fallthrough and continue
+ }
+ }
+ require_once 'Zend/Filter/Exception.php';
+ throw new Zend_Filter_Exception("Filter class not found from basename '$classBaseName'");
+ }
+
+}
diff --git a/libs/Zend/Filter/Alnum.php b/libs/Zend/Filter/Alnum.php
new file mode 100755
index 0000000000..2ec403fb01
--- /dev/null
+++ b/libs/Zend/Filter/Alnum.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Alnum.php 5470 2007-06-28 17:05:56Z andries $
+ */
+
+
+/**
+ * @see Zend_Filter_Interface
+ */
+require_once 'Zend/Filter/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Filter_Alnum implements Zend_Filter_Interface
+{
+ /**
+ * Whether to allow white space characters; off by default
+ *
+ * @var boolean
+ */
+ public $allowWhiteSpace;
+
+ /**
+ * Is PCRE is compiled with UTF-8 and Unicode support
+ *
+ * @var mixed
+ **/
+ protected static $_unicodeEnabled;
+
+ /**
+ * Sets default option values for this instance
+ *
+ * @param boolean $allowWhiteSpace
+ * @return void
+ */
+ public function __construct($allowWhiteSpace = false)
+ {
+ $this->allowWhiteSpace = (boolean) $allowWhiteSpace;
+ if (null === self::$_unicodeEnabled) {
+ self::$_unicodeEnabled = (@preg_match('/\pL/u', 'a')) ? true : false;
+ }
+ }
+
+ /**
+ * Defined by Zend_Filter_Interface
+ *
+ * Returns the string $value, removing all but alphabetic and digit characters
+ *
+ * @param string $value
+ * @return string
+ */
+ public function filter($value)
+ {
+ $whiteSpace = $this->allowWhiteSpace ? '\s' : '';
+ if (!self::$_unicodeEnabled) {
+ // POSIX named classes are not supported, use alternative a-zA-Z0-9 match
+ $pattern = '/[^a-zA-Z0-9' . $whiteSpace . ']/';
+ } else {
+ // Unicode safe filter for the value
+ $pattern = '/[^\p{L}\p{N}' . $whiteSpace . ']/u';
+ }
+
+ return preg_replace($pattern, '', (string) $value);
+ }
+}
diff --git a/libs/Zend/Filter/Alpha.php b/libs/Zend/Filter/Alpha.php
new file mode 100755
index 0000000000..294c4547cd
--- /dev/null
+++ b/libs/Zend/Filter/Alpha.php
@@ -0,0 +1,86 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Alpha.php 5470 2007-06-28 17:05:56Z andries $
+ */
+
+
+/**
+ * @see Zend_Filter_Interface
+ */
+require_once 'Zend/Filter/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Filter_Alpha implements Zend_Filter_Interface
+{
+ /**
+ * Whether to allow white space characters; off by default
+ *
+ * @var boolean
+ */
+ public $allowWhiteSpace;
+
+ /**
+ * Is PCRE is compiled with UTF-8 and Unicode support
+ *
+ * @var mixed
+ **/
+ protected static $_unicodeEnabled;
+
+ /**
+ * Sets default option values for this instance
+ *
+ * @param boolean $allowWhiteSpace
+ * @return void
+ */
+ public function __construct($allowWhiteSpace = false)
+ {
+ $this->allowWhiteSpace = (boolean) $allowWhiteSpace;
+ if (null === self::$_unicodeEnabled) {
+ self::$_unicodeEnabled = (@preg_match('/\pL/u', 'a')) ? true : false;
+ }
+ }
+
+ /**
+ * Defined by Zend_Filter_Interface
+ *
+ * Returns the string $value, removing all but alphabetic characters
+ *
+ * @param string $value
+ * @return string
+ */
+ public function filter($value)
+ {
+ $whiteSpace = $this->allowWhiteSpace ? '\s' : '';
+ if (!self::$_unicodeEnabled) {
+ // POSIX named classes are not supported, use alternative a-zA-Z match
+ $pattern = '/[^a-zA-Z' . $whiteSpace . ']/';
+ } else {
+ $pattern = '/[^\p{L}' . $whiteSpace . ']/u';
+ }
+
+ return preg_replace($pattern, '', (string) $value);
+ }
+}
diff --git a/libs/Zend/Filter/BaseName.php b/libs/Zend/Filter/BaseName.php
new file mode 100755
index 0000000000..f2c576e1cf
--- /dev/null
+++ b/libs/Zend/Filter/BaseName.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: BaseName.php 4135 2007-03-20 12:46:11Z darby $
+ */
+
+
+/**
+ * @see Zend_Filter_Interface
+ */
+require_once 'Zend/Filter/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Filter_BaseName implements Zend_Filter_Interface
+{
+ /**
+ * Defined by Zend_Filter_Interface
+ *
+ * Returns basename($value)
+ *
+ * @param string $value
+ * @return string
+ */
+ public function filter($value)
+ {
+ return basename((string) $value);
+ }
+}
diff --git a/libs/Zend/Filter/Digits.php b/libs/Zend/Filter/Digits.php
new file mode 100755
index 0000000000..f7c231d02b
--- /dev/null
+++ b/libs/Zend/Filter/Digits.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Digits.php 5470 2007-06-28 17:05:56Z andries $
+ */
+
+
+/**
+ * @see Zend_Filter_Interface
+ */
+require_once 'Zend/Filter/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Filter_Digits implements Zend_Filter_Interface
+{
+ /**
+ * Is PCRE is compiled with UTF-8 and Unicode support
+ *
+ * @var mixed
+ **/
+ protected static $_unicodeEnabled;
+
+ /**
+ * Class constructor
+ *
+ * Checks if PCRE is compiled with UTF-8 and Unicode support
+ *
+ * @param boolean $allowWhiteSpace
+ * @return void
+ */
+ public function __construct()
+ {
+ if (null === self::$_unicodeEnabled) {
+ self::$_unicodeEnabled = (@preg_match('/\pL/u', 'a')) ? true : false;
+ }
+ }
+
+ /**
+ * Defined by Zend_Filter_Interface
+ *
+ * Returns the string $value, removing all but digit characters
+ *
+ * @param string $value
+ * @return string
+ */
+ public function filter($value)
+ {
+ if (!self::$_unicodeEnabled) {
+ // POSIX named classes are not supported, use alternative a-zA-Z0-9 match
+ $pattern = '/[^0-9]/';
+ } else {
+ $pattern = '/[\p{^N}]/';
+ }
+
+ return preg_replace($pattern, '', (string) $value);
+ }
+}
diff --git a/libs/Zend/Filter/Dir.php b/libs/Zend/Filter/Dir.php
new file mode 100755
index 0000000000..f943ecdea8
--- /dev/null
+++ b/libs/Zend/Filter/Dir.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Dir.php 4135 2007-03-20 12:46:11Z darby $
+ */
+
+
+/**
+ * @see Zend_Filter_Interface
+ */
+require_once 'Zend/Filter/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Filter_Dir implements Zend_Filter_Interface
+{
+ /**
+ * Defined by Zend_Filter_Interface
+ *
+ * Returns dirname($value)
+ *
+ * @param string $value
+ * @return string
+ */
+ public function filter($value)
+ {
+ return dirname((string) $value);
+ }
+}
diff --git a/libs/Zend/Filter/Exception.php b/libs/Zend/Filter/Exception.php
new file mode 100755
index 0000000000..fe55d746cb
--- /dev/null
+++ b/libs/Zend/Filter/Exception.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Exception.php 3278 2007-02-07 21:54:50Z darby $
+ */
+
+
+/**
+ * @see Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Filter_Exception extends Zend_Exception
+{}
diff --git a/libs/Zend/Filter/HtmlEntities.php b/libs/Zend/Filter/HtmlEntities.php
new file mode 100755
index 0000000000..1ea8a334e8
--- /dev/null
+++ b/libs/Zend/Filter/HtmlEntities.php
@@ -0,0 +1,121 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: HtmlEntities.php 4135 2007-03-20 12:46:11Z darby $
+ */
+
+
+/**
+ * @see Zend_Filter_Interface
+ */
+require_once 'Zend/Filter/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Filter_HtmlEntities implements Zend_Filter_Interface
+{
+ /**
+ * Corresponds to second htmlentities() argument
+ *
+ * @var integer
+ */
+ protected $_quoteStyle;
+
+ /**
+ * Corresponds to third htmlentities() argument
+ *
+ * @var string
+ */
+ protected $_charSet;
+
+ /**
+ * Sets filter options
+ *
+ * @param integer $quoteStyle
+ * @param string $charSet
+ * @return void
+ */
+ public function __construct($quoteStyle = ENT_COMPAT, $charSet = 'ISO-8859-1')
+ {
+ $this->_quoteStyle = $quoteStyle;
+ $this->_charSet = $charSet;
+ }
+
+ /**
+ * Returns the quoteStyle option
+ *
+ * @return integer
+ */
+ public function getQuoteStyle()
+ {
+ return $this->_quoteStyle;
+ }
+
+ /**
+ * Sets the quoteStyle option
+ *
+ * @param integer $quoteStyle
+ * @return Zend_Filter_HtmlEntities Provides a fluent interface
+ */
+ public function setQuoteStyle($quoteStyle)
+ {
+ $this->_quoteStyle = $quoteStyle;
+ }
+
+ /**
+ * Returns the charSet option
+ *
+ * @return string
+ */
+ public function getCharSet()
+ {
+ return $this->_charSet;
+ }
+
+ /**
+ * Sets the charSet option
+ *
+ * @param string $charSet
+ * @return Zend_Filter_HtmlEntities Provides a fluent interface
+ */
+ public function setCharSet($charSet)
+ {
+ $this->_charSet = $charSet;
+ return $this;
+ }
+
+ /**
+ * Defined by Zend_Filter_Interface
+ *
+ * Returns the string $value, converting characters to their corresponding HTML entity
+ * equivalents where they exist
+ *
+ * @param string $value
+ * @return string
+ */
+ public function filter($value)
+ {
+ return htmlentities((string) $value, $this->_quoteStyle, $this->_charSet);
+ }
+}
diff --git a/libs/Zend/Filter/Input.php b/libs/Zend/Filter/Input.php
new file mode 100755
index 0000000000..3bb4d22e06
--- /dev/null
+++ b/libs/Zend/Filter/Input.php
@@ -0,0 +1,833 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Input.php 5344 2007-06-15 17:53:11Z bkarwin $
+ */
+
+/**
+ * @see Zend_Loader
+ */
+require_once 'Zend/Loader.php';
+
+/**
+ * @see Zend_Filter
+ */
+require_once 'Zend/Filter.php';
+
+/**
+ * @see Zend_Validate
+ */
+require_once 'Zend/Validate.php';
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Filter_Input
+{
+
+ const ALLOW_EMPTY = 'allowEmpty';
+ const BREAK_CHAIN = 'breakChainOnFailure';
+ const DEFAULT_VALUE = 'default';
+ const MESSAGES = 'messages';
+ const ESCAPE_FILTER = 'escapeFilter';
+ const FIELDS = 'fields';
+ const FILTER_CHAIN = 'filterChain';
+ const MISSING_MESSAGE = 'missingMessage';
+ const NAMESPACE = 'namespace';
+ const NOT_EMPTY_MESSAGE = 'notEmptyMessage';
+ const PRESENCE = 'presence';
+ const PRESENCE_OPTIONAL = 'optional';
+ const PRESENCE_REQUIRED = 'required';
+ const RULE = 'rule';
+ const RULE_WILDCARD = '*';
+ const VALIDATOR = 'validator';
+ const VALIDATOR_CHAIN = 'validatorChain';
+ const VALIDATOR_CHAIN_COUNT = 'validatorChainCount';
+
+ /**
+ * @var array Input data, before processing.
+ */
+ protected $_data = array();
+
+ /**
+ * @var array Association of rules to filters.
+ */
+ protected $_filterRules = array();
+
+ /**
+ * @var array Association of rules to validators.
+ */
+ protected $_validatorRules = array();
+
+ /**
+ * @var array After processing data, this contains mapping of valid fields
+ * to field values.
+ */
+ protected $_validFields = array();
+
+ /**
+ * @var array After processing data, this contains mapping of validation
+ * rules that did not pass validation to the array of messages returned
+ * by the validator chain.
+ */
+ protected $_invalidMessages = array();
+
+ /**
+ * @var array After processing data, this contains mapping of validation
+ * rules that did not pass validation to the array of error identifiers
+ * returned by the validator chain.
+ */
+ protected $_invalidErrors = array();
+
+ /**
+ * @var array After processing data, this contains mapping of validation
+ * rules in which some fields were missing to the array of messages
+ * indicating which fields were missing.
+ */
+ protected $_missingFields = array();
+
+ /**
+ * @var array After processing, this contains a copy of $_data elements
+ * that were not mentioned in any validation rule.
+ */
+ protected $_unknownFields = array();
+
+ /**
+ * @var array Default namespaces, to search after user-defined namespaces.
+ */
+ protected $_namespaces = array('Zend_Filter', 'Zend_Validate');
+
+ /**
+ * @var array User-defined namespaces, to search before $_namespaces.
+ */
+ protected $_userNamespaces = array();
+
+ /**
+ * @var Zend_Filter_Interface The filter object that is run on values
+ * returned by the getEscaped() method.
+ */
+ protected $_defaultEscapeFilter = null;
+
+ /**
+ * @var array Default values to use when processing filters and validators.
+ */
+ protected $_defaults = array(
+ self::ALLOW_EMPTY => false,
+ self::BREAK_CHAIN => false,
+ self::ESCAPE_FILTER => 'HtmlEntities',
+ self::MISSING_MESSAGE => "Field '%field%' is required by rule '%rule%', but the field is missing",
+ self::NOT_EMPTY_MESSAGE => "You must give a non-empty value for field '%field%'",
+ self::PRESENCE => self::PRESENCE_OPTIONAL
+ );
+
+ /**
+ * @var boolean Set to False initially, this is set to True after the
+ * input data have been processed. Reset to False in setData() method.
+ */
+ protected $_processed = false;
+
+ /**
+ * @param array $filters
+ * @param array $validators
+ * @param array $data OPTIONAL
+ * @param array $options OPTIONAL
+ */
+ public function __construct($filterRules, $validatorRules, array $data = null, array $options = null)
+ {
+ if ($options) {
+ $this->setOptions($options);
+ }
+
+ $this->_filterRules = (array) $filterRules;
+ $this->_validatorRules = (array) $validatorRules;
+
+ if ($data) {
+ $this->setData($data);
+ }
+ }
+
+ /**
+ * @param mixed $namespaces
+ * @return void
+ */
+ public function addNamespace($namespaces)
+ {
+ foreach((array) $namespaces as $namespace) {
+ $this->_userNamespaces[] = $namespace;
+ }
+ $this->_namespaces = array_merge(
+ $this->_userNamespaces,
+ array('Zend_Filter', 'Zend_Validate')
+ );
+ }
+
+ /**
+ * @return array
+ */
+ public function getMessages()
+ {
+ $this->_process();
+ return array_merge($this->_invalidMessages, $this->_missingFields);
+ }
+
+ /**
+ * @return array
+ */
+ public function getErrors()
+ {
+ $this->_process();
+ return $this->_invalidErrors;
+ }
+
+ /**
+ * @return array
+ */
+ public function getInvalid()
+ {
+ $this->_process();
+ return $this->_invalidMessages;
+ }
+
+ /**
+ * @return array
+ */
+ public function getMissing()
+ {
+ $this->_process();
+ return $this->_missingFields;
+ }
+
+ /**
+ * @return array
+ */
+ public function getUnknown()
+ {
+ $this->_process();
+ return $this->_unknownFields;
+ }
+
+ /**
+ * @param string $fieldName OPTIONAL
+ * @return mixed
+ */
+ public function getEscaped($fieldName = null)
+ {
+ $this->_process();
+ $escapeFilter = $this->_getDefaultEscapeFilter();
+
+ if ($fieldName === null) {
+ return $this->_escapeRecursive($this->_validFields);
+ }
+ if (array_key_exists($fieldName, $this->_validFields)) {
+ return $this->_escapeRecursive($this->_validFields[$fieldName]);
+ }
+ return null;
+ }
+
+ /**
+ * @param mixed $value
+ * @return mixed
+ */
+ protected function _escapeRecursive($data)
+ {
+ if (!is_array($data)) {
+ return $this->_getDefaultEscapeFilter()->filter($data);
+ }
+ foreach ($data as &$element) {
+ $element = $this->_escapeRecursive($element);
+ }
+ return $data;
+ }
+
+ /**
+ * @param string $fieldName OPTIONAL
+ * @return mixed
+ */
+ public function getUnescaped($fieldName = null)
+ {
+ $this->_process();
+ if ($fieldName === null) {
+ return $this->_validFields;
+ }
+ if (array_key_exists($fieldName, $this->_validFields)) {
+ return $this->_validFields[$fieldName];
+ }
+ return null;
+ }
+
+ /**
+ * @param string $fieldName
+ * @return mixed
+ */
+ public function __get($fieldName)
+ {
+ return $this->getEscaped($fieldName);
+ }
+
+ /**
+ * @return boolean
+ */
+ public function hasInvalid()
+ {
+ $this->_process();
+ return !(empty($this->_invalidMessages));
+ }
+
+ /**
+ * @return boolean
+ */
+ public function hasMissing()
+ {
+ $this->_process();
+ return !(empty($this->_missingFields));
+ }
+
+ /**
+ * @return boolean
+ */
+ public function hasUnknown()
+ {
+ $this->_process();
+ return !(empty($this->_unknownFields));
+ }
+
+ /**
+ * @return boolean
+ */
+ public function hasValid()
+ {
+ $this->_process();
+ return !(empty($this->_validFields));
+ }
+
+ /**
+ * @param string $fieldName
+ * @return boolean
+ */
+ public function isValid($fieldName = null)
+ {
+ $this->_process();
+ if ($fieldName === null) {
+ return !($this->hasMissing() || $this->hasInvalid());
+ }
+ return array_key_exists($fieldName, $this->_validFields);
+ }
+
+ /**
+ * @param string $fieldName
+ * @return boolean
+ */
+ public function __isset($fieldName)
+ {
+ $this->_process();
+ return isset($this->_validFields[$fieldName]);
+ }
+
+ /**
+ * @return void
+ * @throw Zend_Filter_Exception
+ */
+ public function process()
+ {
+ $this->_process();
+ if ($this->hasInvalid()) {
+ require_once 'Zend/Filter/Exception.php';
+ throw new Zend_Filter_Exception("Input has invalid fields");
+ }
+ if ($this->hasMissing()) {
+ require_once 'Zend/Filter/Exception.php';
+ throw new Zend_Filter_Exception("Input has missing fields");
+ }
+ }
+
+ /**
+ * @param array $data
+ * @return void
+ */
+ public function setData(array $data)
+ {
+ $this->_data = $data;
+
+ /**
+ * Reset to initial state
+ */
+ $this->_validFields = array();
+ $this->_invalidMessages = array();
+ $this->_invalidErrors = array();
+ $this->_missingFields = array();
+ $this->_unknownFields = array();
+
+ $this->_processed = false;
+ }
+
+ /**
+ * @param mixed $escapeFilter
+ * @return void
+ */
+ public function setDefaultEscapeFilter($escapeFilter)
+ {
+ if (is_string($escapeFilter) || is_array($escapeFilter)) {
+ $escapeFilter = $this->_getFilter($escapeFilter);
+ }
+ if (!$escapeFilter instanceof Zend_Filter_Interface) {
+ require_once 'Zend/Filter/Exception.php';
+ throw new Zend_Filter_Exception('Escape filter specified does not implement Zend_Filter_Interface');
+ }
+ $this->_defaultEscapeFilter = $escapeFilter;
+ return $escapeFilter;
+ }
+
+ /**
+ * @param array $options
+ * @return void
+ * @throws Zend_Filter_Exception if an unknown option is given
+ */
+ public function setOptions(array $options)
+ {
+ foreach ($options as $option => $value) {
+ switch ($option) {
+ case self::ESCAPE_FILTER:
+ $this->setDefaultEscapeFilter($value);
+ break;
+ case self::NAMESPACE:
+ $this->addNamespace($value);
+ break;
+ case self::ALLOW_EMPTY:
+ case self::BREAK_CHAIN:
+ case self::MISSING_MESSAGE:
+ case self::NOT_EMPTY_MESSAGE:
+ case self::PRESENCE:
+ $this->_defaults[$option] = $value;
+ break;
+ default:
+ require_once 'Zend/Filter/Exception.php';
+ throw new Zend_Filter_Exception("Unknown option '$option'");
+ break;
+ }
+ }
+ }
+
+ /*
+ * Protected methods
+ */
+
+ /**
+ * @return void
+ */
+ protected function _filter()
+ {
+ foreach ($this->_filterRules as $ruleName => &$filterRule) {
+ /**
+ * Make sure we have an array representing this filter chain.
+ * Don't typecast to (array) because it might be a Zend_Filter object
+ */
+ if (!is_array($filterRule)) {
+ $filterRule = array($filterRule);
+ }
+
+ /**
+ * Filters are indexed by integer, metacommands are indexed by string.
+ * Pick out the filters.
+ */
+ $filterList = array();
+ foreach ($filterRule as $key => $value) {
+ if (is_int($key)) {
+ $filterList[] = $value;
+ }
+ }
+
+ /**
+ * Use defaults for filter metacommands.
+ */
+ $filterRule[self::RULE] = $ruleName;
+ if (!isset($filterRule[self::FIELDS])) {
+ $filterRule[self::FIELDS] = $ruleName;
+ }
+
+ /**
+ * Load all the filter classes and add them to the chain.
+ */
+ if (!isset($filterRule[self::FILTER_CHAIN])) {
+ $filterRule[self::FILTER_CHAIN] = new Zend_Filter();
+ foreach ($filterList as $filter) {
+ if (is_string($filter) || is_array($filter)) {
+ $filter = $this->_getFilter($filter);
+ }
+ $filterRule[self::FILTER_CHAIN]->addFilter($filter);
+ }
+ }
+
+ /**
+ * If the ruleName is the special wildcard rule,
+ * then apply the filter chain to all input data.
+ * Else just process the field named by the rule.
+ */
+ if ($ruleName == self::RULE_WILDCARD) {
+ foreach (array_keys($this->_data) as $field) {
+ $this->_filterRule(array_merge($filterRule, array(self::FIELDS => $field)));
+ }
+ } else {
+ $this->_filterRule($filterRule);
+ }
+ }
+ }
+
+ /**
+ * @param array $filterRule
+ * @return void
+ */
+ protected function _filterRule(array $filterRule)
+ {
+ $field = $filterRule[self::FIELDS];
+ if (!array_key_exists($field, $this->_data)) {
+ return;
+ }
+ if (is_array($this->_data[$field])) {
+ foreach ($this->_data[$field] as $key => $value) {
+ $this->_data[$field][$key] = $filterRule[self::FILTER_CHAIN]->filter($value);
+ }
+ } else {
+ $this->_data[$field] =
+ $filterRule[self::FILTER_CHAIN]->filter($this->_data[$field]);
+ }
+ }
+
+ /**
+ * @return Zend_Filter_Interface
+ */
+ protected function _getDefaultEscapeFilter()
+ {
+ if ($this->_defaultEscapeFilter !== null) {
+ return $this->_defaultEscapeFilter;
+ }
+ return $this->setDefaultEscapeFilter($this->_defaults[self::ESCAPE_FILTER]);
+ }
+
+ /**
+ * @param string $rule
+ * @param string $field
+ * @return string
+ */
+ protected function _getMissingMessage($rule, $field)
+ {
+ $message = $this->_defaults[self::MISSING_MESSAGE];
+ $message = str_replace('%rule%', $rule, $message);
+ $message = str_replace('%field%', $field, $message);
+ return $message;
+ }
+
+ /**
+ * @return string
+ */
+ protected function _getNotEmptyMessage($rule, $field)
+ {
+ $message = $this->_defaults[self::NOT_EMPTY_MESSAGE];
+ $message = str_replace('%rule%', $rule, $message);
+ $message = str_replace('%field%', $field, $message);
+ return $message;
+ }
+
+ /**
+ * @return void
+ */
+ protected function _process()
+ {
+ if ($this->_processed === false) {
+ $this->_filter();
+ $this->_validate();
+ $this->_processed = true;
+ }
+ }
+
+ /**
+ * @return void
+ */
+ protected function _validate()
+ {
+ /**
+ * Special case: if there are no validators, treat all fields as valid.
+ */
+ if (!$this->_validatorRules) {
+ $this->_validFields = $this->_data;
+ $this->_data = array();
+ return;
+ }
+
+ foreach ($this->_validatorRules as $ruleName => &$validatorRule) {
+ /**
+ * Make sure we have an array representing this validator chain.
+ * Don't typecast to (array) because it might be a Zend_Validate object
+ */
+ if (!is_array($validatorRule)) {
+ $validatorRule = array($validatorRule);
+ }
+
+ /**
+ * Validators are indexed by integer, metacommands are indexed by string.
+ * Pick out the validators.
+ */
+ $validatorList = array();
+ foreach ($validatorRule as $key => $value) {
+ if (is_int($key)) {
+ $validatorList[] = $value;
+ }
+ }
+
+ /**
+ * Use defaults for validation metacommands.
+ */
+ $validatorRule[self::RULE] = $ruleName;
+ if (!isset($validatorRule[self::FIELDS])) {
+ $validatorRule[self::FIELDS] = $ruleName;
+ }
+ if (!isset($validatorRule[self::BREAK_CHAIN])) {
+ $validatorRule[self::BREAK_CHAIN] = $this->_defaults[self::BREAK_CHAIN];
+ }
+ if (!isset($validatorRule[self::PRESENCE])) {
+ $validatorRule[self::PRESENCE] = $this->_defaults[self::PRESENCE];
+ }
+ if (!isset($validatorRule[self::ALLOW_EMPTY])) {
+ $validatorRule[self::ALLOW_EMPTY] = $this->_defaults[self::ALLOW_EMPTY];
+ }
+ if (!isset($validatorRule[self::MESSAGES])) {
+ $validatorRule[self::MESSAGES] = array();
+ } else if (!is_array($validatorRule[self::MESSAGES])) {
+ $validatorRule[self::MESSAGES] = array($validatorRule[self::MESSAGES]);
+ } else if (!array_intersect_key($validatorList, $validatorRule[self::MESSAGES])) {
+ $validatorRule[self::MESSAGES] = array($validatorRule[self::MESSAGES]);
+ }
+
+ /**
+ * Load all the validator classes and add them to the chain.
+ */
+ if (!isset($validatorRule[self::VALIDATOR_CHAIN])) {
+ $validatorRule[self::VALIDATOR_CHAIN] = new Zend_Validate();
+ $i = 0;
+ foreach ($validatorList as $validator) {
+
+ if (is_string($validator) || is_array($validator)) {
+ $validator = $this->_getValidator($validator);
+ }
+ if (isset($validatorRule[self::MESSAGES][$i])) {
+ $value = $validatorRule[self::MESSAGES][$i];
+ if (is_array($value)) {
+ $validator->setMessages($value);
+ } else {
+ $validator->setMessage($value);
+ }
+ }
+
+ $validatorRule[self::VALIDATOR_CHAIN]->addValidator($validator, $validatorRule[self::BREAK_CHAIN]);
+ ++$i;
+ }
+ $validatorRule[self::VALIDATOR_CHAIN_COUNT] = $i;
+ }
+
+ /**
+ * If the ruleName is the special wildcard rule,
+ * then apply the validator chain to all input data.
+ * Else just process the field named by the rule.
+ */
+ if ($ruleName == self::RULE_WILDCARD) {
+ foreach (array_keys($this->_data) as $field) {
+ $this->_validateRule(array_merge($validatorRule, array(self::FIELDS => $field)));
+ }
+ } else {
+ $this->_validateRule($validatorRule);
+ }
+ }
+
+ /**
+ * Unset fields in $_data that have been added to other arrays.
+ * We have to wait until all rules have been processed because
+ * a given field may be referenced by multiple rules.
+ */
+ foreach (array_merge(array_keys($this->_missingFields), array_keys($this->_invalidMessages)) as $rule) {
+ foreach ((array) $this->_validatorRules[$rule][self::FIELDS] as $field) {
+ unset($this->_data[$field]);
+ }
+ }
+ foreach ($this->_validFields as $field => $value) {
+ unset($this->_data[$field]);
+ }
+
+ /**
+ * Anything left over in $_data is an unknown field.
+ */
+ $this->_unknownFields = $this->_data;
+ }
+
+ /**
+ * @param array $validatorRule
+ * @return void
+ */
+ protected function _validateRule(array $validatorRule)
+ {
+ /**
+ * Get one or more data values from input, and check for missing fields.
+ * Apply defaults if fields are missing.
+ */
+ $data = array();
+ foreach ((array) $validatorRule[self::FIELDS] as $field) {
+ if (array_key_exists($field, $this->_data)) {
+ $data[$field] = $this->_data[$field];
+ } else
+ if (array_key_exists(self::DEFAULT_VALUE, $validatorRule)) {
+ if (is_array($validatorRule[self::DEFAULT_VALUE])) {
+ $key = array_search($field, $validatorRule[self::FIELDS]);
+ if (array_key_exists($key, $validatorRule[self::DEFAULT_VALUE])) {
+ $data[$field] = $validatorRule[self::DEFAULT_VALUE][$key];
+ }
+ } else {
+ $data[$field] = $validatorRule[self::DEFAULT_VALUE];
+ }
+ } else
+ if ($validatorRule[self::PRESENCE] == self::PRESENCE_REQUIRED) {
+ $this->_missingFields[$validatorRule[self::RULE]][] =
+ $this->_getMissingMessage($validatorRule[self::RULE], $field);
+ }
+ }
+
+ /**
+ * If any required fields are missing, break the loop.
+ */
+ if (isset($this->_missingFields[$validatorRule[self::RULE]]) && count($this->_missingFields[$validatorRule[self::RULE]]) > 0) {
+ return;
+ }
+
+ /**
+ * Evaluate the inputs against the validator chain.
+ */
+ if (count((array) $validatorRule[self::FIELDS]) > 1) {
+ if (!$validatorRule[self::VALIDATOR_CHAIN]->isValid($data)) {
+ $this->_invalidMessages[$validatorRule[self::RULE]] = $validatorRule[self::VALIDATOR_CHAIN]->getMessages();
+ $this->_invalidErrors[$validatorRule[self::RULE]] = $validatorRule[self::VALIDATOR_CHAIN]->getErrors();
+ return;
+ }
+ }
+
+ $failed = false;
+ foreach ($data as $fieldKey => $field) {
+ if (!is_array($field)) {
+ $field = array($field);
+ }
+ foreach ($field as $value) {
+ if (empty($value)) {
+ if ($validatorRule[self::ALLOW_EMPTY] == true) {
+ continue;
+ }
+ if ($validatorRule[self::VALIDATOR_CHAIN_COUNT] == 0) {
+ $notEmptyValidator = $this->_getValidator('NotEmpty');
+ $notEmptyValidator->setMessage($this->_getNotEmptyMessage($validatorRule[self::RULE], $fieldKey));
+ $validatorRule[self::VALIDATOR_CHAIN]->addValidator($notEmptyValidator);
+ }
+ }
+ if (!$validatorRule[self::VALIDATOR_CHAIN]->isValid($value)) {
+ $this->_invalidMessages[$validatorRule[self::RULE]] =
+ $validatorRule[self::VALIDATOR_CHAIN]->getMessages();
+ $this->_invalidErrors[$validatorRule[self::RULE]] =
+ $validatorRule[self::VALIDATOR_CHAIN]->getErrors();
+ unset($this->_validFields[$fieldKey]);
+ $failed = true;
+ if ($validatorRule[self::BREAK_CHAIN]) {
+ return;
+ }
+ }
+ }
+ }
+ if ($failed) {
+ return;
+ }
+
+ /**
+ * If we got this far, the inputs for this rule pass validation.
+ */
+ foreach ((array) $validatorRule[self::FIELDS] as $field) {
+ if (array_key_exists($field, $data)) {
+ $this->_validFields[$field] = $data[$field];
+ }
+ }
+ }
+
+ /**
+ * @param mixed $classBaseName
+ * @return Zend_Filter_Interface
+ */
+ protected function _getFilter($classBaseName)
+ {
+ return $this->_getFilterOrValidator('Zend_Filter_Interface', $classBaseName);
+ }
+
+ /**
+ * @param mixed $classBaseName
+ * @return Zend_Validate_Interface
+ */
+ protected function _getValidator($classBaseName)
+ {
+ return $this->_getFilterOrValidator('Zend_Validate_Interface', $classBaseName);
+ }
+
+ /**
+ * @param string $interface
+ * @param mixed $classBaseName
+ * @return mixed object implementing Zend_Filter_Interface or Zend_Validate_Interface
+ * @throws Zend_Filter_Exception
+ */
+ protected function _getFilterOrValidator($interface, $classBaseName)
+ {
+ $args = array();
+ if (is_array($classBaseName)) {
+ $args = $classBaseName;
+ $classBaseName = array_shift($args);
+ }
+ foreach ($this->_namespaces as $namespace) {
+ $className = $namespace . '_' . ucfirst($classBaseName);
+ try {
+ Zend_Loader::loadClass($className);
+ $class = new ReflectionClass($className);
+ if ($class->implementsInterface((string) $interface)) {
+ if ($class->hasMethod('__construct')) {
+ $object = $class->newInstanceArgs($args);
+ } else {
+ $object = $class->newInstance();
+ }
+ return $object;
+ }
+ } catch (Zend_Exception $e) {
+ // fallthrough and continue
+ }
+ }
+
+ if (!class_exists($className, false)) {
+ $msg = "Unable to find the implementation of the '$classBaseName' class";
+ } else {
+ $msg = "Class based on basename '$classBaseName' must implement the '$interface' interface";
+ }
+
+ /**
+ * @see Zend_Filter_Exception
+ */
+ require_once 'Zend/Filter/Exception.php';
+ throw new Zend_Filter_Exception($msg);
+ }
+
+}
diff --git a/libs/Zend/Filter/Int.php b/libs/Zend/Filter/Int.php
new file mode 100755
index 0000000000..4af8f9681d
--- /dev/null
+++ b/libs/Zend/Filter/Int.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Int.php 4135 2007-03-20 12:46:11Z darby $
+ */
+
+
+/**
+ * @see Zend_Filter_Interface
+ */
+require_once 'Zend/Filter/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Filter_Int implements Zend_Filter_Interface
+{
+ /**
+ * Defined by Zend_Filter_Interface
+ *
+ * Returns (int) $value
+ *
+ * @param string $value
+ * @return integer
+ */
+ public function filter($value)
+ {
+ return (int) ((string) $value);
+ }
+}
diff --git a/libs/Zend/Filter/Interface.php b/libs/Zend/Filter/Interface.php
new file mode 100755
index 0000000000..79187b9ace
--- /dev/null
+++ b/libs/Zend/Filter/Interface.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 3278 2007-02-07 21:54:50Z darby $
+ */
+
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Filter_Interface
+{
+ /**
+ * Returns the result of filtering $value
+ *
+ * @param mixed $value
+ * @throws Zend_Filter_Exception If filtering $value is impossible
+ * @return mixed
+ */
+ public function filter($value);
+}
diff --git a/libs/Zend/Filter/RealPath.php b/libs/Zend/Filter/RealPath.php
new file mode 100755
index 0000000000..a80efe0c9f
--- /dev/null
+++ b/libs/Zend/Filter/RealPath.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: RealPath.php 4135 2007-03-20 12:46:11Z darby $
+ */
+
+
+/**
+ * @see Zend_Filter_Interface
+ */
+require_once 'Zend/Filter/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Filter_RealPath implements Zend_Filter_Interface
+{
+ /**
+ * Defined by Zend_Filter_Interface
+ *
+ * Returns realpath($value)
+ *
+ * @param string $value
+ * @return string
+ */
+ public function filter($value)
+ {
+ return realpath((string) $value);
+ }
+}
diff --git a/libs/Zend/Filter/StringToLower.php b/libs/Zend/Filter/StringToLower.php
new file mode 100755
index 0000000000..cc7c31b428
--- /dev/null
+++ b/libs/Zend/Filter/StringToLower.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: StringToLower.php 5125 2007-06-05 20:12:16Z andries $
+ */
+
+
+/**
+ * @see Zend_Filter_Interface
+ */
+require_once 'Zend/Filter/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Filter_StringToLower implements Zend_Filter_Interface
+{
+ /**
+ * Encoding for the input string
+ *
+ * @var string
+ */
+ protected $_encoding = null;
+
+ /**
+ * Set the input encoding for the given string
+ *
+ * @param string $encoding
+ * @throws Zend_Filter_Exception
+ */
+ public function setEncoding($encoding = null)
+ {
+ if (!function_exists('mb_strtolower')) {
+ require_once 'Zend/Filter/Exception.php';
+ throw new Zend_Filter_Exception('mbstring is required for this feature');
+ }
+ $this->_encoding = $encoding;
+ }
+
+ /**
+ * Defined by Zend_Filter_Interface
+ *
+ * Returns the string $value, converting characters to lowercase as necessary
+ *
+ * @param string $value
+ * @return string
+ */
+ public function filter($value)
+ {
+ if ($this->_encoding) {
+ return mb_strtolower((string) $value, $this->_encoding);
+ }
+
+ return strtolower((string) $value);
+ }
+}
diff --git a/libs/Zend/Filter/StringToUpper.php b/libs/Zend/Filter/StringToUpper.php
new file mode 100755
index 0000000000..bfb34f08f9
--- /dev/null
+++ b/libs/Zend/Filter/StringToUpper.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: StringToUpper.php 5127 2007-06-05 20:26:59Z andries $
+ */
+
+
+/**
+ * @see Zend_Filter_Interface
+ */
+require_once 'Zend/Filter/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Filter_StringToUpper implements Zend_Filter_Interface
+{
+ /**
+ * Encoding for the input string
+ *
+ * @var string
+ */
+ protected $_encoding = null;
+
+ /**
+ * Set the input encoding for the given string
+ *
+ * @param string $encoding
+ * @throws Zend_Filter_Exception
+ */
+ public function setEncoding($encoding = null)
+ {
+ if (!function_exists('mb_strtoupper')) {
+ require_once 'Zend/Filter/Exception.php';
+ throw new Zend_Filter_Exception('mbstring is required for this feature');
+ }
+ $this->_encoding = $encoding;
+ }
+
+ /**
+ * Defined by Zend_Filter_Interface
+ *
+ * Returns the string $value, converting characters to uppercase as necessary
+ *
+ * @param string $value
+ * @return string
+ */
+ public function filter($value)
+ {
+ if ($this->_encoding) {
+ return mb_strtoupper((string) $value, $this->_encoding);
+ }
+
+ return strtoupper((string) $value);
+ }
+}
diff --git a/libs/Zend/Filter/StringTrim.php b/libs/Zend/Filter/StringTrim.php
new file mode 100755
index 0000000000..8031cc0148
--- /dev/null
+++ b/libs/Zend/Filter/StringTrim.php
@@ -0,0 +1,97 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: StringTrim.php 4135 2007-03-20 12:46:11Z darby $
+ */
+
+
+/**
+ * @see Zend_Filter_Interface
+ */
+require_once 'Zend/Filter/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Filter_StringTrim implements Zend_Filter_Interface
+{
+ /**
+ * List of characters provided to the trim() function
+ *
+ * If this is null, then trim() is called with no specific character list,
+ * and its default behavior will be invoked, trimming whitespace.
+ *
+ * @var string|null
+ */
+ protected $_charList;
+
+ /**
+ * Sets filter options
+ *
+ * @param string $charList
+ * @return void
+ */
+ public function __construct($charList = null)
+ {
+ $this->_charList = $charList;
+ }
+
+ /**
+ * Returns the charList option
+ *
+ * @return string|null
+ */
+ public function getCharList()
+ {
+ return $this->_charList;
+ }
+
+ /**
+ * Sets the charList option
+ *
+ * @param string|null $charList
+ * @return Zend_Filter_StringTrim Provides a fluent interface
+ */
+ public function setCharList($charList)
+ {
+ $this->_charList = $charList;
+ return $this;
+ }
+
+ /**
+ * Defined by Zend_Filter_Interface
+ *
+ * Returns the string $value with characters stripped from the beginning and end
+ *
+ * @param string $value
+ * @return string
+ */
+ public function filter($value)
+ {
+ if (null === $this->_charList) {
+ return trim((string) $value);
+ } else {
+ return trim((string) $value, $this->_charList);
+ }
+ }
+}
diff --git a/libs/Zend/Filter/StripTags.php b/libs/Zend/Filter/StripTags.php
new file mode 100755
index 0000000000..d34a9f26ab
--- /dev/null
+++ b/libs/Zend/Filter/StripTags.php
@@ -0,0 +1,284 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: StripTags.php 5417 2007-06-22 19:24:07Z darby $
+ */
+
+
+/**
+ * @see Zend_Filter_Interface
+ */
+require_once 'Zend/Filter/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Filter_StripTags implements Zend_Filter_Interface
+{
+ /**
+ * Unique ID prefix used for allowing comments
+ */
+ const UNIQUE_ID_PREFIX = '__Zend_Filter_StripTags__';
+
+ /**
+ * Whether comments are allowed
+ *
+ * If false (the default), then comments are removed from the input string.
+ *
+ * @var boolean
+ */
+ public $commentsAllowed;
+
+ /**
+ * Array of allowed tags and allowed attributes for each allowed tag
+ *
+ * Tags are stored in the array keys, and the array values are themselves
+ * arrays of the attributes allowed for the corresponding tag.
+ *
+ * @var array
+ */
+ protected $_tagsAllowed = array();
+
+ /**
+ * Array of allowed attributes for all allowed tags
+ *
+ * Attributes stored here are allowed for all of the allowed tags.
+ *
+ * @var array
+ */
+ protected $_attributesAllowed = array();
+
+ /**
+ * Sets the filter options
+ *
+ * @param array|string $tagsAllowed
+ * @param array|string $attributesAllowed
+ * @param boolean $allowComments
+ * @return void
+ */
+ public function __construct($tagsAllowed = null, $attributesAllowed = null, $commentsAllowed = false)
+ {
+ $this->setTagsAllowed($tagsAllowed);
+ $this->setAttributesAllowed($attributesAllowed);
+ $this->commentsAllowed = (boolean) $commentsAllowed;
+ }
+
+ /**
+ * Returns the tagsAllowed option
+ *
+ * @return array
+ */
+ public function getTagsAllowed()
+ {
+ return $this->_tagsAllowed;
+ }
+
+ /**
+ * Sets the tagsAllowed option
+ *
+ * @param array|string $tagsAllowed
+ * @return Zend_Filter_StripTags Provides a fluent interface
+ */
+ public function setTagsAllowed($tagsAllowed)
+ {
+ if (!is_array($tagsAllowed)) {
+ $tagsAllowed = array($tagsAllowed);
+ }
+
+ foreach ($tagsAllowed as $index => $element) {
+ // If the tag was provided without attributes
+ if (is_int($index) && is_string($element)) {
+ // Canonicalize the tag name
+ $tagName = strtolower($element);
+ // Store the tag as allowed with no attributes
+ $this->_tagsAllowed[$tagName] = array();
+ }
+ // Otherwise, if a tag was provided with attributes
+ else if (is_string($index) && (is_array($element) || is_string($element))) {
+ // Canonicalize the tag name
+ $tagName = strtolower($index);
+ // Canonicalize the attributes
+ if (is_string($element)) {
+ $element = array($element);
+ }
+ // Store the tag as allowed with the provided attributes
+ $this->_tagsAllowed[$tagName] = array();
+ foreach ($element as $attribute) {
+ if (is_string($attribute)) {
+ // Canonicalize the attribute name
+ $attributeName = strtolower($attribute);
+ $this->_tagsAllowed[$tagName][$attributeName] = null;
+ }
+ }
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Returns the attributesAllowed option
+ *
+ * @return array
+ */
+ public function getAttributesAllowed()
+ {
+ return $this->_attributesAllowed;
+ }
+
+ /**
+ * Sets the attributesAllowed option
+ *
+ * @param array|string $attributesAllowed
+ * @return Zend_Filter_StripTags Provides a fluent interface
+ */
+ public function setAttributesAllowed($attributesAllowed)
+ {
+ if (!is_array($attributesAllowed)) {
+ $attributesAllowed = array($attributesAllowed);
+ }
+
+ // Store each attribute as allowed
+ foreach ($attributesAllowed as $attribute) {
+ if (is_string($attribute)) {
+ // Canonicalize the attribute name
+ $attributeName = strtolower($attribute);
+ $this->_attributesAllowed[$attributeName] = null;
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Defined by Zend_Filter_Interface
+ *
+ * @todo improve docblock descriptions
+ *
+ * @param string $value
+ * @return string
+ */
+ public function filter($value)
+ {
+ $valueCopy = (string) $value;
+
+ // If comments are allowed, then replace them with unique identifiers
+ if ($this->commentsAllowed) {
+ preg_match_all('/<\!--.*?--\s*>/s' , (string) $valueCopy, $matches);
+ $comments = array_unique($matches[0]);
+ foreach ($comments as $k => $v) {
+ $valueCopy = str_replace($v, self::UNIQUE_ID_PREFIX . $k, $valueCopy);
+ }
+ }
+
+ // Initialize accumulator for filtered data
+ $dataFiltered = '';
+ // Parse the input data iteratively as regular pre-tag text followed by a
+ // tag; either may be empty strings
+ preg_match_all('/([^<]*)(<?[^>]*>?)/', (string) $valueCopy, $matches);
+ // Iterate over each set of matches
+ foreach ($matches[1] as $index => $preTag) {
+ // If the pre-tag text is non-empty, strip any ">" characters from it
+ if (strlen($preTag)) {
+ $preTag = str_replace('>', '', $preTag);
+ }
+ // If a tag exists in this match, then filter the tag
+ $tag = $matches[2][$index];
+ if (strlen($tag)) {
+ $tagFiltered = $this->_filterTag($tag);
+ } else {
+ $tagFiltered = '';
+ }
+ // Add the filtered pre-tag text and filtered tag to the data buffer
+ $dataFiltered .= $preTag . $tagFiltered;
+ }
+
+ // If comments are allowed, then replace the unique identifiers with the corresponding comments
+ if ($this->commentsAllowed) {
+ foreach ($comments as $k => $v) {
+ $dataFiltered = str_replace(self::UNIQUE_ID_PREFIX . $k, $v, $dataFiltered);
+ }
+ }
+
+ // Return the filtered data
+ return $dataFiltered;
+ }
+
+ /**
+ * Filters a single tag against the current option settings
+ *
+ * @param string $tag
+ * @return string
+ */
+ protected function _filterTag($tag)
+ {
+ // Parse the tag into:
+ // 1. a starting delimiter (mandatory)
+ // 2. a tag name (if available)
+ // 3. a string of attributes (if available)
+ // 4. an ending delimiter (if available)
+ $isMatch = preg_match('~(</?)(\w*)((/(?!>)|[^/>])*)(/?>)~', $tag, $matches);
+ // If the tag does not match, then strip the tag entirely
+ if (!$isMatch) {
+ return '';
+ }
+ // Save the matches to more meaningfully named variables
+ $tagStart = $matches[1];
+ $tagName = strtolower($matches[2]);
+ $tagAttributes = $matches[3];
+ $tagEnd = $matches[5];
+ // If the tag is not an allowed tag, then remove the tag entirely
+ if (!isset($this->_tagsAllowed[$tagName])) {
+ return '';
+ }
+ // Trim the attribute string of whitespace at the ends
+ $tagAttributes = trim($tagAttributes);
+ // If there are non-whitespace characters in the attribute string
+ if (strlen($tagAttributes)) {
+ // Parse iteratively for well-formed attributes
+ preg_match_all('/(\w+)=([\'"])((.(?!=\2))+)\2/s', $tagAttributes, $matches);
+ // Initialize valid attribute accumulator
+ $tagAttributes = '';
+ // Iterate over each matched attribute
+ foreach ($matches[1] as $index => $attributeName) {
+ $attributeName = strtolower($attributeName);
+ $attributeDelimiter = $matches[2][$index];
+ $attributeValue = $matches[3][$index];
+ // If the attribute is not allowed, then remove it entirely
+ if (!array_key_exists($attributeName, $this->_tagsAllowed[$tagName])
+ && !array_key_exists($attributeName, $this->_attributesAllowed)) {
+ continue;
+ }
+ // Add the attribute to the accumulator
+ $tagAttributes .= " $attributeName=" . $attributeDelimiter
+ . $attributeValue . $attributeDelimiter;
+ }
+ }
+ // Reconstruct tags ending with "/>" as backwards-compatible XHTML tag
+ if (strpos($tagEnd, '/') !== false) {
+ $tagEnd = " $tagEnd";
+ }
+ // Return the filtered tag
+ return $tagStart . $tagName . $tagAttributes . $tagEnd;
+ }
+}
diff --git a/libs/Zend/Gdata.php b/libs/Zend/Gdata.php
new file mode 100755
index 0000000000..8dd3785918
--- /dev/null
+++ b/libs/Zend/Gdata.php
@@ -0,0 +1,133 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Gdata
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Gdata_App
+ */
+require_once 'Zend/Gdata/App.php';
+
+/**
+ * Provides functionality to interact with Google data APIs
+ * Subclasses exist to implement service-specific features
+ *
+ * As the Google data API protocol is based upon the Atom Publishing Protocol
+ * (APP), GData functionality extends the appropriate Zend_Gdata_App classes
+ *
+ * @link http://code.google.com/apis/gdata/overview.html
+ *
+ * @category Zend
+ * @package Zend_Gdata
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Gdata extends Zend_Gdata_App
+{
+
+ /**
+ * Service name for use with Google's authentication mechanisms
+ *
+ * @var string
+ */
+ const AUTH_SERVICE_NAME = 'xapi';
+
+ /**
+ * Default URI to which to POST.
+ *
+ * @var string
+ */
+ protected $_defaultPostUri = null;
+
+ /**
+ * Packages to search for classes when using magic __call method, in order.
+ *
+ * @var array
+ */
+ protected $_registeredPackages = array(
+ 'Zend_Gdata_Kind',
+ 'Zend_Gdata_Extension',
+ 'Zend_Gdata',
+ 'Zend_Gdata_App_Extension',
+ 'Zend_Gdata_App');
+
+ /**
+ * Namespaces used for GData data
+ *
+ * @var array
+ */
+ public static $namespaces = array(
+ 'openSearch' => 'http://a9.com/-/spec/opensearchrss/1.0/',
+ 'rss' => 'http://blogs.law.harvard.edu/tech/rss',
+ 'gd' => 'http://schemas.google.com/g/2005');
+
+ /**
+ * Create Gdata object
+ *
+ * @param Zend_Http_Client $client
+ */
+ public function __construct($client = null)
+ {
+ parent::__construct($client);
+ }
+
+ /**
+ * Retreive feed object
+ *
+ * @param mixed $location The location as string or Zend_Gdata_Query
+ * @param string $className The class type to use for returning the feed
+ * @return Zend_Gdata_Feed
+ */
+ public function getFeed($location, $className='Zend_Gdata_Feed')
+ {
+ if (is_string($location)) {
+ $uri = $location;
+ } elseif ($location instanceof Zend_Gdata_Query) {
+ $uri = $location->getQueryUrl();
+ } else {
+ require_once 'Zend/Gdata/App/InvalidArgumentException.php';
+ throw new Zend_Gdata_App_InvalidArgumentException(
+ 'You must specify the location as either a string URI ' .
+ 'or a child of Zend_Gdata_Query');
+ }
+ return parent::getFeed($uri, $className);
+ }
+
+ /**
+ * Retreive entry object
+ *
+ * @param mixed $location The location as string or Zend_Gdata_Query
+ * @return Zend_Gdata_Feed
+ */
+ public function getEntry($location, $className='Zend_Gdata_Entry')
+ {
+ if (is_string($location)) {
+ $uri = $location;
+ } elseif ($location instanceof Zend_Gdata_Query) {
+ $uri = $location->getQueryUrl();
+ } else {
+ require_once 'Zend/Gdata/App/InvalidArgumentException.php';
+ throw new Zend_Gdata_App_InvalidArgumentException(
+ 'You must specify the location as either a string URI ' .
+ 'or a child of Zend_Gdata_Query');
+ }
+ return parent::getEntry($uri, $className);
+ }
+
+}
diff --git a/libs/Zend/Http/Client.php b/libs/Zend/Http/Client.php
new file mode 100755
index 0000000000..505027364f
--- /dev/null
+++ b/libs/Zend/Http/Client.php
@@ -0,0 +1,1051 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Client
+ * @version $Id: Client.php 5439 2007-06-24 13:15:43Z shahar $
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+require_once 'Zend/Loader.php';
+require_once 'Zend/Uri.php';
+require_once 'Zend/Http/Client/Adapter/Interface.php';
+require_once 'Zend/Http/Response.php';
+require_once 'Zend/Http/Client/Exception.php';
+
+/**
+ * Zend_Http_Client is an implemetation of an HTTP client in PHP. The client
+ * supports basic features like sending different HTTP requests and handling
+ * redirections, as well as more advanced features like proxy settings, HTTP
+ * authentication and cookie persistance (using a Zend_Http_CookieJar object)
+ *
+ * @todo Implement proxy settings
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Client
+ * @throws Zend_Http_Client_Exception
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Http_Client
+{
+ /**
+ * HTTP request methods
+ */
+ const GET = 'GET';
+ const POST = 'POST';
+ const PUT = 'PUT';
+ const HEAD = 'HEAD';
+ const DELETE = 'DELETE';
+ const TRACE = 'TRACE';
+ const OPTIONS = 'OPTIONS';
+ const CONNECT = 'CONNECT';
+
+ /**
+ * Supported HTTP Authentication methods
+ */
+ const AUTH_BASIC = 'basic';
+ //const AUTH_DIGEST = 'digest'; <-- not implemented yet
+
+ /**
+ * HTTP protocol versions
+ */
+ const HTTP_1 = '1.1';
+ const HTTP_0 = '1.0';
+
+ /**
+ * POST data encoding methods
+ */
+ const ENC_URLENCODED = 'application/x-www-form-urlencoded';
+ const ENC_FORMDATA = 'multipart/form-data';
+
+ /**
+ * Configuration array, set using the constructor or using ::setConfig()
+ *
+ * @var unknown_type
+ */
+ protected $config = array(
+ 'maxredirects' => 5,
+ 'strictredirects' => false,
+ 'useragent' => 'Zend_Http_Client',
+ 'timeout' => 10,
+ 'adapter' => 'Zend_Http_Client_Adapter_Socket',
+ 'httpversion' => self::HTTP_1,
+ 'keepalive' => false,
+ 'storeresponse' => true
+ );
+
+ /**
+ * The adapter used to preform the actual connection to the server
+ *
+ * @var Zend_Http_Client_Adapter_Interface
+ */
+ protected $adapter = null;
+
+ /**
+ * Request URI
+ *
+ * @var Zend_Uri_Http
+ */
+ protected $uri;
+
+ /**
+ * Associative array of request headers
+ *
+ * @var array
+ */
+ protected $headers = array();
+
+ /**
+ * HTTP request method
+ *
+ * @var string
+ */
+ protected $method = self::GET;
+
+ /**
+ * Associative array of GET parameters
+ *
+ * @var array
+ */
+ protected $paramsGet = array();
+
+ /**
+ * Assiciative array of POST parameters
+ *
+ * @var array
+ */
+ protected $paramsPost = array();
+
+ /**
+ * Request body content type (for POST requests)
+ *
+ * @var string
+ */
+ protected $enctype = null;
+
+ /**
+ * The raw post data to send. Could be set by setRawData($data, $enctype).
+ *
+ * @var string
+ */
+ protected $raw_post_data = null;
+
+ /**
+ * HTTP Authentication settings
+ *
+ * Expected to be an associative array with this structure:
+ * $this->auth = array('user' => 'username', 'password' => 'password', 'type' => 'basic')
+ * Where 'type' should be one of the supported authentication types (see the AUTH_*
+ * constants), for example 'basic' or 'digest'.
+ *
+ * If null, no authentication will be used.
+ *
+ * @var array|null
+ */
+ protected $auth;
+
+ /**
+ * File upload arrays (used in POST requests)
+ *
+ * An associative array, where each element is of the format:
+ * 'name' => array('filename.txt', 'text/plain', 'This is the actual file contents')
+ *
+ * @var array
+ */
+ protected $files = array();
+
+ /**
+ * The client's cookie jar
+ *
+ * @var Zend_Http_CookieJar
+ */
+ protected $cookiejar = null;
+
+ /**
+ * The last HTTP request sent by the client, as string
+ *
+ * @var string
+ */
+ protected $last_request = null;
+
+ /**
+ * The last HTTP response received by the client
+ *
+ * @var Zend_Http_Response
+ */
+ protected $last_response = null;
+
+ /**
+ * Redirection counter
+ *
+ * @var int
+ */
+ protected $redirectCounter = 0;
+
+ /**
+ * Contructor method. Will create a new HTTP client. Accepts the target
+ * URL and optionally and array of headers.
+ *
+ * @param Zend_Uri_Http|string $uri
+ * @param array $headers Optional request headers to set
+ */
+ public function __construct($uri = null, $config = null)
+ {
+ if ($uri !== null) $this->setUri($uri);
+ if ($config !== null) $this->setConfig($config);
+ }
+
+ /**
+ * Set the URI for the next request
+ *
+ * @param Zend_Uri_Http|string $uri
+ * @return Zend_Http_Client
+ * @throws Zend_Http_Client_Exception
+ */
+ public function setUri($uri)
+ {
+ if (is_string($uri)) {
+ $uri = Zend_Uri::factory($uri);
+ }
+
+ if (!$uri instanceof Zend_Uri_Http) {
+ throw new Zend_Http_Client_Exception('Passed parameter is not a valid HTTP URI.');
+ }
+
+ // We have no ports, set the defaults
+ if (! $uri->getPort()) {
+ $uri->setPort(($uri->getScheme() == 'https' ? 443 : 80));
+ }
+
+ $this->uri = $uri;
+
+ return $this;
+ }
+
+ /**
+ * Get the URI for the next request
+ *
+ * @param boolean $as_string If true, will return the URI as a string
+ * @return Zend_Uri_Http|string
+ */
+ public function getUri($as_string = false)
+ {
+ if ($as_string && $this->uri instanceof Zend_Uri_Http) {
+ return $this->uri->__toString();
+ } else {
+ return $this->uri;
+ }
+ }
+
+ /**
+ * Set configuration parameters for this HTTP client
+ *
+ * @param array $config
+ * @return Zend_Http_Client
+ */
+ public function setConfig($config = array())
+ {
+ if (! is_array($config))
+ throw new Zend_Http_Client_Exception('Expected array parameter, given ' . gettype($config));
+
+ foreach ($config as $k => $v)
+ $this->config[strtolower($k)] = $v;
+
+ return $this;
+ }
+
+ /**
+ * Set the next request's method
+ *
+ * Validated the passed method and sets it. If we have files set for
+ * POST requests, and the new method is not POST, the files are silently
+ * dropped.
+ *
+ * @param string $method
+ * @return Zend_Http_Client
+ */
+ public function setMethod($method = self::GET)
+ {
+ if (! preg_match('/^[A-Za-z_]+$/', $method))
+ throw new Zend_Http_Client_Exception("'{$method}' is not a valid HTTP request method.");
+
+ if ($method == self::POST && $this->enctype === null)
+ $this->setEncType(self::ENC_URLENCODED);
+
+ $this->method = $method;
+
+ return $this;
+ }
+
+ /**
+ * Set one or more request headers
+ *
+ * This function can be used in several ways to set the client's request
+ * headers:
+ * 1. By providing two parameters: $name as the header to set (eg. 'Host')
+ * and $value as it's value (eg. 'www.example.com').
+ * 2. By providing a single header string as the only parameter
+ * eg. 'Host: www.example.com'
+ * 3. By providing an array of headers as the first parameter
+ * eg. array('host' => 'www.example.com', 'x-foo: bar'). In This case
+ * the function will call itself recursively for each array item.
+ *
+ * @param string|array $name Header name, full header string ('Header: value')
+ * or an array of headers
+ * @param mixed $value Header value or null
+ * @return Zend_Http_Client
+ */
+ public function setHeaders($name, $value = null)
+ {
+ // If we got an array, go recusive!
+ if (is_array($name)) {
+ foreach ($name as $k => $v) {
+ if (is_string($k)) {
+ $this->setHeaders($k, $v);
+ } else {
+ $this->setHeaders($v, null);
+ }
+ }
+ } else {
+ // Check if $name needs to be split
+ if ($value === null && (strpos($name, ':') > 0))
+ list($name, $value) = explode(':', $name, 2);
+
+ $name = strtolower($name);
+
+ // Make sure the name is valid
+ if (! preg_match('/^[a-z0-9-]+$/', $name)) {
+ throw new Zend_Http_Client_Exception("{$name} is not a valid HTTP header name");
+ }
+
+ // If $value is null or false, unset the header
+ if ($value === null || $value === false) {
+ unset($this->headers[$name]);
+
+ // Else, set the header
+ } else {
+ // Header names are storred lowercase internally.
+ if (is_string($value)) $value = trim($value);
+ $this->headers[$name] = $value;
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Get the value of a specific header
+ *
+ * Note that if the header has more than one value, an array
+ * will be returned.
+ *
+ * @param unknown_type $key
+ * @return string|array|null The header value or null if it is not set
+ */
+ public function getHeader($key)
+ {
+ $key = strtolower($key);
+ if (isset($this->headers[$key])) {
+ return $this->headers[$key];
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Set a GET parameter for the request. Wrapper around _setParameter
+ *
+ * @param string|array $name
+ * @param string $value
+ * @return Zend_Http_Client
+ */
+ public function setParameterGet($name, $value = null)
+ {
+ if (is_array($name)) {
+ foreach ($name as $k => $v)
+ $this->_setParameter('GET', $k, $v);
+ } else {
+ $this->_setParameter('GET', $name, $value);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Set a POST parameter for the request. Wrapper around _setParameter
+ *
+ * @param string|array $name
+ * @param string $value
+ * @return Zend_Http_Client
+ */
+ public function setParameterPost($name, $value = null)
+ {
+ if (is_array($name)) {
+ foreach ($name as $k => $v)
+ $this->_setParameter('POST', $k, $v);
+ } else {
+ $this->_setParameter('POST', $name, $value);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Set a GET or POST parameter - used by SetParameterGet and SetParameterPost
+ *
+ * @param string $type GET or POST
+ * @param string $name
+ * @param string $value
+ */
+ protected function _setParameter($type, $name, $value)
+ {
+ $parray = array();
+ $type = strtolower($type);
+ switch ($type) {
+ case 'get':
+ $parray = &$this->paramsGet;
+ break;
+ case 'post':
+ $parray = &$this->paramsPost;
+ break;
+ }
+
+ if ($value === null) {
+ if (isset($parray[$name])) unset($parray[$name]);
+ } else {
+ $parray[$name] = $value;
+ }
+ }
+
+ /**
+ * Get the number of redirections done on the last request
+ *
+ * @return int
+ */
+ public function getRedirectionsCount()
+ {
+ return $this->redirectCounter;
+ }
+
+ /**
+ * Set HTTP authentication parameters
+ *
+ * $type should be one of the supported types - see the self::AUTH_*
+ * constants.
+ *
+ * To enable authentication:
+ * <code>
+ * $this->setAuth('shahar', 'secret', Zend_Http_Client::AUTH_BASIC);
+ * </code>
+ *
+ * To disable authentication:
+ * <code>
+ * $this->setAuth(false);
+ * </code>
+ *
+ * @see http://www.faqs.org/rfcs/rfc2617.html
+ * @param string|false $user User name or false disable authentication
+ * @param string $password Password
+ * @param string $type Authentication type
+ * @return Zend_Http_Client
+ */
+ public function setAuth($user, $password = '', $type = self::AUTH_BASIC)
+ {
+ // If we got false or null, disable authentication
+ if ($user === false || $user === null) {
+ $this->auth = null;
+
+ // Else, set up authentication
+ } else {
+ // Check we got a proper authentication type
+ if (! defined('self::AUTH_' . strtoupper($type)))
+ throw new Zend_Http_Client_Exception("Invalid or not supported authentication type: '$type'");
+
+ $this->auth = array(
+ 'user' => (string) $user,
+ 'password' => (string) $password,
+ 'type' => $type
+ );
+ }
+
+ return $this;
+ }
+
+ /**
+ * Set the HTTP client's cookie jar.
+ *
+ * A cookie jar is an object that holds and maintains cookies across HTTP requests
+ * and responses.
+ *
+ * @param Zend_Http_CookieJar|boolean $cookiejar Existing cookiejar object, true to create a new one, false to disable
+ * @return Zend_Http_Client
+ */
+ public function setCookieJar($cookiejar = true)
+ {
+ if (! class_exists('Zend_Http_CookieJar'))
+ require_once 'Zend/Http/CookieJar.php';
+
+ if ($cookiejar instanceof Zend_Http_CookieJar) {
+ $this->cookiejar = $cookiejar;
+ } elseif ($cookiejar === true) {
+ $this->cookiejar = new Zend_Http_CookieJar();
+ } elseif (! $cookiejar) {
+ $this->cookiejar = null;
+ } else {
+ throw new Zend_Http_Client_Exception('Invalid parameter type passed as CookieJar');
+ }
+
+ return $this;
+ }
+
+ /**
+ * Return the current cookie jar or null if none.
+ *
+ * @return Zend_Http_CookieJar|null
+ */
+ public function getCookieJar()
+ {
+ return $this->cookiejar;
+ }
+
+ /**
+ * Add a cookie to the request. If the client has no Cookie Jar, the cookies
+ * will be added directly to the headers array as "Cookie" headers.
+ *
+ * @param Zend_Http_Cookie|string $cookie
+ * @param string|null $value If "cookie" is a string, this is the cookie value.
+ * @return Zend_Http_Client
+ */
+ public function setCookie($cookie, $value = null)
+ {
+ if (! class_exists('Zend_Http_Cookie'))
+ require_once 'Zend/Http/Cookie.php';
+
+ if (is_array($cookie)) {
+ foreach ($cookie as $c => $v) {
+ if (is_string($c)) {
+ $this->setCookie($c, $v);
+ } else {
+ $this->setCookie($v);
+ }
+ }
+
+ return $this;
+ }
+
+ if ($value !== null) $value = urlencode($value);
+
+ if (isset($this->cookiejar)) {
+ if ($cookie instanceof Zend_Http_Cookie) {
+ $this->cookiejar->addCookie($cookie);
+ } elseif (is_string($cookie) && $value !== null) {
+ $cookie = Zend_Http_Cookie::fromString("{$cookie}={$value}", $this->uri);
+ $this->cookiejar->addCookie($cookie);
+ }
+ } else {
+ if ($cookie instanceof Zend_Http_Cookie) {
+ $name = $cookie->getName();
+ $value = $cookie->getValue();
+ $cookie = $name;
+ }
+
+ if (preg_match("/[=,; \t\r\n\013\014]/", $cookie))
+ throw new Zend_Http_Client_Exception("Cookie name cannot contain these characters: =,; \t\r\n\013\014 ({$cookie})");
+
+ $value = addslashes($value);
+
+ if (! isset($this->headers['cookie'])) $this->headers['cookie'] = '';
+ $this->headers['cookie'] .= $cookie . '=' . $value . '; ';
+ }
+
+ return $this;
+ }
+
+ /**
+ * Set a file to upload (using a POST request)
+ *
+ * Can be used in two ways:
+ *
+ * 1. $data is null (default): $filename is treated as the name if a local file which
+ * will be read and sent. Will try to guess the content type using mime_content_type().
+ * 2. $data is set - $filename is sent as the file name, but $data is sent as the file
+ * contents and no file is read from the file system. In this case, you need to
+ * manually set the content-type ($ctype) or it will default to
+ * application/octet-stream.
+ *
+ * @param string $filename Name of file to upload, or name to save as
+ * @param string $formname Name of form element to send as
+ * @param string $data Data to send (if null, $filename is read and sent)
+ * @param string $ctype Content type to use (if $data is set and $ctype is
+ * null, will be application/octet-stream)
+ * @return Zend_Http_Client
+ */
+ public function setFileUpload($filename, $formname, $data = null, $ctype = null)
+ {
+ if ($data === null) {
+ if (($data = @file_get_contents($filename)) === false)
+ throw new Zend_Http_Client_Exception("Unable to read file '{$filename}' for upload");
+
+ if (! $ctype && function_exists('mime_content_type')) $ctype = mime_content_type($filename);
+ }
+
+ // Force enctype to multipart/form-data
+ $this->setEncType(self::ENC_FORMDATA);
+
+ if ($ctype === null) $ctype = 'application/octet-stream';
+ $this->files[$formname] = array(basename($filename), $ctype, $data);
+
+ return $this;
+ }
+
+ /**
+ * Set the encoding type for POST data
+ *
+ * @param string $enctype
+ * @return Zend_Http_Client
+ */
+ public function setEncType($enctype = self::ENC_URLENCODED)
+ {
+ $this->enctype = $enctype;
+
+ return $this;
+ }
+
+ /**
+ * Set the raw (already encoded) POST data.
+ *
+ * This function is here for two reasons:
+ * 1. For advanced user who would like to set their own data, already encoded
+ * 2. For backwards compatibilty: If someone uses the old post($data) method.
+ * this method will be used to set the encoded data.
+ *
+ * @param string $data
+ * @param string $enctype
+ * @return Zend_Http_Client
+ */
+ public function setRawData($data, $enctype = null)
+ {
+ $this->raw_post_data = $data;
+ $this->setEncType($enctype);
+
+ return $this;
+ }
+
+ /**
+ * Clear all GET and POST parameters
+ *
+ * Should be used to reset the request parameters if the client is
+ * used for several concurrent requests.
+ *
+ * @return Zend_Http_Client
+ */
+ public function resetParameters()
+ {
+ // Reset parameter data
+ $this->paramsGet = array();
+ $this->paramsPost = array();
+ $this->files = array();
+ $this->raw_post_data = null;
+
+ // Clear outdated headers
+ if (isset($this->headers['content-type'])) unset($this->headers['content-type']);
+ if (isset($this->headers['content-length'])) unset($this->headers['content-length']);
+
+ return $this;
+ }
+
+ /**
+ * Get the last HTTP request as string
+ *
+ * @return string
+ */
+ public function getLastRequest()
+ {
+ return $this->last_request;
+ }
+
+ /**
+ * Get the last HTTP response received by this client
+ *
+ * If $config['storeresponse'] is set to false, or no response was
+ * stored yet, will return null
+ *
+ * @return Zend_Http_Response or null if none
+ */
+ public function getLastResponse()
+ {
+ return $this->last_response;
+ }
+
+ /**
+ * Load the connection adapter
+ *
+ * While this method is not called more than one for a client, it is
+ * seperated from ->request() to preserve logic and readability
+ *
+ * @param Zend_Http_Client_Adapter_Interface|string $adapter
+ */
+ public function setAdapter($adapter)
+ {
+ if (is_string($adapter)) {
+ try {
+ Zend_Loader::loadClass($adapter);
+ } catch (Zend_Exception $e) {
+ throw new Zend_Http_Client_Exception("Unable to load adapter '$adapter': {$e->getMessage()}");
+ }
+
+ $adapter = new $adapter;
+ }
+
+ if (! $adapter instanceof Zend_Http_Client_Adapter_Interface)
+ throw new Zend_Http_Client_Exception('Passed adapter is not a HTTP connection adapter');
+
+ $this->adapter = $adapter;
+ $config = $this->config;
+ unset($config['adapter']);
+ $this->adapter->setConfig($config);
+ }
+
+ /**
+ * Send the HTTP request and return an HTTP response object
+ *
+ * @param string $method
+ * @return Zend_Http_Response
+ */
+ public function request($method = null)
+ {
+ if (! $this->uri instanceof Zend_Uri_Http)
+ throw new Zend_Http_Client_Exception('No valid URI has been passed to the client');
+
+ if ($method) $this->setMethod($method);
+ $this->redirectCounter = 0;
+ $response = null;
+
+ // Make sure the adapter is loaded
+ if ($this->adapter == null) $this->setAdapter($this->config['adapter']);
+
+ // Send the first request. If redirected, continue.
+ do {
+ // Clone the URI and add the additional GET parameters to it
+ $uri = clone $this->uri;
+ if (! empty($this->paramsGet)) {
+ $query = $uri->getQuery();
+ if (! empty($query)) $query .= '&';
+ $query .= http_build_query($this->paramsGet, null, '&');
+
+ $uri->setQuery($query);
+ }
+
+ $body = $this->prepare_body();
+ $headers = $this->prepare_headers();
+
+ // Open the connection, send the request and read the response
+ $this->adapter->connect($uri->getHost(), $uri->getPort(),
+ ($uri->getScheme() == 'https' ? true : false));
+
+ $this->last_request = $this->adapter->write($this->method,
+ $uri, $this->config['httpversion'], $headers, $body);
+
+ $response = $this->adapter->read();
+ if (! $response)
+ throw new Zend_Http_Client_Exception('Unable to read response, or response is empty');
+
+ $response = Zend_Http_Response::fromString($response);
+ if ($this->config['storeresponse']) $this->last_response = $response;
+
+ // Load cookies into cookie jar
+ if (isset($this->cookiejar)) $this->cookiejar->addCookiesFromResponse($response, $uri);
+
+ // If we got redirected, look for the Location header
+ if ($response->isRedirect() && ($location = $response->getHeader('location'))) {
+
+ // Check whether we send the exact same request again, or drop the parameters
+ // and send a GET request
+ if ($response->getStatus() == 303 ||
+ ((! $this->config['strictredirects']) && ($response->getStatus() == 302 ||
+ $response->getStatus() == 301))) {
+
+ $this->resetParameters();
+ $this->setMethod(self::GET);
+ }
+
+ // If we got a well formed absolute URI
+ if (Zend_Uri_Http::check($location)) {
+ $this->setHeaders('host', null);
+ $this->setUri($location);
+
+ } else {
+
+ // Split into path and query and set the query
+ if (strpos($location, '?') !== false) {
+ list($location, $query) = explode('?', $location, 2);
+ } else {
+ $query = '';
+ }
+ $this->uri->setQuery($query);
+
+ // Else, if we got just an absolute path, set it
+ if(strpos($location, '/') === 0) {
+ $this->uri->setPath($location);
+
+ // Else, assume we have a relative path
+ } else {
+ // Get the current path directory, removing any trailing slashes
+ $path = $this->uri->getPath();
+ $path = rtrim(substr($path, 0, strrpos($path, '/')), "/");
+ $this->uri->setPath($path . '/' . $location);
+ }
+ }
+ ++$this->redirectCounter;
+
+ } else {
+ // If we didn't get any location, stop redirecting
+ break;
+ }
+
+ } while ($this->redirectCounter < $this->config['maxredirects']);
+
+ return $response;
+ }
+
+ /**
+ * Prepare the request headers
+ *
+ * @return array
+ */
+ protected function prepare_headers()
+ {
+ $headers = array();
+
+ // Set the host header
+ if (! isset($this->headers['host'])) {
+ $host = $this->uri->getHost();
+
+ // If the port is not default, add it
+ if (! (($this->uri->getScheme() == 'http' && $this->uri->getPort() == 80) ||
+ ($this->uri->getScheme() == 'https' && $this->uri->getPort() == 443))) {
+ $host .= ':' . $this->uri->getPort();
+ }
+
+ $headers[] = "Host: {$host}";
+ }
+
+ // Set the connection header
+ if (! isset($this->headers['connection'])) {
+ if (! $this->config['keepalive']) $headers[] = "Connection: close";
+ }
+
+ // Set the content-type header
+ if ($this->method == self::POST &&
+ (! isset($this->headers['content-type']) && isset($this->enctype))) {
+
+ $headers[] = "Content-type: {$this->enctype}";
+ }
+
+ // Set the user agent header
+ if (! isset($this->headers['user-agent']) && isset($this->config['useragent'])) {
+ $headers[] = "User-agent: {$this->config['useragent']}";
+ }
+
+ // Set HTTP authentication if needed
+ if (is_array($this->auth)) {
+ $auth = self::encodeAuthHeader($this->auth['user'], $this->auth['password'], $this->auth['type']);
+ $headers[] = "Authorization: {$auth}";
+ }
+
+ // Load cookies from cookie jar
+ if (isset($this->cookiejar)) {
+ $cookstr = $this->cookiejar->getMatchingCookies($this->uri,
+ true, Zend_Http_CookieJar::COOKIE_STRING_CONCAT);
+
+ if ($cookstr) $headers[] = "Cookie: {$cookstr}";
+ }
+
+ // Add all other user defined headers
+ foreach ($this->headers as $name => $value) {
+ if (is_array($value))
+ $value = implode(', ', $value);
+
+ $headers[] = ucfirst($name) . ": {$value}";
+ }
+
+ return $headers;
+ }
+
+ /**
+ * Prepare the request body (for POST and PUT requests)
+ *
+ * @return string
+ */
+ protected function prepare_body()
+ {
+ // According to RFC2616, a TRACE request should not have a body.
+ if ($this->method == self::TRACE) {
+ return '';
+ }
+
+ // If we have raw_post_data set, just use it as the body.
+ if (isset($this->raw_post_data)) {
+ $this->setHeaders('content-length', strlen($this->raw_post_data));
+ return $this->raw_post_data;
+ }
+
+ $body = '';
+
+ // If we have files to upload, force enctype to multipart/form-data
+ if (count ($this->files) > 0) $this->setEncType(self::ENC_FORMDATA);
+
+ // If we have POST parameters or files, encode and add them to the body
+ if (count($this->paramsPost) > 0 || count($this->files) > 0) {
+ switch($this->enctype) {
+ case self::ENC_FORMDATA:
+ // Encode body as multipart/form-data
+ $boundary = '---ZENDHTTPCLIENT-' . md5(microtime());
+ $this->setHeaders('Content-type', self::ENC_FORMDATA . "; boundary={$boundary}");
+
+ // Get POST parameters and encode them
+ $params = $this->_getParametersRecursive($this->paramsPost);
+ foreach ($params as $pp) {
+ $body .= self::encodeFormData($boundary, $pp[0], $pp[1]);
+ }
+
+ // Encode files
+ foreach ($this->files as $name => $file) {
+ $fhead = array('Content-type' => $file[1]);
+ $body .= self::encodeFormData($boundary, $name, $file[2], $file[0], $fhead);
+ }
+
+ $body .= "--{$boundary}--\r\n";
+ break;
+
+ case self::ENC_URLENCODED:
+ // Encode body as application/x-www-form-urlencoded
+ $this->setHeaders('Content-type', self::ENC_URLENCODED);
+ $body = http_build_query($this->paramsPost, '', '&');
+ break;
+
+ default:
+ throw new Zend_Http_Client_Exception("Cannot handle content type '{$this->enctype}' automatically." .
+ " Please use Zend_Http_Client::setRawData to send this kind of content.");
+ break;
+ }
+ }
+
+ if ($body) $this->setHeaders('content-length', strlen($body));
+ return $body;
+ }
+
+ /**
+ * Helper method that gets a possibly multi-level parameters array (get or
+ * post) and flattens it.
+ *
+ * The method returns an array of (key, value) pairs (because keys are not
+ * necessarily unique. If one of the parameters in as array, it will also
+ * add a [] suffix to the key.
+ *
+ * @param array $parray The parameters array
+ * @param bool $urlencode Whether to urlencode the name and value
+ * @return array
+ */
+ protected function _getParametersRecursive($parray, $urlencode = false)
+ {
+ if (! is_array($parray)) return $parray;
+ $parameters = array();
+
+ foreach ($parray as $name => $value) {
+ if ($urlencode) $name = urlencode($name);
+
+ // If $value is an array, iterate over it
+ if (is_array($value)) {
+ $name .= ($urlencode ? '%5B%5D' : '[]');
+ foreach ($value as $subval) {
+ if ($urlencode) $subval = urlencode($subval);
+ $parameters[] = array($name, $subval);
+ }
+ } else {
+ if ($urlencode) $value = urlencode($value);
+ $parameters[] = array($name, $value);
+ }
+ }
+
+ return $parameters;
+ }
+
+ /**
+ * Encode data to a multipart/form-data part suitable for a POST request.
+ *
+ * @param string $boundary
+ * @param string $name
+ * @param mixed $value
+ * @param string $filename
+ * @param array $headers Associative array of optional headers @example ("Content-transfer-encoding" => "binary")
+ * @return string
+ */
+ public static function encodeFormData($boundary, $name, $value, $filename = null, $headers = array()) {
+ $ret = "--{$boundary}\r\n" .
+ 'Content-Disposition: form-data; name="' . $name .'"';
+
+ if ($filename) $ret .= '; filename="' . $filename . '"';
+ $ret .= "\r\n";
+
+ foreach ($headers as $hname => $hvalue) {
+ $ret .= "{$hname}: {$hvalue}\r\n";
+ }
+ $ret .= "\r\n";
+
+ $ret .= "{$value}\r\n";
+
+ return $ret;
+ }
+
+ /**
+ * Create a HTTP authentication "Authorization:" header according to the
+ * specified user, password and authentication method.
+ *
+ * @see http://www.faqs.org/rfcs/rfc2617.html
+ * @param string $user
+ * @param string $password
+ * @param string $type
+ * @return string
+ */
+ public static function encodeAuthHeader($user, $password, $type = self::AUTH_BASIC)
+ {
+ $authHeader = null;
+
+ switch ($type) {
+ case self::AUTH_BASIC:
+ // In basic authentication, the user name cannot contain ":"
+ if (strpos($user, ':') !== false)
+ throw new Zend_Http_Client_Exception("The user name cannot contain ':' in 'Basic' HTTP authentication");
+
+ $authHeader = 'Basic ' . base64_encode($user . ':' . $password);
+ break;
+
+ //case self::AUTH_DIGEST:
+ /**
+ * @todo Implement digest authentication
+ */
+ // break;
+
+ default:
+ throw new Zend_Http_Client_Exception("Not a supported HTTP authentication type: '$type'");
+ }
+
+ return $authHeader;
+ }
+}
diff --git a/libs/Zend/Http/Client/Adapter/Exception.php b/libs/Zend/Http/Client/Adapter/Exception.php
new file mode 100755
index 0000000000..9b41812713
--- /dev/null
+++ b/libs/Zend/Http/Client/Adapter/Exception.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Client_Adapter_Exception
+ * @version $Id: Exception.php 2805 2007-01-16 01:38:10Z bkarwin $
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+require_once 'Zend/Http/Client/Exception.php';
+
+/**
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Client_Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Http_Client_Adapter_Exception extends Zend_Http_Client_Exception
+{}
diff --git a/libs/Zend/Http/Client/Adapter/Interface.php b/libs/Zend/Http/Client/Adapter/Interface.php
new file mode 100755
index 0000000000..dce74c37fa
--- /dev/null
+++ b/libs/Zend/Http/Client/Adapter/Interface.php
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Client_Adapter
+ * @version $Id: Interface.php 2805 2007-01-16 01:38:10Z bkarwin $
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * An interface description for Zend_Http_Client_Adapter classes.
+ *
+ * These classes are used as connectors for Zend_Http_Client, performing the
+ * tasks of connecting, writing, reading and closing connection to the server.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Client_Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Http_Client_Adapter_Interface
+{
+ /**
+ * Set the configuration array for the adapter
+ *
+ * @param array $config
+ */
+ public function setConfig($config = array());
+
+ /**
+ * Connect to the remote server
+ *
+ * @param string $host
+ * @param int $port
+ * @param boolean $secure
+ */
+ public function connect($host, $port = 80, $secure = false);
+
+ /**
+ * Send request to the remote server
+ *
+ * @param string $method
+ * @param Zend_Uri_Http $url
+ * @param string $http_ver
+ * @param array $headers
+ * @param string $body
+ * @return string Request as text
+ */
+ public function write($method, $url, $http_ver = '1.1', $headers = array(), $body = '');
+
+ /**
+ * Read response from server
+ *
+ * @return string
+ */
+ public function read();
+
+ /**
+ * Close the connection to the server
+ *
+ */
+ public function close();
+}
diff --git a/libs/Zend/Http/Client/Adapter/Proxy.php b/libs/Zend/Http/Client/Adapter/Proxy.php
new file mode 100755
index 0000000000..22dfccd0e4
--- /dev/null
+++ b/libs/Zend/Http/Client/Adapter/Proxy.php
@@ -0,0 +1,166 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Client_Adapter
+ * @version $Id: Proxy.php 4797 2007-05-14 19:18:13Z shahar $
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+require_once 'Zend/Uri/Http.php';
+require_once 'Zend/Http/Client.php';
+require_once 'Zend/Http/Client/Adapter/Socket.php';
+require_once 'Zend/Http/Client/Adapter/Exception.php';
+
+/**
+ * HTTP Proxy-supporting Zend_Http_Client adapter class, based on the default
+ * socket based adapter.
+ *
+ * Should be used if proxy HTTP access is required. If no proxy is set, will
+ * fall back to Zend_Http_Client_Adapter_Socket behavior. Just like the
+ * default Socket adapter, this adapter does not require any special extensions
+ * installed.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Client_Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Http_Client_Adapter_Proxy extends Zend_Http_Client_Adapter_Socket
+{
+ /**
+ * Parameters array
+ *
+ * @var array
+ */
+ protected $config = array(
+ 'ssltransport' => 'ssl',
+ 'proxy_host' => '',
+ 'proxy_port' => 8080,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'proxy_auth' => Zend_Http_Client::AUTH_BASIC
+ );
+
+ /**
+ * Connect to the remote server
+ *
+ * Will try to connect to the proxy server. If no proxy was set, will
+ * fall back to the target server (behave like regular Socket adapter)
+ *
+ * @param string $host
+ * @param int $port
+ * @param boolean $secure
+ * @param int $timeout
+ */
+ public function connect($host, $port = 80, $secure = false)
+ {
+ // If no proxy is set, fall back to Socket adapter
+ if (! $this->config['proxy_host']) return parent::connect($host, $port, $secure);
+
+ // Go through a proxy - the connection is actually to the proxy server
+ $host = $this->config['proxy_host'];
+ $port = $this->config['proxy_port'];
+
+ // If we are connected to the wrong proxy, disconnect first
+ if (($this->connected_to[0] != $host || $this->connected_to[1] != $port)) {
+ if (is_resource($this->socket)) $this->close();
+ }
+
+ // Now, if we are not connected, connect
+ if (! is_resource($this->socket) || ! $this->config['keepalive']) {
+ $this->socket = @fsockopen($host, $port, $errno, $errstr, (int) $this->config['timeout']);
+ if (! $this->socket) {
+ $this->close();
+ throw new Zend_Http_Client_Adapter_Exception(
+ 'Unable to Connect to proxy server ' . $host . ':' . $port . '. Error #' . $errno . ': ' . $errstr);
+ }
+
+ // Set the stream timeout
+ if (!stream_set_timeout($this->socket, (int) $this->config['timeout'])) {
+ throw new Zend_Http_Client_Adapter_Exception('Unable to set the connection timeout');
+ }
+
+ // Update connected_to
+ $this->connected_to = array($host, $port);
+ }
+ }
+
+ /**
+ * Send request to the proxy server
+ *
+ * @param string $method
+ * @param Zend_Uri_Http $uri
+ * @param string $http_ver
+ * @param array $headers
+ * @param string $body
+ * @return string Request as string
+ */
+ public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '')
+ {
+ // If no proxy is set, fall back to default Socket adapter
+ if (! $this->config['proxy_host']) return parent::write($method, $uri, $http_ver, $headers, $body);
+
+ // Make sure we're properly connected
+ if (! $this->socket)
+ throw new Zend_Http_Client_Adapter_Exception("Trying to write but we are not connected");
+
+ $host = $this->config['proxy_host'];
+ $port = $this->config['proxy_port'];
+
+ if ($this->connected_to[0] != $host || $this->connected_to[1] != $port)
+ throw new Zend_Http_Client_Adapter_Exception("Trying to write but we are connected to the wrong proxy server");
+
+ // Save request method for later
+ $this->method = $method;
+
+ // Build request headers
+ $request = "{$method} {$uri->__toString()} HTTP/{$http_ver}\r\n";
+
+ // Add Proxy-Authorization header
+ if ($this->config['proxy_user'] && ! isset($headers['proxy-authorization']))
+ $headers['proxy-authorization'] = Zend_Http_Client::encodeAuthHeader(
+ $this->config['proxy_user'], $this->config['proxy_pass'], $this->config['proxy_auth']
+ );
+
+ // Add all headers to the request string
+ foreach ($headers as $k => $v) {
+ if (is_string($k)) $v = ucfirst($k) . ": $v";
+ $request .= "$v\r\n";
+ }
+
+ // Add the request body
+ $request .= "\r\n" . $body;
+
+ // Send the request
+ if (! @fwrite($this->socket, $request)) {
+ throw new Zend_Http_Client_Adapter_Exception("Error writing request to proxy server");
+ }
+
+ return $request;
+ }
+
+ /**
+ * Destructor: make sure the socket is disconnected
+ *
+ */
+ public function __destruct()
+ {
+ if ($this->socket) $this->close();
+ }
+}
diff --git a/libs/Zend/Http/Client/Adapter/Socket.php b/libs/Zend/Http/Client/Adapter/Socket.php
new file mode 100755
index 0000000000..698c372b64
--- /dev/null
+++ b/libs/Zend/Http/Client/Adapter/Socket.php
@@ -0,0 +1,285 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Client_Adapter
+ * @version $Id: Socket.php 4797 2007-05-14 19:18:13Z shahar $
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+require_once 'Zend/Uri/Http.php';
+require_once 'Zend/Http/Client/Adapter/Interface.php';
+require_once 'Zend/Http/Client/Adapter/Exception.php';
+
+/**
+ * A sockets based (fsockopen) adapter class for Zend_Http_Client. Can be used
+ * on almost every PHP environment, and does not require any special extensions.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Client_Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Http_Client_Adapter_Socket implements Zend_Http_Client_Adapter_Interface
+{
+ /**
+ * The socket for server connection
+ *
+ * @var resource|null
+ */
+ protected $socket = null;
+
+ /**
+ * What host/port are we connected to?
+ *
+ * @var array
+ */
+ protected $connected_to = array(null, null);
+
+ /**
+ * Parameters array
+ *
+ * @var array
+ */
+ protected $config = array(
+ 'ssltransport' => 'sslv2'
+ );
+
+ /**
+ * Request method - will be set by write() and might be used by read()
+ *
+ * @var string
+ */
+ protected $method = null;
+
+ /**
+ * Adapter constructor, currently empty. Config is set using setConfig()
+ *
+ */
+ public function __construct()
+ {
+ }
+
+ /**
+ * Set the configuration array for the adapter
+ *
+ * @param array $config
+ */
+ public function setConfig($config = array())
+ {
+ if (! is_array($config))
+ throw new Zend_Http_Client_Adapter_Exception(
+ '$config expects an array, ' . gettype($config) . ' recieved.');
+
+ foreach ($config as $k => $v) {
+ $this->config[strtolower($k)] = $v;
+ }
+ }
+
+ /**
+ * Connect to the remote server
+ *
+ * @param string $host
+ * @param int $port
+ * @param boolean $secure
+ * @param int $timeout
+ */
+ public function connect($host, $port = 80, $secure = false)
+ {
+ // If the URI should be accessed via SSL, prepend the Hostname with ssl://
+ $host = ($secure ? $this->config['ssltransport'] . '://' . $host : $host);
+
+ // If we are connected to the wrong host, disconnect first
+ if (($this->connected_to[0] != $host || $this->connected_to[1] != $port)) {
+ if (is_resource($this->socket)) $this->close();
+ }
+
+ // Now, if we are not connected, connect
+ if (! is_resource($this->socket) || ! $this->config['keepalive']) {
+ $this->socket = @fsockopen($host, $port, $errno, $errstr, (int) $this->config['timeout']);
+ if (! $this->socket) {
+ $this->close();
+ throw new Zend_Http_Client_Adapter_Exception(
+ 'Unable to Connect to ' . $host . ':' . $port . '. Error #' . $errno . ': ' . $errstr);
+ }
+
+ // Set the stream timeout
+ if (! stream_set_timeout($this->socket, (int) $this->config['timeout'])) {
+ throw new Zend_Http_Client_Adapter_Exception('Unable to set the connection timeout');
+ }
+
+ // Update connected_to
+ $this->connected_to = array($host, $port);
+ }
+ }
+
+ /**
+ * Send request to the remote server
+ *
+ * @param string $method
+ * @param Zend_Uri_Http $uri
+ * @param string $http_ver
+ * @param array $headers
+ * @param string $body
+ * @return string Request as string
+ */
+ public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '')
+ {
+ // Make sure we're properly connected
+ if (! $this->socket)
+ throw new Zend_Http_Client_Adapter_Exception('Trying to write but we are not connected');
+
+ $host = $uri->getHost();
+ $host = (strtolower($uri->getScheme()) == 'https' ? $this->config['ssltransport'] . '://' . $host : $host);
+ if ($this->connected_to[0] != $host || $this->connected_to[1] != $uri->getPort())
+ throw new Zend_Http_Client_Adapter_Exception('Trying to write but we are connected to the wrong host');
+
+ // Save request method for later
+ $this->method = $method;
+
+ // Build request headers
+ $path = $uri->getPath();
+ if ($uri->getQuery()) $path .= '?' . $uri->getQuery();
+ $request = "{$method} {$path} HTTP/{$http_ver}\r\n";
+ foreach ($headers as $k => $v) {
+ if (is_string($k)) $v = ucfirst($k) . ": $v";
+ $request .= "$v\r\n";
+ }
+
+ // Add the request body
+ $request .= "\r\n" . $body;
+
+ // Send the request
+ if (! @fwrite($this->socket, $request)) {
+ throw new Zend_Http_Client_Adapter_Exception('Error writing request to server');
+ }
+
+ return $request;
+ }
+
+ /**
+ * Read response from server
+ *
+ * @return string
+ */
+ public function read()
+ {
+ // First, read headers only
+ $response = '';
+ $gotStatus = false;
+ while ($line = @fgets($this->socket)) {
+ $gotStatus = $gotStatus || (strpos($line, 'HTTP') !== false);
+ if ($gotStatus) {
+ $response .= $line;
+ if (!chop($line)) break;
+ }
+ }
+
+ // Handle 100 and 101 responses internally by restarting the read again
+ if (Zend_Http_Response::extractCode($response) == 100 ||
+ Zend_Http_Response::extractCode($response) == 101) return $this->read();
+
+ // If this was a HEAD request, return after reading the header (no need to read body)
+ if ($this->method == Zend_Http_Client::HEAD) return $response;
+
+ // Check headers to see what kind of connection / transfer encoding we have
+ $headers = Zend_Http_Response::extractHeaders($response);
+
+ // if the connection is set to close, just read until socket closes
+ if (isset($headers['connection']) && $headers['connection'] == 'close') {
+ while ($buff = @fread($this->socket, 8192)) {
+ $response .= $buff;
+ }
+
+ $this->close();
+
+ // Else, if we got a transfer-encoding header (chunked body)
+ } elseif (isset($headers['transfer-encoding'])) {
+ if ($headers['transfer-encoding'] == 'chunked') {
+ do {
+ $chunk = '';
+ $line = @fgets($this->socket);
+ $chunk .= $line;
+
+ $hexchunksize = chop($line);
+ $hexchunksize = strlen($hexchunksize) ? $hexchunksize : 0;
+
+ $chunksize = hexdec(chop($line));
+ if (dechex($chunksize) != $hexchunksize) {
+ @fclose($this->socket);
+ throw new Zend_Http_Client_Adapter_Exception('Invalid chunk size "' .
+ $hexchunksize . '" unable to read chunked body');
+ }
+
+ $left_to_read = $chunksize;
+ while ($left_to_read > 0) {
+ $line = @fread($this->socket, $left_to_read);
+ $chunk .= $line;
+ $left_to_read -= strlen($line);
+ }
+
+ $chunk .= @fgets($this->socket);
+ $response .= $chunk;
+ } while ($chunksize > 0);
+ } else {
+ throw new Zend_Http_Client_Adapter_Exception('Cannot handle "' .
+ $headers['transfer-encoding'] . '" transfer encoding');
+ }
+
+ // Else, if we got the content-length header, read this number of bytes
+ } elseif (isset($headers['content-length'])) {
+ $left_to_read = $headers['content-length'];
+ $chunk = '';
+ while ($left_to_read > 0) {
+ $chunk = @fread($this->socket, $left_to_read);
+ $left_to_read -= strlen($chunk);
+ $response .= $chunk;
+ }
+
+ // Fallback: just read the response (should not happen)
+ } else {
+ while ($buff = @fread($this->socket, 8192)) {
+ $response .= $buff;
+ }
+
+ $this->close();
+ }
+
+ return $response;
+ }
+
+ /**
+ * Close the connection to the server
+ *
+ */
+ public function close()
+ {
+ if (is_resource($this->socket)) @fclose($this->socket);
+ $this->socket = null;
+ $this->connected_to = array(null, null);
+ }
+
+ /**
+ * Destructor: make sure the socket is disconnected
+ *
+ */
+ public function __destruct()
+ {
+ if ($this->socket) $this->close();
+ }
+}
diff --git a/libs/Zend/Http/Client/Adapter/Test.php b/libs/Zend/Http/Client/Adapter/Test.php
new file mode 100755
index 0000000000..fced07b939
--- /dev/null
+++ b/libs/Zend/Http/Client/Adapter/Test.php
@@ -0,0 +1,190 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Client_Adapter
+ * @version $Id: Test.php 2805 2007-01-16 01:38:10Z bkarwin $
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+require_once 'Zend/Uri/Http.php';
+require_once 'Zend/Http/Response.php';
+require_once 'Zend/Http/Client/Adapter/Interface.php';
+
+/**
+ * A testing-purposes adapter.
+ *
+ * Should be used to test all components that rely on Zend_Http_Client,
+ * without actually performing an HTTP request. You should instantiate this
+ * object manually, and then set it as the client's adapter. Then, you can
+ * set the expected response using the setResponse() method.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Client_Adapter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Http_Client_Adapter_Test implements Zend_Http_Client_Adapter_Interface
+{
+ /**
+ * Parameters array
+ *
+ * @var array
+ */
+ protected $config = array();
+
+ /**
+ * Buffer of responses to be returned by the read() method. Can be
+ * set using setResponse() and addResponse().
+ *
+ * @var array
+ */
+ protected $responses = array("HTTP/1.1 400 Bad Request\r\n\r\n");
+
+ /**
+ * Current position in the response buffer
+ *
+ * @var integer
+ */
+ protected $responseIndex = 0;
+
+ /**
+ * Adapter constructor, currently empty. Config is set using setConfig()
+ *
+ */
+ public function __construct()
+ { }
+
+ /**
+ * Set the configuration array for the adapter
+ *
+ * @param array $config
+ */
+ public function setConfig($config = array())
+ {
+ if (! is_array($config))
+ throw new Zend_Http_Client_Adapter_Exception(
+ '$config expects an array, ' . gettype($config) . ' recieved.');
+
+ foreach ($config as $k => $v) {
+ $this->config[strtolower($k)] = $v;
+ }
+ }
+
+ /**
+ * Connect to the remote server
+ *
+ * @param string $host
+ * @param int $port
+ * @param boolean $secure
+ * @param int $timeout
+ */
+ public function connect($host, $port = 80, $secure = false)
+ { }
+
+ /**
+ * Send request to the remote server
+ *
+ * @param string $method
+ * @param Zend_Uri_Http $uri
+ * @param string $http_ver
+ * @param array $headers
+ * @param string $body
+ * @return string Request as string
+ */
+ public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '')
+ {
+ $host = $uri->getHost();
+ $host = (strtolower($uri->getScheme()) == 'https' ? 'sslv2://' . $host : $host);
+
+ // Build request headers
+ $path = $uri->getPath();
+ if ($uri->getQuery()) $path .= '?' . $uri->getQuery();
+ $request = "{$method} {$path} HTTP/{$http_ver}\r\n";
+ foreach ($headers as $k => $v) {
+ if (is_string($k)) $v = ucfirst($k) . ": $v";
+ $request .= "$v\r\n";
+ }
+
+ // Add the request body
+ $request .= "\r\n" . $body;
+
+ // Do nothing - just return the request as string
+
+ return $request;
+ }
+
+ /**
+ * Return the response set in $this->setResponse()
+ *
+ * @return string
+ */
+ public function read()
+ {
+ if ($this->responseIndex >= count($this->responses)) {
+ $this->responseIndex = 0;
+ }
+ return $this->responses[$this->responseIndex++];
+ }
+
+ /**
+ * Close the connection (dummy)
+ *
+ */
+ public function close()
+ { }
+
+ /**
+ * Set the HTTP response(s) to be returned by this adapter
+ *
+ * @param Zend_Http_Response|array|string $response
+ */
+ public function setResponse($response)
+ {
+ if ($response instanceof Zend_Http_Response) {
+ $response = $response->asString();
+ }
+
+ $this->responses = (array)$response;
+ $this->responseIndex = 0;
+ }
+
+ /**
+ * Add another response to the response buffer.
+ *
+ * @param string $response
+ */
+ public function addResponse($response)
+ {
+ $this->responses[] = $response;
+ }
+
+ /**
+ * Sets the position of the response buffer. Selects which
+ * response will be returned on the next call to read().
+ *
+ * @param integer $index
+ */
+ public function setResponseIndex($index)
+ {
+ if ($index < 0 || $index >= count($this->responses)) {
+ throw new Zend_Http_Client_Adapter_Exception(
+ 'Index out of range of response buffer size');
+ }
+ $this->responseIndex = $index;
+ }
+}
diff --git a/libs/Zend/Http/Client/Exception.php b/libs/Zend/Http/Client/Exception.php
new file mode 100755
index 0000000000..668bd3a304
--- /dev/null
+++ b/libs/Zend/Http/Client/Exception.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Client_Exception
+ * @version $Id: Exception.php 2805 2007-01-16 01:38:10Z bkarwin $
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+require_once 'Zend/Http/Exception.php';
+
+/**
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Http_Client_Exception extends Zend_Http_Exception
+{}
diff --git a/libs/Zend/Http/Cookie.php b/libs/Zend/Http/Cookie.php
new file mode 100755
index 0000000000..4f739aadfa
--- /dev/null
+++ b/libs/Zend/Http/Cookie.php
@@ -0,0 +1,317 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE,
+ * and is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not
+ * receive a copy of the Zend Framework license and are unable to
+ * obtain it through the world-wide-web, please send a note to
+ * license@zend.com so we can mail you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Cookie
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com/)
+ * @version $Id: Cookie.php 4223 2007-03-24 10:20:34Z thomas $
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * Zend_Http_Cookie is a class describing an HTTP cookie and all it's parameters.
+ *
+ * Zend_Http_Cookie is a class describing an HTTP cookie and all it's parameters. The
+ * class also enables validating whether the cookie should be sent to the server in
+ * a specified scenario according to the request URI, the expiry time and whether
+ * session cookies should be used or not. Generally speaking cookies should be
+ * contained in a Cookiejar object, or instantiated manually and added to an HTTP
+ * request.
+ *
+ * See http://wp.netscape.com/newsref/std/cookie_spec.html for some specs.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com/)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Http_Cookie
+{
+ /**
+ * Cookie name
+ *
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * Cookie value
+ *
+ * @var string
+ */
+ protected $value;
+
+ /**
+ * Cookie expiry date
+ *
+ * @var int
+ */
+ protected $expires;
+
+ /**
+ * Cookie domain
+ *
+ * @var string
+ */
+ protected $domain;
+
+ /**
+ * Cookie path
+ *
+ * @var string
+ */
+ protected $path;
+
+ /**
+ * Whether the cookie is secure or not
+ *
+ * @var boolean
+ */
+ protected $secure;
+
+ /**
+ * Cookie object constructor
+ *
+ * @todo Add validation of each one of the parameters (legal domain, etc.)
+ *
+ * @param string $name
+ * @param string $value
+ * @param int $expires
+ * @param string $domain
+ * @param string $path
+ * @param bool $secure
+ */
+ public function __construct($name, $value, $domain, $expires = null, $path = null, $secure = false)
+ {
+ if (preg_match("/[=,; \t\r\n\013\014]/", $name))
+ throw new Zend_Http_Exception("Cookie name cannot contain these characters: =,; \\t\\r\\n\\013\\014 ({$name})");
+
+ if (! $this->name = (string) $name)
+ throw new Zend_Http_Exception('Cookies must have a name');
+
+ if (! $this->domain = (string) $domain)
+ throw new Zend_Http_Exception('Cookies must have a domain');
+
+ $this->value = (string) $value;
+ $this->expires = ($expires === null ? null : (int) $expires);
+ $this->path = ($path ? $path : '/');
+ $this->secure = $secure;
+ }
+
+ /**
+ * Get Cookie name
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * Get cookie value
+ *
+ * @return string
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * Get cookie domain
+ *
+ * @return string
+ */
+ public function getDomain()
+ {
+ return $this->domain;
+ }
+
+ /**
+ * Get the cookie path
+ *
+ * @return string
+ */
+ public function getPath()
+ {
+ return $this->path;
+ }
+
+ /**
+ * Get the expiry time of the cookie, or null if no expiry time is set
+ *
+ * @return int|null
+ */
+ public function getExpiryTime()
+ {
+ return $this->expires;
+ }
+
+ /**
+ * Check whether the cookie should only be sent over secure connections
+ *
+ * @return boolean
+ */
+ public function isSecure()
+ {
+ return $this->secure;
+ }
+
+ /**
+ * Check whether the cookie has expired
+ *
+ * Always returns false if the cookie is a session cookie (has no expiry time)
+ *
+ * @param int $now Timestamp to consider as "now"
+ * @return boolean
+ */
+ public function isExpired($now = null)
+ {
+ if ($now === null) $now = time();
+ if (is_int($this->expires) && $this->expires < $now) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Check whether the cookie is a session cookie (has no expiry time set)
+ *
+ * @return boolean
+ */
+ public function isSessionCookie()
+ {
+ return ($this->expires === null);
+ }
+
+ /**
+ * Checks whether the cookie should be sent or not in a specific scenario
+ *
+ * @param string|Zend_Uri_Http $uri URI to check against (secure, domain, path)
+ * @param boolean $matchSessionCookies Whether to send session cookies
+ * @param int $now Override the current time when checking for expiry time
+ * @return boolean
+ */
+ public function match($uri, $matchSessionCookies = true, $now = null)
+ {
+ if (is_string ($uri)) {
+ $uri = Zend_Uri::factory($uri);
+ }
+
+ // Make sure we have a valid Zend_Uri_Http object
+ if (! ($uri->valid() && ($uri->getScheme() == 'http' || $uri->getScheme() =='https')))
+ throw new Zend_Http_Exception('Passed URI is not a valid HTTP or HTTPS URI');
+
+ // Check that the cookie is secure (if required) and not expired
+ if ($this->secure && $uri->getScheme() != 'https') return false;
+ if ($this->isExpired($now)) return false;
+ if ($this->isSessionCookie() && ! $matchSessionCookies) return false;
+
+ // Validate domain and path
+ // Domain is validated using tail match, while path is validated using head match
+ $domain_preg = preg_quote($this->getDomain(), "/");
+ if (! preg_match("/{$domain_preg}$/", $uri->getHost())) return false;
+ $path_preg = preg_quote($this->getPath(), "/");
+ if (! preg_match("/^{$path_preg}/", $uri->getPath())) return false;
+
+ // If we didn't die until now, return true.
+ return true;
+ }
+
+ /**
+ * Get the cookie as a string, suitable for sending as a "Cookie" header in an
+ * HTTP request
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->name . '=' . urlencode($this->value) . ';';
+ }
+
+ /**
+ * Generate a new Cookie object from a cookie string
+ * (for example the value of the Set-Cookie HTTP header)
+ *
+ * @param string $cookieStr
+ * @param Zend_Uri_Http|string $ref_uri Reference URI for default values (domain, path)
+ * @return Zend_Http_Cookie A new Zend_Http_Cookie object or false on failure.
+ */
+ public static function fromString($cookieStr, $ref_uri = null)
+ {
+ // Set default values
+ if (is_string($ref_uri)) {
+ $ref_uri = Zend_Uri::factory($ref_uri);
+ }
+
+ $name = '';
+ $value = '';
+ $expires = null;
+ $domain = '';
+ $path = '';
+ $secure = false;
+ $parts = explode(';', $cookieStr);
+
+ // If first part does not include '=', fail
+ if (strpos($parts[0], '=') === false) return false;
+
+ // Get the name and value of the cookie
+ list($name, $value) = explode('=', trim(array_shift($parts)), 2);
+ $name = trim($name);
+ $value = urldecode(trim($value));
+
+ // Set default domain and path
+ if ($ref_uri instanceof Zend_Uri_Http) {
+ $domain = $ref_uri->getHost();
+ $path = $ref_uri->getPath();
+ $path = substr($path, 0, strrpos($path, '/'));
+ }
+
+ // Set other cookie parameters
+ foreach ($parts as $part) {
+ $part = trim($part);
+ if (strtolower($part) == 'secure') {
+ $secure = true;
+ continue;
+ }
+
+ $keyValue = explode('=', $part, 2);
+ if (count($keyValue) == 2) {
+ list($k, $v) = $keyValue;
+ switch (strtolower($k)) {
+ case 'expires':
+ $expires = strtotime($v);
+ break;
+ case 'path':
+ $path = $v;
+ break;
+ case 'domain':
+ $domain = $v;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ if ($name !== '') {
+ return new Zend_Http_Cookie($name, $value, $domain, $expires, $path, $secure);
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/libs/Zend/Http/CookieJar.php b/libs/Zend/Http/CookieJar.php
new file mode 100755
index 0000000000..144523a93b
--- /dev/null
+++ b/libs/Zend/Http/CookieJar.php
@@ -0,0 +1,342 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE,
+ * and is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not
+ * receive a copy of the Zend Framework license and are unable to
+ * obtain it through the world-wide-web, please send a note to
+ * license@zend.com so we can mail you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage CookieJar
+ * @version $Id: CookieJar.php 5460 2007-06-27 15:54:43Z shahar $
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com/)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+require_once "Zend/Uri.php";
+require_once "Zend/Http/Cookie.php";
+require_once "Zend/Http/Response.php";
+
+/**
+ * A Zend_Http_CookieJar object is designed to contain and maintain HTTP cookies, and should
+ * be used along with Zend_Http_Client in order to manage cookies across HTTP requests and
+ * responses.
+ *
+ * The class contains an array of Zend_Http_Cookie objects. Cookies can be added to the jar
+ * automatically from a request or manually. Then, the jar can find and return the cookies
+ * needed for a specific HTTP request.
+ *
+ * A special parameter can be passed to all methods of this class that return cookies: Cookies
+ * can be returned either in their native form (as Zend_Http_Cookie objects) or as strings -
+ * the later is suitable for sending as the value of the "Cookie" header in an HTTP request.
+ * You can also choose, when returning more than one cookie, whether to get an array of strings
+ * (by passing Zend_Http_CookieJar::COOKIE_STRING_ARRAY) or one unified string for all cookies
+ * (by passing Zend_Http_CookieJar::COOKIE_STRING_CONCAT).
+ *
+ * @see http://wp.netscape.com/newsref/std/cookie_spec.html for some specs.
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage CookieJar
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com/)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Http_CookieJar
+{
+ /**
+ * Return cookie(s) as a Zend_Http_Cookie object
+ *
+ */
+ const COOKIE_OBJECT = 0;
+
+ /**
+ * Return cookie(s) as a string (suitable for sending in an HTTP request)
+ *
+ */
+ const COOKIE_STRING_ARRAY = 1;
+
+ /**
+ * Return all cookies as one long string (suitable for sending in an HTTP request)
+ *
+ */
+ const COOKIE_STRING_CONCAT = 2;
+
+ /**
+ * Array storing cookies
+ *
+ * Cookies are stored according to domain and path:
+ * $cookies
+ * + www.mydomain.com
+ * + /
+ * - cookie1
+ * - cookie2
+ * + /somepath
+ * - othercookie
+ * + www.otherdomain.net
+ * + /
+ * - alsocookie
+ *
+ * @var array
+ */
+ protected $cookies = array();
+
+ /**
+ * Construct a new CookieJar object
+ *
+ */
+ public function __construct()
+ { }
+
+ /**
+ * Add a cookie to the jar. Cookie should be passed either as a Zend_Http_Cookie object
+ * or as a string - in which case an object is created from the string.
+ *
+ * @param Zend_Http_Cookie|string $cookie
+ * @param Zend_Uri_Http|string $red_uri Optional reference URI (for domain, path, secure)
+ */
+ public function addCookie($cookie, $ref_uri = null)
+ {
+ if (is_string($cookie)) {
+ $cookie = Zend_Http_Cookie::fromString($cookie, $ref_uri);
+ }
+
+ if ($cookie instanceof Zend_Http_Cookie) {
+ $domain = $cookie->getDomain();
+ $path = $cookie->getPath();
+ if (! isset($this->cookies[$domain])) $this->cookies[$domain] = array();
+ if (! isset($this->cookies[$domain][$path])) $this->cookies[$domain][$path] = array();
+ $this->cookies[$domain][$path][$cookie->getName()] = $cookie;
+ } else {
+ throw new Zend_Http_Exception('Supplient argument is not a valid cookie string or object');
+ }
+ }
+
+ /**
+ * Parse an HTTP response, adding all the cookies set in that response
+ * to the cookie jar.
+ *
+ * @param Zend_Http_Response $response
+ * @param Zend_Uri_Http|string $ref_uri Requested URI
+ */
+ public function addCookiesFromResponse($response, $ref_uri)
+ {
+ if (! $response instanceof Zend_Http_Response)
+ throw new Zend_Http_Exception('$response is expected to be a Response object, ' .
+ gettype($response) . ' was passed');
+
+ $cookie_hdrs = $response->getHeader('Set-Cookie');
+
+ if (is_array($cookie_hdrs)) {
+ foreach ($cookie_hdrs as $cookie) {
+ $this->addCookie($cookie, $ref_uri);
+ }
+ } elseif (is_string($cookie_hdrs)) {
+ $this->addCookie($cookie_hdrs, $ref_uri);
+ }
+ }
+
+ /**
+ * Get all cookies in the cookie jar as an array
+ *
+ * @param int $ret_as Whether to return cookies as objects of Zend_Http_Cookie or as strings
+ * @return array|string
+ */
+ public function getAllCookies($ret_as = self::COOKIE_OBJECT)
+ {
+ $cookies = $this->_flattenCookiesArray($this->cookies, $ret_as);
+ return $cookies;
+ }
+
+ /**
+ * Return an array of all cookies matching a specific request according to the request URI,
+ * whether session cookies should be sent or not, and the time to consider as "now" when
+ * checking cookie expiry time.
+ *
+ * @param string|Zend_Uri_Http $uri URI to check against (secure, domain, path)
+ * @param boolean $matchSessionCookies Whether to send session cookies
+ * @param int $ret_as Whether to return cookies as objects of Zend_Http_Cookie or as strings
+ * @param int $now Override the current time when checking for expiry time
+ * @return array|string
+ */
+ public function getMatchingCookies($uri, $matchSessionCookies = true,
+ $ret_as = self::COOKIE_OBJECT, $now = null)
+ {
+ if (is_string($uri)) $uri = Zend_Uri::factory($uri);
+ if (! $uri instanceof Zend_Uri_Http)
+ throw new Zend_Http_Exception("Invalid URI: {$uri}");
+
+ // Set path
+ $path = $uri->getPath();
+ $path = substr($path, 0, strrpos($path, '/'));
+ if (! $path) $path = '/';
+
+ // First, reduce the array of cookies to only those matching domain and path
+ $cookies = $this->_matchDomain($uri->getHost());
+ $cookies = $this->_matchPath($cookies, $path);
+ $cookies = $this->_flattenCookiesArray($cookies, self::COOKIE_OBJECT);
+
+ // Next, run Cookie->match on all cookies to check secure, time and session mathcing
+ $ret = array();
+ foreach ($cookies as $cookie)
+ if ($cookie->match($uri, $matchSessionCookies, $now))
+ $ret[] = $cookie;
+
+ // Now, use self::_flattenCookiesArray again - only to convert to the return format ;)
+ $ret = $this->_flattenCookiesArray($ret, $ret_as);
+
+ return $ret;
+ }
+
+ /**
+ * Get a specific cookie according to a URI and name
+ *
+ * @param Zend_Uri_Http|string $uri The uri (domain and path) to match
+ * @param string $cookie_name The cookie's name
+ * @param int $ret_as Whether to return cookies as objects of Zend_Http_Cookie or as strings
+ * @return Zend_Http_Cookie|string
+ */
+ public function getCookie($uri, $cookie_name, $ret_as = self::COOKIE_OBJECT)
+ {
+ if (is_string($uri)) {
+ $uri = Zend_Uri::factory($uri);
+ }
+
+ if (! $uri instanceof Zend_Uri_Http) {
+ throw new Zend_Http_Exception('Invalid URI specified');
+ }
+
+ // Get correct cookie path
+ $path = $uri->getPath();
+ $path = substr($path, 0, strrpos($path, '/'));
+ if (! $path) $path = '/';
+
+ if (isset($this->cookies[$uri->getHost()][$path][$cookie_name])) {
+ $cookie = $this->cookies[$uri->getHost()][$path][$cookie_name];
+
+ switch ($ret_as) {
+ case self::COOKIE_OBJECT:
+ return $cookie;
+ break;
+
+ case self::COOKIE_STRING_ARRAY:
+ case self::COOKIE_STRING_CONCAT:
+ return $cookie->__toString();
+ break;
+
+ default:
+ throw new Zend_Http_Exception("Invalid value passed for \$ret_as: {$ret_as}");
+ break;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Helper function to recursivly flatten an array. Shoud be used when exporting the
+ * cookies array (or parts of it)
+ *
+ * @param Zend_Http_Cookie|array $ptr
+ * @param int $ret_as What value to return
+ * @return array|string
+ */
+ protected function _flattenCookiesArray($ptr, $ret_as = self::COOKIE_OBJECT) {
+ if (is_array($ptr)) {
+ $ret = ($ret_as == self::COOKIE_STRING_CONCAT ? '' : array());
+ foreach ($ptr as $item) {
+ if ($ret_as == self::COOKIE_STRING_CONCAT) {
+ $ret .= $this->_flattenCookiesArray($item, $ret_as);
+ } else {
+ $ret = array_merge($ret, $this->_flattenCookiesArray($item, $ret_as));
+ }
+ }
+ return $ret;
+ } elseif ($ptr instanceof Zend_Http_Cookie) {
+ switch ($ret_as) {
+ case self::COOKIE_STRING_ARRAY:
+ return array($ptr->__toString());
+ break;
+
+ case self::COOKIE_STRING_CONCAT:
+ return $ptr->__toString();
+ break;
+
+ case self::COOKIE_OBJECT:
+ default:
+ return array($ptr);
+ break;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Return a subset of the cookies array matching a specific domain
+ *
+ * Returned array is actually an array of pointers to items in the $this->cookies array.
+ *
+ * @param string $domain
+ * @return array
+ */
+ protected function _matchDomain($domain) {
+ $ret = array();
+
+ foreach (array_keys($this->cookies) as $cdom) {
+ $regex = "/" . preg_quote($cdom, "/") . "$/i";
+ if (preg_match($regex, $domain)) $ret[$cdom] = &$this->cookies[$cdom];
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Return a subset of a domain-matching cookies that also match a specified path
+ *
+ * Returned array is actually an array of pointers to items in the $passed array.
+ *
+ * @param array $dom_array
+ * @param string $path
+ * @return array
+ */
+ protected function _matchPath($domains, $path) {
+ $ret = array();
+ if (substr($path, -1) != '/') $path .= '/';
+
+ foreach ($domains as $dom => $paths_array) {
+ foreach (array_keys($paths_array) as $cpath) {
+ $regex = "|^" . preg_quote($cpath, "|") . "|i";
+ if (preg_match($regex, $path)) {
+ if (! isset($ret[$dom])) $ret[$dom] = array();
+ $ret[$dom][$cpath] = &$paths_array[$cpath];
+ }
+ }
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Create a new CookieJar object and automatically load into it all the
+ * cookies set in an Http_Response object. If $uri is set, it will be
+ * considered as the requested URI for setting default domain and path
+ * of the cookie.
+ *
+ * @param Zend_Http_Response $response HTTP Response object
+ * @param Zend_Uri_Http|string $uri The requested URI
+ * @return Zend_Http_CookieJar
+ * @todo Add the $uri functionality.
+ */
+ public static function fromResponse(Zend_Http_Response $response, $ref_uri)
+ {
+ $jar = new Zend_Http_CookieJar();
+ $jar->addCookiesFromResponse($response, $ref_uri);
+ return $jar;
+ }
+}
diff --git a/libs/Zend/Http/Exception.php b/libs/Zend/Http/Exception.php
new file mode 100755
index 0000000000..b0b541f683
--- /dev/null
+++ b/libs/Zend/Http/Exception.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Exception
+ * @version $Id: Exception.php 2805 2007-01-16 01:38:10Z bkarwin $
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+require_once 'Zend/Exception.php';
+
+/**
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Http_Exception extends Zend_Exception
+{}
diff --git a/libs/Zend/Http/Response.php b/libs/Zend/Http/Response.php
new file mode 100755
index 0000000000..2e8133a3d6
--- /dev/null
+++ b/libs/Zend/Http/Response.php
@@ -0,0 +1,599 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Http
+ * @subpackage Response
+ * @version $Id: Response.php 4261 2007-03-29 16:57:59Z shahar $
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+require_once 'Zend/Http/Exception.php';
+
+/**
+ * Zend_Http_Response represents an HTTP 1.0 / 1.1 response message. It
+ * includes easy access to all the response's different elemts, as well as some
+ * convenience methods for parsing and validating HTTP responses.
+ *
+ * @package Zend_Http
+ * @subpackage Response
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Http_Response
+{
+ /**
+ * List of all known HTTP response codes - used by responseCodeAsText() to
+ * translate numeric codes to messages.
+ *
+ * @var array
+ */
+ protected static $messages = array(
+ // Informational 1xx
+ 100 => 'Continue',
+ 101 => 'Switching Protocols',
+
+ // Success 2xx
+ 200 => 'OK',
+ 201 => 'Created',
+ 202 => 'Accepted',
+ 203 => 'Non-Authoritative Information',
+ 204 => 'No Content',
+ 205 => 'Reset Content',
+ 206 => 'Partial Content',
+
+ // Redirection 3xx
+ 300 => 'Multiple Choices',
+ 301 => 'Moved Permanently',
+ 302 => 'Found', // 1.1
+ 303 => 'See Other',
+ 304 => 'Not Modified',
+ 305 => 'Use Proxy',
+ // 306 is deprecated but reserved
+ 307 => 'Temporary Redirect',
+
+ // Client Error 4xx
+ 400 => 'Bad Request',
+ 401 => 'Unauthorized',
+ 402 => 'Payment Required',
+ 403 => 'Forbidden',
+ 404 => 'Not Found',
+ 405 => 'Method Not Allowed',
+ 406 => 'Not Acceptable',
+ 407 => 'Proxy Authentication Required',
+ 408 => 'Request Timeout',
+ 409 => 'Conflict',
+ 410 => 'Gone',
+ 411 => 'Length Required',
+ 412 => 'Precondition Failed',
+ 413 => 'Request Entity Too Large',
+ 414 => 'Request-URI Too Long',
+ 415 => 'Unsupported Media Type',
+ 416 => 'Requested Range Not Satisfiable',
+ 417 => 'Expectation Failed',
+
+ // Server Error 5xx
+ 500 => 'Internal Server Error',
+ 501 => 'Not Implemented',
+ 502 => 'Bad Gateway',
+ 503 => 'Service Unavailable',
+ 504 => 'Gateway Timeout',
+ 505 => 'HTTP Version Not Supported',
+ 509 => 'Bandwidth Limit Exceeded'
+ );
+
+ /**
+ * The HTTP version (1.0, 1.1)
+ *
+ * @var string
+ */
+ protected $version;
+
+ /**
+ * The HTTP response code
+ *
+ * @var int
+ */
+ protected $code;
+
+ /**
+ * The HTTP response code as string
+ * (e.g. 'Not Found' for 404 or 'Internal Server Error' for 500)
+ *
+ * @var string
+ */
+ protected $message;
+
+ /**
+ * The HTTP response headers array
+ *
+ * @var array
+ */
+ protected $headers = array();
+
+ /**
+ * The HTTP response body
+ *
+ * @var string
+ */
+ protected $body;
+
+ /**
+ * HTTP response constructor
+ *
+ * In most cases, you would use Zend_Http_Response::fromString to parse an HTTP
+ * response string and create a new Zend_Http_Response object.
+ *
+ * NOTE: The constructor no longer accepts nulls or empty values for the code and
+ * headers and will throw an exception if the passed values do not form a valid HTTP
+ * responses.
+ *
+ * If no message is passed, the message will be guessed according to the response code.
+ *
+ * @param int $code Response code (200, 404, ...)
+ * @param array $headers Headers array
+ * @param string $body Response body
+ * @param string $version HTTP version
+ * @param string $message Response code as text
+ * @throws Zend_Http_Exception
+ */
+ public function __construct($code, $headers, $body = null, $version = '1.1', $message = null)
+ {
+ // Make sure the response code is valid and set it
+ if (self::responseCodeAsText($code) === null)
+ throw new Zend_Http_Exception("{$code} is not a valid HTTP response code");
+
+ $this->code = $code;
+
+ // Make sure we got valid headers and set them
+ if (! is_array($headers))
+ throw new Zend_Http_Exception('No valid headers were passed');
+
+ foreach ($headers as $name => $value) {
+ if (is_int($name))
+ list($name, $value) = explode(": ", $value, 1);
+
+ $this->headers[ucwords(strtolower($name))] = $value;
+ }
+
+ // Set the body
+ $this->body = $body;
+
+ // Set the HTTP version
+ if (! preg_match('|^\d\.\d$|', $version))
+ throw new Zend_Http_Exception("Invalid HTTP response version: $version");
+
+ $this->version = $version;
+
+ // If we got the response message, set it. Else, set it according to
+ // the response code
+ if (is_string($message)) {
+ $this->message = $message;
+ } else {
+ $this->message = self::responseCodeAsText($code);
+ }
+ }
+
+ /**
+ * Check whether the response is an error
+ *
+ * @return boolean
+ */
+ public function isError()
+ {
+ $restype = floor($this->code / 100);
+ if ($restype == 4 || $restype == 5) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Check whether the response in successful
+ *
+ * @return boolean
+ */
+ public function isSuccessful()
+ {
+ $restype = floor($this->code / 100);
+ if ($restype == 2 || $restype == 1) { // Shouldn't 3xx count as success as well ???
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Check whether the response is a redirection
+ *
+ * @return boolean
+ */
+ public function isRedirect()
+ {
+ $restype = floor($this->code / 100);
+ if ($restype == 3) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Get the response body as string
+ *
+ * This method returns the body of the HTTP response (the content), as it
+ * should be in it's readable version - that is, after decoding it (if it
+ * was decoded), deflating it (if it was gzip compressed), etc.
+ *
+ * If you want to get the raw body (as transfered on wire) use
+ * $this->getRawBody() instead.
+ *
+ * @return string
+ */
+ public function getBody()
+ {
+ $body = '';
+
+ // Decode the body if it was transfer-encoded
+ switch ($this->getHeader('transfer-encoding')) {
+
+ // Handle chunked body
+ case 'chunked':
+ $body = self::decodeChunkedBody($this->body);
+ break;
+
+ // No transfer encoding, or unknown encoding extension:
+ // return body as is
+ default:
+ $body = $this->body;
+ break;
+ }
+
+ // Decode any content-encoding (gzip or deflate) if needed
+ switch (strtolower($this->getHeader('content-encoding'))) {
+
+ // Handle gzip encoding
+ case 'gzip':
+ $body = self::decodeGzip($body);
+ break;
+
+ // Handle deflate encoding
+ case 'deflate':
+ $body = self::decodeDeflate($body);
+ break;
+
+ default:
+ break;
+ }
+
+ return $body;
+ }
+
+ /**
+ * Get the raw response body (as transfered "on wire") as string
+ *
+ * If the body is encoded (with Transfer-Encoding, not content-encoding -
+ * IE "chunked" body), gzip compressed, etc. it will not be decoded.
+ *
+ * @return string
+ */
+ public function getRawBody()
+ {
+ return $this->body;
+ }
+
+ /**
+ * Get the HTTP version of the response
+ *
+ * @return string
+ */
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ /**
+ * Get the HTTP response status code
+ *
+ * @return int
+ */
+ public function getStatus()
+ {
+ return $this->code;
+ }
+
+ /**
+ * Return a message describing the HTTP response code
+ * (Eg. "OK", "Not Found", "Moved Permanently")
+ *
+ * @return string
+ */
+ public function getMessage()
+ {
+ return $this->message;
+ }
+
+ /**
+ * Get the response headers
+ *
+ * @return array
+ */
+ public function getHeaders()
+ {
+ return $this->headers;
+ }
+
+ /**
+ * Get a specific header as string, or null if it is not set
+ *
+ * @param string$header
+ * @return string|array|null
+ */
+ public function getHeader($header)
+ {
+ $header = ucwords(strtolower($header));
+ if (! is_string($header) || ! isset($this->headers[$header])) return null;
+
+ return $this->headers[$header];
+ }
+
+ /**
+ * Get all headers as string
+ *
+ * @param boolean $status_line Whether to return the first status line (IE "HTTP 200 OK")
+ * @param string $br Line breaks (eg. "\n", "\r\n", "<br />")
+ * @return string
+ */
+ public function getHeadersAsString($status_line = true, $br = "\n")
+ {
+ $str = '';
+
+ if ($status_line) {
+ $str = "HTTP/{$this->version} {$this->code} {$this->message}{$br}";
+ }
+
+ // Iterate over the headers and stringify them
+ foreach ($this->headers as $name => $value)
+ {
+ if (is_string($value))
+ $str .= "{$name}: {$value}{$br}";
+
+ elseif (is_array($value)) {
+ foreach ($value as $subval) {
+ $str .= "{$name}: {$subval}{$br}";
+ }
+ }
+ }
+
+ return $str;
+ }
+
+ /**
+ * Get the entire response as string
+ *
+ * @param string $br Line breaks (eg. "\n", "\r\n", "<br />")
+ * @return string
+ */
+ public function asString($br = "\n")
+ {
+ return $this->getHeadersAsString(true, $br) . $br . $this->getBody();
+ }
+
+ /**
+ * A convenience function that returns a text representation of
+ * HTTP response codes. Returns 'Unknown' for unknown codes.
+ * Returns array of all codes, if $code is not specified.
+ *
+ * Conforms to HTTP/1.1 as defined in RFC 2616 (except for 'Unknown')
+ * See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 for reference
+ *
+ * @param int $code HTTP response code
+ * @param boolean $http11 Use HTTP version 1.1
+ * @return string
+ */
+ public static function responseCodeAsText($code = null, $http11 = true)
+ {
+ $messages = self::$messages;
+ if (! $http11) $messages[302] = 'Moved Temporarily';
+
+ if ($code === null) {
+ return $messages;
+ } elseif (isset($messages[$code])) {
+ return $messages[$code];
+ } else {
+ return 'Unknown';
+ }
+ }
+
+ /**
+ * Extract the response code from a response string
+ *
+ * @param string $response_str
+ * @return int
+ */
+ public static function extractCode($response_str)
+ {
+ preg_match("|^HTTP/[\d\.x]+ (\d+)|", $response_str, $m);
+
+ if (isset($m[1])) {
+ return (int) $m[1];
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Extract the HTTP message from a response
+ *
+ * @param string $response_str
+ * @return string
+ */
+ public static function extractMessage($response_str)
+ {
+ preg_match("|^HTTP/[\d\.x]+ \d+ ([^\r\n]+)|", $response_str, $m);
+
+ if (isset($m[1])) {
+ return $m[1];
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Extract the HTTP version from a response
+ *
+ * @param string $response_str
+ * @return string
+ */
+ public static function extractVersion($response_str)
+ {
+ preg_match("|^HTTP/([\d\.x]+) \d+|", $response_str, $m);
+
+ if (isset($m[1])) {
+ return $m[1];
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Extract the headers from a response string
+ *
+ * @param string $response_str
+ * @return array
+ */
+ public static function extractHeaders($response_str)
+ {
+ $headers = array();
+ $lines = explode("\n", $response_str);
+ $last_header = null;
+
+ foreach($lines as $line) {
+ $line = trim($line, "\r\n");
+ if ($line == "") break;
+
+ if (preg_match("|^([\w-]+):\s+(.+)|", $line, $m)) {
+ unset($last_header);
+ $h_name = strtolower($m[1]);
+ $h_value = $m[2];
+
+ if (isset($headers[$h_name])) {
+ if (! is_array($headers[$h_name])) {
+ $headers[$h_name] = array($headers[$h_name]);
+ }
+
+ $headers[$h_name][] = $h_value;
+ } else {
+ $headers[$h_name] = $h_value;
+ }
+ $last_header = $h_name;
+ } elseif (preg_match("|^\s+(.+)$|", $line, $m) && $last_header !== null) {
+ if (is_array($headers[$last_header])) {
+ end($headers[$last_header]);
+ $last_header_key = key($headers[$last_header]);
+ $headers[$last_header][$last_header_key] .= $m[1];
+ } else {
+ $headers[$last_header] .= $m[1];
+ }
+ }
+ }
+
+ return $headers;
+ }
+
+ /**
+ * Extract the body from a response string
+ *
+ * @param string $response_str
+ * @return string
+ */
+ public static function extractBody($response_str)
+ {
+ list(, $body) = preg_split('/^\r?$/m', $response_str, 2);
+ $body = ltrim($body);
+
+ return $body;
+ }
+
+ /**
+ * Decode a "chunked" transfer-encoded body and return the decoded text
+ *
+ * @param string $body
+ * @return string
+ */
+ public static function decodeChunkedBody($body)
+ {
+ $decBody = '';
+
+ while (trim($body)) {
+ if (! preg_match("/^([\da-fA-F]+)[^\r\n]*\r\n/sm", $body, $m)) {
+ throw new Zend_Http_Exception("Error parsing body - doesn't seem to be a chunked message");
+ }
+
+ $length = hexdec(trim($m[1]));
+ $cut = strlen($m[0]);
+
+ $decBody .= substr($body, $cut, $length);
+ $body = substr($body, $cut + $length + 2);
+ }
+
+ return $decBody;
+ }
+
+ /**
+ * Decode a gzip encoded message (when Content-encoding = gzip)
+ *
+ * Currently requires PHP with zlib support
+ *
+ * @param string $body
+ * @return string
+ */
+ public static function decodeGzip($body)
+ {
+ return gzinflate(substr($body, 10));
+ }
+
+ /**
+ * Decode a zlib deflated message (when Content-encoding = deflate)
+ *
+ * Currently requires PHP with zlib support
+ *
+ * @param string $body
+ * @return string
+ */
+ public static function decodeDeflate($body)
+ {
+ return gzuncompress($body);
+ }
+
+ /**
+ * Create a new Zend_Http_Response object from a string
+ *
+ * @param string $response_str
+ * @return Zend_Http_Response
+ */
+ public static function fromString($response_str)
+ {
+ $code = self::extractCode($response_str);
+ $headers = self::extractHeaders($response_str);
+ $body = self::extractBody($response_str);
+ $version = self::extractVersion($response_str);
+ $message = self::extractMessage($response_str);
+
+ return new Zend_Http_Response($code, $headers, $body, $version, $message);
+ }
+}
diff --git a/libs/Zend/Json.php b/libs/Zend/Json.php
new file mode 100755
index 0000000000..f81cb27897
--- /dev/null
+++ b/libs/Zend/Json.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Json
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Class for encoding to and decoding from JSON.
+ *
+ * @category Zend
+ * @package Zend_Json
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Json
+{
+ /**
+ * How objects should be encoded -- arrays or as StdClass. TYPE_ARRAY is 1
+ * so that it is a boolean true value, allowing it to be used with
+ * ext/json's functions.
+ */
+ const TYPE_ARRAY = 1;
+ const TYPE_OBJECT = 0;
+
+ /**
+ * @var bool
+ */
+ public static $useBuiltinEncoderDecoder = false;
+
+ /**
+ * Decodes the given $encodedValue string which is
+ * encoded in the JSON format
+ *
+ * Uses ext/json's json_decode if available.
+ *
+ * @param string $encodedValue Encoded in JSON format
+ * @param int $objectDecodeType Optional; flag indicating how to decode
+ * objects. See {@link ZJsonDecoder::decode()} for details.
+ * @return mixed
+ */
+ public static function decode($encodedValue, $objectDecodeType = Zend_Json::TYPE_ARRAY)
+ {
+ if (function_exists('json_decode') && self::$useBuiltinEncoderDecoder !== true) {
+ return json_decode($encodedValue, $objectDecodeType);
+ }
+
+ require_once 'Zend/Json/Decoder.php';
+ return Zend_Json_Decoder::decode($encodedValue, $objectDecodeType);
+ }
+
+
+ /**
+ * Encode the mixed $valueToEncode into the JSON format
+ *
+ * Encodes using ext/json's json_encode() if available.
+ *
+ * NOTE: Object should not contain cycles; the JSON format
+ * does not allow object reference.
+ *
+ * NOTE: Only public variables will be encoded
+ *
+ * @param mixed $valueToEncode
+ * @param boolean $cycleCheck Optional; whether or not to check for object recursion; off by default
+ * @return string JSON encoded object
+ */
+ public static function encode($valueToEncode, $cycleCheck = false)
+ {
+ if (function_exists('json_encode') && self::$useBuiltinEncoderDecoder !== true) {
+ return json_encode($valueToEncode);
+ }
+
+ require_once 'Zend/Json/Encoder.php';
+ return Zend_Json_Encoder::encode($valueToEncode, $cycleCheck);
+ }
+}
+
diff --git a/libs/Zend/Json/Decoder.php b/libs/Zend/Json/Decoder.php
new file mode 100755
index 0000000000..e2dbaf9448
--- /dev/null
+++ b/libs/Zend/Json/Decoder.php
@@ -0,0 +1,454 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Json
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Json
+ */
+require_once 'Zend/Json.php';
+
+/**
+ * Zend_Json_Exception
+ */
+require_once 'Zend/Json/Exception.php';
+
+
+/**
+ * Decode JSON encoded string to PHP variable constructs
+ *
+ * @category Zend
+ * @package Zend_Json
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Json_Decoder
+{
+ /**
+ * Parse tokens used to decode the JSON object. These are not
+ * for public consumption, they are just used internally to the
+ * class.
+ */
+ const EOF = 0;
+ const DATUM = 1;
+ const LBRACE = 2;
+ const LBRACKET = 3;
+ const RBRACE = 4;
+ const RBRACKET = 5;
+ const COMMA = 6;
+ const COLON = 7;
+
+ /**
+ * Use to maintain a "pointer" to the source being decoded
+ *
+ * @var string
+ */
+ protected $_source;
+
+ /**
+ * Caches the source length
+ *
+ * @var int
+ */
+ protected $_sourceLength;
+
+ /**
+ * The offset within the souce being decoded
+ *
+ * @var int
+ *
+ */
+ protected $_offset;
+
+ /**
+ * The current token being considered in the parser cycle
+ *
+ * @var int
+ */
+ protected $_token;
+
+ /**
+ * Flag indicating how objects should be decoded
+ *
+ * @var int
+ * @access protected
+ */
+ protected $_decodeType;
+
+ /**
+ * Constructor
+ *
+ * @param string $source String source to decode
+ * @param int $decodeType How objects should be decoded -- see
+ * {@link Zend_Json::TYPE_ARRAY} and {@link Zend_Json::TYPE_OBJECT} for
+ * valid values
+ * @return void
+ */
+ protected function __construct($source, $decodeType)
+ {
+ // Set defaults
+ $this->_source = $source;
+ $this->_sourceLength = strlen($source);
+ $this->_token = self::EOF;
+ $this->_offset = 0;
+
+ // Normalize and set $decodeType
+ if (!in_array($decodeType, array(Zend_Json::TYPE_ARRAY, Zend_Json::TYPE_OBJECT)))
+ {
+ $decodeType = Zend_Json::TYPE_ARRAY;
+ }
+ $this->_decodeType = $decodeType;
+
+ // Set pointer at first token
+ $this->_getNextToken();
+ }
+
+ /**
+ * Decode a JSON source string
+ *
+ * Decodes a JSON encoded string. The value returned will be one of the
+ * following:
+ * - integer
+ * - float
+ * - boolean
+ * - null
+ * - StdClass
+ * - array
+ * - array of one or more of the above types
+ *
+ * By default, decoded objects will be returned as associative arrays; to
+ * return a StdClass object instead, pass {@link Zend_Json::TYPE_OBJECT} to
+ * the $objectDecodeType parameter.
+ *
+ * Throws a Zend_Json_Exception if the source string is null.
+ *
+ * @static
+ * @access public
+ * @param string $source String to be decoded
+ * @param int $objectDecodeType How objects should be decoded; should be
+ * either or {@link Zend_Json::TYPE_ARRAY} or
+ * {@link Zend_Json::TYPE_OBJECT}; defaults to TYPE_ARRAY
+ * @return mixed
+ * @throws Zend_Json_Exception
+ */
+ public static function decode($source = null, $objectDecodeType = Zend_Json::TYPE_ARRAY)
+ {
+ if (null === $source) {
+ throw new Zend_Json_Exception('Must specify JSON encoded source for decoding');
+ } elseif (!is_string($source)) {
+ throw new Zend_Json_Exception('Can only decode JSON encoded strings');
+ }
+
+ $decoder = new self($source, $objectDecodeType);
+
+ return $decoder->_decodeValue();
+ }
+
+
+ /**
+ * Recursive driving rountine for supported toplevel tops
+ *
+ * @return mixed
+ */
+ protected function _decodeValue()
+ {
+ switch ($this->_token) {
+ case self::DATUM:
+ $result = $this->_tokenValue;
+ $this->_getNextToken();
+ return($result);
+ break;
+ case self::LBRACE:
+ return($this->_decodeObject());
+ break;
+ case self::LBRACKET:
+ return($this->_decodeArray());
+ break;
+ default:
+ return null;
+ break;
+ }
+ }
+
+ /**
+ * Decodes an object of the form:
+ * { "attribute: value, "attribute2" : value,...}
+ *
+ * If ZJsonEnoder or ZJAjax was used to encode the original object
+ * then a special attribute called __className which specifies a class
+ * name that should wrap the data contained within the encoded source.
+ *
+ * Decodes to either an array or StdClass object, based on the value of
+ * {@link $_decodeType}. If invalid $_decodeType present, returns as an
+ * array.
+ *
+ * @return array|StdClass
+ */
+ protected function _decodeObject()
+ {
+ $members = array();
+ $tok = $this->_getNextToken();
+
+ while ($tok && $tok != self::RBRACE) {
+ if ($tok != self::DATUM || ! is_string($this->_tokenValue)) {
+ throw new Zend_Json_Exception('Missing key in object encoding: ' . $this->_source);
+ }
+
+ $key = $this->_tokenValue;
+ $tok = $this->_getNextToken();
+
+ if ($tok != self::COLON) {
+ throw new Zend_Json_Exception('Missing ":" in object encoding: ' . $this->_source);
+ }
+
+ $tok = $this->_getNextToken();
+ $members[$key] = $this->_decodeValue();
+ $tok = $this->_token;
+
+ if ($tok == self::RBRACE) {
+ break;
+ }
+
+ if ($tok != self::COMMA) {
+ throw new Zend_Json_Exception('Missing "," in object encoding: ' . $this->_source);
+ }
+
+ $tok = $this->_getNextToken();
+ }
+
+ switch ($this->_decodeType) {
+ case Zend_Json::TYPE_OBJECT:
+ // Create new StdClass and populate with $members
+ $result = new StdClass();
+ foreach ($members as $key => $value) {
+ $result->$key = $value;
+ }
+ break;
+ case Zend_Json::TYPE_ARRAY:
+ default:
+ $result = $members;
+ break;
+ }
+
+ $this->_getNextToken();
+ return $result;
+ }
+
+ /**
+ * Decodes a JSON array format:
+ * [element, element2,...,elementN]
+ *
+ * @return array
+ */
+ protected function _decodeArray()
+ {
+ $result = array();
+ $starttok = $tok = $this->_getNextToken(); // Move past the '['
+ $index = 0;
+
+ while ($tok && $tok != self::RBRACKET) {
+ $result[$index++] = $this->_decodeValue();
+
+ $tok = $this->_token;
+
+ if ($tok == self::RBRACKET || !$tok) {
+ break;
+ }
+
+ if ($tok != self::COMMA) {
+ throw new Zend_Json_Exception('Missing "," in array encoding: ' . $this->_source);
+ }
+
+ $tok = $this->_getNextToken();
+ }
+
+ $this->_getNextToken();
+ return($result);
+ }
+
+
+ /**
+ * Removes whitepsace characters from the source input
+ */
+ protected function _eatWhitespace()
+ {
+ if (preg_match(
+ '/([\t\b\f\n\r ])*/s',
+ $this->_source,
+ $matches,
+ PREG_OFFSET_CAPTURE,
+ $this->_offset)
+ && $matches[0][1] == $this->_offset)
+ {
+ $this->_offset += strlen($matches[0][0]);
+ }
+ }
+
+
+ /**
+ * Retrieves the next token from the source stream
+ *
+ * @return int Token constant value specified in class definition
+ */
+ protected function _getNextToken()
+ {
+ $this->_token = self::EOF;
+ $this->_tokenValue = null;
+ $this->_eatWhitespace();
+
+ if ($this->_offset >= $this->_sourceLength) {
+ return(self::EOF);
+ }
+
+ $str = $this->_source;
+ $str_length = $this->_sourceLength;
+ $i = $this->_offset;
+ $start = $i;
+
+ switch ($str{$i}) {
+ case '{':
+ $this->_token = self::LBRACE;
+ break;
+ case '}':
+ $this->_token = self::RBRACE;
+ break;
+ case '[':
+ $this->_token = self::LBRACKET;
+ break;
+ case ']':
+ $this->_token = self::RBRACKET;
+ break;
+ case ',':
+ $this->_token = self::COMMA;
+ break;
+ case ':':
+ $this->_token = self::COLON;
+ break;
+ case '"':
+ $result = '';
+ do {
+ $i++;
+ if ($i >= $str_length) {
+ break;
+ }
+
+ $chr = $str{$i};
+ if ($chr == '\\') {
+ $i++;
+ if ($i >= $str_length) {
+ break;
+ }
+ $chr = $str{$i};
+ switch ($chr) {
+ case '"' :
+ $result .= '"';
+ break;
+ case '\\':
+ $result .= '\\';
+ break;
+ case '/' :
+ $result .= '/';
+ break;
+ case 'b' :
+ $result .= chr(8);
+ break;
+ case 'f' :
+ $result .= chr(12);
+ break;
+ case 'n' :
+ $result .= chr(10);
+ break;
+ case 'r' :
+ $result .= chr(13);
+ break;
+ case 't' :
+ $result .= chr(9);
+ break;
+ default:
+ throw new Zend_Json_Exception("Illegal escape "
+ . "sequence '" . $chr . "'");
+ }
+ } elseif ($chr == '"') {
+ break;
+ } else {
+ $result .= $chr;
+ }
+ } while ($i < $str_length);
+
+ $this->_token = self::DATUM;
+ //$this->_tokenValue = substr($str, $start + 1, $i - $start - 1);
+ $this->_tokenValue = $result;
+ break;
+ case 't':
+ if (($i+ 3) < $str_length && substr($str, $start, 4) == "true") {
+ $this->_token = self::DATUM;
+ }
+ $this->_tokenValue = true;
+ $i += 3;
+ break;
+ case 'f':
+ if (($i+ 4) < $str_length && substr($str, $start, 5) == "false") {
+ $this->_token = self::DATUM;
+ }
+ $this->_tokenValue = false;
+ $i += 4;
+ break;
+ case 'n':
+ if (($i+ 3) < $str_length && substr($str, $start, 4) == "null") {
+ $this->_token = self::DATUM;
+ }
+ $this->_tokenValue = NULL;
+ $i += 3;
+ break;
+ }
+
+ if ($this->_token != self::EOF) {
+ $this->_offset = $i + 1; // Consume the last token character
+ return($this->_token);
+ }
+
+ $chr = $str{$i};
+ if ($chr == '-' || $chr == '.' || ($chr >= '0' && $chr <= '9')) {
+ if (preg_match('/-?([0-9])*(\.[0-9]*)?((e|E)((-|\+)?)[0-9]+)?/s',
+ $str, $matches, PREG_OFFSET_CAPTURE, $start) && $matches[0][1] == $start) {
+
+ $datum = $matches[0][0];
+
+ if (is_numeric($datum)) {
+ if (preg_match('/^0\d+$/', $datum)) {
+ throw new Zend_Json_Exception("Octal notation not supported by JSON (value: $datum)");
+ } else {
+ $val = intval($datum);
+ $fVal = floatval($datum);
+ $this->_tokenValue = ($val == $fVal ? $val : $fVal);
+ }
+ } else {
+ throw new Zend_Json_Exception("Illegal number format: $datum");
+ }
+
+ $this->_token = self::DATUM;
+ $this->_offset = $start + strlen($datum);
+ }
+ } else {
+ throw new Zend_Json_Exception('Illegal Token');
+ }
+
+ return($this->_token);
+ }
+}
+
diff --git a/libs/Zend/Json/Encoder.php b/libs/Zend/Json/Encoder.php
new file mode 100755
index 0000000000..8589b420b8
--- /dev/null
+++ b/libs/Zend/Json/Encoder.php
@@ -0,0 +1,413 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Json
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Json_Exception
+ */
+require_once 'Zend/Json/Exception.php';
+
+
+/**
+ * Encode PHP constructs to JSON
+ *
+ * @category Zend
+ * @package Zend_Json
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Json_Encoder
+{
+ /**
+ * Whether or not to check for possible cycling
+ *
+ * @var boolean
+ */
+ protected $_cycleCheck;
+
+ /**
+ * Array of visited objects; used to prevent cycling.
+ *
+ * @var array
+ */
+ protected $_visited = array();
+
+ /**
+ * Constructor
+ *
+ * @param boolean $cycleCheck Whether or not to check for recursion when encoding
+ * @return void
+ */
+ protected function __construct($cycleCheck = false)
+ {
+ $this->_cycleCheck = $cycleCheck;
+ }
+
+ /**
+ * Use the JSON encoding scheme for the value specified
+ *
+ * @param mixed $value The value to be encoded
+ * @param boolean $cycleCheck Whether or not to check for possible object recursion when encoding
+ * @return string The encoded value
+ */
+ public static function encode($value, $cycleCheck = false)
+ {
+ $encoder = new Zend_Json_Encoder(($cycleCheck) ? true : false);
+
+ return $encoder->_encodeValue($value);
+ }
+
+ /**
+ * Recursive driver which determines the type of value to be encoded
+ * and then dispatches to the appropriate method. $values are either
+ * - objects (returns from {@link _encodeObject()})
+ * - arrays (returns from {@link _encodeArray()})
+ * - basic datums (e.g. numbers or strings) (returns from {@link _encodeDatum()})
+ *
+ * @param $value mixed The value to be encoded
+ * @return string Encoded value
+ */
+ protected function _encodeValue(&$value)
+ {
+ if (is_object($value)) {
+ return $this->_encodeObject($value);
+ } else if (is_array($value)) {
+ return $this->_encodeArray($value);
+ }
+
+ return $this->_encodeDatum($value);
+ }
+
+
+
+ /**
+ * Encode an object to JSON by encoding each of the public properties
+ *
+ * A special property is added to the JSON object called '__className'
+ * that contains the name of the class of $value. This is used to decode
+ * the object on the client into a specific class.
+ *
+ * @param $value object
+ * @return string
+ * @throws Zend_Json_Exception If recursive checks are enabled and the object has been serialized previously
+ */
+ protected function _encodeObject(&$value)
+ {
+ if ($this->_cycleCheck) {
+ if ($this->_wasVisited($value)) {
+ throw new Zend_Json_Exception(
+ 'Cycles not supported in JSON encoding, cycle introduced by '
+ . 'class "' . get_class($value) . '"'
+ );
+ }
+
+ $this->_visited[] = $value;
+ }
+
+ $props = '';
+ foreach (get_object_vars($value) as $name => $propValue) {
+ if (isset($propValue)) {
+ $props .= ','
+ . $this->_encodeValue($name)
+ . ':'
+ . $this->_encodeValue($propValue);
+ }
+ }
+
+ return '{"__className":"' . get_class($value) . '"'
+ . $props . '}';
+ }
+
+
+ /**
+ * Determine if an object has been serialized already
+ *
+ * @param mixed $value
+ * @return boolean
+ */
+ protected function _wasVisited(&$value)
+ {
+ if (in_array($value, $this->_visited, true)) {
+ return true;
+ }
+
+ return false;
+ }
+
+
+ /**
+ * JSON encode an array value
+ *
+ * Recursively encodes each value of an array and returns a JSON encoded
+ * array string.
+ *
+ * Arrays are defined as integer-indexed arrays starting at index 0, where
+ * the last index is (count($array) -1); any deviation from that is
+ * considered an associative array, and will be encoded as such.
+ *
+ * @param $array array
+ * @return string
+ */
+ protected function _encodeArray(&$array)
+ {
+ $tmpArray = array();
+
+ // Check for associative array
+ if (!empty($array) && (array_keys($array) !== range(0, count($array) - 1))) {
+ // Associative array
+ $result = '{';
+ foreach ($array as $key => $value) {
+ $key = (string) $key;
+ $tmpArray[] = $this->_encodeString($key)
+ . ':'
+ . $this->_encodeValue($value);
+ }
+ $result .= implode(',', $tmpArray);
+ $result .= '}';
+ } else {
+ // Indexed array
+ $result = '[';
+ $length = count($array);
+ for ($i = 0; $i < $length; $i++) {
+ $tmpArray[] = $this->_encodeValue($array[$i]);
+ }
+ $result .= implode(',', $tmpArray);
+ $result .= ']';
+ }
+
+ return $result;
+ }
+
+
+ /**
+ * JSON encode a basic data type (string, number, boolean, null)
+ *
+ * If value type is not a string, number, boolean, or null, the string
+ * 'null' is returned.
+ *
+ * @param $value mixed
+ * @return string
+ */
+ protected function _encodeDatum(&$value)
+ {
+ $result = 'null';
+
+ if (is_int($value) || is_float($value)) {
+ $result = (string)$value;
+ } elseif (is_string($value)) {
+ $result = $this->_encodeString($value);
+ } elseif (is_bool($value)) {
+ $result = $value ? 'true' : 'false';
+ }
+
+ return $result;
+ }
+
+
+ /**
+ * JSON encode a string value by escaping characters as necessary
+ *
+ * @param $value string
+ * @return string
+ */
+ protected function _encodeString(&$string)
+ {
+ // Escape these characters with a backslash:
+ // " \ / \n \r \t \b \f
+ $search = array('\\', "\n", "\t", "\r", "\b", "\f", '"');
+ $replace = array('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\"');
+ $string = str_replace($search, $replace, $string);
+
+ // Escape certain ASCII characters:
+ // 0x08 => \b
+ // 0x0c => \f
+ $string = str_replace(array(chr(0x08), chr(0x0C)), array('\b', '\f'), $string);
+
+ return '"' . $string . '"';
+ }
+
+
+ /**
+ * Encode the constants associated with the ReflectionClass
+ * parameter. The encoding format is based on the class2 format
+ *
+ * @param $cls ReflectionClass
+ * @return string Encoded constant block in class2 format
+ */
+ private static function _encodeConstants(ReflectionClass $cls)
+ {
+ $result = "constants : {";
+ $constants = $cls->getConstants();
+
+ $tmpArray = array();
+ if (!empty($constants)) {
+ foreach ($constants as $key => $value) {
+ $tmpArray[] = "$key: " . self::encode($value);
+ }
+
+ $result .= implode(', ', $tmpArray);
+ }
+
+ return $result . "}";
+ }
+
+
+ /**
+ * Encode the public methods of the ReflectionClass in the
+ * class2 format
+ *
+ * @param $cls ReflectionClass
+ * @return string Encoded method fragment
+ *
+ */
+ private static function _encodeMethods(ReflectionClass $cls)
+ {
+ $methods = $cls->getMethods();
+ $result = 'methods:{';
+
+ $started = false;
+ foreach ($methods as $method) {
+ if (! $method->isPublic() || !$method->isUserDefined()) {
+ continue;
+ }
+
+ if ($started) {
+ $result .= ',';
+ }
+ $started = true;
+
+ $result .= '' . $method->getName(). ':function(';
+
+ if ('__construct' != $method->getName()) {
+ $parameters = $method->getParameters();
+ $paramCount = count($parameters);
+ $argsStarted = false;
+
+ $argNames = "var argNames=[";
+ foreach ($parameters as $param) {
+ if ($argsStarted) {
+ $result .= ',';
+ }
+
+ $result .= $param->getName();
+
+ if ($argsStarted) {
+ $argNames .= ',';
+ }
+
+ $argNames .= '"' . $param->getName() . '"';
+
+ $argsStarted = true;
+ }
+ $argNames .= "];";
+
+ $result .= "){"
+ . $argNames
+ . 'var result = ZAjaxEngine.invokeRemoteMethod('
+ . "this, '" . $method->getName()
+ . "',argNames,arguments);"
+ . 'return(result);}';
+ } else {
+ $result .= "){}";
+ }
+ }
+
+ return $result . "}";
+ }
+
+
+ /**
+ * Encode the public properties of the ReflectionClass in the class2
+ * format.
+ *
+ * @param $cls ReflectionClass
+ * @return string Encode properties list
+ *
+ */
+ private static function _encodeVariables(ReflectionClass $cls)
+ {
+ $properties = $cls->getProperties();
+ $propValues = get_class_vars($cls->getName());
+ $result = "variables:{";
+ $cnt = 0;
+
+ $tmpArray = array();
+ foreach ($properties as $prop) {
+ if (! $prop->isPublic()) {
+ continue;
+ }
+
+ $tmpArray[] = $prop->getName()
+ . ':'
+ . self::encode($propValues[$prop->getName()]);
+ }
+ $result .= implode(',', $tmpArray);
+
+ return $result . "}";
+ }
+
+ /**
+ * Encodes the given $className into the class2 model of encoding PHP
+ * classes into JavaScript class2 classes.
+ * NOTE: Currently only public methods and variables are proxied onto
+ * the client machine
+ *
+ * @param $className string The name of the class, the class must be
+ * instantiable using a null constructor
+ * @param $package string Optional package name appended to JavaScript
+ * proxy class name
+ * @return string The class2 (JavaScript) encoding of the class
+ * @throws Zend_Json_Exception
+ */
+ public static function encodeClass($className, $package = '')
+ {
+ $cls = new ReflectionClass($className);
+ if (! $cls->isInstantiable()) {
+ throw new Zend_Json_Exception("$className must be instantiable");
+ }
+
+ return "Class.create('$package$className',{"
+ . self::_encodeConstants($cls) .","
+ . self::_encodeMethods($cls) .","
+ . self::_encodeVariables($cls) .'});';
+ }
+
+
+ /**
+ * Encode several classes at once
+ *
+ * Returns JSON encoded classes, using {@link encodeClass()}.
+ *
+ * @param array $classNames
+ * @param string $package
+ * @return string
+ */
+ public static function encodeClasses(array $classNames, $package = '')
+ {
+ $result = '';
+ foreach ($classNames as $className) {
+ $result .= self::encodeClass($className, $package);
+ }
+
+ return $result;
+ }
+
+}
+
diff --git a/libs/Zend/Json/Exception.php b/libs/Zend/Json/Exception.php
new file mode 100755
index 0000000000..bf29acaa8d
--- /dev/null
+++ b/libs/Zend/Json/Exception.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Json
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Json
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Json_Exception extends Zend_Exception
+{}
+
diff --git a/libs/Zend/Json/TODO.txt b/libs/Zend/Json/TODO.txt
new file mode 100755
index 0000000000..cfdb24cdbd
--- /dev/null
+++ b/libs/Zend/Json/TODO.txt
@@ -0,0 +1 @@
+* Unit tests
diff --git a/libs/Zend/Loader.php b/libs/Zend/Loader.php
new file mode 100755
index 0000000000..4b796c3b0a
--- /dev/null
+++ b/libs/Zend/Loader.php
@@ -0,0 +1,260 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Loader
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Static methods for loading classes and files.
+ *
+ * @category Zend
+ * @package Zend_Loader
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+class Zend_Loader
+{
+ /**
+ * Loads a class from a PHP file. The filename must be formatted
+ * as "$class.php".
+ *
+ * If $dirs is a string or an array, it will search the directories
+ * in the order supplied, and attempt to load the first matching file.
+ *
+ * If $dirs is null, it will split the class name at underscores to
+ * generate a path hierarchy (e.g., "Zend_Example_Class" will map
+ * to "Zend/Example/Class.php").
+ *
+ * If the file was not found in the $dirs, or if no $dirs were specified,
+ * it will attempt to load it from PHP's include_path.
+ *
+ * @param string $class - The full class name of a Zend component.
+ * @param string|array $dirs - OPTIONAL Either a path or an array of paths
+ * to search.
+ * @return void
+ * @throws Zend_Exception
+ */
+ public static function loadClass($class, $dirs = null)
+ {
+ if (class_exists($class, false) || interface_exists($class, false)) {
+ return;
+ }
+
+ if ((null !== $dirs) && !is_string($dirs) && !is_array($dirs)) {
+ require_once 'Zend/Exception.php';
+ throw new Zend_Exception('Directory argument must be a string or an array');
+ }
+ if (null === $dirs) {
+ $dirs = array();
+ }
+ if (is_string($dirs)) {
+ $dirs = (array) $dirs;
+ }
+
+ // autodiscover the path from the class name
+ $path = str_replace('_', DIRECTORY_SEPARATOR, $class);
+ if ($path != $class) {
+ // use the autodiscovered path
+ $dirPath = dirname($path);
+ if (0 == count($dirs)) {
+ $dirs = array($dirPath);
+ } else {
+ foreach ($dirs as $key => $dir) {
+ if ($dir == '.') {
+ $dirs[$key] = $dirPath;
+ } else {
+ $dir = rtrim($dir, '\\/');
+ $dirs[$key] = $dir . DIRECTORY_SEPARATOR . $dirPath;
+ }
+ }
+ }
+ $file = basename($path) . '.php';
+ } else {
+ $file = $class . '.php';
+ }
+
+ self::loadFile($file, $dirs, true);
+
+ if (!class_exists($class, false) && !interface_exists($class, false)) {
+ require_once 'Zend/Exception.php';
+ throw new Zend_Exception("File \"$file\" was loaded but class \"$class\" was not found in the file");
+ }
+ }
+
+ /**
+ * Loads a PHP file. This is a wrapper for PHP's include() function.
+ *
+ * $filename must be the complete filename, including any
+ * extension such as ".php". Note that a security check is performed that
+ * does not permit extended characters in the filename. This method is
+ * intended for loading Zend Framework files.
+ *
+ * If $dirs is a string or an array, it will search the directories
+ * in the order supplied, and attempt to load the first matching file.
+ *
+ * If the file was not found in the $dirs, or if no $dirs were specified,
+ * it will attempt to load it from PHP's include_path.
+ *
+ * If $once is TRUE, it will use include_once() instead of include().
+ *
+ * @param string $filename
+ * @param string|array $dirs - OPTIONAL either a path or array of paths
+ * to search.
+ * @param boolean $once
+ * @return boolean
+ * @throws Zend_Exception
+ */
+ public static function loadFile($filename, $dirs = null, $once = false)
+ {
+ /**
+ * Security check
+ */
+ if (preg_match('/[^a-z0-9\-_.]/i', $filename)) {
+ require_once 'Zend/Exception.php';
+ throw new Zend_Exception('Security check: Illegal character in filename');
+ }
+
+ /**
+ * Search for the file in each of the dirs named in $dirs.
+ */
+ if (is_null($dirs)) {
+ $dirs = array();
+ } elseif (is_string($dirs)) {
+ $dirs = explode(PATH_SEPARATOR, $dirs);
+ }
+ foreach ($dirs as $dir) {
+ $filespec = rtrim($dir, '\\/') . DIRECTORY_SEPARATOR . $filename;
+ if (self::isReadable($filespec)) {
+ return self::_includeFile($filespec, $once);
+ }
+ }
+
+ /**
+ * The file was not found in the $dirs specified.
+ * Try finding for the plain filename in the include_path.
+ */
+ if (self::isReadable($filename)) {
+ return self::_includeFile($filename, $once);
+ }
+
+ /**
+ * The file was not located anywhere.
+ */
+ require_once 'Zend/Exception.php';
+ throw new Zend_Exception("File \"$filename\" was not found");
+ }
+
+ /**
+ * Attempt to include() the file.
+ *
+ * include() is not prefixed with the @ operator because if
+ * the file is loaded and contains a parse error, execution
+ * will halt silently and this is difficult to debug.
+ *
+ * Always set display_errors = Off on production servers!
+ *
+ * @param string $filespec
+ * @param boolean $once
+ * @return boolean
+ */
+ protected static function _includeFile($filespec, $once = false)
+ {
+ if ($once) {
+ return include_once $filespec;
+ } else {
+ return include $filespec ;
+ }
+ }
+
+ /**
+ * Returns TRUE if the $filename is readable, or FALSE otherwise.
+ * This function uses the PHP include_path, where PHP's is_readable()
+ * does not.
+ *
+ * @param string $filename
+ * @return boolean
+ */
+ public static function isReadable($filename)
+ {
+ if (@is_readable($filename)) {
+ return true;
+ }
+
+ $path = get_include_path();
+ $dirs = explode(PATH_SEPARATOR, $path);
+
+ foreach ($dirs as $dir) {
+ // No need to check against current dir -- already checked
+ if ('.' == $dir) {
+ continue;
+ }
+
+ if (@is_readable($dir . DIRECTORY_SEPARATOR . $filename)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * spl_autoload() suitable implementation for supporting class autoloading.
+ *
+ * Attach to spl_autoload() using the following:
+ * <code>
+ * spl_autoload_register(array('Zend_Loader', 'autoload'));
+ * </code>
+ *
+ * @param string $class
+ * @return string|false Class name on success; false on failure
+ */
+ public static function autoload($class)
+ {
+ try {
+ self::loadClass($class);
+ return $class;
+ } catch (Exception $e) {
+ return false;
+ }
+ }
+
+ /**
+ * Register {@link autoload()} with spl_autoload()
+ *
+ * @param string OPTIONAL $class
+ * @return void
+ * @throws Zend_Exception if spl_autoload() is not found
+ * or if the specified class does not have an autoload() method.
+ */
+ public static function registerAutoload($class = 'Zend_Loader')
+ {
+ if (!function_exists('spl_autoload_register')) {
+ require_once 'Zend/Exception.php';
+ throw new Zend_Exception('spl_autoload does not exist in this PHP installation');
+ }
+
+ self::loadClass($class);
+ $methods = get_class_methods($class);
+ if (!in_array('autoload', (array) $methods)) {
+ require_once 'Zend/Exception.php';
+ throw new Zend_Exception("The class \"$class\" does not have an autoload() method");
+ }
+
+ spl_autoload_register(array($class, 'autoload'));
+ }
+}
diff --git a/libs/Zend/Locale.php b/libs/Zend/Locale.php
new file mode 100755
index 0000000000..ba25592dd6
--- /dev/null
+++ b/libs/Zend/Locale.php
@@ -0,0 +1,1172 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Locale
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Locale.php 5357 2007-06-16 19:56:21Z thomas $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Include needed Locale classes
+ */
+require_once 'Zend/Locale/Data.php';
+require_once 'Zend/Locale/Format.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Locale
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Locale {
+
+ // Class wide Locale Constants
+ private static $_LocaleData = array(
+ 'root' => '',
+ 'aa_DJ' => '',
+ 'aa_ER' => '',
+ 'aa_ET' => '',
+ 'aa' => '',
+ 'af_ZA' => 'iso-8859-1,windows-1252',
+ 'af' => 'iso-8859-1,windows-1252',
+ 'am_ET' => '',
+ 'am' => '',
+ 'ar_AE' => 'iso-8859-6,windows-1256',
+ 'ar_BH' => 'iso-8859-6,windows-1256',
+ 'ar_DZ' => 'iso-8859-6,windows-1256',
+ 'ar_EG' => 'iso-8859-6,windows-1256',
+ 'ar_IQ' => 'iso-8859-6,windows-1256',
+ 'ar_JO' => 'iso-8859-6,windows-1256',
+ 'ar_KW' => 'iso-8859-6,windows-1256',
+ 'ar_LB' => 'iso-8859-6,windows-1256',
+ 'ar_LY' => 'iso-8859-6,windows-1256',
+ 'ar_MA' => 'iso-8859-6,windows-1256',
+ 'ar_OM' => 'iso-8859-6,windows-1256',
+ 'ar_QA' => 'iso-8859-6,windows-1256',
+ 'ar_SA' => 'iso-8859-6,windows-1256',
+ 'ar_SD' => 'iso-8859-6,windows-1256',
+ 'ar_SY' => 'iso-8859-6,windows-1256',
+ 'ar_TN' => 'iso-8859-6,windows-1256',
+ 'ar_YE' => 'iso-8859-6,windows-1256',
+ 'ar' => 'iso-8859-6,windows-1256',
+ 'as_IN' => '',
+ 'as' => '',
+ 'az_AZ' => '',
+ 'az' => '',
+ 'be_BY' => 'iso-8859-5',
+ 'be' => 'iso-8859-5',
+ 'bg_BG' => 'iso-8859-5',
+ 'bg' => 'iso-8859-5',
+ 'bn_IN' => '',
+ 'bn' => '',
+ 'bs_BA' => '',
+ 'bs' => '',
+ 'byn_ER'=> '',
+ 'byn' => '',
+ 'ca_ES' => 'iso-8859-1,windows-1252',
+ 'ca' => 'iso-8859-1,windows-1252',
+ 'cs_CZ' => 'iso-8859-2',
+ 'cs' => 'iso-8859-2',
+ 'cy_GB' => '',
+ 'cy' => '',
+ 'da_DK' => 'iso-8859-1,windows-1252',
+ 'da' => 'iso-8859-1,windows-1252',
+ 'de_AT' => 'iso-8859-1,windows-1252',
+ 'de_BE' => 'iso-8859-1,windows-1252',
+ 'de_CH' => 'iso-8859-1,windows-1252',
+ 'de_DE' => 'iso-8859-1,windows-1252',
+ 'de_LI' => 'iso-8859-1,windows-1252',
+ 'de_LU' => 'iso-8859-1,windows-1252',
+ 'de' => 'iso-8859-1,windows-1252',
+ 'dv_MV' => '',
+ 'dv' => '',
+ 'dz_BT' => '',
+ 'dz' => '',
+ 'el_CY' => 'iso-8859-7',
+ 'el_GR' => 'iso-8859-7',
+ 'el' => 'iso-8859-7',
+ 'en_AS' => 'iso-8859-1,windows-1252',
+ 'en_AU' => 'iso-8859-1,windows-1252',
+ 'en_BE' => 'iso-8859-1,windows-1252',
+ 'en_BW' => 'iso-8859-1,windows-1252',
+ 'en_BZ' => 'iso-8859-1,windows-1252',
+ 'en_CA' => 'iso-8859-1,windows-1252',
+ 'en_GB' => 'iso-8859-1,windows-1252',
+ 'en_GU' => 'iso-8859-1,windows-1252',
+ 'en_HK' => 'iso-8859-1,windows-1252',
+ 'en_IE' => 'iso-8859-1,windows-1252',
+ 'en_IN' => 'iso-8859-1,windows-1252',
+ 'en_JM' => 'iso-8859-1,windows-1252',
+ 'en_MH' => 'iso-8859-1,windows-1252',
+ 'en_MP' => 'iso-8859-1,windows-1252',
+ 'en_MT' => 'iso-8859-1,windows-1252',
+ 'en_NZ' => 'iso-8859-1,windows-1252',
+ 'en_PH' => 'iso-8859-1,windows-1252',
+ 'en_PK' => 'iso-8859-1,windows-1252',
+ 'en_SG' => 'iso-8859-1,windows-1252',
+ 'en_TT' => 'iso-8859-1,windows-1252',
+ 'en_UM' => 'iso-8859-1,windows-1252',
+ 'en_US' => 'iso-8859-1,windows-1252',
+ 'en_VI' => 'iso-8859-1,windows-1252',
+ 'en_ZA' => 'iso-8859-1,windows-1252',
+ 'en_ZW' => 'iso-8859-1,windows-1252',
+ 'en' => 'iso-8859-1,windows-1252',
+ 'eo' => 'iso-8859-3',
+ 'es_AR' => 'iso-8859-1,windows-1252',
+ 'es_BO' => 'iso-8859-1,windows-1252',
+ 'es_CL' => 'iso-8859-1,windows-1252',
+ 'es_CO' => 'iso-8859-1,windows-1252',
+ 'es_CR' => 'iso-8859-1,windows-1252',
+ 'es_DO' => 'iso-8859-1,windows-1252',
+ 'es_EC' => 'iso-8859-1,windows-1252',
+ 'es_ES' => 'iso-8859-1,windows-1252',
+ 'es_GT' => 'iso-8859-1,windows-1252',
+ 'es_HN' => 'iso-8859-1,windows-1252',
+ 'es_MX' => 'iso-8859-1,windows-1252',
+ 'es_NI' => 'iso-8859-1,windows-1252',
+ 'es_PA' => 'iso-8859-1,windows-1252',
+ 'es_PE' => 'iso-8859-1,windows-1252',
+ 'es_PR' => 'iso-8859-1,windows-1252',
+ 'es_PY' => 'iso-8859-1,windows-1252',
+ 'es_SV' => 'iso-8859-1,windows-1252',
+ 'es_US' => 'iso-8859-1,windows-1252',
+ 'es_UY' => 'iso-8859-1,windows-1252',
+ 'es_VE' => 'iso-8859-1,windows-1252',
+ 'es' => 'iso-8859-1,windows-1252',
+ 'et_EE' => 'iso-8859-15',
+ 'et' => 'iso-8859-15',
+ 'eu_ES' => 'iso-8859-1,windows-1252',
+ 'eu' => 'iso-8859-1,windows-1252',
+ 'fa_AF' => '',
+ 'fa_IR' => '',
+ 'fa' => '',
+ 'fi_FI' => 'iso-8859-1,windows-1252',
+ 'fi' => 'iso-8859-1,windows-1252',
+ 'fo_FO' => 'iso-8859-1,windows-1252',
+ 'fo' => 'iso-8859-1,windows-1252',
+ 'fr_BE' => 'iso-8859-1,windows-1252',
+ 'fr_CA' => 'iso-8859-1,windows-1252',
+ 'fr_CH' => 'iso-8859-1,windows-1252',
+ 'fr_FR' => 'iso-8859-1,windows-1252',
+ 'fr_LU' => 'iso-8859-1,windows-1252',
+ 'fr_MC' => 'iso-8859-1,windows-1252',
+ 'fr' => 'iso-8859-1,windows-1252',
+ 'ga_IE' => 'iso-8859-1,windows-1252',
+ 'ga' => 'iso-8859-1,windows-1252',
+ 'gez_ER'=> '',
+ 'gez_ET'=> '',
+ 'gez' => '',
+ 'gl_ES' => 'iso-8859-1,windows-1252',
+ 'gl' => 'iso-8859-1,windows-1252',
+ 'gu_IN' => '',
+ 'gu' => '',
+ 'gv_GB' => '',
+ 'gv' => '',
+ 'haw_US'=> '',
+ 'haw' => '',
+ 'he_IL' => '',
+ 'he' => '',
+ 'hi_IN' => '',
+ 'hi' => '',
+ 'hr_HR' => 'iso-8859-2,windows-1250',
+ 'hr' => 'iso-8859-2,windows-1250',
+ 'hu_HU' => 'iso-8859-2',
+ 'hu' => 'iso-8859-2',
+ 'hy_AM' => '',
+ 'hy' => '',
+ 'id_ID' => '',
+ 'id' => '',
+ 'is_IS' => 'iso-8859-1,windows-1252',
+ 'is' => 'iso-8859-1,windows-1252',
+ 'it_CH' => 'iso-8859-1,windows-1252',
+ 'it_IT' => 'iso-8859-1,windows-1252',
+ 'it' => 'iso-8859-1,windows-1252',
+ 'iu' => '',
+ 'ja_JP' => 'shift_jis,iso-2022-jp,euc-jp',
+ 'ja' => 'shift_jis,iso-2022-jp,euc-jp',
+ 'ka_GE' => '',
+ 'ka' => '',
+ 'kk_KZ' => '',
+ 'kk' => '',
+ 'kl_GL' => '',
+ 'kl' => '',
+ 'km_KH' => '',
+ 'km' => '',
+ 'kn_IN' => '',
+ 'kn' => '',
+ 'ko_KR' => 'euc-kr',
+ 'ko' => 'euc-kr',
+ 'kok_IN'=> '',
+ 'kok' => '',
+ 'kw_GB' => '',
+ 'kw' => '',
+ 'ky_KG' => '',
+ 'ky' => '',
+ 'lo_LA' => '',
+ 'lo' => '',
+ 'lt_LT' => 'iso-8859-13,windows-1257',
+ 'lt' => 'iso-8859-13,windows-1257',
+ 'lv_LV' => 'iso-8859-13,windows-1257',
+ 'lv' => 'iso-8859-13,windows-1257',
+ 'mk_MK' => 'iso-8859-5,windows-1251',
+ 'mk' => 'iso-8859-5,windows-1251',
+ 'ml_IN' => '',
+ 'ml' => '',
+ 'mn_MN' => '',
+ 'mn' => '',
+ 'mr_IN' => '',
+ 'mr' => '',
+ 'ms_BN' => '',
+ 'ms_MY' => '',
+ 'ms' => '',
+ 'mt_MT' => 'iso-8859-3',
+ 'mt' => 'iso-8859-3',
+ 'nb_NO' => '',
+ 'nb' => '',
+ 'nl_BE' => 'iso-8859-1,windows-1252',
+ 'nl_NL' => 'iso-8859-1,windows-1252',
+ 'nl' => 'iso-8859-1,windows-1252',
+ 'no_NO' => 'iso-8859-1,windows-1252',
+ 'no' => 'iso-8859-1,windows-1252',
+ 'om_ET' => '',
+ 'om_KE' => '',
+ 'om' => '',
+ 'or_IN' => '',
+ 'or' => '',
+ 'pa_IN' => '',
+ 'pa' => '',
+ 'pl_PL' => 'iso-8859-2',
+ 'pl' => 'iso-8859-2',
+ 'ps_AF' => '',
+ 'ps' => '',
+ 'pt_BR' => 'iso-8859-1,windows-1252',
+ 'pt_PT' => 'iso-8859-1,windows-1252',
+ 'pt' => 'iso-8859-1,windows-1252',
+ 'ro_RO' => 'iso-8859-2',
+ 'ro' => 'iso-8859-2',
+ 'ru_RU' => 'koi8-r,iso-8859-5',
+ 'ru_UA' => 'koi8-r,iso-8859-5',
+ 'ru' => 'koi8-r,iso-8859-5',
+ 'sa_IN' => '',
+ 'sa' => '',
+ 'sh_BA' => '',
+ 'sh_CS' => '',
+ 'sh_YU' => '',
+ 'sh' => '',
+ 'sid_ET'=> '',
+ 'sid' => '',
+ 'sk_SK' => 'iso-8859-2',
+ 'sk' => 'iso-8859-2',
+ 'sl_SI' => 'iso-8859-2,windows-1250',
+ 'sl' => 'iso-8859-2,windows-1250',
+ 'so_DJ' => '',
+ 'so_ET' => '',
+ 'so_KE' => '',
+ 'so_SO' => '',
+ 'so' => '',
+ 'sq_AL' => 'iso-8859-1,windows-1252',
+ 'sq' => 'iso-8859-1,windows-1252',
+ 'sr_BA' => 'windows-1251,iso-8859-5,iso-8859-2,windows-1250',
+ 'sr_CS' => 'windows-1251,iso-8859-5,iso-8859-2,windows-1250',
+ 'sr_YU' => 'windows-1251,iso-8859-5,iso-8859-2,windows-1250',
+ 'sr' => 'windows-1251,iso-8859-5,iso-8859-2,windows-1250',
+ 'sv_FI' => 'iso-8859-1,windows-1252',
+ 'sv_SE' => 'iso-8859-1,windows-1252',
+ 'sv' => 'iso-8859-1,windows-1252',
+ 'sw_KE' => '',
+ 'sw_TZ' => '',
+ 'sw' => '',
+ 'syr_SY'=> '',
+ 'syr' => '',
+ 'ta_IN' => '',
+ 'ta' => '',
+ 'te_IN' => '',
+ 'te' => '',
+ 'th_TH' => '',
+ 'th' => '',
+ 'ti_ER' => '',
+ 'ti_ET' => '',
+ 'ti' => '',
+ 'tig_ER'=> '',
+ 'tig' => '',
+ 'tr_TR' => 'iso-8859-9,windows-1254',
+ 'tr' => 'iso-8859-9,windows-1254',
+ 'tt_RU' => '',
+ 'tt' => '',
+ 'uk_UA' => 'iso-8859-5',
+ 'uk' => 'iso-8859-5',
+ 'ur_PK' => '',
+ 'ur' => '',
+ 'uz_AF' => '',
+ 'uz_UZ' => '',
+ 'uz' => '',
+ 'vi_VN' => '',
+ 'vi' => '',
+ 'wal_ET'=> '',
+ 'wal' => '',
+ 'zh_CN' => '',
+ 'zh_HK' => '',
+ 'zh_MO' => '',
+ 'zh_SG' => '',
+ 'zh_TW' => '',
+ 'zh' => ''
+ );
+
+
+ /**
+ *
+ */
+ private static $_LocaleTranslation = array(
+ 'Australia' => 'AU',
+ 'Austria' => 'AT',
+ 'Belgium' => 'BE',
+ 'Brazil' => 'BR',
+ 'Canada' => 'CA',
+ 'China' => 'CN',
+ 'Czech Republic' => 'CZ',
+ 'Denmark' => 'DK',
+ 'Finland' => 'FI',
+ 'France' => 'FR',
+ 'Germany' => 'DE',
+ 'Greece' => 'GR',
+ 'Hong Kong SAR' => 'HK',
+ 'Hungary' => 'HU',
+ 'Iceland' => 'IS',
+ 'Ireland' => 'IE',
+ 'Italy' => 'IT',
+ 'Japan' => 'JP',
+ 'Korea' => 'KP',
+ 'Mexiko' => 'MX',
+ 'The Netherlands' => 'NL',
+ 'New Zealand' => 'NZ',
+ 'Norway' => 'NO',
+ 'Poland' => 'PL',
+ 'Portugal' => 'PT',
+ 'Russia' => 'RU',
+ 'Singapore' => 'SG',
+ 'Slovakia' => 'SK',
+ 'Spain' => 'ES',
+ 'Sweden' => 'SE',
+ 'Taiwan' => 'TW',
+ 'Turkey' => 'TR',
+ 'United Kingdom' => 'GB',
+ 'United States' => 'US',
+
+ 'Chinese' => 'zh',
+ 'Czech' => 'cs',
+ 'Danish' => 'da',
+ 'Dutch' => 'nl',
+ 'English' => 'en',
+ 'Finnish' => 'fi',
+ 'French' => 'fr',
+ 'German' => 'de',
+ 'Greek' => 'el',
+ 'Hungarian' => 'hu',
+ 'Icelandic' => 'is',
+ 'Italian' => 'it',
+ 'Japanese' => 'ja',
+ 'Korean' => 'ko',
+ 'Norwegian' => 'no',
+ 'Polish' => 'pl',
+ 'Portuguese' => 'pt',
+ 'Russian' => 'ru',
+ 'Slovak' => 'sk',
+ 'Spanish' => 'es',
+ 'Swedish' => 'sv',
+ 'Turkish' => 'tr'
+ );
+
+
+ /**
+ * Autosearch constants
+ */
+ const BROWSER = 1;
+ const ENVIRONMENT = 2;
+ const FRAMEWORK = 3;
+
+
+ /**
+ * Actual set locale
+ */
+ private $_Locale;
+
+
+ /**
+ * Actual set Codeset
+ */
+ private $_Codeset;
+
+
+ /**
+ * Generates a locale object
+ * If no locale is given a automatic search is done
+ * Then the most probable locale will be automatically set
+ * Search order is
+ * 1. Given Locale
+ * 2. HTTP Client
+ * 3. Server Environment
+ * 4. Framework Standard
+ *
+ * @param string $locale OPTIONAL locale for parsing input
+ * @return object
+ */
+ public function __construct($locale = null)
+ {
+ if ($locale instanceof Zend_Locale) {
+ $locale = $locale->toString();
+ }
+ $this->setLocale($locale);
+ }
+
+
+ /**
+ * Serialization Interface
+ *
+ * @return string
+ */
+ public function serialize()
+ {
+ return serialize($this);
+ }
+
+
+ /**
+ * Returns a string representation of the object
+ *
+ * @return string
+ */
+ public function toString()
+ {
+ return (string) $this->_Locale;
+ }
+
+
+ /**
+ * Returns a string representation of the object
+ * Alias for toString
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->toString();
+ }
+
+
+ /**
+ * Search the locale automatically and return all used locales
+ * ordered by quality
+ *
+ * Standard Searchorder is
+ * - getBrowser
+ * - getEnvironment
+ * @todo - getFramework
+ *
+ * @param $searchorder - OPTIONAL searchorder
+ * @param $fastsearch - OPTIONAL returnes the first found locale array when true
+ * otherwise all found default locales will be returned
+ * @return locale - returns an array of all the mosta locale string
+ */
+ public function getDefault($searchorder = null, $fastsearch = null)
+ {
+ $languages = array();
+ if ($searchorder == self::ENVIRONMENT) {
+
+ $languages = $this->getEnvironment();
+ if (empty($languages) or !$fastsearch) {
+ $languages = array_merge($languages, $this->getFramework());
+ }
+ if (empty($languages) or !$fastsearch) {
+ $languages = array_merge($languages, $this->getBrowser());
+ }
+
+ } else if ($searchorder == self::FRAMEWORK) {
+
+ $languages = $this->getFramework();
+ if (empty($languages) or !$fastsearch) {
+ $languages = array_merge($languages, $this->getEnvironment());
+ }
+ if (empty($languages) or !$fastsearch) {
+ $languages = array_merge($languages, $this->getBrowser());
+ }
+
+ } else {
+
+ $languages = $this->getBrowser();
+ if (empty($languages) or !$fastsearch) {
+ $languages = array_merge($languages, $this->getEnvironment());
+ }
+ if (empty($languages) or !$fastsearch) {
+ $languages = array_merge($languages, $this->getFramework());
+ }
+
+ }
+ return $languages;
+ }
+
+
+ /**
+ * Expects the Systems standard locale
+ *
+ * For Windows:
+ * f.e.: LC_COLLATE=C;LC_CTYPE=German_Austria.1252;LC_MONETARY=C
+ * would be recognised as de_AT
+ *
+ * @return array
+ */
+ public function getEnvironment()
+ {
+ $language = setlocale(LC_ALL, 0);
+ $languages = explode(';', $language);
+ $languagearray = array();
+
+ foreach ($languages as $locale)
+ {
+
+ $language = substr($locale, strpos($locale, '='));
+ if ($language != '=C') {
+
+ $language = substr($language, 1, strpos($language, '.') - 1);
+ $splitted = explode('_', $language);
+ if (!empty(Zend_Locale::$_LocaleData[$language])) {
+ $languagearray[$language] = 1;
+ if (strlen($language) > 4) {
+ $languagearray[substr($language, 0, 2)] = 1;
+ }
+ continue;
+ }
+
+ if (!empty(Zend_Locale::$_LocaleTranslation[$splitted[0]])) {
+ if (!empty(Zend_Locale::$_LocaleTranslation[$splitted[1]])) {
+ $languagearray[Zend_Locale::$_LocaleTranslation[$splitted[0]] . '_'
+ . Zend_Locale::$_LocaleTranslation[$splitted[1]]] = 1;
+ }
+ $languagearray[Zend_Locale::$_LocaleTranslation[$splitted[0]]] = 1;
+ }
+ }
+ }
+ return $languagearray;
+ }
+
+ /**
+ * Return an array of all accepted languages of the client
+ * Expects RFC compilant Header !!
+ *
+ * The notation can be :
+ * de,en-UK-US;q=0.5,fr-FR;q=0.2
+ *
+ * @return array - list of accepted languages including quality
+ */
+ public function getBrowser()
+ {
+ $httplanguages = getenv("HTTP_ACCEPT_LANGUAGE");
+
+ $languages = array();
+ if (empty($httplanguages)) {
+ return $languages;
+ }
+
+ $accepted = preg_split('/,\s*/', $httplanguages);
+
+ foreach ($accepted as $accept) {
+ $result = preg_match('/^([a-z]{1,8}(?:[-_][a-z]{1,8})*)(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i',
+ $accept, $match);
+
+ if (!$result) {
+ continue;
+ }
+
+ if (isset($match[2])) {
+ $quality = (float) $match[2];
+ } else {
+ $quality = 1.0;
+ }
+
+ $countrys = explode('-', $match[1]);
+ $region = array_shift($countrys);
+
+ $country2 = explode('_', $region);
+ $region = array_shift($country2);
+
+ foreach($countrys as $country) {
+ $languages[$region . '_' . strtoupper($country)] = $quality;
+ }
+ foreach($country2 as $country) {
+ $languages[$region . '_' . strtoupper($country)] = $quality;
+ }
+ $languages[$region] = $quality;
+ }
+ return $languages;
+ }
+
+
+ /**
+ * Returns the locale which the framework is set to
+ */
+ public function getFramework()
+ {
+ $languages = array();
+ return $languages;
+ }
+
+
+ /**
+ * Sets a new locale
+ *
+ * @param mixed $locale OPTIONAL new locale to set
+ */
+ public function setLocale($locale = null)
+ {
+ if (($locale == self::BROWSER) or ($locale == self::ENVIRONMENT) or ($locale === null)) {
+ $locale = $this->getDefault($locale, true);
+ }
+
+ if (is_array($locale)) {
+ $locale = key($locale);
+ }
+
+ if (!isset(Zend_Locale::$_LocaleData[$locale])) {
+ $region = substr($locale, 0, 3);
+ if (isset($region[2])) {
+ if (($region[2] == '_') or ($region[2] == '-')) {
+ $region = substr($region, 0, 2);
+ }
+ }
+ if (isset(Zend_Locale::$_LocaleData[$region])) {
+ $this->_Locale = $region;
+ } else {
+ $this->_Locale = 'root';
+ }
+
+ } else {
+ $this->_Locale = $locale;
+ }
+ }
+
+
+ /**
+ * Returns the language part of the locale
+ *
+ * @return language
+ */
+ public function getLanguage()
+ {
+ $locale = explode('_', $this->_Locale);
+ return $locale[0];
+ }
+
+
+ /**
+ * Returns the region part of the locale if avaiable
+ *
+ * @return region
+ */
+ public function getRegion()
+ {
+ $locale = explode('_', $this->_Locale);
+ if (isset($locale[1])) {
+ return $locale[1];
+ }
+
+ return false;
+ }
+
+
+ /**
+ * Return the accepted charset of the client
+ * @todo verify working
+ */
+ public function getHttpCharset()
+ {
+ $httpcharsets = getenv("HTTP_ACCEPT_CHARSET");
+
+ $charsets = array();
+ if ($httpcharsets === false) {
+ return $charsets;
+ }
+
+ $accepted = preg_split('/,\s*/', $httpcharsets);
+ foreach ($accepted as $accept)
+ {
+ if (empty($accept)) {
+ continue;
+ }
+
+ if (strpos($accept, ';'))
+ {
+ $quality = (float) substr($accept, strpos($accept, '=') + 1);
+ $charsets[substr($accept, 0, strpos($accept, ';'))] = $quality;
+ } else {
+ $quality = 1.0;
+ $charsets[$accept] = $quality;
+ }
+
+ }
+
+ return $charsets;
+ }
+
+
+ /**
+ * Returns true if both locales are equal
+ *
+ * @return boolean
+ */
+ public function equals($object)
+ {
+ if ($object->toString() == $this->toString()) {
+ return true;
+ }
+
+ return false;
+ }
+
+
+ /**
+ * Returns localized informations as array, supported are several
+ * types of informations.
+ * Supported types are:
+ * 'language', 'script', 'country', 'territory', 'calendar', 'month', 'month_short',
+ * 'month_narrow', 'day', 'day_short', 'day_narrow', 'dateformat', 'timeformat',
+ * 'timezone', 'currency', 'currency_sign', 'currency_detail', 'territory_detail'
+ * 'language_detail', 'characters'
+ * For detailed information about the types look into the documentation
+ *
+ * @param string $type OPTIONAL Type of information to return
+ * @param string|locale $locale OPTIONAL Locale|Language for which this informations should be returned
+ * @return array Array with the wished information in the given language
+ */
+ public function getTranslationList($type = null, $locale = null)
+ {
+ if ($locale === null) {
+ $locale = $this->_Locale;
+ }
+
+ switch (strtolower($type)) {
+ case 'language' :
+ return Zend_Locale_Data::getContent($locale, 'languagelist');
+ break;
+ case 'script' :
+ return Zend_Locale_Data::getContent($locale, 'scriptlist');
+ break;
+ case 'country' :
+ $list = Zend_Locale_Data::getContent($locale, 'territorylist');
+ foreach ($list as $key => $entry) {
+ if (is_numeric($key) or ($key == "QO")) {
+ unset($list[$key]);
+ }
+ }
+ return $list;
+ break;
+ case 'territory' :
+ $list = Zend_Locale_Data::getContent($locale, 'territorylist');
+ foreach ($list as $key => $entry) {
+ if (!is_numeric($key) and ($key != "QO")) {
+ unset($list[$key]);
+ }
+ }
+ return $list;
+ break;
+ case 'calendar' :
+ return Zend_Locale_Data::getContent($locale, 'type', 'calendar');
+ break;
+ case 'month' :
+ return Zend_Locale_Data::getContent($locale, 'monthlist', array('gregorian', 'format', 'wide'));
+ break;
+ case 'month_short' :
+ return Zend_Locale_Data::getContent($locale, 'monthlist', array('gregorian', 'format', 'abbreviated'));
+ break;
+ case 'month_narrow' :
+ return Zend_Locale_Data::getContent($locale, 'monthlist', array('gregorian', 'stand-alone', 'narrow'));
+ break;
+ case 'day' :
+ return Zend_Locale_Data::getContent($locale, 'daylist', array('gregorian', 'format', 'wide'));
+ break;
+ case 'day_short' :
+ return Zend_Locale_Data::getContent($locale, 'daylist', array('gregorian', 'format', 'abbreviated'));
+ break;
+ case 'day_narrow' :
+ return Zend_Locale_Data::getContent($locale, 'daylist', array('gregorian', 'stand-alone', 'narrow'));
+ break;
+ case 'dateformat' :
+ $result = Zend_Locale_Data::getContent($locale, 'defdateformat', 'gregorian');
+ $result = Zend_Locale_Data::getContent($locale, 'dateformat', array('gregorian', $result['default'], 'narrow'));
+ $list['default'] = $result['pattern'];
+ $result = Zend_Locale_Data::getContent($locale, 'dateformat', array('gregorian', 'full', 'narrow'));
+ $list['full'] = $result['pattern'];
+ $result = Zend_Locale_Data::getContent($locale, 'dateformat', array('gregorian', 'long', 'narrow'));
+ $list['long'] = $result['pattern'];
+ $result = Zend_Locale_Data::getContent($locale, 'dateformat', array('gregorian', 'medium', 'narrow'));
+ $list['medium'] = $result['pattern'];
+ $result = Zend_Locale_Data::getContent($locale, 'dateformat', array('gregorian', 'short', 'narrow'));
+ $list['short'] = $result['pattern'];
+ return $list;
+ break;
+ case 'timeformat' :
+ $result = Zend_Locale_Data::getContent($locale, 'deftimeformat', 'gregorian');
+ $result = Zend_Locale_Data::getContent($locale, 'timeformat', array('gregorian', $result['default'], 'narrow'));
+ $list['default'] = $result['pattern'];
+ $result = Zend_Locale_Data::getContent($locale, 'timeformat', array('gregorian', 'full', 'narrow'));
+ $list['full'] = $result['pattern'];
+ $result = Zend_Locale_Data::getContent($locale, 'timeformat', array('gregorian', 'long', 'narrow'));
+ $list['long'] = $result['pattern'];
+ $result = Zend_Locale_Data::getContent($locale, 'timeformat', array('gregorian', 'medium', 'narrow'));
+ $list['medium'] = $result['pattern'];
+ $result = Zend_Locale_Data::getContent($locale, 'timeformat', array('gregorian', 'short', 'narrow'));
+ $list['short'] = $result['pattern'];
+ return $list;
+ break;
+ case 'timezone' :
+ return Zend_Locale_Data::getContent($locale, 'timezones');
+ break;
+ case 'currency' :
+ return Zend_Locale_Data::getContent($locale, 'currencynames');
+ break;
+ case 'currency_sign' :
+ return Zend_Locale_Data::getContent($locale, 'currencysymbols');
+ break;
+ case 'currency_detail' :
+ return Zend_Locale_Data::getContent($locale, 'currencyforregionlist');
+ break;
+ case 'territory_detail' :
+ return Zend_Locale_Data::getContent($locale, 'regionforterritorylist');
+ break;
+ case 'language_detail' :
+ return Zend_Locale_Data::getContent($locale, 'territoryforlanguagelist');
+ break;
+ case 'characters' :
+ return Zend_Locale_Data::getContent($locale, 'characters');
+ break;
+ default :
+ return array('language', 'script', 'country', 'territory', 'calendar', 'month', 'month_short',
+ 'month_narrow', 'day', 'day_short', 'day_narrow', 'dateformat', 'timeformat',
+ 'timezone', 'currency', 'currency_sign', 'currency_detail', 'territory_detail',
+ 'language_detail', 'characters');
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns an array with the name of all languages translated to the given language
+ *
+ * @param string $locale OPTIONAL locale for language translation
+ * @return array
+ */
+ public function getLanguageTranslationList($locale = null)
+ {
+ return $this->getTranslationList('language', $locale);
+ }
+
+
+ /**
+ * Returns an array with the name of all scripts translated to the given language
+ *
+ * @param string $locale OPTIONAL locale for script translation
+ * @return array
+ */
+ public function getScriptTranslationList($locale = null)
+ {
+ return $this->getTranslationList('script', $locale);
+ }
+
+
+ /**
+ * Returns an array with the name of all countries translated to the given language
+ *
+ * @param string $locale OPTIONAL locale for country translation
+ * @return array
+ */
+ public function getCountryTranslationList($locale = null)
+ {
+ return $this->getTranslationList('country', $locale);
+ }
+
+
+ /**
+ * Returns an array with the name of all territories translated to the given language
+ * All territories contains other countries.
+ *
+ * @param string $locale OPTIONAL locale for territory translation
+ * @return array
+ */
+ public function getTerritoryTranslationList($locale = null)
+ {
+ return $this->getTranslationList('territory', $locale);
+ }
+
+
+ /**
+ * Returns a localized information string, supported are several types of informations.
+ *
+ * Supported types are:
+ * 'language', 'script', 'country', 'territory', 'calendar', 'month', 'month_short',
+ * 'month_narrow', 'day', 'day_short', 'day_narrow', 'dateformat', 'timeformat',
+ * 'timezone', 'currency', 'currency_sign', 'currency_detail', 'territory_detail', 'language_detail', 'characters'
+ * For detailed information about the types look into the documentation
+ *
+ * @param string $what Name to get detailed information about
+ * @param string $type OPTIONAL Type of information to return
+ * @param string|locale $locale OPTIONAL Locale|Language for which this informations should be returned
+ * @return string|array Array with the wished information in the given language
+ */
+ public function getTranslation($what, $type = null, $locale = null)
+ {
+ if ($locale === null) {
+ $locale = $this->_Locale;
+ }
+
+ switch (strtolower($type)) {
+ case 'language' :
+ $list = Zend_Locale_Data::getContent($locale, 'language', $what);
+ if (isset($list[$what])) {
+ return $list[$what];
+ }
+ break;
+ case 'script' :
+ $list = Zend_Locale_Data::getContent($locale, 'script', $what);
+ if (isset($list[$what])) {
+ return $list[$what];
+ }
+ break;
+ case 'country' :
+ $list = Zend_Locale_Data::getContent($locale, 'territory', $what);
+ if (isset($list[$what])) {
+ return $list[$what];
+ }
+ break;
+ case 'territory' :
+ $list = Zend_Locale_Data::getContent($locale, 'territory', $what);
+ if (isset($list[$what])) {
+ return $list[$what];
+ }
+ break;
+ case 'calendar' :
+ $list = Zend_Locale_Data::getContent($locale, 'type', $what);
+ if (isset($list[$what])) {
+ return $list[$what];
+ }
+ break;
+ case 'month' :
+ $list = Zend_Locale_Data::getContent($locale, 'month', array('gregorian', 'format', 'wide', $what));
+ if (isset($list[$what])) {
+ return $list[$what];
+ }
+ break;
+ case 'month_short' :
+ $list = Zend_Locale_Data::getContent($locale, 'month', array('gregorian', 'format', 'abbreviated', $what));
+ if (isset($list[$what])) {
+ return $list[$what];
+ }
+ break;
+ case 'month_narrow' :
+ $list = Zend_Locale_Data::getContent($locale, 'month', array('gregorian', 'stand-alone', 'narrow', $what));
+ if (isset($list[$what])) {
+ return $list[$what];
+ }
+ break;
+ case 'day' :
+ $list = Zend_Locale_Data::getContent($locale, 'day', array('gregorian', 'format', 'wide', $what));
+ if (isset($list[$what])) {
+ return $list[$what];
+ }
+ break;
+ case 'day_short' :
+ $list = Zend_Locale_Data::getContent($locale, 'day', array('gregorian', 'format', 'abbreviated', $what));
+ if (isset($list[$what])) {
+ return $list[$what];
+ }
+ break;
+ case 'day_narrow' :
+ $list = Zend_Locale_Data::getContent($locale, 'day', array('gregorian', 'stand-alone', 'narrow', $what));
+ if (isset($list[$what])) {
+ return $list[$what];
+ }
+ break;
+ case 'dateformat' :
+ $list = Zend_Locale_Data::getContent($locale, 'dateformat', array('gregorian', $what, 'narrow'));
+ if (isset($list['pattern'])) {
+ return $list['pattern'];
+ }
+ break;
+ case 'timeformat' :
+ $list = Zend_Locale_Data::getContent($locale, 'timeformat', array('gregorian', $what, 'narrow'));
+ if (isset($list['pattern'])) {
+ return $list['pattern'];
+ }
+ break;
+ case 'timezone' :
+ $list = Zend_Locale_Data::getContent($locale, 'timezone', $what);
+ if (isset($list[$what])) {
+ return $list[$what];
+ }
+ break;
+ case 'currency' :
+ $list = Zend_Locale_Data::getContent($locale, 'currencyname', $what);
+ if (isset($list[$what])) {
+ return $list[$what];
+ }
+ break;
+ case 'currency_sign' :
+ $list = Zend_Locale_Data::getContent($locale, 'currencysymbol', $what);
+ if (isset($list[$what])) {
+ return $list[$what];
+ }
+ break;
+ case 'currency_detail' :
+ $list = Zend_Locale_Data::getContent($locale, 'currencyforregion', $what);
+ if (!empty($list)) {
+ return $list;
+ }
+ break;
+ case 'territory_detail' :
+ $list = Zend_Locale_Data::getContent($locale, 'regionforterritory', $what);
+ if (isset($list[$what])) {
+ return explode(' ', $list[$what]);
+ }
+ break;
+ case 'language_detail' :
+ $list = Zend_Locale_Data::getContent($locale, 'territoryforlanguage', $what);
+ if (isset($list[$what])) {
+ return explode(' ', $list[$what]);
+ }
+ break;
+ case 'characters' :
+ $list = Zend_Locale_Data::getContent($locale, 'characters');
+ return $list[0];
+ break;
+ default :
+ return array('language', 'script', 'country', 'territory', 'calendar', 'month', 'month_short',
+ 'month_narrow', 'day', 'day_short', 'day_narrow', 'dateformat', 'timeformat',
+ 'timezone', 'currency', 'currency_sign', 'currency_detail', 'territory_detail',
+ 'language_detail', 'characters');
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns the localized language name
+ *
+ * @param string $what Name to get detailed information about
+ * @param string $locale OPTIONAL locale for language translation
+ * @return array
+ */
+ public function getLanguageTranslation($what, $locale = null)
+ {
+ return $this->getTranslation($what, 'language', $locale);
+ }
+
+
+ /**
+ * Returns the localized script name
+ *
+ * @param string $what Name to get detailed information about
+ * @param string $locale OPTIONAL locale for script translation
+ * @return array
+ */
+ public function getScriptTranslation($what, $locale = null)
+ {
+ return $this->getTranslation($what, 'script', $locale);
+ }
+
+
+ /**
+ * Returns the localized country name
+ *
+ * @param string $what Name to get detailed information about
+ * @param string $locale OPTIONAL locale for country translation
+ * @return array
+ */
+ public function getCountryTranslation($what, $locale = null)
+ {
+ return $this->getTranslation($what, 'country', $locale);
+ }
+
+
+ /**
+ * Returns the localized territory name
+ * All territories contains other countries.
+ *
+ * @param string $what Name to get detailed information about
+ * @param string $locale OPTIONAL locale for territory translation
+ * @return array
+ */
+ public function getTerritoryTranslation($what, $locale = null)
+ {
+ return $this->getTranslation($what, 'territory', $locale);
+ }
+
+
+ /**
+ * Returns an array with translated yes strings
+ *
+ * @param string $locale OPTIONAL locale for language translation (defaults to $this locale)
+ * @return array
+ */
+ public function getQuestion($locale = null)
+ {
+ if ($locale === null) {
+ $locale = $this->_Locale;
+ }
+
+ $quest = Zend_Locale_Data::getContent($locale, 'questionstrings');
+ $yes = explode(':', $quest['yes']);
+ $no = explode(':', $quest['no']);
+ $quest['yes'] = $yes[0];
+ $quest['yesabbr'] = $yes[1];
+ $quest['no'] = $no[0];
+ $quest['noabbr'] = $no[1];
+
+ return $quest;
+ }
+
+
+ /**
+ * Checks if a locale identifier is a real locale or not
+ * Examples:
+ * "en_XX" refers to "en", which returns true
+ * "XX_yy" refers to "root", which returns false
+ *
+ * @param string|Zend_Locale $locale Locale to check for
+ * @param boolean $create If true, create a default locale, if $locale is empty
+ * @return false|string false if given locale is not a locale, else the locale identifier is returned
+ */
+ public static function isLocale($locale, $create = false)
+ {
+ if (empty($locale) and ($create === true)) {
+ $locale = new Zend_Locale();
+ }
+ if ($locale instanceof Zend_Locale) {
+ return $locale->toString();
+ }
+ if (!is_string($locale)) {
+ return false;
+ }
+
+ if (array_key_exists($locale, self::$_LocaleData)) {
+ return $locale;
+ } else {
+ $locale = explode('_', $locale);
+ if (array_key_exists($locale[0], self::$_LocaleData)) {
+ return $locale[0];
+ }
+ }
+ return false;
+ }
+}
diff --git a/libs/Zend/Locale/Data.php b/libs/Zend/Locale/Data.php
new file mode 100755
index 0000000000..3db53bc764
--- /dev/null
+++ b/libs/Zend/Locale/Data.php
@@ -0,0 +1,741 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Locale
+ * @subpackage Data
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Data.php 4521 2007-04-17 09:41:35Z thomas $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * include needed classes
+ */
+require_once 'Zend/Locale.php';
+require_once 'Zend/Locale/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Locale
+ * @subpackage Data
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Locale_Data
+{
+ /**
+ * locale files
+ *
+ * @var ressource
+ * @access private
+ */
+ private static $_ldml = array();
+
+
+ /**
+ * list of values which are collected
+ *
+ * @var array
+ * @access private
+ */
+ private static $_list = array();
+
+
+ /**
+ * Read the content from locale
+ *
+ * Can be called like:
+ * <ldml>
+ * <delimiter>test</delimiter>
+ * <second type='myone'>content</second>
+ * <second type='mysecond'>content2</second>
+ * <third type='mythird' />
+ * </ldml>
+ *
+ * Case 1: _readFile('ar','/ldml/delimiter') -> returns [] = test
+ * Case 1: _readFile('ar','/ldml/second[@type=myone]') -> returns [] = content
+ * Case 2: _readFile('ar','/ldml/second','type') -> returns [myone] = content; [mysecond] = content2
+ * Case 3: _readFile('ar','/ldml/delimiter',,'right') -> returns [right] = test
+ * Case 4: _readFile('ar','/ldml/third','type','myone') -> returns [myone] = mythird
+ *
+ * @param string $locale
+ * @param string $path
+ * @param string $attribute
+ * @param string $value
+ * @access private
+ */
+ private static function _readFile($locale, $path, $attribute, $value)
+ {
+
+ // ohne attribute - alle Werte auslesen
+ // mit attribute - nur diesen Wert auslesen
+ if (!empty(self::$_ldml[(string) $locale])) {
+
+ $result = self::$_ldml[(string) $locale]->xpath($path);
+ if (!empty($result)) {
+ foreach ($result as &$found) {
+
+ if (empty($value)) {
+
+ if (empty($attribute)) {
+ // Case 1
+ self::$_list[] = (string) $found;
+ } else if (empty(self::$_list[(string) $found[$attribute]])){
+ // Case 2
+ self::$_list[(string) $found[$attribute]] = (string) $found;
+ }
+
+ } else if (empty (self::$_list[$value])) {
+
+ if (empty($attribute)) {
+ // Case 3
+ self::$_list[$value] = (string) $found;
+ } else {
+ // Case 4
+ self::$_list[$value] = (string) $found[$attribute];
+ }
+
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Find possible routing to other path or locale
+ *
+ * @param string $locale
+ * @param string $path
+ * @param string $attribute
+ * @param string $value
+ * @throws Zend_Locale_Exception
+ * @access private
+ */
+ private static function _findRoute($locale, $path, $attribute, $value)
+ {
+ // load locale file if not already in cache
+ // needed for alias tag when referring to other locale
+ if (empty(self::$_ldml[(string) $locale])) {
+ $filename = dirname(__FILE__) . '/Data/' . $locale . '.xml';
+ if (!file_exists($filename)) {
+ throw new Zend_Locale_Exception("Missing locale file '$filename' for '$locale' locale.");
+ }
+
+ self::$_ldml[(string) $locale] = simplexml_load_file($filename);
+ }
+
+ // search for 'alias' tag in the search path for redirection
+ $search = '';
+ $tok = strtok($path, '/');
+
+ // parse the complete path
+ if (!empty(self::$_ldml[(string) $locale])) {
+ while ($tok !== false) {
+ $search = $search . '/' . $tok;
+ if ((strpos($tok, '[@') !== false) and (strpos($tok, ']') === false)) {
+ $tok = strtok('/');
+ continue;
+ }
+ $result = self::$_ldml[(string) $locale]->xpath($search . '/alias');
+
+ // alias found
+ if (!empty($result)) {
+
+ $source = $result[0]['source'];
+ $newpath = $result[0]['path'];
+
+ // new path - path //ldml is to ignore
+ if ($newpath != '//ldml') {
+ // other path - parse to make real path
+
+ while (substr($newpath,0,3) == '../') {
+ $newpath = substr($newpath, 3);
+ $search = substr($search, 0, strrpos($search, '/'));
+ }
+
+ // truncate ../ to realpath otherwise problems with alias
+ $path = $search . '/' . $newpath;
+ while (($tok = strtok('/'))!== false) {
+ $path = $path . '/' . $tok;
+ }
+ }
+
+ // reroute to other locale
+ if ($source != 'locale') {
+ $locale = $source;
+ }
+
+ self::_getFile($locale, $path, $attribute, $value);
+ return false;
+ }
+
+ $tok = strtok('/');
+ }
+ }
+ return true;
+ }
+
+
+ /**
+ * Read the right LDML file
+ *
+ * @param string $locale
+ * @param string $path
+ * @param string $attribute
+ * @param string $value
+ * @access private
+ */
+ private static function _getFile($locale, $path, $attribute = false, $value = false)
+ {
+ $result = self::_findRoute($locale, $path, $attribute, $value);
+ if ($result) {
+ self::_readFile($locale, $path, $attribute, $value);
+ }
+
+ // parse required locales reversive
+ // example: when given zh_Hans_CN
+ // 1. -> zh_Hans_CN
+ // 2. -> zh_Hans
+ // 3. -> zh
+ // 4. -> root
+ if (($locale != 'root') && ($result)) {
+ $locale = substr($locale, 0, -strlen(strrchr($locale, '_')));
+ if (!empty($locale)) {
+ self::_getFile($locale, $path, $attribute, $value);
+ } else {
+ self::_getFile('root', $path, $attribute, $value);
+ }
+ }
+ }
+
+
+ /**
+ * Read the LDML file, get a single path defined value
+ *
+ * @param string $locale
+ * @param string $path
+ * @param string $value
+ * @return array of string
+ * @access public
+ */
+ public static function getContent($locale, $path, $value = false)
+ {
+ self::$_list = array();
+
+ if (empty($locale)) {
+ $locale = new Zend_Locale();
+ }
+
+ if (!Zend_Locale::isLocale($locale)) {
+ throw new Zend_Locale_Exception("Locale ($locale) is a unknown locale");
+ }
+
+ if ($locale instanceof Zend_Locale) {
+ $locale = $locale->toString();
+ }
+
+ switch(strtolower($path)) {
+ case 'languagelist':
+ self::_getFile($locale, '/ldml/localeDisplayNames/languages/language', 'type');
+ break;
+
+ case 'language':
+ self::_getFile($locale, '/ldml/localeDisplayNames/languages/language[@type=\''
+ . $value . '\']', 'type');
+ break;
+
+ case 'scriptlist':
+ self::_getFile($locale, '/ldml/localeDisplayNames/scripts/script', 'type');
+ break;
+
+ case 'script':
+ self::_getFile($locale, '/ldml/localeDisplayNames/scripts/script[@type=\''
+ . $value . '\']', 'type');
+ break;
+
+ case 'territorylist':
+ self::_getFile($locale, '/ldml/localeDisplayNames/territories/territory', 'type');
+ break;
+
+ case 'territory':
+ self::_getFile($locale, '/ldml/localeDisplayNames/territories/territory[@type=\''
+ . $value . '\']', 'type');
+ break;
+
+ case 'variantlist':
+ self::_getFile($locale, '/ldml/localeDisplayNames/variants/variant', 'type');
+ break;
+
+ case 'variant':
+ self::_getFile($locale, '/ldml/localeDisplayNames/variants/variant[@type=\''
+ . $value . '\']', 'type');
+ break;
+
+ case 'keylist':
+ self::_getFile($locale, '/ldml/localeDisplayNames/keys/key', 'type');
+ break;
+
+ case 'key':
+ self::_getFile($locale, '/ldml/localeDisplayNames/keys/key[@type=\''
+ . $value . '\']', 'type');
+ break;
+
+ case 'typelist':
+ self::_getFile($locale, '/ldml/localeDisplayNames/types/type', 'type');
+ break;
+
+ case 'type':
+ if (($value == 'calendar') or
+ ($value == 'collation') or
+ ($value == 'currency')) {
+ self::_getFile($locale, '/ldml/localeDisplayNames/types/type[@key=\''
+ . $value . '\']', 'type');
+ } else {
+ self::_getFile($locale, '/ldml/localeDisplayNames/types/type[@type=\''
+ . $value . '\']', 'type');
+ }
+ break;
+
+ case 'orientation':
+ self::_getFile($locale, '/ldml/layout/orientation', 'lines', 'lines');
+ self::_getFile($locale, '/ldml/layout/orientation', 'characters', 'characters');
+ break;
+
+ case 'casing':
+ self::_getFile($locale, '/ldml/layout/inList', 'casing', 'casing');
+ break;
+
+ case 'characters':
+ self::_getFile($locale, '/ldml/characters/exemplarCharacters');
+ break;
+
+ case 'delimiters':
+ self::_getFile($locale, '/ldml/delimiters/quotationStart', '', 'quoteStart');
+ self::_getFile($locale, '/ldml/delimiters/quotationEnd', '', 'quoteEnd');
+ self::_getFile($locale, '/ldml/delimiters/alternateQuotationStart', '', 'quoteStartAlt');
+ self::_getFile($locale, '/ldml/delimiters/alternateQuotationEnd', '', 'quoteEndAlt');
+ break;
+
+ case 'measurement':
+ self::_getFile($locale, '/ldml/measurement/measurementSystem', 'type', 'measurement');
+ break;
+
+ case 'papersize':
+ self::_getFile($locale, '/ldml/measurement/paperSize/height', '', 'height');
+ self::_getFile($locale, '/ldml/measurement/paperSize/width', '', 'width');
+ break;
+
+ case 'datechars':
+ self::_getFile($locale, '/ldml/dates/localizedPatternChars', '', 'chars');
+ break;
+
+ case 'defcalendarformat':
+ self::_getFile($locale, '/ldml/dates/calendars/default', 'type', 'default');
+ break;
+
+ case 'defmonthformat':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/months/monthContext[@type=\'format\']/default', 'type', 'default');
+ break;
+
+ case 'monthlist':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value[0] . '\']/months/monthContext[@type=\''
+ . $value[1] . '\']/monthWidth[@type=\''
+ . $value[2] . '\']/month', 'type');
+ break;
+
+ case 'month':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value[0] . '\']/months/monthContext[@type=\''
+ . $value[1] . '\']/monthWidth[@type=\''
+ . $value[2] . '\']/month[@type=\'' . $value[3] . '\']', 'type');
+ break;
+
+ case 'defdayformat':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/days/dayContext[@type=\'format\']/default', 'type', 'default');
+ break;
+
+ case 'daylist':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value[0] . '\']/days/dayContext[@type=\''
+ . $value[1] . '\']/dayWidth[@type=\''
+ . $value[2] . '\']/day', 'type');
+ break;
+
+ case 'day':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value[0] . '\']/days/dayContext[@type=\''
+ . $value[1] . '\']/dayWidth[@type=\''
+ . $value[2] . '\']/day[@type=\'' . $value[3] . '\']', 'type');
+ break;
+
+ case 'week':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/week/minDays', 'count', 'mindays');
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/week/firstDay', 'day', 'firstday');
+ break;
+
+ case 'weekend':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/week/weekendStart', 'day', 'startday');
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/week/weekendStart', 'time', 'starttime');
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/week/weekendEnd', 'day', 'endday');
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/week/weekendEnd', 'time', 'endtime');
+ break;
+
+ case 'daytime':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/am', '', 'am');
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/pm', '', 'pm');
+ break;
+
+ case 'erashortlist':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/eras/eraAbbr/era', 'type');
+ break;
+
+ case 'erashort':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value[0] . '\']/eras/eraAbbr/era[@type=\'' . $value[1] . '\']', 'type');
+ break;
+
+ case 'eralist':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/eras/eraNames/era', 'type');
+ break;
+
+ case 'era':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value[0] . '\']/eras/eraNames/era[@type=\'' . $value[1] . '\']', 'type');
+ break;
+
+ case 'defdateformat':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/dateFormats/default', 'choice', 'default');
+ break;
+
+ case 'dateformat':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value[0] . '\']/dateFormats/dateFormatLength[@type=\''
+ . $value[1] . '\']/dateFormat/pattern', '', 'pattern');
+ break;
+
+ case 'deftimeformat':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/timeFormats/default', 'choice', 'default');
+ break;
+
+ case 'timeformat':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value[0] . '\']/timeFormats/timeFormatLength[@type=\''
+ . $value[1] . '\']/timeFormat/pattern', '', 'pattern');
+ break;
+
+ case 'datetimeformat':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/dateTimeFormats/dateTimeFormatLength/dateTimeFormat/pattern',
+ '', 'pattern');
+ break;
+
+ case 'calendarfields':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/fields/field', 'type');
+ $_temp = self::$_list;
+ self::$_list = array();
+ foreach ($_temp as $key => $found) {
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/fields/field[@type=\'' . $key . '\']/displayName', '', $key);
+ }
+ break;
+
+ case 'relativedates':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value . '\']/fields/relative', 'type');
+ break;
+
+ case 'relativedate':
+ self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\''
+ . $value[0] . '\']/fields/relative[@type=\'' . $value[1] . '\']', 'type');
+ break;
+
+ case 'timezones':
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/zone', 'type');
+ $_temp = self::$_list;
+ self::$_list = array();
+ foreach ($_temp as $key => $found) {
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/zone[@type=\''
+ . $key . '\']/exemplarCity', '', $key);
+ }
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/zone', 'type');
+ break;
+
+ case 'timezone':
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/zone[@type=\''
+ . $value . '\']/exemplarCity', '', $value);
+ break;
+
+ case 'timezonestandard':
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/zone','type');
+ $_temp = self::$_list;
+ self::$_list = array();
+ foreach ($_temp as $key => $found) {
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/zone[@type=\''
+ . $key . '\']/long/standard', '', $key);
+ }
+ break;
+
+ case 'timezonestandardshort':
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/zone', 'type');
+ $_temp = self::$_list;
+ self::$_list = array();
+ foreach ($_temp as $key => $found) {
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/zone[@type=\''
+ . $key . '\']/short/standard', '', $key);
+ }
+ break;
+
+ case 'timezonedaylight':
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/zone', 'type');
+ $_temp = self::$_list;
+ self::$_list = array();
+ foreach ($_temp as $key => $found) {
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/zone[@type=\''
+ . $key . '\']/long/daylight', '', $key);
+ }
+ break;
+
+ case 'timezonedaylightshort':
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/zone', 'type');
+ $_temp = self::$_list;
+ self::$_list = array();
+ foreach ($_temp as $key => $found) {
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/zone[@type=\''
+ . $key . '\']/short/daylight', '', $key);
+ }
+ break;
+
+ case 'timezoneformat':
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/hourFormat', '', 'hourformat');
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/hoursFormat', '', 'hoursformat');
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/gmtFormat', '', 'gmtformat');
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/regionFormat', '', 'regionformat');
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/fallbackFormat', '', 'fallbackformat');
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/abbreviationFallback',
+ 'type', 'abbreviationfallback');
+ self::_getFile($locale, '/ldml/dates/timeZoneNames/preferenceOrdering',
+ 'type', 'preferenceOrdering');
+ break;
+
+ case 'numbersymbols':
+ self::_getFile($locale, '/ldml/numbers/symbols/decimal', '', 'decimal');
+ self::_getFile($locale, '/ldml/numbers/symbols/group', '', 'group');
+ self::_getFile($locale, '/ldml/numbers/symbols/list', '', 'list');
+ self::_getFile($locale, '/ldml/numbers/symbols/percentSign', '', 'percent');
+ self::_getFile($locale, '/ldml/numbers/symbols/nativeZeroDigit', '', 'zero');
+ self::_getFile($locale, '/ldml/numbers/symbols/patternDigit', '', 'pattern');
+ self::_getFile($locale, '/ldml/numbers/symbols/plusSign', '', 'plus');
+ self::_getFile($locale, '/ldml/numbers/symbols/minusSign', '', 'minus');
+ self::_getFile($locale, '/ldml/numbers/symbols/exponential', '', 'exponent');
+ self::_getFile($locale, '/ldml/numbers/symbols/perMille', '', 'mille');
+ self::_getFile($locale, '/ldml/numbers/symbols/infinity', '', 'infinity');
+ self::_getFile($locale, '/ldml/numbers/symbols/nan', '', 'nan');
+ break;
+
+ case 'decimalnumberformat':
+ self::_getFile($locale, '/ldml/numbers/decimalFormats/decimalFormatLength/decimalFormat/pattern',
+ '', 'default');
+ break;
+
+ case 'scientificnumberformat':
+ self::_getFile($locale,
+ '/ldml/numbers/scientificFormats/scientificFormatLength/scientificFormat/pattern',
+ '', 'default');
+ break;
+
+ case 'percentnumberformat':
+ self::_getFile($locale, '/ldml/numbers/percentFormats/percentFormatLength/percentFormat/pattern',
+ '', 'default');
+ break;
+
+ case 'currencyformat':
+ self::_getFile($locale,
+ '/ldml/numbers/currencyFormats/currencyFormatLength/currencyFormat/pattern',
+ '', 'default');
+ self::_getFile($locale,
+ '/ldml/numbers/currencyFormats/currencySpacing/beforeCurrency/currencyMatch',
+ '', 'beforMatch');
+ self::_getFile($locale,
+ '/ldml/numbers/currencyFormats/currencySpacing/beforeCurrency/surroundingMatch',
+ '', 'beforSurround');
+ self::_getFile($locale,
+ '/ldml/numbers/currencyFormats/currencySpacing/beforeCurrency/insertBetween',
+ '', 'beforBetween');
+ self::_getFile($locale,
+ '/ldml/numbers/currencyFormats/currencySpacing/afterCurrency/currencyMatch',
+ '', 'afterMatch');
+ self::_getFile($locale,
+ '/ldml/numbers/currencyFormats/currencySpacing/afterCurrency/surroundingMatch',
+ '', 'afterSurround');
+ self::_getFile($locale,
+ '/ldml/numbers/currencyFormats/currencySpacing/afterCurrency/insertBetween',
+ '', 'afterBetween');
+ break;
+
+ case 'currencynames':
+ self::_getFile($locale, '/ldml/numbers/currencies/currency', 'type');
+ $_temp = self::$_list;
+ self::$_list = array();
+ foreach ($_temp as $key => $found) {
+ self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\''
+ . $key . '\']/displayName', '', $key);
+ }
+ break;
+
+ case 'currencyname':
+ self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\''
+ . $value . '\']/displayName', '', $value);
+ break;
+
+ case 'currencysymbols':
+ self::_getFile($locale, '/ldml/numbers/currencies/currency', 'type');
+ $_temp = self::$_list;
+ self::$_list = array();
+ foreach ($_temp as $key => $found) {
+ self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\''
+ . $key . '\']/symbol', '', $key);
+ }
+ break;
+
+ case 'currencysymbol':
+ self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\''
+ . $value . '\']/symbol', '', $value);
+ break;
+
+ case 'questionstrings':
+ self::_getFile($locale, '/ldml/posix/messages/yesstr', '', 'yes');
+ self::_getFile($locale, '/ldml/posix/messages/nostr', '', 'no');
+ self::_getFile($locale, '/ldml/posix/messages/yesexpr', '', 'yesexpr');
+ self::_getFile($locale, '/ldml/posix/messages/noexpr', '', 'noexpr');
+ break;
+
+ case 'currencyfraction':
+ self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info[@iso4217=\''
+ . $value . '\']', 'digits', 'digits');
+ self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info[@iso4217=\''
+ . $value . '\']', 'rounding', 'rounding');
+ break;
+
+ case 'currencydigitlist':
+ self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info', 'iso4217');
+ $_temp = self::$_list;
+ self::$_list = array();
+ foreach ($_temp as $key => $found) {
+ self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info[@iso4217=\''
+ . $key . '\']', 'digits', $key);
+ }
+ break;
+
+ case 'currencyroundinglist':
+ self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info', 'iso4217');
+ $_temp = self::$_list;
+ self::$_list = array();
+ foreach ($_temp as $key => $found) {
+ self::_getFile('supplementalData',
+ '/supplementalData/currencyData/fractions/info[@iso4217=\''
+ . $key . '\']', 'rounding', $key);
+ }
+ break;
+
+ case 'currencyforregion':
+ self::_getFile('supplementalData', '/supplementalData/currencyData/region[@iso3166=\''
+ . $value . '\']/currency', 'iso4217');
+ $_temp = self::$_list;
+ self::$_list = array();
+ foreach ($_temp as $key => $keyvalue) {
+ self::_getFile('supplementalData', '/supplementalData/currencyData/region[@iso3166=\''
+ . $value . '\']/currency[@iso4217=\'' . $key . '\']', 'from', $key);
+ }
+ break;
+
+ case 'currencyforregionlist':
+ self::_getFile('supplementalData', '/supplementalData/currencyData/region', 'iso3166');
+ $_temp = self::$_list;
+ self::$_list = array();
+ foreach ($_temp as $key => $found) {
+ self::_getFile('supplementalData', '/supplementalData/currencyData/region[@iso3166=\''
+ . $key . '\']/currency', 'iso4217', $key);
+ }
+ break;
+
+ case 'regionforterritory':
+ self::_getFile('supplementalData', '/supplementalData/territoryContainment/group[@type=\''
+ . $value . '\']', 'contains', $value);
+ break;
+
+ case 'regionforterritorylist':
+ self::_getFile('supplementalData', '/supplementalData/territoryContainment/group', 'type');
+ $_temp = self::$_list;
+ self::$_list = array();
+ foreach ($_temp as $key => $found) {
+ self::_getFile('supplementalData', '/supplementalData/territoryContainment/group[@type=\''
+ . $key . '\']', 'contains', $key);
+ }
+ break;
+
+ case 'scriptforlanguage':
+ self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\''
+ . $value . '\']', 'scripts', $value);
+ break;
+
+ case 'scriptforlanguagelist':
+ self::_getFile('supplementalData', '/supplementalData/languageData/language', 'type');
+ $_temp = self::$_list;
+ self::$_list = array();
+ foreach ($_temp as $key => $found) {
+ self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\''
+ . $key . '\']', 'scripts', $key);
+ }
+ break;
+
+ case 'territoryforlanguage':
+ self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\''
+ . $value . '\']', 'territories', $value);
+ break;
+
+ case 'territoryforlanguagelist':
+ self::_getFile('supplementalData', '/supplementalData/languageData/language', 'type');
+ $_temp = self::$_list;
+ self::$_list = array();
+ foreach ($_temp as $key => $found) {
+ self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\''
+ . $key . '\']', 'territories', $key);
+ }
+ break;
+ default :
+ throw new Zend_Locale_Exception("Unknown detail ($path) for parsing locale data.");
+ break;
+ }
+ return self::$_list;
+ }
+}
diff --git a/libs/Zend/Locale/Data/aa.xml b/libs/Zend/Locale/Data/aa.xml
new file mode 100755
index 0000000000..02321ca3cf
--- /dev/null
+++ b/libs/Zend/Locale/Data/aa.xml
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.31 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="aa"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa" draft="unconfirmed">Qafar</language>
+ <language type="ar" draft="unconfirmed">Arabic</language>
+ <language type="de" draft="unconfirmed">German</language>
+ <language type="en" draft="unconfirmed">English</language>
+ <language type="es" draft="unconfirmed">Spanish</language>
+ <language type="fr" draft="unconfirmed">French</language>
+ <language type="hi" draft="unconfirmed">Hindi</language>
+ <language type="it" draft="unconfirmed">Italian</language>
+ <language type="ja" draft="unconfirmed">Japanese</language>
+ <language type="pt" draft="unconfirmed">Portuguese</language>
+ <language type="ru" draft="unconfirmed">Russian</language>
+ <language type="zh" draft="unconfirmed">Chinese</language>
+ </languages>
+ <scripts>
+ <script type="Latn" draft="unconfirmed">Latin</script>
+ </scripts>
+ <territories>
+ <territory type="BR" draft="unconfirmed">Brazil</territory>
+ <territory type="CN" draft="unconfirmed">China</territory>
+ <territory type="DE" draft="unconfirmed">Germany</territory>
+ <territory type="DJ" draft="unconfirmed">Yabuuti</territory>
+ <territory type="ER" draft="unconfirmed">Eretria</territory>
+ <territory type="ET" draft="unconfirmed">Otobbia</territory>
+ <territory type="FR" draft="unconfirmed">France</territory>
+ <territory type="GB" draft="unconfirmed">United Kingdom</territory>
+ <territory type="IN" draft="unconfirmed">India</territory>
+ <territory type="IT" draft="unconfirmed">Italy</territory>
+ <territory type="JP" draft="unconfirmed">Japan</territory>
+ <territory type="RU" draft="unconfirmed">Russia</territory>
+ <territory type="US" draft="unconfirmed">United States</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[a-z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Qun</month>
+ <month type="2" draft="unconfirmed">Nah</month>
+ <month type="3" draft="unconfirmed">Cig</month>
+ <month type="4" draft="unconfirmed">Agd</month>
+ <month type="5" draft="unconfirmed">Cax</month>
+ <month type="6" draft="unconfirmed">Qas</month>
+ <month type="7" draft="unconfirmed">Qad</month>
+ <month type="8" draft="unconfirmed">Leq</month>
+ <month type="9" draft="unconfirmed">Way</month>
+ <month type="10" draft="unconfirmed">Dit</month>
+ <month type="11" draft="unconfirmed">Xim</month>
+ <month type="12" draft="unconfirmed">Kax</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Qunxa Garablu</month>
+ <month type="2" draft="unconfirmed">Naharsi Kudo</month>
+ <month type="3" draft="unconfirmed">Ciggilta Kudo</month>
+ <month type="4" draft="unconfirmed">Agda Baxisso</month>
+ <month type="5" draft="unconfirmed">Caxah Alsa</month>
+ <month type="6" draft="unconfirmed">Qasa Dirri</month>
+ <month type="7" draft="unconfirmed">Qado Dirri</month>
+ <month type="8" draft="unconfirmed">Leqeeni</month>
+ <month type="9" draft="unconfirmed">Waysu</month>
+ <month type="10" draft="unconfirmed">Diteli</month>
+ <month type="11" draft="unconfirmed">Ximoli</month>
+ <month type="12" draft="unconfirmed">Kaxxa Garablu</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">Q</month>
+ <month type="2" draft="unconfirmed">N</month>
+ <month type="3" draft="unconfirmed">C</month>
+ <month type="4" draft="unconfirmed">A</month>
+ <month type="5" draft="unconfirmed">C</month>
+ <month type="6" draft="unconfirmed">Q</month>
+ <month type="7" draft="unconfirmed">Q</month>
+ <month type="8" draft="unconfirmed">L</month>
+ <month type="9" draft="unconfirmed">W</month>
+ <month type="10" draft="unconfirmed">D</month>
+ <month type="11" draft="unconfirmed">X</month>
+ <month type="12" draft="unconfirmed">K</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Aca</day>
+ <day type="mon" draft="unconfirmed">Etl</day>
+ <day type="tue" draft="unconfirmed">Tal</day>
+ <day type="wed" draft="unconfirmed">Arb</day>
+ <day type="thu" draft="unconfirmed">Kam</day>
+ <day type="fri" draft="unconfirmed">Gum</day>
+ <day type="sat" draft="unconfirmed">Sab</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Acaada</day>
+ <day type="mon" draft="unconfirmed">Etleeni</day>
+ <day type="tue" draft="unconfirmed">Talaata</day>
+ <day type="wed" draft="unconfirmed">Arbaqa</day>
+ <day type="thu" draft="unconfirmed">Kamiisi</day>
+ <day type="fri" draft="unconfirmed">Gumqata</day>
+ <day type="sat" draft="unconfirmed">Sabti</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">A</day>
+ <day type="mon" draft="unconfirmed">E</day>
+ <day type="tue" draft="unconfirmed">T</day>
+ <day type="wed" draft="unconfirmed">A</day>
+ <day type="thu" draft="unconfirmed">K</day>
+ <day type="fri" draft="unconfirmed">G</day>
+ <day type="sat" draft="unconfirmed">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">saaku</am>
+ <pm draft="unconfirmed">carra</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">Yaasuusuk Duma</era>
+ <era type="1" draft="unconfirmed">Yaasuusuk Wadir</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEE, MMMM dd, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MMM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">Brazilian Real</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="unconfirmed">Chinese Yuan Renminbi</displayName>
+ </currency>
+ <currency type="DJF">
+ <symbol draft="unconfirmed">FD</symbol>
+ </currency>
+ <currency type="ERN">
+ <symbol draft="unconfirmed">$</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="unconfirmed">Euro</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">British Pound Sterling</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">Indian Rupee</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="unconfirmed">Japanese Yen</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">Russian Ruble</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">US Dollar</displayName>
+ <symbol draft="unconfirmed">US$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/aa_DJ.xml b/libs/Zend/Locale/Data/aa_DJ.xml
new file mode 100755
index 0000000000..d14977a8b0
--- /dev/null
+++ b/libs/Zend/Locale/Data/aa_DJ.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.29 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="aa"/>
+ <territory type="DJ"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/aa_ER.xml b/libs/Zend/Locale/Data/aa_ER.xml
new file mode 100755
index 0000000000..426ebb2e05
--- /dev/null
+++ b/libs/Zend/Locale/Data/aa_ER.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.28 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="aa"/>
+ <territory type="ER"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="2" draft="unconfirmed">Kudo</month>
+ <month type="4" draft="unconfirmed">Agda Baxis</month>
+ <month type="8" draft="unconfirmed">Liiqen</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/aa_ER_SAAHO.xml b/libs/Zend/Locale/Data/aa_ER_SAAHO.xml
new file mode 100755
index 0000000000..f2ccc21fcc
--- /dev/null
+++ b/libs/Zend/Locale/Data/aa_ER_SAAHO.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.27 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="aa"/>
+ <territory type="ER"/>
+ <variant type="SAAHO"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Nab</day>
+ <day type="mon" draft="unconfirmed">San</day>
+ <day type="tue" draft="unconfirmed">Sal</day>
+ <day type="wed" draft="unconfirmed">Rab</day>
+ <day type="thu" draft="unconfirmed">Cam</day>
+ <day type="fri" draft="unconfirmed">Jum</day>
+ <day type="sat" draft="unconfirmed">Qun</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Naba Sambat</day>
+ <day type="mon" draft="unconfirmed">Sani</day>
+ <day type="tue" draft="unconfirmed">Salus</day>
+ <day type="wed" draft="unconfirmed">Rabuq</day>
+ <day type="thu" draft="unconfirmed">Camus</day>
+ <day type="fri" draft="unconfirmed">Jumqata</day>
+ <day type="sat" draft="unconfirmed">Qunxa Sambat</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/aa_ET.xml b/libs/Zend/Locale/Data/aa_ET.xml
new file mode 100755
index 0000000000..93031b5c96
--- /dev/null
+++ b/libs/Zend/Locale/Data/aa_ET.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.30 $"/>
+ <generation date="$Date: 2006/06/28 17:31:21 $"/>
+ <language type="aa"/>
+ <territory type="ET"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="2" draft="unconfirmed">Kudo</month>
+ <month type="4" draft="unconfirmed">Agda Baxis</month>
+ <month type="8" draft="unconfirmed">Liiqen</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ERN">
+ <symbol draft="unconfirmed">ERN</symbol>
+ </currency>
+ <currency type="ETB">
+ <symbol draft="unconfirmed">$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/af.xml b/libs/Zend/Locale/Data/af.xml
new file mode 100755
index 0000000000..a7064692a6
--- /dev/null
+++ b/libs/Zend/Locale/Data/af.xml
@@ -0,0 +1,625 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.48 $"/>
+ <generation date="$Date: 2006/06/28 20:38:29 $"/>
+ <language type="af"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="af">Afrikaans</language>
+ <language type="afa" draft="unconfirmed">Afro-Asiaties (Ander)</language>
+ <language type="ar" references="RP3" draft="provisional">Arabies</language>
+ <language type="arc" references="RP1" draft="unconfirmed">Aramees</language>
+ <language type="art" draft="unconfirmed">Kunsmatig (Ander)</language>
+ <language type="bat" draft="unconfirmed">Balties (Ander)</language>
+ <language type="ber" references="RP3" draft="provisional">Berbers</language>
+ <language type="bg" references="RP3" draft="provisional">Bulgaars</language>
+ <language type="bnt" references="RP3" draft="provisional">Bantoe</language>
+ <language type="br" references="RP3" draft="provisional">Bretons</language>
+ <language type="ca" references="RP1" draft="unconfirmed">Katalaans</language>
+ <language type="cel" references="RP3" draft="provisional">Kelties (Ander)</language>
+ <language type="chr" references="RP3" draft="provisional">Cherokees</language>
+ <language type="cop" references="RP1" draft="unconfirmed">Kopties</language>
+ <language type="cs" references="RP3" draft="provisional">Tsjeggies</language>
+ <language type="cu" references="RP3" draft="provisional">Kerkslawies</language>
+ <language type="cy" references="RP3" draft="provisional">Wallies</language>
+ <language type="da" references="RP1" draft="unconfirmed">Deens</language>
+ <language type="de" references="RP3">Duits</language>
+ <language type="egy" draft="unconfirmed">Egipties (Antiek)</language>
+ <language type="el" references="RP1" draft="unconfirmed">Grieks</language>
+ <language type="en" references="RP3">Engels</language>
+ <language type="eo" references="RP1" draft="unconfirmed">Esperanto</language>
+ <language type="es">Spaans</language>
+ <language type="eu" references="RP3" draft="provisional">Baskies</language>
+ <language type="fa" references="RP1" draft="unconfirmed">Persies</language>
+ <language type="fi" references="RP3" draft="provisional">Fins</language>
+ <language type="fj" references="RP3" draft="provisional">Fidjiaans</language>
+ <language type="fo" references="RP3" draft="provisional">Faroëes</language>
+ <language type="fr" references="RP3">Frans</language>
+ <language type="fy" references="RP3" draft="provisional">Fries</language>
+ <language type="ga" references="RP3" draft="provisional">Iers</language>
+ <language type="gd" references="RP1" draft="unconfirmed">Gaelies</language>
+ <language type="gem" references="RP3" draft="provisional">Germaans (Ander)</language>
+ <language type="got" references="RP3" draft="provisional">Goties</language>
+ <language type="grc" draft="unconfirmed">Antieke Grieks</language>
+ <language type="gv" references="RP3" draft="provisional">Manx</language>
+ <language type="he" references="RP3">Hebreeus</language>
+ <language type="hi" references="RP3" draft="provisional">Hindi</language>
+ <language type="hit" references="RP3" draft="provisional">Hetities</language>
+ <language type="hr" draft="unconfirmed">Kroaties</language>
+ <language type="hu" references="RP3" draft="provisional">Hongaars</language>
+ <language type="hy" draft="unconfirmed">Armeens</language>
+ <language type="ia" references="RP3" draft="provisional">Interlingua</language>
+ <language type="id" references="RP3" draft="provisional">Indonesies</language>
+ <language type="ine" references="RP3" draft="provisional">Indo-Europees (Ander)</language>
+ <language type="is" references="RP3" draft="provisional">Yslands</language>
+ <language type="it" references="RP3">Italiaans</language>
+ <language type="ja" references="RP3">Japannees</language>
+ <language type="jv" references="RP3" draft="provisional">Javaans</language>
+ <language type="khi" references="RP3" draft="provisional">Khoi-San (Ander)</language>
+ <language type="km" references="RP3" draft="provisional">Khmer</language>
+ <language type="ko" draft="unconfirmed">Koreaans</language>
+ <language type="kru" references="RP3" draft="provisional">Koerdies</language>
+ <language type="kw" references="RP3" draft="provisional">Kornies</language>
+ <language type="la" references="RP3" draft="provisional">Latyn</language>
+ <language type="li" draft="unconfirmed">Limburgs</language>
+ <language type="lo" references="RP3" draft="provisional">Lao</language>
+ <language type="lt" references="RP3" draft="provisional">Litaus</language>
+ <language type="lv" references="RP3" draft="provisional">Letties</language>
+ <language type="mas" references="RP3" draft="provisional">Masai</language>
+ <language type="mg" references="RP3" draft="provisional">Malgassies</language>
+ <language type="mk" draft="unconfirmed">Masedonies</language>
+ <language type="ml" references="RP3" draft="provisional">Malajalam</language>
+ <language type="mn" draft="unconfirmed">Mongools</language>
+ <language type="ms" references="RP3" draft="provisional">Maleis</language>
+ <language type="mul" draft="unconfirmed">Veelvuldige tale</language>
+ <language type="my" references="RP3" draft="provisional">Birmaans</language>
+ <language type="nd" draft="unconfirmed">Noord-Ndebele</language>
+ <language type="nl" references="RP1" draft="unconfirmed">Nederlands</language>
+ <language type="no" draft="unconfirmed">Noorweegs</language>
+ <language type="nr" draft="unconfirmed">Suid-Ndebele</language>
+ <language type="nso" references="RP3" draft="provisional">Sepedi</language>
+ <language type="pa" references="RP3" draft="provisional">Pandjabi</language>
+ <language type="phn" references="RP1" draft="unconfirmed">Fenisies</language>
+ <language type="pl" references="RP3" draft="provisional">Pools</language>
+ <language type="ps" references="RP3" draft="provisional">Pasjtoe</language>
+ <language type="pt">Portugees</language>
+ <language type="ro" draft="unconfirmed">Romeens</language>
+ <language type="ru">Russies</language>
+ <language type="sa" references="RP1" draft="unconfirmed">Sanskrit</language>
+ <language type="sco" references="RP3" draft="provisional">Skots</language>
+ <language type="sem" references="RP1" draft="unconfirmed">Semities (Ander)</language>
+ <language type="sgn" references="RP3" draft="provisional">Gebaretaal</language>
+ <language type="sk" references="RP3" draft="provisional">Slowaaks</language>
+ <language type="sl" references="RP3" draft="provisional">Sloweens</language>
+ <language type="sla" references="RP3" draft="provisional">Slawies (Ander)</language>
+ <language type="sn" references="RP3" draft="provisional">Shona</language>
+ <language type="sr" draft="unconfirmed">Serwies</language>
+ <language type="ss" references="RP3" draft="provisional">Swazi</language>
+ <language type="st" draft="unconfirmed">Suid-Sotho</language>
+ <language type="sv" references="RP3" draft="provisional">Sweeds</language>
+ <language type="sw" references="RP3" draft="provisional">Swahili</language>
+ <language type="tn" references="RP3" draft="provisional">Tswana</language>
+ <language type="tr" references="RP3" draft="provisional">Turks</language>
+ <language type="ts" references="RP3" draft="provisional">Tsonga</language>
+ <language type="und" draft="unconfirmed">Onbepaald</language>
+ <language type="ve" references="RP3" draft="provisional">Venda</language>
+ <language type="vi" references="RP1" draft="unconfirmed">Viëtnamees</language>
+ <language type="xh" references="RP3" draft="provisional">Xhosa</language>
+ <language type="yi" references="RP1" draft="unconfirmed">Jiddisj</language>
+ <language type="zh">Sjinees</language>
+ <language type="zu" references="RP3" draft="provisional">Zoeloe</language>
+ </languages>
+ <scripts>
+ <script type="Arab" references="RP3" draft="provisional">Arabies</script>
+ <script type="Armn" draft="unconfirmed">Armeens</script>
+ <script type="Brai" references="RP1" draft="unconfirmed">braille</script>
+ <script type="Copt" draft="unconfirmed">Kopties</script>
+ <script type="Cyrl" references="RP3" draft="provisional">Cyrillies</script>
+ <script type="Cyrs" draft="unconfirmed">Cyrillies (Ou Kerkslawiese variant)</script>
+ <script type="Egyp" draft="unconfirmed">Egiptiese hiërogliewe</script>
+ <script type="Ethi" draft="unconfirmed">Etiopies</script>
+ <script type="Goth" draft="unconfirmed">Goties</script>
+ <script type="Grek" draft="unconfirmed">Grieks</script>
+ <script type="Hans" draft="unconfirmed">Vereenvoudigde Sjinees</script>
+ <script type="Hant" draft="unconfirmed">Tradisionele Sjinees</script>
+ <script type="Hebr" draft="unconfirmed">Hebreeus</script>
+ <script type="Khmr" draft="unconfirmed">Khmer</script>
+ <script type="Latn" references="RP3" draft="provisional">Latyn</script>
+ <script type="Mong" draft="unconfirmed">Mongools</script>
+ <script type="Phnx" draft="unconfirmed">Fenisies</script>
+ <script type="Visp" draft="unconfirmed">Sigbare spraak</script>
+ <script type="Zxxx" draft="unconfirmed">Kode vir ongeskrewe tale</script>
+ <script type="Zyyy" draft="unconfirmed">Algemeen</script>
+ <script type="Zzzz" draft="unconfirmed">Kode vir ongekodeerde alfabette</script>
+ </scripts>
+ <territories>
+ <territory type="001" references="RP2" draft="provisional">Wêreld</territory>
+ <territory type="002" references="RP2" draft="provisional">Afrika</territory>
+ <territory type="005" references="RP2" draft="provisional">Suid-Amerika</territory>
+ <territory type="009" references="RP2" draft="provisional">Oseanië</territory>
+ <territory type="011" references="RP3" draft="provisional">Wes-Afrika</territory>
+ <territory type="013" references="RP3" draft="provisional">Sentraal-Amerika</territory>
+ <territory type="014" draft="unconfirmed">Oos-Afrika</territory>
+ <territory type="015" draft="unconfirmed">Noord-Afrika</territory>
+ <territory type="017" references="RP3" draft="provisional">Midde-Afrika</territory>
+ <territory type="018" references="RP2" draft="provisional">Suider-Afrika</territory>
+ <territory type="019" draft="unconfirmed">Amerikas</territory>
+ <territory type="021" draft="unconfirmed">Noord-Amerika</territory>
+ <territory type="029" references="RP2" draft="provisional">Karibies</territory>
+ <territory type="030" draft="unconfirmed">Oos-Asië</territory>
+ <territory type="034" draft="unconfirmed">Suid-Asië</territory>
+ <territory type="035" draft="unconfirmed">Suidoos-Asië</territory>
+ <territory type="039" draft="unconfirmed">Suid-Europa</territory>
+ <territory type="053" draft="unconfirmed">Australië en Nieu-Seeland</territory>
+ <territory type="054" references="RP2" draft="provisional">Melanesië</territory>
+ <territory type="061" references="RP2" draft="provisional">Polinesië</territory>
+ <territory type="142" references="RP2" draft="provisional">Asië</territory>
+ <territory type="143" draft="unconfirmed">Sentraal-Asië</territory>
+ <territory type="145" draft="unconfirmed">Wes-Asië</territory>
+ <territory type="150" references="RP2" draft="provisional">Europa</territory>
+ <territory type="151" draft="unconfirmed">Oos-Europa</territory>
+ <territory type="154" draft="unconfirmed">Noord-Europa</territory>
+ <territory type="155" draft="unconfirmed">Wes-Europa</territory>
+ <territory type="172" draft="unconfirmed">Statebond</territory>
+ <territory type="AD" references="RP1" draft="unconfirmed">Andorra</territory>
+ <territory type="AE">Verenigde Arabiese Emirate</territory>
+ <territory type="AF">Afganistan</territory>
+ <territory type="AG">Antigua en Barbuda</territory>
+ <territory type="AL">Albanië</territory>
+ <territory type="AM">Armenië</territory>
+ <territory type="AN" references="RP1" draft="provisional">Nederlands-Antille</territory>
+ <territory type="AO" draft="unconfirmed">Angola</territory>
+ <territory type="AQ" references="RP2" draft="provisional">Antarktika</territory>
+ <territory type="AR">Argentinië</territory>
+ <territory type="AT">Oostenryk</territory>
+ <territory type="AU">Australië</territory>
+ <territory type="AZ">Aserbeidjan</territory>
+ <territory type="AZ" references="RP1" alt="proposed-u178-1" draft="unconfirmed">Azerbeidjan</territory>
+ <territory type="BA">Bosnië en Herzegowina</territory>
+ <territory type="BD">Bangladesj</territory>
+ <territory type="BE">België</territory>
+ <territory type="BF">Boerkina Fasso</territory>
+ <territory type="BF" references="RP1" alt="proposed-u178-1" draft="unconfirmed">Burkina Faso</territory>
+ <territory type="BG">Bulgarye</territory>
+ <territory type="BH">Bahrein</territory>
+ <territory type="BJ" references="RP1" draft="unconfirmed">Benin</territory>
+ <territory type="BN">Broenei</territory>
+ <territory type="BO">Bolivië</territory>
+ <territory type="BR">Brasilië</territory>
+ <territory type="BS" draft="unconfirmed">Bahamas</territory>
+ <territory type="BT">Bhoetan</territory>
+ <territory type="BW" draft="unconfirmed">Botswana</territory>
+ <territory type="BY">Wit-Rusland</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CF">Sentraal-Afrikaanse Republiek</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Switserland</territory>
+ <territory type="CI">Ivoorkus</territory>
+ <territory type="CL">Chili</territory>
+ <territory type="CM">Kameroen</territory>
+ <territory type="CN">Sjina</territory>
+ <territory type="CR" draft="unconfirmed">Costa Rica</territory>
+ <territory type="CS" references="RP1" draft="unconfirmed">Serwië en Montenegro</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Kaap Verde</territory>
+ <territory type="CY">Ciprus</territory>
+ <territory type="CZ">Tjeggiese Republiek</territory>
+ <territory type="DE">Duitsland</territory>
+ <territory type="DJ">Djiboeti</territory>
+ <territory type="DK">Denemarke</territory>
+ <territory type="DO">Dominikaanse Republiek</territory>
+ <territory type="DZ">Algerië</territory>
+ <territory type="EE">Estland</territory>
+ <territory type="EG">Egipte</territory>
+ <territory type="EH">Wes-Sahara</territory>
+ <territory type="ES">Spanje</territory>
+ <territory type="ET">Ethiopië</territory>
+ <territory type="FI" draft="unconfirmed">Finland</territory>
+ <territory type="FJ">Fidji</territory>
+ <territory type="FK" references="RP1" draft="provisional">Falklandeilande</territory>
+ <territory type="FM">Mikronesië</territory>
+ <territory type="FO" references="RP1" draft="provisional">Faroëreilande</territory>
+ <territory type="FR">Frankryk</territory>
+ <territory type="GA">Gaboen</territory>
+ <territory type="GB">Groot-Brittanje</territory>
+ <territory type="GE">Georgië</territory>
+ <territory type="GF" references="RP1" draft="provisional">Frans-Guyana</territory>
+ <territory type="GH" draft="unconfirmed">Ghana</territory>
+ <territory type="GL" references="RP1" draft="provisional">Groenland</territory>
+ <territory type="GM">Gambië</territory>
+ <territory type="GN">Guinee</territory>
+ <territory type="GQ">Ekwatoriaal-Guinee</territory>
+ <territory type="GR">Griekeland</territory>
+ <territory type="GW">Guinee-Bissau</territory>
+ <territory type="HK" references="RP1" draft="provisional">Hongkong</territory>
+ <territory type="HR">Kroasië</territory>
+ <territory type="HT">Haïti</territory>
+ <territory type="HU">Hongarye</territory>
+ <territory type="ID">Indonesië</territory>
+ <territory type="IE">Ierland</territory>
+ <territory type="IL" draft="unconfirmed">Israel</territory>
+ <territory type="IN">Indië</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IR" references="RP1" draft="unconfirmed">Iran</territory>
+ <territory type="IS">Ysland</territory>
+ <territory type="IT">Italië</territory>
+ <territory type="JM">Jamaika</territory>
+ <territory type="JO">Jordanië</territory>
+ <territory type="JP">Japan</territory>
+ <territory type="KE">Kenia</territory>
+ <territory type="KG">Kirgisië</territory>
+ <territory type="KH">Kambodja</territory>
+ <territory type="KM">Comore</territory>
+ <territory type="KN">Saint Kitts en Nevis</territory>
+ <territory type="KP">Noord-Korea</territory>
+ <territory type="KR">Suid-Korea</territory>
+ <territory type="KW">Koeweit</territory>
+ <territory type="KY" references="RP1" draft="provisional">Kaaimanseilande</territory>
+ <territory type="KZ">Kasakstan</territory>
+ <territory type="LA" references="RP1" draft="unconfirmed">Laos</territory>
+ <territory type="LB">Libanon</territory>
+ <territory type="LI" references="RP1" draft="unconfirmed">Liechtenstein</territory>
+ <territory type="LK" references="RP1" draft="unconfirmed">Sri Lanka</territory>
+ <territory type="LR">Liberië</territory>
+ <territory type="LS" references="RP1" draft="unconfirmed">Lesotho</territory>
+ <territory type="LT">Litaue</territory>
+ <territory type="LU">Luxemburg</territory>
+ <territory type="LV">Letland</territory>
+ <territory type="LY">Libië</territory>
+ <territory type="MA">Marokko</territory>
+ <territory type="MC" references="RP1" draft="unconfirmed">Monaco</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshall-eilande</territory>
+ <territory type="MK">Macedonië</territory>
+ <territory type="ML" references="RP1" draft="unconfirmed">Mali</territory>
+ <territory type="MN">Mongolië</territory>
+ <territory type="MO" references="RP1" draft="provisional">Macao</territory>
+ <territory type="MR">Mouritanië</territory>
+ <territory type="MT" references="RP1" draft="unconfirmed">Malta</territory>
+ <territory type="MU" references="RP1" draft="unconfirmed">Mauritius</territory>
+ <territory type="MV">Maldive</territory>
+ <territory type="MX">Meksiko</territory>
+ <territory type="MY">Maleisië</territory>
+ <territory type="MZ">Mosambiek</territory>
+ <territory type="NA">Namibië</territory>
+ <territory type="NC" references="RP1" draft="provisional">Nieu-Kaledonië</territory>
+ <territory type="NE" references="RP1" alt="proposed-u176-1" draft="provisional">Niger</territory>
+ <territory type="NG" references="RP1" draft="provisional">Nigerië</territory>
+ <territory type="NI" references="RP1" draft="unconfirmed">Nicaragua</territory>
+ <territory type="NL">Nederland</territory>
+ <territory type="NO">Noorweë</territory>
+ <territory type="NR">Naoeroe</territory>
+ <territory type="NZ">Nieu-Seeland</territory>
+ <territory type="OM" references="RP1" draft="unconfirmed">Oman</territory>
+ <territory type="PA" references="RP1" draft="unconfirmed">Panama</territory>
+ <territory type="PE" references="RP1" draft="unconfirmed">Peru</territory>
+ <territory type="PG">Papoea Nieu-Guinee</territory>
+ <territory type="PG" references="RP1" alt="proposed-u176-1" draft="provisional">Papoea-Nieu-Guinee</territory>
+ <territory type="PH">Filippyne</territory>
+ <territory type="PK" references="RP1" draft="unconfirmed">Pakistan</territory>
+ <territory type="PL">Pole</territory>
+ <territory type="PR" references="RP1" draft="unconfirmed">Puerto Rico</territory>
+ <territory type="PT" references="RP1" draft="unconfirmed">Portugal</territory>
+ <territory type="PY" references="RP1" draft="unconfirmed">Paraguay</territory>
+ <territory type="QA">Katar</territory>
+ <territory type="RE" references="RP1" draft="provisional">Réunion</territory>
+ <territory type="RO">Roemenië</territory>
+ <territory type="RU">Rusland</territory>
+ <territory type="RW" references="RP1" draft="unconfirmed">Rwanda</territory>
+ <territory type="SA">Saoedi-Arabië</territory>
+ <territory type="SB">Solomon Eilande</territory>
+ <territory type="SC">Seychelle</territory>
+ <territory type="SD">Soedan</territory>
+ <territory type="SE">Swede</territory>
+ <territory type="SG">Singapoer</territory>
+ <territory type="SI">Slowenië</territory>
+ <territory type="SK">Slowakye</territory>
+ <territory type="SL" references="RP1" draft="unconfirmed">Sierra Leone</territory>
+ <territory type="SM" references="RP1" draft="unconfirmed">San Marino</territory>
+ <territory type="SN" references="RP1" draft="unconfirmed">Senegal</territory>
+ <territory type="SO">Somalië</territory>
+ <territory type="SR" references="RP1" draft="unconfirmed">Suriname</territory>
+ <territory type="ST">Sao Tome en Principe</territory>
+ <territory type="ST" references="RP1" alt="proposed-u176-1" draft="provisional">Sao Tomé en Principe</territory>
+ <territory type="SV">Salvador</territory>
+ <territory type="SV" references="RP1" alt="proposed-u178-1" draft="unconfirmed">El Salvador</territory>
+ <territory type="SY">Sirië</territory>
+ <territory type="SZ" references="RP1" draft="unconfirmed">Swaziland</territory>
+ <territory type="TD">Tsjaad</territory>
+ <territory type="TH" draft="unconfirmed">Thailand</territory>
+ <territory type="TJ">Tadjikistan</territory>
+ <territory type="TM">Turkmenië</territory>
+ <territory type="TN">Tunisië</territory>
+ <territory type="TR">Turkye</territory>
+ <territory type="TT">Trinidad en Tobago</territory>
+ <territory type="TW" draft="unconfirmed">Taiwan</territory>
+ <territory type="TZ">Tanzanië</territory>
+ <territory type="UA">Oekraine</territory>
+ <territory type="UA" references="RP1" alt="proposed-u178-1" draft="unconfirmed">Oekraïne</territory>
+ <territory type="UG" references="RP1" draft="unconfirmed">Uganda</territory>
+ <territory type="US">Verenigde State van Amerika</territory>
+ <territory type="UZ">Oesbekistan</territory>
+ <territory type="VA">Vatikaan</territory>
+ <territory type="VC">Saint Vincent en die Grenadine</territory>
+ <territory type="VE" references="RP1" draft="unconfirmed">Venezuela</territory>
+ <territory type="VN">Viëtnam</territory>
+ <territory type="WS" draft="unconfirmed">Samoa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="ZA">Suid-Afrika</territory>
+ <territory type="ZM">Zambië</territory>
+ <territory type="ZW" draft="provisional">Zimbabwe</territory>
+ </territories>
+ <variants>
+ <variant type="1901" draft="unconfirmed">Trandisionele Duitse ortografie</variant>
+ <variant type="1996" draft="unconfirmed">Duitse ortografie van 1996</variant>
+ <variant type="REVISED" draft="unconfirmed">Hersiene ortografie</variant>
+ </variants>
+ <keys>
+ <key type="calendar" references="RP2" draft="provisional">Kalender</key>
+ <key type="collation" references="RP2" draft="provisional">Vergelyking</key>
+ <key type="currency" draft="provisional">Geldeenheid</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation" draft="unconfirmed">Tradisionele Sjinees (Groot5)</type>
+ <type type="chinese" key="calendar" draft="unconfirmed">Sjinese kalender</type>
+ <type type="gb2312han" key="collation" draft="unconfirmed">Vereenvoudigde Sjinees</type>
+ <type type="gregorian" key="calendar" references="RP3" draft="provisional">Gregoriaanse kalender</type>
+ <type type="hebrew" key="calendar" draft="unconfirmed">Hebreeuse kalender</type>
+ <type type="islamic" key="calendar" draft="unconfirmed">Islamitiese kalender</type>
+ <type type="japanese" key="calendar" draft="unconfirmed">Japannese kalender</type>
+ <type type="phonebook" key="collation" draft="unconfirmed">Telefoongidsvolgorde</type>
+ <type type="traditional" key="collation" draft="unconfirmed">Tradisioneel</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US" draft="unconfirmed">VSA</measurementSystemName>
+ <measurementSystemName type="metric" draft="provisional">Metriek</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a á â b-e é è ê ë f-i î ï j-o ô ö p-u û v-z ʼn]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" draft="unconfirmed">[à å-ç ñ ø œ ß]</exemplarCharacters>
+ <exemplarCharacters alt="proposed-u178-2" draft="unconfirmed">[a á â ä b-e é è ê ë f-i í-ï j-o ó ò ô ö p-u ú-ü v-y ý z ʼn]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Jan</month>
+ <month type="1" references="RP1" alt="proposed-u176-1" draft="provisional">Jan.</month>
+ <month type="2">Feb</month>
+ <month type="2" references="RP1" alt="proposed-u176-1" draft="provisional">Feb.</month>
+ <month type="3">Mar</month>
+ <month type="3" references="RP1" alt="proposed-u176-2" draft="provisional">Mrt.</month>
+ <month type="4">Apr</month>
+ <month type="4" references="RP1" alt="proposed-u176-1" draft="provisional">Apr.</month>
+ <month type="5">Mei</month>
+ <month type="6">Jun</month>
+ <month type="6" references="RP1" alt="proposed-u176-1" draft="provisional">Jun.</month>
+ <month type="7">Jul</month>
+ <month type="7" references="RP1" alt="proposed-u176-1" draft="provisional">Jul.</month>
+ <month type="8">Aug</month>
+ <month type="8" references="RP1" alt="proposed-u176-1" draft="provisional">Aug.</month>
+ <month type="9">Sep</month>
+ <month type="9" references="RP1" alt="proposed-u176-1" draft="provisional">Sep.</month>
+ <month type="10">Okt</month>
+ <month type="10" references="RP1" alt="proposed-u176-1" draft="provisional">Okt.</month>
+ <month type="11">Nov</month>
+ <month type="11" references="RP1" alt="proposed-u176-1" draft="provisional">Nov.</month>
+ <month type="12">Des</month>
+ <month type="12" references="RP1" alt="proposed-u176-1" draft="provisional">Des.</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Januarie</month>
+ <month type="2">Februarie</month>
+ <month type="3">Maart</month>
+ <month type="4">April</month>
+ <month type="5">Mei</month>
+ <month type="6">Junie</month>
+ <month type="7">Julie</month>
+ <month type="8">Augustus</month>
+ <month type="9">September</month>
+ <month type="10">Oktober</month>
+ <month type="11">November</month>
+ <month type="12">Desember</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">So</day>
+ <day type="sun" references="RP1" alt="proposed-u176-1" draft="provisional">So.</day>
+ <day type="mon">Ma</day>
+ <day type="mon" references="RP1" alt="proposed-u176-1" draft="provisional">Ma.</day>
+ <day type="tue">Di</day>
+ <day type="tue" references="RP1" alt="proposed-u176-1" draft="provisional">Di.</day>
+ <day type="wed">Wo</day>
+ <day type="wed" references="RP1" alt="proposed-u176-1" draft="provisional">Wo.</day>
+ <day type="thu">Do</day>
+ <day type="thu" references="RP1" alt="proposed-u176-1" draft="provisional">Do.</day>
+ <day type="fri">Vr</day>
+ <day type="fri" references="RP1" alt="proposed-u176-1" draft="provisional">Vr.</day>
+ <day type="sat">Sa</day>
+ <day type="sat" references="RP1" alt="proposed-u176-1" draft="provisional">Sa.</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Sondag</day>
+ <day type="mon">Maandag</day>
+ <day type="tue">Dinsdag</day>
+ <day type="wed">Woensdag</day>
+ <day type="thu">Donderdag</day>
+ <day type="fri">Vrydag</day>
+ <day type="sat">Saterdag</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">K1</quarter>
+ <quarter type="2" draft="unconfirmed">K2</quarter>
+ <quarter type="3" draft="unconfirmed">K3</quarter>
+ <quarter type="4" draft="unconfirmed">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="provisional">1ste kwartaal</quarter>
+ <quarter type="2" draft="provisional">2de kwartaal</quarter>
+ <quarter type="3" draft="provisional">3de kwartaal</quarter>
+ <quarter type="4" draft="provisional">4de kwartaal</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>vm.</am>
+ <pm>nm.</pm>
+ <eras>
+ <eraNames>
+ <era type="0" references="RP1" draft="provisional">voor Christus</era>
+ <era type="1" references="RP1" draft="provisional">na Christus</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">v.C.</era>
+ <era type="1">n.C.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern references="RP1" draft="provisional">EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern references="RP1" draft="provisional">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern references="RP1" draft="provisional">d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern references="RP1" draft="provisional">yyyy-MM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">MM-dd</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">yyyy-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName draft="provisional">Tydperk</displayName>
+ </field>
+ <field type="year">
+ <displayName draft="provisional">Jaar</displayName>
+ </field>
+ <field type="month">
+ <displayName draft="provisional">Maand</displayName>
+ </field>
+ <field type="week">
+ <displayName references="RP3" draft="provisional">Week</displayName>
+ </field>
+ <field type="day">
+ <displayName references="RP3" draft="provisional">Dag</displayName>
+ </field>
+ <field type="weekday">
+ <displayName draft="provisional">Dag van die week</displayName>
+ </field>
+ <field type="hour">
+ <displayName draft="provisional">Uur</displayName>
+ </field>
+ <field type="minute">
+ <displayName draft="provisional">Minuut</displayName>
+ </field>
+ <field type="second">
+ <displayName draft="provisional">Sekonde</displayName>
+ </field>
+ <field type="zone">
+ <displayName draft="provisional">Tydsone</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity references="RP3" draft="provisional">Suidpool</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity references="RP3" draft="provisional">Sjanghai</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity draft="provisional">Mexikostad</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity references="RP1" draft="provisional">Lissabon</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity references="RP1" draft="provisional">Moskou</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <currencies>
+ <currency type="BRL">
+ <displayName references="RP3" draft="provisional">Reaal</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName draft="unconfirmed">Switserse frank</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName references="RP3" draft="provisional">Joean</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="unconfirmed">Euro</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">Britse pond</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName draft="unconfirmed">Italiaanse lier</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="unconfirmed">Japannese jen</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName draft="unconfirmed">Namibiese dollar</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName references="RP3" draft="provisional">Roebel</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">VSA-dollar</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Rand</displayName>
+ <displayName alt="proposed-u178-2" draft="provisional">Rand</displayName>
+ <symbol>R</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="provisional">ja:j</yesstr>
+ <nostr draft="provisional">nee:n</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1" uri="ISBN 1 86890 034 7">Afrikaanse Woordelys en Spelreëls</reference>
+ <reference type="RP2" uri="ISBN 1 86890 002 9">Pharos - Groot Woordeboek 1997</reference>
+ <reference type="RP3" uri="ISBN 1 86890 044 4">Pharos - Afrikaans-Engels Woordeboek 2005</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/af_NA.xml b/libs/Zend/Locale/Data/af_NA.xml
new file mode 100755
index 0000000000..c14cde0399
--- /dev/null
+++ b/libs/Zend/Locale/Data/af_NA.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="af"/>
+ <territory type="NA"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/af_ZA.xml b/libs/Zend/Locale/Data/af_ZA.xml
new file mode 100755
index 0000000000..a7808de0f4
--- /dev/null
+++ b/libs/Zend/Locale/Data/af_ZA.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="af"/>
+ <territory type="ZA"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yyyy/MM/dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">MM/dd</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">yyyy/MM</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ak.xml b/libs/Zend/Locale/Data/ak.xml
new file mode 100755
index 0000000000..826f6d04ab
--- /dev/null
+++ b/libs/Zend/Locale/Data/ak.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.17 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="ak"/>
+ </identity>
+ <characters>
+ <exemplarCharacters references="RP2">[a b d e É› f-i k m-o É” p r-u w y z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" references="RP2">[c j l v]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" references="RP2" alt="proposed-u151-2" draft="unconfirmed">[̃ ã e ĩ õ ũ]</exemplarCharacters>
+ <exemplarCharacters references="RP2" alt="proposed-u151-4" draft="unconfirmed">[a-e É› f-o É” p r-u w y z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">S-Ɔ</month>
+ <month type="2" draft="unconfirmed">K-Ɔ</month>
+ <month type="3" draft="unconfirmed">E-Ɔ</month>
+ <month type="4" draft="unconfirmed">E-O</month>
+ <month type="5" draft="unconfirmed">E-K</month>
+ <month type="6" draft="unconfirmed">O-A</month>
+ <month type="7" draft="unconfirmed">A-K</month>
+ <month type="8" draft="unconfirmed">D-Ɔ</month>
+ <month type="9" draft="unconfirmed">F-Æ</month>
+ <month type="10" draft="unconfirmed">Ɔ-A</month>
+ <month type="11" draft="unconfirmed">Ɔ-O</month>
+ <month type="12" draft="unconfirmed">M-Ɔ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Sanda-Ɔpɛpɔn</month>
+ <month type="2" draft="unconfirmed">Kwakwar-Ɔgyefuo</month>
+ <month type="3" draft="unconfirmed">Ebɔw-Ɔbenem</month>
+ <month type="4" draft="unconfirmed">Ebɔbira-Oforisuo</month>
+ <month type="5" draft="unconfirmed">Esusow Aketseaba-Kɔtɔnimba</month>
+ <month type="6" draft="unconfirmed">Obirade-Ayɛwohomumu</month>
+ <month type="7" draft="unconfirmed">Ayɛwoho-Kitawonsa</month>
+ <month type="8" draft="unconfirmed">Difuu-Ɔsandaa</month>
+ <month type="9" draft="unconfirmed">Fankwa-ÆbÉ”</month>
+ <month type="10" draft="unconfirmed">Ɔbɛsɛ-Ahinime</month>
+ <month type="11" draft="unconfirmed">Ɔberɛfɛw-Obubuo</month>
+ <month type="12" draft="unconfirmed">Mumu-Ɔpɛnimba</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Kwe</day>
+ <day type="mon" draft="unconfirmed">Dwo</day>
+ <day type="tue" draft="unconfirmed">Ben</day>
+ <day type="wed" draft="unconfirmed">Wuk</day>
+ <day type="thu" draft="unconfirmed">Yaw</day>
+ <day type="fri" draft="unconfirmed">Fia</day>
+ <day type="sat" draft="unconfirmed">Mem</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Kwesida</day>
+ <day type="mon" draft="unconfirmed">Dwowda</day>
+ <day type="tue" draft="unconfirmed">Benada</day>
+ <day type="wed" draft="unconfirmed">Wukuda</day>
+ <day type="thu" draft="unconfirmed">Yawda</day>
+ <day type="fri" draft="unconfirmed">Fida</day>
+ <day type="sat" draft="unconfirmed">Memeneda</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">K</day>
+ <day type="mon" draft="unconfirmed">D</day>
+ <day type="tue" draft="unconfirmed">B</day>
+ <day type="wed" draft="unconfirmed">W</day>
+ <day type="thu" draft="unconfirmed">Y</day>
+ <day type="fri" draft="unconfirmed">F</day>
+ <day type="sat" draft="unconfirmed">M</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">AN</am>
+ <pm draft="unconfirmed">EW</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">Ansa Kristo</era>
+ <era type="1" draft="unconfirmed">Kristo Ekyiri</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">AK</era>
+ <era type="1" draft="unconfirmed">KE</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="GHC">
+ <displayName draft="unconfirmed">Sidi</displayName>
+ <symbol draft="unconfirmed">¢</symbol>
+ <symbol alt="variant" draft="unconfirmed">₵</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1" uri="http://www.omniglot.com/writing/akan.htm">Omniglot on Akan alphabet</reference>
+ <reference type="RP2" uri="http://kasa.ghanathink.org/akan/lg/languageGuide.htm">Akan Language Guide</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ak_GH.xml b/libs/Zend/Locale/Data/ak_GH.xml
new file mode 100755
index 0000000000..e804b18b9a
--- /dev/null
+++ b/libs/Zend/Locale/Data/ak_GH.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ak"/>
+ <territory type="GH"/>
+ </identity>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[a b d e É› f-i k-o É” p r-u w y]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" draft="unconfirmed">[c j q v z]</exemplarCharacters>
+ </characters>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/am.xml b/libs/Zend/Locale/Data/am.xml
new file mode 100755
index 0000000000..1e3d45987e
--- /dev/null
+++ b/libs/Zend/Locale/Data/am.xml
@@ -0,0 +1,1345 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.56.2.1 $"/>
+ <generation date="$Date: 2007/01/04 00:09:46 $"/>
+ <language type="am"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">አá‹áˆ­áŠ›</language>
+ <language type="ab">አብáˆá‹šáŠ›</language>
+ <language type="af">አáሪቃንስኛ</language>
+ <language type="af" alt="proposed-u121-3" draft="unconfirmed">አáሪካንስኛ</language>
+ <language type="am">አማርኛ</language>
+ <language type="ar">á‹áˆ­á‰¢áŠ›</language>
+ <language type="as">አሳሜዛዊ</language>
+ <language type="as" alt="proposed-u121-1" draft="unconfirmed">አሳሜá‹áŠ›</language>
+ <language type="ay">አያማርኛ</language>
+ <language type="az">አዜርባይጃንኛ</language>
+ <language type="ba">ባስኪርኛ</language>
+ <language type="ba" alt="proposed-u121-1" draft="unconfirmed">ባሽኪርኛ</language>
+ <language type="be">ቤላራሻኛ</language>
+ <language type="be" alt="proposed-u121-1" draft="unconfirmed">ቤላሩስኛ</language>
+ <language type="bg">ቡáˆáŒ‹áˆªáŠ›</language>
+ <language type="bh">ቢሃሪ</language>
+ <language type="bh" alt="proposed-u121-1" draft="unconfirmed">ቢኻሪኛ</language>
+ <language type="bi">ቢስላáˆáŠ›</language>
+ <language type="bn">በንጋሊኛ</language>
+ <language type="bo">ትበትንኛ</language>
+ <language type="bo" alt="proposed-u121-1" draft="unconfirmed">ቲቤቲኛ</language>
+ <language type="br">ብሬቶንኛ</language>
+ <language type="byn">ብሊን</language>
+ <language type="byn" alt="proposed-u121-1" draft="unconfirmed">ብሌንኛ</language>
+ <language type="ca">ካታላንኛ</language>
+ <language type="co">ኮርሲካኛ</language>
+ <language type="co" alt="proposed-u121-1" draft="unconfirmed">ክሮሽያኛ</language>
+ <language type="cs">ቼክኛ</language>
+ <language type="cy">ወáˆáˆ½</language>
+ <language type="da">ዴኒሽ</language>
+ <language type="da" alt="proposed-u121-1" draft="unconfirmed">ዴንሽኛ</language>
+ <language type="de">ጀርመን</language>
+ <language type="de" alt="proposed-u121-1" draft="unconfirmed">ጀርመንኛ</language>
+ <language type="dz">ድዞንáŒáŠ»áŠ›</language>
+ <language type="el">áŒáˆªáŠ­áŠ›</language>
+ <language type="en">እንáŒáˆŠá‹áŠ›</language>
+ <language type="eo">ኤስáራንቶ</language>
+ <language type="es">ስá“ኒሽ</language>
+ <language type="es" alt="proposed-u121-1" draft="unconfirmed">ስá“ኒሽኛ</language>
+ <language type="et">ኤስቶኒአን</language>
+ <language type="eu">ባስክኛ</language>
+ <language type="fa">áርሲያኛ</language>
+ <language type="fi">áŠáŠ’ሽ</language>
+ <language type="fj">áŠáŒ‚ኛ</language>
+ <language type="fo">á‹áˆ®áŠ›</language>
+ <language type="fr">áˆáˆ¨áŠ•áˆ³á‹­áŠ›</language>
+ <language type="fy">áሪስኛ</language>
+ <language type="ga">አይሪሽ</language>
+ <language type="gd">እስኮትስ ጌáˆáŠ­áŠ›</language>
+ <language type="gez">áŒá‹•á‹áŠ›</language>
+ <language type="gl">ጋለጋኛ</language>
+ <language type="gn">ጓራኒኛ</language>
+ <language type="gu">ጉጃርቲኛ</language>
+ <language type="ha">ሃá‹áˆ³áŠ›</language>
+ <language type="ha" alt="proposed-u121-1" draft="unconfirmed">ሃá‹áˆ³áŠ› (የናይጄሪያ ቋንቋ)</language>
+ <language type="he">ዕብራስጥ</language>
+ <language type="hi">áˆáŠ•á‹µáŠ›</language>
+ <language type="hr">ክሮሽያንኛ</language>
+ <language type="hu">ሀንጋሪኛ</language>
+ <language type="hy">አርመናዊ</language>
+ <language type="hy" alt="proposed-u121-1" draft="unconfirmed">አርመኒያኛ</language>
+ <language type="ia">ኢንቴርሊንጓ</language>
+ <language type="id">እንዶኒሲኛ</language>
+ <language type="ie">እንተርሊንáŒá‹ˆ</language>
+ <language type="ik">እኑá’ያቅኛ</language>
+ <language type="is">አይስላንድኛ</language>
+ <language type="it">ጣሊያንኛ</language>
+ <language type="iu">እኑክቲቱትኛ</language>
+ <language type="ja">ጃá“ንኛ</language>
+ <language type="jv">ጃቫንኛ</language>
+ <language type="ka">ጊዮርጊያን</language>
+ <language type="kk">ካዛክኛ</language>
+ <language type="kl">ካላሊሱትኛ</language>
+ <language type="km">ክመርኛ</language>
+ <language type="kn">ካናዳኛ</language>
+ <language type="ko">ኮሪያኛ</language>
+ <language type="ks">ካሽሚርኛ</language>
+ <language type="ku">ኩርድሽኛ</language>
+ <language type="ky">ኪርጊá‹áŠ›</language>
+ <language type="la">ላቲንኛ</language>
+ <language type="ln">ሊንጋላኛ</language>
+ <language type="lo">ላá‹áˆµáŠ›</language>
+ <language type="lt">ሊቱአኒያን</language>
+ <language type="lv">ላትቪያን</language>
+ <language type="mg">ማላጋስኛ</language>
+ <language type="mi">ማዮሪኛ</language>
+ <language type="mi" alt="proposed-u121-1" draft="unconfirmed">ማኦሪኛ</language>
+ <language type="mk">ማከዶኒኛ</language>
+ <language type="mk" alt="proposed-u121-1" draft="unconfirmed">ማኬኮኒአንኛ</language>
+ <language type="ml">ማላያላáˆáŠ›</language>
+ <language type="mn">ሞንጎላዊኛ</language>
+ <language type="mo">ሞáˆá‹³á‰«á‹ŠáŠ“</language>
+ <language type="mr">ማራዚኛ</language>
+ <language type="mr" alt="proposed-u121-1" draft="unconfirmed">ማራቲኛ</language>
+ <language type="ms">ማላይኛ</language>
+ <language type="mt">ማáˆá‰²áˆµáŠ›</language>
+ <language type="my">ቡርማኛ</language>
+ <language type="na">ናኡሩ</language>
+ <language type="na" alt="proposed-u121-1" draft="unconfirmed">ናኡሩኛ</language>
+ <language type="ne">ኔá“ሊኛ</language>
+ <language type="nl">ደች</language>
+ <language type="no">ኖርዌጂያን</language>
+ <language type="no" alt="proposed-u121-1" draft="unconfirmed">ኖርዌጅያንኛ</language>
+ <language type="oc">ኦኪታንኛ</language>
+ <language type="oc" alt="proposed-u121-1" draft="unconfirmed">ኦኪታንኛ (ከ1500 በኋላ)ᤠá•áˆ®á‰¬áŠ•áˆ³áˆáŠ›</language>
+ <language type="om">ኦሮáˆáŠ›</language>
+ <language type="or">ኦሪያኛ</language>
+ <language type="pa">á“ንጃቢኛ</language>
+ <language type="pl">á–ሊሽ</language>
+ <language type="ps">á‘ሽቶኛ</language>
+ <language type="pt">á–ርቱጋሊኛ</language>
+ <language type="qu">ኵቿኛ</language>
+ <language type="rm">ሮማንስ</language>
+ <language type="rm" alt="proposed-u121-1" draft="unconfirmed">ራኼቶ-ሮማንስኛ</language>
+ <language type="rn">ሩንዲኛ</language>
+ <language type="ro">ሮማኒያን</language>
+ <language type="ru">ራሽኛ</language>
+ <language type="rw">ኪንያርዋንድኛ</language>
+ <language type="sa">ሳንስክሪትኛ</language>
+ <language type="sd">ሲንድሂኛ</language>
+ <language type="sg">ሳንጎኛ</language>
+ <language type="si">ስንሃáˆáŠ›</language>
+ <language type="sid">ሲዳáˆáŠ›</language>
+ <language type="sk">ስሎቫክኛ</language>
+ <language type="sl">ስሎቪኛ</language>
+ <language type="sm">ሳሞአኛ</language>
+ <language type="sn">ሾናኛ</language>
+ <language type="so">ሱማáˆáŠ›</language>
+ <language type="sq">áˆá‰¤áŠ’ኛ</language>
+ <language type="sr">ሰርቢኛ</language>
+ <language type="ss">ስዋቲኛ</language>
+ <language type="st">ሶዞኛ</language>
+ <language type="su">ሱዳንኛ</language>
+ <language type="sv">ስዊድንኛ</language>
+ <language type="sw">ስዋሂሊኛ</language>
+ <language type="ta">ታሚáˆáŠ›</language>
+ <language type="te">ተሉጉኛ</language>
+ <language type="tg">ታጂኪኛ</language>
+ <language type="th">ታይኛ</language>
+ <language type="ti">ትáŒáˆ­áŠ›</language>
+ <language type="tig">ትáŒáˆ¨</language>
+ <language type="tk">ቱርክመንኛ</language>
+ <language type="tl">ታጋሎገኛ</language>
+ <language type="tn">ጽዋናዊኛ</language>
+ <language type="to">ቶንጋ</language>
+ <language type="tr">ቱርክኛ</language>
+ <language type="ts">ጾንጋኛ</language>
+ <language type="tt">ታታርኛ</language>
+ <language type="tw">ትዊኛ</language>
+ <language type="ug">ኡዊáŒáˆáˆ­áŠ›</language>
+ <language type="uk">ዩክረኒኛ</language>
+ <language type="ur">ኡርዱኛ</language>
+ <language type="uz">ኡá‹á‰ áŠ­áŠ›</language>
+ <language type="vi">ቪትናáˆáŠ›</language>
+ <language type="vo">ቮላá‘ክኛ</language>
+ <language type="wo">ዎሎáኛ</language>
+ <language type="xh">ዞሳኛ</language>
+ <language type="yi">ይዲሻዊኛ</language>
+ <language type="yo">ዮሩባዊኛ</language>
+ <language type="za">ዡዋንáŒáŠ›</language>
+ <language type="zh">ቻይንኛ</language>
+ <language type="zu">ዙሉኛ</language>
+ </languages>
+ <scripts>
+ <script type="Arab" draft="unconfirmed">አረቢክ</script>
+ <script type="Armn" draft="unconfirmed">የአርማኒያ áŠá‹°áˆ</script>
+ <script type="Beng" draft="unconfirmed">ቤንጃሊ</script>
+ <script type="Bopo" draft="unconfirmed">ቡá–ሞáŽ</script>
+ <script type="Brai" draft="unconfirmed">ብሬይáˆ</script>
+ <script type="Buhd" draft="unconfirmed">ቡሂድ</script>
+ <script type="Cans" draft="unconfirmed">የተዋáˆá‹± የካናዳ ጥንታዊ áˆáˆáŠ­á‰¶á‰½</script>
+ <script type="Cher" draft="unconfirmed">ቼሮኪ</script>
+ <script type="Copt" draft="unconfirmed">ኮá•á‰²áŠ­</script>
+ <script type="Cprt" draft="unconfirmed">ሲá•áˆªáŠ¦á‰µ</script>
+ <script type="Cyrl" draft="unconfirmed">ሲርሊክ</script>
+ <script type="Deva" draft="unconfirmed">ዴቫናጋሪ</script>
+ <script type="Dsrt" draft="unconfirmed">ዴዘረት</script>
+ <script type="Ethi" draft="unconfirmed">áŠá‹°áˆ</script>
+ <script type="Geor" draft="unconfirmed">የጆርጂያ áŠá‹°áˆ</script>
+ <script type="Goth" draft="unconfirmed">áŒá‰²áŠ­</script>
+ <script type="Grek" draft="unconfirmed">áŒáˆªáŠ­</script>
+ <script type="Gujr" draft="unconfirmed">ጉጃራቲ</script>
+ <script type="Guru" draft="unconfirmed">ጉርሙኪ</script>
+ <script type="Hang" draft="unconfirmed">ሀንጉáˆ</script>
+ <script type="Hani" draft="unconfirmed">ሀን</script>
+ <script type="Hano" draft="unconfirmed">ሀኑኦ</script>
+ <script type="Hans" draft="unconfirmed">ቀላሠሀን</script>
+ <script type="Hant" draft="unconfirmed">ባሕላዊ ሀን</script>
+ <script type="Hebr" draft="unconfirmed">እብራይስጥ</script>
+ <script type="Hira" draft="unconfirmed">ሂራጋና</script>
+ <script type="Hrkt" draft="unconfirmed">ካታካና ወይንሠሂራጋና</script>
+ <script type="Kana" draft="unconfirmed">ክአታካና</script>
+ <script type="Khmr" draft="unconfirmed">ካኽሜር</script>
+ <script type="Knda" draft="unconfirmed">ካናዳ</script>
+ <script type="Laoo" draft="unconfirmed">ላኦ</script>
+ <script type="Latn" draft="unconfirmed">ላቲን</script>
+ <script type="Limb" draft="unconfirmed">ሊáˆá‰¡</script>
+ <script type="Lina" draft="unconfirmed">ሊኒያር ኤ</script>
+ <script type="Linb" draft="unconfirmed">ሊኒያር ቢ</script>
+ <script type="Mlym" draft="unconfirmed">ማላያላáˆ</script>
+ <script type="Mong" draft="unconfirmed">የሞንጎሊያ áŠá‹°áˆ</script>
+ <script type="Mymr" draft="unconfirmed">ሚአንማር</script>
+ <script type="Ogam" draft="unconfirmed">ኦáŒáˆ€áˆ</script>
+ <script type="Orya" draft="unconfirmed">ኦሪያ</script>
+ <script type="Osma" draft="unconfirmed">ኦስማኒያ</script>
+ <script type="Qaai" draft="unconfirmed">የተወረሰ</script>
+ <script type="Runr" draft="unconfirmed">ሩኒክ</script>
+ <script type="Shaw" draft="unconfirmed">የሻቪያ áŠá‹°áˆ</script>
+ <script type="Sinh" draft="unconfirmed">ሲንሃላ</script>
+ <script type="Syrc" draft="unconfirmed">ሲሪክ</script>
+ <script type="Tagb" draft="unconfirmed">ትአáŒá‰£áŠ•á‹‹</script>
+ <script type="Tale" draft="unconfirmed">ታኢ ለ</script>
+ <script type="Talu" draft="unconfirmed">አዲስ ታኢ ሉ</script>
+ <script type="Taml" draft="unconfirmed">ታሚáˆ</script>
+ <script type="Telu" draft="unconfirmed">ቴሉጉ</script>
+ <script type="Tglg" draft="unconfirmed">ታጋሎáŒ</script>
+ <script type="Thaa" draft="unconfirmed">ታኸና</script>
+ <script type="Thai" draft="unconfirmed">ታኢ</script>
+ <script type="Tibt" draft="unconfirmed">ቲቤታን</script>
+ <script type="Ugar" draft="unconfirmed">ኡጋሪቲክ</script>
+ <script type="Vaii" draft="unconfirmed">ቫይ</script>
+ <script type="Yiii" draft="unconfirmed">ዪ</script>
+ </scripts>
+ <territories>
+ <territory type="001" draft="unconfirmed">ዓለáˆ</territory>
+ <territory type="002" draft="unconfirmed">አáሪካ</territory>
+ <territory type="005" draft="unconfirmed">ደቡባዊ አሜሪካ</territory>
+ <territory type="009" draft="unconfirmed">ኦሽኒያ</territory>
+ <territory type="011" draft="unconfirmed">áˆá‹•áˆ«á‰£á‹Š አáሪካ</territory>
+ <territory type="013" draft="unconfirmed">መካከለኛ አሜሪካ [013]</territory>
+ <territory type="014" draft="unconfirmed">áˆáˆµáˆ«á‰ƒá‹Š አáሪካ</territory>
+ <territory type="015" draft="unconfirmed">ሰሜናዊ አáሪካ</territory>
+ <territory type="017" draft="unconfirmed">መካከለኛ አáሪካ</territory>
+ <territory type="018" draft="unconfirmed">ደቡባዊ አáሪካ</territory>
+ <territory type="019" draft="unconfirmed">አሜሪካዎች</territory>
+ <territory type="021" draft="unconfirmed">ሰሜናዊ አሜሪካ</territory>
+ <territory type="029" draft="unconfirmed">ካሪቢያን</territory>
+ <territory type="030" draft="unconfirmed">ደቡብ-áˆáˆ¥áˆ«á‰ƒá‹Š እስያ [030]</territory>
+ <territory type="034" draft="unconfirmed">áˆáˆ¥áˆ«á‰ƒá‹Š እስያ</territory>
+ <territory type="035" draft="unconfirmed">ደቡብ-áˆáˆ¥áˆ«á‰ƒá‹Š እስያ [035]</territory>
+ <territory type="039" draft="unconfirmed">ደቡባዊ አá‹áˆ®á“</territory>
+ <territory type="053" draft="unconfirmed">አá‹áˆµá‰µáˆ«áˆŠá‹« እና ኒዠዚላንድ</territory>
+ <territory type="054" draft="unconfirmed">ሜላኔሲያ</territory>
+ <territory type="057" draft="unconfirmed">ሚክሮኔዢያ [057]</territory>
+ <territory type="061" draft="unconfirmed">á–ሊኔዢያ</territory>
+ <territory type="142" draft="unconfirmed">እስያ</territory>
+ <territory type="143" draft="unconfirmed">መካከለኛ አሜሪካ [143]</territory>
+ <territory type="145" draft="unconfirmed">áˆá‹•áˆ«á‰£á‹Š እስያ</territory>
+ <territory type="150" draft="unconfirmed">አá‹áˆ®á“</territory>
+ <territory type="151" draft="unconfirmed">áˆáˆµáˆ«á‰ƒá‹Š አá‹áˆ®á“</territory>
+ <territory type="154" draft="unconfirmed">ሰሜናዊ አá‹áˆ®á“</territory>
+ <territory type="155" draft="unconfirmed">áˆá‹•áˆ«á‰£á‹Š አá‹áˆ®á“</territory>
+ <territory type="AD">አንዶራ</territory>
+ <territory type="AE">የተባበሩት አረብ ኤáˆáˆ¬á‰µáˆµ</territory>
+ <territory type="AF" draft="unconfirmed">አáጋኒስታን</territory>
+ <territory type="AG" draft="unconfirmed">አንቲጓ እና ባሩዳ</territory>
+ <territory type="AI" draft="unconfirmed">አንጉኢላ</territory>
+ <territory type="AL">አáˆá‰£áŠ’á‹«</territory>
+ <territory type="AM">አርሜኒያ</territory>
+ <territory type="AN">ኔዘርላንድስ አንቲáˆáˆµ</territory>
+ <territory type="AO" draft="unconfirmed">አንáŒáˆ‹</territory>
+ <territory type="AQ" draft="unconfirmed">አንታርክቲካ</territory>
+ <territory type="AR">አርጀንቲና</territory>
+ <territory type="AS" draft="unconfirmed">የአሜሪካ ሳሞአ</territory>
+ <territory type="AT">ኦስትሪያ</territory>
+ <territory type="AU">አá‹áˆµá‰µáˆ¬áˆŠá‹«</territory>
+ <territory type="AW" draft="unconfirmed">አሩባ</territory>
+ <territory type="AX" draft="unconfirmed">የአላንድ ደሴቶች</territory>
+ <territory type="AZ">አዘርባጃን</territory>
+ <territory type="BA">ቦስኒያ እና ሄርዞጎቪኒያ</territory>
+ <territory type="BB">ባርቤዶስ</territory>
+ <territory type="BD" draft="unconfirmed">ባንáŒáˆ‹á‹²áˆ½</territory>
+ <territory type="BE">ቤáˆáŒ„áˆ</territory>
+ <territory type="BF" draft="unconfirmed">ቡርኪና á‹áˆ¶</territory>
+ <territory type="BG">ቡáˆáŒŒáˆªá‹«</territory>
+ <territory type="BH">ባህሬን</territory>
+ <territory type="BI" draft="unconfirmed">ብሩንዲ</territory>
+ <territory type="BJ" draft="unconfirmed">ቤኒን</territory>
+ <territory type="BM">ቤርሙዳ</territory>
+ <territory type="BN" draft="unconfirmed">ብሩኒ</territory>
+ <territory type="BO">ቦሊቪያ</territory>
+ <territory type="BR">ብራዚáˆ</territory>
+ <territory type="BS" draft="unconfirmed">ባሃማስ</territory>
+ <territory type="BT">ቡህታን</territory>
+ <territory type="BV" draft="unconfirmed">የቦá‹á‰¬á‰µ ደሴት</territory>
+ <territory type="BW" draft="unconfirmed">ቦትስዋና</territory>
+ <territory type="BY">ቤላሩስ</territory>
+ <territory type="BZ">ቤሊዘ</territory>
+ <territory type="CA" draft="unconfirmed">ካናዳ</territory>
+ <territory type="CC" draft="unconfirmed">ኮኮስ ኬሊንጠደሴቶች</territory>
+ <territory type="CD">ኮንጎ</territory>
+ <territory type="CF">የመካከለኛዠአáሪካ ሪáብሊክ</territory>
+ <territory type="CG" draft="unconfirmed">ኮንáŒ</territory>
+ <territory type="CH">ስዊዘርላንድ</territory>
+ <territory type="CI" draft="unconfirmed">ኮት ዲቯር</territory>
+ <territory type="CK" draft="unconfirmed">ኩክ ደሴቶች</territory>
+ <territory type="CL">ቺሊ</territory>
+ <territory type="CM">ካሜሩን</territory>
+ <territory type="CN">ቻይና</territory>
+ <territory type="CO">ኮሎáˆá‰¢á‹«</territory>
+ <territory type="CR" draft="unconfirmed">ኮስታ ሪካ</territory>
+ <territory type="CS" draft="unconfirmed">ሰርቢያ</territory>
+ <territory type="CU" draft="unconfirmed">ኩባ</territory>
+ <territory type="CV">ኬᕠቬርዴ</territory>
+ <territory type="CX" draft="unconfirmed">የገና ደሴቶች</territory>
+ <territory type="CY">ሳይá•áˆ¨áˆµ</territory>
+ <territory type="CZ">ቼክ ሪá‘ብሊክ</territory>
+ <territory type="DE">ጀርመን</territory>
+ <territory type="DJ" draft="unconfirmed">ጂቡቲ</territory>
+ <territory type="DK">ዴንማርክ</territory>
+ <territory type="DM">ዶሚኒካ</territory>
+ <territory type="DO">ዶሚኒክ ሪá‘ብሊክ</territory>
+ <territory type="DZ">አáˆáŒ„ሪያ</territory>
+ <territory type="EC">ኢኳዶር</territory>
+ <territory type="EE">ኤስቶኒያ</territory>
+ <territory type="EG">áŒá‰¥áŒ½</territory>
+ <territory type="EH">áˆá‹•áˆ«á‰£á‹Š ሳህራ</territory>
+ <territory type="ER">ኤርትራ</territory>
+ <territory type="ES">ስá”ን</territory>
+ <territory type="ET">ኢትዮጵያ</territory>
+ <territory type="FI">áŠáŠ•áˆ‹áŠ•á‹µ</territory>
+ <territory type="FJ">áŠáŒ‚</territory>
+ <territory type="FK" draft="unconfirmed">የáŽáˆáŠ­áˆ‹áŠ•á‹µ ደሴቶች</territory>
+ <territory type="FM">ሚክሮኔዢያ</territory>
+ <territory type="FO" draft="unconfirmed">የá‹áˆ®á‹­ ደሴቶች</territory>
+ <territory type="FR" draft="unconfirmed">áˆáˆ¨áŠ•áˆ³á‹­</territory>
+ <territory type="GA" draft="unconfirmed">ጋቦን</territory>
+ <territory type="GB">እንáŒáˆŠá‹</territory>
+ <territory type="GD" draft="unconfirmed">áŒáˆ¬áŠ“ዳ</territory>
+ <territory type="GE">ጆርጂያ</territory>
+ <territory type="GF">የáˆáˆ¨áŠ•áˆ³á‹­ ጉዊአና</territory>
+ <territory type="GH" draft="unconfirmed">ጋና</territory>
+ <territory type="GI" draft="unconfirmed">ጊብራáˆá‰³áˆ­</territory>
+ <territory type="GL" draft="unconfirmed">áŒáˆªáŠ•áˆ‹áŠ•á‹µ</territory>
+ <territory type="GM">ጋáˆá‰¢á‹«</territory>
+ <territory type="GN">ጊኒ</territory>
+ <territory type="GP" draft="unconfirmed">ጉዋደሉá•</territory>
+ <territory type="GQ">ኢኳቶሪያሠጊኒ</territory>
+ <territory type="GR">áŒáˆªáŠ­</territory>
+ <territory type="GS" draft="unconfirmed">ደቡብ ጆርጂያ እና የደቡድ ሳንድዊች ደሴቶች</territory>
+ <territory type="GT" draft="unconfirmed">ጉዋቲማላ</territory>
+ <territory type="GU" draft="unconfirmed">ጉዋáˆ</territory>
+ <territory type="GW">ቢሳዎ</territory>
+ <territory type="GY">ጉያና</territory>
+ <territory type="HK" draft="unconfirmed">ሆንጠኮንáŒ</territory>
+ <territory type="HM" draft="unconfirmed">የኧርድ እና የማክዶናáˆá‹µ ደሴቶች</territory>
+ <territory type="HN" draft="unconfirmed">ሆንዱራስ</territory>
+ <territory type="HR">ክሮኤሽያ</territory>
+ <territory type="HT">ሀይቲ</territory>
+ <territory type="HU">ሀንጋሪ</territory>
+ <territory type="ID">ኢንዶኔዢያ</territory>
+ <territory type="IE">አየርላንድ</territory>
+ <territory type="IL">እስራኤáˆ</territory>
+ <territory type="IN">ህንድ</territory>
+ <territory type="IO" draft="unconfirmed">የብሪታኒያ ህንድ á‹á‰‚ያኖስ áŒá‹›á‰µ</territory>
+ <territory type="IQ">ኢራቅ</territory>
+ <territory type="IR" draft="unconfirmed">ኢራን</territory>
+ <territory type="IS">አይስላንድ</territory>
+ <territory type="IT">ጣሊያን</territory>
+ <territory type="JM">ጃማይካ</territory>
+ <territory type="JO">ጆርዳን</territory>
+ <territory type="JP">ጃá“ን</territory>
+ <territory type="KE" draft="unconfirmed">ኬንያ</territory>
+ <territory type="KH">ካáˆá‰¦á‹²á‹«</territory>
+ <territory type="KI" draft="unconfirmed">ኪሪባቲ</territory>
+ <territory type="KM">ኮሞሮስ</territory>
+ <territory type="KN" draft="unconfirmed">ቅዱስ ኪትስ እና ኔቪስ</territory>
+ <territory type="KP" alt="proposed-u121-1" draft="unconfirmed">ሰሜን ኮሪያ</territory>
+ <territory type="KR" alt="proposed-u121-1" draft="unconfirmed">ደቡብ ኮሪያ</territory>
+ <territory type="KW">ክዌት</territory>
+ <territory type="KY" draft="unconfirmed">ካይማን ደሴቶች</territory>
+ <territory type="LA" draft="unconfirmed">ላኦስ</territory>
+ <territory type="LB">ሊባኖስ</territory>
+ <territory type="LC" draft="unconfirmed">ሴንት ሉቺያ</territory>
+ <territory type="LI" draft="unconfirmed">ሊችተንስታይን</territory>
+ <territory type="LK" draft="unconfirmed">ሲሪላንካ</territory>
+ <territory type="LR" draft="unconfirmed">ላይቤሪያ</territory>
+ <territory type="LS" draft="unconfirmed">ሌሶቶ</territory>
+ <territory type="LT">ሊቱዌኒያ</territory>
+ <territory type="LU" draft="unconfirmed">ሉክሰáˆá‰ áˆ­áŒ</territory>
+ <territory type="LV">ላትቪያ</territory>
+ <territory type="LY">ሊቢያ</territory>
+ <territory type="MA">ሞሮኮ</territory>
+ <territory type="MC" draft="unconfirmed">ሞናኮ</territory>
+ <territory type="MD">ሞáˆá‹¶á‰«</territory>
+ <territory type="MG" draft="unconfirmed">ማዳጋስካር</territory>
+ <territory type="MH" draft="unconfirmed">ማርሻሠአይላንድ</territory>
+ <territory type="MK">ማከዶኒያ</territory>
+ <territory type="ML" draft="unconfirmed">ማሊ</territory>
+ <territory type="MM" draft="unconfirmed">ማያንማር</territory>
+ <territory type="MN">ሞንጎሊያ</territory>
+ <territory type="MO" draft="unconfirmed">ማካዎ</territory>
+ <territory type="MP" draft="unconfirmed">የሰሜናዊ ማሪያና ደሴቶች</territory>
+ <territory type="MQ" draft="unconfirmed">ማርቲኒክ</territory>
+ <territory type="MR">ሞሪቴኒያ</territory>
+ <territory type="MS" draft="unconfirmed">ሞንትሴራት</territory>
+ <territory type="MT">ማáˆá‰³</territory>
+ <territory type="MU">ማሩሸስ</territory>
+ <territory type="MV" draft="unconfirmed">ማáˆá‹²á‰­áˆµ</territory>
+ <territory type="MW" draft="unconfirmed">ማላዊ</territory>
+ <territory type="MX">ሜክሲኮ</territory>
+ <territory type="MY">ማሌዢያ</territory>
+ <territory type="MZ" draft="unconfirmed">ሞዛáˆá‰¢áŠ­</territory>
+ <territory type="NA">ናሚቢያ</territory>
+ <territory type="NC">ኒዠካሌዶኒያ</territory>
+ <territory type="NE" draft="unconfirmed">ኒጀር</territory>
+ <territory type="NF" draft="unconfirmed">ኖርáŽáˆáŠ­ ደሴት</territory>
+ <territory type="NG">ናይጄሪያ</territory>
+ <territory type="NI" draft="unconfirmed">ኒካራጓ</territory>
+ <territory type="NL">ኔዘርላንድ</territory>
+ <territory type="NO">ኖርዌ</territory>
+ <territory type="NP">ኔá“áˆ</territory>
+ <territory type="NR" draft="unconfirmed">ናኡሩ</territory>
+ <territory type="NU" draft="unconfirmed">ኒኡይ</territory>
+ <territory type="NZ">ኒዠዚላንድ</territory>
+ <territory type="OM" draft="unconfirmed">ኦማን</territory>
+ <territory type="PA" draft="unconfirmed">á“ናማ</territory>
+ <territory type="PE">á”ሩ</territory>
+ <territory type="PF">የáˆáˆ¨áŠ•áˆ³á‹­ á–ሊኔዢያ</territory>
+ <territory type="PG">á“á‘á‹‹ ኒዠጊኒ</territory>
+ <territory type="PH" draft="unconfirmed">áŠáˆŠá’ንስ</territory>
+ <territory type="PK" draft="unconfirmed">á“ኪስታን</territory>
+ <territory type="PL">á–ላንድ</territory>
+ <territory type="PM" draft="unconfirmed">ቅዱስ á’ዬር እና ሚኩኤሎን</territory>
+ <territory type="PN" draft="unconfirmed">á’ትካኢርን</territory>
+ <territory type="PR">á–ርታ ሪኮ</territory>
+ <territory type="PS" draft="unconfirmed">የááˆáˆµáŒ¤áˆ áŒá‹›á‰µ</territory>
+ <territory type="PT" draft="unconfirmed">á–ርቱጋáˆ</territory>
+ <territory type="PW" draft="unconfirmed">á“ላá‹</territory>
+ <territory type="PY" draft="unconfirmed">á“ራጓይ</territory>
+ <territory type="QA" draft="unconfirmed">ኳታር</territory>
+ <territory type="QO" draft="unconfirmed">ወጣ ያለ ኦሽኒያ</territory>
+ <territory type="RE" draft="unconfirmed">ሪዩኒየን</territory>
+ <territory type="RO">ሮሜኒያ</territory>
+ <territory type="RU">ራሺያ</territory>
+ <territory type="RW" draft="unconfirmed">ሩዋንዳ</territory>
+ <territory type="SA">ሳá‹á‹µáŠ áˆ¨á‰¢á‹«</territory>
+ <territory type="SB" draft="unconfirmed">ሰሎሞን ደሴት</territory>
+ <territory type="SC" draft="unconfirmed">ሲሼáˆáˆµ</territory>
+ <territory type="SD">ሱዳን</territory>
+ <territory type="SE">ስዊድን</territory>
+ <territory type="SG">ሲንጋá–ር</territory>
+ <territory type="SH" draft="unconfirmed">ሴንት ሄለና</territory>
+ <territory type="SI">ስሎቬኒያ</territory>
+ <territory type="SJ" draft="unconfirmed">የስቫáˆá‰£áˆ­á‹µ እና ዣን ማየን ደሴቶች</territory>
+ <territory type="SK">ስሎቫኪያ</territory>
+ <territory type="SL" draft="unconfirmed">ሴራሊዮን</territory>
+ <territory type="SM" draft="unconfirmed">ሳን ማሪኖ</territory>
+ <territory type="SN">ሴኔጋáˆ</territory>
+ <territory type="SO">ሱማሌ</territory>
+ <territory type="SR" draft="unconfirmed">ሱሪናáˆ</territory>
+ <territory type="ST" draft="unconfirmed">ሳኦ ቶሜ እና á•áˆªáŠ•áˆ²á”</territory>
+ <territory type="SV" draft="unconfirmed">ኤሠሳáˆá‰«á‹¶áˆ­</territory>
+ <territory type="SY">ሲሪያ</territory>
+ <territory type="SZ" draft="unconfirmed">ሱዋዚላንድ</territory>
+ <territory type="TC" draft="unconfirmed">የቱርኮችና የካኢኮስ ደሴቶች</territory>
+ <territory type="TD">ቻድ</territory>
+ <territory type="TF">የáˆáˆ¨áŠ•áˆ³á‹­ ደቡባዊ áŒá‹›á‰¶á‰½</territory>
+ <territory type="TG" draft="unconfirmed">ቶáŒ</territory>
+ <territory type="TH">ታይላንድ</territory>
+ <territory type="TJ">ታጃኪስታን</territory>
+ <territory type="TK" draft="unconfirmed">ቶክላá‹</territory>
+ <territory type="TL">áˆáˆµáˆ«á‰… ቲሞር</territory>
+ <territory type="TM" draft="unconfirmed">ቱርክሜኒስታን</territory>
+ <territory type="TN">ቱኒዚያ</territory>
+ <territory type="TO" draft="unconfirmed">ቶንጋ</territory>
+ <territory type="TR">ቱርክ</territory>
+ <territory type="TT">ትሪኒዳድ እና ቶባጎ</territory>
+ <territory type="TV" draft="unconfirmed">ቱቫሉ</territory>
+ <territory type="TW" draft="unconfirmed">ታይዋን</territory>
+ <territory type="TZ">ታንዛኒያ</territory>
+ <territory type="UA" draft="unconfirmed">ዩክሬን</territory>
+ <territory type="UG">ዩጋንዳ</territory>
+ <territory type="UM" draft="unconfirmed">የአሜሪካ ራቅ ያሉ አናሳ ደሴቶች</territory>
+ <territory type="US">አሜሪካ</territory>
+ <territory type="UY" draft="unconfirmed">ኡራጓይ</territory>
+ <territory type="UZ">á‹©á‹á‰ áŠªáˆµá‰³áŠ•</territory>
+ <territory type="VA" draft="unconfirmed">ቫቲካን</territory>
+ <territory type="VC" draft="unconfirmed">ቅዱስ ቪንሴንት እና áŒáˆ¬áŠ“ዲንስ</territory>
+ <territory type="VE">ቬንዙዌላ</territory>
+ <territory type="VG">የእንáŒáˆŠá‹ ድንáŒáˆ ደሴቶች</territory>
+ <territory type="VI">የአሜሪካ ቨርጂን ደሴቶች</territory>
+ <territory type="VN" draft="unconfirmed">ቬትናáˆ</territory>
+ <territory type="VU" draft="unconfirmed">ቫኑአቱ</territory>
+ <territory type="WF" draft="unconfirmed">ዋሊስ እና á‰á‰±áŠ“ ደሴቶች</territory>
+ <territory type="WS" draft="unconfirmed">ሳሞአ</territory>
+ <territory type="YE">የመን</territory>
+ <territory type="YT" draft="unconfirmed">ሜይኦቴ</territory>
+ <territory type="ZA">ደቡብ አáሪካ</territory>
+ <territory type="ZM">á‹›áˆá‰¢á‹«</territory>
+ <territory type="ZW" draft="unconfirmed">á‹šáˆá‰§á‰¤</territory>
+ </territories>
+ <keys>
+ <key type="calendar" draft="unconfirmed">የቀን መá‰áŒ áˆªá‹«</key>
+ <key type="collation" draft="unconfirmed">የጽሑáŽá‰½ ንá…á…ር</key>
+ <key type="currency" draft="unconfirmed">ገንዘብ</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation" draft="unconfirmed">የቻይና ባህላዊ ቅደሠተከተሠ(Big5)</type>
+ <type type="buddhist" key="calendar" draft="unconfirmed">የቡድሠየቀን መá‰áŒ áˆªá‹«</type>
+ <type type="chinese" key="calendar" draft="unconfirmed">የቻይና የቀን መá‰áŒ áˆªá‹«</type>
+ <type type="direct" key="collation" draft="unconfirmed">ቀጥታ የቃላት ንá…á…ር</type>
+ <type type="gb2312han" key="collation" draft="unconfirmed">የቀለሠያለ ቻይንኛ (GB2312) ቅደሠተከተáˆ</type>
+ <type type="gregorian" key="calendar" draft="unconfirmed">የáŒáˆªáŒáˆª የቀን መá‰áŒ áˆªá‹«</type>
+ <type type="hebrew" key="calendar" draft="unconfirmed">የእብራይስጥ የቀን መá‰áŒ áˆªá‹«</type>
+ <type type="islamic" key="calendar" draft="unconfirmed">የእስላሠየቀን መá‰áŒ áˆªá‹«</type>
+ <type type="islamic-civil" key="calendar" draft="unconfirmed">የእስላሠሕá‹á‰£á‹Š የቀን መá‰áŒ áˆªá‹«</type>
+ <type type="japanese" key="calendar" draft="unconfirmed">የጃá“ን የቀን መá‰áŒ áˆªá‹«</type>
+ <type type="phonebook" key="collation" draft="unconfirmed">የስáˆáŠ­ ማá‹áŒ« ቅደሠተከተáˆ</type>
+ <type type="pinyin" key="collation" draft="unconfirmed">የá’ንዪን ቅደሠተከተáˆ</type>
+ <type type="stroke" key="collation" draft="unconfirmed">የጭረት/የመቀቢያ ቅደሠተከተáˆ</type>
+ <type type="traditional" key="collation" draft="unconfirmed">ባህላዊ ቅደሠተከተáˆ</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="metric" draft="unconfirmed">ሜትሪክ</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[០ሀ-ሆ ለ-ቆ ቈ ቊ-በበ-ኆ ኈ ኊ-አáŠ-ኮ ኰ ኲ-ኵ ኸ-ኾ ወ-á‹Ž á‹-á‹– ዘ-á‹· ጀ-ጎ ጠጒ-ጕ ጠ-áš]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" draft="unconfirmed">[áŽ-᎙ ሇ ⶀ ᎀ-ᎃ â¶-ⶄ ቇ á‰-ቖ ቘ ቚ-በᎄ-ᎇ ⶅ-ⶇ ኇ ⶈ-ⶊ ኯ á‹€ á‹‚-á‹… ዠⶋ ⶌ ዸ-á‹¿ ⶠⶎ ጠጘ-ጟ ⶓ-ⶖ â¶-ⶑ ᎈ-Ꭰⶒ ⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ â·€-â·† â·ˆ-â·Ž â·-â·– â·˜-â·ž]</exemplarCharacters>
+ <exemplarCharacters alt="proposed-u121-2" draft="unconfirmed">[០ᡠá£-á§ á¢ á  á¨ á²-á¼ á©-ᱠሀ-ሆ ለ-ቆ ቈ ቊ-በበ-ኆ ኈ ኊ-አáŠ-ኮ ኰ ኲ-ኵ ኸ-ኾ ወ-á‹Ž á‹-á‹– ዘ-á‹· ጀ-ጎ ጠጒ-ጕ ጠ-áš]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">«</quotationStart>
+ <quotationEnd draft="unconfirmed">»</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">‹</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">›</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="coptic">
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">á‹“/á‹“</era>
+ <era type="1" draft="unconfirmed">á‹“/áˆ</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ <calendar type="ethiopic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">መስከ</month>
+ <month type="2" draft="unconfirmed">ጥቅáˆ</month>
+ <month type="3" draft="unconfirmed">ኅዳር</month>
+ <month type="4" draft="unconfirmed">ታኅሣ</month>
+ <month type="5" draft="unconfirmed">ጥር</month>
+ <month type="6" draft="unconfirmed">የካቲ</month>
+ <month type="7" draft="unconfirmed">መጋቢ</month>
+ <month type="8" draft="unconfirmed">ሚያá‹</month>
+ <month type="9" draft="unconfirmed">áŒáŠ•á‰¦</month>
+ <month type="10" draft="unconfirmed">ሰኔ</month>
+ <month type="11" draft="unconfirmed">áˆáˆáˆŒ</month>
+ <month type="12" draft="unconfirmed">áŠáˆáˆ´</month>
+ <month type="13" draft="unconfirmed">ጳጉሜ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">መስከረáˆ</month>
+ <month type="2" draft="unconfirmed">ጥቅáˆá‰µ</month>
+ <month type="3" draft="unconfirmed">ኅዳር</month>
+ <month type="4" draft="unconfirmed">ታኅሣሥ</month>
+ <month type="5" draft="unconfirmed">ጥር</month>
+ <month type="6" draft="unconfirmed">የካቲት</month>
+ <month type="7" draft="unconfirmed">መጋቢት</month>
+ <month type="8" draft="unconfirmed">ሚያá‹á‹«</month>
+ <month type="9" draft="unconfirmed">áŒáŠ•á‰¦á‰µ</month>
+ <month type="10" draft="unconfirmed">ሰኔ</month>
+ <month type="11" draft="unconfirmed">áˆáˆáˆŒ</month>
+ <month type="12" draft="unconfirmed">áŠáˆáˆ´</month>
+ <month type="13" draft="unconfirmed">ጳጉሜን</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">ጃንዩ</month>
+ <month type="2">áŒá‰¥áˆ©</month>
+ <month type="3">ማርች</month>
+ <month type="4">ኤá•áˆ¨</month>
+ <month type="5">ሜይ</month>
+ <month type="6">áŒáŠ•</month>
+ <month type="7">áŒáˆ‹á‹­</month>
+ <month type="8">ኦገስ</month>
+ <month type="9">ሴá•á‰´</month>
+ <month type="10">ኦክተ</month>
+ <month type="11">ኖቬáˆ</month>
+ <month type="12">ዲሴáˆ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">ጃንዩወሪ</month>
+ <month type="2">áŒá‰¥áˆ©á‹ˆáˆª</month>
+ <month type="3">ማርች</month>
+ <month type="4">ኤá•áˆ¨áˆ</month>
+ <month type="5">ሜይ</month>
+ <month type="6">áŒáŠ•</month>
+ <month type="7">áŒáˆ‹á‹­</month>
+ <month type="8">ኦገስት</month>
+ <month type="9">ሴá•á‰´áˆá‰ áˆ­</month>
+ <month type="10">ኦክተá‹á‰ áˆ­</month>
+ <month type="11">ኖቬáˆá‰ áˆ­</month>
+ <month type="12">ዲሴáˆá‰ áˆ­</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">ጃ</month>
+ <month type="2" draft="unconfirmed">áŒ</month>
+ <month type="3" draft="unconfirmed">ማ</month>
+ <month type="4" draft="unconfirmed">ኤ</month>
+ <month type="5" draft="unconfirmed">ሜ</month>
+ <month type="6" draft="unconfirmed">áŒ</month>
+ <month type="7" draft="unconfirmed">áŒ</month>
+ <month type="8" draft="unconfirmed">ኦ</month>
+ <month type="9" draft="unconfirmed">ሴ</month>
+ <month type="10" draft="unconfirmed">ኦ</month>
+ <month type="11" draft="unconfirmed">ኖ</month>
+ <month type="12" draft="unconfirmed">ዲ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">እሑድ</day>
+ <day type="mon">ሰኞ</day>
+ <day type="tue">ማክሰ</day>
+ <day type="wed">ረቡዕ</day>
+ <day type="thu">áˆáˆ™áˆµ</day>
+ <day type="fri">ዓርብ</day>
+ <day type="sat">ቅዳሜ</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">እሑድ</day>
+ <day type="mon">ሰኞ</day>
+ <day type="tue">ማክሰኞ</day>
+ <day type="wed">ረቡዕ</day>
+ <day type="thu">áˆáˆ™áˆµ</day>
+ <day type="fri">ዓርብ</day>
+ <day type="sat">ቅዳሜ</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">እ</day>
+ <day type="mon" draft="unconfirmed">ሰ</day>
+ <day type="tue" draft="unconfirmed">ማ</day>
+ <day type="wed" draft="unconfirmed">ረ</day>
+ <day type="thu" draft="unconfirmed">áˆ</day>
+ <day type="fri" draft="unconfirmed">á‹“</day>
+ <day type="sat" draft="unconfirmed">ቅ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">ጡዋት</am>
+ <pm draft="unconfirmed">ከሰዓት</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">á‹“/á‹“</era>
+ <era type="1">á‹“/áˆ</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEEᣠMMMM dd ቀን yyyy G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">MMMM d yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">MMM d yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">MMMM d</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName draft="unconfirmed">ዘመን</displayName>
+ </field>
+ <field type="year">
+ <displayName draft="unconfirmed">ዓመት</displayName>
+ </field>
+ <field type="month">
+ <displayName draft="unconfirmed">ወር</displayName>
+ </field>
+ <field type="week">
+ <displayName draft="unconfirmed">ሳáˆáŠ•á‰µ</displayName>
+ </field>
+ <field type="day">
+ <displayName draft="unconfirmed">ቀን</displayName>
+ </field>
+ <field type="hour">
+ <displayName draft="unconfirmed">ሰዓት</displayName>
+ </field>
+ <field type="minute">
+ <displayName draft="unconfirmed">ደቂቃ</displayName>
+ </field>
+ </fields>
+ </calendar>
+ <calendar type="islamic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">ሙሀረáˆ</month>
+ <month type="2" draft="unconfirmed">ሳáˆáˆ­</month>
+ <month type="3" draft="unconfirmed">ረቢዑሠአወáˆ</month>
+ <month type="4" draft="unconfirmed">ረቢዑሠአኺር</month>
+ <month type="5" draft="unconfirmed">ጀማደሠአወáˆ</month>
+ <month type="6" draft="unconfirmed">ጀማደሠአኺር</month>
+ <month type="7" draft="unconfirmed">ረጀብ</month>
+ <month type="8" draft="unconfirmed">ሻእባን</month>
+ <month type="9" draft="unconfirmed">ረመዳን</month>
+ <month type="10" draft="unconfirmed">ሸዋáˆ</month>
+ <month type="11" draft="unconfirmed">á‹™áˆá‰‚ዳህ</month>
+ <month type="12" draft="unconfirmed">á‹™áˆáˆ‚ጃህ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HHmm;-HHmm</hourFormat>
+ <zone type="Africa/Timbuktu">
+ <exemplarCity draft="unconfirmed">ቲáˆá‰¡áŠ­á‰±</exemplarCity>
+ </zone>
+ <zone type="Europe/Belfast">
+ <exemplarCity draft="unconfirmed">ቤáˆá‹áˆµá‰µ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Yap">
+ <exemplarCity draft="unconfirmed">á‹«á•</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Rothera">
+ <exemplarCity draft="unconfirmed">ሮተራ</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Palmer">
+ <exemplarCity draft="unconfirmed">á“áˆáˆ˜áˆ­</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity draft="unconfirmed">South_Pole</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Syowa">
+ <exemplarCity draft="unconfirmed">ስዮዋ</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Mawson">
+ <exemplarCity draft="unconfirmed">ማá‹áˆ°áŠ•</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Davis">
+ <exemplarCity draft="unconfirmed">ዴቪስ</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Vostok">
+ <exemplarCity draft="unconfirmed">ቮስቱክ</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Casey">
+ <exemplarCity draft="unconfirmed">ቼሲ</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity draft="unconfirmed">ዱሞንትዱርቪáˆ</exemplarCity>
+ </zone>
+ <zone type="Antarctica/McMurdo">
+ <exemplarCity draft="unconfirmed">ማክሙርዶ</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Rio_Gallegos">
+ <exemplarCity draft="unconfirmed">Rio_Gallegos</exemplarCity>
+ </zone>
+ <zone type="America/Mendoza">
+ <exemplarCity draft="unconfirmed">ሜንዶዛ</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/San_Juan">
+ <exemplarCity draft="unconfirmed">San_Juan</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/La_Rioja">
+ <exemplarCity draft="unconfirmed">La_Rioja</exemplarCity>
+ </zone>
+ <zone type="America/Catamarca">
+ <exemplarCity draft="unconfirmed">ካታማርካ</exemplarCity>
+ </zone>
+ <zone type="America/Jujuy">
+ <exemplarCity draft="unconfirmed">áŒáŒá‹­</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity draft="unconfirmed">ኮርዶባ</exemplarCity>
+ </zone>
+ <zone type="America/Buenos_Aires">
+ <exemplarCity draft="unconfirmed">ቡኤኖስ-ኤይሪስ</exemplarCity>
+ </zone>
+ <zone type="Australia/Perth">
+ <exemplarCity draft="unconfirmed">á•áˆ­á‹</exemplarCity>
+ </zone>
+ <zone type="Australia/Darwin">
+ <exemplarCity draft="unconfirmed">ዳርዊን</exemplarCity>
+ </zone>
+ <zone type="Australia/Adelaide">
+ <exemplarCity draft="unconfirmed">አዴላኢደ</exemplarCity>
+ </zone>
+ <zone type="Australia/Broken_Hill">
+ <exemplarCity draft="unconfirmed">ብሮከን ሂáˆ</exemplarCity>
+ </zone>
+ <zone type="Australia/Melbourne">
+ <exemplarCity draft="unconfirmed">ሜáˆá‰¦áŠ¡áˆ˜</exemplarCity>
+ </zone>
+ <zone type="Australia/Hobart">
+ <exemplarCity draft="unconfirmed">ሆባርት</exemplarCity>
+ </zone>
+ <zone type="Australia/Lindeman">
+ <exemplarCity draft="unconfirmed">ሊንደማን</exemplarCity>
+ </zone>
+ <zone type="Australia/Sydney">
+ <exemplarCity draft="unconfirmed">ሲድኒ</exemplarCity>
+ </zone>
+ <zone type="Australia/Brisbane">
+ <exemplarCity draft="unconfirmed">ቢሪስባን</exemplarCity>
+ </zone>
+ <zone type="Australia/Lord_Howe">
+ <exemplarCity draft="unconfirmed">ሎርድ ሆዌ</exemplarCity>
+ </zone>
+ <zone type="America/Eirunepe">
+ <exemplarCity draft="unconfirmed">ኢሩኔá•</exemplarCity>
+ </zone>
+ <zone type="America/Rio_Branco">
+ <exemplarCity draft="unconfirmed">ሪኦ ብራንኮ</exemplarCity>
+ </zone>
+ <zone type="America/Porto_Velho">
+ <exemplarCity draft="unconfirmed">á–ርቶ ቨáˆáˆ†</exemplarCity>
+ </zone>
+ <zone type="America/Boa_Vista">
+ <exemplarCity draft="unconfirmed">ቦአ ቪስታ</exemplarCity>
+ </zone>
+ <zone type="America/Manaus">
+ <exemplarCity draft="unconfirmed">ማናኡስ</exemplarCity>
+ </zone>
+ <zone type="America/Cuiaba">
+ <exemplarCity draft="unconfirmed">ኩባ</exemplarCity>
+ </zone>
+ <zone type="America/Campo_Grande">
+ <exemplarCity draft="unconfirmed">Campo_Grande</exemplarCity>
+ </zone>
+ <zone type="America/Belem">
+ <exemplarCity draft="unconfirmed">በለáˆ</exemplarCity>
+ </zone>
+ <zone type="America/Araguaina">
+ <exemplarCity draft="unconfirmed">አራጉአኢና</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity draft="unconfirmed">ሳኦ á“á‹áˆŽ</exemplarCity>
+ </zone>
+ <zone type="America/Bahia">
+ <exemplarCity draft="unconfirmed">America/Bahia</exemplarCity>
+ </zone>
+ <zone type="America/Fortaleza">
+ <exemplarCity draft="unconfirmed">áŽáˆ­á‰³áˆˆá‹›</exemplarCity>
+ </zone>
+ <zone type="America/Maceio">
+ <exemplarCity draft="unconfirmed">ማቺዎ</exemplarCity>
+ </zone>
+ <zone type="America/Recife">
+ <exemplarCity draft="unconfirmed">ሪሲá‹á‹­</exemplarCity>
+ </zone>
+ <zone type="America/Noronha">
+ <exemplarCity draft="unconfirmed">ኖሮሃ</exemplarCity>
+ </zone>
+ <zone type="America/Dawson">
+ <exemplarCity draft="unconfirmed">ዳá‹áˆ°áŠ•</exemplarCity>
+ </zone>
+ <zone type="America/Whitehorse">
+ <exemplarCity draft="unconfirmed">áˆá‹‹á‹­á‰µáˆ†áˆ­áˆµ</exemplarCity>
+ </zone>
+ <zone type="America/Vancouver">
+ <exemplarCity draft="unconfirmed">ቫንኩቨር</exemplarCity>
+ </zone>
+ <zone type="America/Dawson_Creek">
+ <exemplarCity draft="unconfirmed">ዳá‹áˆ°áŠ• ክሪክ</exemplarCity>
+ </zone>
+ <zone type="America/Yellowknife">
+ <exemplarCity draft="unconfirmed">የሎá‹áŠ“á‹­á</exemplarCity>
+ </zone>
+ <zone type="America/Inuvik">
+ <exemplarCity draft="unconfirmed">ኢኑቪክ</exemplarCity>
+ </zone>
+ <zone type="America/Edmonton">
+ <exemplarCity draft="unconfirmed">ኤድመንተን</exemplarCity>
+ </zone>
+ <zone type="America/Swift_Current">
+ <exemplarCity draft="unconfirmed">ስዊáት ከረንት</exemplarCity>
+ </zone>
+ <zone type="America/Cambridge_Bay">
+ <exemplarCity draft="unconfirmed">ካáˆá‰¥áˆªáŒ… ቤይ</exemplarCity>
+ </zone>
+ <zone type="America/Regina">
+ <exemplarCity draft="unconfirmed">ሬጂና</exemplarCity>
+ </zone>
+ <zone type="America/Winnipeg">
+ <exemplarCity draft="unconfirmed">ዊኒá”áŒ</exemplarCity>
+ </zone>
+ <zone type="America/Rainy_River">
+ <exemplarCity draft="unconfirmed">ሬኒ ሪቨር</exemplarCity>
+ </zone>
+ <zone type="America/Rankin_Inlet">
+ <exemplarCity draft="unconfirmed">ራንኪን ኢንሌት</exemplarCity>
+ </zone>
+ <zone type="America/Thunder_Bay">
+ <exemplarCity draft="unconfirmed">ተንደር ቤይ</exemplarCity>
+ </zone>
+ <zone type="America/Nipigon">
+ <exemplarCity draft="unconfirmed">ኒá’ጎን</exemplarCity>
+ </zone>
+ <zone type="America/Toronto">
+ <exemplarCity draft="unconfirmed">ቶሮንቶ</exemplarCity>
+ </zone>
+ <zone type="America/Montreal">
+ <exemplarCity draft="unconfirmed">ሞንትሪያáˆ</exemplarCity>
+ </zone>
+ <zone type="America/Iqaluit">
+ <exemplarCity draft="unconfirmed">ኢካሊኡት</exemplarCity>
+ </zone>
+ <zone type="America/Pangnirtung">
+ <exemplarCity draft="unconfirmed">á“ንáŒáŠ’ርቱንáŒ</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <exemplarCity draft="unconfirmed">ሀሊá‹áŠ­áˆµ</exemplarCity>
+ </zone>
+ <zone type="America/Goose_Bay">
+ <exemplarCity draft="unconfirmed">ጉዠቤይ</exemplarCity>
+ </zone>
+ <zone type="America/Glace_Bay">
+ <exemplarCity draft="unconfirmed">áŒáˆŒáˆµ ቤይ</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <exemplarCity draft="unconfirmed">ሴንት ጆንስ</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity draft="unconfirmed">ኪንሻሳ</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity draft="unconfirmed">ሉቡáˆá‰£áˆº</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity draft="unconfirmed">ኢስተር</exemplarCity>
+ </zone>
+ <zone type="America/Santiago">
+ <exemplarCity draft="unconfirmed">ሳንቲያጎ</exemplarCity>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity draft="unconfirmed">ካሽጋር</exemplarCity>
+ </zone>
+ <zone type="Asia/Urumqi">
+ <exemplarCity draft="unconfirmed">ኡሩáˆáŠª</exemplarCity>
+ </zone>
+ <zone type="Asia/Chongqing">
+ <exemplarCity draft="unconfirmed">ቾንáŒáŠªáŠ•áŒ</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity draft="unconfirmed">ሻንጋይ</exemplarCity>
+ </zone>
+ <zone type="Asia/Harbin">
+ <exemplarCity draft="unconfirmed">ባርቢን</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity draft="unconfirmed">ጋላá“ጎስ</exemplarCity>
+ </zone>
+ <zone type="America/Guayaquil">
+ <exemplarCity draft="unconfirmed">ጓያኪáˆ</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity draft="unconfirmed">ካናሪ</exemplarCity>
+ </zone>
+ <zone type="Africa/Ceuta">
+ <exemplarCity draft="unconfirmed">ኬá‹á‰³</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity draft="unconfirmed">ማርድሪድ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Truk">
+ <exemplarCity draft="unconfirmed">ትሩክ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Ponape">
+ <exemplarCity draft="unconfirmed">á–ኔá•</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kosrae">
+ <exemplarCity draft="unconfirmed">ኮስራይ</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity draft="unconfirmed">ሎንዶን</exemplarCity>
+ </zone>
+ <zone type="America/Thule">
+ <exemplarCity draft="unconfirmed">ቱለ</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity draft="unconfirmed">áŒá‹µá‰³áŠ½á‰¥</exemplarCity>
+ </zone>
+ <zone type="America/Scoresbysund">
+ <exemplarCity draft="unconfirmed">ስኮረስቢሱንድ</exemplarCity>
+ </zone>
+ <zone type="America/Danmarkshavn">
+ <exemplarCity draft="unconfirmed">ዴንማርክ</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity draft="unconfirmed">ጃካርታ</exemplarCity>
+ </zone>
+ <zone type="Asia/Pontianak">
+ <exemplarCity draft="unconfirmed">á–ንቲአንካ</exemplarCity>
+ </zone>
+ <zone type="Asia/Makassar">
+ <exemplarCity draft="unconfirmed">ማካሳር</exemplarCity>
+ </zone>
+ <zone type="Asia/Jayapura">
+ <exemplarCity draft="unconfirmed">ጃያá‘ራ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Enderbury">
+ <exemplarCity draft="unconfirmed">እንደርቡርይ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kiritimati">
+ <exemplarCity draft="unconfirmed">ኪሪቲማቲ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tarawa">
+ <exemplarCity draft="unconfirmed">ታራዋ</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtau">
+ <exemplarCity draft="unconfirmed">አክታá‹</exemplarCity>
+ </zone>
+ <zone type="Asia/Oral">
+ <exemplarCity draft="unconfirmed">ኦራáˆ</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtobe">
+ <exemplarCity draft="unconfirmed">አክቶቤ</exemplarCity>
+ </zone>
+ <zone type="Asia/Qyzylorda">
+ <exemplarCity draft="unconfirmed">ኪá‹á‹«áˆŽáˆ­á‹³</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity draft="unconfirmed">አáˆáˆ›á‰²</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kwajalein">
+ <exemplarCity draft="unconfirmed">ክዋጃላይን</exemplarCity>
+ </zone>
+ <zone type="Pacific/Majuro">
+ <exemplarCity draft="unconfirmed">ማáŒáˆ®</exemplarCity>
+ </zone>
+ <zone type="Africa/Bamako">
+ <exemplarCity draft="unconfirmed">ባማኮ</exemplarCity>
+ </zone>
+ <zone type="Asia/Hovd">
+ <exemplarCity draft="unconfirmed">ሆቭድ</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity draft="unconfirmed">ኡላንባታር</exemplarCity>
+ </zone>
+ <zone type="Asia/Choibalsan">
+ <exemplarCity draft="unconfirmed">ቾይባáˆáˆ³áŠ•</exemplarCity>
+ </zone>
+ <zone type="America/Tijuana">
+ <exemplarCity draft="unconfirmed">ቲáŒáŠ áŠ“</exemplarCity>
+ </zone>
+ <zone type="America/Hermosillo">
+ <exemplarCity draft="unconfirmed">ሄርሞሲሎ</exemplarCity>
+ </zone>
+ <zone type="America/Mazatlan">
+ <exemplarCity draft="unconfirmed">ማዛቲአን</exemplarCity>
+ </zone>
+ <zone type="America/Chihuahua">
+ <exemplarCity draft="unconfirmed">ቺኽዋኽዋ</exemplarCity>
+ </zone>
+ <zone type="America/Monterrey">
+ <exemplarCity draft="unconfirmed">ሞንተሪ</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity draft="unconfirmed">ሜክሲኮ ሲቲ</exemplarCity>
+ </zone>
+ <zone type="America/Merida">
+ <exemplarCity draft="unconfirmed">ሜሪዳ</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity draft="unconfirmed">ካንኩን</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuala_Lumpur">
+ <exemplarCity draft="unconfirmed">ኳላáˆáˆá‘ር</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuching">
+ <exemplarCity draft="unconfirmed">ኩቺንáŒ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Chatham">
+ <exemplarCity draft="unconfirmed">ቻትሃáˆ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Auckland">
+ <exemplarCity draft="unconfirmed">ኦክላንድ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity draft="unconfirmed">ታሂቲ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Marquesas">
+ <exemplarCity draft="unconfirmed">ማሩኩሳስ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Gambier">
+ <exemplarCity draft="unconfirmed">ጋáˆá‰£á‹¨áˆ­</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity draft="unconfirmed">አዞረስ</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Madeira">
+ <exemplarCity draft="unconfirmed">ማዴኢራ</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity draft="unconfirmed">ሊስቦን</exemplarCity>
+ </zone>
+ <zone type="Europe/Kaliningrad">
+ <exemplarCity draft="unconfirmed">ካሊኒንጋርድ</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity draft="unconfirmed">ማስኮ</exemplarCity>
+ </zone>
+ <zone type="Europe/Samara">
+ <exemplarCity draft="unconfirmed">ሳማራ</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity draft="unconfirmed">የካተሪንበርáŒ</exemplarCity>
+ </zone>
+ <zone type="Asia/Omsk">
+ <exemplarCity draft="unconfirmed">ኦáˆáˆµáŠ­</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity draft="unconfirmed">ኖቮሲቢርስክ</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity draft="unconfirmed">ክራስኖያሽክ</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity draft="unconfirmed">ኢርኩትስክ</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity draft="unconfirmed">ያኩትስክ</exemplarCity>
+ </zone>
+ <zone type="Asia/Vladivostok">
+ <exemplarCity draft="unconfirmed">ቭላዲቮስቱክ</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity draft="unconfirmed">ሳክሃሊን</exemplarCity>
+ </zone>
+ <zone type="Asia/Magadan">
+ <exemplarCity draft="unconfirmed">ማጋዳን</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity draft="unconfirmed">ካáˆá‰»á‰µáŠ«</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity draft="unconfirmed">አናዲር</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Jan_Mayen">
+ <exemplarCity draft="unconfirmed">Jan_Mayen</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity draft="unconfirmed">ኡá‹áŒŽáˆ©á‹µ</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity draft="unconfirmed">ካይቭ</exemplarCity>
+ </zone>
+ <zone type="Europe/Simferopol">
+ <exemplarCity draft="unconfirmed">ሲáˆáˆáˆ®á–áˆ</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity draft="unconfirmed">á‹›á–ሮá‹áˆ‚á‹­</exemplarCity>
+ </zone>
+ <zone type="Pacific/Midway">
+ <exemplarCity draft="unconfirmed">ሚድዌ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Johnston">
+ <exemplarCity draft="unconfirmed">ጆንስቶን</exemplarCity>
+ </zone>
+ <zone type="Pacific/Wake">
+ <exemplarCity draft="unconfirmed">ዌክ</exemplarCity>
+ </zone>
+ <zone type="America/Adak">
+ <exemplarCity draft="unconfirmed">አዳክ</exemplarCity>
+ </zone>
+ <zone type="America/Nome">
+ <exemplarCity draft="unconfirmed">ኖሜ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <exemplarCity draft="unconfirmed">ሆኖሉሉ</exemplarCity>
+ </zone>
+ <zone type="America/Anchorage">
+ <exemplarCity draft="unconfirmed">አንኮራጅ</exemplarCity>
+ </zone>
+ <zone type="America/Yakutat">
+ <exemplarCity draft="unconfirmed">ያኩታት</exemplarCity>
+ </zone>
+ <zone type="America/Juneau">
+ <exemplarCity draft="unconfirmed">áŒáŠáŠ áŠ¡</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <exemplarCity draft="unconfirmed">ሎስ አንጀለስ</exemplarCity>
+ </zone>
+ <zone type="America/Boise">
+ <exemplarCity draft="unconfirmed">ቦይስ</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <exemplarCity draft="unconfirmed">áŽáŠ”ክስ</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <exemplarCity draft="unconfirmed">ዴንቨር</exemplarCity>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity draft="unconfirmed">መካከáˆ</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <exemplarCity draft="unconfirmed">ቺካáŒ</exemplarCity>
+ </zone>
+ <zone type="America/Menominee">
+ <exemplarCity draft="unconfirmed">መኖሚኔ</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Knox">
+ <exemplarCity draft="unconfirmed">ክኖክስ</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Marengo">
+ <exemplarCity draft="unconfirmed">ማሬንጎ</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <exemplarCity draft="unconfirmed">ኢንዲያናá–ሊስ</exemplarCity>
+ </zone>
+ <zone type="America/Louisville">
+ <exemplarCity draft="unconfirmed">ሉዊስቪለ</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vevay">
+ <exemplarCity draft="unconfirmed">ቬቫይ</exemplarCity>
+ </zone>
+ <zone type="America/Kentucky/Monticello">
+ <exemplarCity draft="unconfirmed">ሞንቲሴሎ</exemplarCity>
+ </zone>
+ <zone type="America/Detroit">
+ <exemplarCity draft="unconfirmed">ዲትሮይት</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <exemplarCity draft="unconfirmed">ኒá‹á‹®áˆ­áŠ­</exemplarCity>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity draft="unconfirmed">ሳማርካንድ</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity draft="unconfirmed">ታሽኬንት</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <patternDigit draft="unconfirmed">á‰</patternDigit>
+ </symbols>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">የብራዚሠሪáˆ</displayName>
+ <symbol draft="unconfirmed">R$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="unconfirmed">የቻይና ዩአን ረንሚንቢ</displayName>
+ <symbol draft="unconfirmed">Y</symbol>
+ </currency>
+ <currency type="ETB">
+ <displayName draft="unconfirmed">የኢትዮጵያ ብር</displayName>
+ <symbol draft="unconfirmed">ብር</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="unconfirmed">ዩሮ</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">የእንáŒáˆŠá‹ á“á‹áŠ•á‹µ ስተርሊንáŒ</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">የሕንድ ሩá’</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="unconfirmed">የጃá“ን የን</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">የራሻ ሩብáˆ</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">የአሜሪካን ዶላር</displayName>
+ <symbol draft="unconfirmed">USD</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">አዎን:y</yesstr>
+ <nostr draft="unconfirmed">አይ:n</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1">አáˆáˆ³áˆ‰ አክሊሉ, አማርኛ - እንáŒáˆŠá‹áŠ› መá‹áŒˆá‰  ቃላት Amharic-English Dictionary, ኩራዠአሳታሚ ድርጅት, አዲስ አበባ, ሰኔ 1979EC</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/am_ET.xml b/libs/Zend/Locale/Data/am_ET.xml
new file mode 100755
index 0000000000..d4c3166f86
--- /dev/null
+++ b/libs/Zend/Locale/Data/am_ET.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="am"/>
+ <territory type="ET"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="af" draft="unconfirmed">አáሪካንስኛ</language>
+ </languages>
+ </localeDisplayNames>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <pm>ከሳዓት</pm>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEEᣠdd MMMM ቀን yyyy G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="USD">
+ <symbol>US$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ar.xml b/libs/Zend/Locale/Data/ar.xml
new file mode 100755
index 0000000000..693932466a
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar.xml
@@ -0,0 +1,2772 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.68 $"/>
+ <generation date="$Date: 2006/06/28 21:28:03 $"/>
+ <language type="ar"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">الأÙارية</language>
+ <language type="ab">الأبخازية</language>
+ <language type="ace">الأتشينيزية</language>
+ <language type="ach">الأكولية</language>
+ <language type="ada">الأدانجمية</language>
+ <language type="ady">الأديجه</language>
+ <language type="ae">الأÙستية</language>
+ <language type="af">الأÙريقية</language>
+ <language type="afa">الأÙرو آسيوية - أخرى</language>
+ <language type="afh">الأÙريهيلية</language>
+ <language type="ain">الآينوية</language>
+ <language type="ak">الأكانية</language>
+ <language type="akk">الأكادية</language>
+ <language type="ale">الأليوتية</language>
+ <language type="alg">اللغات الأمريكية الهندية</language>
+ <language type="alt">الألطائية الجنوبية</language>
+ <language type="am">الأمهرية</language>
+ <language type="an">الأراجونية</language>
+ <language type="ang">الانجليزية القديمة</language>
+ <language type="apa">اللغات الأباتشية</language>
+ <language type="ar">العربية</language>
+ <language type="arc">الآرامية</language>
+ <language type="arn">الأروكانية</language>
+ <language type="arp">الأراباهو</language>
+ <language type="art">الصناعية - أخرى</language>
+ <language type="arw">الأراواكية</language>
+ <language type="as">الأسامية</language>
+ <language type="ast">الأسترية</language>
+ <language type="ath">اللغات الأزباسكانية</language>
+ <language type="aus">اللغات الأسترالية</language>
+ <language type="av">الأÙاريكية</language>
+ <language type="awa">الأوادية</language>
+ <language type="ay">الأيمارا</language>
+ <language type="az">الأذرية</language>
+ <language type="ba">الباشكيرية</language>
+ <language type="bad">الباندا</language>
+ <language type="bai">اللغات الباميليكية</language>
+ <language type="bal">البلوشية</language>
+ <language type="ban">اللغة البالية</language>
+ <language type="bas">الباسا</language>
+ <language type="bat">البلطيقية - أخرى</language>
+ <language type="be">البيلوروسية</language>
+ <language type="bej">البيجا</language>
+ <language type="bem">البيمبا</language>
+ <language type="ber">البربرية</language>
+ <language type="bg">البلغارية</language>
+ <language type="bh">البيهارية</language>
+ <language type="bho">البهوجبرية</language>
+ <language type="bi">البيسلامية</language>
+ <language type="bik">البيكولية</language>
+ <language type="bin">البينية</language>
+ <language type="bla">السيكسيكية</language>
+ <language type="bm">البامبارا</language>
+ <language type="bn">البنغالية</language>
+ <language type="bnt">البانتو</language>
+ <language type="bo">التبتية</language>
+ <language type="br">البريتونية</language>
+ <language type="bra">البراجية</language>
+ <language type="bs">البوسنية</language>
+ <language type="btk">الباتاكية</language>
+ <language type="bua">البرياتية</language>
+ <language type="bug">البجينيزية</language>
+ <language type="byn">البلينية</language>
+ <language type="ca">الكاتالوينية</language>
+ <language type="cad">الكادو</language>
+ <language type="cai">الهندية الأمريكية الوسطى - أخرى</language>
+ <language type="car">الكاريبية</language>
+ <language type="cau">القوقازية - أخرى</language>
+ <language type="ce">الشيشانية</language>
+ <language type="ceb">السيبيونو</language>
+ <language type="cel">السلتية - أخرى</language>
+ <language type="ch">التشامورو</language>
+ <language type="chb">التشيبشا</language>
+ <language type="chg">التشاجاتاى</language>
+ <language type="chk">التشكيزية</language>
+ <language type="chn">الشينوك جارجون</language>
+ <language type="cho">الشوكتو</language>
+ <language type="chp">الشيباوايان</language>
+ <language type="chr">الشيروكى</language>
+ <language type="chy">الشايان</language>
+ <language type="cmc">اللغات التشاميكية</language>
+ <language type="co">الكورسيكية</language>
+ <language type="cop">قبطية</language>
+ <language type="cpe">الكرييولى Ùˆ اللغات المبسطة الأخرى للتÙاهم بين الشعوب على أساس الأنجليزية</language>
+ <language type="cpf">الكرييولى Ùˆ اللغات المبسطة الأخرى للتÙاهم بين الشعوب على أساس الÙرنسية</language>
+ <language type="cpp">الكرييولى Ùˆ اللغات المبسطة الأخرى للتÙاهم بين الشعوب على أساس البرتغالية</language>
+ <language type="cr">الكرى</language>
+ <language type="crh">تركى كريمين، لغة توركية كريمينية</language>
+ <language type="crp">الكرييولى Ùˆ اللغات المبسطة الأخرى للتÙاهم بين الشعوب - أخرى</language>
+ <language type="cs">التشيكية</language>
+ <language type="csb">الكاشبايان</language>
+ <language type="cu">سلاÙية كنسية</language>
+ <language type="cus">الكشيتيك - أخرى</language>
+ <language type="cv">التشÙاش</language>
+ <language type="cy">الولزية</language>
+ <language type="da">الدانماركية</language>
+ <language type="dak">الداكوتا</language>
+ <language type="dar">الدارجوا</language>
+ <language type="day">الدياك</language>
+ <language type="de">الألمانية</language>
+ <language type="del">الديلوير</language>
+ <language type="dgr">الدوجريب</language>
+ <language type="din">الدنكا</language>
+ <language type="doi">الدوجرى</language>
+ <language type="dra">الدراÙيدين - أخرى</language>
+ <language type="dsb">الصربية السÙلى</language>
+ <language type="dua">الديولا</language>
+ <language type="dum">الهولندية الوسطى</language>
+ <language type="dv">المالديÙية</language>
+ <language type="dyu">الدايلا</language>
+ <language type="dz">الزونخاية</language>
+ <language type="efi">الاÙيك</language>
+ <language type="egy">المصرية القديمة</language>
+ <language type="eka">الاكاجك</language>
+ <language type="el">اليونانية</language>
+ <language type="elx">الامايت</language>
+ <language type="en">الانجليزية</language>
+ <language type="enm">الانجليزية الوسطى</language>
+ <language type="eo">اسبرانتو</language>
+ <language type="es">الأسبانية</language>
+ <language type="et">الأستونية</language>
+ <language type="eu">لغة الباسك</language>
+ <language type="ewo">الايوندو</language>
+ <language type="fa">الÙارسية</language>
+ <language type="fan">الÙانج</language>
+ <language type="fat">الÙانتى</language>
+ <language type="ff">الÙلة</language>
+ <language type="fi">الÙنلندية</language>
+ <language type="fil">الÙلبينية</language>
+ <language type="fiu">Ùينو أجرايان - أخرى</language>
+ <language type="fj">الÙيجية</language>
+ <language type="fo">الÙارويز</language>
+ <language type="fon">الÙون</language>
+ <language type="fr">الÙرنسية</language>
+ <language type="frm">الÙرنسية الوسطى</language>
+ <language type="fro">الÙرنسية القديمة</language>
+ <language type="fur">الÙريلايان</language>
+ <language type="fy">الÙريزيان</language>
+ <language type="ga">الأيرلندية</language>
+ <language type="gay">الجايو</language>
+ <language type="gba">الجبيا</language>
+ <language type="gd">الغيلية الأسكتلندية</language>
+ <language type="gem">الجرمانية (أخرى)</language>
+ <language type="gez">الجيز</language>
+ <language type="gil">لغة أهل جبل طارق</language>
+ <language type="gl">الجاليكية</language>
+ <language type="gmh">الألمانية العليا الوسطى</language>
+ <language type="gn">الجوارانى</language>
+ <language type="goh">الألمانية العليا القديمة</language>
+ <language type="gon">الجندى</language>
+ <language type="gor">الجورونتالو</language>
+ <language type="got">الجرمانية</language>
+ <language type="grb">الجريبو</language>
+ <language type="grc">اليونانية القديمة</language>
+ <language type="gu">الغوجاراتية</language>
+ <language type="gv">المنكية</language>
+ <language type="ha">الهوسا</language>
+ <language type="hai">الهيدا</language>
+ <language type="haw">لغة أهل الهاواى</language>
+ <language type="he">العبرية</language>
+ <language type="hi">الهندية</language>
+ <language type="hil">الهيليجينون</language>
+ <language type="him">الهيماتشالى</language>
+ <language type="hit">الحثية</language>
+ <language type="hmn">الهمونجية</language>
+ <language type="ho">الهيرى موتو</language>
+ <language type="hr">الكرواتية</language>
+ <language type="hsb">الصربية العليا</language>
+ <language type="ht">الهايتية</language>
+ <language type="hu">الهنغارية</language>
+ <language type="hup">الهبا</language>
+ <language type="hy">الأرمينية</language>
+ <language type="hz">الهيريرو</language>
+ <language type="ia">اللّغة الوسيطة</language>
+ <language type="iba">الايبان</language>
+ <language type="id">الأندونيسية</language>
+ <language type="ie">الانترلينج</language>
+ <language type="ig">الايجبو</language>
+ <language type="ii">السيتشيون يى</language>
+ <language type="ijo">الايجو</language>
+ <language type="ik">الاينبياك</language>
+ <language type="ilo">الايلوكو</language>
+ <language type="inc">الهندية - أخرى</language>
+ <language type="ine">الهندية الأوروبية - أخرى</language>
+ <language type="inh">الانجوشية</language>
+ <language type="io">الايدو</language>
+ <language type="ira">الايرانية</language>
+ <language type="iro">اللغات الايروكويانية</language>
+ <language type="is">الأيسلاندية</language>
+ <language type="it">الايطالية</language>
+ <language type="iu">الاينكتيتت</language>
+ <language type="ja">اليابانية</language>
+ <language type="jbo">اللوجبان</language>
+ <language type="jpr">الجيدو الÙارسى</language>
+ <language type="jrb">الجيدو العربى</language>
+ <language type="jv">الجاوية</language>
+ <language type="ka">الجورجية</language>
+ <language type="kaa">الكارا-كالباك</language>
+ <language type="kab">القبيلية</language>
+ <language type="kac">الكاتشين</language>
+ <language type="kam">الكامبا</language>
+ <language type="kar">الكاريين</language>
+ <language type="kaw">الكوى</language>
+ <language type="kbd">الكاباردايان</language>
+ <language type="kg">الكونغو</language>
+ <language type="khi">الخويسان - أخرى</language>
+ <language type="kho">الخوتانيز</language>
+ <language type="ki">الكيكيو</language>
+ <language type="kj">الكيونياما</language>
+ <language type="kk">الكازاخستانية</language>
+ <language type="kl">الكالاليست</language>
+ <language type="km">الخميرية</language>
+ <language type="kmb">الكيمبندو</language>
+ <language type="kn">الكانادا</language>
+ <language type="ko">الكورية</language>
+ <language type="kok">الكونكانية</language>
+ <language type="kos">الكوسراين</language>
+ <language type="kpe">الكبيل</language>
+ <language type="kr">الكانيورى</language>
+ <language type="krc">الكاراتشاى-بالكار</language>
+ <language type="kro">الكرو</language>
+ <language type="ks">الكاشميرية</language>
+ <language type="ku">الكردية</language>
+ <language type="kum">الكميك</language>
+ <language type="kut">الكتيناى</language>
+ <language type="kv">الكومى</language>
+ <language type="kw">الكورنية</language>
+ <language type="ky">القيرغستانية</language>
+ <language type="la">اللاتينية</language>
+ <language type="lad">الاسباعبرية</language>
+ <language type="lah">اللاهندا</language>
+ <language type="lam">اللامبا</language>
+ <language type="lb">اللوكسمبرجية</language>
+ <language type="lez">الليزجهايانية</language>
+ <language type="lg">الجاندا</language>
+ <language type="li">الليمبرجيشية</language>
+ <language type="ln">اللينجالا</language>
+ <language type="lo">اللاوية</language>
+ <language type="lol">المنغولية [lol]</language>
+ <language type="loz">اللوزى</language>
+ <language type="lt">اللتوانية</language>
+ <language type="lu">اللبا-كاتانجا</language>
+ <language type="lua">اللبا-لؤلؤ</language>
+ <language type="lui">اللوسينو</language>
+ <language type="lun">اللوندا</language>
+ <language type="luo">اللو</language>
+ <language type="lus">اللشاى</language>
+ <language type="lv">اللاتÙية</language>
+ <language type="mad">المادريز</language>
+ <language type="mag">الماجا</language>
+ <language type="mak">الماكاسار</language>
+ <language type="man">الماندينغ</language>
+ <language type="map">الأوسترونيسيان</language>
+ <language type="mas">الماساي</language>
+ <language type="mdf">الموكشا</language>
+ <language type="mdr">الماندار</language>
+ <language type="men">الميند</language>
+ <language type="mg">المالاجاشية</language>
+ <language type="mga">الأيرلندية الوسطى</language>
+ <language type="mh">المارشالية</language>
+ <language type="mi">الماورية</language>
+ <language type="mic">الميكماكيونية</language>
+ <language type="min">المينانجكاباو</language>
+ <language type="mis">اللغات المتنوعة</language>
+ <language type="mk">المقدونية</language>
+ <language type="mkh">المون خمير- أخرى</language>
+ <language type="ml">الماليالام</language>
+ <language type="mn">المنغولية</language>
+ <language type="mnc">المانشو</language>
+ <language type="mni">المانيبرى</language>
+ <language type="mno">لغات مانوبو</language>
+ <language type="mo">المولدوÙية</language>
+ <language type="moh">الموهوك</language>
+ <language type="mr">الماراثى</language>
+ <language type="ms">لغة الملايو</language>
+ <language type="mt">المالطية</language>
+ <language type="mul">اللغات المتعددة</language>
+ <language type="mun">لغات المندا</language>
+ <language type="mwl">الميرانديز</language>
+ <language type="mwr">الماروارى</language>
+ <language type="my">البورمية</language>
+ <language type="myn">لغات المايا</language>
+ <language type="myv">اللغة الارزية</language>
+ <language type="na">النورو</language>
+ <language type="nah">الناهيوتل</language>
+ <language type="nai">الهندية الأمريكية الشمالية - أخرى</language>
+ <language type="nap">اللغة النابولية</language>
+ <language type="nb">البوكمالية النرويجية</language>
+ <language type="nd">النديبيل الشمالى</language>
+ <language type="nds">الألمانية السÙلى</language>
+ <language type="ne">النيبالية</language>
+ <language type="new">النيوارى</language>
+ <language type="ng">الندونجا</language>
+ <language type="nia">النياس</language>
+ <language type="nic">النيجر - كوردوÙانايان</language>
+ <language type="nl">الهولندية</language>
+ <language type="nn">النينورسك النرويجي</language>
+ <language type="no">النرويجية</language>
+ <language type="nog">النوجاى</language>
+ <language type="non">النورس القديم</language>
+ <language type="nr">النديبيل الجنوبى</language>
+ <language type="nub">اللغات النوبية</language>
+ <language type="nv">الناÙاجو</language>
+ <language type="nwc">النوارية التقليدية</language>
+ <language type="ny">النيانجا، التشيتشوا، التشوا</language>
+ <language type="nym">النيامويزى</language>
+ <language type="nyn">النيانكول</language>
+ <language type="nyo">النيورو</language>
+ <language type="nzi">النزيما</language>
+ <language type="oc">الأوكيتان (بعد 1500)ØŒ بروÙينسية</language>
+ <language type="oj">الأوجيبوا</language>
+ <language type="om">الأورومو</language>
+ <language type="or">الأورييا</language>
+ <language type="os">الأوسيتيك</language>
+ <language type="osa">الأوساج</language>
+ <language type="ota">التركية العثمانية</language>
+ <language type="pa">البنجابية</language>
+ <language type="paa">الغينية - أخرى</language>
+ <language type="pag">البانجاسينان</language>
+ <language type="pal">البهلوية</language>
+ <language type="pam">البامبانجا</language>
+ <language type="pap">البابيامينتو</language>
+ <language type="pau">البالوان</language>
+ <language type="peo">الÙارسية القديمة</language>
+ <language type="phi">الÙليبينية - أخرى</language>
+ <language type="phn">الÙينيقية</language>
+ <language type="pi">البالية</language>
+ <language type="pl">البولندية</language>
+ <language type="pon">البوهنبيايان</language>
+ <language type="pra">اللغات البراقريطية</language>
+ <language type="pro">البروÙانسية القديمة</language>
+ <language type="ps">البشتونية</language>
+ <language type="pt">البرتغالية</language>
+ <language type="qu">الكويتشوا</language>
+ <language type="raj">الراجاسثانية</language>
+ <language type="rap">الرابانى</language>
+ <language type="rar">الراروتونجانى</language>
+ <language type="rm">الرهايتو-رومانس</language>
+ <language type="rn">الرندى</language>
+ <language type="ro">الرومانية</language>
+ <language type="roa">الرومانسية - أخرى</language>
+ <language type="rom">الرومانية [rom]</language>
+ <language type="ru">الروسية</language>
+ <language type="rup">الأرومانيان</language>
+ <language type="rw">الكينيارواندا</language>
+ <language type="sa">السنسكريتية</language>
+ <language type="sad">السانداوى</language>
+ <language type="sah">الياكت</language>
+ <language type="sai">الهندية الأمريكية الجنوبية - أخرى</language>
+ <language type="sal">لغات ساليشان</language>
+ <language type="sam">الآرامية السومارية</language>
+ <language type="sas">الساساك</language>
+ <language type="sat">السانتالى</language>
+ <language type="sc">السردينية</language>
+ <language type="scn">الصقلية</language>
+ <language type="sco">الأسكتلندية</language>
+ <language type="sd">السيندى</language>
+ <language type="se">السامي الشمالى</language>
+ <language type="sel">السيلكب</language>
+ <language type="sem">السامية - أخرى</language>
+ <language type="sg">السانجو</language>
+ <language type="sga">الأيرلندية القديمة</language>
+ <language type="sgn">لغات الأشارة</language>
+ <language type="shn">الشانية</language>
+ <language type="si">السريلانكية</language>
+ <language type="sid">السيدامو</language>
+ <language type="sio">لغات السيويون</language>
+ <language type="sit">الصينية التيبتية - أخرى</language>
+ <language type="sk">السلوÙاكية</language>
+ <language type="sl">السلوÙانية</language>
+ <language type="sla">السلاÙية - أخرى</language>
+ <language type="sm">الساموائية</language>
+ <language type="sma">السامي الجنوبى</language>
+ <language type="smi">اللغات السامية - أخرى</language>
+ <language type="smj">اللول سامى</language>
+ <language type="smn">الاينارى سامى</language>
+ <language type="sms">السكولت سامى</language>
+ <language type="sn">الشونا</language>
+ <language type="snk">السونينك</language>
+ <language type="so">الصومالية</language>
+ <language type="sog">السوجدين</language>
+ <language type="son">السونجهاى</language>
+ <language type="sq">الألبانية</language>
+ <language type="sr">الصربية</language>
+ <language type="srn">السرانان تونجو</language>
+ <language type="ss">السواتى</language>
+ <language type="ssa">النيلية الصحراوية - أخرى</language>
+ <language type="su">السودانية</language>
+ <language type="suk">السوكوما</language>
+ <language type="sus">السوسو</language>
+ <language type="sux">السومارية</language>
+ <language type="sv">السويدية</language>
+ <language type="sw">السواحلية</language>
+ <language type="syr">السريانية</language>
+ <language type="ta">التاميلية</language>
+ <language type="tai">تاى - أخرى</language>
+ <language type="te">التيلجو</language>
+ <language type="tem">التيمن</language>
+ <language type="ter">التيرينو</language>
+ <language type="tet">التيتم</language>
+ <language type="tg">الطاجيكية</language>
+ <language type="th">التايلاندية</language>
+ <language type="ti">التيجرينيا</language>
+ <language type="tig">التيجر</language>
+ <language type="tiv">التيÙ</language>
+ <language type="tk">التركمانية</language>
+ <language type="tkl">التوكيلاو</language>
+ <language type="tl">التاغالوغية</language>
+ <language type="tlh">الكلينجون</language>
+ <language type="tli">التلينغيتية</language>
+ <language type="tmh">التاماشيك</language>
+ <language type="tn">التسوانية</language>
+ <language type="to">تونجا - جزر تونجا</language>
+ <language type="tog">تونجا - نياسا</language>
+ <language type="tpi">التوك بيسين</language>
+ <language type="tr">التركية</language>
+ <language type="ts">السونجا</language>
+ <language type="tsi">التسيمشيان</language>
+ <language type="tt">التتارية</language>
+ <language type="tum">التامبوكا</language>
+ <language type="tup">اللغات التوبية</language>
+ <language type="tut">الألطائية - أخرى</language>
+ <language type="tvl">التوÙالو</language>
+ <language type="tw">التوى</language>
+ <language type="ty">التاهيتية</language>
+ <language type="udm">الأدمرت</language>
+ <language type="ug">الأغورية</language>
+ <language type="uga">اليجاريتيك</language>
+ <language type="uk">الأوكرانية</language>
+ <language type="umb">الأمبندو</language>
+ <language type="und">غير محدده</language>
+ <language type="ur">الأردية</language>
+ <language type="uz">الاوزباكية</language>
+ <language type="vai">الÙاى</language>
+ <language type="ve">الÙيندا</language>
+ <language type="vi">الÙيتنامية</language>
+ <language type="vot">الÙوتيك</language>
+ <language type="wa">الولونية</language>
+ <language type="wak">لغات الواكاشان</language>
+ <language type="wal">الوالامو</language>
+ <language type="war">الواراى</language>
+ <language type="was">الواشو</language>
+ <language type="wen">اللغات الصربية</language>
+ <language type="wo">الولوÙ</language>
+ <language type="xal">الكالميك</language>
+ <language type="yao">الياو</language>
+ <language type="yap">اليابيز</language>
+ <language type="yi">اليديشية</language>
+ <language type="yo">اليوروبية</language>
+ <language type="ypk">اللغات اليوبيكية</language>
+ <language type="za">الزهيونج</language>
+ <language type="zap">الزابوتيك</language>
+ <language type="zen">الزيناجا</language>
+ <language type="zh">الصينية</language>
+ <language type="znd">الزاند</language>
+ <language type="zu" draft="provisional">الزولو</language>
+ <language type="zun">الزونية</language>
+ </languages>
+ <scripts>
+ <script type="Arab">العربية</script>
+ <script type="Armn">الأرمينية</script>
+ <script type="Bali">البالية</script>
+ <script type="Batk">الباتاك</script>
+ <script type="Beng">البنغالية</script>
+ <script type="Blis">رموز بليس</script>
+ <script type="Bopo">البوبوموÙÙˆ</script>
+ <script type="Brah">الهندوسية</script>
+ <script type="Brai">البرايل</script>
+ <script type="Bugi">البجينيز</script>
+ <script type="Buhd">البهيدية</script>
+ <script type="Cans">رموز أصلية كندية موحدة</script>
+ <script type="Cham">التشامية</script>
+ <script type="Cher">الشيروكى</script>
+ <script type="Cirt">السيرث</script>
+ <script type="Copt">القبطية</script>
+ <script type="Cprt">القبرصية</script>
+ <script type="Cyrl">السيريلية</script>
+ <script type="Cyrs">السيريلية - متغير السلاÙية الكنسية القديمة</script>
+ <script type="Deva">الديÙاناجارى</script>
+ <script type="Dsrt">الديسيريت</script>
+ <script type="Egyd">الديموطيقية</script>
+ <script type="Egyh">الهيراطيقية</script>
+ <script type="Egyp">الهيروغليÙية</script>
+ <script type="Ethi">الاثيوبية</script>
+ <script type="Geok">الأبجدية الجورجية - أسومتاÙرلى Ùˆ نسخرى</script>
+ <script type="Geor">الجورجية</script>
+ <script type="Glag">الجلاجوليتيك</script>
+ <script type="Goth">القوطية</script>
+ <script type="Grek">اليونانية</script>
+ <script type="Gujr">التاغجراتية</script>
+ <script type="Guru">الجرمخى</script>
+ <script type="Hang">الهانجل</script>
+ <script type="Hani">الهان</script>
+ <script type="Hano">الهانونو</script>
+ <script type="Hans">الهان المبسطة</script>
+ <script type="Hant">الهان التقليدية</script>
+ <script type="Hebr">العبرية</script>
+ <script type="Hira">الهيراجانا</script>
+ <script type="Hmng">الباهوه همونج</script>
+ <script type="Hrkt">الكتكانا أو الهيراجانا</script>
+ <script type="Hung">المجرية القديمة</script>
+ <script type="Inds">اندس - هارابان</script>
+ <script type="Ital">اللأيطالية القديمة</script>
+ <script type="Java">الجاوية</script>
+ <script type="Kali">الكياه لى</script>
+ <script type="Kana">الكتكانا</script>
+ <script type="Khar">الخاروشتى</script>
+ <script type="Khmr">الخميرية</script>
+ <script type="Knda">الكانادا</script>
+ <script type="Laoo">اللاو</script>
+ <script type="Latf">اللاتينية - متغير Ùراكتر</script>
+ <script type="Latg">اللاتينية - متغير غيلى</script>
+ <script type="Latn">اللاتينية</script>
+ <script type="Lepc">الليبتشا - رونج</script>
+ <script type="Limb">الليمبو</script>
+ <script type="Lina">الخطية أ</script>
+ <script type="Linb">الخطية ب</script>
+ <script type="Mand">المانداينية</script>
+ <script type="Maya">المايا الهيروغليÙية</script>
+ <script type="Mero">الميرويتيك</script>
+ <script type="Mlym">الماليالام</script>
+ <script type="Mong">المغولية</script>
+ <script type="Mymr">الميانمار</script>
+ <script type="Nkoo">انكو</script>
+ <script type="Ogam">الأوجهام</script>
+ <script type="Orkh">الأورخون</script>
+ <script type="Orya">الأوريا</script>
+ <script type="Osma">الأوسمانيا</script>
+ <script type="Perm">البيرميكية القديمة</script>
+ <script type="Phag">الÙاجسبا</script>
+ <script type="Phnx">الÙينيقية</script>
+ <script type="Plrd">الصوتيات الجماء</script>
+ <script type="Qaai">الموروث</script>
+ <script type="Roro">رنجورنجو</script>
+ <script type="Runr">الرونى</script>
+ <script type="Sara">الساراتى</script>
+ <script type="Shaw">الشوانى</script>
+ <script type="Sinh">السينهالا</script>
+ <script type="Sylo">السيلوتى ناجرى</script>
+ <script type="Syrc">السريانية</script>
+ <script type="Syre">السريانية [Syre]</script>
+ <script type="Syrj">السريانية - متغير غربى</script>
+ <script type="Syrn">السريانية - متغير شرقى</script>
+ <script type="Tagb">التاجبانوا</script>
+ <script type="Tale">التاى لى</script>
+ <script type="Talu">التاى لى الجديد</script>
+ <script type="Taml">التاميلية</script>
+ <script type="Telu">التيلجو</script>
+ <script type="Teng">التينجوار</script>
+ <script type="Tfng">التيÙيناغ - البربر</script>
+ <script type="Tglg">التغالوغية</script>
+ <script type="Thaa">الثعنة</script>
+ <script type="Thai">التايلاندية</script>
+ <script type="Tibt">التبتية</script>
+ <script type="Ugar">الأجاريتيكية</script>
+ <script type="Vaii">الÙاى</script>
+ <script type="Visp">الكلام المرئى</script>
+ <script type="Xpeo">الÙارسية القديمة</script>
+ <script type="Xsux">الكتابة المسمارية الأكادية السومارية</script>
+ <script type="Yiii">اليى</script>
+ <script type="Zxxx">Ø´Ùرة للغات الغير مكتوبة</script>
+ <script type="Zyyy">عام</script>
+ <script type="Zzzz">Ø´Ùرة للنصوص الغير مشÙرة</script>
+ </scripts>
+ <territories>
+ <territory type="001">العالم</territory>
+ <territory type="002">اÙريقيا</territory>
+ <territory type="005">أمريكا الجنوبية</territory>
+ <territory type="009">أوقيانوسيا</territory>
+ <territory type="011">غرب اÙريقيا</territory>
+ <territory type="013">أمريكا الوسطى</territory>
+ <territory type="014">شرق اÙريقيا</territory>
+ <territory type="015">شمال اÙريقيا</territory>
+ <territory type="017">وسط اÙريقيا</territory>
+ <territory type="018">جنوب اÙريقيا</territory>
+ <territory type="019">الأمريكتين</territory>
+ <territory type="021">شمال أمريكا</territory>
+ <territory type="029">الكاريبي</territory>
+ <territory type="030">شرق آسيا</territory>
+ <territory type="034">جنوب آسيا</territory>
+ <territory type="035">جنوب شرق آسيا</territory>
+ <territory type="039">جنوب أوروبا</territory>
+ <territory type="053">أستراليا ونيوزيلندا</territory>
+ <territory type="054">ميلانيزيا</territory>
+ <territory type="057">الجزر الميكرونيزية</territory>
+ <territory type="061">بولينيزيا</territory>
+ <territory type="142">آسيا</territory>
+ <territory type="143">وسط آسيا</territory>
+ <territory type="145">غرب آسيا</territory>
+ <territory type="150">أوروبا</territory>
+ <territory type="151">شرق أوروبا</territory>
+ <territory type="154">شمال أوروبا</territory>
+ <territory type="155">غرب أوروبا</territory>
+ <territory type="172">كومنولث الدول المستقلة</territory>
+ <territory type="419">أمريكا اللاتينية و الكاريبي</territory>
+ <territory type="AD">أندورا</territory>
+ <territory type="AE">الامارات العربية المتحدة</territory>
+ <territory type="AF">Ø£Ùغانستان</territory>
+ <territory type="AG">أنتيجوا وبربودا</territory>
+ <territory type="AI">أنجويلا</territory>
+ <territory type="AL">ألبانيا</territory>
+ <territory type="AM">أرمينيا</territory>
+ <territory type="AN">جزر الأنتيل الهولندية</territory>
+ <territory type="AO">أنجولا</territory>
+ <territory type="AQ">القطب الجنوبي</territory>
+ <territory type="AR">الأرجنتين</territory>
+ <territory type="AS">ساموا الأمريكية</territory>
+ <territory type="AT">النمسا</territory>
+ <territory type="AU">أستراليا</territory>
+ <territory type="AW">آروبا</territory>
+ <territory type="AX">جزر أولان</territory>
+ <territory type="AZ">أذربيجان</territory>
+ <territory type="BA">البوسنة والهرسك</territory>
+ <territory type="BB">بربادوس</territory>
+ <territory type="BD">بنجلاديش</territory>
+ <territory type="BE">بلجيكا</territory>
+ <territory type="BF">بوركينا Ùاسو</territory>
+ <territory type="BG">بلغاريا</territory>
+ <territory type="BH">البحرين</territory>
+ <territory type="BI">بوروندي</territory>
+ <territory type="BJ">بنين</territory>
+ <territory type="BM">برمودا</territory>
+ <territory type="BN">بروناي</territory>
+ <territory type="BO">بوليÙيا</territory>
+ <territory type="BR">البرازيل</territory>
+ <territory type="BS">الباهاما</territory>
+ <territory type="BT">بوتان</territory>
+ <territory type="BV">جزيرة بوÙيه</territory>
+ <territory type="BW">بتسوانا</territory>
+ <territory type="BY">روسيا البيضاء</territory>
+ <territory type="BZ">بليز</territory>
+ <territory type="CA">كندا</territory>
+ <territory type="CC">جزر كوكوس (كيلنج)</territory>
+ <territory type="CD">جمهورية الكونغو الديمقراطية</territory>
+ <territory type="CF">جمهورية اÙريقيا الوسطى</territory>
+ <territory type="CG">الكونغو - برازاÙيل</territory>
+ <territory type="CH">سويسرا</territory>
+ <territory type="CI">ساحل العاج</territory>
+ <territory type="CK">جزر كوك</territory>
+ <territory type="CL">شيلي</territory>
+ <territory type="CM">الكاميرون</territory>
+ <territory type="CN">الصين</territory>
+ <territory type="CO">كولومبيا</territory>
+ <territory type="CR">كوستاريكا</territory>
+ <territory type="CS">صربيا والجبل الأسود</territory>
+ <territory type="CU">كوبا</territory>
+ <territory type="CV">الرأس الأخضر</territory>
+ <territory type="CX">جزيرة الكريسماس</territory>
+ <territory type="CY">قبرص</territory>
+ <territory type="CZ">جمهورية التشيك</territory>
+ <territory type="DE">ألمانيا</territory>
+ <territory type="DJ">جيبوتي</territory>
+ <territory type="DK">الدانمرك</territory>
+ <territory type="DM">دومينيكا</territory>
+ <territory type="DO">جمهورية الدومينيك</territory>
+ <territory type="DZ">الجزائر</territory>
+ <territory type="EC">الاكوادور</territory>
+ <territory type="EE">استونيا</territory>
+ <territory type="EG">مصر</territory>
+ <territory type="EH">الصحراء الغربية</territory>
+ <territory type="ER">اريتريا</territory>
+ <territory type="ES">أسبانيا</territory>
+ <territory type="ET">اثيوبيا</territory>
+ <territory type="FI">Ùنلندا</territory>
+ <territory type="FJ">Ùيجي</territory>
+ <territory type="FK">جزر Ùوكلاند</territory>
+ <territory type="FM">ميكرونيزيا</territory>
+ <territory type="FO">جزر Ùارو</territory>
+ <territory type="FR">Ùرنسا</territory>
+ <territory type="GA">الجابون</territory>
+ <territory type="GB">المملكة المتحدة</territory>
+ <territory type="GD">جرينادا</territory>
+ <territory type="GE">جورجيا</territory>
+ <territory type="GF">غويانا</territory>
+ <territory type="GH">غانا</territory>
+ <territory type="GI">جبل طارق</territory>
+ <territory type="GL">جرينلاند</territory>
+ <territory type="GM">غامبيا</territory>
+ <territory type="GN">غينيا</territory>
+ <territory type="GP">جوادلوب</territory>
+ <territory type="GQ">غينيا الاستوائية</territory>
+ <territory type="GR">اليونان</territory>
+ <territory type="GS">جورجيا الجنوبية وجزر ساندويتش الجنوبية</territory>
+ <territory type="GT">جواتيمالا</territory>
+ <territory type="GU">جوام</territory>
+ <territory type="GW">غينيا بيساو</territory>
+ <territory type="GY">غيانا</territory>
+ <territory type="HK">هونج كونج الصينية</territory>
+ <territory type="HM">جزيرة هيرد وماكدونالد</territory>
+ <territory type="HN">هندوراس</territory>
+ <territory type="HR">كرواتيا</territory>
+ <territory type="HT">هايتي</territory>
+ <territory type="HU">المجر</territory>
+ <territory type="ID">اندونيسيا</territory>
+ <territory type="IE">أيرلاندا</territory>
+ <territory type="IL">اسرائيل</territory>
+ <territory type="IN">الهند</territory>
+ <territory type="IO">المحيط الهندي البريطاني</territory>
+ <territory type="IQ">العراق</territory>
+ <territory type="IR">ايران</territory>
+ <territory type="IS">أيسلندا</territory>
+ <territory type="IT">ايطاليا</territory>
+ <territory type="JM">جامايكا</territory>
+ <territory type="JO">الأردن</territory>
+ <territory type="JP">اليابان</territory>
+ <territory type="KE">كينيا</territory>
+ <territory type="KG">قرغيزستان</territory>
+ <territory type="KH">كمبوديا</territory>
+ <territory type="KI">كيريباتي</territory>
+ <territory type="KM">جزر القمر</territory>
+ <territory type="KN">سانت كيتس ونيÙيس</territory>
+ <territory type="KP">كوريا الشمالية</territory>
+ <territory type="KR">كوريا الجنوبية</territory>
+ <territory type="KW">الكويت</territory>
+ <territory type="KY">جزر الكايمن</territory>
+ <territory type="KZ">كازاخستان</territory>
+ <territory type="LA">لاوس</territory>
+ <territory type="LB">لبنان</territory>
+ <territory type="LC">سانت لوسيا</territory>
+ <territory type="LI">ليختنشتاين</territory>
+ <territory type="LK">سريلانكا</territory>
+ <territory type="LR">ليبيريا</territory>
+ <territory type="LS">ليسوتو</territory>
+ <territory type="LT">ليتوانيا</territory>
+ <territory type="LU">لوكسمبورج</territory>
+ <territory type="LV">لاتÙيا</territory>
+ <territory type="LY">ليبيا</territory>
+ <territory type="MA">المغرب</territory>
+ <territory type="MC">موناكو</territory>
+ <territory type="MD">مولداÙيا</territory>
+ <territory type="MG">مدغشقر</territory>
+ <territory type="MH">جزر المارشال</territory>
+ <territory type="MK">مقدونيا</territory>
+ <territory type="ML">مالي</territory>
+ <territory type="MM">ميانمار</territory>
+ <territory type="MN">منغوليا</territory>
+ <territory type="MO">ماكاو الصينية</territory>
+ <territory type="MP">جزر ماريانا الشمالية</territory>
+ <territory type="MQ">مارتينيك</territory>
+ <territory type="MR">موريتانيا</territory>
+ <territory type="MS">مونتسرات</territory>
+ <territory type="MT">مالطا</territory>
+ <territory type="MU">موريشيوس</territory>
+ <territory type="MV">جزر الملديÙ</territory>
+ <territory type="MW">ملاوي</territory>
+ <territory type="MX">المكسيك</territory>
+ <territory type="MY">ماليزيا</territory>
+ <territory type="MZ">موزمبيق</territory>
+ <territory type="NA">ناميبيا</territory>
+ <territory type="NC">كاليدونيا الجديدة</territory>
+ <territory type="NE">النيجر</territory>
+ <territory type="NF">جزيرة نورÙوك</territory>
+ <territory type="NG">نيجيريا</territory>
+ <territory type="NI">نيكاراجوا</territory>
+ <territory type="NL">هولندا</territory>
+ <territory type="NO">النرويج</territory>
+ <territory type="NP">نيبال</territory>
+ <territory type="NR">نورو</territory>
+ <territory type="NU">نيوي</territory>
+ <territory type="NZ">نيوزيلاندا</territory>
+ <territory type="OM">عمان</territory>
+ <territory type="PA">بنما</territory>
+ <territory type="PE">بيرو</territory>
+ <territory type="PF">بولينيزيا [PF]</territory>
+ <territory type="PG">بابوا غينيا الجديدة</territory>
+ <territory type="PH">الÙيلبين</territory>
+ <territory type="PK">باكستان</territory>
+ <territory type="PL">بولندا</territory>
+ <territory type="PM">سانت بيير وميكولون</territory>
+ <territory type="PN">بتكايرن</territory>
+ <territory type="PR">بورتوريكو</territory>
+ <territory type="PS">Ùلسطين</territory>
+ <territory type="PT">البرتغال</territory>
+ <territory type="PW">بالاو</territory>
+ <territory type="PY">باراجواي</territory>
+ <territory type="QA">قطر</territory>
+ <territory type="RE">روينيون</territory>
+ <territory type="RO">رومانيا</territory>
+ <territory type="RU">روسيا</territory>
+ <territory type="RW">رواندا</territory>
+ <territory type="SA">المملكة العربية السعودية</territory>
+ <territory type="SB">جزر سليمان</territory>
+ <territory type="SC">سيشل</territory>
+ <territory type="SD">السودان</territory>
+ <territory type="SE">السويد</territory>
+ <territory type="SG">سنغاÙورة</territory>
+ <territory type="SH">سانت هيلنا</territory>
+ <territory type="SI">سلوÙينيا</territory>
+ <territory type="SJ">سÙالبارد وجان مايان</territory>
+ <territory type="SK">سلوÙاكيا</territory>
+ <territory type="SL">سيراليون</territory>
+ <territory type="SM">سان مارينو</territory>
+ <territory type="SN">السنغال</territory>
+ <territory type="SO">الصومال</territory>
+ <territory type="SR">سورينام</territory>
+ <territory type="ST">ساو تومي وبرينسيبي</territory>
+ <territory type="SV">السلÙادور</territory>
+ <territory type="SY">سوريا</territory>
+ <territory type="SZ">سوازيلاند</territory>
+ <territory type="TC">جزر الترك وجايكوس</territory>
+ <territory type="TD">تشاد</territory>
+ <territory type="TF">المقاطعات الجنوبية الÙرنسية</territory>
+ <territory type="TG">توجو</territory>
+ <territory type="TH">تايلند</territory>
+ <territory type="TJ">طاجكستان</territory>
+ <territory type="TK">توكيلو</territory>
+ <territory type="TL">تيمور الشرقية</territory>
+ <territory type="TM">تركمانستان</territory>
+ <territory type="TN">تونس</territory>
+ <territory type="TO">تونجا</territory>
+ <territory type="TR">تركيا</territory>
+ <territory type="TT">ترينيداد وتوباغو</territory>
+ <territory type="TV">توÙالو</territory>
+ <territory type="TW">تايوان</territory>
+ <territory type="TZ">تانزانيا</territory>
+ <territory type="UA">أوكرانيا</territory>
+ <territory type="UG">أوغندا</territory>
+ <territory type="UM">جزر الولايات المتحدة البعيدة الصغيرة</territory>
+ <territory type="US">الولايات المتحدة الأمريكية</territory>
+ <territory type="UY">أورجواي</territory>
+ <territory type="UZ">أوزبكستان</territory>
+ <territory type="VA">الÙاتيكان</territory>
+ <territory type="VC">سانت Ùنسنت وغرنادين</territory>
+ <territory type="VE">Ùنزويلا</territory>
+ <territory type="VG">جزر Ùرجين البريطانية</territory>
+ <territory type="VI">جزر Ùرجين الأمريكية</territory>
+ <territory type="VN">Ùيتنام</territory>
+ <territory type="VU">Ùانواتو</territory>
+ <territory type="WF">جزر والس ÙˆÙوتونا</territory>
+ <territory type="WS">ساموا</territory>
+ <territory type="YE">اليمن</territory>
+ <territory type="YT">مايوت</territory>
+ <territory type="ZA">جمهورية جنوب اÙريقيا</territory>
+ <territory type="ZM">زامبيا</territory>
+ <territory type="ZW">زيمبابوي</territory>
+ </territories>
+ <variants>
+ <variant type="NEDIS">لهجة ناتيسون</variant>
+ </variants>
+ <keys>
+ <key type="calendar">تقويم</key>
+ <key type="collation">الترتيب</key>
+ <key type="currency">العملات</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">الصينية التقليدية (Big5)</type>
+ <type type="buddhist" key="calendar">التقويم البوذي</type>
+ <type type="chinese" key="calendar">التقويم الصيني</type>
+ <type type="direct" key="collation">ترتيب مباشر</type>
+ <type type="gb2312han" key="collation">الصينية المبسطة (GB2312)</type>
+ <type type="gregorian" key="calendar">التقويم الميلادي</type>
+ <type type="hebrew" key="calendar">التقويم العبري</type>
+ <type type="islamic" key="calendar">التقويم الهجري</type>
+ <type type="islamic-civil" key="calendar">تقويم اسلامي مدني</type>
+ <type type="japanese" key="calendar">التقويم الياباني</type>
+ <type type="phonebook" key="collation">ترتيب دليل الهاتÙ</type>
+ <type type="traditional" key="collation">تقليدي</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US" draft="provisional">النظام الأمريكي</measurementSystemName>
+ <measurementSystemName type="metric" draft="provisional">النظام المتري</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <layout>
+ <orientation characters="right-to-left"/>
+ </layout>
+ <characters>
+ <exemplarCharacters>[Ù‹-Ù’ Ù€ Ø¡-غ Ù-ÙŠ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>â€</quotationStart>
+ <quotationEnd>“</quotationEnd>
+ <alternateQuotationStart>’</alternateQuotationStart>
+ <alternateQuotationEnd>‘</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="buddhist">
+ <eras>
+ <eraAbbr>
+ <era type="0">التقويم البوذي</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ <calendar type="coptic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="provisional">توت</month>
+ <month type="2" draft="provisional">بابه</month>
+ <month type="3" draft="provisional">هاتور</month>
+ <month type="4" draft="provisional">كياهك</month>
+ <month type="5" draft="provisional">طوبة</month>
+ <month type="6" draft="provisional">أمشير</month>
+ <month type="7" draft="provisional">برامهات</month>
+ <month type="8" draft="provisional">برمودة</month>
+ <month type="9" draft="provisional">بشنس</month>
+ <month type="10" draft="provisional">بؤونة</month>
+ <month type="11" draft="provisional">أبيب</month>
+ <month type="12" draft="provisional">مسرى</month>
+ <month type="13" draft="provisional">نسيئ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="provisional">توت</month>
+ <month type="2" draft="provisional">بابه</month>
+ <month type="3" draft="provisional">هاتور</month>
+ <month type="4" draft="provisional">كياهك</month>
+ <month type="5" draft="provisional">طوبة</month>
+ <month type="6" draft="provisional">أمشير</month>
+ <month type="7" draft="provisional">برامهات</month>
+ <month type="8" draft="provisional">برمودة</month>
+ <month type="9" draft="provisional">بشنس</month>
+ <month type="10" draft="provisional">بؤونة</month>
+ <month type="11" draft="provisional">أبيب</month>
+ <month type="12" draft="provisional">مسرى</month>
+ <month type="13" draft="provisional">نسيئ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="ethiopic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="provisional">مسكريم</month>
+ <month type="2" draft="provisional">تكمت</month>
+ <month type="3" draft="provisional">هدار</month>
+ <month type="4" draft="provisional">تهساس</month>
+ <month type="5" draft="provisional">تر</month>
+ <month type="6" draft="provisional">يكتت</month>
+ <month type="7" draft="provisional">مجابيت</month>
+ <month type="8" draft="provisional">ميازيا</month>
+ <month type="9" draft="provisional">جنبت</month>
+ <month type="10" draft="provisional">سين</month>
+ <month type="11" draft="provisional">هامل</month>
+ <month type="12" draft="provisional">نهاس</month>
+ <month type="13" draft="provisional">باجمن</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="provisional">مسكريم</month>
+ <month type="2" draft="provisional">تكمت</month>
+ <month type="3" draft="provisional">هدار</month>
+ <month type="4" draft="provisional">تهساس</month>
+ <month type="5" draft="provisional">تر</month>
+ <month type="6" draft="provisional">يكتت</month>
+ <month type="7" draft="provisional">مجابيت</month>
+ <month type="8" draft="provisional">ميازيا</month>
+ <month type="9" draft="provisional">جنبت</month>
+ <month type="10" draft="provisional">سين</month>
+ <month type="11" draft="provisional">هامل</month>
+ <month type="12" draft="provisional">نهاس</month>
+ <month type="13" draft="provisional">باجمن</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">يناير</month>
+ <month type="2">Ùبراير</month>
+ <month type="3">مارس</month>
+ <month type="4">أبريل</month>
+ <month type="5">مايو</month>
+ <month type="6">يونيو</month>
+ <month type="7">يوليو</month>
+ <month type="8">أغسطس</month>
+ <month type="9">سبتمبر</month>
+ <month type="10">أكتوبر</month>
+ <month type="11">نوÙمبر</month>
+ <month type="12">ديسمبر</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">يناير</month>
+ <month type="2">Ùبراير</month>
+ <month type="3">مارس</month>
+ <month type="4">أبريل</month>
+ <month type="5">مايو</month>
+ <month type="6">يونيو</month>
+ <month type="7">يوليو</month>
+ <month type="8">أغسطس</month>
+ <month type="9">سبتمبر</month>
+ <month type="10">أكتوبر</month>
+ <month type="11">نوÙمبر</month>
+ <month type="12">ديسمبر</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">ÙŠ</month>
+ <month type="2">Ù</month>
+ <month type="3">Ù…</month>
+ <month type="4">Ø£</month>
+ <month type="5">Ùˆ</month>
+ <month type="6">Ù†</month>
+ <month type="7">Ù„</month>
+ <month type="8">غ</month>
+ <month type="9">س</month>
+ <month type="10">Ùƒ</month>
+ <month type="11">ب</month>
+ <month type="12">د</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Ø­</day>
+ <day type="mon">Ù†</day>
+ <day type="tue">Ø«</day>
+ <day type="wed">ر</day>
+ <day type="thu">Ø®</day>
+ <day type="fri">ج</day>
+ <day type="sat">س</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">الأحد</day>
+ <day type="mon">الاثنين</day>
+ <day type="tue">الثلاثاء</day>
+ <day type="wed">الأربعاء</day>
+ <day type="thu">الخميس</day>
+ <day type="fri">الجمعة</day>
+ <day type="sat">السبت</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">Ø­</day>
+ <day type="mon">Ù†</day>
+ <day type="tue">Ø«</day>
+ <day type="wed">ر</day>
+ <day type="thu">Ø®</day>
+ <day type="fri">ج</day>
+ <day type="sat">س</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">الربع الأول</quarter>
+ <quarter type="2">الربع الثاني</quarter>
+ <quarter type="3">الربع الثالث</quarter>
+ <quarter type="4">الربع الرابع</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">الربع الأول</quarter>
+ <quarter type="2">الربع الثاني</quarter>
+ <quarter type="3">الربع الثالث</quarter>
+ <quarter type="4">الربع الرابع</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>ص</am>
+ <pm>Ù…</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">Ù‚.Ù…</era>
+ <era type="1">Ù…</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d MMMM, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d/M/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>z h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM, yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName>العصر</displayName>
+ </field>
+ <field type="year">
+ <displayName>السنة</displayName>
+ </field>
+ <field type="month">
+ <displayName>الشهر</displayName>
+ </field>
+ <field type="week">
+ <displayName>الأسبوع</displayName>
+ </field>
+ <field type="day">
+ <displayName draft="provisional">اليوم</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>اليوم</displayName>
+ </field>
+ <field type="hour">
+ <displayName>الساعات</displayName>
+ </field>
+ <field type="minute">
+ <displayName>الدقائق</displayName>
+ </field>
+ <field type="second">
+ <displayName>الثواني</displayName>
+ </field>
+ <field type="zone">
+ <displayName>التوقيت</displayName>
+ </field>
+ </fields>
+ </calendar>
+ <calendar type="hebrew">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="provisional">تشري</month>
+ <month type="2" draft="provisional">مرحشوان</month>
+ <month type="3" draft="provisional">كيسلو</month>
+ <month type="4" draft="provisional">طيست</month>
+ <month type="5" draft="provisional">شباط</month>
+ <month type="6" draft="provisional">آذار الأول</month>
+ <month type="7" draft="provisional">آذار الثاني</month>
+ <month type="8" draft="provisional">نيسان</month>
+ <month type="9" draft="provisional">أيار</month>
+ <month type="10" draft="provisional">سيوان</month>
+ <month type="11" draft="provisional">تموز</month>
+ <month type="12" draft="provisional">آب</month>
+ <month type="13" draft="provisional">أيلول</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="provisional">تشري</month>
+ <month type="2" draft="provisional">مرحشوان</month>
+ <month type="3" draft="provisional">كيسلو</month>
+ <month type="4" draft="provisional">طيست</month>
+ <month type="5" draft="provisional">شباط</month>
+ <month type="6" draft="provisional">آذار الأول</month>
+ <month type="7" draft="provisional">آذار الثاني</month>
+ <month type="8" draft="provisional">نيسان</month>
+ <month type="9" draft="provisional">أيار</month>
+ <month type="10" draft="provisional">سيوان</month>
+ <month type="11" draft="provisional">تموز</month>
+ <month type="12" draft="provisional">آب</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="islamic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1">محرم</month>
+ <month type="2">صÙر</month>
+ <month type="3">ربيع الأول</month>
+ <month type="4">ربيع الآخر</month>
+ <month type="5">جمادى الأولى</month>
+ <month type="6">جمادى الآخرة</month>
+ <month type="7">رجب</month>
+ <month type="8">شعبان</month>
+ <month type="9">رمضان</month>
+ <month type="10">شوال</month>
+ <month type="11">ذو القعدة</month>
+ <month type="12">ذو الحجة</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <eras>
+ <eraAbbr>
+ <era type="0">Ù‡â€</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ <calendar type="islamic-civil">
+ <months>
+ <alias source="locale" path="../../calendar[@type='islamic']/months"/>
+ </months>
+ <eras>
+ <alias source="locale" path="../../calendar[@type='islamic']/eras"/>
+ </eras>
+ </calendar>
+ <calendar type="japanese">
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="provisional">تيكا</era>
+ <era type="1" draft="provisional">هاكتشي</era>
+ <era type="2" draft="provisional">هاكهو</era>
+ <era type="3" draft="provisional">شتشو</era>
+ <era type="4" draft="provisional">تيهو</era>
+ <era type="5" draft="provisional">كيين</era>
+ <era type="6" draft="provisional">وادو</era>
+ <era type="7" draft="provisional">رييكي</era>
+ <era type="8" draft="provisional">يورو</era>
+ <era type="9" draft="provisional">جينكي</era>
+ <era type="10" draft="provisional">تمبيو</era>
+ <era type="11" draft="provisional">تمبيو-كامبو</era>
+ <era type="12" draft="provisional">تمبيو-شوهو</era>
+ <era type="13" draft="provisional">تمبيو-هوجي</era>
+ <era type="14" draft="provisional">تمÙÙˆ-جينجو</era>
+ <era type="15" draft="provisional">جينجو-كيين</era>
+ <era type="16" draft="provisional">هوكي</era>
+ <era type="17" draft="provisional">تن-أو</era>
+ <era type="18" draft="provisional">إنرياكو</era>
+ <era type="19" draft="provisional">ديدو</era>
+ <era type="20" draft="provisional">كونين</era>
+ <era type="21" draft="provisional">تنتشو</era>
+ <era type="22" draft="provisional">شووا</era>
+ <era type="23" draft="provisional">كاجو</era>
+ <era type="24" draft="provisional">نينجو</era>
+ <era type="25" draft="provisional">سيكو</era>
+ <era type="26" draft="provisional">تنان</era>
+ <era type="27" draft="provisional">جوجان</era>
+ <era type="28" draft="provisional">جينكيي</era>
+ <era type="29" draft="provisional">نينا</era>
+ <era type="30" draft="provisional">كامبيو</era>
+ <era type="31" draft="provisional">شوتاي</era>
+ <era type="32" draft="provisional">انجي</era>
+ <era type="33" draft="provisional">انتشو</era>
+ <era type="34" draft="provisional">شوهيي</era>
+ <era type="35" draft="provisional">تنجيو</era>
+ <era type="36" draft="provisional">تنرياكو</era>
+ <era type="37" draft="provisional">تنتوكو</era>
+ <era type="38" draft="provisional">أووا</era>
+ <era type="39" draft="provisional">كوهو</era>
+ <era type="40" draft="provisional">آنا</era>
+ <era type="41" draft="provisional">تينروكو</era>
+ <era type="42" draft="provisional">تن-ان</era>
+ <era type="43" draft="provisional">جوجن</era>
+ <era type="44" draft="provisional">تنجن</era>
+ <era type="45" draft="provisional">إيكان</era>
+ <era type="46" draft="provisional">كانا</era>
+ <era type="47" draft="provisional">اي-ان</era>
+ <era type="48" draft="provisional">ايسو</era>
+ <era type="49" draft="provisional">شورياكو</era>
+ <era type="50" draft="provisional">تشوتوكو</era>
+ <era type="51" draft="provisional">تشوهو</era>
+ <era type="52" draft="provisional">كانكو</era>
+ <era type="53" draft="provisional">تشووا</era>
+ <era type="54" draft="provisional">كانين</era>
+ <era type="55" draft="provisional">جاين</era>
+ <era type="56" draft="provisional">مانجو</era>
+ <era type="57" draft="provisional">تشوجين</era>
+ <era type="58" draft="provisional">تشورياكو</era>
+ <era type="59" draft="provisional">تشوكيو</era>
+ <era type="60" draft="provisional">كانتوكو</era>
+ <era type="61" draft="provisional">ايشو</era>
+ <era type="62" draft="provisional">تينجي</era>
+ <era type="63" draft="provisional">كوهيي</era>
+ <era type="64" draft="provisional">جيرياكو</era>
+ <era type="65" draft="provisional">انكيو</era>
+ <era type="66" draft="provisional">شوهو</era>
+ <era type="67" draft="provisional">شورياكو</era>
+ <era type="68" draft="provisional">ايهو</era>
+ <era type="69" draft="provisional">أوتوكو</era>
+ <era type="70" draft="provisional">كانجي</era>
+ <era type="71" draft="provisional">كاهو</era>
+ <era type="72" draft="provisional">ايتشو</era>
+ <era type="73" draft="provisional">شوتوكو</era>
+ <era type="74" draft="provisional">كووا</era>
+ <era type="75" draft="provisional">تشوجي</era>
+ <era type="76" draft="provisional">كاشو</era>
+ <era type="77" draft="provisional">تنين</era>
+ <era type="78" draft="provisional">تن-اي</era>
+ <era type="79" draft="provisional">ايكيو</era>
+ <era type="80" draft="provisional">جن-اي</era>
+ <era type="81" draft="provisional">هوان</era>
+ <era type="82" draft="provisional">تنجي</era>
+ <era type="83" draft="provisional">ديجي</era>
+ <era type="84" draft="provisional">تنشو</era>
+ <era type="85" draft="provisional">تشوشو</era>
+ <era type="86" draft="provisional">هوين</era>
+ <era type="87" draft="provisional">ايجي</era>
+ <era type="88" draft="provisional">كوجي</era>
+ <era type="89" draft="provisional">تنيو</era>
+ <era type="90" draft="provisional">كيوان</era>
+ <era type="91" draft="provisional">نينبيي</era>
+ <era type="92" draft="provisional">كيوجو</era>
+ <era type="93" draft="provisional">هجين</era>
+ <era type="94" draft="provisional">هيجي</era>
+ <era type="95" draft="provisional">ايرياكو</era>
+ <era type="96" draft="provisional">أوهو</era>
+ <era type="97" draft="provisional">تشوكان</era>
+ <era type="98" draft="provisional">ايمان</era>
+ <era type="99" draft="provisional">نين-ان</era>
+ <era type="100" draft="provisional">كاو</era>
+ <era type="101" draft="provisional">شون</era>
+ <era type="102" draft="provisional">أنجين</era>
+ <era type="103" draft="provisional">جيشو</era>
+ <era type="104" draft="provisional">يووا</era>
+ <era type="105" draft="provisional">جيي</era>
+ <era type="106" draft="provisional">جنريوكو</era>
+ <era type="107" draft="provisional">بنجي</era>
+ <era type="108" draft="provisional">كنكيو</era>
+ <era type="109" draft="provisional">شوجي</era>
+ <era type="110" draft="provisional">كنين</era>
+ <era type="111" draft="provisional">جنكيو</era>
+ <era type="112" draft="provisional">كن-اي</era>
+ <era type="113" draft="provisional">شوجن</era>
+ <era type="114" draft="provisional">كنرياكو</era>
+ <era type="115" draft="provisional">كنبو</era>
+ <era type="116" draft="provisional">شوكيو</era>
+ <era type="117" draft="provisional">جو</era>
+ <era type="118" draft="provisional">جيننين</era>
+ <era type="119" draft="provisional">كروكو</era>
+ <era type="120" draft="provisional">أنتيي</era>
+ <era type="121" draft="provisional">كنكي</era>
+ <era type="122" draft="provisional">جويي</era>
+ <era type="123" draft="provisional">تمبكو</era>
+ <era type="124" draft="provisional">بنرياكو</era>
+ <era type="125" draft="provisional">كاتيي</era>
+ <era type="126" draft="provisional">رياكنين</era>
+ <era type="127" draft="provisional">ان-أو</era>
+ <era type="128" draft="provisional">نينجي</era>
+ <era type="129" draft="provisional">كنجين</era>
+ <era type="130" draft="provisional">هوجي</era>
+ <era type="131" draft="provisional">كنتشو</era>
+ <era type="132" draft="provisional">كوجن</era>
+ <era type="133" draft="provisional">شوكا</era>
+ <era type="134" draft="provisional">شوجن</era>
+ <era type="135" draft="provisional">بن-أو</era>
+ <era type="136" draft="provisional">كوتشو</era>
+ <era type="137" draft="provisional">بن-اي</era>
+ <era type="138" draft="provisional">كنجي</era>
+ <era type="139" draft="provisional">كوان</era>
+ <era type="140" draft="provisional">شوو</era>
+ <era type="141" draft="provisional">اينين</era>
+ <era type="142" draft="provisional">شوان</era>
+ <era type="143" draft="provisional">كنجن</era>
+ <era type="144" draft="provisional">كجن</era>
+ <era type="145" draft="provisional">توكجي</era>
+ <era type="146" draft="provisional">انكي</era>
+ <era type="147" draft="provisional">أوتشو</era>
+ <era type="148" draft="provisional">شووا</era>
+ <era type="149" draft="provisional">بنبو</era>
+ <era type="150" draft="provisional">جنو</era>
+ <era type="151" draft="provisional">جنكيو</era>
+ <era type="152" draft="provisional">شوتشو</era>
+ <era type="153" draft="provisional">كريكي</era>
+ <era type="154" draft="provisional">جنتكو</era>
+ <era type="155" draft="provisional">جنكو</era>
+ <era type="156" draft="provisional">كمو</era>
+ <era type="157" draft="provisional">إنجن</era>
+ <era type="158" draft="provisional">كوككو</era>
+ <era type="159" draft="provisional">شوهي</era>
+ <era type="160" draft="provisional">كنتكو</era>
+ <era type="161" draft="provisional">بنتشو</era>
+ <era type="162" draft="provisional">تنجو</era>
+ <era type="163" draft="provisional">كورياكو</era>
+ <era type="164" draft="provisional">كووا</era>
+ <era type="165" draft="provisional">جنتشو</era>
+ <era type="166" draft="provisional">مييتكو</era>
+ <era type="167" draft="provisional">كاكي</era>
+ <era type="168" draft="provisional">كو</era>
+ <era type="169" draft="provisional">مييتكو</era>
+ <era type="170" draft="provisional">أويي</era>
+ <era type="171" draft="provisional">شوتشو</era>
+ <era type="172" draft="provisional">ايكيو</era>
+ <era type="173" draft="provisional">ككيتسو</era>
+ <era type="174" draft="provisional">بن-أن</era>
+ <era type="175" draft="provisional">هوتكو</era>
+ <era type="176" draft="provisional">كيوتكو</era>
+ <era type="177" draft="provisional">كوشو</era>
+ <era type="178" draft="provisional">تشوركو</era>
+ <era type="179" draft="provisional">كنشو</era>
+ <era type="180" draft="provisional">بنشو</era>
+ <era type="181" draft="provisional">أونين</era>
+ <era type="182" draft="provisional">بنمي</era>
+ <era type="183" draft="provisional">تشوكيو</era>
+ <era type="184" draft="provisional">انتكو</era>
+ <era type="185" draft="provisional">ميو</era>
+ <era type="186" draft="provisional">بنكي</era>
+ <era type="187" draft="provisional">ايشو</era>
+ <era type="188" draft="provisional">تييي</era>
+ <era type="189" draft="provisional">كيوركو</era>
+ <era type="190" draft="provisional">تنمن</era>
+ <era type="191" draft="provisional">كوجي</era>
+ <era type="192" draft="provisional">ايركو</era>
+ <era type="193" draft="provisional">جنكي</era>
+ <era type="194" draft="provisional">تنشو</era>
+ <era type="195" draft="provisional">بنركو</era>
+ <era type="196" draft="provisional">كيتشو</era>
+ <era type="197" draft="provisional">جنوا</era>
+ <era type="198" draft="provisional">كان-اي</era>
+ <era type="199" draft="provisional">شوهو</era>
+ <era type="200" draft="provisional">كيان</era>
+ <era type="201" draft="provisional">شوو</era>
+ <era type="202" draft="provisional">ميرياكو</era>
+ <era type="203" draft="provisional">منجي</era>
+ <era type="204" draft="provisional">كنبن</era>
+ <era type="205" draft="provisional">انبو</era>
+ <era type="206" draft="provisional">تنوا</era>
+ <era type="207" draft="provisional">جوكيو</era>
+ <era type="208" draft="provisional">جنركو</era>
+ <era type="209" draft="provisional">هويي</era>
+ <era type="210" draft="provisional">شوتكو</era>
+ <era type="211" draft="provisional">كيوهو</era>
+ <era type="212" draft="provisional">جنبن</era>
+ <era type="213" draft="provisional">كنبو</era>
+ <era type="214" draft="provisional">انكيو</era>
+ <era type="215" draft="provisional">كان-ان</era>
+ <era type="216" draft="provisional">هورياكو</era>
+ <era type="217" draft="provisional">مييوا</era>
+ <era type="218" draft="provisional">ان-اي</era>
+ <era type="219" draft="provisional">تنمي</era>
+ <era type="220" draft="provisional">كنسي</era>
+ <era type="221" draft="provisional">كيووا</era>
+ <era type="222" draft="provisional">بنكا</era>
+ <era type="223" draft="provisional">بنسي</era>
+ <era type="224" draft="provisional">تنبو</era>
+ <era type="225" draft="provisional">كوكا</era>
+ <era type="226" draft="provisional">كاي</era>
+ <era type="227" draft="provisional">أنسي</era>
+ <era type="228" draft="provisional">من-ان</era>
+ <era type="229" draft="provisional">بنكيو</era>
+ <era type="230" draft="provisional">جنجي</era>
+ <era type="231" draft="provisional">كيو</era>
+ <era type="232" draft="provisional">ميجي</era>
+ <era type="233" draft="provisional">تيشو</era>
+ <era type="234" draft="provisional">شووا</era>
+ <era type="235" draft="provisional">هيسي</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ <calendar type="persian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="provisional">Ùروردین</month>
+ <month type="2" draft="provisional">أذربيهشت</month>
+ <month type="3" draft="provisional">خرداد</month>
+ <month type="4" draft="provisional">تیر</month>
+ <month type="5" draft="provisional">مرداد</month>
+ <month type="6" draft="provisional">شهریار</month>
+ <month type="7" draft="provisional">مهر</month>
+ <month type="8" draft="provisional">آيان</month>
+ <month type="9" draft="provisional">آذر</month>
+ <month type="10" draft="provisional">دي</month>
+ <month type="11" draft="provisional">بهمن</month>
+ <month type="12" draft="provisional">اسÙندار</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="provisional">Ùروردین</month>
+ <month type="2" draft="provisional">أذربيهشت</month>
+ <month type="3" draft="provisional">خرداد</month>
+ <month type="4" draft="provisional">تیر</month>
+ <month type="5" draft="provisional">مرداد</month>
+ <month type="6" draft="provisional">شهریار</month>
+ <month type="7" draft="provisional">مهر</month>
+ <month type="8" draft="provisional">آيان</month>
+ <month type="9" draft="provisional">آذر</month>
+ <month type="10" draft="provisional">دي</month>
+ <month type="11" draft="provisional">بهمن</month>
+ <month type="12" draft="provisional">اسÙندار</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="provisional">Ù‡â€.Ø´</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Africa/Timbuktu">
+ <exemplarCity draft="unconfirmed">تيمبيوكتو</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/ComodRivadavia">
+ <exemplarCity draft="unconfirmed">كومودريÙاداÙيا</exemplarCity>
+ </zone>
+ <zone type="Europe/Belfast">
+ <exemplarCity draft="unconfirmed">بلÙاست</exemplarCity>
+ </zone>
+ <zone type="Pacific/Yap">
+ <exemplarCity draft="unconfirmed">ياب</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Rothera">
+ <exemplarCity draft="unconfirmed">روثيرا</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Palmer">
+ <exemplarCity draft="unconfirmed">بالميرا</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity draft="unconfirmed">القطب الجنوبي</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Syowa">
+ <exemplarCity draft="unconfirmed">سايووا</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Mawson">
+ <exemplarCity draft="unconfirmed">ماوسون</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Davis">
+ <exemplarCity draft="unconfirmed">داÙيز</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Vostok">
+ <exemplarCity draft="unconfirmed">Ùوستوك</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Casey">
+ <exemplarCity draft="unconfirmed">كاساي</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity draft="unconfirmed">دي مونت دو روÙيل</exemplarCity>
+ </zone>
+ <zone type="Antarctica/McMurdo">
+ <exemplarCity draft="unconfirmed">ماك موردو</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Rio_Gallegos">
+ <exemplarCity draft="unconfirmed">ريو جالييوس</exemplarCity>
+ </zone>
+ <zone type="America/Mendoza">
+ <exemplarCity draft="unconfirmed">ميندوزا</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/San_Juan">
+ <exemplarCity draft="unconfirmed">سان جوان</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Ushuaia">
+ <exemplarCity draft="unconfirmed">أشوا</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/La_Rioja">
+ <exemplarCity draft="unconfirmed">لا ريوجا</exemplarCity>
+ </zone>
+ <zone type="America/Catamarca">
+ <exemplarCity draft="unconfirmed">كاتاماركا</exemplarCity>
+ </zone>
+ <zone type="America/Jujuy">
+ <exemplarCity draft="unconfirmed">جوجو</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Tucuman">
+ <exemplarCity draft="unconfirmed">تاكمان</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity draft="unconfirmed">كوردوبا</exemplarCity>
+ </zone>
+ <zone type="America/Buenos_Aires">
+ <exemplarCity draft="unconfirmed">بوينوس أيرس</exemplarCity>
+ </zone>
+ <zone type="Australia/Perth">
+ <exemplarCity draft="unconfirmed">برثا</exemplarCity>
+ </zone>
+ <zone type="Australia/Darwin">
+ <exemplarCity draft="unconfirmed">دارون</exemplarCity>
+ </zone>
+ <zone type="Australia/Adelaide">
+ <exemplarCity draft="unconfirmed">أدليادا</exemplarCity>
+ </zone>
+ <zone type="Australia/Broken_Hill">
+ <exemplarCity draft="unconfirmed">بروكن هيل</exemplarCity>
+ </zone>
+ <zone type="Australia/Melbourne">
+ <exemplarCity draft="unconfirmed">ميلبورن</exemplarCity>
+ </zone>
+ <zone type="Australia/Hobart">
+ <exemplarCity draft="unconfirmed">هوبارت</exemplarCity>
+ </zone>
+ <zone type="Australia/Lindeman">
+ <exemplarCity draft="unconfirmed">ليندمان</exemplarCity>
+ </zone>
+ <zone type="Australia/Sydney">
+ <exemplarCity draft="unconfirmed">سيدني</exemplarCity>
+ </zone>
+ <zone type="Australia/Brisbane">
+ <exemplarCity draft="unconfirmed">برسيبان</exemplarCity>
+ </zone>
+ <zone type="Australia/Lord_Howe">
+ <exemplarCity draft="unconfirmed">لورد هاو</exemplarCity>
+ </zone>
+ <zone type="America/Eirunepe">
+ <exemplarCity draft="unconfirmed">ايرونبي</exemplarCity>
+ </zone>
+ <zone type="America/Rio_Branco">
+ <exemplarCity draft="unconfirmed">ريوبرانكو</exemplarCity>
+ </zone>
+ <zone type="America/Porto_Velho">
+ <exemplarCity draft="unconfirmed">بورتو Ùيلو</exemplarCity>
+ </zone>
+ <zone type="America/Boa_Vista">
+ <exemplarCity draft="unconfirmed">باو Ùيستا</exemplarCity>
+ </zone>
+ <zone type="America/Manaus">
+ <exemplarCity draft="unconfirmed">ماناوس</exemplarCity>
+ </zone>
+ <zone type="America/Cuiaba">
+ <exemplarCity draft="unconfirmed">كيابا</exemplarCity>
+ </zone>
+ <zone type="America/Campo_Grande">
+ <exemplarCity draft="unconfirmed">كومبو جراند</exemplarCity>
+ </zone>
+ <zone type="America/Belem">
+ <exemplarCity draft="unconfirmed">بلم</exemplarCity>
+ </zone>
+ <zone type="America/Araguaina">
+ <exemplarCity draft="unconfirmed">أروجوانيا</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity draft="unconfirmed">ساو باولو</exemplarCity>
+ </zone>
+ <zone type="America/Bahia">
+ <exemplarCity draft="unconfirmed">باهيا</exemplarCity>
+ </zone>
+ <zone type="America/Fortaleza">
+ <exemplarCity draft="unconfirmed">Ùورتاليزا</exemplarCity>
+ </zone>
+ <zone type="America/Maceio">
+ <exemplarCity draft="unconfirmed">ماشيو</exemplarCity>
+ </zone>
+ <zone type="America/Recife">
+ <exemplarCity draft="unconfirmed">ريسيÙ</exemplarCity>
+ </zone>
+ <zone type="America/Noronha">
+ <exemplarCity draft="unconfirmed">نوروناه</exemplarCity>
+ </zone>
+ <zone type="America/Dawson">
+ <exemplarCity draft="unconfirmed">داوسان</exemplarCity>
+ </zone>
+ <zone type="America/Whitehorse">
+ <exemplarCity draft="unconfirmed">هوايت هورس</exemplarCity>
+ </zone>
+ <zone type="America/Vancouver">
+ <exemplarCity draft="unconfirmed">ÙانكوÙر</exemplarCity>
+ </zone>
+ <zone type="America/Dawson_Creek">
+ <exemplarCity draft="unconfirmed">داوسن كريك</exemplarCity>
+ </zone>
+ <zone type="America/Yellowknife">
+ <exemplarCity draft="unconfirmed">يلونيÙ</exemplarCity>
+ </zone>
+ <zone type="America/Inuvik">
+ <exemplarCity draft="unconfirmed">اينوÙيك</exemplarCity>
+ </zone>
+ <zone type="America/Edmonton">
+ <exemplarCity draft="unconfirmed">ايدمونتون</exemplarCity>
+ </zone>
+ <zone type="America/Swift_Current">
+ <exemplarCity draft="unconfirmed">سوÙت كارنت</exemplarCity>
+ </zone>
+ <zone type="America/Cambridge_Bay">
+ <exemplarCity draft="unconfirmed">كامبرديج باي</exemplarCity>
+ </zone>
+ <zone type="America/Regina">
+ <exemplarCity draft="unconfirmed">ريجينا</exemplarCity>
+ </zone>
+ <zone type="America/Winnipeg">
+ <exemplarCity draft="unconfirmed">وينيبيج</exemplarCity>
+ </zone>
+ <zone type="America/Rainy_River">
+ <exemplarCity draft="unconfirmed">راني ريÙر</exemplarCity>
+ </zone>
+ <zone type="America/Rankin_Inlet">
+ <exemplarCity draft="unconfirmed">رانكن انلت</exemplarCity>
+ </zone>
+ <zone type="America/Thunder_Bay">
+ <exemplarCity draft="unconfirmed">ثندر باي</exemplarCity>
+ </zone>
+ <zone type="America/Nipigon">
+ <exemplarCity draft="unconfirmed">نيبيجون</exemplarCity>
+ </zone>
+ <zone type="America/Toronto">
+ <exemplarCity draft="unconfirmed">تورونتو</exemplarCity>
+ </zone>
+ <zone type="America/Montreal">
+ <exemplarCity draft="unconfirmed">مونتريال</exemplarCity>
+ </zone>
+ <zone type="America/Iqaluit">
+ <exemplarCity draft="unconfirmed">اكويلت</exemplarCity>
+ </zone>
+ <zone type="America/Pangnirtung">
+ <exemplarCity draft="unconfirmed">بانجينتينج</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <exemplarCity draft="unconfirmed">هاليÙاكس</exemplarCity>
+ </zone>
+ <zone type="America/Goose_Bay">
+ <exemplarCity draft="unconfirmed">جوس باي</exemplarCity>
+ </zone>
+ <zone type="America/Glace_Bay">
+ <exemplarCity draft="unconfirmed">جلاس باي</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <exemplarCity draft="unconfirmed">عيد سانت جونس</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity draft="unconfirmed">كينشاسا</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity draft="unconfirmed">لومبباشا</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity draft="unconfirmed">استر</exemplarCity>
+ </zone>
+ <zone type="America/Santiago">
+ <exemplarCity draft="unconfirmed">سانتيجو</exemplarCity>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity draft="unconfirmed">كاشجار</exemplarCity>
+ </zone>
+ <zone type="Asia/Urumqi">
+ <exemplarCity draft="unconfirmed">أرومكي</exemplarCity>
+ </zone>
+ <zone type="Asia/Chongqing">
+ <exemplarCity draft="unconfirmed">تشونجكينج</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity draft="unconfirmed">العالمية</exemplarCity>
+ </zone>
+ <zone type="Asia/Harbin">
+ <exemplarCity draft="unconfirmed">هاربين</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity draft="unconfirmed">جلاباجوس</exemplarCity>
+ </zone>
+ <zone type="America/Guayaquil">
+ <exemplarCity draft="unconfirmed">جواياكيل</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity draft="unconfirmed">كناري</exemplarCity>
+ </zone>
+ <zone type="Africa/Ceuta">
+ <exemplarCity draft="unconfirmed">سيتا</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity draft="unconfirmed">مدريد</exemplarCity>
+ </zone>
+ <zone type="Pacific/Truk">
+ <exemplarCity draft="unconfirmed">ترك</exemplarCity>
+ </zone>
+ <zone type="Pacific/Ponape">
+ <exemplarCity draft="unconfirmed">باناب</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kosrae">
+ <exemplarCity draft="unconfirmed">كوسرا</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity draft="unconfirmed">لندن</exemplarCity>
+ </zone>
+ <zone type="America/Thule">
+ <exemplarCity draft="unconfirmed">ثيل</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity draft="unconfirmed">جودثاب</exemplarCity>
+ </zone>
+ <zone type="America/Scoresbysund">
+ <exemplarCity draft="unconfirmed">سكورسبيسند</exemplarCity>
+ </zone>
+ <zone type="America/Danmarkshavn">
+ <exemplarCity draft="unconfirmed">دانمرك شاÙÙ†</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity draft="unconfirmed">جاكرتا</exemplarCity>
+ </zone>
+ <zone type="Asia/Pontianak">
+ <exemplarCity draft="unconfirmed">بونتيانك</exemplarCity>
+ </zone>
+ <zone type="Asia/Makassar">
+ <exemplarCity draft="unconfirmed">ماكسار</exemplarCity>
+ </zone>
+ <zone type="Asia/Jayapura">
+ <exemplarCity draft="unconfirmed">جايابيورا</exemplarCity>
+ </zone>
+ <zone type="Pacific/Enderbury">
+ <exemplarCity draft="unconfirmed">اندربيرج</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kiritimati">
+ <exemplarCity draft="unconfirmed">كيريتي ماتي</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tarawa">
+ <exemplarCity draft="unconfirmed">تاراوا</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtau">
+ <exemplarCity draft="unconfirmed">أكتاو</exemplarCity>
+ </zone>
+ <zone type="Asia/Oral">
+ <exemplarCity draft="unconfirmed">أورال</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtobe">
+ <exemplarCity draft="unconfirmed">أكتوب</exemplarCity>
+ </zone>
+ <zone type="Asia/Qyzylorda">
+ <exemplarCity draft="unconfirmed">كيزيلوردا</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity draft="unconfirmed">ألماتي</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kwajalein">
+ <exemplarCity draft="unconfirmed">كواجالين</exemplarCity>
+ </zone>
+ <zone type="Pacific/Majuro">
+ <exemplarCity draft="unconfirmed">ماجورو</exemplarCity>
+ </zone>
+ <zone type="Africa/Bamako">
+ <exemplarCity draft="unconfirmed">باماكو</exemplarCity>
+ </zone>
+ <zone type="Asia/Hovd">
+ <exemplarCity draft="unconfirmed">هوÙد</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity draft="unconfirmed">آلانباتار</exemplarCity>
+ </zone>
+ <zone type="Asia/Choibalsan">
+ <exemplarCity draft="unconfirmed">تشوبالسان</exemplarCity>
+ </zone>
+ <zone type="America/Tijuana">
+ <exemplarCity draft="unconfirmed">تيجوانا</exemplarCity>
+ </zone>
+ <zone type="America/Hermosillo">
+ <exemplarCity draft="unconfirmed">هيرموسيلو</exemplarCity>
+ </zone>
+ <zone type="America/Mazatlan">
+ <exemplarCity draft="unconfirmed">مازاتلان</exemplarCity>
+ </zone>
+ <zone type="America/Chihuahua">
+ <exemplarCity draft="unconfirmed">تشيواوا</exemplarCity>
+ </zone>
+ <zone type="America/Monterrey">
+ <exemplarCity draft="unconfirmed">مونتيري</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity draft="unconfirmed">مدينة المكسيك</exemplarCity>
+ </zone>
+ <zone type="America/Merida">
+ <exemplarCity draft="unconfirmed">ميريدا</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity draft="unconfirmed">كانكن</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuala_Lumpur">
+ <exemplarCity draft="unconfirmed">كوالالمبور</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuching">
+ <exemplarCity draft="unconfirmed">كيشينج</exemplarCity>
+ </zone>
+ <zone type="Pacific/Chatham">
+ <exemplarCity draft="unconfirmed">تشاثام</exemplarCity>
+ </zone>
+ <zone type="Pacific/Auckland">
+ <exemplarCity draft="unconfirmed">أوكلاند</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity draft="unconfirmed">تاهيتي</exemplarCity>
+ </zone>
+ <zone type="Pacific/Marquesas">
+ <exemplarCity draft="unconfirmed">ماركيساس</exemplarCity>
+ </zone>
+ <zone type="Pacific/Gambier">
+ <exemplarCity draft="unconfirmed">جامبير</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity draft="unconfirmed">أزورس</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Madeira">
+ <exemplarCity draft="unconfirmed">ماديرا</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity draft="unconfirmed">ليسبون</exemplarCity>
+ </zone>
+ <zone type="Europe/Kaliningrad">
+ <exemplarCity draft="unconfirmed">كالينجراد</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity draft="unconfirmed">موسكو</exemplarCity>
+ </zone>
+ <zone type="Europe/Samara">
+ <exemplarCity draft="unconfirmed">سمراء</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity draft="unconfirmed">يكاترنبيرج</exemplarCity>
+ </zone>
+ <zone type="Asia/Omsk">
+ <exemplarCity draft="unconfirmed">أومسك</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity draft="unconfirmed">نوÙوسبيرسك</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity draft="unconfirmed">كراسنويارسك</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity draft="unconfirmed">ايركيتسك</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity draft="unconfirmed">ياكتسك</exemplarCity>
+ </zone>
+ <zone type="Asia/Vladivostok">
+ <exemplarCity draft="unconfirmed">ÙلاديÙوستك</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity draft="unconfirmed">سكالين</exemplarCity>
+ </zone>
+ <zone type="Asia/Magadan">
+ <exemplarCity draft="unconfirmed">مجادن</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity draft="unconfirmed">كامتشاتكا</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity draft="unconfirmed">أندير</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Jan_Mayen">
+ <exemplarCity draft="unconfirmed">جان ماين</exemplarCity>
+ </zone>
+ <zone type="Arctic/Longyearbyen">
+ <exemplarCity draft="unconfirmed">لونجيربن</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity draft="unconfirmed">أوزجرود</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity draft="unconfirmed">كيÙ</exemplarCity>
+ </zone>
+ <zone type="Europe/Simferopol">
+ <exemplarCity draft="unconfirmed">سيمÙروبول</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity draft="unconfirmed">زابوروزي</exemplarCity>
+ </zone>
+ <zone type="Pacific/Midway">
+ <exemplarCity draft="unconfirmed">ميدواي</exemplarCity>
+ </zone>
+ <zone type="Pacific/Johnston">
+ <exemplarCity draft="unconfirmed">جونستون</exemplarCity>
+ </zone>
+ <zone type="Pacific/Wake">
+ <exemplarCity draft="unconfirmed">واك</exemplarCity>
+ </zone>
+ <zone type="America/Adak">
+ <exemplarCity draft="unconfirmed">أداك</exemplarCity>
+ </zone>
+ <zone type="America/Nome">
+ <exemplarCity draft="unconfirmed">نوم</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <exemplarCity draft="unconfirmed">هونولولو</exemplarCity>
+ </zone>
+ <zone type="America/Anchorage">
+ <exemplarCity draft="unconfirmed">أنشوراج</exemplarCity>
+ </zone>
+ <zone type="America/Yakutat">
+ <exemplarCity draft="unconfirmed">ياكوتات</exemplarCity>
+ </zone>
+ <zone type="America/Juneau">
+ <exemplarCity draft="unconfirmed">جوني</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <exemplarCity draft="unconfirmed">لوس انجلوس</exemplarCity>
+ </zone>
+ <zone type="America/Boise">
+ <exemplarCity draft="unconfirmed">بويس</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <exemplarCity draft="unconfirmed">Ùونكس</exemplarCity>
+ </zone>
+ <zone type="America/Shiprock">
+ <exemplarCity draft="unconfirmed">شيبروك</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <exemplarCity draft="unconfirmed">دنÙر</exemplarCity>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity draft="unconfirmed">سنتر</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <exemplarCity draft="unconfirmed">شيكاجو</exemplarCity>
+ </zone>
+ <zone type="America/Menominee">
+ <exemplarCity draft="unconfirmed">مينوميني</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Petersburg">
+ <exemplarCity>بيترسبرج</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Knox">
+ <exemplarCity draft="unconfirmed">كونكس</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Marengo">
+ <exemplarCity draft="unconfirmed">مارنجو</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <exemplarCity draft="unconfirmed">انديانانابوليس</exemplarCity>
+ </zone>
+ <zone type="America/Louisville">
+ <exemplarCity draft="unconfirmed">لويس Ùيل</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vevay">
+ <exemplarCity draft="unconfirmed">ÙÙŠÙاي</exemplarCity>
+ </zone>
+ <zone type="America/Kentucky/Monticello">
+ <exemplarCity draft="unconfirmed">مونتيسيلو</exemplarCity>
+ </zone>
+ <zone type="America/Detroit">
+ <exemplarCity draft="unconfirmed">ديترويت</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <exemplarCity draft="unconfirmed">نيويورك</exemplarCity>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity draft="unconfirmed">سمرقند</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity draft="unconfirmed">طشقند</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>Ù«</decimal>
+ <group>Ù¬</group>
+ <percentSign>Ùª</percentSign>
+ <nativeZeroDigit>Ù </nativeZeroDigit>
+ </symbols>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#,##0.###;#,##0.###-</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##0.00;¤ #,##0.00-</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ADP">
+ <displayName>بيستا أندورى</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>درهم اماراتى</displayName>
+ <symbol>د.Ø¥.â€</symbol>
+ </currency>
+ <currency type="AFA">
+ <displayName>Ø£Ùغاني - 1927-2002</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>Ø£Ùغانى</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName>ليك ألباني</displayName>
+ </currency>
+ <currency type="AMD">
+ <displayName>درام أرمينى</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName>جلدر هولندى [ANG]</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName>كوانزا أنجولى</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>كوانزا أنجولى - 1977-1990</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>كوانزا أنجولى جديدة - 1990-2000</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>كوانزا أنجولى معدلة - 1995 - 1999</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>استرال ارجنتينى</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>بيزو أرجنتينى - 1983-1985</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>بيزو أرجنتينى</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName>شلن نمساوى</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>دولار أسترالى</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName>جلدر أروبى</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>مانات أذريبجانى</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>دينار البوسنة و الهرسك</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>مارك البوسنة و الهرسك قابل للتحويل</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName>دولار بربادوسى</displayName>
+ </currency>
+ <currency type="BDT">
+ <displayName>تاكا بنجلاديشى</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Ùرنك بلجيكى</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>لي٠بلغارى</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>دينار بحرينى</displayName>
+ <symbol>د.ب.â€</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>Ùرنك بروندى</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName>دولار برمودى</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName>دولار بروناى</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>بوليÙاريو</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>بيزو بوليÙÙ‰</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Ù…Ùدول بوليÙÙ‰</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>نوÙÙˆ كروزايرو برازيلى - 1967-1986</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>كروزادو برازيلى</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>كروزايرو برازيلى - 1990-1993</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>ريال برازيلي</displayName>
+ <symbol>.â€Ø±.ب</symbol>
+ </currency>
+ <currency type="BSD">
+ <displayName>دولار باهامى</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>نولتوم بوتانى</displayName>
+ </currency>
+ <currency type="BUK">
+ <displayName>كيات بورمى</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>بولا بتسوانى</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>روبل بيلاروسى جديد - 1994-1999</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>روبل بيلاروسى</displayName>
+ </currency>
+ <currency type="BZD">
+ <displayName>دولار بليزى</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>دولار كندى</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Ùرنك سويسرى</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>بيزو شيلى</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>يوان صيني</displayName>
+ <symbol draft="unconfirmed">.â€ÙŠ.ص</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>بيزو كولومبى</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>كولن كوستا ريكى</displayName>
+ </currency>
+ <currency type="CSD">
+ <displayName>دينار صربى</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>كرونة تشيكوسلوÙاكيا</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>بيزو كوبى</displayName>
+ </currency>
+ <currency type="CYP">
+ <displayName>جنيه قبرصى</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName>كرونة تشيكية</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>أوستمارك المانى شرقى</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>مارك المانى</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Ùرنك جيبوتى</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName>كرونة دانماركى</displayName>
+ </currency>
+ <currency type="DOP">
+ <displayName>بيزو الدومنيكان</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName>دينار جزائرى</displayName>
+ <symbol>د.ج.â€</symbol>
+ </currency>
+ <currency type="EEK">
+ <displayName>كرونة استونية</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>جنيه مصرى</displayName>
+ <symbol>ج.Ù….â€</symbol>
+ </currency>
+ <currency type="ERN">
+ <displayName>ناكÙا أريترى</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>بيزيتا اسباني</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>بير أثيوبى</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>يورو</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>ماركا Ùنلندى</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>دولار Ùيجى</displayName>
+ </currency>
+ <currency type="FKP">
+ <displayName>جنيه جزر Ùوكلاند</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Ùرنك Ùرنسى</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>جنيه سترليني</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>لارى جورجى</displayName>
+ </currency>
+ <currency type="GHC">
+ <displayName>سيدى غانى</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>جنيه جبل طارق</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>دلاسي جامبي</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Ùرنك غينيا</displayName>
+ </currency>
+ <currency type="GNS">
+ <displayName>سيلى غينيا</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>اكويل جونينا غينيا الاستوائيّة</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>دراخما يونانى</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>كوتزال جواتيمالا</displayName>
+ </currency>
+ <currency type="GWE">
+ <displayName>اسكود برتغالى غينيا</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>بيزو غينيا بيساو</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>دولار غيانا</displayName>
+ </currency>
+ <currency type="HKD">
+ <displayName>دولار هونج كونج</displayName>
+ </currency>
+ <currency type="HNL">
+ <displayName>ليمبيرا هنداروس</displayName>
+ </currency>
+ <currency type="HRD">
+ <displayName>دينار كرواتى</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>كونا كرواتى</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>جوردى هايتى</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Ùورينت مجرى</displayName>
+ </currency>
+ <currency type="IDR">
+ <displayName>روبية اندونيسية</displayName>
+ </currency>
+ <currency type="IEP">
+ <displayName>جنيه ايرلندى</displayName>
+ </currency>
+ <currency type="ILP">
+ <displayName>جنيه اسرائيلى</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>شيكل اسرائيلى جديد</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>روبيه هندي</displayName>
+ <symbol>.â€Ø±.Ù‡</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>دينار عراقى</displayName>
+ <symbol>د.ع.â€</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>ريال ايرانى</displayName>
+ </currency>
+ <currency type="ISK">
+ <displayName>كرونه أيسلندى</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>ليرة ايطالية</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>دولار جامايكى</displayName>
+ </currency>
+ <currency type="JOD">
+ <displayName>دينار أردنى</displayName>
+ <symbol>د.Ø£.â€</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>ين ياباني</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>شلن كينيي</displayName>
+ </currency>
+ <currency type="KGS">
+ <displayName>سوم قيرغستانى</displayName>
+ </currency>
+ <currency type="KHR">
+ <displayName>رييال كمبودى</displayName>
+ </currency>
+ <currency type="KMF">
+ <displayName>Ùرنك جزر القمر</displayName>
+ <symbol>.â€Ù.ج.Ù‚</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>وون كوريا الشمالية</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>وون كوريا الجنوبية</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>دينار كويتى</displayName>
+ <symbol>د.Ùƒ.â€</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>دولار جزر كيمن</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>تينغ كازاخستانى</displayName>
+ </currency>
+ <currency type="LAK">
+ <displayName>كيب لاوسى</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>جنية لبنانى</displayName>
+ <symbol>Ù„.Ù„.â€</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>روبية سريلانكية</displayName>
+ </currency>
+ <currency type="LRD">
+ <displayName>دولار ليبيري</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>لوتى ليسوتو</displayName>
+ </currency>
+ <currency type="LSM">
+ <displayName>مالوتى</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>الليتا الليتوانية</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>تالوناس ليتوانى</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName>Ùرنك لوكسمبرج قابل للتحويل</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Ùرنك لوكسمبرج</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName>Ùرنك لوكسمبرج المالى</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>لاتس لاتÙيا</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>روبل لاتÙيا</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>دينار ليبى</displayName>
+ <symbol>د.Ù„.â€</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>درهم مغربى</displayName>
+ <symbol>د.Ù….â€</symbol>
+ </currency>
+ <currency type="MDL">
+ <displayName>لاو مولدوÙÙ‰</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>ارياري مدغشقر</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Ùرنك مدغشقر</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>دينار مقدونى</displayName>
+ </currency>
+ <currency type="MLF">
+ <displayName>Ùرنك مالى</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>كيات ميانمار</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>توغروغ منغولى</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>أوقية موريتانية</displayName>
+ <symbol>.â€Ø£.Ù…</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>ليرة مالطية</displayName>
+ </currency>
+ <currency type="MTP">
+ <displayName>جنيه مالطى</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>روبي موريشي</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>روÙيه جزر المالديÙ</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>كواشا مالاوى</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName>بيزو مكسيكى</displayName>
+ </currency>
+ <currency type="MXP">
+ <displayName>بيزو Ùضى مكسيكى - 1861-1992</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>رينغيت ماليزى</displayName>
+ </currency>
+ <currency type="MZE">
+ <displayName>اسكود موزمبيقى</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName>دولار نامبيا</displayName>
+ </currency>
+ <currency type="NGN">
+ <displayName>نايرا نيجيرى</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>كوردوبة نيكاراجوا</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>جلدر هولندى</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>كرونة نرويجية</displayName>
+ </currency>
+ <currency type="NPR">
+ <displayName>روبية نيبالي</displayName>
+ </currency>
+ <currency type="NZD">
+ <displayName>دولار نيوزيلندى</displayName>
+ </currency>
+ <currency type="OMR">
+ <displayName>ريال عمانى</displayName>
+ <symbol>ر.ع.â€</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>بالبوا بنمى</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>كينا بابوا غينيا الجديدة</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>بيزو Ùلبينى</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>روبية باكستاني</displayName>
+ </currency>
+ <currency type="PLN">
+ <displayName>زلوتى بولندى</displayName>
+ </currency>
+ <currency type="PLZ">
+ <displayName>زلوتى بولندى - 1950-1995</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>اسكود برتغالى</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>جواراني باراجواي</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>ريال قطرى</displayName>
+ <symbol>ر.Ù‚.â€</symbol>
+ </currency>
+ <currency type="RHD">
+ <displayName>دولار روديسى</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>ليو رومانى قديم</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>روبل روسي</displayName>
+ <symbol>ر.ر.â€</symbol>
+ </currency>
+ <currency type="RUR">
+ <displayName>روبل روسى - 1991-1998</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>Ùرنك رواندى</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>ريال سعودى</displayName>
+ <symbol>ر.س.â€</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>دولار جزر سليمان</displayName>
+ </currency>
+ <currency type="SCR">
+ <displayName>روبية سيشيلية</displayName>
+ </currency>
+ <currency type="SDD">
+ <displayName>دينار سوداني</displayName>
+ <symbol>.â€Ø¯.س</symbol>
+ </currency>
+ <currency type="SDP">
+ <displayName>جنيه سودانى</displayName>
+ <symbol>ج.س.â€</symbol>
+ </currency>
+ <currency type="SEK">
+ <displayName>كرونة سويدية</displayName>
+ </currency>
+ <currency type="SGD">
+ <displayName>دولار سنغاÙورى</displayName>
+ </currency>
+ <currency type="SHP">
+ <displayName>جنيه سانت هيلين</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>تولار سلوÙيني</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>كرونة سلوÙاكية</displayName>
+ </currency>
+ <currency type="SLL">
+ <displayName>ليون سيراليونى</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>شلن صومالى</displayName>
+ </currency>
+ <currency type="SRD">
+ <displayName>دولار سورينامى</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>جلدر سورينامى</displayName>
+ </currency>
+ <currency type="STD">
+ <displayName>دوبرا ساو تومي وبرينسيبي</displayName>
+ </currency>
+ <currency type="SUR">
+ <displayName>روبل سوÙيتى</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>كولون سلÙادورى</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>جنيه سورى</displayName>
+ <symbol>Ù„.س.â€</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>ليلانجيني سوازيلندى</displayName>
+ </currency>
+ <currency type="THB">
+ <displayName>باخت تايلاندى</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>روبل طاجيكستانى</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>سوموني طاجيكستانى</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>مانات تركمنستانى</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>دينارتونسى</displayName>
+ <symbol>د.ت.â€</symbol>
+ </currency>
+ <currency type="TPE">
+ <displayName>اسكود تيمورى</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>ليرة تركي</displayName>
+ </currency>
+ <currency type="TRY">
+ <displayName>ليرة تركية جديدة</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>دولار ترينداد و توباجو</displayName>
+ </currency>
+ <currency type="TWD">
+ <displayName>دولار تايوانى</displayName>
+ </currency>
+ <currency type="TZS">
+ <displayName>شلن تنزانى</displayName>
+ </currency>
+ <currency type="UAH">
+ <displayName>هريÙنيا أوكرانى</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>شلن أوغندى - 1966-1987</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>شلن أوغندى</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>دولار أمريكي</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>بيزو أوروجواى - 1975-1993</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName>سوم أوزبكستانى</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>بوليÙار Ùنزويلي</displayName>
+ </currency>
+ <currency type="VND">
+ <displayName>دونج Ùيتنامى</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>Ùرنك اÙريقي</displayName>
+ <symbol>.â€Ù.ا</symbol>
+ </currency>
+ <currency type="XAG">
+ <displayName>Ùضة</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>ذهب</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>الوحدة الأوروبية المركبة</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>الوحدة المالية الأوروبية</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>الوحدة الحسابية الأوروبية</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>دولار شرق الكاريبى</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>وحدة النقد الأوروبية</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>Ùرنك Ùرنسى ذهبى</displayName>
+ </currency>
+ <currency type="XPT">
+ <displayName>البلاتين</displayName>
+ </currency>
+ <currency type="XTS">
+ <displayName>كود اختبار العملة</displayName>
+ </currency>
+ <currency type="XXX">
+ <displayName>بدون عملة</displayName>
+ <symbol draft="unconfirmed">XXXâ€</symbol>
+ </currency>
+ <currency type="YDD">
+ <displayName>دينار يمنى</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>ريال يمنى</displayName>
+ <symbol>ر.ÙŠ.â€</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>دينار يوغسلاÙÙ‰</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>دينار يوغسلاÙÙ‰ قابل للتحويل</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>راند جنوب Ø£Ùريقيا -مالى</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>راند جنوب Ø£Ùريقيا</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName>كواشا زامبى</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>زائير زائيرى جديد</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>زائير زائيرى</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>دولار زمبابوى</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>نعم:ن</yesstr>
+ <nostr>لا:ل</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ar_AE.xml b/libs/Zend/Locale/Data/ar_AE.xml
new file mode 100755
index 0000000000..eb45bd4d61
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_AE.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="AE"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_BH.xml b/libs/Zend/Locale/Data/ar_BH.xml
new file mode 100755
index 0000000000..776d0ebf11
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_BH.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="BH"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_DZ.xml b/libs/Zend/Locale/Data/ar_DZ.xml
new file mode 100755
index 0000000000..412e71721a
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_DZ.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="DZ"/>
+ </identity>
+ <numbers>
+ <symbols>
+ <nativeZeroDigit>0</nativeZeroDigit>
+ </symbols>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_EG.xml b/libs/Zend/Locale/Data/ar_EG.xml
new file mode 100755
index 0000000000..b56d8bd9e0
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_EG.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="EG"/>
+ </identity>
+ <localeDisplayNames>
+ <scripts>
+ <script type="Ital" draft="provisional">الأيطالية القديمة</script>
+ </scripts>
+ </localeDisplayNames>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">&quot;</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">&quot;</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">قبل الميلاد</era>
+ <era type="1" draft="unconfirmed">ميلادي</era>
+ </eraNames>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_IQ.xml b/libs/Zend/Locale/Data/ar_IQ.xml
new file mode 100755
index 0000000000..aa7780f297
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_IQ.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="IQ"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_JO.xml b/libs/Zend/Locale/Data/ar_JO.xml
new file mode 100755
index 0000000000..0efad5d18a
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_JO.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="JO"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">كانون الثاني</month>
+ <month type="2">شباط</month>
+ <month type="3">آذار</month>
+ <month type="4">نيسان</month>
+ <month type="5">أيار</month>
+ <month type="6">حزيران</month>
+ <month type="7">تموز</month>
+ <month type="8">آب</month>
+ <month type="9">أيلول</month>
+ <month type="10">تشرين الأول</month>
+ <month type="11">تشرين الثاني</month>
+ <month type="12">كانون الأول</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">كانون الثاني</month>
+ <month type="2">شباط</month>
+ <month type="3">آذار</month>
+ <month type="4">نيسان</month>
+ <month type="5">أيار</month>
+ <month type="6">حزيران</month>
+ <month type="7">تموز</month>
+ <month type="8">آب</month>
+ <month type="9">أيلول</month>
+ <month type="10">تشرين الأول</month>
+ <month type="11">تشرين الثاني</month>
+ <month type="12">كانون الأول</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">الأحد</day>
+ <day type="mon">الاثنين</day>
+ <day type="tue">الثلاثاء</day>
+ <day type="wed">الأربعاء</day>
+ <day type="thu">الخميس</day>
+ <day type="fri">الجمعة</day>
+ <day type="sat">السبت</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_KW.xml b/libs/Zend/Locale/Data/ar_KW.xml
new file mode 100755
index 0000000000..f2c04600d8
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_KW.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="KW"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_LB.xml b/libs/Zend/Locale/Data/ar_LB.xml
new file mode 100755
index 0000000000..6da47e688a
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_LB.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.36 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="LB"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">&quot;</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">&quot;</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">كانون الثاني</month>
+ <month type="2">شباط</month>
+ <month type="3">آذار</month>
+ <month type="4">نيسان</month>
+ <month type="5">نوار</month>
+ <month type="6">حزيران</month>
+ <month type="7">تموز</month>
+ <month type="8">آب</month>
+ <month type="9">أيلول</month>
+ <month type="10">تشرين الأول</month>
+ <month type="11">تشرين الثاني</month>
+ <month type="12">كانون الأول</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">كانون الثاني</month>
+ <month type="2">شباط</month>
+ <month type="3">آذار</month>
+ <month type="4">نيسان</month>
+ <month type="5">نوار</month>
+ <month type="6">حزيران</month>
+ <month type="7">تموز</month>
+ <month type="8">آب</month>
+ <month type="9">أيلول</month>
+ <month type="10">تشرين الأول</month>
+ <month type="11">تشرين الثاني</month>
+ <month type="12">كانون الأول</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">الأحد</day>
+ <day type="mon">الاثنين</day>
+ <day type="tue">الثلاثاء</day>
+ <day type="wed">الأربعاء</day>
+ <day type="thu">الخميس</day>
+ <day type="fri">الجمعة</day>
+ <day type="sat">السبت</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_LY.xml b/libs/Zend/Locale/Data/ar_LY.xml
new file mode 100755
index 0000000000..7a2f71232d
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_LY.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="LY"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_MA.xml b/libs/Zend/Locale/Data/ar_MA.xml
new file mode 100755
index 0000000000..45ec85d656
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_MA.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="MA"/>
+ </identity>
+ <numbers>
+ <symbols>
+ <nativeZeroDigit>0</nativeZeroDigit>
+ </symbols>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_OM.xml b/libs/Zend/Locale/Data/ar_OM.xml
new file mode 100755
index 0000000000..ec77b239a6
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_OM.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="OM"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_QA.xml b/libs/Zend/Locale/Data/ar_QA.xml
new file mode 100755
index 0000000000..1fafb35b94
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_QA.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="QA"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">الأحد</day>
+ <day type="mon">الاثنين</day>
+ <day type="tue">الثلاثاء</day>
+ <day type="wed">الأربعاء</day>
+ <day type="thu">الخميس</day>
+ <day type="fri">الجمعة</day>
+ <day type="sat">السبت</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#0.###;#0.###-</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_SA.xml b/libs/Zend/Locale/Data/ar_SA.xml
new file mode 100755
index 0000000000..3baae7eb43
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_SA.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="SA"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">&quot;</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">&quot;</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">الأحد</day>
+ <day type="mon">الاثنين</day>
+ <day type="tue">الثلاثاء</day>
+ <day type="wed">الأربعاء</day>
+ <day type="thu">الخميس</day>
+ <day type="fri">الجمعة</day>
+ <day type="sat">السبت</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">قبل الميلاد</era>
+ <era type="1" draft="unconfirmed">ميلادي</era>
+ </eraNames>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#0.###;#0.###-</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_SD.xml b/libs/Zend/Locale/Data/ar_SD.xml
new file mode 100755
index 0000000000..40af70b5cd
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_SD.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.35 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="SD"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_SY.xml b/libs/Zend/Locale/Data/ar_SY.xml
new file mode 100755
index 0000000000..a7e20e6819
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_SY.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.40 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="SY"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">كانون الثاني</month>
+ <month type="2">شباط</month>
+ <month type="3">آذار</month>
+ <month type="4">نيسان</month>
+ <month type="5">نوار</month>
+ <month type="6">حزيران</month>
+ <month type="7">تموز</month>
+ <month type="8">آب</month>
+ <month type="9">أيلول</month>
+ <month type="10">تشرين الأول</month>
+ <month type="11">تشرين الثاني</month>
+ <month type="12">كانون الأول</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">كانون الثاني</month>
+ <month type="2">شباط</month>
+ <month type="3">آذار</month>
+ <month type="4">نيسان</month>
+ <month type="5">نوار</month>
+ <month type="6">حزيران</month>
+ <month type="7">تموز</month>
+ <month type="8">آب</month>
+ <month type="9">أيلول</month>
+ <month type="10">تشرين الأول</month>
+ <month type="11">تشرين الثاني</month>
+ <month type="12">كانون الأول</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">الأحد</day>
+ <day type="mon">الاثنين</day>
+ <day type="tue">الثلاثاء</day>
+ <day type="wed">الأربعاء</day>
+ <day type="thu">الخميس</day>
+ <day type="fri">الجمعة</day>
+ <day type="sat">السبت</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#0.###;#0.###-</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_TN.xml b/libs/Zend/Locale/Data/ar_TN.xml
new file mode 100755
index 0000000000..43e40d3e15
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_TN.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="TN"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">&quot;</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">&quot;</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">الأحد</day>
+ <day type="mon">الاثنين</day>
+ <day type="tue">الثلاثاء</day>
+ <day type="wed">الأربعاء</day>
+ <day type="thu">الخميس</day>
+ <day type="fri">الجمعة</day>
+ <day type="sat">السبت</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <nativeZeroDigit>0</nativeZeroDigit>
+ </symbols>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#0.###;#0.###-</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ar_YE.xml b/libs/Zend/Locale/Data/ar_YE.xml
new file mode 100755
index 0000000000..e6b4215222
--- /dev/null
+++ b/libs/Zend/Locale/Data/ar_YE.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ar"/>
+ <territory type="YE"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">الأحد</day>
+ <day type="mon">الاثنين</day>
+ <day type="tue">الثلاثاء</day>
+ <day type="wed">الأربعاء</day>
+ <day type="thu">الخميس</day>
+ <day type="fri">الجمعة</day>
+ <day type="sat">السبت</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#0.###;#0.###-</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/as.xml b/libs/Zend/Locale/Data/as.xml
new file mode 100755
index 0000000000..3c132c60fc
--- /dev/null
+++ b/libs/Zend/Locale/Data/as.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.31 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="as"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="as">অসমীয়া</language>
+ </languages>
+ <territories>
+ <territory type="IN">ভাৰত</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[় à¦-ঃ অ-ঋ ৠ ঌ ৡ ঠঠও-ড {ড়} ঢ {ঢ়} ণ ত ৎ থ-ন প-য {য়} ৰ ল ৱ শ-হ ঽ-ৄ ৢ ৣ ে ৈ ো-ৠৗ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D ৲]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">জানà§</month>
+ <month type="2">ফেবà§à§°à§</month>
+ <month type="3">মাৰà§à¦š</month>
+ <month type="4">à¦à¦ªà§à§°à¦¿à¦²</month>
+ <month type="5">মে</month>
+ <month type="6">জà§à¦¨</month>
+ <month type="7">জà§à¦²à¦¾à¦‡</month>
+ <month type="8">আগ</month>
+ <month type="9">সেপà§à¦Ÿ</month>
+ <month type="10">অকà§à¦Ÿà§‹</month>
+ <month type="11">নভে</month>
+ <month type="12">ডিসে</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">জানà§à¦¯à¦¼à¦¾à§°à§€</month>
+ <month type="2">ফেবà§à§°à§à¦¯à¦¼à¦¾à§°à§€</month>
+ <month type="3">মাৰà§à¦š</month>
+ <month type="4">à¦à¦ªà§à§°à¦¿à¦²</month>
+ <month type="5">মে</month>
+ <month type="6">জà§à¦¨</month>
+ <month type="7">জà§à¦²à¦¾à¦‡</month>
+ <month type="8">আগষà§à¦Ÿ</month>
+ <month type="9">সেপà§à¦Ÿà§‡à¦®à§à¦¬à§°</month>
+ <month type="10">অকà§à¦Ÿà§‹à¦¬à§°</month>
+ <month type="11">নভেমà§à¦¬à§°</month>
+ <month type="12">ডিসেমà§à¦¬à§°</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">ৰবি</day>
+ <day type="mon">সোম</day>
+ <day type="tue">মঙà§à¦—ল</day>
+ <day type="wed">বà§à¦§</day>
+ <day type="thu">বৃহষà§à¦ªà¦¤à¦¿</day>
+ <day type="fri">শà§à¦•à§à§°</day>
+ <day type="sat">শনি</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">দেওবাৰ</day>
+ <day type="mon">সোমবাৰ</day>
+ <day type="tue">মঙà§à¦—লবাৰ</day>
+ <day type="wed">বà§à¦§à¦¬à¦¾à§°</day>
+ <day type="thu">বৃহষà§à¦ªà¦¤à¦¿à¦¬à¦¾à§°</day>
+ <day type="fri">শà§à¦•à§à§°à¦¬à¦¾à§°</day>
+ <day type="sat">শনিবাৰ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am>পূৰà§à¦¬à¦¾</am>
+ <pm>অপ</pm>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Asia/Calcutta">
+ <long>
+ <standard>ভাৰতীয় সময়</standard>
+ <daylight>ভাৰতীয় সময়</daylight>
+ </long>
+ <short>
+ <standard>ভা. স.</standard>
+ <daylight>ভা. স.</daylight>
+ </short>
+ <exemplarCity>à¦à¦²à¦¾à¦¹à¦¾à§±à¦¾à¦¦</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="INR">
+ <symbol references="RP1">টকা</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1" uri="http://www.iitg.ernet.in/rcilts/newassamesedesign.pdf">Assamese Design Guide, IIT Guwahati</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/as_IN.xml b/libs/Zend/Locale/Data/as_IN.xml
new file mode 100755
index 0000000000..1fe6631277
--- /dev/null
+++ b/libs/Zend/Locale/Data/as_IN.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.29 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="as"/>
+ <territory type="IN"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d MMMM, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d-M-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h.mm.ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h.mm.ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">h.mm.ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h.mm. a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM, yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/az.xml b/libs/Zend/Locale/Data/az.xml
new file mode 100755
index 0000000000..41ae72cdf4
--- /dev/null
+++ b/libs/Zend/Locale/Data/az.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="az"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="az">azərbaycanca</language>
+ </languages>
+ <territories>
+ <territory type="AZ">Azərbaycan</territory>
+ <territory type="BR">Braziliya</territory>
+ <territory type="CN">Çin</territory>
+ <territory type="DE">Almaniya</territory>
+ <territory type="FR">Fransa</territory>
+ <territory type="IN">Hindistan</territory>
+ <territory type="IT">Ä°taliya</territory>
+ <territory type="JP">Yaponiya</territory>
+ <territory type="RU">Rusiya</territory>
+ <territory type="US">Amerika Birləşmiş Ştatları</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-c ç d e ə f g ğ h i İ ı j-o ö p-s ş t u ü v x-z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[w]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">yan</month>
+ <month type="2" draft="unconfirmed">fev</month>
+ <month type="3" draft="unconfirmed">mar</month>
+ <month type="4" draft="unconfirmed">apr</month>
+ <month type="5" draft="unconfirmed">may</month>
+ <month type="6" draft="unconfirmed">iyn</month>
+ <month type="7" draft="unconfirmed">iyl</month>
+ <month type="8" draft="unconfirmed">avq</month>
+ <month type="9" draft="unconfirmed">sen</month>
+ <month type="10" draft="unconfirmed">okt</month>
+ <month type="11" draft="unconfirmed">noy</month>
+ <month type="12" draft="unconfirmed">dek</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Yanvar</month>
+ <month type="2" draft="unconfirmed">Fevral</month>
+ <month type="3" draft="unconfirmed">Mart</month>
+ <month type="4" draft="unconfirmed">Aprel</month>
+ <month type="5" draft="unconfirmed">May</month>
+ <month type="6" draft="unconfirmed">Ä°yun</month>
+ <month type="7" draft="unconfirmed">Ä°yul</month>
+ <month type="8" draft="unconfirmed">Avqust</month>
+ <month type="9" draft="unconfirmed">Sentyabr</month>
+ <month type="10" draft="unconfirmed">Oktyabr</month>
+ <month type="11" draft="unconfirmed">Noyabr</month>
+ <month type="12" draft="unconfirmed">Dekabr</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">B.</day>
+ <day type="mon" draft="unconfirmed">B.e.</day>
+ <day type="tue" draft="unconfirmed">Ç.a.</day>
+ <day type="wed" draft="unconfirmed">Ç.</day>
+ <day type="thu" draft="unconfirmed">C.a.</day>
+ <day type="fri" draft="unconfirmed">C.</day>
+ <day type="sat" draft="unconfirmed">Åž.</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">bazar</day>
+ <day type="mon" draft="unconfirmed">bazar ertəsi</day>
+ <day type="tue" draft="unconfirmed">çərşənbə axşam</day>
+ <day type="wed" draft="unconfirmed">çərşənbə</day>
+ <day type="thu" draft="unconfirmed">cümə axşamı</day>
+ <day type="fri" draft="unconfirmed">cümə axşamı</day>
+ <day type="sat" draft="unconfirmed">şənbə</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">1-ci kv.</quarter>
+ <quarter type="2" draft="unconfirmed">2-ci kv.</quarter>
+ <quarter type="3" draft="unconfirmed">3-cü kv.</quarter>
+ <quarter type="4" draft="unconfirmed">4-cü kv.</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">1-ci kvartal</quarter>
+ <quarter type="2" draft="unconfirmed">2-ci kvartal</quarter>
+ <quarter type="3" draft="unconfirmed">3-cü kvartal</quarter>
+ <quarter type="4" draft="unconfirmed">4-cü kvartal</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">eramızdan əvvəl</era>
+ <era type="1" draft="unconfirmed">bizim eramızın</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">e.É™.</era>
+ <era type="1" draft="unconfirmed">b.e.</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal draft="unconfirmed">,</decimal>
+ <group draft="unconfirmed"> </group>
+ </symbols>
+ <currencies>
+ <currency type="AZM">
+ <displayName>Manat</displayName>
+ <symbol>man.</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/az_AZ.xml b/libs/Zend/Locale/Data/az_AZ.xml
new file mode 100755
index 0000000000..c3c59fce96
--- /dev/null
+++ b/libs/Zend/Locale/Data/az_AZ.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.29 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="az"/>
+ <territory type="AZ"/>
+ </identity>
+ <alias source="az_Latn_AZ" path="//ldml" draft="unconfirmed"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/az_Cyrl.xml b/libs/Zend/Locale/Data/az_Cyrl.xml
new file mode 100755
index 0000000000..d3dbaa8f3d
--- /dev/null
+++ b/libs/Zend/Locale/Data/az_Cyrl.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.18 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="az"/>
+ <script type="Cyrl"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="az" draft="unconfirmed">Ðзәрбајҹан</language>
+ <language type="de">алманҹа</language>
+ <language type="en">инÒилиÑÒ¹Ó™</language>
+ <language type="es">иÑпанҹа</language>
+ <language type="fr">франÑызҹа</language>
+ <language type="it">италјанҹа</language>
+ <language type="ja">јапонҹа</language>
+ <language type="pt">португалҹа</language>
+ <language type="ru">руÑҹа</language>
+ <language type="zh">чинҹә</language>
+ </languages>
+ <territories>
+ <territory type="AZ" draft="unconfirmed">Ðзәрбајҹан</territory>
+ <territory type="BR">Бразилија</territory>
+ <territory type="CN">Чин</territory>
+ <territory type="DE">Ðлманија</territory>
+ <territory type="FR">ФранÑа</territory>
+ <territory type="IN">ҺиндиÑтан</territory>
+ <territory type="IT">Италија</territory>
+ <territory type="JP">Јапонија</territory>
+ <territory type="RU">РуÑија</territory>
+ <territory type="US">Ðмерика Бирләшмиш Штатлары</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[а Ó™ б-г Ò“ д-й ј к Ò Ð»-о Ó© п-у Ò¯ Ñ„ Ñ… Ò» ч Ò¹ ш Ñ‹]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[ц щ ÑŠ ÑŒ-Ñ]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">јанвар</month>
+ <month type="2" draft="unconfirmed">феврал</month>
+ <month type="3" draft="unconfirmed">март</month>
+ <month type="4" draft="unconfirmed">апрел</month>
+ <month type="5" draft="unconfirmed">май</month>
+ <month type="6" draft="unconfirmed">ијун</month>
+ <month type="7" draft="unconfirmed">ијул</month>
+ <month type="8" draft="unconfirmed">авгуÑÑ‚</month>
+ <month type="9" draft="unconfirmed">Ñентјабр</month>
+ <month type="10" draft="unconfirmed">октјабр</month>
+ <month type="11" draft="unconfirmed">нојабр</month>
+ <month type="12" draft="unconfirmed">декабр</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">базар</day>
+ <day type="mon" draft="unconfirmed">базар ертәÑи</day>
+ <day type="tue" draft="unconfirmed">чәршәнбә ахшамы</day>
+ <day type="wed" draft="unconfirmed">чәршәнбә</day>
+ <day type="thu" draft="unconfirmed">ҹүмә ахшамы</day>
+ <day type="fri" draft="unconfirmed">ҹүмә</day>
+ <day type="sat" draft="unconfirmed">шәнбә</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="AZM">
+ <displayName draft="unconfirmed">манат</displayName>
+ <symbol>ман.</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/az_Cyrl_AZ.xml b/libs/Zend/Locale/Data/az_Cyrl_AZ.xml
new file mode 100755
index 0000000000..de73513d22
--- /dev/null
+++ b/libs/Zend/Locale/Data/az_Cyrl_AZ.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.14 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="az"/>
+ <script type="Cyrl"/>
+ <territory type="AZ"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/az_Latn.xml b/libs/Zend/Locale/Data/az_Latn.xml
new file mode 100755
index 0000000000..20a76b2e25
--- /dev/null
+++ b/libs/Zend/Locale/Data/az_Latn.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.18 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="az"/>
+ <script type="Latn"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="de">almanca</language>
+ <language type="en">ingiliscÉ™</language>
+ <language type="es">ispanca</language>
+ <language type="fr">fransızca</language>
+ <language type="ja">yaponca</language>
+ <language type="pt">portuqalca</language>
+ <language type="ru">rusca</language>
+ <language type="zh">çincə</language>
+ </languages>
+ </localeDisplayNames>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/az_Latn_AZ.xml b/libs/Zend/Locale/Data/az_Latn_AZ.xml
new file mode 100755
index 0000000000..b7e40c6817
--- /dev/null
+++ b/libs/Zend/Locale/Data/az_Latn_AZ.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.17 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="az"/>
+ <script type="Latn"/>
+ <territory type="AZ"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/be.xml b/libs/Zend/Locale/Data/be.xml
new file mode 100755
index 0000000000..4a195defb5
--- /dev/null
+++ b/libs/Zend/Locale/Data/be.xml
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.52 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="be"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar">арабÑкі</language>
+ <language type="be">БеларуÑкі</language>
+ <language type="de">нÑмецкі</language>
+ <language type="en">англійÑкі</language>
+ <language type="es">Ñ–ÑпанÑкі</language>
+ <language type="fr">французÑкі</language>
+ <language type="hi">хіндзі</language>
+ <language type="it">італьÑнÑкі</language>
+ <language type="ja">ÑпонÑкі</language>
+ <language type="pt">партугальÑкі</language>
+ <language type="ru">руÑкі</language>
+ <language type="zh">кітайÑкі</language>
+ </languages>
+ <scripts>
+ <script type="Cyrl">кірылічны</script>
+ <script type="Latn">лацінÑкі</script>
+ </scripts>
+ <territories>
+ <territory type="BR">БразіліÑ</territory>
+ <territory type="BY">БеларуÑÑŒ</territory>
+ <territory type="CN">Кітай</territory>
+ <territory type="DE">ГерманіÑ</territory>
+ <territory type="FR">ФранцыÑ</territory>
+ <territory type="GB">ВелікабрытаніÑ</territory>
+ <territory type="IN">ІндыÑ</territory>
+ <territory type="IT">ІталіÑ</territory>
+ <territory type="JP">ЯпоніÑ</territory>
+ <territory type="RU">РаÑÑ–Ñ</territory>
+ <territory type="US">Ð—Ð»ÑƒÑ‡Ð°Ð½Ñ‹Ñ Ð¨Ñ‚Ð°Ñ‚Ñ‹</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[’ а-д {дж} {дз} е Ñ‘ ж з й Ñ– к-у Ñž Ñ„-ш Ñ‹-Ñ]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Ñту</month>
+ <month type="2">лют</month>
+ <month type="3">Ñак</month>
+ <month type="4">кра</month>
+ <month type="5">май</month>
+ <month type="6">чÑÑ€</month>
+ <month type="7">ліп</month>
+ <month type="8">жні</month>
+ <month type="9">вер</month>
+ <month type="10">каÑ</month>
+ <month type="11">ліÑ</month>
+ <month type="12">Ñне</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Ñтудзень</month>
+ <month type="2">люты</month>
+ <month type="3">Ñакавік</month>
+ <month type="4">краÑавік</month>
+ <month type="5">май</month>
+ <month type="6">чÑрвень</month>
+ <month type="7">ліпень</month>
+ <month type="8">жнівень</month>
+ <month type="9">вераÑень</month>
+ <month type="10">каÑтрычнік</month>
+ <month type="11">ліÑтапад</month>
+ <month type="12">Ñнежань</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">Ñ</month>
+ <month type="2">л</month>
+ <month type="3">Ñ</month>
+ <month type="4">к</month>
+ <month type="5">м</month>
+ <month type="6">ч</month>
+ <month type="7">л</month>
+ <month type="8">ж</month>
+ <month type="9">в</month>
+ <month type="10">к</month>
+ <month type="11">л</month>
+ <month type="12">Ñ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">нд</day>
+ <day type="mon">пн</day>
+ <day type="tue">аў</day>
+ <day type="wed">ÑÑ€</day>
+ <day type="thu">чц</day>
+ <day type="fri">пт</day>
+ <day type="sat">Ñб</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">нÑдзелÑ</day>
+ <day type="mon">панÑдзелак</day>
+ <day type="tue">аўторак</day>
+ <day type="wed">Ñерада</day>
+ <day type="thu">чацвер</day>
+ <day type="fri">пÑтніца</day>
+ <day type="sat">Ñубота</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">н</day>
+ <day type="mon">п</day>
+ <day type="tue">а</day>
+ <day type="wed">Ñ</day>
+ <day type="thu">ч</day>
+ <day type="fri">п</day>
+ <day type="sat">Ñ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">1-ы кв.</quarter>
+ <quarter type="2" draft="unconfirmed">2-ы кв.</quarter>
+ <quarter type="3" draft="unconfirmed">3-ы кв.</quarter>
+ <quarter type="4" draft="unconfirmed">4-ы кв.</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">1-ы квартал</quarter>
+ <quarter type="2" draft="unconfirmed">2-ы квартал</quarter>
+ <quarter type="3" draft="unconfirmed">3-ы квартал</quarter>
+ <quarter type="4" draft="unconfirmed">4-ы квартал</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraAbbr>
+ <era type="0">да н.е.</era>
+ <era type="1">н.е.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d.M.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d.M.yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH.mm.ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>HH.mm.ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>HH.mm.ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>HH.mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">d.M</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm.ss</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">M.yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <currencies>
+ <currency type="BRL">
+ <displayName>бразільÑкі Ñ€Ñал</displayName>
+ </currency>
+ <currency type="BYB">
+ <symbol>Руб</symbol>
+ </currency>
+ <currency type="BYR">
+ <displayName>беларуÑкі рубель</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>кітайÑкі юань Renminbi</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>еўра</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>англійÑкі фунт</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>індыйÑÐºÐ°Ñ Ñ€ÑƒÐ¿Ñ–Ñ</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>ÑпонÑÐºÐ°Ñ Ñ–ÐµÐ½Ð°</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>руÑкі рубель</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>долар ЗШÐ</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>так:т</yesstr>
+ <nostr>не:н</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/be_BY.xml b/libs/Zend/Locale/Data/be_BY.xml
new file mode 100755
index 0000000000..7f95c63d77
--- /dev/null
+++ b/libs/Zend/Locale/Data/be_BY.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="be"/>
+ <territory type="BY"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/bg.xml b/libs/Zend/Locale/Data/bg.xml
new file mode 100755
index 0000000000..18f9b38431
--- /dev/null
+++ b/libs/Zend/Locale/Data/bg.xml
@@ -0,0 +1,2189 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.72 $"/>
+ <generation date="$Date: 2006/10/26 22:46:07 $"/>
+ <language type="bg"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa" draft="provisional">Ðфар</language>
+ <language type="ab">ÐбхазÑки</language>
+ <language type="ace" draft="provisional">ÐчинÑки</language>
+ <language type="ach" draft="provisional">Ðколи</language>
+ <language type="ada" draft="provisional">Ðдангме</language>
+ <language type="ady">Ðдиге</language>
+ <language type="af">ÐфриканÑ</language>
+ <language type="af" alt="proposed-u195-1" draft="provisional">ÐфрикаанÑ</language>
+ <language type="afa">Ðфро-азиатÑки (други)</language>
+ <language type="afh">Ðфрихили</language>
+ <language type="ain" draft="provisional">Ðйну</language>
+ <language type="ak" draft="provisional">Ðкан</language>
+ <language type="akk" draft="provisional">ÐкадÑки</language>
+ <language type="ale">ÐлеутÑки</language>
+ <language type="alt" draft="provisional">ЮжноалтайÑки</language>
+ <language type="am">ÐмхарÑки</language>
+ <language type="an" draft="provisional">ÐрагонÑки</language>
+ <language type="ang">СтароанглийÑки (ca.450-1100)</language>
+ <language type="apa">Езици на апахите</language>
+ <language type="ar">ÐрабÑки</language>
+ <language type="arc" draft="provisional">ÐрамейÑки</language>
+ <language type="arn" draft="provisional">Мапуче</language>
+ <language type="arp" draft="provisional">Ðрапахо</language>
+ <language type="art">ИзкуÑтвен (други)</language>
+ <language type="as" draft="provisional">ÐÑамÑки</language>
+ <language type="ast" draft="provisional">ÐÑтурÑки</language>
+ <language type="ath" draft="provisional">Езици ÐтъбаÑка</language>
+ <language type="aus">ÐвÑтралийÑки езици</language>
+ <language type="av">ÐварÑки</language>
+ <language type="awa" draft="provisional">Ðвадхи</language>
+ <language type="ay">Ðймара</language>
+ <language type="az">ÐзърбайджанÑки</language>
+ <language type="ba">БашкирÑки</language>
+ <language type="bad" draft="provisional">Банда</language>
+ <language type="bai" draft="provisional">Езици Бамилеке</language>
+ <language type="bal">Балучи</language>
+ <language type="ban" draft="provisional">БалинейÑки</language>
+ <language type="bas" draft="provisional">БаÑа</language>
+ <language type="bat">ПрибалтийÑки (други)</language>
+ <language type="be">БеларуÑки</language>
+ <language type="bej" draft="provisional">БеÑ</language>
+ <language type="bem" draft="provisional">Бемба</language>
+ <language type="ber">берберÑки</language>
+ <language type="bg">БългарÑки</language>
+ <language type="bh" draft="provisional">Езици Бихари</language>
+ <language type="bho">Божпури</language>
+ <language type="bi">БиÑлама</language>
+ <language type="bik" draft="provisional">БиколÑки</language>
+ <language type="bn">БенгалÑки</language>
+ <language type="bnt">Банту</language>
+ <language type="bo">ТибетÑки</language>
+ <language type="br">БретонÑки</language>
+ <language type="bs">БоÑненÑки</language>
+ <language type="ca">КаталонÑки</language>
+ <language type="cai">ЦентралноамериканÑки индианÑки (други)</language>
+ <language type="car">КарибÑки</language>
+ <language type="cau">КавказÑки (други)</language>
+ <language type="ce">ЧеченÑки</language>
+ <language type="cel">КелтÑки (други)</language>
+ <language type="chr">чероки</language>
+ <language type="chr" alt="proposed-u61-1" draft="provisional">Чероки</language>
+ <language type="chy">чейенÑки</language>
+ <language type="chy" alt="proposed-u61-1" draft="provisional">ШайенÑки</language>
+ <language type="co">КорÑиканÑки</language>
+ <language type="cpe">КреолÑки, от английÑки (други)</language>
+ <language type="cpf">КреолÑки, от френÑки (други)</language>
+ <language type="cpp">КреолÑки, от португалÑки (други)</language>
+ <language type="crp">КреолÑки (други)</language>
+ <language type="cs">Чешки</language>
+ <language type="cu">Църковно ÑлавÑнÑки</language>
+ <language type="cy">УелÑки</language>
+ <language type="da">ДатÑки</language>
+ <language type="de">ÐемÑки</language>
+ <language type="den">СлавÑнÑки</language>
+ <language type="dum">ХоландÑки, Ñредновековен (1050-1350)</language>
+ <language type="dv">Дивехи</language>
+ <language type="egy">ЕгипетÑки (древен)</language>
+ <language type="el">Гръцки</language>
+ <language type="en">ÐнглийÑки</language>
+ <language type="enm">ÐнглийÑки (1100-1500)</language>
+ <language type="eo">ЕÑперанто</language>
+ <language type="es">ИÑпанÑки</language>
+ <language type="et">ЕÑтонÑки</language>
+ <language type="eu">БаÑки</language>
+ <language type="fa">ПерÑийÑки</language>
+ <language type="fi">ФинÑки</language>
+ <language type="fiu">УгрофинÑка (други)</language>
+ <language type="fr">ФренÑки</language>
+ <language type="frm">ФренÑки (1400-1600)</language>
+ <language type="fro">ФренÑки (842-1400)</language>
+ <language type="ga">ИрландÑки</language>
+ <language type="gd">ШотландÑки галÑки</language>
+ <language type="gem">ГерманÑки (други)</language>
+ <language type="gmh">ÐемÑки (1050-1500)</language>
+ <language type="goh">ÐемÑки (750-1050)</language>
+ <language type="got">ГотичеÑки</language>
+ <language type="grc">Древногръцки (до 1453)</language>
+ <language type="gu">Гуджарати</language>
+ <language type="haw">ХавайÑки</language>
+ <language type="he">Иврит</language>
+ <language type="hi">Хинди</language>
+ <language type="hit">ХитÑки</language>
+ <language type="hr">ХърватÑки</language>
+ <language type="ht">ХаитÑнÑки</language>
+ <language type="hu">УнгарÑки</language>
+ <language type="hy">ÐрменÑки</language>
+ <language type="id">ИндонезийÑки</language>
+ <language type="inc">ИндийÑки (други)</language>
+ <language type="ine">Индо-европейÑки (други)</language>
+ <language type="inh" draft="provisional">ИнгушетÑки</language>
+ <language type="io">Идо</language>
+ <language type="ira">ИранÑки</language>
+ <language type="is">ИÑландÑки</language>
+ <language type="it">ИталианÑки</language>
+ <language type="ja">ЯпонÑки</language>
+ <language type="jpr">еврейÑко-перÑийÑки</language>
+ <language type="jrb">еврейÑко-арабÑки</language>
+ <language type="jv">ЯванÑки</language>
+ <language type="ka">ГрузинÑки</language>
+ <language type="kg">КонгоанÑки</language>
+ <language type="ki">кикуйу</language>
+ <language type="kk">КазахÑки</language>
+ <language type="km">КхмерÑки</language>
+ <language type="ko">КорейÑки</language>
+ <language type="ks">КашмирÑки</language>
+ <language type="ku">КюрдÑки</language>
+ <language type="ky">КиргизÑки</language>
+ <language type="la">ЛатинÑки</language>
+ <language type="lb">ЛюкÑембургÑки</language>
+ <language type="lo">ЛаоÑки</language>
+ <language type="lt">ЛитовÑки</language>
+ <language type="lv">ЛатвийÑки</language>
+ <language type="mas">маÑайÑки</language>
+ <language type="mg">Малгашки</language>
+ <language type="mga">ИрландÑки (900-1200)</language>
+ <language type="mi">МаорÑки</language>
+ <language type="mis">Други езици</language>
+ <language type="mk">МакедонÑки</language>
+ <language type="ml">МалаÑлам</language>
+ <language type="mn">МонголÑки</language>
+ <language type="mo">МолдовÑки</language>
+ <language type="ms">МалайÑки</language>
+ <language type="mt">МалтийÑки</language>
+ <language type="my">БирманÑки</language>
+ <language type="nai">СеверноамериканÑки индианÑки (други)</language>
+ <language type="nap">ÐеаполитанÑки</language>
+ <language type="ne">ÐепалÑки</language>
+ <language type="nl">ХоландÑки</language>
+ <language type="no">Ðорвежки</language>
+ <language type="nub">ÐубийÑки езици</language>
+ <language type="ny">ЧинÑнджа</language>
+ <language type="os">ОÑетÑки</language>
+ <language type="ota">ТурÑки, отоманÑки (1500-1928)</language>
+ <language type="oto">СтаротурÑки езици</language>
+ <language type="pa">ПенджабÑки</language>
+ <language type="paa">ПапуаÑки (други)</language>
+ <language type="peo">СтароперÑийÑки (600-400 пр.н.е.)</language>
+ <language type="phi">ФилипинÑки (други)</language>
+ <language type="phn">ФиникийÑки</language>
+ <language type="pl">ПолÑки</language>
+ <language type="pro">ПрованÑалÑки (to 1500)</language>
+ <language type="pro" alt="proposed-u195-1" draft="provisional">ПрованÑки</language>
+ <language type="ps">Пущу</language>
+ <language type="pt">ПортугалÑки</language>
+ <language type="qu">Кечуа</language>
+ <language type="raj">РаджаÑтанÑки</language>
+ <language type="rm">РетороманÑки</language>
+ <language type="rn">Рунди</language>
+ <language type="ro">РумънÑки</language>
+ <language type="roa">РоманÑки (други)</language>
+ <language type="ru">РуÑки</language>
+ <language type="rw">КинÑруанда</language>
+ <language type="sa">СанкÑкритÑки</language>
+ <language type="sah">ЯкутÑки</language>
+ <language type="sai">ЮжноамериканÑки индианÑки (други)</language>
+ <language type="sc">СардинÑки</language>
+ <language type="sem">СемитÑки (други)</language>
+ <language type="sg">Санго</language>
+ <language type="sga">СтароирландÑки (до 900)</language>
+ <language type="sh">СърбохърватÑки</language>
+ <language type="si">СинхалÑки</language>
+ <language type="sk">Словашки</language>
+ <language type="sl">СловенÑки</language>
+ <language type="sla">СлавÑнÑки (други)</language>
+ <language type="sm">СамоанÑки</language>
+ <language type="so">СомалийÑки</language>
+ <language type="sq">ÐлбанÑки</language>
+ <language type="sr">СръбÑки</language>
+ <language type="ss">Суази</language>
+ <language type="st">СеÑуто</language>
+ <language type="sux">ШумерÑки</language>
+ <language type="sv">ШведÑки</language>
+ <language type="sw">Суахили</language>
+ <language type="syr">СирийÑки</language>
+ <language type="ta">ТамилÑки</language>
+ <language type="tai">ТайландÑки (други)</language>
+ <language type="te">Телугу</language>
+ <language type="tg">ТаджикÑки</language>
+ <language type="th">Таи</language>
+ <language type="tk">ТуркменÑки</language>
+ <language type="tr">ТурÑки</language>
+ <language type="tt">ТатарÑки</language>
+ <language type="tut">ÐлтайÑки (други)</language>
+ <language type="ty">ТаитÑнÑки</language>
+ <language type="uk">УкраинÑки</language>
+ <language type="und">Ðеопределен</language>
+ <language type="ur">Урду</language>
+ <language type="uz">УзбекÑки</language>
+ <language type="vi">ВиетнамÑки</language>
+ <language type="zh">КитайÑки</language>
+ <language type="zu">ЗулуÑки</language>
+ </languages>
+ <scripts>
+ <script type="Arab">ÐрабÑка</script>
+ <script type="Armn">ÐрменÑка</script>
+ <script type="Bali">БалийÑки</script>
+ <script type="Beng">БенгалÑка</script>
+ <script type="Brai">Брайлова</script>
+ <script type="Cher">Чероки</script>
+ <script type="Copt">КоптÑка</script>
+ <script type="Cyrl">Кирилица</script>
+ <script type="Deva">Деванагари</script>
+ <script type="Ethi">ЕтиопÑка</script>
+ <script type="Geor">ГрузинÑка</script>
+ <script type="Goth">ГотичеÑка</script>
+ <script type="Grek">Гръцка</script>
+ <script type="Gujr">Гуджарати</script>
+ <script type="Hang">КорейÑка</script>
+ <script type="Hani">КитайÑка</script>
+ <script type="Hans">ОпроÑтен китайÑки</script>
+ <script type="Hant">Традиционен китайÑки</script>
+ <script type="Hebr">Иврит</script>
+ <script type="Hira">ЯпонÑки хирагана</script>
+ <script type="Kana">ЯпонÑки катакана</script>
+ <script type="Khmr">КхмерÑка</script>
+ <script type="Laoo">ЛаоÑка</script>
+ <script type="Latn">ЛатинÑка</script>
+ <script type="Mong">МонголÑка</script>
+ <script type="Mymr">БирманÑка</script>
+ <script type="Runr">РуничеÑка</script>
+ <script type="Taml">ТамилÑка</script>
+ <script type="Telu">Телугу</script>
+ <script type="Thai">Таи</script>
+ <script type="Tibt">ТибетÑка</script>
+ <script type="Zyyy">Обща</script>
+ </scripts>
+ <territories>
+ <territory type="001">ЗемÑта</territory>
+ <territory type="002">Ðфрика</territory>
+ <territory type="005">Южна Ðмерика</territory>
+ <territory type="009">ОкеаниÑ</territory>
+ <territory type="011">Западна Ðфирка</territory>
+ <territory type="013">Централна Ðмерика</territory>
+ <territory type="014">Източна Ðфрика</territory>
+ <territory type="015">Северна Ðфрика</territory>
+ <territory type="017">Централна Ðфрика</territory>
+ <territory type="018">ЮжноафриканÑки регион</territory>
+ <territory type="019">Ðмерика</territory>
+ <territory type="021">Северна Ðмерика</territory>
+ <territory type="029">КарибÑки о-ви</territory>
+ <territory type="030">Източна ÐзиÑ</territory>
+ <territory type="034">Южна ÐзиÑ</territory>
+ <territory type="035">Югоизточна ÐзиÑ</territory>
+ <territory type="039">Южна Европа</territory>
+ <territory type="053">ÐвÑÑ‚Ñ€Ð°Ð»Ð¸Ñ Ð¸ Ðова ЗеландиÑ</territory>
+ <territory type="054">МеланезиÑ</territory>
+ <territory type="057">МикронезиÑ</territory>
+ <territory type="061">ПолинезиÑ</territory>
+ <territory type="062">Южна ÐÐ·Ð¸Ñ [062]</territory>
+ <territory type="142">ÐзиÑ</territory>
+ <territory type="143">Централна ÐзиÑ</territory>
+ <territory type="145">Западна ÐзиÑ</territory>
+ <territory type="150">Европа</territory>
+ <territory type="151">Източна Европа</territory>
+ <territory type="154">Северна Европа</territory>
+ <territory type="155">Западна Европа</territory>
+ <territory type="172" draft="provisional">ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° незавиÑимите държави</territory>
+ <territory type="419" draft="provisional">ЛатинÑка Ðмерика и КарибÑки баÑейн</territory>
+ <territory type="830">ÐормандÑки о-ви</territory>
+ <territory type="IM">о.Ман</territory>
+ <territory type="AD">Ðндора</territory>
+ <territory type="AE">Обединени ÐрабÑки ЕмирÑтва</territory>
+ <territory type="AF">ÐфганиÑтан</territory>
+ <territory type="AG">Ðнтигуа и Барбуда</territory>
+ <territory type="AI">Ðнгуила</territory>
+ <territory type="AL">ÐлбаниÑ</territory>
+ <territory type="AM">ÐрмениÑ</territory>
+ <territory type="AN">ХоландÑки Ðнтили</territory>
+ <territory type="AO">Ðнгола</territory>
+ <territory type="AQ">Ðнтарктика</territory>
+ <territory type="AR">Ðржентина</territory>
+ <territory type="AS">ÐмериканÑко Самоа</territory>
+ <territory type="AT">ÐвÑтриÑ</territory>
+ <territory type="AU">ÐвÑтралиÑ</territory>
+ <territory type="AW">Ðруба</territory>
+ <territory type="AX">ÐландÑки о-ви</territory>
+ <territory type="AZ">Ðзербайджан</territory>
+ <territory type="BA">БоÑна и Херцеговина</territory>
+ <territory type="BB">БарбадоÑ</territory>
+ <territory type="BD">Бангладеш</territory>
+ <territory type="BE">БелгиÑ</territory>
+ <territory type="BF">Буркина ФаÑо</territory>
+ <territory type="BG">БългариÑ</territory>
+ <territory type="BH">Бахрейн</territory>
+ <territory type="BI">Бурунди</territory>
+ <territory type="BJ">Бенин</territory>
+ <territory type="BM">Бермуда</territory>
+ <territory type="BN">Бруней ДаруÑалам</territory>
+ <territory type="BO">БоливиÑ</territory>
+ <territory type="BR">БразилиÑ</territory>
+ <territory type="BS">Бахами</territory>
+ <territory type="BT">Бутан</territory>
+ <territory type="BV">ОÑтров Буве</territory>
+ <territory type="BW">БотÑуана</territory>
+ <territory type="BY">БеларуÑ</territory>
+ <territory type="BZ">Белиз</territory>
+ <territory type="CA">Канада</territory>
+ <territory type="CC">КокоÑови (Кийлинг) оÑтрови</territory>
+ <territory type="CD">Демократична Република Конго</territory>
+ <territory type="CF">ЦентралноафриканÑка Република</territory>
+ <territory type="CG">Конго</territory>
+ <territory type="CH">ШвейцариÑ</territory>
+ <territory type="CI">БрÑг на Слоновата коÑÑ‚</territory>
+ <territory type="CK">ОÑтрови Кук</territory>
+ <territory type="CL">Чили</territory>
+ <territory type="CM">Камерун</territory>
+ <territory type="CN">Китай</territory>
+ <territory type="CO">КолумбиÑ</territory>
+ <territory type="CR">КоÑта Рика</territory>
+ <territory type="CS">Ð¡ÑŠÑ€Ð±Ð¸Ñ Ð¸ Черна Гора</territory>
+ <territory type="CU">Куба</territory>
+ <territory type="CV">Кабо Верде</territory>
+ <territory type="CX">ОÑтров КриÑтмаÑ</territory>
+ <territory type="CY">Кипър</territory>
+ <territory type="CZ">Чешка Република</territory>
+ <territory type="DE">ГерманиÑ</territory>
+ <territory type="DJ">Джибути</territory>
+ <territory type="DK">ДаниÑ</territory>
+ <territory type="DM">Доминика</territory>
+ <territory type="DO">ДоминиканÑка Република</territory>
+ <territory type="DZ">Ðлжир</territory>
+ <territory type="EC">Еквадор</territory>
+ <territory type="EE">ЕÑтониÑ</territory>
+ <territory type="EG">Египет</territory>
+ <territory type="EH">Западна Сахара</territory>
+ <territory type="ER">ЕритреÑ</territory>
+ <territory type="ES">ИÑпаниÑ</territory>
+ <territory type="ET">ЕтиопиÑ</territory>
+ <territory type="FI">ФинландиÑ</territory>
+ <territory type="FJ">Фиджи</territory>
+ <territory type="FK">ФолклендÑки оÑтрови</territory>
+ <territory type="FM">МикронезиÑ, Обединени Щати</territory>
+ <territory type="FO">ФарьорÑки оÑтрови</territory>
+ <territory type="FR">ФранциÑ</territory>
+ <territory type="GA">Габон</territory>
+ <territory type="GB">Обединено кралÑтво</territory>
+ <territory type="GD">Гренада</territory>
+ <territory type="GE">ГрузиÑ</territory>
+ <territory type="GF">ФренÑка Гвиана</territory>
+ <territory type="GH">Гана</territory>
+ <territory type="GI">Гибралтар</territory>
+ <territory type="GL">ГренландиÑ</territory>
+ <territory type="GM">ГамбиÑ</territory>
+ <territory type="GN">ГвинеÑ</territory>
+ <territory type="GP">Гваделупа</territory>
+ <territory type="GQ">Екваториална ГвинеÑ</territory>
+ <territory type="GR">ГърциÑ</territory>
+ <territory type="GS">Южна Ð”Ð¶Ð¾Ñ€Ð´Ð¶Ð¸Ñ Ð¸ Южни Сандвичеви ОÑтрови</territory>
+ <territory type="GT">Гватемала</territory>
+ <territory type="GU">Гуам</territory>
+ <territory type="GW">ГвинеÑ-БиÑау</territory>
+ <territory type="GY">Гвиана</territory>
+ <territory type="HK">Хонг-Конг О.Ð.Р. на Китай</territory>
+ <territory type="HM">ОÑтров Хърд и ОÑтрови Макдоналд</territory>
+ <territory type="HN">ХондураÑ</territory>
+ <territory type="HR">ХърватÑка</territory>
+ <territory type="HT">Хаити</territory>
+ <territory type="HU">УнгариÑ</territory>
+ <territory type="ID">ИндонезиÑ</territory>
+ <territory type="IE">ИрландиÑ</territory>
+ <territory type="IL">Израел</territory>
+ <territory type="IN">ИндиÑ</territory>
+ <territory type="IO">БританÑки територии в ИндийÑÐºÐ¸Ñ Ð¾ÐºÐµÐ°Ð½</territory>
+ <territory type="IQ">Ирак</territory>
+ <territory type="IR">Иран, ИÑлÑмÑка република</territory>
+ <territory type="IS">ИÑландиÑ</territory>
+ <territory type="IT">ИталиÑ</territory>
+ <territory type="JM">Ямайка</territory>
+ <territory type="JO">ЙорданиÑ</territory>
+ <territory type="JP">ЯпониÑ</territory>
+ <territory type="KE">КениÑ</territory>
+ <territory type="KG">КиргизÑтан</territory>
+ <territory type="KH">Камбоджа</territory>
+ <territory type="KI">Кирибати</territory>
+ <territory type="KM">Комори</territory>
+ <territory type="KN">Сейнт ÐšÐ¸Ñ‚Ñ Ð¸ ÐевиÑ</territory>
+ <territory type="KP">КореÑ, Северна</territory>
+ <territory type="KR">КореÑ, Южна</territory>
+ <territory type="KW">Кувейт</territory>
+ <territory type="KY">Кайманови оÑтрови</territory>
+ <territory type="KZ">КазахÑтан</territory>
+ <territory type="LA">Ðародна Демократична Република ЛаоÑ</territory>
+ <territory type="LB">Ливан</territory>
+ <territory type="LC">Сейнт ЛуÑиÑ</territory>
+ <territory type="LI">Лихтенщайн</territory>
+ <territory type="LK">Шри Ланка</territory>
+ <territory type="LR">ЛибериÑ</territory>
+ <territory type="LS">ЛеÑото</territory>
+ <territory type="LT">Литва</territory>
+ <territory type="LU">ЛюкÑембург</territory>
+ <territory type="LV">ЛатвиÑ</territory>
+ <territory type="LY">ЛибийÑка ÐрабÑка ДжамахириÑ</territory>
+ <territory type="MA">Мароко</territory>
+ <territory type="MC">Монако</territory>
+ <territory type="MD">Молдова, Република</territory>
+ <territory type="MG">МадагаÑкар</territory>
+ <territory type="MH">Маршалови ОÑтрови</territory>
+ <territory type="MK">МакедониÑ, Република</territory>
+ <territory type="ML">Мали</territory>
+ <territory type="MM">Мианмар</territory>
+ <territory type="MN">МонголиÑ</territory>
+ <territory type="MO">Макао О.Ð.Р. на Китай</territory>
+ <territory type="MP">Северни МарианÑки ОÑтрови</territory>
+ <territory type="MQ">Мартиника</territory>
+ <territory type="MR">МавританиÑ</territory>
+ <territory type="MS">МонÑерат</territory>
+ <territory type="MT">Малта</territory>
+ <territory type="MU">Мавриций</territory>
+ <territory type="MV">Малдиви</territory>
+ <territory type="MW">Малави</territory>
+ <territory type="MX">МекÑико</territory>
+ <territory type="MY">МалайзиÑ</territory>
+ <territory type="MZ">Мозамбик</territory>
+ <territory type="NA">ÐамибиÑ</territory>
+ <territory type="NC">Ðова КаледониÑ</territory>
+ <territory type="NE">Ðигер</territory>
+ <territory type="NF">ОÑтров Ðорфолк</territory>
+ <territory type="NG">ÐигериÑ</territory>
+ <territory type="NI">Ðикарагуа</territory>
+ <territory type="NL">ХоландиÑ</territory>
+ <territory type="NO">ÐорвегиÑ</territory>
+ <territory type="NP">Ðепал</territory>
+ <territory type="NR">Ðауру</territory>
+ <territory type="NU">Ðиуе</territory>
+ <territory type="NZ">Ðова ЗеландиÑ</territory>
+ <territory type="OM">Оман</territory>
+ <territory type="PA">Панама</territory>
+ <territory type="PE">Перу</territory>
+ <territory type="PF">ФренÑка ПолинезиÑ</territory>
+ <territory type="PG">Папуа Ðова ГвинеÑ</territory>
+ <territory type="PH">Филипини</territory>
+ <territory type="PK">ПакиÑтан</territory>
+ <territory type="PL">Полша</territory>
+ <territory type="PM">Сен Пиер и Мигелон</territory>
+ <territory type="PN">Питкайрн</territory>
+ <territory type="PR">Пуерто Рико</territory>
+ <territory type="PS">ПалеÑтинÑки територии</territory>
+ <territory type="PT">ПортугалиÑ</territory>
+ <territory type="PW">Палау</territory>
+ <territory type="PY">Парагвай</territory>
+ <territory type="QA">Катар</territory>
+ <territory type="QO">ÐžÐºÐµÐ°Ð½Ð¸Ñ [QO]</territory>
+ <territory type="QO" alt="proposed-u129-1" draft="unconfirmed">Далечна ОкеаниÑ</territory>
+ <territory type="RE">Реюниън</territory>
+ <territory type="RO">РумъниÑ</territory>
+ <territory type="RU">РуÑка ФедерациÑ</territory>
+ <territory type="RW">Руанда</territory>
+ <territory type="SA">СаудитÑка ÐрабиÑ</territory>
+ <territory type="SB">Соломонови ОÑтрови</territory>
+ <territory type="SC">Сейшели</territory>
+ <territory type="SD">Судан</territory>
+ <territory type="SE">ШвециÑ</territory>
+ <territory type="SG">Сингапур</territory>
+ <territory type="SH">Света Елена</territory>
+ <territory type="SI">СловениÑ</territory>
+ <territory type="SJ">Свалбард и Ян Майен</territory>
+ <territory type="SK">СловакиÑ</territory>
+ <territory type="SL">Сиера Леоне</territory>
+ <territory type="SM">Сан Марино</territory>
+ <territory type="SN">Сенегал</territory>
+ <territory type="SO">СомалиÑ</territory>
+ <territory type="SR">Суринам</territory>
+ <territory type="ST">Сао Томе и Принципе</territory>
+ <territory type="SV">Ел Салвадор</territory>
+ <territory type="SY">СирийÑка ÐрабÑка Република</territory>
+ <territory type="SZ">Суазиленд</territory>
+ <territory type="TC">ОÑтрови Ð¢ÑƒÑ€ÐºÑ Ð¸ КайкоÑ</territory>
+ <territory type="TD">Чад</territory>
+ <territory type="TF">ФренÑки Южни Територии</territory>
+ <territory type="TG">Того</territory>
+ <territory type="TH">Тайланд</territory>
+ <territory type="TJ">ТаджикиÑтан</territory>
+ <territory type="TK">Токелау</territory>
+ <territory type="TL">Източен Тимор</territory>
+ <territory type="TM">ТуркмениÑтан</territory>
+ <territory type="TN">ТуниÑ</territory>
+ <territory type="TO">Тонга</territory>
+ <territory type="TR">ТурциÑ</territory>
+ <territory type="TT">Тринидад и Тобаго</territory>
+ <territory type="TV">Тувалу</territory>
+ <territory type="TW">Тайван</territory>
+ <territory type="TZ">ТанзаниÑ</territory>
+ <territory type="UA">Украйна</territory>
+ <territory type="UG">Уганда</territory>
+ <territory type="UM">СÐЩ - външни оÑтрови</territory>
+ <territory type="US">СÐЩ</territory>
+ <territory type="UY">Уругвай</territory>
+ <territory type="UZ">УзбекиÑтан</territory>
+ <territory type="VA">Свещено море (ВатиканÑка държава)</territory>
+ <territory type="VC">Сейнт ВинÑънт и Гренадини</territory>
+ <territory type="VE">Венецуела</territory>
+ <territory type="VG">БританÑки ВирджинÑки ОÑтрови</territory>
+ <territory type="VI">СÐЩ, ВирджинÑки ОÑтрови</territory>
+ <territory type="VN">Виетнам</territory>
+ <territory type="VU">Вануату</territory>
+ <territory type="WF">Ð£Ð¾Ð»Ð¸Ñ Ð¸ Футуна</territory>
+ <territory type="WS">Самоа</territory>
+ <territory type="YE">Йемен</territory>
+ <territory type="YT">Мейот</territory>
+ <territory type="ZA">Южна Ðфрика</territory>
+ <territory type="ZM">ЗамбиÑ</territory>
+ <territory type="ZW">Зимбабве</territory>
+ </territories>
+ <keys>
+ <key type="calendar">Календар</key>
+ <key type="collation">Сортиране</key>
+ <key type="currency">Валута</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">Традиционен китайÑки (Big5)</type>
+ <type type="buddhist" key="calendar">БудиÑтки календар</type>
+ <type type="chinese" key="calendar">КитайÑки календар</type>
+ <type type="direct" key="collation">Директно</type>
+ <type type="gb2312han" key="collation">ОпроÑтен китайÑки (GB2312)</type>
+ <type type="gregorian" key="calendar">ГригорианÑки календар</type>
+ <type type="hebrew" key="calendar">ЕврейÑки календар</type>
+ <type type="islamic" key="calendar">ИÑлÑмÑки календар</type>
+ <type type="islamic-civil" key="calendar">ИÑлÑмÑки цивилен календар</type>
+ <type type="japanese" key="calendar">ЯпонÑки календар</type>
+ <type type="phonebook" key="collation">Ðзбучен ред</type>
+ <type type="pinyin" key="collation">Сортиране Пинин</type>
+ <type type="stroke" key="collation">Сортиране по щрих</type>
+ <type type="traditional" key="collation">Традиционно</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US">ÐмериканÑка</measurementSystemName>
+ <measurementSystemName type="metric">Метрична</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[а-ÑŠ ÑŒ ÑŽ Ñ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[i v x {а̀} Ñ Ñ {о̀} {у̀} {ÑŠÌ€} Ñ£ {ÑŽÌ€} {ÑÌ€} Ñ«]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>„</quotationStart>
+ <quotationEnd>“</quotationEnd>
+ </delimiters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Ñн.</month>
+ <month type="2">февр.</month>
+ <month type="3">март</month>
+ <month type="4">апр.</month>
+ <month type="5">май</month>
+ <month type="6">юни</month>
+ <month type="7">юли</month>
+ <month type="8">авг.</month>
+ <month type="9">Ñепт.</month>
+ <month type="10">окт.</month>
+ <month type="11">ноем.</month>
+ <month type="12">дек.</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Ñнуари</month>
+ <month type="2">февруари</month>
+ <month type="3">март</month>
+ <month type="4">април</month>
+ <month type="5">май</month>
+ <month type="6">юни</month>
+ <month type="7">юли</month>
+ <month type="8">авгуÑÑ‚</month>
+ <month type="9">Ñептември</month>
+ <month type="10">октомври</month>
+ <month type="11">ноември</month>
+ <month type="12">декември</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">Ñ</month>
+ <month type="2">Ñ„</month>
+ <month type="3">м</month>
+ <month type="4">а</month>
+ <month type="5">м</month>
+ <month type="6">ÑŽ</month>
+ <month type="7">ÑŽ</month>
+ <month type="8">а</month>
+ <month type="9">Ñ</month>
+ <month type="10">о</month>
+ <month type="11">н</month>
+ <month type="12">д</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">нд</day>
+ <day type="mon">пн</day>
+ <day type="tue">вт</day>
+ <day type="wed">ÑÑ€</day>
+ <day type="thu">чт</day>
+ <day type="fri">пт</day>
+ <day type="sat">Ñб</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">неделÑ</day>
+ <day type="mon">понеделник</day>
+ <day type="tue">вторник</day>
+ <day type="wed">ÑÑ€Ñда</day>
+ <day type="thu">четвъртък</day>
+ <day type="fri">петък</day>
+ <day type="sat">Ñъбота</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">н</day>
+ <day type="mon">п</day>
+ <day type="tue">в</day>
+ <day type="wed">Ñ</day>
+ <day type="thu">ч</day>
+ <day type="fri">п</day>
+ <day type="sat">Ñ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">I трим.</quarter>
+ <quarter type="2">II трим.</quarter>
+ <quarter type="3">III трим.</quarter>
+ <quarter type="4">IV трим.</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1-во тримеÑечие</quarter>
+ <quarter type="2">2-ро тримеÑечие</quarter>
+ <quarter type="3">3-то тримеÑечие</quarter>
+ <quarter type="4">4-то тримеÑечие</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>пр. об.</am>
+ <am alt="proposed-u129-1" draft="unconfirmed">пр.об.</am>
+ <pm>Ñл. об.</pm>
+ <pm alt="proposed-u129-1" draft="unconfirmed">Ñл.об.</pm>
+ <eras>
+ <eraNames>
+ <era type="0">пр.н.е.</era>
+ <era type="1" draft="unconfirmed">Ñл.н.е.</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">пр. н. е.</era>
+ <era type="1">от н. е.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>dd MMMM yyyy, EEEE</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd.MM.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd.MM.yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>HH:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd.MM</dateFormatItem>
+ <dateFormatItem id="hmm" draft="provisional">h:mm a</dateFormatItem>
+ <dateFormatItem id="hmmss" draft="provisional">h:mm:ss a</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM.yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyQQQQ" draft="provisional">QQQQ yyyy 'г'.</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName>ера</displayName>
+ </field>
+ <field type="year">
+ <displayName>година</displayName>
+ </field>
+ <field type="month">
+ <displayName>меÑец</displayName>
+ </field>
+ <field type="week">
+ <displayName>Ñедмица</displayName>
+ </field>
+ <field type="day">
+ <displayName>Ден</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>Ден от Ñедмицата</displayName>
+ </field>
+ <field type="hour">
+ <displayName>чаÑ</displayName>
+ </field>
+ <field type="minute">
+ <displayName>минута</displayName>
+ </field>
+ <field type="second">
+ <displayName>Ñекунда</displayName>
+ </field>
+ <field type="zone">
+ <displayName>зона</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HHmm;-HHmm</hourFormat>
+ <gmtFormat>Гриинуич{0}</gmtFormat>
+ <zone type="Africa/Timbuktu">
+ <exemplarCity>Тимбукту</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/ComodRivadavia">
+ <exemplarCity>Комодоро РивадавиÑ</exemplarCity>
+ </zone>
+ <zone type="Europe/Belfast">
+ <exemplarCity>БелфаÑÑ‚t</exemplarCity>
+ </zone>
+ <zone type="Pacific/Yap">
+ <exemplarCity>о. Яп</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Rothera">
+ <exemplarCity>Ротера</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Palmer">
+ <exemplarCity>Палмър</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Южен полюÑ</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Syowa">
+ <exemplarCity>Суова</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Mawson">
+ <exemplarCity>МоуÑън</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Davis">
+ <exemplarCity>База ДейвиÑ</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Vostok">
+ <exemplarCity>ВоÑток</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Casey">
+ <exemplarCity>КейÑи</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity>Дюмон Дюрвил</exemplarCity>
+ </zone>
+ <zone type="Antarctica/McMurdo">
+ <exemplarCity>Мак Мърдоу</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Rio_Gallegos">
+ <exemplarCity>Рио ГалегоÑ</exemplarCity>
+ </zone>
+ <zone type="America/Mendoza">
+ <exemplarCity>МендоÑа</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/San_Juan">
+ <exemplarCity>Сан Хуан</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Ushuaia">
+ <exemplarCity>УшуаÑ</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/La_Rioja">
+ <exemplarCity>Ла Риоха</exemplarCity>
+ </zone>
+ <zone type="America/Catamarca">
+ <exemplarCity>Катамарка</exemplarCity>
+ </zone>
+ <zone type="America/Jujuy">
+ <exemplarCity>Джуджую</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Tucuman">
+ <exemplarCity>Тукуман</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity>Кордоба</exemplarCity>
+ </zone>
+ <zone type="America/Buenos_Aires">
+ <exemplarCity>Ð‘ÑƒÐµÐ½Ð¾Ñ ÐйреÑ</exemplarCity>
+ </zone>
+ <zone type="Australia/Perth">
+ <exemplarCity>Пърт</exemplarCity>
+ </zone>
+ <zone type="Australia/Darwin">
+ <exemplarCity>Даруин</exemplarCity>
+ </zone>
+ <zone type="Australia/Adelaide">
+ <exemplarCity>Ðдълид</exemplarCity>
+ </zone>
+ <zone type="Australia/Broken_Hill">
+ <exemplarCity>Броукън Хил</exemplarCity>
+ </zone>
+ <zone type="Australia/Melbourne">
+ <exemplarCity>Мелбърн</exemplarCity>
+ </zone>
+ <zone type="Australia/Hobart">
+ <exemplarCity>Хоубарт</exemplarCity>
+ </zone>
+ <zone type="Australia/Lindeman">
+ <exemplarCity>Линдеман</exemplarCity>
+ </zone>
+ <zone type="Australia/Sydney">
+ <exemplarCity>Сидни</exemplarCity>
+ </zone>
+ <zone type="Australia/Brisbane">
+ <exemplarCity>Бризбейн</exemplarCity>
+ </zone>
+ <zone type="Australia/Lord_Howe">
+ <exemplarCity>Лорд Хов</exemplarCity>
+ </zone>
+ <zone type="America/Eirunepe">
+ <exemplarCity>Ейрунепе</exemplarCity>
+ </zone>
+ <zone type="America/Rio_Branco">
+ <exemplarCity>Рио Бранко</exemplarCity>
+ </zone>
+ <zone type="America/Porto_Velho">
+ <exemplarCity>Порту Вельо</exemplarCity>
+ </zone>
+ <zone type="America/Boa_Vista">
+ <exemplarCity>Буа ВиÑта</exemplarCity>
+ </zone>
+ <zone type="America/Manaus">
+ <exemplarCity>МануаÑ</exemplarCity>
+ </zone>
+ <zone type="America/Cuiaba">
+ <exemplarCity>ЧуÑба</exemplarCity>
+ </zone>
+ <zone type="America/Campo_Grande">
+ <exemplarCity>Кампо Гранде</exemplarCity>
+ </zone>
+ <zone type="America/Belem">
+ <exemplarCity>Белем</exemplarCity>
+ </zone>
+ <zone type="America/Araguaina">
+ <exemplarCity>Ðрагуайна</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>Сао Пауло</exemplarCity>
+ </zone>
+ <zone type="America/Bahia">
+ <exemplarCity>Бахиа</exemplarCity>
+ </zone>
+ <zone type="America/Fortaleza">
+ <exemplarCity>Фортацела</exemplarCity>
+ </zone>
+ <zone type="America/Maceio">
+ <exemplarCity>МаÑейо</exemplarCity>
+ </zone>
+ <zone type="America/Recife">
+ <exemplarCity>РеÑифе</exemplarCity>
+ </zone>
+ <zone type="America/Noronha">
+ <exemplarCity>Ðоронха</exemplarCity>
+ </zone>
+ <zone type="America/Dawson">
+ <exemplarCity>ДоуÑън</exemplarCity>
+ </zone>
+ <zone type="America/Whitehorse">
+ <exemplarCity draft="unconfirmed">УайтхорÑ</exemplarCity>
+ </zone>
+ <zone type="America/Vancouver">
+ <exemplarCity draft="unconfirmed">Ванкувър</exemplarCity>
+ </zone>
+ <zone type="America/Dawson_Creek">
+ <exemplarCity>ДоуÑън Крийк</exemplarCity>
+ </zone>
+ <zone type="America/Yellowknife">
+ <exemplarCity>Йелоунайф</exemplarCity>
+ </zone>
+ <zone type="America/Inuvik">
+ <exemplarCity>Инувик</exemplarCity>
+ </zone>
+ <zone type="America/Edmonton">
+ <exemplarCity>Едмънтън</exemplarCity>
+ </zone>
+ <zone type="America/Swift_Current">
+ <exemplarCity>Суифт Кърент</exemplarCity>
+ </zone>
+ <zone type="America/Cambridge_Bay">
+ <exemplarCity>Кеймбридж Бей</exemplarCity>
+ </zone>
+ <zone type="America/Regina">
+ <exemplarCity>Регина</exemplarCity>
+ </zone>
+ <zone type="America/Winnipeg">
+ <exemplarCity>Уинипег</exemplarCity>
+ </zone>
+ <zone type="America/Rainy_River">
+ <exemplarCity>Рейни Ривър</exemplarCity>
+ </zone>
+ <zone type="America/Rankin_Inlet">
+ <exemplarCity>Ранкин Инлет</exemplarCity>
+ </zone>
+ <zone type="America/Thunder_Bay">
+ <exemplarCity>Тъндър Бей</exemplarCity>
+ </zone>
+ <zone type="America/Nipigon">
+ <exemplarCity>Ðипигон</exemplarCity>
+ </zone>
+ <zone type="America/Toronto">
+ <exemplarCity>Торонто</exemplarCity>
+ </zone>
+ <zone type="America/Montreal">
+ <exemplarCity>Монреал</exemplarCity>
+ </zone>
+ <zone type="America/Iqaluit">
+ <exemplarCity>Иквалуит</exemplarCity>
+ </zone>
+ <zone type="America/Pangnirtung">
+ <exemplarCity>Пангниртунг</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <standard>ÐтлантичеÑка чаÑова зона</standard>
+ <daylight>ÐтлантичеÑка лÑтна чаÑова зона</daylight>
+ </long>
+ <short>
+ <standard>AST</standard>
+ <daylight>ADT</daylight>
+ </short>
+ <exemplarCity>ХалифакÑ</exemplarCity>
+ </zone>
+ <zone type="America/Goose_Bay">
+ <exemplarCity>Ð“ÑƒÑ Ð‘ÐµÐ¹</exemplarCity>
+ </zone>
+ <zone type="America/Glace_Bay">
+ <exemplarCity>Ð“Ð»ÐµÐ¹Ñ Ð‘ÐµÐ¹</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <standard>ЧаÑова зона Ðюфаундленд</standard>
+ <daylight>ЛÑтна чаÑова зона Ðюфаундленд</daylight>
+ </long>
+ <exemplarCity>Сейнт ДжоунÑ</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity>КиншаÑа</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity>Лубумбаши</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>ВеликденÑки о-ви</exemplarCity>
+ </zone>
+ <zone type="America/Santiago">
+ <exemplarCity>Сантиаго</exemplarCity>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity>Кашгар</exemplarCity>
+ </zone>
+ <zone type="Asia/Urumqi">
+ <exemplarCity>Урумчи</exemplarCity>
+ </zone>
+ <zone type="Asia/Chongqing">
+ <exemplarCity>Чунцин</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <standard>КитайÑка чаÑова зона</standard>
+ <daylight>КитайÑка чаÑова зона</daylight>
+ </long>
+ <exemplarCity>Шанхай</exemplarCity>
+ </zone>
+ <zone type="Asia/Harbin">
+ <exemplarCity>Харбин</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity>о-ви ГалапагоÑ</exemplarCity>
+ </zone>
+ <zone type="America/Guayaquil">
+ <exemplarCity>ГуаÑкил</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>КанарÑки о-ви</exemplarCity>
+ </zone>
+ <zone type="Africa/Ceuta">
+ <exemplarCity>Сеута</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity>Мадрид</exemplarCity>
+ </zone>
+ <zone type="Pacific/Truk">
+ <exemplarCity>о-ви Трук</exemplarCity>
+ </zone>
+ <zone type="Pacific/Ponape">
+ <exemplarCity>о. Понапе</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kosrae">
+ <exemplarCity>о. КоÑрае</exemplarCity>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <standard>ЦентралноевропейÑка чаÑова зона</standard>
+ <daylight>ЦентралноевропейÑка лÑтна чаÑова зона</daylight>
+ </long>
+ <short>
+ <standard>CET</standard>
+ <daylight>CEST</daylight>
+ </short>
+ <exemplarCity>Париж</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>Лондон</exemplarCity>
+ </zone>
+ <zone type="America/Thule">
+ <exemplarCity>Туле</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity>Готхоб</exemplarCity>
+ </zone>
+ <zone type="America/Scoresbysund">
+ <exemplarCity>СгорÑбиÑон</exemplarCity>
+ </zone>
+ <zone type="America/Danmarkshavn">
+ <exemplarCity>Данмаркшавн</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity>Джакарта</exemplarCity>
+ </zone>
+ <zone type="Asia/Pontianak">
+ <exemplarCity>Понтианак</exemplarCity>
+ </zone>
+ <zone type="Asia/Makassar">
+ <exemplarCity>МакаÑарÑки проток</exemplarCity>
+ </zone>
+ <zone type="Asia/Jayapura">
+ <exemplarCity>ДжаÑпура</exemplarCity>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <standard>ЧаÑова зона Израел</standard>
+ <daylight>ЛÑтна чаÑова зона Израел</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IDT</daylight>
+ </short>
+ <exemplarCity>ЙеруÑалим</exemplarCity>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <standard>ЯпонÑка чаÑова зона</standard>
+ <daylight>ЯпонÑка чаÑова зона</daylight>
+ </long>
+ <short>
+ <standard>JST</standard>
+ <daylight>JST</daylight>
+ </short>
+ <exemplarCity>Токио</exemplarCity>
+ </zone>
+ <zone type="Pacific/Enderbury">
+ <exemplarCity>о. Ендърбъри</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kiritimati">
+ <exemplarCity>о. РождеÑтво</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tarawa">
+ <exemplarCity>о. Тарава</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtau">
+ <exemplarCity>ÐÑтау</exemplarCity>
+ </zone>
+ <zone type="Asia/Oral">
+ <exemplarCity>Ðрал</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtobe">
+ <exemplarCity>ÐÑтобе</exemplarCity>
+ </zone>
+ <zone type="Asia/Qyzylorda">
+ <exemplarCity>Язилорда</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity>Ðлма Ðта</exemplarCity>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <standard>ЧаÑова зона Гринуич</standard>
+ <daylight>ЧаÑова зона Гринуич</daylight>
+ </long>
+ <short>
+ <standard>Гринуич чаÑова зона</standard>
+ <daylight>Гринуич чаÑова зона</daylight>
+ </short>
+ <exemplarCity>Казабланка</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kwajalein">
+ <exemplarCity>Квайджален</exemplarCity>
+ </zone>
+ <zone type="Pacific/Majuro">
+ <exemplarCity>Мажуро</exemplarCity>
+ </zone>
+ <zone type="Africa/Bamako">
+ <exemplarCity>Бамако</exemplarCity>
+ </zone>
+ <zone type="Asia/Hovd">
+ <exemplarCity>Кобдо</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>Уланбатор</exemplarCity>
+ </zone>
+ <zone type="Asia/Choibalsan">
+ <exemplarCity>ЧойбалÑан</exemplarCity>
+ </zone>
+ <zone type="America/Tijuana">
+ <exemplarCity>Тихуана</exemplarCity>
+ </zone>
+ <zone type="America/Hermosillo">
+ <exemplarCity>ХермоÑило</exemplarCity>
+ </zone>
+ <zone type="America/Mazatlan">
+ <exemplarCity>Мацатлан</exemplarCity>
+ </zone>
+ <zone type="America/Chihuahua">
+ <exemplarCity>Чиуауа</exemplarCity>
+ </zone>
+ <zone type="America/Monterrey">
+ <exemplarCity>Монтерей</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>МекÑико</exemplarCity>
+ </zone>
+ <zone type="America/Merida">
+ <exemplarCity>Мерида</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>Канкун</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuala_Lumpur">
+ <exemplarCity>Куала Лумпур</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuching">
+ <exemplarCity>Кучин</exemplarCity>
+ </zone>
+ <zone type="Pacific/Chatham">
+ <exemplarCity>о-ви Чатам</exemplarCity>
+ </zone>
+ <zone type="Pacific/Auckland">
+ <exemplarCity>Окланд</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity>Таити</exemplarCity>
+ </zone>
+ <zone type="Pacific/Marquesas">
+ <exemplarCity>Маркизки о-ви</exemplarCity>
+ </zone>
+ <zone type="Pacific/Gambier">
+ <exemplarCity>Гамбиер</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>ÐзорÑки о-ви</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Madeira">
+ <exemplarCity>Мадейра</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>ЛиÑабон</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>ИзточноевропейÑка чаÑова зона</standard>
+ <daylight>ИзточноевропейÑка лÑтна чаÑова зона</daylight>
+ </long>
+ <short>
+ <standard>EET</standard>
+ <daylight>EEST</daylight>
+ </short>
+ <exemplarCity>Букурещ</exemplarCity>
+ </zone>
+ <zone type="Europe/Kaliningrad">
+ <exemplarCity>Калининград</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>МоÑква</exemplarCity>
+ </zone>
+ <zone type="Europe/Samara">
+ <exemplarCity>Самара</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>Екатерининбург</exemplarCity>
+ </zone>
+ <zone type="Asia/Omsk">
+ <exemplarCity>ОмÑк</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity>ÐовоÑибирÑк</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>КраÑноÑÑ€Ñк</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity>ИркутÑк</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>ЯкутÑк</exemplarCity>
+ </zone>
+ <zone type="Asia/Vladivostok">
+ <exemplarCity>ВладивоÑток</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>Сахалин</exemplarCity>
+ </zone>
+ <zone type="Asia/Magadan">
+ <exemplarCity>Магадан</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>п-в Камчатка</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity>Ðнадир</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Jan_Mayen">
+ <exemplarCity>Ян Майен</exemplarCity>
+ </zone>
+ <zone type="Arctic/Longyearbyen">
+ <exemplarCity>Лонгирбюен</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>Ужгород</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>Киев</exemplarCity>
+ </zone>
+ <zone type="Europe/Simferopol">
+ <exemplarCity>СеваÑтопол</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>Запорожие</exemplarCity>
+ </zone>
+ <zone type="Pacific/Midway">
+ <exemplarCity>о. Мидуей</exemplarCity>
+ </zone>
+ <zone type="Pacific/Johnston">
+ <exemplarCity>о. ДжонÑън</exemplarCity>
+ </zone>
+ <zone type="Pacific/Wake">
+ <exemplarCity>о. Уейк</exemplarCity>
+ </zone>
+ <zone type="America/Adak">
+ <exemplarCity>Ðдак</exemplarCity>
+ </zone>
+ <zone type="America/Nome">
+ <exemplarCity>Ðоум</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <standard>ЧаÑова зона Хавай</standard>
+ <daylight>ЛÑтна чаÑова зона Хавай</daylight>
+ </long>
+ <short>
+ <standard>HST</standard>
+ <daylight>HST</daylight>
+ </short>
+ <exemplarCity>Хонолулу</exemplarCity>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <standard>ЧаÑова зона ÐлÑÑка</standard>
+ <daylight>ЛÑтна чаÑова зона ÐлÑÑка</daylight>
+ </long>
+ <short>
+ <standard alt="proposed-u195-1" draft="provisional">AKST</standard>
+ <daylight alt="proposed-u195-1" draft="provisional">AKDT</daylight>
+ </short>
+ <exemplarCity>Ðнкоридж</exemplarCity>
+ </zone>
+ <zone type="America/Yakutat">
+ <exemplarCity>Якутат</exemplarCity>
+ </zone>
+ <zone type="America/Juneau">
+ <exemplarCity>Джуно</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <standard>ТихоокеанÑка чаÑова зона</standard>
+ <daylight>ТихоокеанÑка лÑтна чаÑова зона</daylight>
+ </long>
+ <short>
+ <standard>PST</standard>
+ <daylight>PDT</daylight>
+ </short>
+ <exemplarCity>Ð›Ð¾Ñ ÐнжелиÑ</exemplarCity>
+ </zone>
+ <zone type="America/Boise">
+ <exemplarCity>Буаз</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <long>
+ <standard>ÐмериканÑка планинÑка чаÑова зона</standard>
+ <daylight>ÐмериканÑка планинÑка чаÑова зона</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MST</daylight>
+ </short>
+ <exemplarCity>ФиникÑ</exemplarCity>
+ </zone>
+ <zone type="America/Shiprock">
+ <exemplarCity>Шипрок</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <standard>ÐмериканÑка планинÑка чаÑова зона</standard>
+ <daylight>ÐмериканÑка планинÑка лÑтна чаÑова зона</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MDT</daylight>
+ </short>
+ <exemplarCity>Денвър</exemplarCity>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity>Сентър</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <standard>ÐмериканÑка централна чаÑова зона</standard>
+ <daylight>ÐмериканÑка централна лÑтна чаÑова зона</daylight>
+ </long>
+ <short>
+ <standard>CST</standard>
+ <daylight>CDT</daylight>
+ </short>
+ <exemplarCity>Чикаго</exemplarCity>
+ </zone>
+ <zone type="America/Menominee">
+ <exemplarCity>Меномнии</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Knox">
+ <exemplarCity>ÐокÑ</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Marengo">
+ <exemplarCity>Маренго</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <long>
+ <daylight>ÐмериканÑка източна чаÑова зона (ИндианополиÑ)</daylight>
+ </long>
+ <exemplarCity>ИндианополиÑ</exemplarCity>
+ </zone>
+ <zone type="America/Louisville">
+ <exemplarCity>Луизвил</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vevay">
+ <exemplarCity>Веве</exemplarCity>
+ </zone>
+ <zone type="America/Kentucky/Monticello">
+ <exemplarCity>Монтичело</exemplarCity>
+ </zone>
+ <zone type="America/Detroit">
+ <exemplarCity>Детройт</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <standard>ÐмериканÑка източна чаÑова зона</standard>
+ <daylight>ÐмериканÑка източна лÑтна чаÑова зона</daylight>
+ </long>
+ <short>
+ <standard>EST</standard>
+ <daylight>EDT</daylight>
+ </short>
+ <exemplarCity>ÐÑŽ Йорк</exemplarCity>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity>Самарканд</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Ташкент</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <currencies>
+ <currency type="ADP">
+ <displayName>ÐндорÑка пеÑета</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>Обединени арабÑки емирÑтва-дирхам</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>ÐфганиÑтанÑки афган (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>ÐфганиÑтанÑки афган</displayName>
+ <symbol>Af</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>ÐлбанÑки лек</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>ÐрменÑки драм</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>ÐнтилÑки гулден</displayName>
+ <symbol>NA f.</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>ÐнголÑка кванца</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>ÐнголÑка кванца (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>ÐнголÑка нова кванца (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>ÐнголÑка нова кванца (1995-1999)</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>ÐржентинÑко пеÑо (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>ÐржентинÑко пеÑо</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>ÐвÑтрийÑки шилинг</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>ÐвÑтралийÑки долар</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>ÐрубÑки гилдер - о. Ðруба</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>ÐзербайджанÑки манат</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>БоÑна и Херцеговина-динар</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>БоÑненÑка конвертируема марка</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>БарбейдоÑки долар</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>Бангладешка така</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>БелгийÑки франк (конвертируем)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>БелгийÑки франк</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>БелгийÑки франк (финанÑов)</displayName>
+ </currency>
+ <currency type="BGL">
+ <symbol>лв</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>БългарÑки лев</displayName>
+ <symbol>лв.</symbol>
+ </currency>
+ <currency type="BHD">
+ <displayName>БахрейнÑки динар</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>БурундийÑки франк</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>БермудÑки долар</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>БрунейÑки долар</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>БоливийÑко боливиано</displayName>
+ <symbol>Bs</symbol>
+ </currency>
+ <currency type="BOP">
+ <displayName>БоливийÑко пеÑо</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>БразилÑки реал</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BSD">
+ <displayName>БахамÑки долар</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>БутанÑки нгултрум</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BWP">
+ <displayName>БотÑуанÑка пула</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>БеларуÑка нова рубла (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>БеларуÑка рубла</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>БелизийÑки долар</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>КанадÑки долар</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>КонгоанÑки франк</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>ШвейцарÑки франк</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CLP">
+ <displayName>ЧилийÑко пеÑо</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>КитайÑки ренминби юан</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>КолумбийÑко пеÑо</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="CRC">
+ <displayName>КоÑтариканÑки колон</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSK">
+ <displayName>ЧехоÑловашка конвертируема крона</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>КубинÑко пеÑо</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Кабо Верде еÑкудо</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>КипърÑка лира</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>Чешка крона</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>ГерманÑка марка</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>ДжибутÑки франк</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>ДатÑка крона</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>ДоминиканÑко пеÑо</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>ÐлжирÑки динар</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>ЕквадорÑко Ñукре</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>ЕÑтонÑка крона</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>ЕгипетÑка лира</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>ЕритрейÑка накфа</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>ИÑпанÑка пеÑета</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>ЕтиопÑки бир</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>Евро</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>ФинландÑка марка</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Фиджи - долар</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>ФолкландÑка лира</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>ФренÑки франк</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>БританÑка лира</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>ГрузинÑки лари</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>ГанайÑки Ñеди</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>ГибралтарÑка лира</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>ГамбийÑки далаÑи</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>ГвинейÑки франк</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GRD">
+ <displayName>Гръцка драхма</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>ГватемалÑки кветзал</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWP">
+ <displayName>ГвинеÑ-БиÑау пеÑо</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>ГаÑнÑки долар</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>ХонгконгÑки долар</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>ХондураÑка лемпира</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>ХърватÑки динар</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>ХърватÑка куна</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>ХаитÑки гурд</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>УнгарÑки форинт</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>ИндонезийÑка рупиÑ</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>ИрландÑка лира</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>ИзраелÑка лира</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>ИзраелÑки нов шекел</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>ИндийÑка рупиÑ</displayName>
+ <symbol>INR</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>ИракÑки динар</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>ИранÑки риал</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>ИÑландÑка крона</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>ИталианÑка лира</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>ЯмайÑки долар</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>ЙорданÑки динар</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>ЯпонÑка йена</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>КенийÑки шилинг</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>КиргиÑтанÑки Ñом</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>КамбоджанÑки риел</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>КоморÑки франк</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>СевернокорейÑки вон</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>КÐДР вон</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>КувейтÑки динар</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>Кайманови оÑтрови - долар</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>КазахÑтанÑко тенге</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>ЛаоÑки кип</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>ЛиванÑка лира</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>ШриланкÑка рупиÑ</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>ЛиберийÑки долар</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>ЛеÑотÑко лоти</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LTL">
+ <displayName>ЛитовÑки литаз</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>ЛюкÑембургÑки франк</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>ЛатвийÑки лат</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>ЛатвийÑка рубла</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>ЛибийÑки динар</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>МароканÑки дирхам</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>МароканÑки франк</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>МолдовÑко леу</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Малгашки франк - МадагаÑкар</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>МакедонÑки денар</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MMK">
+ <displayName>МиÑнмарÑки (Бирма) киÑÑ‚</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>МонголÑки тугрик</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Макао - патака</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>МавританÑка огиÑ</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>МалтийÑка лира</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MUR">
+ <displayName>МаврицийÑка рупиÑ</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>МалдивÑка руфиÑ</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>МалавийÑка квача</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>МекÑиканÑко ново пеÑо</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>МекÑиканÑко Ñребърно пеÑо (1861-1992)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>МалайзийÑки рингит</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>МозамбикÑко еÑкудо</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>МозамбикÑки метикал</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>ÐамибийÑки долар</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>ÐигерийÑка найра</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>ÐикарагуанÑка кордоба</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>ХоландÑки гулден</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Ðорвежка крона</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>ÐепалÑка рупиÑ</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>ÐовозеландÑки долар</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>ОманÑки риал</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>ПанамÑки балбоа</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>ПеруанÑки нов Ñол</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>ПеруанÑки Ñол</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Папуа-новогвинейÑка кина</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>ФилипинÑко пеÑо</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>ПакиÑтанÑка рупиÑ</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>ПолÑка злота</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>ПолÑка злота (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>ПортугалÑко еÑкудо</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>ПарагвайÑко гуарани</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>КатарÑки риал</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="ROL">
+ <displayName>РумънÑка леÑ</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>РуÑка рубла</displayName>
+ <symbol>Руб.</symbol>
+ </currency>
+ <currency type="RUR">
+ <displayName>РуÑка рубла (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>РуандÑки франк</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>СаудитÑкоарабÑки риал</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>Соломонови оÑтрови - долар</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>СейшелÑка рупиÑ</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>СуданÑки динар</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>СуданÑка лира</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>ШведÑка крона</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>СингапурÑки долар</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>Света Елена лира</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>СловенÑки толар</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Словашка крона</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>СиералеонÑко леоне</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>СомалийÑки шилинг</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRG">
+ <displayName>СуринамÑки гилдер</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>Сао Томе и ПринÑипи - добра</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>СъветÑка рубла</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>СалвадорÑки колон</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>СирийÑка лира</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>СвазилендÑки лилангени</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>ТайландÑки бат</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>ТаджикиÑтанÑка рубла</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>ТаджикиÑтанÑки Ñомони</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>ТуркмениÑтанÑки манат</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>ТунизийÑки динар</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>Тонга - па анга</displayName>
+ <symbol>T$</symbol>
+ </currency>
+ <currency type="TPE">
+ <displayName>ТиморÑко еÑкудо</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>ТурÑка лира</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName>Ðова турÑка лира</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Тринидат и Тобаго - долар</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>ТайванÑки долар</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>ТанзанийÑки шилинг</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>УкраинÑка хривнÑ</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>УкраинÑки карбованец</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>УгандийÑки шилинг (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>УгандийÑки нов шилинг</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>СÐЩ долар</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="UYP">
+ <displayName>УругвайÑко пеÑо (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>УругвайÑко пеÑо</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>УзбекиÑтанÑки Ñум</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>ВенеÑуелÑки боливар</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>ВиетнамÑки донг</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>Вануату - вату</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>Самоа - тала</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>Буркина ФаÑо - CFA - франк</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>Злато</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>ИзточнокарибÑки долар - Ðнтигуа</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XEU">
+ <displayName>Еку на ЕИО</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>ФренÑки златен франк</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>Бенин - CFA франк</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>ФренÑкополинезийÑки франк</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="YDD">
+ <displayName>ЙеменÑки динар</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>ЙеменÑки риал</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUM">
+ <displayName>ЮгоÑлавÑки динар</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>ЮгоÑлавÑки конвертируем динар</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>ЮжноафриканÑки ранд (финанÑов)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>ЮжноафриканÑки ранд</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>ЗамбийÑка квача</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>ЗаирÑко ново зайре</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>ЗаирÑко зайре</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>ЗимбабвийÑки долар</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>да:д</yesstr>
+ <nostr>не:н</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1">Bulgarian language (Wikipedia)</reference>
+ <reference type="RP2" uri="http://www.cl.bas.bg/Library/English/Ebez.html">Bulgarian language (Bulgarian Academy of Sciences)</reference>
+ <reference type="RP3" uri="http://www.evertype.com/alphabets/bulgarian.pdf">The Alphabets of Europe - Bulgarian (Michael Everson)</reference>
+ <reference type="RP5" uri="http://www.hermessoft.com/newproject/codepages/wcpbg.html">Windows Code Page BG (Bulgarian) by HermesSOFT</reference>
+ <reference type="RP6" uri="http://en.wikipedia.org/wiki/MIK_Code_page">MIK - Bulgarian DOS/OEM Codepage</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/bg_BG.xml b/libs/Zend/Locale/Data/bg_BG.xml
new file mode 100755
index 0000000000..e3de3d259e
--- /dev/null
+++ b/libs/Zend/Locale/Data/bg_BG.xml
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.43 $"/>
+ <generation date="$Date: 2006/08/04 21:59:10 $"/>
+ <language type="bg"/>
+ <territory type="BG"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ae" draft="provisional">ÐвеÑÑ‚Ñки</language>
+ <language type="alg" draft="provisional">ÐлгонквианÑки езици</language>
+ <language type="arw" draft="provisional">ÐравакÑки</language>
+ <language type="bin" draft="provisional">Бини</language>
+ <language type="bla" draft="provisional">СикÑика</language>
+ <language type="bm" draft="provisional">Банмана</language>
+ <language type="bra" draft="provisional">Брадж</language>
+ <language type="btk" draft="provisional">Батак</language>
+ <language type="bua" draft="provisional">БурÑÑ‚Ñки</language>
+ <language type="bug" draft="provisional">БугинезÑки</language>
+ <language type="byn" draft="provisional">БиленÑки</language>
+ <language type="cad" draft="provisional">КадоанÑки</language>
+ <language type="ceb" draft="provisional">Себуано</language>
+ <language type="ch" draft="provisional">Чаморо</language>
+ <language type="chb" draft="provisional">Чибча</language>
+ <language type="chg" draft="provisional">Чатагай</language>
+ <language type="chk" draft="provisional">ЧукÑки</language>
+ <language type="chm" draft="provisional">МарийÑки</language>
+ <language type="chn" draft="provisional">Жаргон Чинуук</language>
+ <language type="cho" draft="provisional">ЧоктавÑки</language>
+ <language type="chp" draft="provisional">ЧиипувÑки</language>
+ <language type="cmc" draft="provisional">Чамик</language>
+ <language type="cop" draft="provisional">КоптÑки</language>
+ <language type="cr" draft="provisional">Крии</language>
+ <language type="crh" draft="provisional">КримÑки ТурÑки; КримÑки ТатарÑки</language>
+ <language type="csb" draft="provisional">КашубÑки</language>
+ <language type="cus" draft="provisional">КушÑки (други)</language>
+ <language type="cv" draft="provisional">Чувашки</language>
+ <language type="dak" draft="provisional">ДакотÑки</language>
+ <language type="dar" draft="provisional">Даргва (ДрагинÑки)</language>
+ <language type="day" draft="provisional">ДаÑкÑки</language>
+ <language type="del" draft="provisional">Делауер</language>
+ <language type="dgr" draft="provisional">ДогрибÑки</language>
+ <language type="din" draft="provisional">Динка</language>
+ <language type="doi" draft="provisional">Догри</language>
+ <language type="dra" draft="provisional">ДравидÑки</language>
+ <language type="dsb" draft="provisional">ДолноÑербÑки</language>
+ <language type="dua" draft="provisional">Дуала</language>
+ <language type="dyu" draft="provisional">Дйула</language>
+ <language type="dz" draft="provisional">Дзонха (БутанÑки)</language>
+ <language type="ee" draft="provisional">Еве</language>
+ <language type="efi" draft="provisional">Ефик</language>
+ <language type="eka" draft="provisional">Екаджук</language>
+ <language type="elx" draft="provisional">ЕламитÑки</language>
+ <language type="ewo" draft="provisional">Евондо</language>
+ <language type="fan" draft="provisional">Фанг</language>
+ <language type="fat" draft="provisional">Фанти</language>
+ <language type="ff" draft="provisional">Фула</language>
+ <language type="fil" draft="provisional">ФилипинÑки</language>
+ <language type="fj" draft="provisional">ФиджийÑки</language>
+ <language type="fo" draft="provisional">ФарьорÑки</language>
+ <language type="fon" draft="provisional">Фон</language>
+ <language type="fur" draft="provisional">ФриулианÑки</language>
+ <language type="fy" draft="provisional">ФриÑианÑки</language>
+ <language type="gaa" draft="provisional">Га</language>
+ <language type="gay" draft="provisional">Гайо</language>
+ <language type="gba" draft="provisional">Гбайа</language>
+ <language type="gez" draft="provisional">Гииз</language>
+ <language type="gil" draft="provisional">ГилбертÑки</language>
+ <language type="gl" draft="provisional">ГалиÑийÑки</language>
+ <language type="gn" draft="provisional">ГуаранÑки</language>
+ <language type="gon" draft="provisional">ГондÑки</language>
+ <language type="gor" draft="provisional">ГоронталÑки</language>
+ <language type="grb" draft="provisional">Гребо</language>
+ <language type="gv" draft="provisional">МанкÑ</language>
+ <language type="ha" draft="provisional">Хауза</language>
+ <language type="hai" draft="provisional">Хайда</language>
+ <language type="hil" draft="provisional">Хилигейнон</language>
+ <language type="him" draft="provisional">ХимачалÑки</language>
+ <language type="hmn" draft="provisional">Хмонг</language>
+ <language type="ho" draft="provisional">Хири Мотгу</language>
+ <language type="hsb" draft="provisional">ГорноÑербÑки</language>
+ <language type="hup" draft="provisional">Хупа</language>
+ <language type="hz" draft="provisional">Хереро</language>
+ <language type="ia" draft="provisional">Интерлингва</language>
+ <language type="iba" draft="provisional">ИбанÑки</language>
+ <language type="ie" draft="provisional">Интерлинг</language>
+ <language type="ig" draft="provisional">Игбо</language>
+ <language type="ijo" draft="provisional">Иджо</language>
+ <language type="ik" draft="provisional">Инупиак</language>
+ <language type="ilo" draft="provisional">Илоко</language>
+ <language type="iro" draft="provisional">ИроквианÑки езици</language>
+ <language type="iu" draft="provisional">Инукитут</language>
+ <language type="jbo" draft="provisional">Лоджбан</language>
+ <language type="kaa" draft="provisional">Каракалпашки</language>
+ <language type="kab" draft="provisional">Кабили</language>
+ <language type="kac" draft="provisional">КачинÑки</language>
+ <language type="kam" draft="provisional">Камба</language>
+ <language type="kar" draft="provisional">КаренÑки</language>
+ <language type="kaw" draft="provisional">Кави</language>
+ <language type="kbd" draft="provisional">КабардианÑки</language>
+ <language type="kha" draft="provisional">КаÑи</language>
+ <language type="khi" draft="provisional">КоиÑан (други)</language>
+ <language type="kho" draft="provisional">КотанÑки</language>
+ <language type="kj" draft="provisional">КванÑма</language>
+ <language type="kl" draft="provisional">ГренландÑки еÑкимоÑки</language>
+ <language type="kmb" draft="provisional">Кимбунду</language>
+ <language type="kn" draft="provisional">Канада</language>
+ <language type="kok" draft="provisional">Конкани</language>
+ <language type="kpe" draft="provisional">Кпеле</language>
+ <language type="kr" draft="provisional">Канури</language>
+ <language type="krc" draft="provisional">Карачай-БалкарÑки</language>
+ <language type="kro" draft="provisional">Кру</language>
+ <language type="kru" draft="provisional">Курук (ОаронÑки)</language>
+ <language type="kum" draft="provisional">КумикÑки</language>
+ <language type="kut" draft="provisional">Куутенай</language>
+ <language type="kv" draft="provisional">Коми</language>
+ <language type="kw" draft="provisional">КорнуолÑки келтÑки</language>
+ <language type="pro" draft="provisional">ПрованÑалÑки (до 1500)</language>
+ </languages>
+ <scripts>
+ <script type="Batk" draft="provisional">Батак</script>
+ <script type="Bopo" draft="provisional">Бопомофо</script>
+ <script type="Brah" draft="provisional">Брахми</script>
+ <script type="Bugi" draft="provisional">Бугинезки</script>
+ <script type="Buhd" draft="provisional">Бухид</script>
+ <script type="Cprt" draft="provisional">КипърÑки</script>
+ <script type="Cyrs" draft="provisional">Кирилица (Стар църковно-ÑлавÑнÑки вариант)</script>
+ <script type="Egyp" draft="provisional">ЕгипетÑки (йероглифи)</script>
+ <script type="Glag" draft="provisional">ГлаголичеÑки</script>
+ <script type="Hrkt" draft="provisional">Катакана или Хирагана</script>
+ <script type="Hung" draft="provisional">СтароунгарÑки</script>
+ <script type="Java" draft="provisional">ЯванÑки</script>
+ <script type="Maya" draft="provisional">Йероглифи на Маите</script>
+ <script type="Roro" draft="provisional">Ронго-ронго</script>
+ <script type="Xpeo" draft="provisional">СтароперÑийÑки</script>
+ <script type="Xsux" draft="provisional">Шумеро-акадÑки</script>
+ </scripts>
+ </localeDisplayNames>
+ <delimiters>
+ <quotationStart>«</quotationStart>
+ <quotationEnd>»</quotationEnd>
+ <alternateQuotationStart>“</alternateQuotationStart>
+ <alternateQuotationEnd>„</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">пр.Хр.</era>
+ <era type="1" draft="unconfirmed">Ñл.Хр.</era>
+ </eraNames>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern draft="provisional">#0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/bn.xml b/libs/Zend/Locale/Data/bn.xml
new file mode 100755
index 0000000000..5bb69b5045
--- /dev/null
+++ b/libs/Zend/Locale/Data/bn.xml
@@ -0,0 +1,228 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.49 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="bn"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="bn">বাংলা</language>
+ </languages>
+ <territories>
+ <territory type="AF">আফগানিসà§à¦¤à¦¾à¦¨</territory>
+ <territory type="AL">আলবà§à¦¯à¦¾à¦¨à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="AM">আরà§à¦®à§‡à¦¨à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="AR">আরà§à¦œà§‡à¦£à§à¦Ÿà¦¾à¦‡à¦¨à¦¾</territory>
+ <territory type="AT">অসà§à¦Ÿà§à¦°à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="AU">অসà§à¦Ÿà§à¦°à§‡à¦²à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="AZ">আজারবাইজান</territory>
+ <territory type="BD">বাংলাদেশ</territory>
+ <territory type="BE">বেলà§à¦œà¦¿à¦¯à¦¼à¦®</territory>
+ <territory type="BE" alt="proposed-u123-1" draft="unconfirmed">বেলজিয়াম</territory>
+ <territory type="BG">বà§à¦²à¦—েরিয়া</territory>
+ <territory type="BO">বোলিভিয়া</territory>
+ <territory type="BR">বà§à¦°à¦¾à¦œà¦¿à¦²</territory>
+ <territory type="BT">ভà§à¦Ÿà¦¾à¦¨</territory>
+ <territory type="BY">বেলোরà§à¦¶à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="CG">কঙà§à¦—ো</territory>
+ <territory type="CH">সà§à¦‡à¦œà¦°à§à¦²à¦£à§à¦¡</territory>
+ <territory type="CH" alt="proposed-u123-1" draft="unconfirmed">সà§à¦‡à¦œà¦¾à¦°à¦²à§à¦¯à¦¾à¦¨à§à¦¡</territory>
+ <territory type="CL">চিলি</territory>
+ <territory type="CN">চীন</territory>
+ <territory type="CO">কোলোমà§à¦¬à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="CR">কোসà§à¦Ÿà¦¾à¦°à¦¿à¦•à¦¾</territory>
+ <territory type="CU">কিউবা</territory>
+ <territory type="CZ">চেকিয়া</territory>
+ <territory type="DE">জারà§à¦®à¦¾à¦¨à¦¿</territory>
+ <territory type="DK">ডেনà§à¦®à¦¾à¦°à§à¦•</territory>
+ <territory type="DK" alt="proposed-u123-1" draft="unconfirmed">ডেনমারà§à¦•</territory>
+ <territory type="DZ">à¦à¦²à¦œà¦¿à¦°à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="EC">ইকোয়াডর</territory>
+ <territory type="EE">à¦à¦¸à§à¦¤à§‹à¦¨à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="EG">মিশর</territory>
+ <territory type="EH">পশà§à¦šà¦¿à¦®à§€ সাহারা</territory>
+ <territory type="EH" alt="proposed-u123-1" draft="unconfirmed">পশà§à¦šà¦¿à¦® সাহারা</territory>
+ <territory type="ES">সà§à¦ªà§‡à¦¨</territory>
+ <territory type="ET">ইফিওপিয়া</territory>
+ <territory type="FI">ফিনà§à¦²à§à¦¯à¦¾à¦£à§à¦¡</territory>
+ <territory type="FI" alt="proposed-u123-1" draft="unconfirmed">ফিনলà§à¦¯à¦¾à¦¨à§à¦¡</territory>
+ <territory type="FR">ফà§à¦°à¦¾à¦¨à§à¦¸</territory>
+ <territory type="GB">গà§à¦°à§‡à¦Ÿà¦¬à§ƒà¦Ÿà§‡à¦¨</territory>
+ <territory type="GE">জরà§à¦œà¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="GH">গানা</territory>
+ <territory type="GH" alt="proposed-u123-1" draft="unconfirmed">ঘানা</territory>
+ <territory type="GR">গà§à¦°à§€à¦¸à§</territory>
+ <territory type="GR" alt="proposed-u123-1" draft="unconfirmed">গà§à¦°à§€à¦¸</territory>
+ <territory type="GT">গোয়াটিমালা</territory>
+ <territory type="GT" alt="proposed-u123-1" draft="unconfirmed">গোয়াতিমালা</territory>
+ <territory type="GY">গিয়ানা</territory>
+ <territory type="HN">হণà§à¦¡à§à¦°à¦¾à¦¸</territory>
+ <territory type="HU">হাঙà§à¦—েরি</territory>
+ <territory type="ID">ইনà§à¦¦à§‹à¦¨à§‡à¦¶à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="IE">আয়ারà§à¦²à¦£à§à¦¡</territory>
+ <territory type="IE" alt="proposed-u123-1" draft="unconfirmed">আয়ারলà§à¦¯à¦¾à¦¨à§à¦¡</territory>
+ <territory type="IL">ইসà§à¦°à¦¾à¦¯à¦¼à§‡à¦²</territory>
+ <territory type="IL" alt="proposed-u123-1" draft="unconfirmed">ইসরায়েল</territory>
+ <territory type="IN">ভারত</territory>
+ <territory type="IQ">ইরাক</territory>
+ <territory type="IR">ইরান</territory>
+ <territory type="IS">আইসলণà§à¦¡</territory>
+ <territory type="IS" alt="proposed-u123-1" draft="unconfirmed">আইসলà§à¦¯à¦¾à¦¨à§à¦¡</territory>
+ <territory type="IT">ইতালী</territory>
+ <territory type="JM">জà§à¦¯à¦¾à¦®à§‡à¦•à¦¾</territory>
+ <territory type="JM" alt="proposed-u123-1" draft="unconfirmed">জামাইকা</territory>
+ <territory type="JO">জরà§à¦¡à¦¨</territory>
+ <territory type="JO" alt="proposed-u123-1" draft="unconfirmed">জরà§à¦¡à¦¾à¦¨</territory>
+ <territory type="JP">জাপান</territory>
+ <territory type="KE">কেনিয়া</territory>
+ <territory type="KG">কিরà§à¦—িজিয়া</territory>
+ <territory type="KG" alt="proposed-u123-1" draft="unconfirmed">কিরà§à¦˜à¦¿à¦œà¦¸à§à¦¤à¦¾à¦¨</territory>
+ <territory type="KH">কামà§à¦¬à§‹à¦œ</territory>
+ <territory type="KR">দকà§à¦·à¦¿à¦£ কোরিয়া</territory>
+ <territory type="KZ">কাজাকসà§à¦¥à¦¾à¦¨</territory>
+ <territory type="LA">লাওস</territory>
+ <territory type="LB">লেবানন</territory>
+ <territory type="LK">শà§à¦°à§€à¦²à¦™à§à¦•à¦¾</territory>
+ <territory type="LR">লাইবিরিয়া</territory>
+ <territory type="LT">লিতà§à¦­à¦¾</territory>
+ <territory type="LT" alt="proposed-u123-1" draft="unconfirmed">লিথà§à¦¯à¦¼à§‡à¦¨à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="LU">লাকà§à¦¸à§‡à¦®à¦¬à¦¾à¦°à§à¦—</territory>
+ <territory type="LV">লাতà§à¦­à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="LV" alt="proposed-u123-1" draft="unconfirmed">লাতভিয়া</territory>
+ <territory type="LY">লিবিয়া</territory>
+ <territory type="MA">মোরকà§à¦•à§‹</territory>
+ <territory type="MD">মোলà§à¦¦à¦¾à¦­à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="MD" alt="proposed-u123-1" draft="unconfirmed">মলদোভিয়া</territory>
+ <territory type="MG">মাদাগাসà§à¦•à¦¾à¦°</territory>
+ <territory type="MN">মঙà§à¦—োলিয়া</territory>
+ <territory type="MX">মকà§à¦¸à¦¿à¦•à§‹</territory>
+ <territory type="MX" alt="proposed-u123-1" draft="unconfirmed">মেকà§à¦¸à¦¿à¦•à§‹</territory>
+ <territory type="MY">মালà§à¦¯à¦¾à¦¶à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="MY" alt="proposed-u123-1" draft="unconfirmed">মালয়েশিয়া</territory>
+ <territory type="NI">নিকারাগোয়া</territory>
+ <territory type="NI" alt="proposed-u123-1" draft="unconfirmed">নিকারাগà§à¦¯à¦¼à¦¾</territory>
+ <territory type="NL">হলণà§à¦¡</territory>
+ <territory type="NL" alt="proposed-u123-1" draft="unconfirmed">হলà§à¦¯à¦¾à¦£à§à¦¡</territory>
+ <territory type="NO">নরওয়ে</territory>
+ <territory type="NP">নেপাল</territory>
+ <territory type="NZ">নিউ জিলণà§à¦¡</territory>
+ <territory type="NZ" alt="proposed-u123-1" draft="unconfirmed">নিউজিলà§à¦¯à¦¾à¦£à§à¦¡</territory>
+ <territory type="PA">পানামা</territory>
+ <territory type="PE">পিরà§</territory>
+ <territory type="PE" alt="proposed-u123-1" draft="unconfirmed">পেরà§</territory>
+ <territory type="PH">ফিলিপাইন</territory>
+ <territory type="PK">পাকিসà§à¦¤à¦¾à¦¨</territory>
+ <territory type="PL">পোলà§à¦¯à¦¾à¦£à§à¦¡</territory>
+ <territory type="PT">পরà§à¦¤à§à¦—াল</territory>
+ <territory type="PY">পà§à¦¯à¦¾à¦°à¦¾à¦—োয়ে</territory>
+ <territory type="RO">রà§à¦®à¦¾à¦¨à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="RU">রাশিয়া</territory>
+ <territory type="SA">সাউদি আরব</territory>
+ <territory type="SD">সà§à¦¦à¦¾à¦¨</territory>
+ <territory type="SE">সà§à¦‡à¦¡à§‡à¦¨</territory>
+ <territory type="SG">সিঙà§à¦—াপà§à¦°</territory>
+ <territory type="SK">শà§à¦²à§‹à¦­à¦¾à¦•à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="SO">সোমালি</territory>
+ <territory type="SV">সালভেডর</territory>
+ <territory type="SY">সিরিয়া</territory>
+ <territory type="TH">থাই</territory>
+ <territory type="TJ">তাজিকসà§à¦¥à¦¾à¦¨</territory>
+ <territory type="TM">তà§à¦°à§à¦•à¦®à§‡à¦¨à¦¿à¦¯à¦¼à¦¾</territory>
+ <territory type="TN">টিউনিসà§</territory>
+ <territory type="TR">তà§à¦°à¦¸à§à¦•</territory>
+ <territory type="TW">তাইওয়ান</territory>
+ <territory type="UA">ইউকà§à¦°à§‡à¦‡à¦¨</territory>
+ <territory type="US">মারà§à¦•à¦¿à¦¨ যà§à¦•à§à¦¤à¦°à¦¾à¦·à§à¦Ÿà§à¦°</territory>
+ <territory type="UY">উরà§à¦—োয়ে</territory>
+ <territory type="UZ">উজà§à¦¬à§‡à¦•à¦¿à¦¸à§à¦¥à¦¾à¦¨</territory>
+ <territory type="VE">ভেনেজà§à¦¯à¦¼à§‡à¦²à¦¾</territory>
+ <territory type="VN">ভিয়েতনাম</territory>
+ <territory type="YE">ইমেন</territory>
+ <territory type="ZA">দকà§à¦·à¦¿à¦£ আফà§à¦°à¦¿à¦•à¦¾</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[় à¦-ঃ ৺ অ-ঋ ৠ ঌ ৡ ঠঠও-ড {ড়} ঢ {ঢ়} ণ ত ৎ থ-ন প-য {য়} র ল শ-হ ঽ-ৄ ৢ ৣ ে ৈ ো-ৠৗ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D ৸ ৹ ৲ ৳ ০-৪ ৷ ৫-ৱ]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">জানà§à¦¯à¦¼à¦¾à¦°à§€</month>
+ <month type="2">ফেবà§à¦°à§à¦¯à¦¼à¦¾à¦°à§€</month>
+ <month type="3">মারà§à¦š</month>
+ <month type="4">à¦à¦ªà§à¦°à¦¿à¦²</month>
+ <month type="5">মে</month>
+ <month type="6">জà§à¦¨</month>
+ <month type="7">জà§à¦²à¦¾à¦‡</month>
+ <month type="8">আগসà§à¦Ÿ</month>
+ <month type="9">সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°</month>
+ <month type="10">অকà§à¦Ÿà§‹à¦¬à¦°</month>
+ <month type="11">নভেমà§à¦¬à¦°</month>
+ <month type="12">ডিসেমà§à¦¬à¦°</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">জানà§à¦¯à¦¼à¦¾à¦°à§€</month>
+ <month type="2">ফেবà§à¦°à§à¦¯à¦¼à¦¾à¦°à§€</month>
+ <month type="3">মারà§à¦š</month>
+ <month type="4">à¦à¦ªà§à¦°à¦¿à¦²</month>
+ <month type="5">মে</month>
+ <month type="6">জà§à¦¨</month>
+ <month type="7">জà§à¦²à¦¾à¦‡</month>
+ <month type="8">আগসà§à¦Ÿ</month>
+ <month type="9">সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°</month>
+ <month type="10">অকà§à¦Ÿà§‹à¦¬à¦°</month>
+ <month type="11">নভেমà§à¦¬à¦°</month>
+ <month type="12">ডিসেমà§à¦¬à¦°</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">রবি</day>
+ <day type="mon">সোম</day>
+ <day type="tue">মঙà§à¦—ল</day>
+ <day type="wed">বà§à¦§</day>
+ <day type="thu">বৃহসà§à¦ªà¦¤à¦¿</day>
+ <day type="fri">শà§à¦•à§à¦°</day>
+ <day type="sat">শনি</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">রবিবার</day>
+ <day type="mon">সোমবার</day>
+ <day type="tue">মঙà§à¦—লবার</day>
+ <day type="wed">বà§à¦§à¦¬à¦¾à¦°</day>
+ <day type="thu">বৃহষà§à¦ªà¦¤à¦¿à¦¬à¦¾à¦°</day>
+ <day type="fri">শà§à¦•à§à¦°à¦¬à¦¾à¦°</day>
+ <day type="sat">শনিবার</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am>পূরà§à¦¬à¦¾à¦¹à§à¦£</am>
+ <pm>অপরাহà§à¦£</pm>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="BDT">
+ <symbol>৳</symbol>
+ </currency>
+ <currency type="INR">
+ <symbol>টাকা</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">হà§à¦¯à¦¼à¦¾à¦</yesstr>
+ <nostr draft="unconfirmed">না</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/bn_BD.xml b/libs/Zend/Locale/Data/bn_BD.xml
new file mode 100755
index 0000000000..8adaba4477
--- /dev/null
+++ b/libs/Zend/Locale/Data/bn_BD.xml
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.15 $"/>
+ <generation date="$Date: 2006/06/28 21:35:15 $"/>
+ <language type="bn"/>
+ <territory type="BD"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa" draft="unconfirmed">আফার</language>
+ <language type="ab" draft="unconfirmed">আবà§à¦–াজিয়</language>
+ <language type="ace" draft="unconfirmed">অচাইনিজ</language>
+ <language type="ach" draft="unconfirmed">অকোলি</language>
+ <language type="ada" draft="unconfirmed">অদাগà§à¦®à¦¿</language>
+ <language type="ady" draft="unconfirmed">অদিà¦à¦¿</language>
+ <language type="ae" draft="unconfirmed">অভেসà§à¦¤à¦¾à¦¨</language>
+ <language type="af" draft="unconfirmed">আফà§à¦°à¦¿à¦•à¦¾à¦¨</language>
+ <language type="afa" draft="unconfirmed">অফà§à¦°à§‹-à¦à¦¶à¦¿à¦¯à¦¼à¦¾à¦Ÿà¦¿à¦• (অনà§à¦¯à¦¾à¦¨à§à¦¯)</language>
+ <language type="afh" draft="unconfirmed">অফà§à¦°à¦¿à¦¹à¦¿à¦²à¦¿</language>
+ <language type="ain" draft="unconfirmed">আইনà§</language>
+ <language type="ak" draft="unconfirmed">আকান</language>
+ <language type="akk" draft="unconfirmed">আকà§à¦•à¦¾à¦¦à¦¿à¦¯à¦¼à¦¾à¦¨</language>
+ <language type="ale" draft="unconfirmed">অলেউত</language>
+ <language type="alg" draft="unconfirmed">আলগোনকিউআন ভাষা</language>
+ <language type="alt" draft="unconfirmed">দকà§à¦·à¦¿à¦¨ আলতাই</language>
+ <language type="am" draft="unconfirmed">আমহারিক</language>
+ <language type="an" draft="unconfirmed">আরà§à¦—োনিজ</language>
+ <language type="ang" draft="unconfirmed">à¦à¦¤à¦¿à¦¹à¦¾à¦¸à¦¿à¦• ইংরেজী (ca.৪৫০-১১০০)</language>
+ <language type="apa" draft="unconfirmed">à¦à§à¦¯à¦¾à¦ªà¦¾à¦šà¦¿ ভাষা</language>
+ <language type="ar" draft="unconfirmed">আরবী</language>
+ <language type="arc" draft="unconfirmed">আরামেইক</language>
+ <language type="arn" draft="unconfirmed">আরাউকানিয়</language>
+ <language type="arp" draft="unconfirmed">আরাফাও</language>
+ <language type="art" draft="unconfirmed">কৃতà§à¦°à¦¿à¦® (অনà§à¦¯à¦¾à¦¨à§à¦¯)</language>
+ <language type="arw" draft="unconfirmed">আরাওয়াক</language>
+ <language type="as" draft="unconfirmed">অসমীয়</language>
+ <language type="ast" draft="unconfirmed">অসà§à¦Ÿà§à¦°à¦¿à¦¯à¦¼</language>
+ <language type="ath" draft="unconfirmed">আথাপাসà§à¦•à§‡à¦¨ ভাষা</language>
+ <language type="aus" draft="unconfirmed">অসà§à¦Ÿà§à¦°à§‡à¦²à¦¿à¦¯à¦¼à¦¾à¦° ভাষা</language>
+ <language type="av" draft="unconfirmed">অভেরিক</language>
+ <language type="awa" draft="unconfirmed">আওয়াধি</language>
+ <language type="ay" draft="unconfirmed">আয়মারা</language>
+ <language type="az" draft="unconfirmed">আজেরবাইজানিয়</language>
+ <language type="ba" draft="unconfirmed">বাসখির</language>
+ <language type="bad" draft="unconfirmed">বানà§à¦¦à¦¾</language>
+ <language type="bai" draft="unconfirmed">বামিলেকে ভাষা</language>
+ <language type="bal" draft="unconfirmed">বেলà§à¦šà§€</language>
+ <language type="ban" draft="unconfirmed">বালিনিজ</language>
+ <language type="bas" draft="unconfirmed">বাসা</language>
+ <language type="bat" draft="unconfirmed">বালà§à¦Ÿà¦¿à¦• (অনà§à¦¯à¦¾à¦¨à§à¦¯)</language>
+ <language type="be" draft="unconfirmed">বেলারাশিয়ান</language>
+ <language type="bej" draft="unconfirmed">বেজা</language>
+ <language type="bem" draft="unconfirmed">বেমà§à¦¬à¦¾</language>
+ <language type="ber" draft="unconfirmed">বারবের</language>
+ <language type="bg" draft="unconfirmed">বà§à¦²à¦—েরিয়ান</language>
+ <language type="bh" draft="unconfirmed">বিহারি</language>
+ <language type="bho" draft="unconfirmed">ভোজপà§à¦°à¦¿</language>
+ <language type="bi" draft="unconfirmed">বিসলামা</language>
+ <language type="bik" draft="unconfirmed">বিকোল</language>
+ <language type="bin" draft="unconfirmed">বিনি</language>
+ <language type="bla" draft="unconfirmed">শিকশিকা</language>
+ <language type="bm" draft="unconfirmed">বামবারা</language>
+ <language type="bnt" draft="unconfirmed">বানà§à¦¤à§</language>
+ <language type="bo" draft="unconfirmed">তিবেতেইন</language>
+ <language type="br" draft="unconfirmed">বà§à¦°à§‡à¦Ÿà¦¨</language>
+ <language type="bra" draft="unconfirmed">বà§à¦°à¦¾à¦œ</language>
+ <language type="bs" draft="unconfirmed">বসনিয়</language>
+ <language type="btk" draft="unconfirmed">বাতাক</language>
+ <language type="bua" draft="unconfirmed">বà§à¦°à¦¿à¦¯à¦¼à¦¾à¦¤</language>
+ <language type="bug" draft="unconfirmed">বà§à¦—িনিজ</language>
+ <language type="byn" draft="unconfirmed">বà§à¦²à¦¿à¦¨</language>
+ <language type="ca" draft="unconfirmed">কাতালান</language>
+ <language type="cad" draft="unconfirmed">কà§à¦¯à¦¾à¦¡à§à¦¡à¦¾à¦“</language>
+ <language type="cai" draft="unconfirmed">মধà§à¦¯ আমেরিকার ইনà§à¦¡à¦¿à¦¯à¦¼à¦¾à¦¨ (অনà§à¦¯à¦¾à¦¨à§à¦¯)</language>
+ <language type="car" draft="unconfirmed">কà§à¦¯à¦¾à¦°à¦¿à¦¬</language>
+ <language type="cau" draft="unconfirmed">কà§à¦¯à¦¾à¦“কেশীয়</language>
+ <language type="ce" draft="unconfirmed">চেচেন</language>
+ <language type="ceb" draft="unconfirmed">চেবà§à¦¯à¦¼à¦¾à¦¨à§‹</language>
+ <language type="cel" draft="unconfirmed">কালà§à¦Ÿà¦¿à¦•</language>
+ <language type="de" draft="unconfirmed">জারà§à¦®à¦¾à¦¨à¦¿</language>
+ <language type="en" draft="unconfirmed">ইংরেজী</language>
+ <language type="es" draft="unconfirmed">সà§à¦ªà§‡à¦¨à¦¿à¦¯à¦¼</language>
+ <language type="fr" draft="unconfirmed">ফà§à¦°à¦¾à¦¨à§à¦¸</language>
+ <language type="it" draft="unconfirmed">ইতালি</language>
+ <language type="ja" draft="unconfirmed">জাপানি</language>
+ <language type="pt" draft="unconfirmed">পোরà§à¦¤à§à¦—াল</language>
+ <language type="ru" draft="unconfirmed">রাশিয়া</language>
+ <language type="zh" draft="unconfirmed">চাইনিজ</language>
+ </languages>
+ <scripts>
+ <script type="Arab" draft="unconfirmed">আরবী</script>
+ <script type="Armn" draft="unconfirmed">আরà§à¦®à§‡à¦¨à¦¿à§Ÿà¦¾</script>
+ <script type="Bali" draft="unconfirmed">বিলি</script>
+ <script type="Batk" draft="unconfirmed">বটাক</script>
+ <script type="Beng" draft="unconfirmed">বাংলা</script>
+ <script type="Blis" draft="unconfirmed">বà§à¦²à¦¿à¦¸</script>
+ <script type="Bopo" draft="unconfirmed">বোপো</script>
+ <script type="Brah" draft="unconfirmed">বà§à¦°à¦¾à¦¹à§</script>
+ <script type="Brai" draft="unconfirmed">বà§à¦°à¦¾à¦‡</script>
+ <script type="Bugi" draft="unconfirmed">বà§à¦—ি</script>
+ <script type="Buhd" draft="unconfirmed">বà§à¦¹à§à¦¦</script>
+ <script type="Cans" draft="unconfirmed">কà§à¦¯à¦¾à¦¨à§à¦¸</script>
+ <script type="Cham" draft="unconfirmed">চà§à¦¯à¦¾à¦®</script>
+ <script type="Cher" draft="unconfirmed">চের</script>
+ <script type="Cirt" draft="unconfirmed">গিরà§à¦Ÿ</script>
+ <script type="Copt" draft="unconfirmed">কোপà§à¦Ÿ</script>
+ <script type="Cprt" draft="unconfirmed">কিপরোইত</script>
+ <script type="Cyrl" draft="unconfirmed">কিরিলà§à¦²à¦¿à¦•</script>
+ <script type="Cyrs" draft="unconfirmed">কিরিলà§à¦²à¦¿à¦• (পà§à¦°à§‹à¦¨à§‹)</script>
+ <script type="Deva" draft="unconfirmed">হিনà§à¦¦à¦¿</script>
+ <script type="Dsrt" draft="unconfirmed">দেসেরাত</script>
+ <script type="Egyd" draft="unconfirmed">মিশরিয় ডেমোটিক</script>
+ <script type="Egyh" draft="unconfirmed">মিশরিয় হেরিটিক</script>
+ <script type="Egyp" draft="unconfirmed">মিশরিয় হায়ারোগà§à¦²à¦¿à¦ªà§</script>
+ <script type="Ethi" draft="unconfirmed">ইথিয়োপিয়</script>
+ <script type="Geok" draft="unconfirmed">খà§à§Žà¦¸à§à¦°à¦¿</script>
+ <script type="Geor" draft="unconfirmed">জরà§à¦œà¦¿à§Ÿ</script>
+ <script type="Glag" draft="unconfirmed">গà§à¦²à¦¾à¦—</script>
+ <script type="Goth" draft="unconfirmed">গোথà§</script>
+ <script type="Grek" draft="unconfirmed">গà§à¦°à¦¿à¦•</script>
+ <script type="Gujr" draft="unconfirmed">গà§à¦œà¦°à¦¿à¦Ÿà¦¿</script>
+ <script type="Guru" draft="unconfirmed">পাঞà§à¦œà¦¾à¦¬à§€</script>
+ <script type="Hang" draft="unconfirmed">হà§à¦¯à¦¾à¦¨à¦—à§à¦²</script>
+ <script type="Hani" draft="unconfirmed">হà§à¦¯à¦¾à¦¨</script>
+ <script type="Hano" draft="unconfirmed">হà§à¦¯à¦¾à¦¨à§‹</script>
+ <script type="Hans" draft="unconfirmed">হà§à¦¯à¦¾à¦¨ [Hans]</script>
+ <script type="Hant" draft="unconfirmed">হà§à¦¯à¦¾à¦¨à¦Ÿà§</script>
+ <script type="Hebr" draft="unconfirmed">হিবà§à¦°à§</script>
+ <script type="Hira" draft="unconfirmed">হিরাগানা</script>
+ <script type="Hmng" draft="unconfirmed">ফারাও</script>
+ <script type="Hrkt" draft="unconfirmed">কানà§à¦¨à¦¾à¦Ÿà¦¾à¦•à¦¾</script>
+ <script type="Hung" draft="unconfirmed">হাঙà§à¦—েরীয়</script>
+ <script type="Inds" draft="unconfirmed">ইনà§à¦¦à¦¾à¦¸</script>
+ <script type="Ital" draft="unconfirmed">ইতালী</script>
+ <script type="Java" draft="unconfirmed">জাভা</script>
+ <script type="Kali" draft="unconfirmed">কায়াহà§</script>
+ <script type="Kana" draft="unconfirmed">কানা</script>
+ <script type="Khar" draft="unconfirmed">খার</script>
+ <script type="Khmr" draft="unconfirmed">খামের</script>
+ <script type="Knda" draft="unconfirmed">কানà§à¦¨à¦¾à¦¡à¦¾</script>
+ <script type="Laoo" draft="unconfirmed">লাও</script>
+ <script type="Latf" draft="unconfirmed">লাতিন-ফ</script>
+ <script type="Latg" draft="unconfirmed">লাতিন-জ</script>
+ <script type="Latn" draft="unconfirmed">লà§à¦¯à¦¾à¦¤à¦¿à¦¨</script>
+ <script type="Lepc" draft="unconfirmed">লেপà§à¦šà¦¾</script>
+ <script type="Limb" draft="unconfirmed">লিমà§à¦¬à§</script>
+ <script type="Lina" draft="unconfirmed">লিন-à¦</script>
+ <script type="Linb" draft="unconfirmed">লিন-বি</script>
+ <script type="Mand" draft="unconfirmed">মানà§à¦¡</script>
+ <script type="Maya" draft="unconfirmed">মায়া</script>
+ <script type="Mero" draft="unconfirmed">মেরো</script>
+ <script type="Mlym" draft="unconfirmed">মালিয়ালাম</script>
+ <script type="Mong" draft="unconfirmed">মোঙà§à¦—</script>
+ <script type="Mymr" draft="unconfirmed">মায়ানমার</script>
+ <script type="Nkoo" draft="unconfirmed">ন-কো</script>
+ <script type="Ogam" draft="unconfirmed">ওগহাম</script>
+ <script type="Orkh" draft="unconfirmed">অরà§à¦–ন</script>
+ <script type="Orya" draft="unconfirmed">উড়িয়া</script>
+ <script type="Osma" draft="unconfirmed">ওসমানিয়</script>
+ <script type="Perm" draft="unconfirmed">পেরà§à¦®</script>
+ <script type="Phag" draft="unconfirmed">ফাগ</script>
+ <script type="Phnx" draft="unconfirmed">ফোয়েনিশি</script>
+ <script type="Plrd" draft="unconfirmed">পোলারà§à¦¡</script>
+ <script type="Qaai" draft="unconfirmed">কাই</script>
+ <script type="Roro" draft="unconfirmed">রোহো</script>
+ <script type="Runr" draft="unconfirmed">রà§à¦¨à¦¿à¦•</script>
+ <script type="Sara" draft="unconfirmed">সারা</script>
+ <script type="Shaw" draft="unconfirmed">সাভিয়ান</script>
+ <script type="Sinh" draft="unconfirmed">সিনহালা</script>
+ <script type="Sylo" draft="unconfirmed">সিলেটি</script>
+ </scripts>
+ <territories>
+ <territory type="CY" draft="unconfirmed">সাইপà§à¦°à¦¾à¦¸</territory>
+ </territories>
+ </localeDisplayNames>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">d-M-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern draft="unconfirmed">#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern draft="unconfirmed">#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/bn_IN.xml b/libs/Zend/Locale/Data/bn_IN.xml
new file mode 100755
index 0000000000..6b82aa2244
--- /dev/null
+++ b/libs/Zend/Locale/Data/bn_IN.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.45 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="bn"/>
+ <territory type="IN"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d-M-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/bs.xml b/libs/Zend/Locale/Data/bs.xml
new file mode 100755
index 0000000000..231c2cb92b
--- /dev/null
+++ b/libs/Zend/Locale/Data/bs.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.22 $"/>
+ <generation date="$Date: 2006/07/11 19:26:43 $"/>
+ <language type="bs"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="de">njemaÄki</language>
+ <language type="en">engleski</language>
+ <language type="es">Å¡panjolski</language>
+ <language type="fr">francuski</language>
+ <language type="it">talijanski</language>
+ <language type="ja">japanski</language>
+ <language type="pt">portugalski</language>
+ <language type="ru">ruski</language>
+ <language type="zh">kineski</language>
+ </languages>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-c ć Ä d Ä‘ {dž} e-l {lj} m n {nj} o p r s Å¡ t-v z ž]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[q w-y]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Jan</month>
+ <month type="2" draft="unconfirmed">Feb</month>
+ <month type="3" draft="unconfirmed">Mar</month>
+ <month type="4" draft="unconfirmed">Apr</month>
+ <month type="5" draft="unconfirmed">Maj</month>
+ <month type="6" draft="unconfirmed">Jun</month>
+ <month type="7" draft="unconfirmed">Jul</month>
+ <month type="8" draft="unconfirmed">Avg</month>
+ <month type="9" draft="unconfirmed">Sep</month>
+ <month type="10" draft="unconfirmed">Okt</month>
+ <month type="11" draft="unconfirmed">Nov</month>
+ <month type="12" draft="unconfirmed">Dec</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Januar</month>
+ <month type="2" draft="unconfirmed">Februar</month>
+ <month type="3" draft="unconfirmed">Mart</month>
+ <month type="4" draft="unconfirmed">April</month>
+ <month type="5" draft="unconfirmed">Maj</month>
+ <month type="6" draft="unconfirmed">Juni</month>
+ <month type="7" draft="unconfirmed">Juli</month>
+ <month type="8" draft="unconfirmed">Avgust</month>
+ <month type="9" draft="unconfirmed">Septembar</month>
+ <month type="10" draft="unconfirmed">Oktobar</month>
+ <month type="11" draft="unconfirmed">Novembar</month>
+ <month type="12" draft="unconfirmed">Decembar</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Ned</day>
+ <day type="mon" draft="unconfirmed">Pon</day>
+ <day type="tue" draft="unconfirmed">Uto</day>
+ <day type="wed" draft="unconfirmed">Sri</day>
+ <day type="thu" draft="unconfirmed">ÄŒet</day>
+ <day type="fri" draft="unconfirmed">Pet</day>
+ <day type="sat" draft="unconfirmed">Sub</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Nedjelja</day>
+ <day type="mon" draft="unconfirmed">Ponedjeljak</day>
+ <day type="tue" draft="unconfirmed">Utorak</day>
+ <day type="wed" draft="unconfirmed">Srijeda</day>
+ <day type="thu" draft="unconfirmed">ÄŒetvrtak</day>
+ <day type="fri" draft="unconfirmed">Petak</day>
+ <day type="sat" draft="unconfirmed">Subota</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">K1</quarter>
+ <quarter type="2" draft="unconfirmed">K2</quarter>
+ <quarter type="3" draft="unconfirmed">K3</quarter>
+ <quarter type="4" draft="unconfirmed">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">Prvi kvartal</quarter>
+ <quarter type="2" draft="unconfirmed">Drugi kvartal</quarter>
+ <quarter type="3" draft="unconfirmed">Treći kvartal</quarter>
+ <quarter type="4" draft="unconfirmed">ÄŒetvrti kvartal</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal draft="unconfirmed">,</decimal>
+ <group draft="unconfirmed">.</group>
+ </symbols>
+ <currencies>
+ <currency type="BAM">
+ <displayName draft="unconfirmed">Konvertibilna marka</displayName>
+ <symbol draft="unconfirmed">KM</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/bs_BA.xml b/libs/Zend/Locale/Data/bs_BA.xml
new file mode 100755
index 0000000000..3d4e36efb0
--- /dev/null
+++ b/libs/Zend/Locale/Data/bs_BA.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.15 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="bs"/>
+ <territory type="BA"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/byn.xml b/libs/Zend/Locale/Data/byn.xml
new file mode 100755
index 0000000000..c4f9a474fd
--- /dev/null
+++ b/libs/Zend/Locale/Data/byn.xml
@@ -0,0 +1,425 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.40 $"/>
+ <generation date="$Date: 2006/06/28 02:11:28 $"/>
+ <language type="byn"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa" draft="unconfirmed">አá‹áˆ­áŠ›</language>
+ <language type="ab" draft="unconfirmed">አብáˆá‹šáŠ›</language>
+ <language type="af" draft="unconfirmed">አáሪቃንስኛ</language>
+ <language type="am" draft="unconfirmed">አማርኛ</language>
+ <language type="ar" draft="unconfirmed">á‹áˆ­á‰¢áŠ›</language>
+ <language type="as" draft="unconfirmed">አሳሜዛዊ</language>
+ <language type="ay" draft="unconfirmed">አያማርኛ</language>
+ <language type="az" draft="unconfirmed">አዜርባይጃንኛ</language>
+ <language type="ba" draft="unconfirmed">ባስኪርኛ</language>
+ <language type="be" draft="unconfirmed">ቤላራሻኛ</language>
+ <language type="bg" draft="unconfirmed">ቡáˆáŒ‹áˆªáŠ›</language>
+ <language type="bh" draft="unconfirmed">ቢሃሪ</language>
+ <language type="bi" draft="unconfirmed">ቢስላáˆáŠ›</language>
+ <language type="bn" draft="unconfirmed">በንጋሊኛ</language>
+ <language type="bo" draft="unconfirmed">ትበትንኛ</language>
+ <language type="br" draft="unconfirmed">ብሬቶንኛ</language>
+ <language type="byn" draft="unconfirmed">ብሊን</language>
+ <language type="ca" draft="unconfirmed">ካታላንኛ</language>
+ <language type="co" draft="unconfirmed">ኮርሲካኛ</language>
+ <language type="cs" draft="unconfirmed">ቼክኛ</language>
+ <language type="cy" draft="unconfirmed">ወáˆáˆ½</language>
+ <language type="da" draft="unconfirmed">ዴኒሽ</language>
+ <language type="de" draft="unconfirmed">ጀርመን</language>
+ <language type="dz" draft="unconfirmed">ድዞንáŒáŠ»áŠ›</language>
+ <language type="el" draft="unconfirmed">áŒáˆªáŠ­áŠ›</language>
+ <language type="en" draft="unconfirmed">እንáŒáˆŠá‹áŠ›</language>
+ <language type="eo" draft="unconfirmed">ኤስáራንቶ</language>
+ <language type="es" draft="unconfirmed">ስá“ኒሽ</language>
+ <language type="et" draft="unconfirmed">ኤስቶኒአን</language>
+ <language type="eu" draft="unconfirmed">ባስክኛ</language>
+ <language type="fa" draft="unconfirmed">áርሲያኛ</language>
+ <language type="fi" draft="unconfirmed">áŠáŠ’ሽ</language>
+ <language type="fj" draft="unconfirmed">áŠáŒ‚ኛ</language>
+ <language type="fo" draft="unconfirmed">á‹áˆ®áŠ›</language>
+ <language type="fr" draft="unconfirmed">áˆáˆ¨áŠ•áˆ³á‹­áŠ›</language>
+ <language type="fy" draft="unconfirmed">áሪስኛ</language>
+ <language type="ga" draft="unconfirmed">አይሪሽ</language>
+ <language type="gd" draft="unconfirmed">እስኮትስ ጌáˆáŠ­áŠ›</language>
+ <language type="gez" draft="unconfirmed">áŒá‹•á‹áŠ›</language>
+ <language type="gl" draft="unconfirmed">ጋለጋኛ</language>
+ <language type="gn" draft="unconfirmed">ጓራኒኛ</language>
+ <language type="gu" draft="unconfirmed">ጉጃርቲኛ</language>
+ <language type="ha" draft="unconfirmed">ሃá‹áˆ³áŠ›</language>
+ <language type="he" draft="unconfirmed">ዕብራስጥ</language>
+ <language type="hi" draft="unconfirmed">áˆáŠ•á‹µáŠ›</language>
+ <language type="hr" draft="unconfirmed">ክሮሽያንኛ</language>
+ <language type="hu" draft="unconfirmed">ሀንጋሪኛ</language>
+ <language type="hy" draft="unconfirmed">አርመናዊ</language>
+ <language type="ia" draft="unconfirmed">ኢንቴርሊንጓ</language>
+ <language type="id" draft="unconfirmed">እንዶኒሲኛ</language>
+ <language type="ie" draft="unconfirmed">እንተርሊንáŒá‹ˆ</language>
+ <language type="ik" draft="unconfirmed">እኑá’ያቅኛ</language>
+ <language type="is" draft="unconfirmed">አይስላንድኛ</language>
+ <language type="it" draft="unconfirmed">ጣሊያንኛ</language>
+ <language type="iu" draft="unconfirmed">እኑክቲቱትኛ</language>
+ <language type="ja" draft="unconfirmed">ጃá“ንኛ</language>
+ <language type="jv" draft="unconfirmed">ጃቫንኛ</language>
+ <language type="ka" draft="unconfirmed">ጊዮርጊያን</language>
+ <language type="kk" draft="unconfirmed">ካዛክኛ</language>
+ <language type="kl" draft="unconfirmed">ካላሊሱትኛ</language>
+ <language type="km" draft="unconfirmed">ክመርኛ</language>
+ <language type="kn" draft="unconfirmed">ካናዳኛ</language>
+ <language type="ko" draft="unconfirmed">ኮሪያኛ</language>
+ <language type="ks" draft="unconfirmed">ካሽሚርኛ</language>
+ <language type="ku" draft="unconfirmed">ኩርድሽኛ</language>
+ <language type="ky" draft="unconfirmed">ኪርጊá‹áŠ›</language>
+ <language type="la" draft="unconfirmed">ላቲንኛ</language>
+ <language type="ln" draft="unconfirmed">ሊንጋላኛ</language>
+ <language type="lo" draft="unconfirmed">ላá‹áˆµáŠ›</language>
+ <language type="lt" draft="unconfirmed">ሊቱአኒያን</language>
+ <language type="lv" draft="unconfirmed">ላትቪያን</language>
+ <language type="mg" draft="unconfirmed">ማላጋስኛ</language>
+ <language type="mi" draft="unconfirmed">ማዮሪኛ</language>
+ <language type="mk" draft="unconfirmed">ማከዶኒኛ</language>
+ <language type="ml" draft="unconfirmed">ማላያላáˆáŠ›</language>
+ <language type="mn" draft="unconfirmed">ሞንጎላዊኛ</language>
+ <language type="mo" draft="unconfirmed">ሞáˆá‹³á‰«á‹ŠáŠ“</language>
+ <language type="mr" draft="unconfirmed">ማራዚኛ</language>
+ <language type="ms" draft="unconfirmed">ማላይኛ</language>
+ <language type="mt" draft="unconfirmed">ማáˆá‰²áˆµáŠ›</language>
+ <language type="my" draft="unconfirmed">ቡርማኛ</language>
+ <language type="na" draft="unconfirmed">ናኡሩ</language>
+ <language type="ne" draft="unconfirmed">ኔá“ሊኛ</language>
+ <language type="nl" draft="unconfirmed">ደች</language>
+ <language type="no" draft="unconfirmed">ኖርዌጂያን</language>
+ <language type="oc" draft="unconfirmed">ኦኪታንኛ</language>
+ <language type="om" draft="unconfirmed">ኦሮáˆáŠ›</language>
+ <language type="or" draft="unconfirmed">ኦሪያኛ</language>
+ <language type="pa" draft="unconfirmed">á“ንጃቢኛ</language>
+ <language type="pl" draft="unconfirmed">á–ሊሽ</language>
+ <language type="ps" draft="unconfirmed">á‘ሽቶኛ</language>
+ <language type="pt" draft="unconfirmed">á–ርቱጋሊኛ</language>
+ <language type="qu" draft="unconfirmed">ኵቿኛ</language>
+ <language type="rm" draft="unconfirmed">ሮማንስ</language>
+ <language type="rn" draft="unconfirmed">ሩንዲኛ</language>
+ <language type="ro" draft="unconfirmed">ሮማኒያን</language>
+ <language type="ru" draft="unconfirmed">ራሽኛ</language>
+ <language type="rw" draft="unconfirmed">ኪንያርዋንድኛ</language>
+ <language type="sa" draft="unconfirmed">ሳንስክሪትኛ</language>
+ <language type="sd" draft="unconfirmed">ሲንድሂኛ</language>
+ <language type="sg" draft="unconfirmed">ሳንጎኛ</language>
+ <language type="si" draft="unconfirmed">ስንሃáˆáŠ›</language>
+ <language type="sid" draft="unconfirmed">ሲዳáˆáŠ›</language>
+ <language type="sk" draft="unconfirmed">ስሎቫክኛ</language>
+ <language type="sl" draft="unconfirmed">ስሎቪኛ</language>
+ <language type="sm" draft="unconfirmed">ሳሞአኛ</language>
+ <language type="sn" draft="unconfirmed">ሾናኛ</language>
+ <language type="so" draft="unconfirmed">ሱማáˆáŠ›</language>
+ <language type="sq" draft="unconfirmed">áˆá‰¤áŠ’ኛ</language>
+ <language type="sr" draft="unconfirmed">ሰርቢኛ</language>
+ <language type="ss" draft="unconfirmed">ስዋቲኛ</language>
+ <language type="st" draft="unconfirmed">ሶዞኛ</language>
+ <language type="su" draft="unconfirmed">ሱዳንኛ</language>
+ <language type="sv" draft="unconfirmed">ስዊድንኛ</language>
+ <language type="sw" draft="unconfirmed">ስዋሂሊኛ</language>
+ <language type="ta" draft="unconfirmed">ታሚáˆáŠ›</language>
+ <language type="te" draft="unconfirmed">ተሉጉኛ</language>
+ <language type="tg" draft="unconfirmed">ታጂኪኛ</language>
+ <language type="th" draft="unconfirmed">ታይኛ</language>
+ <language type="ti" draft="unconfirmed">ትáŒáˆ­áŠ›</language>
+ <language type="tig" draft="unconfirmed">ትáŒáˆ¨</language>
+ <language type="tk" draft="unconfirmed">ቱርክመንኛ</language>
+ <language type="tl" draft="unconfirmed">ታጋሎገኛ</language>
+ <language type="tn" draft="unconfirmed">ጽዋናዊኛ</language>
+ <language type="to" draft="unconfirmed">ቶንጋ</language>
+ <language type="tr" draft="unconfirmed">ቱርክኛ</language>
+ <language type="ts" draft="unconfirmed">ጾንጋኛ</language>
+ <language type="tt" draft="unconfirmed">ታታርኛ</language>
+ <language type="tw" draft="unconfirmed">ትዊኛ</language>
+ <language type="ug" draft="unconfirmed">ኡዊáŒáˆáˆ­áŠ›</language>
+ <language type="uk" draft="unconfirmed">ዩክረኒኛ</language>
+ <language type="ur" draft="unconfirmed">ኡርዱኛ</language>
+ <language type="uz" draft="unconfirmed">ኡá‹á‰ áŠ­áŠ›</language>
+ <language type="vi" draft="unconfirmed">ቪትናáˆáŠ›</language>
+ <language type="vo" draft="unconfirmed">ቮላá‘ክኛ</language>
+ <language type="wo" draft="unconfirmed">ዎሎáኛ</language>
+ <language type="xh" draft="unconfirmed">ዞሳኛ</language>
+ <language type="yi" draft="unconfirmed">ይዲሻዊኛ</language>
+ <language type="yo" draft="unconfirmed">ዮሩባዊኛ</language>
+ <language type="za" draft="unconfirmed">ዡዋንáŒáŠ›</language>
+ <language type="zh" draft="unconfirmed">ቻይንኛ</language>
+ <language type="zu" draft="unconfirmed">ዙሉኛ</language>
+ </languages>
+ <scripts>
+ <script type="Latn" draft="unconfirmed">ላቲን</script>
+ </scripts>
+ <territories>
+ <territory type="AD" draft="unconfirmed">አንዶራ</territory>
+ <territory type="AE" draft="unconfirmed">የተባበሩት አረብ ኤáˆáˆ¬á‰µáˆµ</territory>
+ <territory type="AL" draft="unconfirmed">አáˆá‰£áŠ’á‹«</territory>
+ <territory type="AM" draft="unconfirmed">አርሜኒያ</territory>
+ <territory type="AN" draft="unconfirmed">ኔዘርላንድስ አንቲáˆáˆµ</territory>
+ <territory type="AR" draft="unconfirmed">አርጀንቲና</territory>
+ <territory type="AT" draft="unconfirmed">ኦስትሪያ</territory>
+ <territory type="AU" draft="unconfirmed">አá‹áˆµá‰µáˆ¬áˆŠá‹«</territory>
+ <territory type="AZ" draft="unconfirmed">አዘርባጃን</territory>
+ <territory type="BA" draft="unconfirmed">ቦስኒያ እና ሄርዞጎቪኒያ</territory>
+ <territory type="BB" draft="unconfirmed">ባርቤዶስ</territory>
+ <territory type="BE" draft="unconfirmed">ቤáˆáŒ„áˆ</territory>
+ <territory type="BG" draft="unconfirmed">ቡáˆáŒŒáˆªá‹«</territory>
+ <territory type="BH" draft="unconfirmed">ባህሬን</territory>
+ <territory type="BM" draft="unconfirmed">ቤርሙዳ</territory>
+ <territory type="BO" draft="unconfirmed">ቦሊቪያ</territory>
+ <territory type="BR" draft="unconfirmed">ብራዚáˆ</territory>
+ <territory type="BT" draft="unconfirmed">ቡህታን</territory>
+ <territory type="BY" draft="unconfirmed">ቤላሩስ</territory>
+ <territory type="BZ" draft="unconfirmed">ቤሊዘ</territory>
+ <territory type="CD" draft="unconfirmed">ኮንጎ</territory>
+ <territory type="CF" draft="unconfirmed">የመካከለኛዠአáሪካ ሪáብሊክ</territory>
+ <territory type="CH" draft="unconfirmed">ስዊዘርላንድ</territory>
+ <territory type="CL" draft="unconfirmed">ቺሊ</territory>
+ <territory type="CM" draft="unconfirmed">ካሜሩን</territory>
+ <territory type="CN" draft="unconfirmed">ቻይና</territory>
+ <territory type="CO" draft="unconfirmed">ኮሎáˆá‰¢á‹«</territory>
+ <territory type="CS" draft="unconfirmed">ሰርቢያ</territory>
+ <territory type="CV" draft="unconfirmed">ኬᕠቬርዴ</territory>
+ <territory type="CY" draft="unconfirmed">ሳይá•áˆ¨áˆµ</territory>
+ <territory type="CZ" draft="unconfirmed">ቼክ ሪá‘ብሊክ</territory>
+ <territory type="DE" draft="unconfirmed">ጀርመን</territory>
+ <territory type="DK" draft="unconfirmed">ዴንማርክ</territory>
+ <territory type="DM" draft="unconfirmed">ዶሚኒካ</territory>
+ <territory type="DO" draft="unconfirmed">ዶሚኒክ ሪá‘ብሊክ</territory>
+ <territory type="DZ" draft="unconfirmed">አáˆáŒ„ሪያ</territory>
+ <territory type="EC" draft="unconfirmed">ኢኳዶር</territory>
+ <territory type="EE" draft="unconfirmed">ኤስቶኒያ</territory>
+ <territory type="EG" draft="unconfirmed">áŒá‰¥áŒ½</territory>
+ <territory type="EH" draft="unconfirmed">áˆá‹•áˆ«á‰£á‹Š ሳህራ</territory>
+ <territory type="ER" draft="unconfirmed">ኤርትራ</territory>
+ <territory type="ES" draft="unconfirmed">ስá”ን</territory>
+ <territory type="ET" draft="unconfirmed">ኢትዮጵያ</territory>
+ <territory type="FI" draft="unconfirmed">áŠáŠ•áˆ‹áŠ•á‹µ</territory>
+ <territory type="FJ" draft="unconfirmed">áŠáŒ‚</territory>
+ <territory type="FM" draft="unconfirmed">ሚክሮኔዢያ</territory>
+ <territory type="FR" draft="unconfirmed">áˆáˆ¨áŠ•áˆ³á‹­</territory>
+ <territory type="GB" draft="unconfirmed">እንáŒáˆŠá‹</territory>
+ <territory type="GE" draft="unconfirmed">ጆርጂያ</territory>
+ <territory type="GF" draft="unconfirmed">የáˆáˆ¨áŠ•áˆ³á‹­ ጉዊአና</territory>
+ <territory type="GM" draft="unconfirmed">ጋáˆá‰¢á‹«</territory>
+ <territory type="GN" draft="unconfirmed">ጊኒ</territory>
+ <territory type="GQ" draft="unconfirmed">ኢኳቶሪያሠጊኒ</territory>
+ <territory type="GR" draft="unconfirmed">áŒáˆªáŠ­</territory>
+ <territory type="GW" draft="unconfirmed">ቢሳዎ</territory>
+ <territory type="GY" draft="unconfirmed">ጉያና</territory>
+ <territory type="HK" draft="unconfirmed">ሆንጠኮንáŒ</territory>
+ <territory type="HR" draft="unconfirmed">ክሮኤሽያ</territory>
+ <territory type="HT" draft="unconfirmed">ሀይቲ</territory>
+ <territory type="HU" draft="unconfirmed">ሀንጋሪ</territory>
+ <territory type="ID" draft="unconfirmed">ኢንዶኔዢያ</territory>
+ <territory type="IE" draft="unconfirmed">አየርላንድ</territory>
+ <territory type="IL" draft="unconfirmed">እስራኤáˆ</territory>
+ <territory type="IN" draft="unconfirmed">ህንድ</territory>
+ <territory type="IQ" draft="unconfirmed">ኢራቅ</territory>
+ <territory type="IS" draft="unconfirmed">አይስላንድ</territory>
+ <territory type="IT" draft="unconfirmed">ጣሊያን</territory>
+ <territory type="JM" draft="unconfirmed">ጃማይካ</territory>
+ <territory type="JO" draft="unconfirmed">ጆርዳን</territory>
+ <territory type="JP" draft="unconfirmed">ጃá“ን</territory>
+ <territory type="KH" draft="unconfirmed">ካáˆá‰¦á‹²á‹«</territory>
+ <territory type="KM" draft="unconfirmed">ኮሞሮስ</territory>
+ <territory type="KP" draft="unconfirmed">ደቡብ ኮሪያ</territory>
+ <territory type="KR" draft="unconfirmed">ሰሜን ኮሪያ</territory>
+ <territory type="KW" draft="unconfirmed">ክዌት</territory>
+ <territory type="LB" draft="unconfirmed">ሊባኖስ</territory>
+ <territory type="LT" draft="unconfirmed">ሊቱዌኒያ</territory>
+ <territory type="LV" draft="unconfirmed">ላትቪያ</territory>
+ <territory type="LY" draft="unconfirmed">ሊቢያ</territory>
+ <territory type="MA" draft="unconfirmed">ሞሮኮ</territory>
+ <territory type="MD" draft="unconfirmed">ሞáˆá‹¶á‰«</territory>
+ <territory type="MK" draft="unconfirmed">ማከዶኒያ</territory>
+ <territory type="MN" draft="unconfirmed">ሞንጎሊያ</territory>
+ <territory type="MO" draft="unconfirmed">ማካዎ</territory>
+ <territory type="MR" draft="unconfirmed">ሞሪቴኒያ</territory>
+ <territory type="MT" draft="unconfirmed">ማáˆá‰³</territory>
+ <territory type="MU" draft="unconfirmed">ማሩሸስ</territory>
+ <territory type="MX" draft="unconfirmed">ሜክሲኮ</territory>
+ <territory type="MY" draft="unconfirmed">ማሌዢያ</territory>
+ <territory type="NA" draft="unconfirmed">ናሚቢያ</territory>
+ <territory type="NC" draft="unconfirmed">ኒዠካሌዶኒያ</territory>
+ <territory type="NG" draft="unconfirmed">ናይጄሪያ</territory>
+ <territory type="NL" draft="unconfirmed">ኔዘርላንድ</territory>
+ <territory type="NO" draft="unconfirmed">ኖርዌ</territory>
+ <territory type="NP" draft="unconfirmed">ኔá“áˆ</territory>
+ <territory type="NZ" draft="unconfirmed">ኒዠዚላንድ</territory>
+ <territory type="PE" draft="unconfirmed">á”ሩ</territory>
+ <territory type="PF" draft="unconfirmed">የáˆáˆ¨áŠ•áˆ³á‹­ á–ሊኔዢያ</territory>
+ <territory type="PG" draft="unconfirmed">á“á‘á‹‹ ኒዠጊኒ</territory>
+ <territory type="PL" draft="unconfirmed">á–ላንድ</territory>
+ <territory type="PR" draft="unconfirmed">á–ርታ ሪኮ</territory>
+ <territory type="RO" draft="unconfirmed">ሮሜኒያ</territory>
+ <territory type="RU" draft="unconfirmed">ራሺያ</territory>
+ <territory type="SA" draft="unconfirmed">ሳá‹á‹µáŠ áˆ¨á‰¢á‹«</territory>
+ <territory type="SD" draft="unconfirmed">ሱዳን</territory>
+ <territory type="SE" draft="unconfirmed">ስዊድን</territory>
+ <territory type="SG" draft="unconfirmed">ሲንጋá–ር</territory>
+ <territory type="SI" draft="unconfirmed">ስሎቬኒያ</territory>
+ <territory type="SK" draft="unconfirmed">ስሎቫኪያ</territory>
+ <territory type="SN" draft="unconfirmed">ሴኔጋáˆ</territory>
+ <territory type="SO" draft="unconfirmed">ሱማሌ</territory>
+ <territory type="SY" draft="unconfirmed">ሲሪያ</territory>
+ <territory type="TD" draft="unconfirmed">ቻድ</territory>
+ <territory type="TF" draft="unconfirmed">የáˆáˆ¨áŠ•áˆ³á‹­ ደቡባዊ áŒá‹›á‰¶á‰½</territory>
+ <territory type="TH" draft="unconfirmed">ታይላንድ</territory>
+ <territory type="TJ" draft="unconfirmed">ታጃኪስታን</territory>
+ <territory type="TL" draft="unconfirmed">áˆáˆµáˆ«á‰… ቲሞር</territory>
+ <territory type="TN" draft="unconfirmed">ቱኒዚያ</territory>
+ <territory type="TR" draft="unconfirmed">ቱርክ</territory>
+ <territory type="TT" draft="unconfirmed">ትሪኒዳድ እና ቶባጎ</territory>
+ <territory type="TZ" draft="unconfirmed">ታንዛኒያ</territory>
+ <territory type="UG" draft="unconfirmed">ዩጋንዳ</territory>
+ <territory type="US" draft="unconfirmed">አሜሪካ</territory>
+ <territory type="UZ" draft="unconfirmed">á‹©á‹á‰ áŠªáˆµá‰³áŠ•</territory>
+ <territory type="VE" draft="unconfirmed">ቬንዙዌላ</territory>
+ <territory type="VG" draft="unconfirmed">የእንáŒáˆŠá‹ ድንáŒáˆ ደሴቶች</territory>
+ <territory type="VI" draft="unconfirmed">የአሜሪካ ቨርጂን ደሴቶች</territory>
+ <territory type="YE" draft="unconfirmed">የመን</territory>
+ <territory type="ZA" draft="unconfirmed">ደቡብ አáሪካ</territory>
+ <territory type="ZM" draft="unconfirmed">á‹›áˆá‰¢á‹«</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[០ᡠá£-á§ á¢ á  á¨ á²-á¼ á©-ᱠሀ-ሆ ለ-ሟ ረ-ቆ ቈ ቊ-በá‰-ቖ ቘ ቚ-በበ-ኆ ኈ ኊ-አáŠ-ኮ ኰ ኲ-ኵ ኸ-ኾ á‹€ á‹‚-á‹… ወ-á‹Ž á‹-á‹– ዘ-á‹® á‹°-á‹· ጀ-ጎ ጠጒ-ጕ ጘ-ጟ ⶓ-ⶖ ጠ-ጯ ጸ-ጿ áˆ-á—]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" draft="unconfirmed">[áŽ-᎙ ሇ ⶀ ᎀ-ᎃ ⶠሠ-ሧ ⶂ-ⶄ ቇ ᎄ-ᎇ ⶅ-ⶇ ኇ ⶈ-ⶊ ኯ ዠⶋ ዯ ⶌ ዸ-á‹¿ ⶠⶎ ጠâ¶-ⶑ ᇠᎈ-Ꭰⶒ á˜-ᚠⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ â·€-â·† â·ˆ-â·Ž â·-â·– â·˜-â·ž]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">áˆá‹°á‰µ</month>
+ <month type="2" draft="unconfirmed">ካብኽ</month>
+ <month type="3" draft="unconfirmed">ክብላ</month>
+ <month type="4" draft="unconfirmed">á‹áŒ…ኺ</month>
+ <month type="5" draft="unconfirmed">ክቢቅ</month>
+ <month type="6" draft="unconfirmed">áˆ/ት</month>
+ <month type="7" draft="unconfirmed">ኰር</month>
+ <month type="8" draft="unconfirmed">ማርያ</month>
+ <month type="9" draft="unconfirmed">ያኸኒ</month>
+ <month type="10" draft="unconfirmed">መተሉ</month>
+ <month type="11" draft="unconfirmed">áˆ/áˆ</month>
+ <month type="12" draft="unconfirmed">ተሕሳ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">áˆá‹°á‰µáˆª</month>
+ <month type="2" draft="unconfirmed">ካብኽብቲ</month>
+ <month type="3" draft="unconfirmed">ክብላ</month>
+ <month type="4" draft="unconfirmed">á‹áŒ…ኺሪ</month>
+ <month type="5" draft="unconfirmed">ክቢቅሪ</month>
+ <month type="6" draft="unconfirmed">áˆáŠªáŠ¤áˆ ትጓ̅ኒሪ</month>
+ <month type="7" draft="unconfirmed">ኰርኩ</month>
+ <month type="8" draft="unconfirmed">ማርያሠትሪ</month>
+ <month type="9" draft="unconfirmed">ያኸኒ መሳቅለሪ</month>
+ <month type="10" draft="unconfirmed">መተሉ</month>
+ <month type="11" draft="unconfirmed">áˆáŠªáŠ¤áˆ መሽወሪ</month>
+ <month type="12" draft="unconfirmed">ተሕሳስሪ</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">áˆ</month>
+ <month type="2" draft="unconfirmed">ካ</month>
+ <month type="3" draft="unconfirmed">ክ</month>
+ <month type="4" draft="unconfirmed">á‹</month>
+ <month type="5" draft="unconfirmed">ክ</month>
+ <month type="6" draft="unconfirmed">áˆ</month>
+ <month type="7" draft="unconfirmed">ኰ</month>
+ <month type="8" draft="unconfirmed">ማ</month>
+ <month type="9" draft="unconfirmed">á‹«</month>
+ <month type="10" draft="unconfirmed">መ</month>
+ <month type="11" draft="unconfirmed">áˆ</month>
+ <month type="12" draft="unconfirmed">ተ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">ሰ/ቅ</day>
+ <day type="mon" draft="unconfirmed">ሰኑ</day>
+ <day type="tue" draft="unconfirmed">ሰሊáŒ</day>
+ <day type="wed" draft="unconfirmed">ለጓ</day>
+ <day type="thu" draft="unconfirmed">ኣáˆá‹µ</day>
+ <day type="fri" draft="unconfirmed">ኣርብ</day>
+ <day type="sat" draft="unconfirmed">ሰ/ሽ</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">ሰንበር ቅዳዅ</day>
+ <day type="mon" draft="unconfirmed">ሰኑ</day>
+ <day type="tue" draft="unconfirmed">ሰሊáŒ</day>
+ <day type="wed" draft="unconfirmed">ለጓ ወሪ ለብዋ</day>
+ <day type="thu" draft="unconfirmed">ኣáˆá‹µ</day>
+ <day type="fri" draft="unconfirmed">ኣርብ</day>
+ <day type="sat" draft="unconfirmed">ሰንበር ሽጓዅ</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">ሰ</day>
+ <day type="mon" draft="unconfirmed">ሰ</day>
+ <day type="tue" draft="unconfirmed">ሰ</day>
+ <day type="wed" draft="unconfirmed">ለ</day>
+ <day type="thu" draft="unconfirmed">ኣ</day>
+ <day type="fri" draft="unconfirmed">ኣ</day>
+ <day type="sat" draft="unconfirmed">ሰ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">á‹á‹±áˆµ ጃብ</am>
+ <pm draft="unconfirmed">á‹á‹±áˆµ á‹°áˆá‰¢</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">ይጅ</era>
+ <era type="1" draft="unconfirmed">ኣድ</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">የብራዚሠሪáˆ</displayName>
+ <symbol draft="unconfirmed">R$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="unconfirmed">የቻይና ዩአን ረንሚንቢ</displayName>
+ <symbol draft="unconfirmed">Y</symbol>
+ </currency>
+ <currency type="ETB">
+ <displayName draft="unconfirmed">የኢትዮጵያ ብር</displayName>
+ <symbol draft="unconfirmed">$</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="unconfirmed">አá‹áˆ®</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">የእንáŒáˆŠá‹ á“á‹áŠ•á‹µ ስተርሊንáŒ</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">የሕንድ ሩá’</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="unconfirmed">የጃá“ን የን</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">የራሻ ሩብáˆ</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">የአሜሪካን ዶላር</displayName>
+ <symbol draft="unconfirmed">US$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/byn_ER.xml b/libs/Zend/Locale/Data/byn_ER.xml
new file mode 100755
index 0000000000..43c2491ec8
--- /dev/null
+++ b/libs/Zend/Locale/Data/byn_ER.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.28 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="byn"/>
+ <territory type="ER"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEEá¡ dd MMMM áŒáˆ­áŒ‹ yyyy G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MMM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ca.xml b/libs/Zend/Locale/Data/ca.xml
new file mode 100755
index 0000000000..8190877861
--- /dev/null
+++ b/libs/Zend/Locale/Data/ca.xml
@@ -0,0 +1,539 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.67 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ca"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">àfar</language>
+ <language type="ab">abkhaz</language>
+ <language type="af">afrikaans</language>
+ <language type="am">amhàric</language>
+ <language type="ar">àrab</language>
+ <language type="as">assamès</language>
+ <language type="ay">aimara</language>
+ <language type="az">àzeri</language>
+ <language type="ba">baixkir</language>
+ <language type="be">bielorús</language>
+ <language type="bg">búlgar</language>
+ <language type="bh">bihari</language>
+ <language type="bi">bislama</language>
+ <language type="bn">bengalí</language>
+ <language type="bo">tibetà</language>
+ <language type="br">bretó</language>
+ <language type="ca">català</language>
+ <language type="co">cors</language>
+ <language type="cs">txec</language>
+ <language type="cy">gal·lès</language>
+ <language type="da">danès</language>
+ <language type="de">alemany</language>
+ <language type="dz">bhutanès</language>
+ <language type="el">grec</language>
+ <language type="en">anglès</language>
+ <language type="eo">esperanto</language>
+ <language type="es">espanyol</language>
+ <language type="et">estonià</language>
+ <language type="eu">basc</language>
+ <language type="fa">persa</language>
+ <language type="fi">finès</language>
+ <language type="fj">fijià</language>
+ <language type="fo">feroès</language>
+ <language type="fr">francès</language>
+ <language type="fy">frisó</language>
+ <language type="ga">irlandès</language>
+ <language type="gd">escocès</language>
+ <language type="gl">gallec</language>
+ <language type="gn">guaraní</language>
+ <language type="gu">gujarati</language>
+ <language type="ha">hausa</language>
+ <language type="he">hebreu</language>
+ <language type="hi">hindi</language>
+ <language type="hr">croat</language>
+ <language type="hu">hongarès</language>
+ <language type="hy">armeni</language>
+ <language type="ia">interlingua</language>
+ <language type="id">indonesi</language>
+ <language type="ie">interlingue</language>
+ <language type="ik">inupiak</language>
+ <language type="is">islandès</language>
+ <language type="it">italià</language>
+ <language type="iu">inuktitut</language>
+ <language type="ja">japonès</language>
+ <language type="jv">javanès</language>
+ <language type="ka">georgià</language>
+ <language type="kk">kazakh</language>
+ <language type="kl">greenlandès</language>
+ <language type="km">cambodjà</language>
+ <language type="kn">kannada</language>
+ <language type="ko">coreà</language>
+ <language type="ks">caixmiri</language>
+ <language type="ku">kurd</language>
+ <language type="ky">kirguís</language>
+ <language type="la">llatí</language>
+ <language type="ln">lingala</language>
+ <language type="lo">laosià</language>
+ <language type="lt">lituà</language>
+ <language type="lv">letó</language>
+ <language type="mg">malgaix</language>
+ <language type="mi">maori</language>
+ <language type="mk">macedoni</language>
+ <language type="ml">malaialam</language>
+ <language type="mn">mongol</language>
+ <language type="mo">moldau</language>
+ <language type="mr">marathi</language>
+ <language type="ms">malai</language>
+ <language type="mt">maltès</language>
+ <language type="my">birmà</language>
+ <language type="na">nauruà</language>
+ <language type="ne">nepalès</language>
+ <language type="nl">neerlandès</language>
+ <language type="no">noruec</language>
+ <language type="oc">occità</language>
+ <language type="om">oromo (afan)</language>
+ <language type="or">oriya</language>
+ <language type="pa">panjabi</language>
+ <language type="pl">polonès</language>
+ <language type="ps">paixto</language>
+ <language type="pt">portuguès</language>
+ <language type="qu">quètxua</language>
+ <language type="rm">retoromànic</language>
+ <language type="rn">kirundi</language>
+ <language type="ro">romanès</language>
+ <language type="ru">rus</language>
+ <language type="rw">kinyarwanda</language>
+ <language type="sa">sànscrit</language>
+ <language type="sd">sindhi</language>
+ <language type="sg">sango</language>
+ <language type="sh">serbo-croat</language>
+ <language type="si">sinhalès</language>
+ <language type="sk">eslovac</language>
+ <language type="sl">eslovè</language>
+ <language type="sm">samoà</language>
+ <language type="sn">shona</language>
+ <language type="so">somali</language>
+ <language type="sq">albanès</language>
+ <language type="sr">serbi</language>
+ <language type="ss">siswati</language>
+ <language type="st">sotho</language>
+ <language type="su">sundanès</language>
+ <language type="sv">suec</language>
+ <language type="sw">swahili</language>
+ <language type="ta">tàmil</language>
+ <language type="te">telugu</language>
+ <language type="tg">tadjik</language>
+ <language type="th">thai</language>
+ <language type="ti">tigrinya</language>
+ <language type="tk">turcman</language>
+ <language type="tl">tagàlog</language>
+ <language type="tn">tswana</language>
+ <language type="to">tonga</language>
+ <language type="tr">turc</language>
+ <language type="ts">tsonga</language>
+ <language type="tt">tàtar</language>
+ <language type="tw">twi</language>
+ <language type="ug">uigur</language>
+ <language type="uk">ucraïnès</language>
+ <language type="ur">urdú</language>
+ <language type="uz">uzbek</language>
+ <language type="vi">vietnamita</language>
+ <language type="vo">volapuk</language>
+ <language type="wo">wòlof</language>
+ <language type="xh">xosa</language>
+ <language type="yi">jiddish</language>
+ <language type="yo">ioruba</language>
+ <language type="za">zhuang</language>
+ <language type="zh">xinés</language>
+ <language type="zu">zulu</language>
+ </languages>
+ <scripts>
+ <script type="Latn">Llatí</script>
+ </scripts>
+ <territories>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Unió dels Emirats Àrabs</territory>
+ <territory type="AF">Afganistan</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albània</territory>
+ <territory type="AM">Armènia</territory>
+ <territory type="AN">Antilles Holandeses</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AT">Àustria</territory>
+ <territory type="AU">Austràlia</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AZ">Azerbaidjan</territory>
+ <territory type="BA">Bòsnia i Hercegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangla Desh</territory>
+ <territory type="BE">Bèlgica</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgària</territory>
+ <territory type="BH">Bahrain</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermudes</territory>
+ <territory type="BN">Brunei</territory>
+ <territory type="BO">Bolívia</territory>
+ <territory type="BR">Brasil</territory>
+ <territory type="BS">Bahames</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Bielorússia</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Canadà</territory>
+ <territory type="CF">República Centrafricana</territory>
+ <territory type="CG">Congo</territory>
+ <territory type="CH">Switzerland</territory>
+ <territory type="CI">Costa d’Ivori</territory>
+ <territory type="CL">Xile</territory>
+ <territory type="CM">Camerun</territory>
+ <territory type="CN">Xina</territory>
+ <territory type="CO">Colòmbia</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS">Sèrbia i Montenegro</territory>
+ <territory type="CU">Cuba</territory>
+ <territory type="CV">Cap Verd</territory>
+ <territory type="CY">Xipre</territory>
+ <territory type="CZ">República Txeca</territory>
+ <territory type="DE">Alemanya</territory>
+ <territory type="DJ">Djibouti</territory>
+ <territory type="DK">Dinamarca</territory>
+ <territory type="DM">Dominica</territory>
+ <territory type="DO">República Dominicana</territory>
+ <territory type="DZ">Algèria</territory>
+ <territory type="EC">Equador</territory>
+ <territory type="EE">Estònia</territory>
+ <territory type="EG">Egipte</territory>
+ <territory type="EH">Sàhara Occidental</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Espanya</territory>
+ <territory type="ET">Etiòpia</territory>
+ <territory type="FI">Finlàndia</territory>
+ <territory type="FJ">Fiji</territory>
+ <territory type="FM">Micronèsia</territory>
+ <territory type="FR">França</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Regne Unit</territory>
+ <territory type="GE">Geòrgia</territory>
+ <territory type="GF">Guaiana Francesa</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GM">Gàmbia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Guinea Equatorial</territory>
+ <territory type="GR">Grècia</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GW">Guinea Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Hong Kong</territory>
+ <territory type="HN">Hondures</territory>
+ <territory type="HR">Croàcia</territory>
+ <territory type="HT">Haití</territory>
+ <territory type="HU">Hongria</territory>
+ <territory type="ID">Indonèsia</territory>
+ <territory type="IE">Irlanda</territory>
+ <territory type="IL">Israel</territory>
+ <territory type="IN">Ãndia</territory>
+ <territory type="IQ">Iraq</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Islàndia</territory>
+ <territory type="IT">Itàlia</territory>
+ <territory type="JM">Jamaica</territory>
+ <territory type="JO">Jordània</territory>
+ <territory type="JP">Japó</territory>
+ <territory type="KE">Kenya</territory>
+ <territory type="KG">Kirgizistan</territory>
+ <territory type="KH">Cambodja</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Comores</territory>
+ <territory type="KP">Corea del Nord</territory>
+ <territory type="KR">Corea del Sud</territory>
+ <territory type="KW">Kuwait</territory>
+ <territory type="KZ">Kazakhstan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Líban</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Libèria</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Lituània</territory>
+ <territory type="LU">Luxemburg</territory>
+ <territory type="LV">Letònia</territory>
+ <territory type="LY">Líbia</territory>
+ <territory type="MA">Marroc</territory>
+ <territory type="MC">Mònaco</territory>
+ <territory type="MD">Moldàvia</territory>
+ <territory type="MG">Madagascar</territory>
+ <territory type="MK">Macedònia</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongòlia</territory>
+ <territory type="MQ">Martinica</territory>
+ <territory type="MR">Mauritània</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Maurici</territory>
+ <territory type="MX">Mèxic</territory>
+ <territory type="MY">Malàisia</territory>
+ <territory type="MZ">Moçambic</territory>
+ <territory type="NA">Namíbia</territory>
+ <territory type="NC">Nova Caledònia</territory>
+ <territory type="NE">Níger</territory>
+ <territory type="NG">Nigèria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Països Baixos</territory>
+ <territory type="NO">Noruega</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Nova Zelanda</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panamà</territory>
+ <territory type="PE">Perú</territory>
+ <territory type="PF">Polinèsia Francesa</territory>
+ <territory type="PG">Papua Nova Guinea</territory>
+ <territory type="PH">Filipines</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Polònia</territory>
+ <territory type="PR">Puerto Rico</territory>
+ <territory type="PT">Portugal</territory>
+ <territory type="PY">Paraguai</territory>
+ <territory type="QA">Qatar</territory>
+ <territory type="RO">Romania</territory>
+ <territory type="RU">Rússia</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Aràbia Saudí</territory>
+ <territory type="SC">Seychelles</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Suècia</territory>
+ <territory type="SG">Singapur</territory>
+ <territory type="SI">Eslovènia</territory>
+ <territory type="SK">Eslovàquia</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somàlia</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Síria</territory>
+ <territory type="SZ">Swazilàndia</territory>
+ <territory type="TD">Txad</territory>
+ <territory type="TF">Territoris Meridionals Francesos</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Tailàndia</territory>
+ <territory type="TJ">Tadjikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Timor</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunísia</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turquia</territory>
+ <territory type="TT">Trinitat i Tobago</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TZ">Tanzània</territory>
+ <territory type="UA">Ucraïna</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="US">Estats Units</territory>
+ <territory type="UY">Uruguai</territory>
+ <territory type="UZ">Uzbekistan</territory>
+ <territory type="VA">Vaticà</territory>
+ <territory type="VE">Veneçuela</territory>
+ <territory type="VG">Illes Verges Britàniques</territory>
+ <territory type="VI">Illes Verges dels USA</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="YE">Iemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Sud-àfrica</territory>
+ <territory type="ZM">Zàmbia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a à b c ç d e é è f-i í ï j-n ñ o ó ò p-u ú ü v-z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" draft="unconfirmed">[Å€]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GuMtkHmsSEDFwWahKzUeygAZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">gen.</month>
+ <month type="2">febr.</month>
+ <month type="3">març</month>
+ <month type="4">abr.</month>
+ <month type="5">maig</month>
+ <month type="6">juny</month>
+ <month type="7">jul.</month>
+ <month type="8">ag.</month>
+ <month type="9">set.</month>
+ <month type="10">oct.</month>
+ <month type="11">nov.</month>
+ <month type="12">des.</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">gener</month>
+ <month type="2">febrer</month>
+ <month type="3">març</month>
+ <month type="4">abril</month>
+ <month type="5">maig</month>
+ <month type="6">juny</month>
+ <month type="7">juliol</month>
+ <month type="8">agost</month>
+ <month type="9">setembre</month>
+ <month type="10">octubre</month>
+ <month type="11">novembre</month>
+ <month type="12">desembre</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">dg.</day>
+ <day type="mon">dl.</day>
+ <day type="tue">dt.</day>
+ <day type="wed">dc.</day>
+ <day type="thu">dj.</day>
+ <day type="fri">dv.</day>
+ <day type="sat">ds.</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">diumenge</day>
+ <day type="mon">dilluns</day>
+ <day type="tue">dimarts</day>
+ <day type="wed">dimecres</day>
+ <day type="thu">dijous</day>
+ <day type="fri">divendres</day>
+ <day type="sat">dissabte</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">1T</quarter>
+ <quarter type="2">2T</quarter>
+ <quarter type="3">3T</quarter>
+ <quarter type="4">4T</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1r trimestre</quarter>
+ <quarter type="2">2n trimestre</quarter>
+ <quarter type="3">3r trimestre</quarter>
+ <quarter type="4">4t trimestre</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraAbbr>
+ <era type="0" references="R1">aC</era>
+ <era type="1" references="R1">dC</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d 'de' MMMM 'de' yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d 'de' MMMM 'de' yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="BRL">
+ <displayName>Real brasiler</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>Iuan renmimbi xinès</displayName>
+ </currency>
+ <currency type="ESP">
+ <pattern>¤ #,##0;-¤ #,##0</pattern>
+ <symbol>₧</symbol>
+ <decimal>,</decimal>
+ <group>.</group>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euro</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Lliura esterlina britànica</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Rupia índia</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>Ien japonès</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>Ruble rus</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>Dòlar EUA</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">sí:si:s</yesstr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="R1" uri="http://www.termcat.net">l'Institut d'Estudis Catalans</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ca_ES.xml b/libs/Zend/Locale/Data/ca_ES.xml
new file mode 100755
index 0000000000..ba2b0705f1
--- /dev/null
+++ b/libs/Zend/Locale/Data/ca_ES.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ca"/>
+ <territory type="ES"/>
+ </identity>
+ <delimiters>
+ <quotationStart>‘</quotationStart>
+ <quotationEnd>’</quotationEnd>
+ <alternateQuotationStart>“</alternateQuotationStart>
+ <alternateQuotationEnd>â€</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/cch.xml b/libs/Zend/Locale/Data/cch.xml
new file mode 100755
index 0000000000..5a3240a669
--- /dev/null
+++ b/libs/Zend/Locale/Data/cch.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.13 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="cch"/>
+ </identity>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[a {a̱} b c {ch} d {dy} e-g {g̱} {gb} {gw} {gy} h {hy} i-k ḵ {kp} {kw} l {ly} m n ṉ {ny} o p {ph} {py} r {ry} s {sh} t-w {wh} y {y̱} z ʼ]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Dyon</month>
+ <month type="2" draft="unconfirmed">Baa</month>
+ <month type="3" draft="unconfirmed">Atat</month>
+ <month type="4" draft="unconfirmed">Anas</month>
+ <month type="5" draft="unconfirmed">Atyo</month>
+ <month type="6" draft="unconfirmed">Achi</month>
+ <month type="7" draft="unconfirmed">Atar</month>
+ <month type="8" draft="unconfirmed">Awur</month>
+ <month type="9" draft="unconfirmed">Shad</month>
+ <month type="10" draft="unconfirmed">Shak</month>
+ <month type="11" draft="unconfirmed">Naba</month>
+ <month type="12" draft="unconfirmed">Nata</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Pen Dyon</month>
+ <month type="2" draft="unconfirmed">Pen Ba'a</month>
+ <month type="3" draft="unconfirmed">Pen Atat</month>
+ <month type="4" draft="unconfirmed">Pen Anas</month>
+ <month type="5" draft="unconfirmed">Pen Atyon</month>
+ <month type="6" draft="unconfirmed">Pen Achirim</month>
+ <month type="7" draft="unconfirmed">Pen Atariba</month>
+ <month type="8" draft="unconfirmed">Pen Awurr</month>
+ <month type="9" draft="unconfirmed">Pen Shadon</month>
+ <month type="10" draft="unconfirmed">Pen Shakur</month>
+ <month type="11" draft="unconfirmed">Pen Kur Naba</month>
+ <month type="12" draft="unconfirmed">Pen Kur Natat</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Yok</day>
+ <day type="mon" draft="unconfirmed">Tung</day>
+ <day type="tue" draft="unconfirmed">T. Tung</day>
+ <day type="wed" draft="unconfirmed">Tsan</day>
+ <day type="thu" draft="unconfirmed">Nas</day>
+ <day type="fri" draft="unconfirmed">Nat</day>
+ <day type="sat" draft="unconfirmed">Chir</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Wai Yoka Bawai</day>
+ <day type="mon" draft="unconfirmed">Wai Tunga</day>
+ <day type="tue" draft="unconfirmed">Toki Gitung</day>
+ <day type="wed" draft="unconfirmed">Tsam Kasuwa</day>
+ <day type="thu" draft="unconfirmed">Wai Na Nas</day>
+ <day type="fri" draft="unconfirmed">Wai Na Tiyon</day>
+ <day type="sat" draft="unconfirmed">Wai Na Chirim</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">Gabanin Miladi</era>
+ <era type="1" draft="unconfirmed">Miladi</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">GM</era>
+ <era type="1" draft="unconfirmed">M</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="NGN">
+ <displayName draft="unconfirmed">Aman</displayName>
+ <symbol draft="unconfirmed">₦</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/cch_NG.xml b/libs/Zend/Locale/Data/cch_NG.xml
new file mode 100755
index 0000000000..01d5ee2d9c
--- /dev/null
+++ b/libs/Zend/Locale/Data/cch_NG.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="cch"/>
+ <territory type="NG"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/cs.xml b/libs/Zend/Locale/Data/cs.xml
new file mode 100755
index 0000000000..2589cbccdd
--- /dev/null
+++ b/libs/Zend/Locale/Data/cs.xml
@@ -0,0 +1,1714 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.84 $"/>
+ <generation date="$Date: 2006/10/26 22:46:08 $"/>
+ <language type="cs"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">Afarština</language>
+ <language type="ab">Abcházština</language>
+ <language type="af">Afrikánština</language>
+ <language type="am">Amharština</language>
+ <language type="ar">Arabština</language>
+ <language type="as">Assaméština</language>
+ <language type="ay">Aymárština</language>
+ <language type="az">Azerbajdžánština</language>
+ <language type="ba">Baskirština</language>
+ <language type="be">Běloruština</language>
+ <language type="bg">Bulharština</language>
+ <language type="bh">Biharština</language>
+ <language type="bi">Bislámština</language>
+ <language type="bn">Bengálština</language>
+ <language type="bo">Tibetština</language>
+ <language type="br">Bretaňština</language>
+ <language type="ca">Katalánština</language>
+ <language type="co">KorsiÄtina</language>
+ <language type="cs">Čeština</language>
+ <language type="cy">Velština</language>
+ <language type="da">Dánština</language>
+ <language type="de">NÄ›mÄina</language>
+ <language type="dz">Bhútánština</language>
+ <language type="el">ŘeÄtina</language>
+ <language type="en">AngliÄtina</language>
+ <language type="eo">Esperanto</language>
+ <language type="es">Španělština</language>
+ <language type="et">Estonština</language>
+ <language type="eu">BaskiÄtina</language>
+ <language type="fa">Perština</language>
+ <language type="fi">Finština</language>
+ <language type="fj">Fidži</language>
+ <language type="fo">Faerština</language>
+ <language type="fr">Francouzština</language>
+ <language type="fy">Fríština</language>
+ <language type="ga">Irština</language>
+ <language type="gd">Skotská galština</language>
+ <language type="gl">HaliÄÅ¡tina</language>
+ <language type="gn">Guaranština</language>
+ <language type="gu">Gujaratština</language>
+ <language type="gv">Manština</language>
+ <language type="ha">Hausa</language>
+ <language type="he">Hebrejština</language>
+ <language type="hi">Hindština</language>
+ <language type="hr">Chorvatština</language>
+ <language type="hu">MaÄarÅ¡tina</language>
+ <language type="hy">Arménština</language>
+ <language type="ia">Interlingua</language>
+ <language type="id">Indonéština</language>
+ <language type="ie">Interlingue</language>
+ <language type="ik">Inupiakština</language>
+ <language type="is">Islandština</language>
+ <language type="it">Italština</language>
+ <language type="iu">Inuktitutština</language>
+ <language type="ja">Japonština</language>
+ <language type="jv">Javánština</language>
+ <language type="ka">Gruzínština</language>
+ <language type="kk">Kazachština</language>
+ <language type="kl">Grónština</language>
+ <language type="km">Kambodžština</language>
+ <language type="kn">Kannadština</language>
+ <language type="ko">Korejština</language>
+ <language type="ks">Kašmírština</language>
+ <language type="ku">Kurdština</language>
+ <language type="ky">Kirgizština</language>
+ <language type="la">Latina</language>
+ <language type="ln">Lingalština</language>
+ <language type="lo">Laoština</language>
+ <language type="lt">Litevština</language>
+ <language type="lv">Lotyština</language>
+ <language type="mg">Malgaština</language>
+ <language type="mi">Maorština</language>
+ <language type="mk">Makedonština</language>
+ <language type="ml">Malabarština</language>
+ <language type="mn">Mongolština</language>
+ <language type="mo">Moldavština</language>
+ <language type="mr">Marathi</language>
+ <language type="ms">Malajština</language>
+ <language type="mt">Maltština</language>
+ <language type="my">Barmština</language>
+ <language type="na">Nauru</language>
+ <language type="ne">Nepálština</language>
+ <language type="nl" draft="provisional">Nizozemština</language>
+ <language type="no">Norština</language>
+ <language type="oc">Occitan</language>
+ <language type="om">Oromo (Afan)</language>
+ <language type="or">Oriya</language>
+ <language type="pa">Paňdžábština</language>
+ <language type="pl">Polština</language>
+ <language type="ps">Pashto (Pushto)</language>
+ <language type="pt">Portugalština</language>
+ <language type="qu">KeÄuánÅ¡tina</language>
+ <language type="rm">Rétorománština</language>
+ <language type="rn">Kirundi</language>
+ <language type="ro">Rumunština</language>
+ <language type="ru">Ruština</language>
+ <language type="rw">Kinyarwandština</language>
+ <language type="sa">Sanskrt</language>
+ <language type="sd">Sindhi</language>
+ <language type="sg">Sangho</language>
+ <language type="sh">Srbochorvatština</language>
+ <language type="si">Sinhálština</language>
+ <language type="sk">Slovenština</language>
+ <language type="sl">Slovinština</language>
+ <language type="sm">Samoyština</language>
+ <language type="sn">Shona</language>
+ <language type="so">Somálština</language>
+ <language type="sq">Albánština</language>
+ <language type="sr">Srbština</language>
+ <language type="ss">Siswatština</language>
+ <language type="st">Sesotho</language>
+ <language type="su">Sundanština</language>
+ <language type="sv">Švédština</language>
+ <language type="sw">Svahilština</language>
+ <language type="ta">Tamilština</language>
+ <language type="te">Telugština</language>
+ <language type="tg">TádžiÄtina</language>
+ <language type="th">Thajština</language>
+ <language type="ti">Tigrinijština</language>
+ <language type="tk">Turkmenština</language>
+ <language type="tl">Tagalog</language>
+ <language type="tn">Setswanština</language>
+ <language type="to">Tonga</language>
+ <language type="tr">TureÄtina</language>
+ <language type="ts">Tsonga</language>
+ <language type="tt">Tatarština</language>
+ <language type="tw">Twi</language>
+ <language type="ug">Uighurština</language>
+ <language type="uk">Ukrajinština</language>
+ <language type="ur">Urdština</language>
+ <language type="uz">UzbeÄtina</language>
+ <language type="vi">Vietnamština</language>
+ <language type="vo">Volapuk</language>
+ <language type="wo">Wolof</language>
+ <language type="xh">Xhosa</language>
+ <language type="yi">Jidiš</language>
+ <language type="yo">Yoruba</language>
+ <language type="za">Zhuang</language>
+ <language type="zh">Čínština</language>
+ <language type="zu">Zulu</language>
+ </languages>
+ <scripts>
+ <script type="Latn">Latinka</script>
+ </scripts>
+ <territories>
+ <territory type="001">Svět</territory>
+ <territory type="002">Afrika</territory>
+ <territory type="005">Jižní Amerika</territory>
+ <territory type="009">Oceánie</territory>
+ <territory type="011">Západní Afrika</territory>
+ <territory type="013">Střední Amerika</territory>
+ <territory type="014">Východní Afrika</territory>
+ <territory type="015">Severní Afrika</territory>
+ <territory type="017">Střední Afrika</territory>
+ <territory type="018">Jižní Afrika</territory>
+ <territory type="019">Amerika</territory>
+ <territory type="021">Severní Amerika</territory>
+ <territory type="029">Karibik</territory>
+ <territory type="030">Východní Asie</territory>
+ <territory type="035">Jihovýchodní Asie</territory>
+ <territory type="039">Jižní Evropa</territory>
+ <territory type="053">Austrálie a Nový Zéland</territory>
+ <territory type="054">Melanésie</territory>
+ <territory type="057">Mikronésie</territory>
+ <territory type="061">Polynésie</territory>
+ <territory type="062">Jižní a centrální Asie</territory>
+ <territory type="142">Asie</territory>
+ <territory type="145">Západní Asie</territory>
+ <territory type="150">Evropa</territory>
+ <territory type="151">Východní Evropa</territory>
+ <territory type="154">Severní Evropa</territory>
+ <territory type="155">Západní Evropa</territory>
+ <territory type="200">ÄŒeskoslovensko</territory>
+ <territory type="830">Normanské ostrovy</territory>
+ <territory type="IM">Ostrov Man</territory>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Spojené arabské emiráty</territory>
+ <territory type="AF">Afghánistán</territory>
+ <territory type="AG">Antigua a Barbuda</territory>
+ <territory type="AI">Anguila</territory>
+ <territory type="AL">Albánie</territory>
+ <territory type="AM">Arménie</territory>
+ <territory type="AN">Nizozemské Antily</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktida</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">Americká Samoa</territory>
+ <territory type="AT">Rakousko</territory>
+ <territory type="AU">Austrálie</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Alandy</territory>
+ <territory type="AZ">Ãzerbájdžán</territory>
+ <territory type="BA">Bosna a Hercegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladéš</territory>
+ <territory type="BE">Belgie</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulharsko</territory>
+ <territory type="BH">Bahrajn</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermudy</territory>
+ <territory type="BN">Brunej Darussalam</territory>
+ <territory type="BO">Bolívie</territory>
+ <territory type="BR">Brazílie</territory>
+ <territory type="BS">Bahamy</territory>
+ <territory type="BT">Bhútán</territory>
+ <territory type="BV">Ostrov Bouvet</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Bělorusko</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Kokosové ostrovy</territory>
+ <territory type="CD">Kongo, demokratická republika</territory>
+ <territory type="CF">Středoafrická republika</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Švýcarsko</territory>
+ <territory type="CI">Pobřeží slonoviny</territory>
+ <territory type="CK">Cookovy ostrovy</territory>
+ <territory type="CL">Chile</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Čína</territory>
+ <territory type="CO">Kolumbie</territory>
+ <territory type="CR">Kostarika</territory>
+ <territory type="CS" references="R1">Srbsko a Černá Hora</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Kapverdy</territory>
+ <territory type="CX">VánoÄní ostrovy</territory>
+ <territory type="CY">Kypr</territory>
+ <territory type="CZ">Česká republika</territory>
+ <territory type="DE">Německo</territory>
+ <territory type="DJ">Džibuti</territory>
+ <territory type="DK">Dánsko</territory>
+ <territory type="DM">Dominika</territory>
+ <territory type="DO">Dominikánská republika</territory>
+ <territory type="DZ">Alžírsko</territory>
+ <territory type="EC">Ekvádor</territory>
+ <territory type="EE">Estonsko</territory>
+ <territory type="EG">Egypt</territory>
+ <territory type="EH">Západní Sahara</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Španělsko</territory>
+ <territory type="ET">Etiopie</territory>
+ <territory type="FI">Finsko</territory>
+ <territory type="FJ">Fidži</territory>
+ <territory type="FK">Falklandské ostrovy</territory>
+ <territory type="FM">Mikronésie, federativní stát</territory>
+ <territory type="FO">Faerské ostrovy</territory>
+ <territory type="FR">Francie</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Velká Británie</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Gruzie</territory>
+ <territory type="GF">Francouzská Guyana</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Grónsko</territory>
+ <territory type="GM">Gambie</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Rovníková Guinea</territory>
+ <territory type="GR">Řecko</territory>
+ <territory type="GS">Jižní Georgie a Jižní Sandwichovy ostrovy</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinea-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Hongkong, zvláštní administrativní oblast Číny</territory>
+ <territory type="HM">Ostrovy Heard a McDonald</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Chorvatsko</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">MaÄarsko</territory>
+ <territory type="ID">Indonésie</territory>
+ <territory type="IE">Irsko</territory>
+ <territory type="IL">Izrael</territory>
+ <territory type="IN">Indie</territory>
+ <territory type="IO">Britské území v Indickém oceánu</territory>
+ <territory type="IQ">Irák</territory>
+ <territory type="IR">Ãrán</territory>
+ <territory type="IS">Island</territory>
+ <territory type="IT">Itálie</territory>
+ <territory type="JM">Jamajka</territory>
+ <territory type="JO">Jordánsko</territory>
+ <territory type="JP">Japonsko</territory>
+ <territory type="KE">Keňa</territory>
+ <territory type="KG">Kyrgyzstán</territory>
+ <territory type="KH">Kambodža</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komory</territory>
+ <territory type="KN">Svatý Kitts a Nevis</territory>
+ <territory type="KP">Severní Korea</territory>
+ <territory type="KR">Jižní Korea</territory>
+ <territory type="KW">Kuvajt</territory>
+ <territory type="KY">Kajmanské ostrovy</territory>
+ <territory type="KZ">Kazachstán</territory>
+ <territory type="LA">Lidově demokratická republika Laos</territory>
+ <territory type="LB">Libanon</territory>
+ <territory type="LC">Svatá Lucie</territory>
+ <territory type="LI">Lichtenštejnsko</territory>
+ <territory type="LK">Srí Lanka</territory>
+ <territory type="LR">Libérie</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Litva</territory>
+ <territory type="LU">Lucembursko</territory>
+ <territory type="LV">Lotyšsko</territory>
+ <territory type="LY">Libye</territory>
+ <territory type="MA">Maroko</territory>
+ <territory type="MC">Monako</territory>
+ <territory type="MD">Moldavsko, republika</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshallovy ostrovy</territory>
+ <territory type="MK">Macedonia</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar (Burma)</territory>
+ <territory type="MN">Mongolsko</territory>
+ <territory type="MO">Macao S.A.R., China</territory>
+ <territory type="MP">Severní Mariany</territory>
+ <territory type="MQ">Martinik</territory>
+ <territory type="MR">Mauritánie</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauricius</territory>
+ <territory type="MV">Maladivy</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Mexiko</territory>
+ <territory type="MY">Malajsie</territory>
+ <territory type="MZ">Mosambik</territory>
+ <territory type="NA">Namibie</territory>
+ <territory type="NC">Nová Kaledonie</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Norfolk</territory>
+ <territory type="NG">Nigérie</territory>
+ <territory type="NI">Nikaragua</territory>
+ <territory type="NL">Nizozemsko</territory>
+ <territory type="NO">Norsko</territory>
+ <territory type="NP">Nepál</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Nový Zéland</territory>
+ <territory type="OM">Omán</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Francouzská Polynésie</territory>
+ <territory type="PG">Papua-Nová Guinea</territory>
+ <territory type="PH">Filipíny</territory>
+ <territory type="PK">Pákistán</territory>
+ <territory type="PL">Polsko</territory>
+ <territory type="PM">Svatý Pierre a Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Portoriko</territory>
+ <territory type="PS">Palestinian Territory</territory>
+ <territory type="PT">Portugalsko</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Katar</territory>
+ <territory type="QO">Vnější Oceánie</territory>
+ <territory type="RE">Réunion</territory>
+ <territory type="RO">Rumunsko</territory>
+ <territory type="RU">Rusko</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Saúdská Arábie</territory>
+ <territory type="SB">Å alamounovy ostrovy</territory>
+ <territory type="SC">Seychely</territory>
+ <territory type="SD">Súdán</territory>
+ <territory type="SE">Švédsko</territory>
+ <territory type="SG">Singapur</territory>
+ <territory type="SH">Svatá Helena</territory>
+ <territory type="SI">Slovinsko</territory>
+ <territory type="SJ">Svalbard a Jan Mayen</territory>
+ <territory type="SK">Slovensko</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somálsko</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">Svatý Tomáš</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Sýrie</territory>
+ <territory type="SZ">Svazijsko</territory>
+ <territory type="TC">Ostrovy Caicos a Turks</territory>
+ <territory type="TD">ÄŒad</territory>
+ <territory type="TF">Francouzská jižní teritoria</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Thajsko</territory>
+ <territory type="TJ">Tádžikistán</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Východní Timor</territory>
+ <territory type="TM">Turkmenistán</territory>
+ <territory type="TN">Tunisko</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turecko</territory>
+ <territory type="TT">Trinidad a Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Tchaj-wan</territory>
+ <territory type="TZ">Tanzanie</territory>
+ <territory type="UA">Ukrajina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">Menší odlehlé ostrovy USA</territory>
+ <territory type="US">Spojené státy</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Uzbekistán</territory>
+ <territory type="VA">Svatý stolec</territory>
+ <territory type="VC">Svatý Vincent a Grenadiny</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Britské Panenské ostrovy</territory>
+ <territory type="VI">Americké Panenské ostrovy</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis a Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Jihoafrická republika</territory>
+ <territory type="ZM">Zambie</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ <keys>
+ <key type="calendar">Kalendář</key>
+ <key type="collation">Třídění</key>
+ <key type="currency">Měna</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">Buddhistický kalendář</type>
+ <type type="chinese" key="calendar">Čínský kalendář</type>
+ <type type="gregorian" key="calendar">Gregoriánský kalendář</type>
+ <type type="hebrew" key="calendar">Hebrejský kalendář</type>
+ <type type="islamic" key="calendar">Muslimský kalendář</type>
+ <type type="islamic-civil" key="calendar">Muslimský obÄanský kalendář</type>
+ <type type="japanese" key="calendar">Japonský kalendář</type>
+ </types>
+ </localeDisplayNames>
+ <layout>
+ <inList casing="titlecase-firstword"/>
+ </layout>
+ <characters>
+ <exemplarCharacters>[a á b c Ä d Ä e é Ä› f-h {ch} i í j-n ň o ó p-r Å™ s Å¡ t Å¥ u ú ů v-y ý z ž]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>„</quotationStart>
+ <quotationEnd>“</quotationEnd>
+ <alternateQuotationStart>‚</alternateQuotationStart>
+ <alternateQuotationEnd>‘</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <localizedPatternChars>GuMtkHmsSEDFwWahKzUeygAZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="provisional">led</month>
+ <month type="2" draft="provisional">úno</month>
+ <month type="3" draft="provisional">bře</month>
+ <month type="4" draft="provisional">dub</month>
+ <month type="5" draft="provisional">kvÄ›</month>
+ <month type="6" draft="provisional">Ärn</month>
+ <month type="7" draft="provisional">Ärc</month>
+ <month type="8" draft="provisional">srp</month>
+ <month type="9" draft="provisional">zář</month>
+ <month type="10" draft="provisional">říj</month>
+ <month type="11" draft="provisional">lis</month>
+ <month type="12" draft="provisional">pro</month>
+ </monthWidth>
+ <monthWidth type="narrow">
+ <month type="1">l</month>
+ <month type="2">ú</month>
+ <month type="3">b</month>
+ <month type="4">d</month>
+ <month type="5">k</month>
+ <month type="6">Ä</month>
+ <month type="7">Ä</month>
+ <month type="8">s</month>
+ <month type="9">z</month>
+ <month type="10">Å™</month>
+ <month type="11">l</month>
+ <month type="12">p</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">ledna</month>
+ <month type="2">února</month>
+ <month type="3">března</month>
+ <month type="4">dubna</month>
+ <month type="5">května</month>
+ <month type="6">Äervna</month>
+ <month type="7">Äervence</month>
+ <month type="8">srpna</month>
+ <month type="9">září</month>
+ <month type="10">října</month>
+ <month type="11">listopadu</month>
+ <month type="12">prosince</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="abbreviated">
+ <month type="1">1.</month>
+ <month type="2">2.</month>
+ <month type="3">3.</month>
+ <month type="4">4.</month>
+ <month type="5">5.</month>
+ <month type="6">6.</month>
+ <month type="7">7.</month>
+ <month type="8">8.</month>
+ <month type="9">9.</month>
+ <month type="10">10.</month>
+ <month type="11">11.</month>
+ <month type="12">12.</month>
+ </monthWidth>
+ <monthWidth type="narrow">
+ <month type="1">l</month>
+ <month type="2">ú</month>
+ <month type="3">b</month>
+ <month type="4">d</month>
+ <month type="5">k</month>
+ <month type="6">Ä</month>
+ <month type="7">Ä</month>
+ <month type="8">s</month>
+ <month type="9">z</month>
+ <month type="10">Å™</month>
+ <month type="11">l</month>
+ <month type="12">p</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">leden</month>
+ <month type="2">únor</month>
+ <month type="3">březen</month>
+ <month type="4">duben</month>
+ <month type="5">květen</month>
+ <month type="6">Äerven</month>
+ <month type="7">Äervenec</month>
+ <month type="8">srpen</month>
+ <month type="9">září</month>
+ <month type="10">říjen</month>
+ <month type="11">listopad</month>
+ <month type="12">prosinec</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">ne</day>
+ <day type="mon">po</day>
+ <day type="tue">út</day>
+ <day type="wed">st</day>
+ <day type="thu">Ät</day>
+ <day type="fri">pá</day>
+ <day type="sat">so</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">neděle</day>
+ <day type="mon">pondělí</day>
+ <day type="tue">úterý</day>
+ <day type="wed">středa</day>
+ <day type="thu">Ätvrtek</day>
+ <day type="fri">pátek</day>
+ <day type="sat">sobota</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">N</day>
+ <day type="mon">P</day>
+ <day type="tue">Ú</day>
+ <day type="wed">S</day>
+ <day type="thu">Č</day>
+ <day type="fri">P</day>
+ <day type="sat">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1">1. Ätvrtletí</quarter>
+ <quarter type="2">2. Ätvrtletí</quarter>
+ <quarter type="3">3. Ätvrtletí</quarter>
+ <quarter type="4">4. Ätvrtletí</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>dop.</am>
+ <pm>odp.</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">pÅ™.Kr.</era>
+ <era type="1">po Kr.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d.M.yyyy</pattern>
+ <pattern alt="proposed" draft="provisional">yyyy-MM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d.M.yy</pattern>
+ <pattern alt="proposed" draft="provisional">yy-MM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d. MMMM</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">d.M</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">M.yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Jižní pól</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity>Kordoba</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <standard>Atlantický standardní Äas</standard>
+ <daylight>Atlantický letní Äas</daylight>
+ </long>
+ <short>
+ <standard>AST</standard>
+ <daylight>ADT</daylight>
+ </short>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity>Kašghar</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity>Galapágy</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>Kanárské ostrovy</exemplarCity>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <standard>StÅ™edoevropský standardní Äas</standard>
+ <daylight>StÅ™edoevropský letní Äas</daylight>
+ </long>
+ <short>
+ <standard>CET</standard>
+ <daylight>CEST</daylight>
+ </short>
+ <exemplarCity>Paříž</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>Londýn</exemplarCity>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <standard>Izraelský standardní Äas</standard>
+ <daylight>Izraelský letní Äas</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IDT</daylight>
+ </short>
+ <exemplarCity>Jeruzalém</exemplarCity>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <standard>Japonský standardní Äas</standard>
+ <daylight>Japonský letní Äas</daylight>
+ </long>
+ <short>
+ <standard>JST</standard>
+ <daylight>JST</daylight>
+ </short>
+ <exemplarCity>Tokio</exemplarCity>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <standard>Greenwichský stÅ™ední Äas</standard>
+ <daylight>Greenwichský stÅ™ední Äas</daylight>
+ </long>
+ <short>
+ <standard>GMT</standard>
+ <daylight>GMT</daylight>
+ </short>
+ <exemplarCity>Casablanca</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>Ulánbátar</exemplarCity>
+ </zone>
+ <zone type="America/Tijuana">
+ <exemplarCity>Tichuana</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>Azorské ostrovy</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lisabon</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>Východoevropský standardní Äas</standard>
+ <daylight>Východoevropský letní Äas</daylight>
+ </long>
+ <short>
+ <standard>EET</standard>
+ <daylight>EEST</daylight>
+ </short>
+ <exemplarCity>Bukurešť</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moskva</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>Jekatěrinburg</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>Krasnojarsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>Jakutsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>Sachalin</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>KamÄatka</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>Užhorod</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>Kyjev</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>Záporoží</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <standard>Havajský standardní Äas</standard>
+ <daylight>Havajský letní Äas</daylight>
+ </long>
+ <short>
+ <standard>HST</standard>
+ <daylight>HST</daylight>
+ </short>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <standard>AljaÅ¡ský standardní Äas</standard>
+ <daylight>AljaÅ¡ský letní Äas</daylight>
+ </long>
+ <short>
+ <standard alt="proposed-u18-1" draft="provisional">AKST</standard>
+ <daylight alt="proposed-u18-1" draft="provisional">AKDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <standard>Pacifický standardní Äas</standard>
+ <daylight>Pacifický letní Äas</daylight>
+ </long>
+ <short>
+ <standard>PST</standard>
+ <daylight>PDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Phoenix">
+ <long>
+ <standard>Horský standardní Äas</standard>
+ <daylight>Horský standardní Äas</daylight>
+ <daylight alt="proposed-u18-1" draft="provisional">Horský letní Äas (Phoenix)</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MST</daylight>
+ </short>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <standard>Horský standardní Äas</standard>
+ <standard alt="proposed-u18-1" draft="provisional">Horský standardní Äas (Denver)</standard>
+ <daylight>Horský letní Äas</daylight>
+ <daylight alt="proposed-u18-1" draft="provisional">Horský letní Äas (Denver)</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <standard>Centrální standardní Äas</standard>
+ <daylight>Centrální letní Äas</daylight>
+ </long>
+ <short>
+ <standard>CST</standard>
+ <daylight>CDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Indianapolis">
+ <long>
+ <standard>Východní standardní Äas</standard>
+ <daylight alt="proposed-u18-1" draft="provisional">Východní letní Äas (Indianapolis)</daylight>
+ </long>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <standard alt="proposed-u18-1" draft="provisional">Východní standardní Äas (New York)</standard>
+ <daylight alt="proposed-u18-1" draft="provisional">Východní letní Äas (New York)</daylight>
+ </long>
+ <short>
+ <standard>EST</standard>
+ <daylight>EDT</daylight>
+ </short>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Taškent</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Peseta andorrská</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>Dirham SAE</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>Afghán (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>Afghán</displayName>
+ <symbol>Af</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>Lek</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>Dram arménský</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>Zlatý Nizozemských Antil</displayName>
+ <symbol>NA f.</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>Kwanza</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Kwanza (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>Kwanza nová (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>Kwanza reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>Austral</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Peso argentinské (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Peso argentinské</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>Å ilink</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>Dolar australský</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>Zlatý arubský</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>Manat ázerbajdžánský</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>Dinár Bosny a Hercegoviny</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>Marka konvertibilní</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>Dolar barbadoský</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>Taka</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>Frank konvertibilní</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Frank belgický</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>Frank finanÄní</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>Lev</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>Lev Bulharský</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>Dinár bahrajnský</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>Frank burundský</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>Dolar bermudský</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>Dolar brunejský</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>Boliviano</displayName>
+ <symbol>Bs</symbol>
+ </currency>
+ <currency type="BOP">
+ <displayName>Peso</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Mvdol</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>Cruzeiro (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>Cruzado</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>Cruzeiro (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Real brazilský</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRN">
+ <displayName>Cruzado nové</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>Cruzeiro real</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>Dolar bahamský</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>Ngultrum</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>Kyat barmský</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>Pula</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>Rubl nový běloruský (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>Rubl běloruský</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>Dolar belizský</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>Dolar kanadský</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>Frank konžský</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Frank švýcarský</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CLF">
+ <displayName>Unidades de fomento</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Peso chilské</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>Juan renminbi</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>Peso kolumbijské</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="CRC">
+ <displayName>Colón kostarický</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSK">
+ <displayName>Koruna Äeskoslovenská</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Peso kubánské</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Escudo kapverdské</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>Libra kyperská</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName>Koruna Äeská</displayName>
+ <symbol>KÄ</symbol>
+ </currency>
+ <currency type="DDM">
+ <displayName>Marka NDR</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Marka německá</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Frank džibutský</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>Koruna dánská</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>Peso dominikánské</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>Dinár alžírský</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>Sucre ekvádorský</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>Ecuador Unidad de Valor Constante (UVC)</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>Kroon</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>Libra egyptská</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Nakfa</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Peseta španělská</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>Birr etiopský</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>Markka</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Dolar fidžijský</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>Libra falklandská</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Frank francouzský</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Libra šterlinků</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>Georgian Kupon Larit</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>Lari</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>Cedi</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>Libra gibraltarská</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>Dalasi</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Frank guinejský</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>Guinea Syli</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Equatorial Guinea Ekwele Guineana</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Drachma</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Quetzal</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>Escudo guinejské</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Peso Guinnea-Bissau</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>Dolar guyanský</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>Dolar hongkongský</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>Lempira</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>Dinar chorvatský</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Kuna chorvatská</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>Gourde</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Forint</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>Rupie indonézská</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>Libra irská</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>Libra izraelská</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Šekel nový izraelský</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Rupie indická</displayName>
+ <symbol>INR</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>Dinár irácký</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>Rijál íránský</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>Koruna islandská</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>Lira italská</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>Dolar jamajský</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>Dinár jordánský</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>Jen</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>Šilink keňský</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>Som</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>Riel</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>Frank komorský</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>Won severokorejský</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Won jihokorejský</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>Dinár kuvajtský</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>Dolar Kajmanských ostrovů</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Tenge</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>Kip</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>Libra libanonská</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>Rupie srílanská</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>Dolar liberijský</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Loti</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LTL">
+ <displayName>Litus litevský</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Talon</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Frank lucemburský</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Lat lotyšský</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>Rubl lotyšský</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>Dinár lybijský</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>Dirham marocký</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>Frank marocký</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>Leu moldavský</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>Ariary madagaskarský</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Frank madagaskarský</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>Denár</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>Frank malijský</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Kyat</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>Tugrik</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Pataca</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Ouguiya</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>Lira maltská</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>Libra maltská</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>Rupie mauricijská</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>Rufiyaa</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Kwacha malawská</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>Peso mexické</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>Peso stříbrné mexické (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>Mexican Unidad de Inversion (UDI)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Ringgit malajskijský</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>Escudo Mosambiku</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Metical</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>Dolar namibijský</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>Naira</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>Cordoba</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>Cordoba oro</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Zlatý holandský</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Koruna norská</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>Rupie nepálská</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>Dolar novozélandský</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>Rijál ománský</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>Balboa</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>Inti</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>Nuevo sol</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>Sol</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Kina</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>Peso filipínské</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>Rupie pákistánská</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>Zlotý</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Zlotý (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Escudo portugalské</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>Guarani</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>Rijál katarský</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="ROL">
+ <displayName>Lei</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>Rubl ruský</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Rubl ruský (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>Frank rwandský</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>Rijál saudský</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>Dolar Šalamounových ostrovů</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>Rupie seychelská</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>Dinár súdánský</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>Libra súdánská</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>Koruna švédská</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>Dolar singapurský</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>Libra Svaté Heleny</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Tolar</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Koruna slovenská</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName draft="provisional">Leone</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>Šilink somálský</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRG">
+ <displayName>Zlatý surinamský</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>Dobra</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>Rubl</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>Colon salvadorský</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>Libra syrská</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>Lilangeni</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>Baht</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>Tajikistan Ruble</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Somoni</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Manat</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>Dinár tuniský</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName draft="provisional">Paʻanga</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>Escudo timorské</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Lira turecká</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName>Lira nová turecká</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Dolar Trinidad a Tobago</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>Dolar tchajvanský nový</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>Šilink tanzanský</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>Hřivna</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Karbovanec</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Šilink ugandský (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Šilink ugandský</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>Dolar americký</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>Dolar americký (příští den)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>Dolar americký (týž den)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>Peso uruguayské (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>Peso uruguayské</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>Sum uzbecký</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Bolivar</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VUV">
+ <displayName>Vatu</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>Tala</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>Frank BEAC/CFA</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>Zlato</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>Evropská smíšená jednotka</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>Evropská peněžní jednotka</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>Evropská jednotka úÄtu 9 (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>Evropská jednotka úÄtu 17 (XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>Dolar východokaribský</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>SDR</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>Evropská měnová jednotka</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>Frank zlatý</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>Frank UIC</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>Frank BCEAO/CFA</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>Frank CFP</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="YDD">
+ <displayName>Dinár jemenský</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Rijál jemenský</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>Dinár jugoslávský nový [YUD]</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>Dinár jugoslávský nový [YUM]</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>Dinár jugoslávský konvertibilní</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>Rand finanÄní</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Rand</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Kwacha zambijská</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Zaire nový</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Zaire</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Dolar zimbabwský</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>ano:a</yesstr>
+ <nostr>ne:n</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="R1" uri="http://manas.info/staty-sveta/YI.PHP">Státy světa - Serbia and Montenegro</reference>
+ <reference type="RP1">Czech version (ÄŒSN) of the European Standard ISO 639-2:1998 (reference for languages)</reference>
+ <reference type="RP2">Czech version (ÄŒSN) of the International Standard ISO 4217:2001 (reference for currencies)</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/cs_CZ.xml b/libs/Zend/Locale/Data/cs_CZ.xml
new file mode 100755
index 0000000000..e085585dba
--- /dev/null
+++ b/libs/Zend/Locale/Data/cs_CZ.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.40 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="cs"/>
+ <territory type="CZ"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="lb">Lucemburština</language>
+ </languages>
+ <territories>
+ <territory type="018" draft="provisional">jižní Afrika</territory>
+ <territory type="419" draft="provisional">Latinská Amerika a Karibské moře</territory>
+ </territories>
+ </localeDisplayNames>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/cy.xml b/libs/Zend/Locale/Data/cy.xml
new file mode 100755
index 0000000000..93fd5dd1c1
--- /dev/null
+++ b/libs/Zend/Locale/Data/cy.xml
@@ -0,0 +1,456 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.42 $"/>
+ <generation date="$Date: 2006/10/26 22:46:08 $"/>
+ <language type="cy"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar">Arabeg</language>
+ <language type="cy">Cymraeg</language>
+ <language type="de">Almaeneg</language>
+ <language type="en">Saesneg</language>
+ <language type="es">Sbaeneg</language>
+ <language type="fr">Ffrangeg</language>
+ <language type="hi">Hindi</language>
+ <language type="it">Eidaleg</language>
+ <language type="ja">Siapaneeg</language>
+ <language type="pt">Portiwgaleg</language>
+ <language type="ru">Rwsieg</language>
+ <language type="zh">Tseineeg</language>
+ </languages>
+ <scripts>
+ <script type="Latn">Lladin</script>
+ </scripts>
+ <territories>
+ <territory type="001" draft="unconfirmed">Y Byd</territory>
+ <territory type="002" draft="unconfirmed">Affrica</territory>
+ <territory type="005" draft="unconfirmed">De America</territory>
+ <territory type="009" draft="unconfirmed">Oceania</territory>
+ <territory type="011" draft="unconfirmed">Gorllewin Affrica</territory>
+ <territory type="013" draft="unconfirmed">Canolbarth America</territory>
+ <territory type="014" draft="unconfirmed">Dwyrain Affrica</territory>
+ <territory type="015" draft="unconfirmed">Gogledd Affrica</territory>
+ <territory type="017" draft="unconfirmed">Canol Affrica</territory>
+ <territory type="018" draft="unconfirmed">De Affrica [018]</territory>
+ <territory type="019" draft="unconfirmed">Americas</territory>
+ <territory type="021" draft="unconfirmed">Gogledd America</territory>
+ <territory type="029" draft="unconfirmed">Y Caribî</territory>
+ <territory type="030" draft="unconfirmed">Dwyrain Asia</territory>
+ <territory type="035" draft="unconfirmed">De ddwyrain Asia</territory>
+ <territory type="039" draft="unconfirmed">De Ewrop</territory>
+ <territory type="053" draft="unconfirmed">Awstralia a Seland Newydd</territory>
+ <territory type="054" draft="unconfirmed">Melanesia</territory>
+ <territory type="057" draft="unconfirmed">Micronesia [057]</territory>
+ <territory type="061" draft="unconfirmed">Polynesia</territory>
+ <territory type="062" draft="unconfirmed">De Canol Asia</territory>
+ <territory type="142" draft="unconfirmed">Asia</territory>
+ <territory type="145" draft="unconfirmed">Gorllewin Asia</territory>
+ <territory type="150" draft="unconfirmed">Ewrop</territory>
+ <territory type="151" draft="unconfirmed">Dwyrain Ewrop</territory>
+ <territory type="154" draft="unconfirmed">Gogledd Ewrop</territory>
+ <territory type="155" draft="unconfirmed">Gorllewin Ewrop</territory>
+ <territory type="830" draft="unconfirmed">Ynysoedd y Sianel</territory>
+ <territory type="IM" draft="unconfirmed">Ynys Manaw</territory>
+ <territory type="AD" draft="unconfirmed">Andorra</territory>
+ <territory type="AE" draft="unconfirmed">Emiraethau Arabaidd Unedig</territory>
+ <territory type="AF" draft="unconfirmed">Affganistan</territory>
+ <territory type="AG" draft="unconfirmed">Antigwa a Barbuda</territory>
+ <territory type="AI" draft="unconfirmed">Anguilla</territory>
+ <territory type="AL" draft="unconfirmed">Albania</territory>
+ <territory type="AM" draft="unconfirmed">Armenia</territory>
+ <territory type="AN" draft="unconfirmed">Ynysoedd Caribî yr Iseldiroedd</territory>
+ <territory type="AO" draft="unconfirmed">Angola</territory>
+ <territory type="AQ" draft="unconfirmed">Antarctica</territory>
+ <territory type="AR" draft="unconfirmed">Yr Ariannin</territory>
+ <territory type="AS" draft="unconfirmed">Samoa Americanaidd</territory>
+ <territory type="AT" draft="unconfirmed">Awstria</territory>
+ <territory type="AU" draft="unconfirmed">Awstralia</territory>
+ <territory type="AW" draft="unconfirmed">Aruba</territory>
+ <territory type="AX" draft="unconfirmed">Ynysoedd Aland</territory>
+ <territory type="AZ" draft="unconfirmed">Azerbaijan</territory>
+ <territory type="BA" draft="unconfirmed">Bosnia a Herzegovina</territory>
+ <territory type="BB" draft="unconfirmed">Barbados</territory>
+ <territory type="BD" draft="unconfirmed">Bangladesh</territory>
+ <territory type="BE" draft="unconfirmed">Gwlad Belg</territory>
+ <territory type="BF" draft="unconfirmed">Burkina Faso</territory>
+ <territory type="BG" draft="unconfirmed">Bwlgaria</territory>
+ <territory type="BH" draft="unconfirmed">Bahrain</territory>
+ <territory type="BI" draft="unconfirmed">Burundi</territory>
+ <territory type="BJ" draft="unconfirmed">Benin</territory>
+ <territory type="BM" draft="unconfirmed">Bermwda</territory>
+ <territory type="BN" draft="unconfirmed">Brunei</territory>
+ <territory type="BO" draft="unconfirmed">Bolifia</territory>
+ <territory type="BR" draft="unconfirmed">Brasil</territory>
+ <territory type="BS" draft="unconfirmed">Y Bahamas</territory>
+ <territory type="BT" draft="unconfirmed">Bhwtan</territory>
+ <territory type="BV" draft="unconfirmed">Ynys Bouvet</territory>
+ <territory type="BW" draft="unconfirmed">Botswana</territory>
+ <territory type="BY" draft="unconfirmed">Belarws</territory>
+ <territory type="BZ" draft="unconfirmed">Belize</territory>
+ <territory type="CA" draft="unconfirmed">Canada</territory>
+ <territory type="CC" draft="unconfirmed">Ynysoedd Cocos (Keeling)</territory>
+ <territory type="CD" draft="unconfirmed">Gweriniaeth Ddemocrataidd y Congo</territory>
+ <territory type="CF" draft="unconfirmed">Gweriniaeth Canol Affrica</territory>
+ <territory type="CG" draft="unconfirmed">Congo</territory>
+ <territory type="CH" draft="unconfirmed">Y Swistir</territory>
+ <territory type="CI" draft="unconfirmed">Côte d’Ivoire</territory>
+ <territory type="CK" draft="unconfirmed">Ynysoedd Cook</territory>
+ <territory type="CL" draft="unconfirmed">Chile</territory>
+ <territory type="CM" draft="unconfirmed">Y Camerŵn</territory>
+ <territory type="CN" draft="unconfirmed">Tseina</territory>
+ <territory type="CO" draft="unconfirmed">Colombia</territory>
+ <territory type="CR" draft="unconfirmed">Costa Rica</territory>
+ <territory type="CU" draft="unconfirmed">Ciwba</territory>
+ <territory type="CV" draft="unconfirmed">Cape Verde</territory>
+ <territory type="CX" draft="unconfirmed">Ynys y Nadolig</territory>
+ <territory type="CY" draft="unconfirmed">Cyprus</territory>
+ <territory type="CZ" draft="unconfirmed">Gweriniaeth Tsiec</territory>
+ <territory type="DE" draft="unconfirmed">Yr Almaen</territory>
+ <territory type="DJ" draft="unconfirmed">Djibouti</territory>
+ <territory type="DK" draft="unconfirmed">Denmarc</territory>
+ <territory type="DM" draft="unconfirmed">Dominica</territory>
+ <territory type="DO" draft="unconfirmed">Y Weriniaeth Ddominicaidd</territory>
+ <territory type="DZ" draft="unconfirmed">Algeria</territory>
+ <territory type="EC" draft="unconfirmed">Ecwador</territory>
+ <territory type="EE" draft="unconfirmed">Estonia</territory>
+ <territory type="EG" draft="unconfirmed">Yr Aifft</territory>
+ <territory type="EH" draft="unconfirmed">Gorllewin Sahara</territory>
+ <territory type="ER" draft="unconfirmed">Eritrea</territory>
+ <territory type="ES" draft="unconfirmed">Sbaen</territory>
+ <territory type="ET" draft="unconfirmed">Ethiopia</territory>
+ <territory type="FI" draft="unconfirmed">Y Ffindir</territory>
+ <territory type="FJ" draft="unconfirmed">Fiji</territory>
+ <territory type="FK" draft="unconfirmed">Ynysoedd y Falkland</territory>
+ <territory type="FM" draft="unconfirmed">Micronesia</territory>
+ <territory type="FO" draft="unconfirmed">Ynysoedd Ffaröe</territory>
+ <territory type="FR" draft="unconfirmed">Ffrainc</territory>
+ <territory type="GA" draft="unconfirmed">Gabon</territory>
+ <territory type="GB">Prydain Fawr</territory>
+ <territory type="GD" draft="unconfirmed">Grenada</territory>
+ <territory type="GE" draft="unconfirmed">Georgia</territory>
+ <territory type="GF" draft="unconfirmed">Giana Ffrengig</territory>
+ <territory type="GH" draft="unconfirmed">Ghana</territory>
+ <territory type="GI" draft="unconfirmed">Gibraltar</territory>
+ <territory type="GL" draft="unconfirmed">Yr Ynys Las</territory>
+ <territory type="GM" draft="unconfirmed">Gambia</territory>
+ <territory type="GN" draft="unconfirmed">Gini</territory>
+ <territory type="GP" draft="unconfirmed">Guadeloupe</territory>
+ <territory type="GQ" draft="unconfirmed">Gini Gyhydeddol</territory>
+ <territory type="GR" draft="unconfirmed">Gwlad Groeg</territory>
+ <territory type="GS" draft="unconfirmed">Ynysoedd De Georgia a De Sandwich</territory>
+ <territory type="GT" draft="unconfirmed">Guatemala</territory>
+ <territory type="GU" draft="unconfirmed">Guam</territory>
+ <territory type="GW" draft="unconfirmed">Guinea-Bissau</territory>
+ <territory type="GY" draft="unconfirmed">Guyana</territory>
+ <territory type="HK" draft="unconfirmed">Hong Kong S.A.R., Tseina</territory>
+ <territory type="HM" draft="unconfirmed">Ynys Heard ac Ynysoedd McDonald</territory>
+ <territory type="HN" draft="unconfirmed">Hondwras</territory>
+ <territory type="HR" draft="unconfirmed">Croatia</territory>
+ <territory type="HT" draft="unconfirmed">Haiti</territory>
+ <territory type="HU" draft="unconfirmed">Hwngari</territory>
+ <territory type="ID" draft="unconfirmed">Indonesia</territory>
+ <territory type="IE" draft="unconfirmed">Iwerddon</territory>
+ <territory type="IL" draft="unconfirmed">Israel</territory>
+ <territory type="IN" draft="unconfirmed">India</territory>
+ <territory type="IO" draft="unconfirmed">Tiriogaeth Cefnfor India Prydain</territory>
+ <territory type="IQ" draft="unconfirmed">Irac</territory>
+ <territory type="IR" draft="unconfirmed">Iran</territory>
+ <territory type="IS" draft="unconfirmed">Gwlad yr Iâ</territory>
+ <territory type="IT" draft="unconfirmed">Yr Eidal</territory>
+ <territory type="JM" draft="unconfirmed">Jamaica</territory>
+ <territory type="JO" draft="unconfirmed">Yr Iorddonen</territory>
+ <territory type="JP" draft="unconfirmed">Siapan</territory>
+ <territory type="KE" draft="unconfirmed">Cenia</territory>
+ <territory type="KG" draft="unconfirmed">Cirgistan</territory>
+ <territory type="KH" draft="unconfirmed">Cambodia</territory>
+ <territory type="KI" draft="unconfirmed">Kiribati</territory>
+ <territory type="KM" draft="unconfirmed">Comoros</territory>
+ <territory type="KN" draft="unconfirmed">Saint Kitts a Nevis</territory>
+ <territory type="KP" draft="unconfirmed">Gogledd Corea</territory>
+ <territory type="KR" draft="unconfirmed">De Corea</territory>
+ <territory type="KW" draft="unconfirmed">Coweit</territory>
+ <territory type="KY" draft="unconfirmed">Ynysoedd Cayman</territory>
+ <territory type="KZ" draft="unconfirmed">Kazakhstan</territory>
+ <territory type="LA" draft="unconfirmed">Laos</territory>
+ <territory type="LB" draft="unconfirmed">Libanus</territory>
+ <territory type="LC" draft="unconfirmed">Saint Lucia</territory>
+ <territory type="LI" draft="unconfirmed">Liechtenstein</territory>
+ <territory type="LK" draft="unconfirmed">Sri Lanka</territory>
+ <territory type="LR" draft="unconfirmed">Liberia</territory>
+ <territory type="LS" draft="unconfirmed">Lesotho</territory>
+ <territory type="LT" draft="unconfirmed">Lithwania</territory>
+ <territory type="LU" draft="unconfirmed">Lwcsembwrg</territory>
+ <territory type="LV" draft="unconfirmed">Latfia</territory>
+ <territory type="LY" draft="unconfirmed">Libia</territory>
+ <territory type="MA" draft="unconfirmed">Moroco</territory>
+ <territory type="MC" draft="unconfirmed">Monaco</territory>
+ <territory type="MD" draft="unconfirmed">Moldofa</territory>
+ <territory type="MG" draft="unconfirmed">Madagascar</territory>
+ <territory type="MH" draft="unconfirmed">Ynysoedd Marshall</territory>
+ <territory type="MK" draft="unconfirmed">Macedonia</territory>
+ <territory type="ML" draft="unconfirmed">Mali</territory>
+ <territory type="MM" draft="unconfirmed">Myanmar</territory>
+ <territory type="MN" draft="unconfirmed">Mongolia</territory>
+ <territory type="MO" draft="unconfirmed">Macao S.A.R., Tseina</territory>
+ <territory type="MP" draft="unconfirmed">Ynysoedd Gogledd Mariana</territory>
+ <territory type="MQ" draft="unconfirmed">Martinique</territory>
+ <territory type="MR" draft="unconfirmed">Mawritania</territory>
+ <territory type="MS" draft="unconfirmed">Montserrat</territory>
+ <territory type="MT" draft="unconfirmed">Malta</territory>
+ <territory type="MU" draft="unconfirmed">Mawrisiws</territory>
+ <territory type="MV" draft="unconfirmed">Maldives</territory>
+ <territory type="MW" draft="unconfirmed">Malawi</territory>
+ <territory type="MX" draft="unconfirmed">Mecsico</territory>
+ <territory type="MY" draft="unconfirmed">Malaysia</territory>
+ <territory type="MZ" draft="unconfirmed">Mozambique</territory>
+ <territory type="NA" draft="unconfirmed">Namibia</territory>
+ <territory type="NC" draft="unconfirmed">Caledonia Newydd</territory>
+ <territory type="NE" draft="unconfirmed">Niger</territory>
+ <territory type="NF" draft="unconfirmed">Ynys Norfolk</territory>
+ <territory type="NG" draft="unconfirmed">Nigeria</territory>
+ <territory type="NI" draft="unconfirmed">Nicaragwa</territory>
+ <territory type="NL" draft="unconfirmed">Yr Iseldiroedd</territory>
+ <territory type="NO" draft="unconfirmed">Norwy</territory>
+ <territory type="NP" draft="unconfirmed">Nepal</territory>
+ <territory type="NR" draft="unconfirmed">Nawrw</territory>
+ <territory type="NU" draft="unconfirmed">Niue</territory>
+ <territory type="NZ" draft="unconfirmed">Seland Newydd</territory>
+ <territory type="OM" draft="unconfirmed">Oman</territory>
+ <territory type="PA" draft="unconfirmed">Panama</territory>
+ <territory type="PE" draft="unconfirmed">Perw</territory>
+ <territory type="PF" draft="unconfirmed">Polynesia Ffrainc</territory>
+ <territory type="PG" draft="unconfirmed">Papua Gini Newydd</territory>
+ <territory type="PH" draft="unconfirmed">Philipinau</territory>
+ <territory type="PK" draft="unconfirmed">Pacistan</territory>
+ <territory type="PL" draft="unconfirmed">Gwlad Pwyl</territory>
+ <territory type="PM" draft="unconfirmed">Saint Pierre a Miquelon</territory>
+ <territory type="PN" draft="unconfirmed">Pitcairn</territory>
+ <territory type="PR" draft="unconfirmed">Puerto Rico</territory>
+ <territory type="PS" draft="unconfirmed">Tiriogaeth Palesteina</territory>
+ <territory type="PT" draft="unconfirmed">Portiwgal</territory>
+ <territory type="PW" draft="unconfirmed">Palau</territory>
+ <territory type="PY" draft="unconfirmed">Paraguay</territory>
+ <territory type="QA" draft="unconfirmed">Qatar</territory>
+ <territory type="QO" draft="unconfirmed">Ynysoedd Pellenig y De</territory>
+ <territory type="RE" draft="unconfirmed">Réunion</territory>
+ <territory type="RO" draft="unconfirmed">Rwmania</territory>
+ <territory type="RU" draft="unconfirmed">Rwsia</territory>
+ <territory type="RW" draft="unconfirmed">Rwanda</territory>
+ <territory type="SA" draft="unconfirmed">Sawdi-Arabia</territory>
+ <territory type="SB" draft="unconfirmed">Ynysoedd Solomon</territory>
+ <territory type="SC" draft="unconfirmed">Seychelles</territory>
+ <territory type="SD" draft="unconfirmed">Y Swdan</territory>
+ <territory type="SE" draft="unconfirmed">Sweden</territory>
+ <territory type="SG" draft="unconfirmed">Singapore</territory>
+ <territory type="SH" draft="unconfirmed">Saint Helena</territory>
+ <territory type="SI" draft="unconfirmed">Slofenia</territory>
+ <territory type="SJ" draft="unconfirmed">Svalbard a Jan Mayen</territory>
+ <territory type="SK" draft="unconfirmed">Slofacia</territory>
+ <territory type="SL" draft="unconfirmed">Sierra Leone</territory>
+ <territory type="SM" draft="unconfirmed">San Marino</territory>
+ <territory type="SN" draft="unconfirmed">Senegal</territory>
+ <territory type="SO" draft="unconfirmed">Somalia</territory>
+ <territory type="SR" draft="unconfirmed">Swrinam</territory>
+ <territory type="ST" draft="unconfirmed">Sao Tome a Principe</territory>
+ <territory type="SV" draft="unconfirmed">El Salfador</territory>
+ <territory type="SY" draft="unconfirmed">Syria</territory>
+ <territory type="SZ" draft="unconfirmed">Swaziland</territory>
+ <territory type="TC" draft="unconfirmed">Ynysoedd Turks a Caicos</territory>
+ <territory type="TD" draft="unconfirmed">Chad</territory>
+ <territory type="TF" draft="unconfirmed">Tiriogaethau Ffrengig y De</territory>
+ <territory type="TG" draft="unconfirmed">Togo</territory>
+ <territory type="TH" draft="unconfirmed">Gwlad Thai</territory>
+ <territory type="TJ" draft="unconfirmed">Tajicistan</territory>
+ <territory type="TK" draft="unconfirmed">Tokelau</territory>
+ <territory type="TL" draft="unconfirmed">Timor-Leste</territory>
+ <territory type="TM" draft="unconfirmed">Tyrcmenistan</territory>
+ <territory type="TN" draft="unconfirmed">Tiwnisia</territory>
+ <territory type="TO" draft="unconfirmed">Tonga</territory>
+ <territory type="TR" draft="unconfirmed">Twrci</territory>
+ <territory type="TT" draft="unconfirmed">Trinidad a Thobago</territory>
+ <territory type="TV" draft="unconfirmed">Twfalw</territory>
+ <territory type="TW" draft="unconfirmed">Taiwan</territory>
+ <territory type="TZ" draft="unconfirmed">Tansanïa</territory>
+ <territory type="UA" draft="unconfirmed">Wcráin</territory>
+ <territory type="UG" draft="unconfirmed">Uganda</territory>
+ <territory type="UM" draft="unconfirmed">Mân Ynysoedd Pellenig yr Unol Daleithiau</territory>
+ <territory type="US" draft="unconfirmed">Yr Unol Daleithiau</territory>
+ <territory type="UY" draft="unconfirmed">Uruguay</territory>
+ <territory type="UZ" draft="unconfirmed">Wsbecistan</territory>
+ <territory type="VA" draft="unconfirmed">Y Fatican</territory>
+ <territory type="VC" draft="unconfirmed">Saint Vincent a’r Grenadines</territory>
+ <territory type="VE" draft="unconfirmed">Venezuela</territory>
+ <territory type="VG" draft="unconfirmed">Ynysoedd Prydeinig y Wyryf</territory>
+ <territory type="VI" draft="unconfirmed">Ynysoedd Americanaidd y Wyryf</territory>
+ <territory type="VN" draft="unconfirmed">Fietnam</territory>
+ <territory type="VU" draft="unconfirmed">Vanuatu</territory>
+ <territory type="WF" draft="unconfirmed">Wallis a Futuna</territory>
+ <territory type="WS" draft="unconfirmed">Samoa</territory>
+ <territory type="YE" draft="unconfirmed">Yemen</territory>
+ <territory type="YT" draft="unconfirmed">Mayotte</territory>
+ <territory type="ZA" draft="unconfirmed">De Affrica</territory>
+ <territory type="ZM" draft="unconfirmed">Sambia</territory>
+ <territory type="ZW" draft="unconfirmed">Simbabwe</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a á à â ä b c {ch} d {dd} e é è ê ë f {ff} g-i í ì î ï l {ll} m n {ng} o ó ò ô ö p {ph} r {rh} s t {th} u ú ù û ü w ẃ Ạŵ ẅ y ý ỳ ŷ ÿ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[j k q v x z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Ion</month>
+ <month type="2">Chwef</month>
+ <month type="3">Mawrth</month>
+ <month type="4">Ebrill</month>
+ <month type="5">Mai</month>
+ <month type="6">Meh</month>
+ <month type="7">Gorff</month>
+ <month type="8">Awst</month>
+ <month type="9">Medi</month>
+ <month type="10">Hyd</month>
+ <month type="11">Tach</month>
+ <month type="12">Rhag</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Ionawr</month>
+ <month type="2">Chwefror</month>
+ <month type="3">Mawrth</month>
+ <month type="4">Ebrill</month>
+ <month type="5">Mai</month>
+ <month type="6">Mehefin</month>
+ <month type="7">Gorffenaf</month>
+ <month type="8">Awst</month>
+ <month type="9">Medi</month>
+ <month type="10">Hydref</month>
+ <month type="11">Tachwedd</month>
+ <month type="12">Rhagfyr</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">I</month>
+ <month type="2">C</month>
+ <month type="3">M</month>
+ <month type="4">E</month>
+ <month type="5">M</month>
+ <month type="6">M</month>
+ <month type="7">G</month>
+ <month type="8">A</month>
+ <month type="9">M</month>
+ <month type="10">H</month>
+ <month type="11">T</month>
+ <month type="12">R</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Sul</day>
+ <day type="mon">Llun</day>
+ <day type="tue">Maw</day>
+ <day type="wed">Mer</day>
+ <day type="thu">Iau</day>
+ <day type="fri">Gwen</day>
+ <day type="sat">Sad</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Dydd Sul</day>
+ <day type="mon">Dydd Llun</day>
+ <day type="tue">Dydd Mawrth</day>
+ <day type="wed">Dydd Mercher</day>
+ <day type="thu">Dydd Iau</day>
+ <day type="fri">Dydd Gwener</day>
+ <day type="sat">Dydd Sadwrn</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">S</day>
+ <day type="mon">L</day>
+ <day type="tue">M</day>
+ <day type="wed">M</day>
+ <day type="thu">I</day>
+ <day type="fri">G</day>
+ <day type="sat">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">MM-dd</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="yyMMdd" draft="provisional">yy-MM-dd</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="provisional">QQQQ yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HHmm;-HHmm</hourFormat>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity draft="unconfirmed">Pegwn y De</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <exemplarCity draft="unconfirmed">St. John’s</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity draft="unconfirmed">Llundain</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity draft="unconfirmed">Dinas Mecsico</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <exemplarCity draft="unconfirmed">Efrog Newydd</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="provisional">¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="BRL">
+ <displayName>Real Brasil</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>Yuan Renminbi Tseina</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>Ewro</displayName>
+ <symbol>EUR</symbol>
+ </currency>
+ <currency type="GBP">
+ <displayName>Punt Sterling Prydain</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Rwpî India</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>Yen Siapan</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>Rwbl Rwsia</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>Doler yr UDA</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/cy_GB.xml b/libs/Zend/Locale/Data/cy_GB.xml
new file mode 100755
index 0000000000..9c5078fe1f
--- /dev/null
+++ b/libs/Zend/Locale/Data/cy_GB.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.33 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="cy"/>
+ <territory type="GB"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/da.xml b/libs/Zend/Locale/Data/da.xml
new file mode 100755
index 0000000000..4afec54483
--- /dev/null
+++ b/libs/Zend/Locale/Data/da.xml
@@ -0,0 +1,2623 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.68 $"/>
+ <generation date="$Date: 2006/07/11 19:26:43 $"/>
+ <language type="da"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">afar</language>
+ <language type="ab">abkhasisk</language>
+ <language type="ace">achinesisk</language>
+ <language type="ach">acoli</language>
+ <language type="ada">adangme</language>
+ <language type="ady">adyghe</language>
+ <language type="ae">avestan</language>
+ <language type="af">afrikaans</language>
+ <language type="afa" references="R1">afro-asiatisk (øvrige)</language>
+ <language type="afa" references="R1" alt="proposed-u219-1" draft="unconfirmed">afro-asiatisk sprog (annet)</language>
+ <language type="afh">afrihili</language>
+ <language type="ain">ainu</language>
+ <language type="ak">akan</language>
+ <language type="akk">akkadisk</language>
+ <language type="ale" references="R1">aleutisk</language>
+ <language type="ale" references="R1" alt="proposed-u219-1" draft="unconfirmed">aleutisk sprog</language>
+ <language type="alg">algonkiske sprog</language>
+ <language type="alg" alt="proposed-u219-1" draft="unconfirmed">algonkisk sprog</language>
+ <language type="alt" draft="provisional">sydaltaisk</language>
+ <language type="am">amharisk</language>
+ <language type="an">aragonesisk</language>
+ <language type="ang">Angelsaksisk (ca.450-1100)</language>
+ <language type="ang" alt="proposed-u219-1" draft="provisional">angelsaksisk (c:a 450-1100)</language>
+ <language type="apa">apache sprog</language>
+ <language type="ar">arabisk</language>
+ <language type="arc">aramæisk</language>
+ <language type="arn">araukansk</language>
+ <language type="arp">arapaho</language>
+ <language type="art">kunstsprog (øvrige)</language>
+ <language type="art" alt="proposed-u219-1" draft="unconfirmed">kunstsprog (annet)</language>
+ <language type="arw">arawak</language>
+ <language type="as">assamesisk</language>
+ <language type="ast">asturisk</language>
+ <language type="ath" references="R1">athapaskiske sprog</language>
+ <language type="ath" references="R1" alt="proposed-u219-1" draft="unconfirmed">athapaskisk sprog (annet)</language>
+ <language type="aus" references="RP2">australske sprog</language>
+ <language type="aus" references="RP2" alt="proposed-u219-1" draft="unconfirmed">australsk sprog</language>
+ <language type="av" references="RP2">avarisk</language>
+ <language type="av" references="RP2" alt="proposed-u219-1" draft="unconfirmed">avarisk sprog</language>
+ <language type="awa">awadhi</language>
+ <language type="ay">Aymara</language>
+ <language type="ay" alt="proposed-u219-1" draft="provisional">aymara</language>
+ <language type="az">aserbajdsjansk</language>
+ <language type="ba">bashkir</language>
+ <language type="bad">banda</language>
+ <language type="bai" references="R1">bamilekiske sprog</language>
+ <language type="bai" references="R1" alt="proposed-u219-1" draft="unconfirmed">bamilekisk sprog</language>
+ <language type="bal">baluchi</language>
+ <language type="ban">balinesisk</language>
+ <language type="bas">basa</language>
+ <language type="bat" references="RP2">baltiske sprog (øvrige)</language>
+ <language type="bat" references="RP2" alt="proposed-u219-2" draft="unconfirmed">baltisk sprog (annet)</language>
+ <language type="be">hviderussisk</language>
+ <language type="bej">beja</language>
+ <language type="bem">bemba</language>
+ <language type="ber" references="RP2">berberisk</language>
+ <language type="ber" references="RP2" alt="proposed-u219-1" draft="unconfirmed">berberisk sprog</language>
+ <language type="bg">bulgarsk</language>
+ <language type="bh">bihari</language>
+ <language type="bho">bhojpuri</language>
+ <language type="bi">bislama</language>
+ <language type="bik">bikol</language>
+ <language type="bin">bini</language>
+ <language type="bla">Siksika</language>
+ <language type="bla" alt="proposed-u219-1" draft="provisional">siksika</language>
+ <language type="bm">bambara</language>
+ <language type="bn">bengalsk</language>
+ <language type="bnt">bantu</language>
+ <language type="bo">Tibetansk</language>
+ <language type="bo" alt="proposed-u219-1" draft="provisional">tibetansk</language>
+ <language type="br">bretonsk</language>
+ <language type="bra">braj</language>
+ <language type="bs">bosnisk</language>
+ <language type="btk">batak</language>
+ <language type="bua">buriatisk</language>
+ <language type="bug">buginesisk</language>
+ <language type="byn">blin</language>
+ <language type="ca">katalansk</language>
+ <language type="cad">caddo</language>
+ <language type="cai" references="R1">mellemamerikansk indiansk (øvrige)</language>
+ <language type="cai" references="R1" alt="proposed-u219-1" draft="unconfirmed">mellemamerikanske indiansk sprog (annet)</language>
+ <language type="car">caribisk</language>
+ <language type="cau" references="R1">kaukasisk (øvrige)</language>
+ <language type="cau" references="R1" alt="proposed-u219-1" draft="unconfirmed">kaukasisk sprog (annet)</language>
+ <language type="ce">tjetjensk</language>
+ <language type="ceb">cebuano</language>
+ <language type="cel" references="R1">keltisk (øvrige)</language>
+ <language type="cel" references="R1" alt="proposed-u219-1" draft="unconfirmed">keltisk sprog (annet)</language>
+ <language type="ch">chamorro</language>
+ <language type="chb">Chibcha</language>
+ <language type="chb" alt="proposed-u219-1" draft="provisional">chibcha</language>
+ <language type="chg">chagatai</language>
+ <language type="chk">Chuukese</language>
+ <language type="chk" alt="proposed-u219-1" draft="provisional">chuukese</language>
+ <language type="chm">Mari</language>
+ <language type="chm" alt="proposed-u219-1" draft="provisional">mari</language>
+ <language type="chn">Chinook</language>
+ <language type="chn" alt="proposed-u219-1" draft="provisional">chinook</language>
+ <language type="cho">Choctaw</language>
+ <language type="cho" alt="proposed-u219-1" draft="provisional">choctaw</language>
+ <language type="chp">Chipewyan</language>
+ <language type="chp" alt="proposed-u219-1" draft="provisional">chipewyan</language>
+ <language type="chr">cherokee</language>
+ <language type="chy">cheyenne</language>
+ <language type="cmc" references="RP2">chamic sprog</language>
+ <language type="cmc" references="RP2" alt="proposed-u219-1" draft="unconfirmed">chamic sprog</language>
+ <language type="co">Korsikansk</language>
+ <language type="co" alt="proposed-u219-1" draft="provisional">korsikansk</language>
+ <language type="cop">Koptisk</language>
+ <language type="cop" alt="proposed-u219-1" draft="provisional">koptisk</language>
+ <language type="cpe">Kreolsk og pidgin, baseret på engelsk (øvrige)</language>
+ <language type="cpe" references="R1" alt="proposed-u165-1" draft="provisional">kreolsk og pidgin, baseret på engelsk (øvrige)</language>
+ <language type="cpe" alt="proposed-u219-1" draft="unconfirmed">engelsk kreolsk sprog (annet)</language>
+ <language type="cpf">Kreolsk og pidgin, baseret på fransk (øvrige)</language>
+ <language type="cpf" references="R1" alt="proposed-u165-1" draft="provisional">kreolsk og pidgin, baseret på fransk (øvrige)</language>
+ <language type="cpf" alt="proposed-u219-1" draft="unconfirmed">fransk kreolsk sprok (annet)</language>
+ <language type="cpp">Kreolsk og pidgin, baseret på portugisisk (øvrige)</language>
+ <language type="cpp" references="R1" alt="proposed-u165-1" draft="provisional">kreolsk og pidgin, baseret på portugisisk</language>
+ <language type="cpp" alt="proposed-u219-1" draft="unconfirmed">portugisisk kreolsk sprog (annet)</language>
+ <language type="cr">Cree</language>
+ <language type="cr" alt="proposed-u219-1" draft="provisional">cree</language>
+ <language type="crh">Krim-tyrkisk; Krim-tatarisk</language>
+ <language type="crh" alt="proposed-u219-1" draft="provisional">krim-tyrkisk; krim-tatarisk</language>
+ <language type="crp">Kreolsk og pidgin (øvrige)</language>
+ <language type="crp" references="RP2" alt="proposed-u165-1" draft="provisional">kreolsk og pidgin (øvrige)</language>
+ <language type="crp" alt="proposed-u219-1" draft="unconfirmed">kreolsk sprog (annet)</language>
+ <language type="cs">Tjekkisk</language>
+ <language type="cs" alt="proposed-u219-1" draft="provisional">tjekkisk</language>
+ <language type="csb">Kashubian</language>
+ <language type="csb" alt="proposed-u219-1" draft="provisional">kashubian</language>
+ <language type="cu">Kirkeslavisk</language>
+ <language type="cu" alt="proposed-u219-1" draft="provisional">oldkirkeslavisk</language>
+ <language type="cus">Kusjitiske sprog (øvrige)</language>
+ <language type="cus" references="R1" alt="proposed-u165-1" draft="provisional">kusjitisk (øvrige)</language>
+ <language type="cus" alt="proposed-u219-1" draft="unconfirmed">kusjitisk sprog (annet)</language>
+ <language type="cv">Chuvash</language>
+ <language type="cv" alt="proposed-u219-1" draft="provisional">chuvash</language>
+ <language type="cy">Walisisk</language>
+ <language type="cy" alt="proposed-u219-1" draft="provisional">walisisk</language>
+ <language type="da">Dansk</language>
+ <language type="da" alt="proposed-u219-1" draft="provisional">dansk</language>
+ <language type="dak">Dakota</language>
+ <language type="dak" alt="proposed-u219-1" draft="provisional">dakota</language>
+ <language type="dar">Dargwa</language>
+ <language type="dar" alt="proposed-u219-1" draft="provisional">dargwa</language>
+ <language type="day">Dayak</language>
+ <language type="day" alt="proposed-u219-1" draft="provisional">dayak</language>
+ <language type="de">Tysk</language>
+ <language type="de" alt="proposed-u219-1" draft="provisional">tysk</language>
+ <language type="del">Delaware</language>
+ <language type="del" alt="proposed-u219-1" draft="provisional">delaware</language>
+ <language type="den">Slave (Athapascan)</language>
+ <language type="den" alt="proposed-u219-1" draft="provisional">slavej</language>
+ <language type="dgr">Dogrib</language>
+ <language type="dgr" alt="proposed-u219-1" draft="provisional">dogrib</language>
+ <language type="din">Dinka</language>
+ <language type="din" alt="proposed-u219-1" draft="provisional">dinka</language>
+ <language type="doi">Dogri</language>
+ <language type="doi" alt="proposed-u219-1" draft="provisional">dogri</language>
+ <language type="dra">Dravidiske sprog (øvrige)</language>
+ <language type="dra" references="R1" alt="proposed-u165-1" draft="provisional">dravidisk (øvrige)</language>
+ <language type="dra" alt="proposed-u219-1" draft="unconfirmed">dravidisk sprog (annet)</language>
+ <language type="dsb">Nedre sorbisk</language>
+ <language type="dsb" alt="proposed-u219-1" draft="provisional">nedre sorbisk</language>
+ <language type="dua">Duala</language>
+ <language type="dua" alt="proposed-u219-1" draft="provisional">duala</language>
+ <language type="dum">Hollandsk (ca. 1050-1350)</language>
+ <language type="dum" alt="proposed-u219-1" draft="provisional">middelhollandsk (c:a 1050-1350)</language>
+ <language type="dv">Divehi</language>
+ <language type="dv" alt="proposed-u219-1" draft="provisional">divehi</language>
+ <language type="dyu">Dyula</language>
+ <language type="dyu" alt="proposed-u219-1" draft="provisional">dyula</language>
+ <language type="dz">Dzongkha</language>
+ <language type="dz" alt="proposed-u219-1" draft="provisional">dzongkha</language>
+ <language type="ee">Ewe</language>
+ <language type="ee" alt="proposed-u219-1" draft="provisional">ewe</language>
+ <language type="efi">Efik</language>
+ <language type="efi" alt="proposed-u219-1" draft="provisional">efik</language>
+ <language type="egy">Egyptisk (oldtid)</language>
+ <language type="egy" alt="proposed-u219-1" draft="provisional">oldegyptisk</language>
+ <language type="eka">Ekajuk</language>
+ <language type="eka" alt="proposed-u219-1" draft="provisional">ekajuk</language>
+ <language type="el">Græsk</language>
+ <language type="el" alt="proposed-u219-1" draft="provisional">græsk</language>
+ <language type="elx">Elamitisk</language>
+ <language type="elx" alt="proposed-u219-1" draft="provisional">elamitisk</language>
+ <language type="en">Engelsk</language>
+ <language type="en" alt="proposed-u219-1" draft="provisional">engelsk</language>
+ <language type="enm">Engelsk, Middel- (1100-1500)</language>
+ <language type="enm" alt="proposed-u219-1" draft="provisional">middelengelsk (1100-1500)</language>
+ <language type="eo">Esperanto</language>
+ <language type="eo" alt="proposed-u219-1" draft="provisional">esperanto</language>
+ <language type="es">Spansk</language>
+ <language type="es" alt="proposed-u219-1" draft="provisional">spansk</language>
+ <language type="et">Estisk</language>
+ <language type="et" alt="proposed-u219-1" draft="provisional">estisk</language>
+ <language type="eu">baskisk</language>
+ <language type="ewo">Ewondo</language>
+ <language type="ewo" alt="proposed-u219-1" draft="provisional">ewondo</language>
+ <language type="fa">Persisk</language>
+ <language type="fa" alt="proposed-u219-1" draft="provisional">persisk</language>
+ <language type="fan">Fang</language>
+ <language type="fan" alt="proposed-u219-1" draft="provisional">fang</language>
+ <language type="fat">Fanti</language>
+ <language type="fat" alt="proposed-u219-1" draft="provisional">fanti</language>
+ <language type="ff">Fulah</language>
+ <language type="ff" alt="proposed-u219-1" draft="provisional">fulah</language>
+ <language type="fi">Finsk</language>
+ <language type="fi" alt="proposed-u219-1" draft="provisional">finsk</language>
+ <language type="fil" draft="provisional">filippinsk</language>
+ <language type="fiu">Finsk-ugriske sprog (øvrige)</language>
+ <language type="fiu" references="R1" alt="proposed-u165-1" draft="provisional">finsk-ugrisk (øvrige)</language>
+ <language type="fiu" alt="proposed-u219-1" draft="unconfirmed">finsk-ugrisk sprog (annet)</language>
+ <language type="fj">Fijian</language>
+ <language type="fj" alt="proposed-u219-1" draft="provisional">fijian</language>
+ <language type="fo">Færøsk</language>
+ <language type="fo" alt="proposed-u219-1" draft="provisional">færøsk</language>
+ <language type="fon">Fon</language>
+ <language type="fon" alt="proposed-u219-1" draft="provisional">fon</language>
+ <language type="fr">Fransk</language>
+ <language type="fr" alt="proposed-u219-1" draft="provisional">fransk</language>
+ <language type="frm">Fransk, Middel- (ca.1400-1600)</language>
+ <language type="frm" alt="proposed-u219-1" draft="provisional">middelfransk (c:a 1400-1600)</language>
+ <language type="fro">Fransk, Old- (842-ca.1400)</language>
+ <language type="fro" alt="proposed-u219-1" draft="provisional">oldfransk (c:a 842-1400)</language>
+ <language type="fur">Friulian</language>
+ <language type="fur" alt="proposed-u219-1" draft="provisional">friulian</language>
+ <language type="fy">Frisisk</language>
+ <language type="fy" alt="proposed-u219-1" draft="provisional">vestfrisisk</language>
+ <language type="ga">Irsk</language>
+ <language type="ga" alt="proposed-u219-1" draft="provisional">irsk</language>
+ <language type="gaa">Ga</language>
+ <language type="gaa" alt="proposed-u219-1" draft="provisional">gã</language>
+ <language type="gay">Gayo</language>
+ <language type="gay" alt="proposed-u219-1" draft="provisional">gayo</language>
+ <language type="gba">Gbaya</language>
+ <language type="gba" alt="proposed-u219-1" draft="provisional">gbaya</language>
+ <language type="gd">Gælisk (skotsk)</language>
+ <language type="gd" alt="proposed-u219-1" draft="provisional">gælisk (skotsk)</language>
+ <language type="gem">Germanske sprog (øvrige)</language>
+ <language type="gem" references="R1" alt="proposed-u165-1" draft="provisional">germansk (øvrige)</language>
+ <language type="gem" alt="proposed-u219-1" draft="unconfirmed">germansk sprog (annet)</language>
+ <language type="gez">Geez</language>
+ <language type="gez" alt="proposed-u219-1" draft="provisional">etiopisk</language>
+ <language type="gil">Gilbertesisk</language>
+ <language type="gil" alt="proposed-u219-1" draft="provisional">gilbertesisk</language>
+ <language type="gl">Galicisk</language>
+ <language type="gl" alt="proposed-u219-1" draft="provisional">galicisk</language>
+ <language type="gmh">Tysk, Middelhøj- (ca.1050-1500)</language>
+ <language type="gmh" alt="proposed-u219-1" draft="provisional">middelhøjtysk (c:a 1050-1500)</language>
+ <language type="gn">Guarani</language>
+ <language type="gn" alt="proposed-u219-1" draft="provisional">guaraní</language>
+ <language type="goh">Tysk, Oldhøj- (ca.750-1050)</language>
+ <language type="goh" alt="proposed-u219-1" draft="provisional">oldhøjtysk (c:a 750-1050)</language>
+ <language type="gon">Gondi</language>
+ <language type="gon" alt="proposed-u219-1" draft="provisional">gondi</language>
+ <language type="gor">Gorontalo</language>
+ <language type="gor" alt="proposed-u219-1" draft="provisional">gorontalo</language>
+ <language type="got">Gotisk</language>
+ <language type="got" alt="proposed-u219-1" draft="provisional">gotisk</language>
+ <language type="grb">Grebo</language>
+ <language type="grb" alt="proposed-u219-1" draft="provisional">grebo</language>
+ <language type="grc">oldgræsk (til 1453)</language>
+ <language type="gu">Gujaratisk</language>
+ <language type="gu" alt="proposed-u219-1" draft="provisional">gujaratisk</language>
+ <language type="gv">Manx</language>
+ <language type="gv" alt="proposed-u219-1" draft="provisional">manx</language>
+ <language type="gwi">Gwichʼin</language>
+ <language type="gwi" alt="proposed-u219-1" draft="provisional">gwichin</language>
+ <language type="ha">Hausa</language>
+ <language type="ha" alt="proposed-u219-1" draft="provisional">hausa</language>
+ <language type="hai">Haida</language>
+ <language type="hai" alt="proposed-u219-1" draft="provisional">haida</language>
+ <language type="haw">Hawaiiansk</language>
+ <language type="haw" alt="proposed-u219-1" draft="provisional">hawaiiansk</language>
+ <language type="he">Hebraisk</language>
+ <language type="he" alt="proposed-u219-1" draft="provisional">hebraisk</language>
+ <language type="hi">Hindi</language>
+ <language type="hi" alt="proposed-u219-1" draft="provisional">hindi</language>
+ <language type="hil">Hiligaynon</language>
+ <language type="hil" alt="proposed-u219-1" draft="provisional">hiligaynon</language>
+ <language type="him">Himachali</language>
+ <language type="him" alt="proposed-u219-1" draft="provisional">himachali</language>
+ <language type="hit">Hittitisk</language>
+ <language type="hit" alt="proposed-u219-1" draft="provisional">hittitisk</language>
+ <language type="hmn">Hmong</language>
+ <language type="hmn" alt="proposed-u219-1" draft="provisional">hmong</language>
+ <language type="ho">Hiri Motu</language>
+ <language type="ho" alt="proposed-u219-1" draft="provisional">hirimotu</language>
+ <language type="hr">Kroatisk</language>
+ <language type="hr" alt="proposed-u219-1" draft="provisional">kroatisk</language>
+ <language type="hsb">Øvre sorbisk</language>
+ <language type="hsb" alt="proposed-u219-1" draft="provisional">øvre sorbisk</language>
+ <language type="ht">Haitisk</language>
+ <language type="ht" alt="proposed-u219-1" draft="provisional">haitisk</language>
+ <language type="hu">Ungarsk</language>
+ <language type="hu" alt="proposed-u219-1" draft="provisional">ungarsk</language>
+ <language type="hup">Hupa</language>
+ <language type="hup" alt="proposed-u219-1" draft="provisional">hupa</language>
+ <language type="hy">armensk</language>
+ <language type="hz">Herero</language>
+ <language type="hz" alt="proposed-u219-1" draft="provisional">herero</language>
+ <language type="ia">Interlingua</language>
+ <language type="ia" alt="proposed-u219-1" draft="provisional">interlingua</language>
+ <language type="iba">Iban</language>
+ <language type="iba" alt="proposed-u219-1" draft="provisional">iban</language>
+ <language type="id">Indonesisk</language>
+ <language type="id" alt="proposed-u219-1" draft="provisional">indonesisk</language>
+ <language type="ie">Interlingue</language>
+ <language type="ie" alt="proposed-u219-1" draft="provisional">interlingue</language>
+ <language type="ig">Igbo</language>
+ <language type="ig" alt="proposed-u219-1" draft="provisional">igbo</language>
+ <language type="ii">Sichuan Yi</language>
+ <language type="ii" alt="proposed-u219-1" draft="provisional">sichuan yi</language>
+ <language type="ijo">Ijo</language>
+ <language type="ijo" alt="proposed-u219-1" draft="provisional">ijo</language>
+ <language type="ik">Inupiaq</language>
+ <language type="ik" alt="proposed-u219-1" draft="provisional">inupiaq</language>
+ <language type="ilo">Iloko</language>
+ <language type="ilo" alt="proposed-u219-1" draft="provisional">iloko</language>
+ <language type="inc">Indiske sprog (øvrige)</language>
+ <language type="inc" references="R1" alt="proposed-u165-1" draft="provisional">indisk (øvrige)</language>
+ <language type="inc" alt="proposed-u219-1" draft="unconfirmed">indisk sprog (annet)</language>
+ <language type="ine">Indoeuropæiske sprog (øvrige)</language>
+ <language type="ine" references="R1" alt="proposed-u165-1" draft="provisional">indoeuropæisk (øvrige)</language>
+ <language type="ine" alt="proposed-u219-1" draft="unconfirmed">indo-europæisk sprog (annet)</language>
+ <language type="inh">Ingush</language>
+ <language type="inh" alt="proposed-u219-1" draft="provisional">ingush</language>
+ <language type="io">Ido</language>
+ <language type="io" alt="proposed-u219-1" draft="provisional">ido</language>
+ <language type="ira">Iranske sprog (øvrige)</language>
+ <language type="ira" references="R1" alt="proposed-u165-1" draft="provisional">iransk (øvrige)</language>
+ <language type="ira" alt="proposed-u219-1" draft="unconfirmed">iransk sprog (annet)</language>
+ <language type="iro">Irokesiske sprog</language>
+ <language type="iro" references="R1" alt="proposed-u165-1" draft="provisional">irokesiske sprog</language>
+ <language type="iro" alt="proposed-u219-1" draft="unconfirmed">irokesisk sprog</language>
+ <language type="is">Islandsk</language>
+ <language type="is" alt="proposed-u219-1" draft="provisional">islandsk</language>
+ <language type="it">Italiensk</language>
+ <language type="it" alt="proposed-u219-1" draft="provisional">italiensk</language>
+ <language type="iu">Inuktitut</language>
+ <language type="iu" alt="proposed-u219-1" draft="provisional">inuktitut</language>
+ <language type="ja">Japansk</language>
+ <language type="ja" alt="proposed-u219-1" draft="provisional">japansk</language>
+ <language type="jbo">Lojban</language>
+ <language type="jbo" alt="proposed-u219-1" draft="provisional">lojban</language>
+ <language type="jpr">Jødisk-persisk</language>
+ <language type="jpr" alt="proposed-u219-1" draft="provisional">jødisk-persisk</language>
+ <language type="jrb">Jødisk-arabisk</language>
+ <language type="jrb" alt="proposed-u219-1" draft="provisional">jødisk-arabisk</language>
+ <language type="jv">Javanesisk</language>
+ <language type="jv" alt="proposed-u219-1" draft="provisional">javanesisk</language>
+ <language type="ka">Georgisk</language>
+ <language type="ka" alt="proposed-u219-1" draft="provisional">georgisk</language>
+ <language type="kaa">Karakalpakisk</language>
+ <language type="kaa" alt="proposed-u219-1" draft="provisional">karakalpakisk</language>
+ <language type="kab">Kabyle</language>
+ <language type="kab" alt="proposed-u219-1" draft="provisional">kabyle</language>
+ <language type="kac">Kachin</language>
+ <language type="kac" alt="proposed-u219-1" draft="provisional">kachin</language>
+ <language type="kam">Kamba</language>
+ <language type="kam" alt="proposed-u219-1" draft="provisional">kamba</language>
+ <language type="kar">Karen</language>
+ <language type="kar" alt="proposed-u219-1" draft="provisional">karen</language>
+ <language type="kaw">Kawi</language>
+ <language type="kaw" alt="proposed-u219-1" draft="provisional">kawi</language>
+ <language type="kbd">Kabardian</language>
+ <language type="kbd" alt="proposed-u219-1" draft="provisional">kabardian</language>
+ <language type="kg">Kongo</language>
+ <language type="kg" alt="proposed-u219-1" draft="provisional">kikongo</language>
+ <language type="kha">Khasi</language>
+ <language type="kha" alt="proposed-u219-1" draft="provisional">khasi</language>
+ <language type="khi">Khoisan (øvrige)</language>
+ <language type="khi" references="R1" alt="proposed-u165-1" draft="provisional">khoisan (øvrige)</language>
+ <language type="khi" alt="proposed-u219-1" draft="unconfirmed">khoisansprog (annet)</language>
+ <language type="kho">Khotanesisk</language>
+ <language type="kho" alt="proposed-u219-1" draft="provisional">khotanesisk</language>
+ <language type="ki">Kikuyu</language>
+ <language type="ki" alt="proposed-u219-1" draft="provisional">kikuyu</language>
+ <language type="kj">Kuanyama</language>
+ <language type="kj" alt="proposed-u219-1" draft="provisional">kuanyama</language>
+ <language type="kk">Kasakhisk</language>
+ <language type="kk" alt="proposed-u219-1" draft="provisional">kasakhisk</language>
+ <language type="kl">Kalaallisut</language>
+ <language type="kl" alt="proposed-u219-1" draft="unconfirmed">grønlansk</language>
+ <language type="km">Khmer</language>
+ <language type="km" alt="proposed-u219-1" draft="provisional">khmer; kambodjansk</language>
+ <language type="kmb">Kimbundu</language>
+ <language type="kmb" alt="proposed-u219-1" draft="provisional">kimbundu</language>
+ <language type="kn">Kannaresisk</language>
+ <language type="kn" alt="proposed-u219-1" draft="provisional">kannaresisk</language>
+ <language type="ko">Koreansk</language>
+ <language type="ko" alt="proposed-u219-1" draft="provisional">koreansk</language>
+ <language type="kok">Konkani</language>
+ <language type="kok" alt="proposed-u219-1" draft="provisional">konkani</language>
+ <language type="kos">Kosraean</language>
+ <language type="kos" alt="proposed-u219-1" draft="provisional">kosraeansk</language>
+ <language type="kpe">Kpelle</language>
+ <language type="kpe" alt="proposed-u219-1" draft="provisional">kpelle</language>
+ <language type="kr">Kanuri</language>
+ <language type="kr" alt="proposed-u219-1" draft="provisional">kanuri</language>
+ <language type="krc">Karachay-Balkar</language>
+ <language type="krc" alt="proposed-u219-1" draft="provisional">karatjai-balkar</language>
+ <language type="kro">Kru</language>
+ <language type="kro" alt="proposed-u219-1" draft="provisional">kru</language>
+ <language type="kru">Kurukh</language>
+ <language type="kru" alt="proposed-u219-1" draft="provisional">kurukh</language>
+ <language type="ks">Kashmiri</language>
+ <language type="ks" alt="proposed-u219-1" draft="provisional">kashmiri</language>
+ <language type="ku">Kurdisk</language>
+ <language type="ku" alt="proposed-u219-1" draft="provisional">kurdisk</language>
+ <language type="kum" draft="provisional">kymyk</language>
+ <language type="kut" draft="provisional">kutenaj</language>
+ <language type="kv" draft="provisional">komi</language>
+ <language type="kw">Cornisk</language>
+ <language type="kw" alt="proposed-u219-1" draft="provisional">cornisk</language>
+ <language type="ky">Kirgisisk</language>
+ <language type="ky" alt="proposed-u219-1" draft="provisional">kirgisisk</language>
+ <language type="la">Latin</language>
+ <language type="la" alt="proposed-u219-1" draft="provisional">latin</language>
+ <language type="lad">Ladino</language>
+ <language type="lad" alt="proposed-u219-1" draft="provisional">ladino</language>
+ <language type="lah">Lahnda</language>
+ <language type="lah" alt="proposed-u219-1" draft="provisional">lahnda</language>
+ <language type="lam">Lamba</language>
+ <language type="lam" alt="proposed-u219-1" draft="provisional">lamba</language>
+ <language type="lb">Luxembourgsk</language>
+ <language type="lb" alt="proposed-u219-1" draft="provisional">luxembourgsk</language>
+ <language type="lez">Lezghian</language>
+ <language type="lez" alt="proposed-u219-1" draft="provisional">lezghian</language>
+ <language type="lg">Ganda</language>
+ <language type="lg" alt="proposed-u219-1" draft="provisional">ganda</language>
+ <language type="li">Limburgsk</language>
+ <language type="li" alt="proposed-u219-1" draft="provisional">limburgsk</language>
+ <language type="ln">Lingala</language>
+ <language type="ln" alt="proposed-u219-1" draft="provisional">lingala</language>
+ <language type="lo">Lao</language>
+ <language type="lo" alt="proposed-u219-1" draft="provisional">laotisk</language>
+ <language type="lol">Mongo</language>
+ <language type="lol" alt="proposed-u219-1" draft="provisional">mongo</language>
+ <language type="loz">Lozi</language>
+ <language type="loz" alt="proposed-u219-1" draft="provisional">lozi</language>
+ <language type="lt">Litauisk</language>
+ <language type="lt" alt="proposed-u219-1" draft="provisional">litauisk</language>
+ <language type="lu">Luba-Katanga</language>
+ <language type="lu" alt="proposed-u219-1" draft="provisional">luba-katanga</language>
+ <language type="lua">Luba-Lulua</language>
+ <language type="lua" alt="proposed-u219-1" draft="provisional">luba-lulua</language>
+ <language type="lui">Luiseno</language>
+ <language type="lui" alt="proposed-u219-1" draft="provisional">luiseño</language>
+ <language type="lun">Lunda</language>
+ <language type="lun" alt="proposed-u219-1" draft="provisional">lunda</language>
+ <language type="luo">Luo</language>
+ <language type="luo" alt="proposed-u219-1" draft="provisional">luo</language>
+ <language type="lus">Lushai</language>
+ <language type="lus" alt="proposed-u219-1" draft="provisional">lushai</language>
+ <language type="lv">Lettisk</language>
+ <language type="lv" alt="proposed-u219-1" draft="provisional">lettisk</language>
+ <language type="mad">Madurese</language>
+ <language type="mad" alt="proposed-u219-1" draft="provisional">maduresisk</language>
+ <language type="mag">Magahi</language>
+ <language type="mag" alt="proposed-u219-1" draft="provisional">magahi</language>
+ <language type="mai">Maithili</language>
+ <language type="mai" alt="proposed-u219-1" draft="provisional">maithili</language>
+ <language type="mak">Makasar</language>
+ <language type="mak" alt="proposed-u219-1" draft="provisional">makasar</language>
+ <language type="man">Mandingo</language>
+ <language type="man" alt="proposed-u219-1" draft="provisional">mandingo</language>
+ <language type="map" references="R1">malajo-polynesisk</language>
+ <language type="map" references="R1" alt="proposed-u219-1" draft="unconfirmed">malajo-polynesisk sprog (annet)</language>
+ <language type="mas">Masai</language>
+ <language type="mas" alt="proposed-u219-1" draft="provisional">masai</language>
+ <language type="mdf">Moksha</language>
+ <language type="mdf" alt="proposed-u219-1" draft="provisional">moksha</language>
+ <language type="mdr">Mandar</language>
+ <language type="mdr" alt="proposed-u219-1" draft="provisional">mandar</language>
+ <language type="men">Mende</language>
+ <language type="men" alt="proposed-u219-1" draft="provisional">mende</language>
+ <language type="mg">Malagasy</language>
+ <language type="mg" alt="proposed-u219-1" draft="provisional">malagasy</language>
+ <language type="mga">Irsk, Middel- (900-1200)</language>
+ <language type="mga" alt="proposed-u219-1" draft="provisional">middelirsk (c:a 900-1200)</language>
+ <language type="mh">Marshallese</language>
+ <language type="mh" alt="proposed-u219-1" draft="provisional">marshallese</language>
+ <language type="mi">Maori</language>
+ <language type="mi" alt="proposed-u219-1" draft="provisional">maori</language>
+ <language type="mic">Micmac</language>
+ <language type="mic" alt="proposed-u219-1" draft="provisional">micmac</language>
+ <language type="min">Minangkabau</language>
+ <language type="min" alt="proposed-u219-1" draft="provisional">minangkabau</language>
+ <language type="mis">Diverse sprog</language>
+ <language type="mis" references="R1" alt="proposed-u165-1" draft="provisional">diverse sprog</language>
+ <language type="mis" alt="proposed-u219-1" draft="unconfirmed">annet sprog</language>
+ <language type="mk">Makedonsk</language>
+ <language type="mk" alt="proposed-u219-1" draft="provisional">makedonsk</language>
+ <language type="mkh">Mon-khmer (øvrige)</language>
+ <language type="mkh" references="R1" alt="proposed-u165-1" draft="provisional">mon-khmer (øvrige)</language>
+ <language type="mkh" alt="proposed-u219-1" draft="unconfirmed">mon-khmer sprog (annet)</language>
+ <language type="ml">Malayalam</language>
+ <language type="ml" alt="proposed-u219-1" draft="provisional">malayalam</language>
+ <language type="mn">Mongolsk</language>
+ <language type="mn" alt="proposed-u219-1" draft="provisional">mongolsk</language>
+ <language type="mnc">Manchu</language>
+ <language type="mnc" alt="proposed-u219-1" draft="provisional">manchu</language>
+ <language type="mni">Manipuri</language>
+ <language type="mni" alt="proposed-u219-1" draft="provisional">manipuri</language>
+ <language type="mno" draft="unconfirmed">manobo sprog</language>
+ <language type="mo">Moldovisk</language>
+ <language type="mo" alt="proposed-u219-1" draft="provisional">moldovisk</language>
+ <language type="moh">Mohawk</language>
+ <language type="moh" alt="proposed-u219-1" draft="provisional">mohawk</language>
+ <language type="mos">Mossi</language>
+ <language type="mos" alt="proposed-u219-1" draft="provisional">mossi</language>
+ <language type="mr">Marathisk</language>
+ <language type="mr" alt="proposed-u219-1" draft="provisional">marathisk</language>
+ <language type="ms">Malay</language>
+ <language type="ms" alt="proposed-u219-1" draft="provisional">malay</language>
+ <language type="mt">Maltesisk</language>
+ <language type="mt" alt="proposed-u219-1" draft="provisional">maltesisk</language>
+ <language type="mul">Flere sprog</language>
+ <language type="mul" alt="proposed-u219-1" draft="provisional">flere sprog</language>
+ <language type="mun">Munda (øvrige)</language>
+ <language type="mun" references="R1" alt="proposed-u165-1" draft="provisional">munda (øvrige)</language>
+ <language type="mun" alt="proposed-u219-1" draft="unconfirmed">mundasprog (annet)</language>
+ <language type="mus">Creek</language>
+ <language type="mus" alt="proposed-u219-1" draft="provisional">creek</language>
+ <language type="mwl" draft="provisional">mirandesisk</language>
+ <language type="mwr">Marwari</language>
+ <language type="mwr" alt="proposed-u219-1" draft="provisional">marwari</language>
+ <language type="my">burmesisk</language>
+ <language type="myn">Maya sprog</language>
+ <language type="myn" references="RP2" alt="proposed-u165-1" draft="provisional">maya sprog</language>
+ <language type="myn" alt="proposed-u219-1" draft="unconfirmed">Mayasprog</language>
+ <language type="myv">Erzya</language>
+ <language type="myv" alt="proposed-u219-1" draft="provisional">erzya</language>
+ <language type="na">Nauru</language>
+ <language type="na" alt="proposed-u219-1" draft="provisional">nausu</language>
+ <language type="nah">Nahuatl</language>
+ <language type="nah" alt="proposed-u219-1" draft="provisional">nahuatl</language>
+ <language type="nai">Nordamerikanske indianske sprog (øvrige)</language>
+ <language type="nai" alt="proposed-u165-1" draft="provisional">nordamerikansk indiansk (øvrige)</language>
+ <language type="nai" alt="proposed-u219-1" draft="unconfirmed">nordamerikansk indiansk sprog (annet)</language>
+ <language type="nap">Neapolitansk</language>
+ <language type="nap" alt="proposed-u219-1" draft="provisional">neapolitansk</language>
+ <language type="nb">Norsk Bokmål</language>
+ <language type="nb" alt="proposed-u219-1" draft="provisional">norsk (bokmål)</language>
+ <language type="nd">Ndebele, Nord</language>
+ <language type="nd" alt="proposed-u219-1" draft="provisional">nordndebele</language>
+ <language type="nds">Nedertysk; nedersachsisk</language>
+ <language type="nds" alt="proposed-u219-1" draft="provisional">nedertysk; nedersachsisk</language>
+ <language type="ne">Nepalesisk</language>
+ <language type="ne" alt="proposed-u219-1" draft="provisional">nepalesisk</language>
+ <language type="new">Newari</language>
+ <language type="new" alt="proposed-u219-1" draft="provisional">newari</language>
+ <language type="ng">Ndonga</language>
+ <language type="ng" alt="proposed-u219-1" draft="provisional">ndonga</language>
+ <language type="nia">Nias</language>
+ <language type="nia" alt="proposed-u219-1" draft="provisional">nias</language>
+ <language type="nic">Niger-Congo sprog (øvrige)</language>
+ <language type="nic" references="R1" alt="proposed-u165-1" draft="provisional">Niger-Congo sprog (øvrige)</language>
+ <language type="nic" alt="proposed-u219-1" draft="unconfirmed">Niger-Congo sprog (annet)</language>
+ <language type="niu">Niuean</language>
+ <language type="niu" alt="proposed-u219-1" draft="provisional">niuansk</language>
+ <language type="nl">Hollandsk</language>
+ <language type="nl" alt="proposed-u219-1" draft="provisional">hollandsk</language>
+ <language type="nn">Nynorsk</language>
+ <language type="nn" alt="proposed-u219-1" draft="provisional">nynorsk</language>
+ <language type="no">Norsk</language>
+ <language type="no" alt="proposed-u219-1" draft="provisional">norsk</language>
+ <language type="nog">Nogai</language>
+ <language type="nog" alt="proposed-u219-1" draft="provisional">nogai</language>
+ <language type="non">Islandsk, Old-</language>
+ <language type="non" alt="proposed-u219-1" draft="provisional">oldislandsk</language>
+ <language type="nr">Ndebele, Syd</language>
+ <language type="nr" alt="proposed-u219-1" draft="provisional">sydndebele</language>
+ <language type="nso">Sotho, Nord</language>
+ <language type="nso" alt="proposed-u219-1" draft="provisional">nordsotho</language>
+ <language type="nub">Nubiske sprog</language>
+ <language type="nub" alt="proposed-u219-1" draft="unconfirmed">nubisk sprog</language>
+ <language type="nv">Navajo</language>
+ <language type="nv" alt="proposed-u219-1" draft="provisional">navajo</language>
+ <language type="nwc" draft="provisional">klassisk newarisk</language>
+ <language type="ny">Nyanja; Chichewa; Chewa</language>
+ <language type="ny" alt="proposed-u219-1" draft="provisional">nyanja; chichewa; chewa</language>
+ <language type="nym">Nyamwezi</language>
+ <language type="nym" alt="proposed-u219-1" draft="provisional">nyamwezi</language>
+ <language type="nyn">Nyankole</language>
+ <language type="nyn" alt="proposed-u219-1" draft="provisional">nyankole</language>
+ <language type="nyo">Nyoro sprog</language>
+ <language type="nyo" alt="proposed-u219-1" draft="provisional">nyoro sprog</language>
+ <language type="nzi">Nzima</language>
+ <language type="nzi" alt="proposed-u219-1" draft="provisional">nzima</language>
+ <language type="oc">Occitansk (efter 1500); Provencalsk</language>
+ <language type="oc" alt="proposed-u219-1" draft="provisional">occitansk (efter 1500); provencalsk</language>
+ <language type="oj">Ojibwa</language>
+ <language type="oj" alt="proposed-u219-1" draft="provisional">ojibwa</language>
+ <language type="om">Oromo</language>
+ <language type="om" alt="proposed-u219-1" draft="provisional">oromo</language>
+ <language type="or">Oriya</language>
+ <language type="or" alt="proposed-u219-1" draft="provisional">oriya</language>
+ <language type="os">Ossetisk</language>
+ <language type="os" alt="proposed-u219-1" draft="provisional">ossetisk</language>
+ <language type="osa">Osage</language>
+ <language type="osa" alt="proposed-u219-1" draft="provisional">osage</language>
+ <language type="ota">Osmannisk (1500-1928)</language>
+ <language type="ota" alt="proposed-u219-1" draft="provisional">osmannisk (1500-1928)</language>
+ <language type="oto">Otomi sprog</language>
+ <language type="oto" alt="proposed-u219-1" draft="provisional">otomi sprog</language>
+ <language type="pa">Punjabi</language>
+ <language type="pa" alt="proposed-u219-1" draft="provisional">punjabi</language>
+ <language type="paa">Papua-australske sprog (øvrige)</language>
+ <language type="paa" references="R1" alt="proposed-u165-1" draft="provisional">papua-australsk (øvrige)</language>
+ <language type="paa" alt="proposed-u219-1" draft="unconfirmed">papua-australsk sprog (annet)</language>
+ <language type="pag">Pangasinan</language>
+ <language type="pag" alt="proposed-u219-1" draft="provisional">pangasinan</language>
+ <language type="pal">Pahlavi</language>
+ <language type="pal" alt="proposed-u219-1" draft="provisional">pahlavi; middelpersisk</language>
+ <language type="pam">Pampanga</language>
+ <language type="pam" alt="proposed-u219-1" draft="provisional">pampanga</language>
+ <language type="pap">Papiamento</language>
+ <language type="pap" alt="proposed-u219-1" draft="provisional">papiamento</language>
+ <language type="pau">Palauansk</language>
+ <language type="pau" alt="proposed-u219-1" draft="provisional">palauansk</language>
+ <language type="peo">Persisk, Old- (ca. 600-400 f. Kr.)</language>
+ <language type="peo" alt="proposed-u219-1" draft="provisional">oldpersisk (c:a 600-400 f.Kr.)</language>
+ <language type="phi">Filippinske sprog (øvrige)</language>
+ <language type="phi" references="R1" alt="proposed-u165-1" draft="provisional">filippinsk (øvrige)</language>
+ <language type="phi" alt="proposed-u219-1" draft="unconfirmed">filippinsk sprog (annet)</language>
+ <language type="phn">Fønikisk</language>
+ <language type="phn" alt="proposed-u219-1" draft="provisional">fønikisk</language>
+ <language type="pi">Pali</language>
+ <language type="pi" alt="proposed-u219-1" draft="provisional">pali</language>
+ <language type="pl">Polsk</language>
+ <language type="pl" alt="proposed-u219-1" draft="provisional">polsk</language>
+ <language type="pon">Ponape</language>
+ <language type="pon" alt="proposed-u219-1" draft="provisional">ponape</language>
+ <language type="pra" draft="provisional">prakrit sprog</language>
+ <language type="pro">Provencalsk (før 1500)</language>
+ <language type="pro" alt="proposed-u219-1" draft="provisional">provencalsk (før 1500)</language>
+ <language type="ps">Pashto (Pushto)</language>
+ <language type="ps" alt="proposed-u219-1" draft="provisional">pashto</language>
+ <language type="pt">Portugisisk</language>
+ <language type="pt" alt="proposed-u219-1" draft="provisional">portugisisk</language>
+ <language type="qu">Quechua</language>
+ <language type="qu" alt="proposed-u219-1" draft="provisional">quechua</language>
+ <language type="raj">Rajasthani</language>
+ <language type="raj" alt="proposed-u219-1" draft="provisional">rajasthanisk</language>
+ <language type="rap">Rapanui</language>
+ <language type="rap" alt="proposed-u219-1" draft="provisional">rapanui</language>
+ <language type="rar">Rarotongan</language>
+ <language type="rar" alt="proposed-u219-1" draft="provisional">rarotongansk</language>
+ <language type="rm">Rætoromansk</language>
+ <language type="rm" alt="proposed-u219-1" draft="provisional">rætoromansk</language>
+ <language type="rn">Rundi</language>
+ <language type="rn" alt="proposed-u219-1" draft="provisional">rundi</language>
+ <language type="ro">Rumænsk</language>
+ <language type="ro" alt="proposed-u219-1" draft="provisional">rumænsk</language>
+ <language type="roa">Romanske sprog (øvrige)</language>
+ <language type="roa" references="R1" alt="proposed-u165-1" draft="provisional">romansk (øvrige)</language>
+ <language type="roa" alt="proposed-u219-1" draft="unconfirmed">romansk sprog (annet)</language>
+ <language type="rom">Romani</language>
+ <language type="rom" alt="proposed-u219-1" draft="provisional">romani</language>
+ <language type="root" draft="provisional">rot</language>
+ <language type="ru">Russisk</language>
+ <language type="ru" alt="proposed-u219-1" draft="provisional">russisk</language>
+ <language type="rup">arumænsk</language>
+ <language type="rw">Kinyarwanda</language>
+ <language type="rw" alt="proposed-u219-1" draft="provisional">kinyarwanda</language>
+ <language type="sa">Sanskrit</language>
+ <language type="sa" alt="proposed-u219-1" draft="provisional">sanskrit</language>
+ <language type="sad">Sandawe</language>
+ <language type="sad" alt="proposed-u219-1" draft="provisional">sandawe</language>
+ <language type="sah">Yakut</language>
+ <language type="sah" alt="proposed-u219-1" draft="provisional">jakut</language>
+ <language type="sai">Sydamerikanske indianske sprog (øvrige)</language>
+ <language type="sai" references="RP2" alt="proposed-u165-1" draft="provisional">sydamerikansk indiansk (øvrige)</language>
+ <language type="sai" alt="proposed-u219-1" draft="unconfirmed">sydamerikansk indiansk sprog (annet)</language>
+ <language type="sal" draft="provisional">salikisk sprog</language>
+ <language type="sam">Samaritansk</language>
+ <language type="sam" alt="proposed-u219-1" draft="provisional">samaritansk</language>
+ <language type="sas">Sasak</language>
+ <language type="sas" alt="proposed-u219-1" draft="provisional">sasak</language>
+ <language type="sat">Santali</language>
+ <language type="sat" alt="proposed-u219-1" draft="provisional">santali</language>
+ <language type="sc">Sardinsk</language>
+ <language type="sc" alt="proposed-u219-1" draft="provisional">sardisk</language>
+ <language type="scn" draft="provisional">siciliansk</language>
+ <language type="sco">Skotsk</language>
+ <language type="sco" alt="proposed-u219-1" draft="provisional">skotsk</language>
+ <language type="sd">Sindhi</language>
+ <language type="sd" alt="proposed-u219-1" draft="provisional">sindhi</language>
+ <language type="se">Nordsamisk</language>
+ <language type="se" alt="proposed-u219-1" draft="provisional">nordsamisk</language>
+ <language type="sel">Selkupisk</language>
+ <language type="sel" alt="proposed-u219-1" draft="provisional">selkupisk</language>
+ <language type="sem">Semitiske sprog (øvrige)</language>
+ <language type="sem" references="RP2" alt="proposed-u165-1" draft="provisional">semitisk (øvrige)</language>
+ <language type="sem" alt="proposed-u219-1" draft="unconfirmed">semitisk sprog (annet)</language>
+ <language type="sg">Sango</language>
+ <language type="sg" alt="proposed-u219-1" draft="provisional">sango</language>
+ <language type="sga">Irsk, Old- (indtil 900)</language>
+ <language type="sga" alt="proposed-u219-1" draft="provisional">oldirsk (indtil 900)</language>
+ <language type="sgn">Tegnsprog</language>
+ <language type="sgn" alt="proposed-u219-1" draft="provisional">tegnsprog</language>
+ <language type="sh">Serbokroatisk</language>
+ <language type="sh" alt="proposed-u219-1" draft="provisional">serbokroatisk</language>
+ <language type="shn">Shan</language>
+ <language type="shn" alt="proposed-u219-1" draft="provisional">shan</language>
+ <language type="si">Singalesisk</language>
+ <language type="si" alt="proposed-u219-1" draft="provisional">singalesisk</language>
+ <language type="sid">Sidamo</language>
+ <language type="sid" alt="proposed-u219-1" draft="provisional">sidamo</language>
+ <language type="sio" draft="provisional">sioux sprog</language>
+ <language type="sit">Sino-tibetanske sprog (øvrige)</language>
+ <language type="sit" references="R1" alt="proposed-u165-1" draft="provisional">sino-tibetansk (øvrige)</language>
+ <language type="sit" alt="proposed-u219-1" draft="unconfirmed">sino-tibetansk sprog (annet)</language>
+ <language type="sk">Slovakisk</language>
+ <language type="sk" alt="proposed-u219-1" draft="provisional">slovakisk</language>
+ <language type="sl">Slovensk</language>
+ <language type="sl" alt="proposed-u219-1" draft="provisional">slovensk</language>
+ <language type="sla">Slaviske sprog (øvrige)</language>
+ <language type="sla" references="R1" alt="proposed-u165-1" draft="provisional">slavisk (øvrige)</language>
+ <language type="sla" alt="proposed-u219-1" draft="unconfirmed">slavisk sprog (annet)</language>
+ <language type="sm">Samoansk</language>
+ <language type="sm" alt="proposed-u219-1" draft="provisional">samoansk</language>
+ <language type="sma">Sydsamisk</language>
+ <language type="sma" alt="proposed-u219-1" draft="provisional">sydsamisk</language>
+ <language type="smi">Samiske sprog (øvrige)</language>
+ <language type="smi" references="RP2" alt="proposed-u165-1" draft="provisional">samiske sprog (øvrige)</language>
+ <language type="smi" alt="proposed-u219-1" draft="unconfirmed">samisk sprog (annet)</language>
+ <language type="smj">Lule Sami</language>
+ <language type="smj" alt="proposed-u219-1" draft="provisional">lule sami</language>
+ <language type="smn">Inari Sami</language>
+ <language type="smn" alt="proposed-u219-1" draft="provisional">inari sami</language>
+ <language type="sms">Skolt Sami</language>
+ <language type="sms" alt="proposed-u219-1" draft="provisional">skolt sami</language>
+ <language type="sn">Shona</language>
+ <language type="sn" alt="proposed-u219-1" draft="provisional">shona</language>
+ <language type="snk">Soninke</language>
+ <language type="snk" alt="proposed-u219-1" draft="provisional">soninke</language>
+ <language type="so">Somalisk</language>
+ <language type="so" alt="proposed-u219-1" draft="provisional">somalisk</language>
+ <language type="sog">Sogdiansk</language>
+ <language type="sog" alt="proposed-u219-1" draft="provisional">sogdiansk</language>
+ <language type="son">Songhai</language>
+ <language type="son" alt="proposed-u219-1" draft="provisional">songhai</language>
+ <language type="sq">albansk</language>
+ <language type="sr">Serbisk</language>
+ <language type="sr" alt="proposed-u219-1" draft="provisional">serbisk</language>
+ <language type="srn" draft="provisional">sranan tongo</language>
+ <language type="srr">Serer</language>
+ <language type="srr" alt="proposed-u219-1" draft="provisional">serer</language>
+ <language type="ss">Swati</language>
+ <language type="ss" alt="proposed-u219-1" draft="provisional">swati</language>
+ <language type="ssa">Afrikanske sprog syd for Sahara (øvrige)</language>
+ <language type="ssa" references="R1" alt="proposed-u165-1" draft="provisional">afrikanske sprog syd for Sahara (øvrige)</language>
+ <language type="ssa" alt="proposed-u219-1" draft="unconfirmed">afrikansk sprog syd for Sahara (annet)</language>
+ <language type="st">Sotho, Southern</language>
+ <language type="st" alt="proposed-u219-1" draft="provisional">sydsotho</language>
+ <language type="su">Sundanesisk</language>
+ <language type="su" alt="proposed-u219-1" draft="provisional">sundanesisk</language>
+ <language type="suk">Sukuma</language>
+ <language type="suk" alt="proposed-u219-1" draft="provisional">sukuma</language>
+ <language type="sus">Susu</language>
+ <language type="sus" alt="proposed-u219-1" draft="provisional">susu</language>
+ <language type="sux">Sumerisk</language>
+ <language type="sux" alt="proposed-u219-1" draft="provisional">sumerisk</language>
+ <language type="sv">Svensk</language>
+ <language type="sv" alt="proposed-u219-1" draft="provisional">svensk</language>
+ <language type="sw">Swahili</language>
+ <language type="sw" alt="proposed-u219-1" draft="provisional">swahili</language>
+ <language type="syr">Syrisk</language>
+ <language type="syr" alt="proposed-u219-1" draft="provisional">syrisk</language>
+ <language type="ta">Tamilsk</language>
+ <language type="ta" alt="proposed-u219-1" draft="provisional">tamilsk</language>
+ <language type="tai">Tai (øvrige)</language>
+ <language type="tai" references="RP2" alt="proposed-u165-1" draft="provisional">tai (øvrige)</language>
+ <language type="tai" alt="proposed-u219-1" draft="unconfirmed">thai sprog (annet)</language>
+ <language type="te">Telugu</language>
+ <language type="te" alt="proposed-u219-1" draft="provisional">telugu</language>
+ <language type="tem">Temne</language>
+ <language type="tem" alt="proposed-u219-1" draft="provisional">temne</language>
+ <language type="ter">Tereno</language>
+ <language type="ter" alt="proposed-u219-1" draft="provisional">tereno</language>
+ <language type="tet">Tetum</language>
+ <language type="tet" alt="proposed-u219-1" draft="provisional">tetum</language>
+ <language type="tg">Tajik</language>
+ <language type="tg" alt="proposed-u219-1" draft="provisional">tajik</language>
+ <language type="th">Thailandsk</language>
+ <language type="th" alt="proposed-u219-1" draft="provisional">thailandsk</language>
+ <language type="ti">Tigrinya</language>
+ <language type="ti" alt="proposed-u219-1" draft="provisional">tigrinya</language>
+ <language type="tig">Tigre</language>
+ <language type="tig" alt="proposed-u219-1" draft="provisional">tigré</language>
+ <language type="tiv">Tivi</language>
+ <language type="tiv" alt="proposed-u219-1" draft="provisional">tivi</language>
+ <language type="tk">Turkmensk</language>
+ <language type="tk" alt="proposed-u219-1" draft="provisional">turkmensk</language>
+ <language type="tkl">Tokelau</language>
+ <language type="tkl" alt="proposed-u219-1" draft="provisional">tokelau</language>
+ <language type="tl">Tagalog</language>
+ <language type="tl" alt="proposed-u219-1" draft="provisional">tagalog</language>
+ <language type="tlh" draft="provisional">klingonsk</language>
+ <language type="tli">Tlingit</language>
+ <language type="tli" alt="proposed-u219-1" draft="provisional">tlingit</language>
+ <language type="tmh">Tamashek</language>
+ <language type="tmh" alt="proposed-u219-1" draft="provisional">tamashek</language>
+ <language type="tn">Tswana</language>
+ <language type="tn" alt="proposed-u219-1" draft="provisional">tswana</language>
+ <language type="to">Tonga (Tongaøerne)</language>
+ <language type="to" alt="proposed-u219-1" draft="provisional">tongansk (Tongaøerne)</language>
+ <language type="tog">Tonga (Nyasa)</language>
+ <language type="tog" alt="proposed-u219-1" draft="provisional">tongansk (Nyasa)</language>
+ <language type="tpi">Tok Pisin</language>
+ <language type="tpi" alt="proposed-u219-1" draft="provisional">tok pisin</language>
+ <language type="tr">Tyrkisk</language>
+ <language type="tr" alt="proposed-u219-1" draft="provisional">tyrkisk</language>
+ <language type="ts">Tsonga</language>
+ <language type="ts" alt="proposed-u219-1" draft="provisional">tsonga</language>
+ <language type="tsi">Tsimshisk</language>
+ <language type="tsi" alt="proposed-u219-1" draft="provisional">tsimshisk</language>
+ <language type="tt">Tatarisk</language>
+ <language type="tt" alt="proposed-u219-1" draft="provisional">tatarisk</language>
+ <language type="tum">Tumbuka</language>
+ <language type="tum" alt="proposed-u219-1" draft="provisional">tumbuka</language>
+ <language type="tup" draft="provisional">tupí sprog</language>
+ <language type="tut">tyrkisk-tatarisk (øvrige)</language>
+ <language type="tut" alt="proposed-u219-1" draft="unconfirmed">tyrkisk-tatarisk sprog (annet)</language>
+ <language type="tvl">Tuvalu</language>
+ <language type="tvl" alt="proposed-u219-1" draft="provisional">tuvalu</language>
+ <language type="tw">Twi</language>
+ <language type="tw" alt="proposed-u219-1" draft="provisional">twi</language>
+ <language type="ty">Tahitiansk</language>
+ <language type="ty" alt="proposed-u219-1" draft="provisional">tahitiansk</language>
+ <language type="tyv">Tuvinian</language>
+ <language type="tyv" alt="proposed-u219-1" draft="provisional">tuvinian</language>
+ <language type="udm">Udmurt</language>
+ <language type="udm" alt="proposed-u219-1" draft="provisional">udmurt</language>
+ <language type="ug">Uigurisk</language>
+ <language type="ug" alt="proposed-u219-1" draft="provisional">uigurisk</language>
+ <language type="uga">Ugaristisk</language>
+ <language type="uga" alt="proposed-u219-1" draft="provisional">ugaristisk</language>
+ <language type="uk">Ukrainsk</language>
+ <language type="uk" alt="proposed-u219-1" draft="provisional">ukrainsk</language>
+ <language type="umb">Umbundu</language>
+ <language type="umb" alt="proposed-u219-1" draft="provisional">umbundu</language>
+ <language type="und">Sproget kan ikke bestemmes</language>
+ <language type="und" references="R1" alt="proposed-u165-1" draft="provisional">sproget kan ikke bestemmes</language>
+ <language type="und" alt="proposed-u219-1" draft="unconfirmed">obestemt sprog</language>
+ <language type="ur">Urdu</language>
+ <language type="ur" alt="proposed-u219-1" draft="provisional">urdu</language>
+ <language type="uz">Usbekisk</language>
+ <language type="uz" alt="proposed-u219-1" draft="provisional">usbekisk</language>
+ <language type="vai">Vai</language>
+ <language type="vai" alt="proposed-u219-1" draft="provisional">vaj</language>
+ <language type="ve">Venda</language>
+ <language type="ve" alt="proposed-u219-1" draft="provisional">venda</language>
+ <language type="vi">Vietnamesisk</language>
+ <language type="vi" alt="proposed-u219-1" draft="provisional">vietnamesisk</language>
+ <language type="vo">Volapük</language>
+ <language type="vo" alt="proposed-u219-1" draft="provisional">volapyk</language>
+ <language type="vot">Votisk</language>
+ <language type="vot" alt="proposed-u219-1" draft="provisional">votisk</language>
+ <language type="wa">Vallonsk</language>
+ <language type="wa" alt="proposed-u219-1" draft="provisional">vallonsk</language>
+ <language type="wak" draft="provisional">wkashansk sprog</language>
+ <language type="wal">Walamo</language>
+ <language type="wal" alt="proposed-u219-1" draft="provisional">walamo</language>
+ <language type="war">Waray</language>
+ <language type="war" alt="proposed-u219-1" draft="provisional">waray</language>
+ <language type="was">Washo</language>
+ <language type="was" alt="proposed-u219-1" draft="provisional">washo</language>
+ <language type="wen">Vendiske sprog</language>
+ <language type="wen" references="RP2" alt="proposed-u165-1" draft="provisional">vendiske sprog</language>
+ <language type="wen" alt="proposed-u219-1" draft="unconfirmed">vendisk sprog</language>
+ <language type="wo">Wolof</language>
+ <language type="wo" alt="proposed-u219-1" draft="provisional">wolof</language>
+ <language type="xal">Kalmyk</language>
+ <language type="xal" alt="proposed-u219-1" draft="provisional">kalmyk</language>
+ <language type="xh">Xhosa</language>
+ <language type="xh" alt="proposed-u219-1" draft="provisional">xhosa</language>
+ <language type="yao">Yao</language>
+ <language type="yao" alt="proposed-u219-1" draft="provisional">yao</language>
+ <language type="yap">Yap</language>
+ <language type="yap" alt="proposed-u219-1" draft="provisional">yap</language>
+ <language type="yi">Jiddisch</language>
+ <language type="yi" alt="proposed-u219-1" draft="provisional">jiddisch</language>
+ <language type="yo">Yoruba</language>
+ <language type="yo" alt="proposed-u219-1" draft="provisional">yoruba</language>
+ <language type="ypk" draft="unconfirmed">yupisk sprog</language>
+ <language type="za">Zhuang</language>
+ <language type="za" alt="proposed-u219-1" draft="provisional">zhuang</language>
+ <language type="zap">Zapotec</language>
+ <language type="zap" alt="proposed-u219-1" draft="provisional">zapotec</language>
+ <language type="zen">Zenaga</language>
+ <language type="zen" alt="proposed-u219-1" draft="provisional">zenaga</language>
+ <language type="zh">Kinesisk</language>
+ <language type="zh" alt="proposed-u219-1" draft="provisional">kinesisk</language>
+ <language type="znd">Zande</language>
+ <language type="znd" alt="proposed-u219-1" draft="provisional">zandé</language>
+ <language type="zu">Zulu</language>
+ <language type="zu" alt="proposed-u219-1" draft="provisional">zulu</language>
+ <language type="zun">Zuni</language>
+ <language type="zun" alt="proposed-u219-1" draft="provisional">zuñi</language>
+ </languages>
+ <scripts>
+ <script type="Arab">Arabisk</script>
+ <script type="Arab" references="R1" alt="proposed-u165-1" draft="provisional">arabisk</script>
+ <script type="Arab" alt="proposed-u219-1" draft="unconfirmed">arabiske</script>
+ <script type="Armn">Armensk</script>
+ <script type="Armn" references="R1" alt="proposed-u165-1" draft="provisional">armensk</script>
+ <script type="Armn" alt="proposed-u219-1" draft="unconfirmed">armenske</script>
+ <script type="Bali" draft="unconfirmed">balinesiske</script>
+ <script type="Batk" draft="provisional">batak</script>
+ <script type="Beng" references="R1" draft="provisional">bengalisk</script>
+ <script type="Blis" draft="provisional">blissymboler</script>
+ <script type="Bopo" draft="provisional">bobomofo</script>
+ <script type="Brah" references="RP2" draft="provisional">bramisk</script>
+ <script type="Brai" draft="provisional">blindskrift</script>
+ <script type="Bugi" references="RP2" draft="provisional">buginesisk</script>
+ <script type="Buhd" draft="provisional">buhid</script>
+ <script type="Cans" draft="unconfirmed">kanadensiske stavelsetegn</script>
+ <script type="Cham" draft="provisional">cham</script>
+ <script type="Cher" draft="provisional">cherokee</script>
+ <script type="Cirt" draft="provisional">cirt</script>
+ <script type="Copt">Koptisk</script>
+ <script type="Copt" references="R1" alt="proposed-u165-1" draft="provisional">koptisk</script>
+ <script type="Copt" alt="proposed-u219-1" draft="unconfirmed">koptiske</script>
+ <script type="Cprt">Cypriotisk</script>
+ <script type="Cprt" references="R1" alt="proposed-u165-1" draft="provisional">cypriotisk</script>
+ <script type="Cprt" alt="proposed-u219-1" draft="unconfirmed">cypriotiske</script>
+ <script type="Cyrl">Kyrillisk</script>
+ <script type="Cyrl" references="R1" alt="proposed-u165-1" draft="provisional">kyrillisk</script>
+ <script type="Cyrl" alt="proposed-u219-1" draft="unconfirmed">kyrilliske</script>
+ <script type="Cyrs" references="R1" draft="provisional">kyrillisk (oldkirkslavisk variant)</script>
+ <script type="Deva">Devanagarisk</script>
+ <script type="Deva" references="R1" alt="proposed-u165-1" draft="provisional">devanagarisk</script>
+ <script type="Deva" alt="proposed-u219-1" draft="unconfirmed">devanagariske</script>
+ <script type="Dsrt" draft="provisional">deseret</script>
+ <script type="Egyd" references="R1" draft="provisional">egyptisk demotisk</script>
+ <script type="Egyh" draft="unconfirmed">hieratiske</script>
+ <script type="Egyp" draft="unconfirmed">egyptiske hieroglyfer</script>
+ <script type="Ethi">Etiopisk</script>
+ <script type="Ethi" references="R1" alt="proposed-u165-1" draft="provisional">etiopisk</script>
+ <script type="Ethi" alt="proposed-u219-1" draft="unconfirmed">etiopiske</script>
+ <script type="Geok" draft="provisional">kutsuri</script>
+ <script type="Geor">Georgisk</script>
+ <script type="Geor" references="RP2" alt="proposed-u165-1" draft="provisional">georgisk</script>
+ <script type="Geor" alt="proposed-u219-1" draft="unconfirmed">georgiske</script>
+ <script type="Glag" references="R1" draft="provisional">glagolitisk</script>
+ <script type="Goth">Gotisk</script>
+ <script type="Goth" references="R1" alt="proposed-u165-1" draft="provisional">gotisk</script>
+ <script type="Goth" alt="proposed-u219-1" draft="unconfirmed">gotiske</script>
+ <script type="Grek">Græsk</script>
+ <script type="Grek" references="RP2" alt="proposed-u165-1" draft="provisional">græsk</script>
+ <script type="Grek" alt="proposed-u219-1" draft="unconfirmed">græske</script>
+ <script type="Gujr" references="R1" draft="provisional">gujarati</script>
+ <script type="Guru" draft="unconfirmed">gurmikiske</script>
+ <script type="Hang" draft="provisional">hangul</script>
+ <script type="Hani" draft="unconfirmed">kinesiske</script>
+ <script type="Hano" draft="provisional">hanunå</script>
+ <script type="Hans">Forenklet Han</script>
+ <script type="Hans" references="R1" alt="proposed-u165-1" draft="provisional">forenklet kinesisk</script>
+ <script type="Hans" alt="proposed-u219-1" draft="unconfirmed">forenklet kinesiske</script>
+ <script type="Hant">Traditionelt Han</script>
+ <script type="Hant" references="R1" alt="proposed-u165-1" draft="provisional">traditionelt kinesisk</script>
+ <script type="Hant" alt="proposed-u219-1" draft="unconfirmed">traditionel kinesiske</script>
+ <script type="Hebr">Hebraisk</script>
+ <script type="Hebr" references="RP2" alt="proposed-u165-1" draft="provisional">hebraisk</script>
+ <script type="Hebr" alt="proposed-u219-1" draft="unconfirmed">hebraiske</script>
+ <script type="Hira" draft="provisional">hiragana</script>
+ <script type="Hmng" draft="provisional">pahaw mong</script>
+ <script type="Hrkt" draft="provisional">katakana/hiragana</script>
+ <script type="Hung" draft="unconfirmed">oldungerske</script>
+ <script type="Inds" draft="provisional">indus</script>
+ <script type="Ital">Olditalisk</script>
+ <script type="Ital" references="RP2" alt="proposed-u165-1" draft="provisional">olditalisk</script>
+ <script type="Ital" alt="proposed-u219-2" draft="unconfirmed">olditaliske</script>
+ <script type="Java" references="RP2" draft="provisional">javanesisk</script>
+ <script type="Kali" draft="provisional">kaya li</script>
+ <script type="Kana" draft="provisional">katakana</script>
+ <script type="Khar" draft="provisional">kharoshti</script>
+ <script type="Khmr" draft="unconfirmed">khmeriske</script>
+ <script type="Knda" draft="provisional">kannada</script>
+ <script type="Laoo" references="R1" draft="provisional">laotisk</script>
+ <script type="Latf" references="R1" draft="provisional">latinsk (frakturvariant)</script>
+ <script type="Latg" draft="unconfirmed">latinske (gaelisk variant)</script>
+ <script type="Latn">Latinsk</script>
+ <script type="Latn" references="R1" alt="proposed-u165-1" draft="provisional">latinsk</script>
+ <script type="Latn" alt="proposed-u219-1" draft="unconfirmed">latinske</script>
+ <script type="Lepc" draft="provisional">rong</script>
+ <script type="Limb" draft="provisional">limbu</script>
+ <script type="Lina" references="R1" draft="provisional">lineær A</script>
+ <script type="Linb" draft="unconfirmed">linjær B</script>
+ <script type="Mand" references="R1" draft="provisional">mandaeisk</script>
+ <script type="Maya" draft="provisional">maya hieroglyfer</script>
+ <script type="Mero" draft="unconfirmed">meriotiske</script>
+ <script type="Mlym" draft="provisional">malayalam</script>
+ <script type="Mong">Mongolsk</script>
+ <script type="Mong" references="R1" alt="proposed-u165-1" draft="provisional">mongolsk</script>
+ <script type="Mong" alt="proposed-u219-1" draft="unconfirmed">mongolske</script>
+ <script type="Mymr" draft="unconfirmed">burmesiske</script>
+ <script type="Nkoo" draft="provisional">nkå</script>
+ <script type="Ogam" draft="provisional">ogham</script>
+ <script type="Orkh" draft="provisional">orkon</script>
+ <script type="Orya" draft="provisional">oriya</script>
+ <script type="Osma" references="R1" draft="provisional">osmansk</script>
+ <script type="Perm" references="R1" draft="provisional">oldpermisk</script>
+ <script type="Phag" draft="provisional">phags-pa</script>
+ <script type="Phnx" references="R1" draft="provisional">fønikisk</script>
+ <script type="Plrd" references="R1" draft="provisional">pollardtegn</script>
+ <script type="Qaai" draft="unconfirmed">arvet</script>
+ <script type="Roro" draft="provisional">rongo-rongo</script>
+ <script type="Runr">Runer</script>
+ <script type="Runr" alt="proposed-u219-1" draft="provisional">runer</script>
+ <script type="Sara" draft="provisional">sarati</script>
+ <script type="Shaw" references="R1" draft="provisional">shawiske tegn</script>
+ <script type="Sinh">Singalesisk</script>
+ <script type="Sinh" references="R1" alt="proposed-u165-1" draft="provisional">singalesisk</script>
+ <script type="Sinh" alt="proposed-u219-1" draft="unconfirmed">singalesiske</script>
+ <script type="Sylo" draft="provisional">syloti nagri</script>
+ <script type="Syrc">Syrisk</script>
+ <script type="Syrc" references="R1" alt="proposed-u165-1" draft="provisional">syrisk</script>
+ <script type="Syrc" alt="proposed-u219-1" draft="unconfirmed">syriske</script>
+ <script type="Syre" references="R1" draft="provisional">syrisk (estrangelovariant)</script>
+ <script type="Syrj" draft="unconfirmed">syriske (vestlig variant))</script>
+ <script type="Syrn" draft="provisional">syrisk (østlig variant)</script>
+ <script type="Tagb" draft="provisional">tagbanwa</script>
+ <script type="Tale" draft="provisional">tai le</script>
+ <script type="Talu" draft="provisional">tai lue</script>
+ <script type="Taml">Tamilsk</script>
+ <script type="Taml" references="R1" alt="proposed-u165-1" draft="provisional">tamilsk</script>
+ <script type="Taml" alt="proposed-u219-1" draft="unconfirmed">tamilske</script>
+ <script type="Telu" draft="provisional">telugu</script>
+ <script type="Teng" draft="provisional">tengwar</script>
+ <script type="Tfng" draft="provisional">tifinagh</script>
+ <script type="Tglg" draft="provisional">tagalog</script>
+ <script type="Thaa" draft="provisional">thaana</script>
+ <script type="Thai" references="R1" draft="provisional">thailandsk</script>
+ <script type="Tibt">Tibetansk</script>
+ <script type="Tibt" references="R1" alt="proposed-u165-1" draft="provisional">tibetansk</script>
+ <script type="Tibt" alt="proposed-u219-1" draft="unconfirmed">tibetanske</script>
+ <script type="Ugar">Ugaritisk</script>
+ <script type="Ugar" alt="proposed-u165-1" draft="provisional">ugaritisk</script>
+ <script type="Ugar" alt="proposed-u219-1" draft="unconfirmed">egaritiske</script>
+ <script type="Vaii" draft="provisional">vaj</script>
+ <script type="Visp" draft="unconfirmed">synligt tal</script>
+ <script type="Xpeo" references="RP2" draft="provisional">oldpersisk</script>
+ <script type="Xsux" draft="provisional">sumero-akkadisk cuneiform</script>
+ <script type="Yiii" draft="provisional">yi</script>
+ <script type="Zxxx" draft="provisional">uskrevet sprog</script>
+ <script type="Zyyy">Ukendt</script>
+ <script type="Zyyy" references="R1" alt="proposed-u165-1" draft="provisional">fælles</script>
+ <script type="Zyyy" alt="proposed-u219-1" draft="unconfirmed">gemensamme</script>
+ <script type="Zzzz" references="R1" draft="provisional">ukodet instruks</script>
+ </scripts>
+ <territories>
+ <territory type="001" draft="provisional">verden</territory>
+ <territory type="002" draft="provisional">Afrika</territory>
+ <territory type="005" draft="provisional">Sydamerika</territory>
+ <territory type="009" draft="provisional">Oceanien</territory>
+ <territory type="011" draft="provisional">vestlige Afrika</territory>
+ <territory type="013" draft="provisional">Centralamerika</territory>
+ <territory type="014" draft="provisional">østlige Afrika</territory>
+ <territory type="015" draft="provisional">nordlige Afrika</territory>
+ <territory type="017" draft="unconfirmed">centrale Afrika</territory>
+ <territory type="018" draft="provisional">sydlige Afrika</territory>
+ <territory type="019" draft="provisional">Amerika</territory>
+ <territory type="021" draft="unconfirmed">nordamerika</territory>
+ <territory type="029" draft="provisional">Caribien</territory>
+ <territory type="030" draft="unconfirmed">østasien</territory>
+ <territory type="034" draft="unconfirmed">sydasien</territory>
+ <territory type="035" draft="provisional">Sydøstasien</territory>
+ <territory type="039" draft="provisional">Sydeuropa</territory>
+ <territory type="053" draft="provisional">Australien og New Zealand</territory>
+ <territory type="054" draft="provisional">Melanesien</territory>
+ <territory type="057" draft="provisional">Mikronesien</territory>
+ <territory type="061" draft="provisional">Polynesien</territory>
+ <territory type="142" draft="provisional">Asien</territory>
+ <territory type="143" draft="provisional">Centralasien</territory>
+ <territory type="145" draft="unconfirmed">vestasien</territory>
+ <territory type="150" draft="provisional">Europa</territory>
+ <territory type="151" draft="unconfirmed">østeuropa</territory>
+ <territory type="154" draft="unconfirmed">nordeuropa</territory>
+ <territory type="155" draft="unconfirmed">vesteuropa</territory>
+ <territory type="172" draft="provisional">Sammenslutningen af uafhængige stater</territory>
+ <territory type="419" draft="provisional">Sydamerika og Caribien</territory>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Forenede Arabiske Emirater</territory>
+ <territory type="AF">Afghanistan</territory>
+ <territory type="AG">Antigua og Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albanien</territory>
+ <territory type="AM">Armenien</territory>
+ <territory type="AN">Hollandske Antiller</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktis</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">Amerikansk Samoa</territory>
+ <territory type="AT">Østrig</territory>
+ <territory type="AU">Australien</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX" draft="provisional">Ã…land</territory>
+ <territory type="AZ">Aserbajdsjan</territory>
+ <territory type="BA">Bosnien-Hercegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BE">Belgien</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgarien</territory>
+ <territory type="BH">Bahrain</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei Darussalam</territory>
+ <territory type="BO">Bolivia</territory>
+ <territory type="BR">Brasilien</territory>
+ <territory type="BS">Bahamas</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BV">Bouvetø</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Hviderusland</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Canada</territory>
+ <territory type="CC">Cocos-øerne (Keelingøerne)</territory>
+ <territory type="CD">Den Demokratiske Republik Congo</territory>
+ <territory type="CD" alt="proposed-u219-1" draft="provisional">Congo-Kinshasa</territory>
+ <territory type="CF">Centralafrikanske Republik</territory>
+ <territory type="CF" alt="proposed-u219-1" draft="unconfirmed">Centralafrikanske republik</territory>
+ <territory type="CG">Congo</territory>
+ <territory type="CG" alt="proposed-u219-1" draft="provisional">Congo-Brazzaville</territory>
+ <territory type="CH">Schweiz</territory>
+ <territory type="CI">Elfenbenskysten</territory>
+ <territory type="CK">Cook-øerne</territory>
+ <territory type="CL">Chile</territory>
+ <territory type="CM">Cameroun</territory>
+ <territory type="CN">Kina</territory>
+ <territory type="CO">Colombia</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS">Serbien og Montenegro</territory>
+ <territory type="CU">Cuba</territory>
+ <territory type="CV">Kap Verde</territory>
+ <territory type="CX">Juleøen</territory>
+ <territory type="CY">Cypern</territory>
+ <territory type="CZ">Tjekkiet</territory>
+ <territory type="DE">Tyskland</territory>
+ <territory type="DJ">Djibouti</territory>
+ <territory type="DK">Danmark</territory>
+ <territory type="DM">Dominica</territory>
+ <territory type="DO">Den Dominikanske Republik</territory>
+ <territory type="DZ">Algeriet</territory>
+ <territory type="EC">Ecuador</territory>
+ <territory type="EE">Estland</territory>
+ <territory type="EG">Egypten</territory>
+ <territory type="EH">Vestsahara</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Spanien</territory>
+ <territory type="ET">Etiopien</territory>
+ <territory type="FI">Finland</territory>
+ <territory type="FJ">Fiji-øerne</territory>
+ <territory type="FK">Falklandsøerne</territory>
+ <territory type="FM">Mikronesiens Forenede Stater</territory>
+ <territory type="FO">Færøerne</territory>
+ <territory type="FR">Frankrig</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Storbritannien</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Georgien</territory>
+ <territory type="GF">Fransk Guyana</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Grønland</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Ækvatorialguinea</territory>
+ <territory type="GR">Grækenland</territory>
+ <territory type="GS">South Georgia og De Sydlige Sandwichøer</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinea-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">SAR Hongkong</territory>
+ <territory type="HM">Heard- og McDonald-øerne</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Kroatien</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Ungarn</territory>
+ <territory type="ID">Indonesien</territory>
+ <territory type="IE">Irland</territory>
+ <territory type="IL">Israel</territory>
+ <territory type="IN">Indien</territory>
+ <territory type="IO">Det Britiske Territorium i Det Indiske Ocean</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Island</territory>
+ <territory type="IT">Italien</territory>
+ <territory type="JM">Jamaica</territory>
+ <territory type="JO">Jordan</territory>
+ <territory type="JP">Japan</territory>
+ <territory type="KE">Kenya</territory>
+ <territory type="KG">Kirgisistan</territory>
+ <territory type="KH">Cambodja</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Comorerne</territory>
+ <territory type="KN">Saint Kitts og Nevis</territory>
+ <territory type="KP">Nordkorea</territory>
+ <territory type="KR">Sydkorea</territory>
+ <territory type="KW">Kuwait</territory>
+ <territory type="KY">Caymanøerne</territory>
+ <territory type="KZ">Kasakhstan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Libanon</territory>
+ <territory type="LC">Saint Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberia</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Litauen</territory>
+ <territory type="LU">Luxembourg</territory>
+ <territory type="LV">Letland</territory>
+ <territory type="LY">Libyen</territory>
+ <territory type="MA">Marokko</territory>
+ <territory type="MC">Monaco</territory>
+ <territory type="MD">Republikken Moldova</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshalløerne</territory>
+ <territory type="MK">Republikken Makedonien</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongoliet</territory>
+ <territory type="MO">SAR Macao</territory>
+ <territory type="MP">Nordmarianerne</territory>
+ <territory type="MQ">Martinique</territory>
+ <territory type="MR">Mauretanien</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Maldiverne</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Mexico</territory>
+ <territory type="MY">Malaysia</territory>
+ <territory type="MZ">Mozambique</territory>
+ <territory type="NA">Namibia</territory>
+ <territory type="NC">Ny Caledonien</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Norfolk Island</territory>
+ <territory type="NG">Nigeria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Holland</territory>
+ <territory type="NO">Norge</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">New Zealand</territory>
+ <territory type="NZ" alt="proposed-u219-1" draft="unconfirmed">Ny Zeeland</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Fransk Polynesien</territory>
+ <territory type="PG">Papua Ny Guinea</territory>
+ <territory type="PH">Filippinerne</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Polen</territory>
+ <territory type="PM">Saint Pierre og Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Puerto Rico</territory>
+ <territory type="PS">De palæstinensiske områder</territory>
+ <territory type="PT">Portugal</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Qatar</territory>
+ <territory type="QO" draft="unconfirmed">yttre Oceania</territory>
+ <territory type="RE">Reunion</territory>
+ <territory type="RO">Rumænien</territory>
+ <territory type="RU">Rusland</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Saudi-Arabien</territory>
+ <territory type="SB">Salomonøerne</territory>
+ <territory type="SC">Seychellerne</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Sverige</territory>
+ <territory type="SG">Singapore</territory>
+ <territory type="SH">St. Helena</territory>
+ <territory type="SH" alt="proposed-u219-1" draft="unconfirmed">S:t Helena</territory>
+ <territory type="SI">Slovenien</territory>
+ <territory type="SJ">Svalbard og Jan Mayen</territory>
+ <territory type="SK">Slovakiet</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalia</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">São Tomé og Príncipe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Syrien</territory>
+ <territory type="SZ">Swaziland</territory>
+ <territory type="TC">Turks- og Caicosøerne</territory>
+ <territory type="TD">Tchad</territory>
+ <territory type="TF">Franske Besiddelser i Det Sydlige Indiske Ocean</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Thailand</territory>
+ <territory type="TJ">Tadsjikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Timor-Leste</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunesien</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Tyrkiet</territory>
+ <territory type="TT">Trinidad og Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TZ">Tanzania</territory>
+ <territory type="UA">Ukraine</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">De Mindre Amerikanske Oversøiske Øer</territory>
+ <territory type="US">USA</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Usbekistan</territory>
+ <territory type="VA">Vatikanstaten</territory>
+ <territory type="VC">St. Vincent og Grenadinerne</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">De britiske jomfruøer</territory>
+ <territory type="VI">De amerikanske jomfruøer</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis og Futunaøerne</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Yemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Sydafrika</territory>
+ <territory type="ZM">Zambia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ <keys>
+ <key type="calendar">Kalender</key>
+ <key type="collation">Sortering</key>
+ <key type="currency">Valuta</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">Buddhistisk kalender</type>
+ <type type="chinese" key="calendar">Kinesisk kalender</type>
+ <type type="direct" key="collation">Direkte sorteringsrækkefølge</type>
+ <type type="gregorian" key="calendar">Gregoriansk kalender</type>
+ <type type="hebrew" key="calendar">Jødisk kalender</type>
+ <type type="islamic" key="calendar">Islamisk kalender</type>
+ <type type="islamic-civil" key="calendar">Verdslig islamisk kalender</type>
+ <type type="japanese" key="calendar">Japansk kalender</type>
+ <type type="phonebook" key="collation">Sorteringsrækkefølge i telefonbøger</type>
+ <type type="pinyin" key="collation">Pinyin-baseret sorteringsrækkefølge</type>
+ <type type="stroke" key="collation">Stroke-baseret sorteringsrækkefølge</type>
+ <type type="traditional" key="collation">Traditionel sorteringsrækkefølge</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US" draft="provisional">Amerikansk</measurementSystemName>
+ <measurementSystemName type="metric" draft="provisional">Metrisk</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-z æ ø å]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[á é í ó ú ý]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" alt="proposed-u219-1" draft="unconfirmed">[á é í ñ ó ú ý ü ǽ ǿ ǻ]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="provisional">â€</quotationStart>
+ <alternateQuotationStart draft="provisional">’</alternateQuotationStart>
+ </delimiters>
+ <dates>
+ <localizedPatternChars>GuMtkHmsSEDFwWahKzUeygAZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">jan</month>
+ <month type="2">feb</month>
+ <month type="3">mar</month>
+ <month type="4">apr</month>
+ <month type="5">maj</month>
+ <month type="6">jun</month>
+ <month type="7">jul</month>
+ <month type="8">aug</month>
+ <month type="9">sep</month>
+ <month type="10">okt</month>
+ <month type="11">nov</month>
+ <month type="12">dec</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">januar</month>
+ <month type="2">februar</month>
+ <month type="3">marts</month>
+ <month type="4">april</month>
+ <month type="5">maj</month>
+ <month type="6">juni</month>
+ <month type="7">juli</month>
+ <month type="8">august</month>
+ <month type="9">september</month>
+ <month type="10">oktober</month>
+ <month type="11">november</month>
+ <month type="12">december</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">J</month>
+ <month type="2">F</month>
+ <month type="3">M</month>
+ <month type="4">A</month>
+ <month type="5">M</month>
+ <month type="6">J</month>
+ <month type="7">J</month>
+ <month type="8">A</month>
+ <month type="9">S</month>
+ <month type="10">O</month>
+ <month type="11">N</month>
+ <month type="12">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">søn</day>
+ <day type="mon">man</day>
+ <day type="tue">tir</day>
+ <day type="wed">ons</day>
+ <day type="thu">tor</day>
+ <day type="fri">fre</day>
+ <day type="sat">lør</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">søndag</day>
+ <day type="mon">mandag</day>
+ <day type="tue">tirsdag</day>
+ <day type="wed">onsdag</day>
+ <day type="thu">torsdag</day>
+ <day type="fri">fredag</day>
+ <day type="sat">lørdag</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">S</day>
+ <day type="mon">M</day>
+ <day type="tue">T</day>
+ <day type="wed">O</day>
+ <day type="thu">T</day>
+ <day type="fri">F</day>
+ <day type="sat">L</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">K1</quarter>
+ <quarter type="2">K2</quarter>
+ <quarter type="3">K3</quarter>
+ <quarter type="4">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1. kvartal</quarter>
+ <quarter type="2">2. kvartal</quarter>
+ <quarter type="3">3. kvartal</quarter>
+ <quarter type="4">4. kvartal</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraAbbr>
+ <era type="0">f.Kr.</era>
+ <era type="1">e.Kr.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE 'den' d. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d. MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH.mm.ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>HH.mm.ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>HH.mm.ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>HH.mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMd" draft="provisional">d. MMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm.ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMM" draft="provisional">MMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName draft="provisional">tid</displayName>
+ </field>
+ <field type="year">
+ <displayName>Ã¥r</displayName>
+ </field>
+ <field type="month">
+ <displayName>måned</displayName>
+ </field>
+ <field type="week">
+ <displayName>uge</displayName>
+ </field>
+ <field type="day">
+ <displayName>dag</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>ugedag</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName draft="provisional">dagtid</displayName>
+ </field>
+ <field type="hour">
+ <displayName>time</displayName>
+ </field>
+ <field type="minute">
+ <displayName>minut</displayName>
+ </field>
+ <field type="second">
+ <displayName>sekund</displayName>
+ </field>
+ <field type="zone">
+ <displayName>zone</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Sydpolen</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <standard>Atlantic-normaltid</standard>
+ <standard alt="proposed-u165-1" draft="provisional">Halifax, normaltid</standard>
+ <daylight>Atlantic-sommertid</daylight>
+ <daylight alt="proposed-u165-1" draft="provisional">Halifax, sommertid</daylight>
+ </long>
+ <short>
+ <standard>AST</standard>
+ <daylight>ADT</daylight>
+ </short>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <standard>Newfoundland-normaltid</standard>
+ <standard alt="proposed-u165-1" draft="provisional">St. Johns, normaltid</standard>
+ <daylight>Newfoundland-sommertid</daylight>
+ <daylight alt="proposed-u165-1" draft="provisional">St. Johns, sommertid</daylight>
+ </long>
+ <short>
+ <standard>NST</standard>
+ <daylight>NDT</daylight>
+ </short>
+ <exemplarCity>St. Johns</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>Påskeøen</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <standard>Kinesisk normaltid</standard>
+ <standard alt="proposed-u165-1" draft="provisional">Shanghai, normaltid</standard>
+ <daylight>Kinesisk normaltid</daylight>
+ <daylight alt="proposed-u165-1" draft="provisional">Shanghai, sommertid</daylight>
+ </long>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>De Kanariske Øer</exemplarCity>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <standard>Mellemeuropæisk normaltid</standard>
+ <standard alt="proposed-u165-1" draft="provisional">Paris, normaltid</standard>
+ <daylight>Mellemeuropæisk sommertid</daylight>
+ <daylight alt="proposed-u165-1" draft="provisional">Paris, sommertid</daylight>
+ </long>
+ <short>
+ <standard>CET</standard>
+ <daylight>CEST</daylight>
+ </short>
+ <exemplarCity>Paris</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity>Nuuk</exemplarCity>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <standard>Israelsk normaltid</standard>
+ <standard alt="proposed-u165-1" draft="provisional">Jerusalem, normaltid</standard>
+ <daylight>Israelsk sommertid</daylight>
+ <daylight alt="proposed-u165-1" draft="provisional">Jerusalem, sommertid</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IDT</daylight>
+ </short>
+ <exemplarCity>Jerusalem</exemplarCity>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <standard>Japansk normaltid</standard>
+ <standard alt="proposed-u165-1" draft="provisional">Tokyo, normaltid</standard>
+ <daylight>Japansk normaltid</daylight>
+ <daylight alt="proposed-u165-1" draft="provisional">Tokyo, sommertid</daylight>
+ </long>
+ <short>
+ <standard>JST</standard>
+ <daylight>JST</daylight>
+ </short>
+ <exemplarCity>Tokyo</exemplarCity>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <standard>Verdenstid</standard>
+ <standard alt="proposed-u165-1" draft="provisional">Casablanca, normaltid</standard>
+ <daylight>Verdenstid</daylight>
+ <daylight alt="proposed-u165-2" draft="provisional">Casablanca, sommertid</daylight>
+ </long>
+ <short>
+ <standard>GMT</standard>
+ <daylight>GMT</daylight>
+ </short>
+ <exemplarCity>Casablanca</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lissabon</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>Østeuropæisk normaltid</standard>
+ <standard alt="proposed-u165-1" draft="provisional">Bucharest, normaltid</standard>
+ <daylight>Østeuropæisk sommertid</daylight>
+ <daylight alt="proposed-u165-1" draft="provisional">Bucharest, sommertid</daylight>
+ </long>
+ <short>
+ <standard>EET</standard>
+ <daylight>EEST</daylight>
+ </short>
+ <exemplarCity>Bukarest</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moskva</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <standard>Hawaii-normaltid</standard>
+ <standard alt="proposed-u165-1" draft="provisional">Hawaii, normaltid</standard>
+ <daylight>Hawaii-normaltid</daylight>
+ <daylight alt="proposed-u165-1" draft="provisional">Hawaii, sommertid</daylight>
+ </long>
+ <short>
+ <standard>HST</standard>
+ <daylight>HST</daylight>
+ </short>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <standard>Alaska-normaltid</standard>
+ <standard alt="proposed-u165-1" draft="provisional">Alaska, normaltid</standard>
+ <daylight>Alaska-sommertid</daylight>
+ <daylight alt="proposed-u165-1" draft="provisional">Alaska, sommertid</daylight>
+ </long>
+ <short>
+ <standard>AKST</standard>
+ <daylight>AKDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <standard>Pacific-normaltid</standard>
+ <standard alt="proposed-u165-1" draft="provisional">Los Angeles, normaltid</standard>
+ <daylight>Pacific-sommertid</daylight>
+ <daylight alt="proposed-u165-1" draft="provisional">Los Angeles, sommertid</daylight>
+ </long>
+ <short>
+ <standard>PST</standard>
+ <daylight>PDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Phoenix">
+ <long>
+ <standard>Mountain-normaltid</standard>
+ <standard alt="proposed-u165-1" draft="provisional">Phoenix, normaltid</standard>
+ <daylight>Mountain-normaltid</daylight>
+ <daylight alt="proposed-u165-1" draft="provisional">Phoenix, sommertid</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MST</daylight>
+ </short>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <standard>Mountain-normaltid</standard>
+ <standard alt="proposed-u165-1" draft="provisional">Denver, normaltid</standard>
+ <daylight>Mountain-sommertid</daylight>
+ <daylight alt="proposed-u165-1" draft="provisional">Denver, sommertid</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <standard>Central-normaltid</standard>
+ <standard alt="proposed-u165-1" draft="provisional">Chicago, normaltid</standard>
+ <daylight>Central-sommertid</daylight>
+ <daylight alt="proposed-u165-1" draft="provisional">Chicago, sommertid</daylight>
+ </long>
+ <short>
+ <standard>CST</standard>
+ <daylight>CDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Indianapolis">
+ <long>
+ <standard draft="provisional">Indianapolis, normaltid</standard>
+ <daylight draft="provisional">Indianapolis, sommertid</daylight>
+ </long>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <standard>Eastern-normaltid</standard>
+ <standard alt="proposed-u165-1" draft="provisional">New York, normaltid</standard>
+ <daylight>Eastern-sommertid</daylight>
+ <daylight alt="proposed-u165-1" draft="provisional">New York, sommertid</daylight>
+ </long>
+ <short>
+ <standard>EST</standard>
+ <daylight>EDT</daylight>
+ </short>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ <minusSign draft="provisional">−</minusSign>
+ </symbols>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##0 %</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="provisional">#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Andorransk peseta</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>Dirham fra de Forenede Arabiske Emirater</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName draft="provisional">Afghani (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName draft="provisional">Afghani</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName>Albansk lek</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>Armensk dram</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>Gylden fra De Nederlandske Antiller</displayName>
+ <symbol>NA f.</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>Angolansk kwanza</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Angolansk kwanza (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>Ny angolansk kwanza (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>Angolansk kwanza reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>Argentinsk austral</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Argentinsk peso (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Argentinsk peso</displayName>
+ <symbol>Arg$</symbol>
+ <symbol alt="proposed-u165-1" draft="provisional">ARS</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>Østrigsk schilling</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>Australsk dollar</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>Arubansk gylden</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>Aserbajdsjansk manat</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>Bosnien-Hercegovinsk dinar</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>Bosnien-Hercegovinsk konvertibel mark</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>Barbadisk dollar</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>Bangladeshisk taka</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>Belgisk franc (konvertibel)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Belgisk franc</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>Belgisk franc (financial)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>Bulgarsk hard lev</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>Ny Bulgarsk lev</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>Bahrainsk dinar</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>Burundisk franc</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>Bermudansk dollar</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>Bruneisk dollar</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>Boliviansk peso</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Boliviansk mvdol</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>Brasiliansk cruzeiro novo (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>Brasiliansk cruzado</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>Brasiliansk cruzeiro (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Brasiliansk real</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRN">
+ <displayName>Brasiliansk cruzado novo</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>Brasiliansk cruzeiro</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>Bahamansk dollar</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>Bhutansk ngultrum</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>Burmesisk kyat</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>Botswansk pula</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>Ny hviderussisk rubel (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>Hviderussisk rubel</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>Belizisk dollar</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>Canadisk dollar</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>Congolesisk franc congolais</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Schweizisk franc</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CLF">
+ <displayName>Chilensk unidades de fomento</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Chilensk peso</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>Kinesisk yuan renminbi</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>Colombiansk peso</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="CRC">
+ <displayName>Costaricansk colon</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSK">
+ <displayName>Tjekkoslovakisk hard koruna</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Cubansk peso</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Kapverdisk escudo</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>Cypriotisk pund</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>Tjekkisk koruna</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>Østtysk mark</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Tysk mark</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Djiboutisk franc</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>Dansk krone</displayName>
+ <symbol>kr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>Dominikansk peso</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>Algerisk dinar</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>Ecuadoriansk sucre</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>Estisk kroon</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>Egyptisk pund</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Eritreisk nakfa</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Spansk peseta</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>Etiopisk birr</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>Finsk mark</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Fijiansk dollar</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>Pund fra Falklandsøerne</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Fransk franc</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Britisk pund</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>Georgisk kupon larit</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>Georgisk lari</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>Ghanesisk cedi</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>Gibraltarisk pund</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>Gambisk dalasi</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Guineansk franc</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>Guineansk syli</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Ækvatorialguineask ekwele guineana</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Græsk drachma</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Guatemalansk quetzal</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>Portugisisk guinea escudo</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Guineansk peso</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>Guyansk dollar</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>Honduransk lempira</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>Kroatisk dinar</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Kroatisk kuna</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>Haitisk gourde</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Ungarsk forint</displayName>
+ <symbol>Ft</symbol>
+ <symbol references="R1" alt="proposed-u165-1" draft="provisional">HUF</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>Indonesisk pupiah</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>Irsk pund</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>Israelsk pund</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Ny israelsk shekel</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Indisk rupee</displayName>
+ <symbol references="RP1" draft="provisional">INR</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>Irakisk dinar</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>Iransk rial</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>Islandsk krona</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>Italiensk lira</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>Jamaicansk dollar</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>Jordansk dinar</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>Japansk yen</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>Kenyansk shilling</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>Kirgisisk som</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>Cambodjansk riel</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>Comorisk franc</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>Nordkoreansk won</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Sydkoreansk won</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>Kuwaitisk dinar</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>Dollar fra Caymanøerne</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Kasakhisk tenge</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>Laotisk kip</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>Libanesisk pund</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>Srilankansk rupee</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>Liberisk dollar</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Lesothisk loti</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LTL">
+ <displayName>Litauisk lita</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Litauisk talonas</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Luxembourgsk franc</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Lettisk lats</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>Lettisk rubel</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>Libysk dinar</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>Marokkansk dirham</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>Marokkansk franc</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>Moldovisk leu</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>Madagaskisk ariary</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Madagaskisk franc</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>Makedonsk denar</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>Malisk franc</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Myanmarsk kyat</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>Mongolsk tugrik</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Macaosk pataca</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Mauritansk ouguiya</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>Maltesisk lira</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>Maltesisk pund</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>Mauritisk rupee</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>Maldivisk rufiyaa</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Malawisk kwacha</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>Mexicansk peso</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>Mexicansk silver peso (1861-1992)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Malaysisk ringgit</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>Mozambiquisk escudo</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Mozambiquisk metical</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>Namibisk dollar</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>Nigeriansk naira</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>Nicaraguansk cordoba</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>Nicaraguansk cordoba oro</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Hollandsk guilder</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Norsk krone</displayName>
+ <symbol>NKr</symbol>
+ <symbol references="RP1" alt="proposed-u165-1" draft="provisional">NOK</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>Nepalesisk rupee</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>New Zealandsk dollar</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>Omansk rial</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>Panamansk balboa</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>Peruviansk inti</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>Peruviansk sol nuevo</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>Peruviansk sol</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Papuansk kina</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>Filippinsk peso</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>Pakistansk rupee</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>Polsk zloty</displayName>
+ <symbol>Zl</symbol>
+ <symbol references="RP1" alt="proposed-u165-1" draft="provisional">PLN</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Polsk zloty (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Portugisisk escudo</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>Paraguaysk guarani</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>Qatarsk rial</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="ROL">
+ <displayName>Rumænsk leu</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>Russisk rubel</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Russisk rubel (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>Rwandisk franc</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>Saudisk riyal</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>Salomonsk dollar</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>Seychellisk rupee</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>Sudansk dinar</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>Sudansk pund</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>Svensk krona</displayName>
+ <symbol>SKr</symbol>
+ <symbol references="RP1" alt="proposed-u165-1" draft="provisional">SEK</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>Singaporeansk dollar</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>Pund fra Saint Helena</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Slovensk tolar</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Slovakisk koruna</displayName>
+ <symbol>Sk</symbol>
+ <symbol references="RP1" alt="proposed-u165-1" draft="provisional">SKK</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>Sierraleonsk leone</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>Somalisk shilling</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRG">
+ <displayName>Surinamsk guilder</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>Dobra fra Sao Tome og Principe</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>Sovjetisk rubel</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>Salvadoransk colon</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>Syrisk pund</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>Swazilandsk lilangeni</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>Thailandsk baht</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>Tadsjikisk rubel</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Tadsjikisk somoni</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Turkmensk manat</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>Tunesisk dinar</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>Tongask paʻanga</displayName>
+ <symbol>T$</symbol>
+ </currency>
+ <currency type="TPE">
+ <displayName>Escudo fra Timor</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Tyrkisk lira</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName>Ny tyrkisk lira</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Dollar fra Trinidad og Tobago</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>Ny taiwansk dollar</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>Tanzanisk shilling</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>Ukrainsk grynia</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Ukrainsk karbovanetz</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Ugandisk shilling (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Ugandisk shilling</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>Amerikanske dollar</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>Amerikansk dollar (næste dag)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>Amerikansk dollar (samme dag)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>Uruguaysk peso (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>Uruguaysk peso uruguayo</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>Usbekisk sum</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Venezuelansk bolivar</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>Vietnamesisk dong</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>Vanuaisk vatu</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>Samoansk tala</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>Beninsk CFA-franc</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>Guld</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>Øst-karaibisk dollar</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XFO">
+ <displayName>Fransk guldfranc</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>Fransk UIC-franc</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>CFP-franc</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="YDD">
+ <displayName>Yemenitisk dinar</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Yemenitisk rial</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>Jugoslavisk hard dinar</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>Jugoslavisk noviy dinar</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>Jugoslavisk convertible dinar</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>Sydafrikansk rand (financial)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Sydafrikansk rand</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Zambisk kwacha</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Ny zairisk zaire</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Zairisk naire</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Zimbabwisk dollar</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>ja:j</yesstr>
+ <nostr>nej:n</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="R1" uri="http://www.dsn.dk/oss_faq.htm">Dansk Sprognævn - Ofte stillede spørgsmål (OSS)</reference>
+ <reference type="RP1" uri="http://publications.eu.int/code/da/da-5000500.htm">Office for Official Publications of the European Communities</reference>
+ <reference type="RP2" uri="http://www.eki.ee/itstandard/docs/draft-alvestrand-lang-char-03.txt">Alvestrand, Characters and character sets for various languages</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/da_DK.xml b/libs/Zend/Locale/Data/da_DK.xml
new file mode 100755
index 0000000000..be31ac6a47
--- /dev/null
+++ b/libs/Zend/Locale/Data/da_DK.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/07/11 19:26:43 $"/>
+ <language type="da"/>
+ <territory type="DK"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="afa" draft="provisional">Afroasiatisk (andre)</language>
+ <language type="ain" draft="provisional">Ainu</language>
+ <language type="ale" draft="provisional">Aleutisk</language>
+ <language type="alt" draft="provisional">Sydaltaisk</language>
+ <language type="ang" draft="provisional">Oldengelsk eller Angelsaksisk</language>
+ <language type="art" draft="provisional">Kunstsprog (andre)</language>
+ <language type="az" draft="provisional">Aserbajdsjansk</language>
+ <language type="bai" draft="provisional">Bamileke sprog</language>
+ <language type="bat" draft="provisional">Baltiske sprog (andre)</language>
+ <language type="ber" draft="provisional">Berber sprog</language>
+ <language type="cai" draft="provisional">Mellemamerikanske indianske sprog (andre)</language>
+ <language type="cau" draft="provisional">Kaukasiske sprog (andre)</language>
+ <language type="cel" draft="provisional">Keltiske sprog (andre)</language>
+ <language type="chn" draft="provisional">Chinook jargon</language>
+ <language type="cmc" draft="provisional">Chamiske sprog</language>
+ <language type="cpe" draft="provisional">Kreolsk og pidgin, baseret på engelsk (andre)</language>
+ <language type="cpf" draft="provisional">Kreolsk og pidgin, baseret på fransk (andre)</language>
+ <language type="cpp" draft="provisional">Kreolsk og pidgin, baseret på portugisisk (andre)</language>
+ <language type="crp" draft="provisional">Kreolsk og pidgin (andre)</language>
+ <language type="csb" draft="provisional">Kasjubisk</language>
+ <language type="cus" draft="provisional">Kushitiske sprog (andre)</language>
+ <language type="den" draft="provisional">Slave (athapaskisk)</language>
+ <language type="dra" draft="provisional">Dravidiske sprog (andre)</language>
+ <language type="dsb" draft="provisional">Nedersorbisk</language>
+ <language type="dum" draft="provisional">Middelhollandsk (ca. 1050-1350)</language>
+ <language type="egy" draft="provisional">Egyptisk eller Ægyptisk</language>
+ <language type="enm" draft="provisional">Middelengelsk (1100-1500)</language>
+ <language type="fil" draft="provisional">Filippinsk</language>
+ <language type="fiu" draft="provisional">Finsk-ugriske sprog (andre)</language>
+ <language type="fj" draft="provisional">Fijiansk</language>
+ <language type="frm" draft="provisional">Middelfransk (ca. 1400-1600)</language>
+ <language type="fro" draft="provisional">Oldfransk 842- ca. 1400)</language>
+ <language type="gd" draft="provisional">Skotsk gælisk</language>
+ <language type="gem" draft="provisional">Germansk (andre)</language>
+ <language type="gmh" draft="provisional">Middelhøjtysk (ca. 1050-1500)</language>
+ <language type="goh" draft="provisional">Oldhøjtysk (ca. 750-1050)</language>
+ <language type="grc" draft="provisional">Oldgræsk (til 1453)</language>
+ <language type="gwi" draft="provisional">Gwich'in</language>
+ <language type="hsb" draft="provisional">Øvresorbisk</language>
+ <language type="ht" draft="provisional">Haitisk eller Haitiansk</language>
+ <language type="sh" draft="provisional">SCC:Cyrillic, SCR: Romanic</language>
+ <language type="vo" draft="provisional">Volapyk</language>
+ </languages>
+ </localeDisplayNames>
+ <delimiters>
+ <quotationStart draft="unconfirmed">’</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">â€</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##0.00;¤ -#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/de.xml b/libs/Zend/Locale/Data/de.xml
new file mode 100755
index 0000000000..1b8d8eaee3
--- /dev/null
+++ b/libs/Zend/Locale/Data/de.xml
@@ -0,0 +1,2017 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.78 $"/>
+ <generation date="$Date: 2006/10/26 22:46:08 $"/>
+ <language type="de"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">Afar</language>
+ <language type="ab">Abchasisch</language>
+ <language type="ace">Aceh-Sprache</language>
+ <language type="ach">Acholi-Sprache</language>
+ <language type="ada">Adangme</language>
+ <language type="ady">Adygai</language>
+ <language type="ae">Avestisch</language>
+ <language type="af">Afrikaans</language>
+ <language type="afa">Afro-Asiatische Sprachen (Andere)</language>
+ <language type="afh">Afrihili</language>
+ <language type="ain" draft="provisional">Ainu-Sprache</language>
+ <language type="ak">Akan</language>
+ <language type="akk">Akkadisch</language>
+ <language type="ale">Aleutisch</language>
+ <language type="alg">Algonkin-Sprachen</language>
+ <language type="alt" draft="provisional">Altaisch</language>
+ <language type="am">Amharisch</language>
+ <language type="an">Aragonesisch</language>
+ <language type="ang">Altenglisch</language>
+ <language type="apa">Apachen-Sprache</language>
+ <language type="ar">Arabisch</language>
+ <language type="arc">Aramäisch</language>
+ <language type="arn">Araukanisch</language>
+ <language type="arp">Arapaho-Sprache</language>
+ <language type="art">Kunstsprachen (Andere)</language>
+ <language type="arw">Arawak-Sprachen</language>
+ <language type="as">Assamesisch</language>
+ <language type="ast">Asturianisch</language>
+ <language type="ath">Athapaskische Sprachen</language>
+ <language type="aus">Australische Sprachen</language>
+ <language type="av">Awarisch</language>
+ <language type="awa">Awadhi</language>
+ <language type="ay">Aymará-Sprache</language>
+ <language type="ay" alt="proposed-u212-1" draft="provisional">Aymara</language>
+ <language type="az">Aserbaidschanisch</language>
+ <language type="ba">Baschkirisch</language>
+ <language type="bad">Banda-Sprache</language>
+ <language type="bai">Bamileke-Sprache</language>
+ <language type="bal">Belutschisch</language>
+ <language type="ban">Balinesisch</language>
+ <language type="bas">Basaa-Sprache</language>
+ <language type="bat">Baltische Sprachen (Andere)</language>
+ <language type="be">Weißrussisch</language>
+ <language type="bej">Bedauye</language>
+ <language type="bej" alt="proposed-u45-1" draft="provisional">Bedja-Sprache</language>
+ <language type="bem">Bemba-Sprache</language>
+ <language type="ber">Berbersprachen (Andere)</language>
+ <language type="bg">Bulgarisch</language>
+ <language type="bh">Biharisch</language>
+ <language type="bho">Bhodschpuri</language>
+ <language type="bi">Bislama</language>
+ <language type="bik">Bikol-Sprache</language>
+ <language type="bin">Bini-Sprache</language>
+ <language type="bla">Blackfoot-Sprache</language>
+ <language type="bm">Bambara-Sprache</language>
+ <language type="bn">Bengalisch</language>
+ <language type="bnt">Bantusprachen (Andere)</language>
+ <language type="bo">Tibetisch</language>
+ <language type="br">Bretonisch</language>
+ <language type="bra">Braj-Bhakha</language>
+ <language type="bs">Bosnisch</language>
+ <language type="btk">Batak (Indonesien)</language>
+ <language type="bua">Burjatisch</language>
+ <language type="bug">Buginesisch</language>
+ <language type="byn">Blin</language>
+ <language type="ca">Katalanisch</language>
+ <language type="cad">Caddo</language>
+ <language type="cai">Indianersprachen, Zentralamerika (Andere)</language>
+ <language type="car">Karibische Sprachen</language>
+ <language type="cau">Kaukasische Sprachen (Andere)</language>
+ <language type="ce">Tschetschenisch</language>
+ <language type="ceb">Cebuano</language>
+ <language type="cel">Keltische Sprachen (Andere)</language>
+ <language type="ch">Chamorro-Sprache</language>
+ <language type="chb">Chibcha-Sprachen</language>
+ <language type="chg">Tschagataisch</language>
+ <language type="chk">Trukesisch</language>
+ <language type="chm">Tscheremissisch</language>
+ <language type="chn">Chinook</language>
+ <language type="cho">Choctaw</language>
+ <language type="chp">Chipewyan</language>
+ <language type="chr">Cherokee</language>
+ <language type="chy">Cheyenne</language>
+ <language type="cmc">Cham-Sprachen</language>
+ <language type="co">Korsisch</language>
+ <language type="cop">Koptisch</language>
+ <language type="cpe">Kreolisch-Englisch (Andere)</language>
+ <language type="cpf">Kreolisch-Französisch (Andere)</language>
+ <language type="cpp">Kreolisch-Portugiesisch (Andere)</language>
+ <language type="cr">Cree</language>
+ <language type="crh">Krimtatarisch</language>
+ <language type="crp">Kreolische Sprachen</language>
+ <language type="cs">Tschechisch</language>
+ <language type="csb">Kaschubisch</language>
+ <language type="cu">Kirchenslawisch</language>
+ <language type="cus">Kuschitische Sprachen (Andere)</language>
+ <language type="cv">Tschuwaschisch</language>
+ <language type="cy">Kymrisch</language>
+ <language type="da">Dänisch</language>
+ <language type="dak">Dakota-Sprache</language>
+ <language type="dar">Darginisch</language>
+ <language type="day">Dajak</language>
+ <language type="de">Deutsch</language>
+ <language type="del">Delaware-Sprache</language>
+ <language type="den">Slave (Athapaskische Sprachen)</language>
+ <language type="dgr">Dogrib</language>
+ <language type="din">Dinka-Sprache</language>
+ <language type="doi">Dogri</language>
+ <language type="dra">Drawidische Sprachen (Andere)</language>
+ <language type="dsb">Niedersorbisch</language>
+ <language type="dua">Duala</language>
+ <language type="dum">Mittelniederländisch</language>
+ <language type="dv">Maledivisch</language>
+ <language type="dyu">Dyula-Sprache</language>
+ <language type="dz">Bhutanisch</language>
+ <language type="ee">Ewe-Sprache</language>
+ <language type="efi">Efik</language>
+ <language type="egy">Ägyptisch</language>
+ <language type="eka">Ekajuk</language>
+ <language type="el">Griechisch</language>
+ <language type="elx">Elamisch</language>
+ <language type="en">Englisch</language>
+ <language type="enm">Mittelenglisch</language>
+ <language type="eo">Esperanto</language>
+ <language type="es">Spanisch</language>
+ <language type="et">Estnisch</language>
+ <language type="eu">Baskisch</language>
+ <language type="ewo">Ewondo</language>
+ <language type="fa">Persisch</language>
+ <language type="fan">Pangwe-Sprache</language>
+ <language type="fat">Fanti-Sprache</language>
+ <language type="ff">Ful</language>
+ <language type="fi">Finnisch</language>
+ <language type="fil">Filipino</language>
+ <language type="fiu">Finnougrische Sprachen (Andere)</language>
+ <language type="fj">Fidschianisch</language>
+ <language type="fo">Färöisch</language>
+ <language type="fon">Fon-Sprache</language>
+ <language type="fr">Französisch</language>
+ <language type="frm">Mittelfranzösisch</language>
+ <language type="fro">Altfranzösisch</language>
+ <language type="fur">Friulisch</language>
+ <language type="fy">Friesisch</language>
+ <language type="ga">Irisch</language>
+ <language type="gaa">Ga-Sprache</language>
+ <language type="gay">Gayo</language>
+ <language type="gba">Gbaya-Sprache</language>
+ <language type="gd">Schottisch-Gälisch</language>
+ <language type="gem">Germanische Sprachen (Andere)</language>
+ <language type="gez">Geez</language>
+ <language type="gil">Gilbertesisch</language>
+ <language type="gl">Galizisch</language>
+ <language type="gmh">Mittelhochdeutsch</language>
+ <language type="gn">Guarani</language>
+ <language type="goh">Althochdeutsch</language>
+ <language type="gon">Gondi-Sprache</language>
+ <language type="gor">Mongondou</language>
+ <language type="got">Gotisch</language>
+ <language type="grb">Grebo-Sprache</language>
+ <language type="grc">Griechisch (bis 1453)</language>
+ <language type="gu">Gujarati</language>
+ <language type="gv">Manx</language>
+ <language type="gwi">Kutchin-Sprache</language>
+ <language type="ha">Hausa</language>
+ <language type="hai">Haida-Sprache</language>
+ <language type="haw">Hawaiianisch</language>
+ <language type="he">Hebräisch</language>
+ <language type="hi">Hindi</language>
+ <language type="hil">Hiligaynon-Sprache</language>
+ <language type="him">Himachali</language>
+ <language type="hit">Hethitisch</language>
+ <language type="hmn">Miao-Sprachen</language>
+ <language type="ho">Hiri-Motu</language>
+ <language type="hr">Kroatisch</language>
+ <language type="hsb">Obersorbisch</language>
+ <language type="ht">Kreolisch</language>
+ <language type="hu">Ungarisch</language>
+ <language type="hup">Hupa</language>
+ <language type="hy">Armenisch</language>
+ <language type="hz">Herero-Sprache</language>
+ <language type="ia">Interlingua</language>
+ <language type="iba">Iban</language>
+ <language type="id">Indonesisch</language>
+ <language type="ie">Interlingue</language>
+ <language type="ig">Igbo-Sprache</language>
+ <language type="ii">Sichuan Yi</language>
+ <language type="ijo">Ijo-Sprache</language>
+ <language type="ik">Inupiak</language>
+ <language type="ilo">Ilokano-Sprache</language>
+ <language type="inc">Indoarische Sprachen (Andere)</language>
+ <language type="ine">Indogermanische Sprachen (Andere)</language>
+ <language type="inh">Ingush</language>
+ <language type="io">Ido-Sprache</language>
+ <language type="ira">Iranische Sprachen (Andere)</language>
+ <language type="iro">Irokesische Sprachen</language>
+ <language type="is">Isländisch</language>
+ <language type="it">Italienisch</language>
+ <language type="iu">Inukitut</language>
+ <language type="iu" alt="proposed-u45-1" draft="provisional">Inuktitut</language>
+ <language type="ja">Japanisch</language>
+ <language type="jbo">Lojban</language>
+ <language type="jpr">Jüdisch-Persisch</language>
+ <language type="jrb">Jüdisch-Arabisch</language>
+ <language type="jv">Javanisch</language>
+ <language type="ka">Georgisch</language>
+ <language type="kaa">Karakalpakisch</language>
+ <language type="kab">Kabylisch</language>
+ <language type="kac">Kachin-Sprache</language>
+ <language type="kam">Kamba</language>
+ <language type="kar">Karenisch</language>
+ <language type="kaw">Kawi</language>
+ <language type="kbd">Kabardinisch</language>
+ <language type="kg">Kongo</language>
+ <language type="kha">Khasi-Sprache</language>
+ <language type="khi">Khoisan-Sprachen (Andere)</language>
+ <language type="kho">Sakisch</language>
+ <language type="ki">Kikuyu-Sprache</language>
+ <language type="kj">Kwanyama</language>
+ <language type="kk">Kasachisch</language>
+ <language type="kl">Grönländisch</language>
+ <language type="km">Kambodschanisch</language>
+ <language type="kmb">Kimbundu-Sprache</language>
+ <language type="kn">Kannada</language>
+ <language type="ko">Koreanisch</language>
+ <language type="kok">Konkani</language>
+ <language type="kos">Kosraeanisch</language>
+ <language type="kpe">Kpelle-Sprache</language>
+ <language type="kr">Kanuri-Sprache</language>
+ <language type="krc">Karatschaiisch-Balkarisch</language>
+ <language type="kro">Kru-Sprachen</language>
+ <language type="kru">Oraon-Sprache</language>
+ <language type="ks">Kaschmirisch</language>
+ <language type="ku">Kurdisch</language>
+ <language type="kum">Kumükisch</language>
+ <language type="kut">Kutenai-Sprache</language>
+ <language type="kv">Komi-Sprache</language>
+ <language type="kw">Kornisch</language>
+ <language type="ky">Kirgisisch</language>
+ <language type="la">Latein</language>
+ <language type="lad">Judenspanisch</language>
+ <language type="lad" alt="proposed-u212-1" draft="unconfirmed">Ladino</language>
+ <language type="lad" alt="proposed-u45-1" draft="provisional">Ladinisch</language>
+ <language type="lah">Lahnda</language>
+ <language type="lam">Lamba-Sprache</language>
+ <language type="lb">Luxemburgisch</language>
+ <language type="lez">Lesgisch</language>
+ <language type="lg">Ganda-Sprache</language>
+ <language type="li">Limburgisch</language>
+ <language type="ln">Lingala</language>
+ <language type="lo">Laotisch</language>
+ <language type="lol">Mongo</language>
+ <language type="loz">Rotse-Sprache</language>
+ <language type="lt">Litauisch</language>
+ <language type="lu">Luba</language>
+ <language type="lua">Luba-Lulua</language>
+ <language type="lui">Luiseno-Sprache</language>
+ <language type="lun">Lunda-Sprache</language>
+ <language type="luo">Luo-Sprache</language>
+ <language type="lus">Lushai-Sprache</language>
+ <language type="lv">Lettisch</language>
+ <language type="mad">Maduresisch</language>
+ <language type="mag">Khotta</language>
+ <language type="mai">Maithili</language>
+ <language type="mak">Makassarisch</language>
+ <language type="man">Manding-Sprache</language>
+ <language type="map">Austronesische Sprachen (Andere)</language>
+ <language type="mas">Massai-Sprache</language>
+ <language type="mdf">Moksha</language>
+ <language type="mdr">Mandaresisch</language>
+ <language type="men">Mende-Sprache</language>
+ <language type="mg">Madagassisch</language>
+ <language type="mg" alt="proposed-u45-1" draft="provisional">Malagassi-Sprache</language>
+ <language type="mga">Mittelirisch</language>
+ <language type="mh">Marschallesisch</language>
+ <language type="mi">Maori</language>
+ <language type="mic">Micmac-Sprache</language>
+ <language type="min">Minangkabau-Sprache</language>
+ <language type="mis">Verschiedene Sprachen</language>
+ <language type="mk">Mazedonisch</language>
+ <language type="mkh">Mon-Khmer-Sprachen (Andere)</language>
+ <language type="ml">Malayalam</language>
+ <language type="mn">Mongolisch</language>
+ <language type="mnc">Mandschurisch</language>
+ <language type="mni">Meithei-Sprache</language>
+ <language type="mno">Manobo-Sprache</language>
+ <language type="mo">Moldauisch</language>
+ <language type="moh">Mohawk-Sprache</language>
+ <language type="mos">Mossi-Sprache</language>
+ <language type="mr">Marathi</language>
+ <language type="ms">Malaiisch</language>
+ <language type="mt">Maltesisch</language>
+ <language type="mul">Polyglott</language>
+ <language type="mun">Munda-Sprachen</language>
+ <language type="mus">Muskogee-Sprachen</language>
+ <language type="mwl" draft="provisional">Mirandesisch</language>
+ <language type="mwr">Marwari</language>
+ <language type="my">Birmanisch</language>
+ <language type="myn">Maya-Sprachen</language>
+ <language type="myv">Erzya</language>
+ <language type="na">Nauruisch</language>
+ <language type="nah">Nahuatl</language>
+ <language type="nai">Indianersprachen, Nordamerika (Andere)</language>
+ <language type="nap">Neapolitanisch</language>
+ <language type="nb">Norwegisch Bokmål</language>
+ <language type="nb" alt="proposed-u212-1" draft="provisional">Norwegisch (Bokmål)</language>
+ <language type="nd">Ndebele-Sprache (Nord)</language>
+ <language type="nds">Niederdeutsch</language>
+ <language type="ne">Nepalesisch</language>
+ <language type="new">Newari</language>
+ <language type="ng">Ndonga</language>
+ <language type="nia">Nias-Sprache</language>
+ <language type="nic">Nigerkordofanische Sprachen (Andere)</language>
+ <language type="niu">Niue-Sprache</language>
+ <language type="nl">Niederländisch</language>
+ <language type="nn">Norwegisch Nynorsk</language>
+ <language type="nn" alt="proposed-u45-1" draft="provisional">Norwegisch (Nynorsk)</language>
+ <language type="no">Norwegisch</language>
+ <language type="nog">Nogai</language>
+ <language type="non">Altnordisch</language>
+ <language type="nr">Ndebele-Sprache (Süd)</language>
+ <language type="nso">Sotho-Sprache (Nord)</language>
+ <language type="nub">Nubische Sprachen</language>
+ <language type="nv">Navajo-Sprache</language>
+ <language type="nwc" draft="provisional">Alt-Newari</language>
+ <language type="ny">Chewa-Sprache</language>
+ <language type="nym">Nyamwezi-Sprache</language>
+ <language type="nyn">Nyankole</language>
+ <language type="nyo">Nyoro</language>
+ <language type="nzi">Nzima</language>
+ <language type="oc">Okzitanisch</language>
+ <language type="oj">Ojibwa-Sprache</language>
+ <language type="om">Oromo</language>
+ <language type="or">Orija</language>
+ <language type="os">Ossetisch</language>
+ <language type="osa">Osage-Sprache</language>
+ <language type="ota">Osmanisch</language>
+ <language type="oto">Otomangue-Sprachen</language>
+ <language type="pa">Pandschabisch</language>
+ <language type="paa">Papuasprachen (Andere)</language>
+ <language type="pag">Pangasinan-Sprache</language>
+ <language type="pal">Mittelpersisch</language>
+ <language type="pam">Pampanggan-Sprache</language>
+ <language type="pap">Papiamento</language>
+ <language type="pau">Palau</language>
+ <language type="peo">Altpersisch</language>
+ <language type="phi">Philippinen-Austronesisch (Andere)</language>
+ <language type="phn">Phönikisch</language>
+ <language type="pi">Pali</language>
+ <language type="pl">Polnisch</language>
+ <language type="pon">Ponapeanisch</language>
+ <language type="pra">Prakrit</language>
+ <language type="pro">Altprovenzalisch</language>
+ <language type="ps">Afghanisch (Paschtu)</language>
+ <language type="pt">Portugiesisch</language>
+ <language type="qu">Quechua</language>
+ <language type="raj">Rajasthani</language>
+ <language type="rap">Osterinsel-Sprache</language>
+ <language type="rar">Rarotonganisch</language>
+ <language type="rm">Rätoromanisch</language>
+ <language type="rn">Rundi-Sprache</language>
+ <language type="ro">Rumänisch</language>
+ <language type="roa">Romanische Sprachen (Andere)</language>
+ <language type="rom">Zigeunersprache</language>
+ <language type="root" draft="provisional">Root</language>
+ <language type="ru">Russisch</language>
+ <language type="rup" draft="provisional">Aromunisch</language>
+ <language type="rw">Ruandisch</language>
+ <language type="sa">Sanskrit</language>
+ <language type="sad">Sandawe-Sprache</language>
+ <language type="sah">Jakutisch</language>
+ <language type="sai">Indianersprachen, Südamerika (Andere)</language>
+ <language type="sal">Salish-Sprache</language>
+ <language type="sam">Samaritanisch</language>
+ <language type="sas">Sasak</language>
+ <language type="sat">Santali</language>
+ <language type="sc">Sardisch</language>
+ <language type="scn" draft="provisional">Sizilianisch</language>
+ <language type="sco">Schottisch</language>
+ <language type="sd">Sindhi</language>
+ <language type="se">Nord-Samisch</language>
+ <language type="sel">Selkupisch</language>
+ <language type="sem">Semitische Sprachen (Andere)</language>
+ <language type="sg">Sango</language>
+ <language type="sga">Altirisch</language>
+ <language type="sgn">Gebärdensprache</language>
+ <language type="sh">Serbo-Kroatisch</language>
+ <language type="shn">Schan-Sprache</language>
+ <language type="si">Singhalesisch</language>
+ <language type="sid">Sidamo</language>
+ <language type="sio">Sioux-Sprachen</language>
+ <language type="sit">Sinotibetische Sprachen (Andere)</language>
+ <language type="sk">Slowakisch</language>
+ <language type="sl">Slowenisch</language>
+ <language type="sla">Slawische Sprachen (Andere)</language>
+ <language type="sm">Samoanisch</language>
+ <language type="sma">Süd-Samisch</language>
+ <language type="smi">Lappisch</language>
+ <language type="smj">Lule-Lappisch</language>
+ <language type="smn">Inari-Lappisch</language>
+ <language type="sms">Skolt-Lappisch</language>
+ <language type="sn">Shona</language>
+ <language type="snk">Soninke-Sprache</language>
+ <language type="so">Somali</language>
+ <language type="sog">Sogdisch</language>
+ <language type="son">Songhai-Sprache</language>
+ <language type="sq">Albanisch</language>
+ <language type="sr">Serbisch</language>
+ <language type="srn" draft="provisional">Srananisch</language>
+ <language type="srr">Serer-Sprache</language>
+ <language type="ss">Swazi</language>
+ <language type="ssa">Nilosaharanische Sprachen (Andere)</language>
+ <language type="st">Süd-Sotho-Sprache</language>
+ <language type="su">Sudanesisch</language>
+ <language type="suk">Sukuma-Sprache</language>
+ <language type="sus">Susu</language>
+ <language type="sux">Sumerisch</language>
+ <language type="sv">Schwedisch</language>
+ <language type="sw">Suaheli</language>
+ <language type="syr">Syrisch</language>
+ <language type="ta">Tamilisch</language>
+ <language type="tai">Thaisprachen (Andere)</language>
+ <language type="te">Telugu</language>
+ <language type="tem">Temne</language>
+ <language type="ter">Tereno-Sprache</language>
+ <language type="tet">Tetum-Sprache</language>
+ <language type="tg">Tadschikisch</language>
+ <language type="th">Thai</language>
+ <language type="ti">Tigrinja</language>
+ <language type="tig">Tigre</language>
+ <language type="tiv">Tiv-Sprache</language>
+ <language type="tk">Turkmenisch</language>
+ <language type="tkl">Tokelauanisch</language>
+ <language type="tl">Tagalog</language>
+ <language type="tlh" draft="provisional">Klingonisch</language>
+ <language type="tli">Tlingit-Sprache</language>
+ <language type="tmh">Tamaseq</language>
+ <language type="tn">Tswana-Sprache</language>
+ <language type="to">Tongaisch</language>
+ <language type="tog">Tonga (Nyasa)</language>
+ <language type="tog" alt="proposed-u45-1" draft="provisional">Tsonga-Sprache</language>
+ <language type="tpi">Neumelanesisch</language>
+ <language type="tr">Türkisch</language>
+ <language type="ts">Tsonga</language>
+ <language type="tsi">Tsimshian-Sprache</language>
+ <language type="tt">Tatarisch</language>
+ <language type="tum">Tumbuka-Sprache</language>
+ <language type="tup">Tupi-Sprachen</language>
+ <language type="tut">Altaische Sprachen (Andere)</language>
+ <language type="tvl">Elliceanisch</language>
+ <language type="tw">Twi</language>
+ <language type="ty">Tahitisch</language>
+ <language type="tyv">Tuwinisch</language>
+ <language type="udm">Udmurtisch</language>
+ <language type="ug">Uigurisch</language>
+ <language type="uga">Ugaritisch</language>
+ <language type="uk">Ukrainisch</language>
+ <language type="umb">Mbundu-Sprache</language>
+ <language type="und">Sprache nicht ermittelt</language>
+ <language type="ur">Urdu</language>
+ <language type="uz">Usbekisch</language>
+ <language type="vai">Vai-Sprache</language>
+ <language type="ve">Venda-Sprache</language>
+ <language type="vi">Vietnamesisch</language>
+ <language type="vo">Volapük</language>
+ <language type="vot">Wotisch</language>
+ <language type="wa">Wallonisch</language>
+ <language type="wak">Wakashanisch</language>
+ <language type="wal">Walamo-Sprache</language>
+ <language type="war">Waray</language>
+ <language type="was">Washo-Sprache</language>
+ <language type="wen">Sorbisch</language>
+ <language type="wo">Wolof</language>
+ <language type="xal">Kalmückisch</language>
+ <language type="xh">Xhosa</language>
+ <language type="yao">Yao-Sprache</language>
+ <language type="yap">Yapesisch</language>
+ <language type="yi">Jiddisch</language>
+ <language type="yo">Joruba</language>
+ <language type="ypk">Yupik-Sprache</language>
+ <language type="za">Zhuang</language>
+ <language type="zap">Zapotekisch</language>
+ <language type="zen">Zenaga</language>
+ <language type="zh">Chinesisch</language>
+ <language type="znd">Zande-Sprache</language>
+ <language type="zu">Zulu</language>
+ <language type="zun">Zuni-Sprache</language>
+ </languages>
+ <scripts>
+ <script type="Arab">Arabisch</script>
+ <script type="Armn">Armenisch</script>
+ <script type="Bali" draft="provisional">Balinesisch</script>
+ <script type="Batk" draft="provisional">Battakisch</script>
+ <script type="Beng">Bengalisch</script>
+ <script type="Blis" draft="provisional">Bliss-Symbole</script>
+ <script type="Bopo">Bopomofo</script>
+ <script type="Brah" draft="provisional">Brahmi</script>
+ <script type="Brai">Blindenschrift</script>
+ <script type="Bugi" draft="provisional">Buginesisch</script>
+ <script type="Buhd" draft="provisional">Buhid</script>
+ <script type="Cans" draft="provisional">UCAS</script>
+ <script type="Cham" draft="provisional">Cham</script>
+ <script type="Cher">Cherokee</script>
+ <script type="Cirt" draft="provisional">Cirth</script>
+ <script type="Copt">Koptisch</script>
+ <script type="Cprt">Zypriotisch</script>
+ <script type="Cyrl">Kyrillisch</script>
+ <script type="Cyrs" draft="provisional">Kyrillisch (Altkirchenslawische Variante)</script>
+ <script type="Deva">Devanagari</script>
+ <script type="Dsrt" draft="provisional">Deseret</script>
+ <script type="Egyd" draft="provisional">Ägyptisch (Demotisch)</script>
+ <script type="Egyh" draft="provisional">Ägyptisch (Hieratisch)</script>
+ <script type="Egyp" draft="provisional">Ägyptische Hieroglyphen</script>
+ <script type="Ethi">Äthiopisch</script>
+ <script type="Geok" draft="provisional">Khutsuri (Asomtavruli und Nuskhuri)</script>
+ <script type="Geor">Georgisch</script>
+ <script type="Glag" draft="provisional">Glagolitisch</script>
+ <script type="Goth">Gotisch</script>
+ <script type="Grek">Griechisch</script>
+ <script type="Gujr">Gujarati</script>
+ <script type="Guru">Gurmukhi</script>
+ <script type="Hang">Hangul</script>
+ <script type="Hani">Chinesisch</script>
+ <script type="Hano" draft="provisional">Hanunoo</script>
+ <script type="Hans">Vereinfachte Chinesische Schrift</script>
+ <script type="Hant">Traditionelle Chinesische Schrift</script>
+ <script type="Hebr">Hebräisch</script>
+ <script type="Hira">Hiragana</script>
+ <script type="Hmng" draft="provisional">Pahawh Hmong</script>
+ <script type="Hrkt" draft="provisional">Katakana oder Hiragana</script>
+ <script type="Hung" draft="provisional">Altungarisch</script>
+ <script type="Inds" draft="provisional">Indus (Harappan)</script>
+ <script type="Ital">Altitalisch</script>
+ <script type="Java" draft="provisional">Javanesisch</script>
+ <script type="Kali" draft="provisional">Kayah Li</script>
+ <script type="Kana">Katakana</script>
+ <script type="Khar" draft="provisional">Kharoshthi</script>
+ <script type="Khmr">Khmer</script>
+ <script type="Knda">Kannada</script>
+ <script type="Laoo">Laotisch</script>
+ <script type="Latf" draft="provisional">Lateinisch (Fraktur-Variante)</script>
+ <script type="Latg" draft="provisional">Lateinisch (Gälische Variante)</script>
+ <script type="Latn">Lateinisch</script>
+ <script type="Lepc" draft="provisional">Lepcha (Róng)</script>
+ <script type="Limb">Limbu</script>
+ <script type="Lina" draft="provisional">Linear A</script>
+ <script type="Linb">Linear B</script>
+ <script type="Mand" draft="provisional">Mandaean</script>
+ <script type="Maya" draft="provisional">Maya-Hieroglyphen</script>
+ <script type="Mero" draft="provisional">Meroitisch</script>
+ <script type="Mlym">Malaysisch</script>
+ <script type="Mong">Mongolisch</script>
+ <script type="Mymr">Burmesisch</script>
+ <script type="Nkoo" draft="provisional">N’Ko</script>
+ <script type="Ogam">Ogham</script>
+ <script type="Orkh" draft="provisional">Orchon-Runen</script>
+ <script type="Orya">Oriya</script>
+ <script type="Osma">Osmanisch</script>
+ <script type="Perm" draft="provisional">Altpermisch</script>
+ <script type="Phag" draft="provisional">Phags-pa</script>
+ <script type="Phnx" draft="provisional">Phönizisch</script>
+ <script type="Plrd" draft="provisional">Pollard Phonetisch</script>
+ <script type="Qaai">Geerbter Schriftwert</script>
+ <script type="Roro" draft="provisional">Rongorongo</script>
+ <script type="Runr">Runenschrift</script>
+ <script type="Sara" draft="provisional">Sarati</script>
+ <script type="Shaw" draft="provisional">Shaw-Alphabet</script>
+ <script type="Sinh">Singhalesisch</script>
+ <script type="Sylo" draft="provisional">Syloti Nagri</script>
+ <script type="Syrc">Syrisch</script>
+ <script type="Syre" draft="provisional">Syrisch (Estrangelo-Variante)</script>
+ <script type="Syrj" draft="provisional">Syrisch (Westliche Variante)</script>
+ <script type="Syrn" draft="provisional">Syrisch (Östliche Variante)</script>
+ <script type="Tagb" draft="provisional">Tagbanwa</script>
+ <script type="Tale" draft="provisional">Tai Le</script>
+ <script type="Talu" draft="provisional">Tai Lue</script>
+ <script type="Taml">Tamilisch</script>
+ <script type="Telu">Telugu</script>
+ <script type="Teng" draft="provisional">Tengwar</script>
+ <script type="Tfng" draft="provisional">Tifinagh (Berber)</script>
+ <script type="Tglg">Tagalog</script>
+ <script type="Thaa" draft="provisional">Thaana</script>
+ <script type="Thai" draft="provisional">Thai</script>
+ <script type="Tibt">Tibetisch</script>
+ <script type="Ugar">Ugaritisch</script>
+ <script type="Vaii" draft="provisional">Vai</script>
+ <script type="Visp" draft="provisional">Visible Speech</script>
+ <script type="Xpeo" draft="provisional">Altpersisch</script>
+ <script type="Xsux" draft="provisional">Sumerisch-akkadische Keilschrift</script>
+ <script type="Yiii">Yi</script>
+ <script type="Zxxx" draft="provisional">Schriftlose Sprachen</script>
+ <script type="Zyyy">Unbestimmt</script>
+ <script type="Zzzz" draft="provisional">Uncodierte Schrift</script>
+ </scripts>
+ <territories>
+ <territory type="001">Welt</territory>
+ <territory type="002">Afrika</territory>
+ <territory type="005">Südamerika</territory>
+ <territory type="009">Ozeanien</territory>
+ <territory type="011">Westafrika</territory>
+ <territory type="013">Mittelamerika</territory>
+ <territory type="014">Ostafrika</territory>
+ <territory type="015">Nordafrika</territory>
+ <territory type="017">Zentralafrika</territory>
+ <territory type="018" draft="provisional">Südliches Afrika</territory>
+ <territory type="019">Nord-, Mittel- und Südamerika</territory>
+ <territory type="021">Nordamerika</territory>
+ <territory type="029">Karibik</territory>
+ <territory type="030">Ostasien</territory>
+ <territory type="034">Südasien</territory>
+ <territory type="035">Südostasien</territory>
+ <territory type="039">Südeuropa</territory>
+ <territory type="053">Australien und Neuseeland</territory>
+ <territory type="054">Melanesien</territory>
+ <territory type="057" draft="provisional">Mikronesien (Inselgebiet)</territory>
+ <territory type="061">Polynesien</territory>
+ <territory type="062">Süd-Zentralasien</territory>
+ <territory type="142">Asien</territory>
+ <territory type="143">Zentralasien</territory>
+ <territory type="145">Westasien</territory>
+ <territory type="150">Europa</territory>
+ <territory type="151">Osteuropa</territory>
+ <territory type="154">Nordeuropa</territory>
+ <territory type="155">Westeuropa</territory>
+ <territory type="172" draft="provisional">Gemeinschaft Unabhängiger Staaten</territory>
+ <territory type="419">Lateinamerika und Karibik</territory>
+ <territory type="830">Kanalinseln</territory>
+ <territory type="IM">Insel Man</territory>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Vereinigte Arabische Emirate</territory>
+ <territory type="AF">Afghanistan</territory>
+ <territory type="AG">Antigua und Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albanien</territory>
+ <territory type="AM">Armenien</territory>
+ <territory type="AN">Niederländische Antillen</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktis</territory>
+ <territory type="AR">Argentinien</territory>
+ <territory type="AS">Amerikanisch-Samoa</territory>
+ <territory type="AT">Österreich</territory>
+ <territory type="AU">Australien</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Alandinseln</territory>
+ <territory type="AZ">Aserbaidschan</territory>
+ <territory type="BA">Bosnien und Herzegowina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesch</territory>
+ <territory type="BE">Belgien</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgarien</territory>
+ <territory type="BH">Bahrain</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei Darussalam</territory>
+ <territory type="BO">Bolivien</territory>
+ <territory type="BR">Brasilien</territory>
+ <territory type="BS">Bahamas</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BV">Bouvetinsel</territory>
+ <territory type="BW">Botsuana</territory>
+ <territory type="BY">Belarus</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Kokosinseln (Keeling)</territory>
+ <territory type="CD">Demokratische Republik Kongo</territory>
+ <territory type="CF">Zentralafrikanische Republik</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Schweiz</territory>
+ <territory type="CI">Côte d’Ivoire</territory>
+ <territory type="CK">Cookinseln</territory>
+ <territory type="CL">Chile</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">China</territory>
+ <territory type="CO">Kolumbien</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS">Serbien und Montenegro</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Kap Verde</territory>
+ <territory type="CX">Weihnachtsinsel</territory>
+ <territory type="CY">Zypern</territory>
+ <territory type="CZ">Tschechische Republik</territory>
+ <territory type="DE">Deutschland</territory>
+ <territory type="DJ">Dschibuti</territory>
+ <territory type="DK">Dänemark</territory>
+ <territory type="DM">Dominica</territory>
+ <territory type="DO">Dominikanische Republik</territory>
+ <territory type="DZ">Algerien</territory>
+ <territory type="EC">Ecuador</territory>
+ <territory type="EE">Estland</territory>
+ <territory type="EG">Ägypten</territory>
+ <territory type="EH">Westsahara</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Spanien</territory>
+ <territory type="ET">Äthiopien</territory>
+ <territory type="FI">Finnland</territory>
+ <territory type="FJ">Fidschi</territory>
+ <territory type="FK">Falklandinseln</territory>
+ <territory type="FM">Mikronesien</territory>
+ <territory type="FO">Färöer</territory>
+ <territory type="FR">Frankreich</territory>
+ <territory type="GA">Gabun</territory>
+ <territory type="GB">Vereinigtes Königreich</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Georgien</territory>
+ <territory type="GF">Französisch-Guayana</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Grönland</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Äquatorialguinea</territory>
+ <territory type="GR">Griechenland</territory>
+ <territory type="GS">Südgeorgien und die Südlichen Sandwichinseln</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinea-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Hong Kong S.A.R., China</territory>
+ <territory type="HM">Heard und McDonaldinseln</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Kroatien</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Ungarn</territory>
+ <territory type="ID">Indonesien</territory>
+ <territory type="IE">Irland</territory>
+ <territory type="IL">Israel</territory>
+ <territory type="IN">Indien</territory>
+ <territory type="IO">Britisches Territorium im Indischen Ozean</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Island</territory>
+ <territory type="IT">Italien</territory>
+ <territory type="JM">Jamaika</territory>
+ <territory type="JO">Jordanien</territory>
+ <territory type="JP">Japan</territory>
+ <territory type="KE">Kenia</territory>
+ <territory type="KG">Kirgisistan</territory>
+ <territory type="KH">Kambodscha</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komoren</territory>
+ <territory type="KN">St. Kitts und Nevis</territory>
+ <territory type="KP">Demokratische Volksrepublik Korea</territory>
+ <territory type="KR">Republik Korea</territory>
+ <territory type="KW">Kuwait</territory>
+ <territory type="KY">Kaimaninseln</territory>
+ <territory type="KZ">Kasachstan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Libanon</territory>
+ <territory type="LC">St. Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberia</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Litauen</territory>
+ <territory type="LU">Luxemburg</territory>
+ <territory type="LV">Lettland</territory>
+ <territory type="LY">Libyen</territory>
+ <territory type="MA">Marokko</territory>
+ <territory type="MC">Monaco</territory>
+ <territory type="MD">Republik Moldau</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshallinseln</territory>
+ <territory type="MK">Mazedonien</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongolei</territory>
+ <territory type="MO">Macau S.A.R., China</territory>
+ <territory type="MP">Nördliche Marianen</territory>
+ <territory type="MQ">Martinique</territory>
+ <territory type="MR">Mauretanien</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Malediven</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Mexiko</territory>
+ <territory type="MY">Malaysia</territory>
+ <territory type="MZ">Mosambik</territory>
+ <territory type="NA">Namibia</territory>
+ <territory type="NC">Neukaledonien</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Norfolkinsel</territory>
+ <territory type="NG">Nigeria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Niederlande</territory>
+ <territory type="NO">Norwegen</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Neuseeland</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Französisch-Polynesien</territory>
+ <territory type="PG">Papua-Neuguinea</territory>
+ <territory type="PH">Philippinen</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Polen</territory>
+ <territory type="PM">St. Pierre und Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Puerto Rico</territory>
+ <territory type="PS">Palästinensische Gebiete</territory>
+ <territory type="PT">Portugal</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Katar</territory>
+ <territory type="QO">Äußeres Ozeanien</territory>
+ <territory type="RE">Réunion</territory>
+ <territory type="RO">Rumänien</territory>
+ <territory type="RU">Russische Föderation</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SA">Saudi-Arabien</territory>
+ <territory type="SB">Salomonen</territory>
+ <territory type="SC">Seychellen</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Schweden</territory>
+ <territory type="SG">Singapur</territory>
+ <territory type="SH">St. Helena</territory>
+ <territory type="SI">Slowenien</territory>
+ <territory type="SJ">Svalbard und Jan Mayen</territory>
+ <territory type="SK">Slowakei</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalia</territory>
+ <territory type="SR">Suriname</territory>
+ <territory type="ST">São Tomé und Príncipe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Syrien</territory>
+ <territory type="SZ">Swasiland</territory>
+ <territory type="TC">Turks- und Caicosinseln</territory>
+ <territory type="TD">Tschad</territory>
+ <territory type="TF">Französische Süd- und Antarktisgebiete</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Thailand</territory>
+ <territory type="TJ">Tadschikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Osttimor</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunesien</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Türkei</territory>
+ <territory type="TT">Trinidad und Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TZ">Tansania</territory>
+ <territory type="UA">Ukraine</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">Amerikanisch-Ozeanien</territory>
+ <territory type="US">Vereinigte Staaten</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Usbekistan</territory>
+ <territory type="VA">Vatikanstadt</territory>
+ <territory type="VC">St. Vincent und die Grenadinen</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Britische Jungferninseln</territory>
+ <territory type="VI">Amerikanische Jungferninseln</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis und Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Südafrika</territory>
+ <territory type="ZA" alt="proposed-u212-1" draft="unconfirmed">Südafrika (Republik)</territory>
+ <territory type="ZA" alt="proposed-u45-2" draft="provisional">Republik Südafrika</territory>
+ <territory type="ZM">Sambia</territory>
+ <territory type="ZW">Simbabwe</territory>
+ </territories>
+ <variants>
+ <variant type="1901" draft="unconfirmed">alte deutsche Rechtschreibung</variant>
+ <variant type="1996" draft="unconfirmed">neue deutsche Rechtschreibung</variant>
+ <variant type="NEDIS" draft="provisional">Natisone-Dialekt</variant>
+ <variant type="POLYTONI" draft="provisional">Polytonisch</variant>
+ <variant type="POSIX">Posix</variant>
+ <variant type="REVISED">Revidiert</variant>
+ <variant type="ROZAJ" draft="provisional">Resianisch</variant>
+ <variant type="SAAHO" draft="provisional">Saho</variant>
+ </variants>
+ <keys>
+ <key type="calendar">Kalender</key>
+ <key type="collation">Sortierung</key>
+ <key type="currency">Währung</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation" draft="provisional">Traditionelles Chinesisch (Big5)</type>
+ <type type="buddhist" key="calendar">Buddhistischer Kalender</type>
+ <type type="chinese" key="calendar">Chinesischer Kalender</type>
+ <type type="direct" key="collation">Direkte Sortierregeln</type>
+ <type type="gb2312han" key="collation" draft="provisional">Vereinfachtes Chinesisch (GB2312)</type>
+ <type type="gregorian" key="calendar">Gregorianischer Kalender</type>
+ <type type="hebrew" key="calendar">Hebräischer Kalender</type>
+ <type type="islamic" key="calendar">Islamischer Kalender</type>
+ <type type="islamic-civil" key="calendar">Bürgerlicher islamischer Kalender</type>
+ <type type="japanese" key="calendar">Japanischer Kalender</type>
+ <type type="phonebook" key="collation">Telefonbuch-Sortierregeln</type>
+ <type type="pinyin" key="collation">Pinyin-Sortierregeln</type>
+ <type type="stroke" key="collation">Strichfolge</type>
+ <type type="traditional" key="collation">Traditionelle Sortierregeln</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US" references="RP11" draft="provisional">US-amerikanisch</measurementSystemName>
+ <measurementSystemName type="metric" references="RP10" draft="unconfirmed">metrisch</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a ä b-o ö p-s ß t u ü v-z]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>‚</quotationStart>
+ <quotationEnd>‘</quotationEnd>
+ <alternateQuotationStart>„</alternateQuotationStart>
+ <alternateQuotationEnd>“</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <localizedPatternChars>GjMtkHmsSEDFwWahKzJeugAZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Jan</month>
+ <month type="2">Feb</month>
+ <month type="3">Mrz</month>
+ <month type="3" alt="proposed-u45-1" draft="provisional">Mär</month>
+ <month type="4">Apr</month>
+ <month type="5">Mai</month>
+ <month type="6">Jun</month>
+ <month type="7">Jul</month>
+ <month type="8">Aug</month>
+ <month type="9">Sep</month>
+ <month type="10">Okt</month>
+ <month type="11">Nov</month>
+ <month type="12">Dez</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Januar</month>
+ <month type="2">Februar</month>
+ <month type="3">März</month>
+ <month type="4">April</month>
+ <month type="5">Mai</month>
+ <month type="6">Juni</month>
+ <month type="7">Juli</month>
+ <month type="8">August</month>
+ <month type="9">September</month>
+ <month type="10">Oktober</month>
+ <month type="11">November</month>
+ <month type="12">Dezember</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">J</month>
+ <month type="2">F</month>
+ <month type="3">M</month>
+ <month type="4">A</month>
+ <month type="5">M</month>
+ <month type="6">J</month>
+ <month type="7">J</month>
+ <month type="8">A</month>
+ <month type="9">S</month>
+ <month type="10">O</month>
+ <month type="11">N</month>
+ <month type="12">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">So</day>
+ <day type="mon">Mo</day>
+ <day type="tue">Di</day>
+ <day type="wed">Mi</day>
+ <day type="thu">Do</day>
+ <day type="fri">Fr</day>
+ <day type="sat">Sa</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Sonntag</day>
+ <day type="mon">Montag</day>
+ <day type="tue">Dienstag</day>
+ <day type="wed">Mittwoch</day>
+ <day type="thu">Donnerstag</day>
+ <day type="fri">Freitag</day>
+ <day type="sat">Samstag</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">S</day>
+ <day type="mon">M</day>
+ <day type="tue">D</day>
+ <day type="wed">M</day>
+ <day type="thu">D</day>
+ <day type="fri">F</day>
+ <day type="sat">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1">1. Quartal</quarter>
+ <quarter type="2">2. Quartal</quarter>
+ <quarter type="3">3. Quartal</quarter>
+ <quarter type="4">4. Quartal</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>vorm.</am>
+ <pm>nachm.</pm>
+ <eras>
+ <eraNames>
+ <era type="0">v. Chr.</era>
+ <era type="1">n. Chr.</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">v. Chr.</era>
+ <era type="1">n. Chr.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd.MM.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd.MM.yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H:mm' Uhr 'z</pattern>
+ <pattern alt="proposed-u45-1" draft="provisional">H:mm' Uhr 'v</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="MMMMd" draft="provisional">d. MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd.MM</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM.yy</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="provisional">QQQQ yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName draft="provisional">Epoche</displayName>
+ </field>
+ <field type="year">
+ <displayName draft="provisional">Jahr</displayName>
+ </field>
+ <field type="month">
+ <displayName draft="provisional">Monat</displayName>
+ </field>
+ <field type="week">
+ <displayName draft="provisional">Woche</displayName>
+ </field>
+ <field type="day">
+ <displayName draft="provisional">Tag</displayName>
+ </field>
+ <field type="weekday">
+ <displayName draft="provisional">Wochentag</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName draft="provisional">Tageshälfte</displayName>
+ </field>
+ <field type="hour">
+ <displayName draft="provisional">Stunde</displayName>
+ </field>
+ <field type="second">
+ <displayName draft="provisional">Sekunde</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Südpol</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Vostok">
+ <exemplarCity>Wostok</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <exemplarCity>St. John's</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>Osterinsel</exemplarCity>
+ </zone>
+ <zone type="Europe/Berlin">
+ <long>
+ <standard>Mitteleuropäische Zeit</standard>
+ <daylight>Mitteleuropäische Sommerzeit</daylight>
+ </long>
+ <short>
+ <standard>MEZ</standard>
+ <daylight>MESZ</daylight>
+ </short>
+ <exemplarCity>Berlin</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>Kanaren</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>Ulan-Bator</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>Mexiko-Stadt</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>Azoren</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lissabon</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moskau</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>Jekaterinburg</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity>Nowosibirsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>Krasnojarsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>Jakutsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Vladivostok">
+ <exemplarCity>Wladiwostok</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>Sachalin</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>Kamtschatka</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>Uschgorod</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>Kiew</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>Saporischja</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Taschkent</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern draft="provisional">#,##0 %</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Andorranische Pesete</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>UAE Dirham</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>Afghani (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>Afghani</displayName>
+ <symbol>Af</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>Lek</displayName>
+ </currency>
+ <currency type="AMD">
+ <displayName>Dram</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName>Niederl. Antillen Gulden</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName>Kwanza</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Angolanischer Kwanza (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>Neuer Kwanza</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>Kwanza Reajustado</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>Argentinischer Austral</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Argentinischer Peso (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Argentinischer Peso</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName>Österreichischer Schilling</displayName>
+ <symbol>öS</symbol>
+ </currency>
+ <currency type="AUD">
+ <displayName>Australischer Dollar</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName>Aruba Florin</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>Aserbeidschan Manat</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>Bosnien und Herzegowina Dinar</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>Konvertierbare Mark</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName>Barbados-Dollar</displayName>
+ </currency>
+ <currency type="BDT">
+ <displayName>Taka</displayName>
+ </currency>
+ <currency type="BEC">
+ <displayName>Belgischer Franc (konvertibel)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Belgischer Franc</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>Lew (1962-1999)</displayName>
+ <displayName references="RP10" alt="proposed-u212-2" draft="provisional">Bulgarischer Lew (1962-1999)</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName>Lew</displayName>
+ <displayName references="RP10" alt="proposed-u212-2" draft="unconfirmed">Bulgarischer Lew</displayName>
+ <displayName alt="proposed-u45-1" draft="provisional">Neuer Bulgarischer Lew</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>Bahrain-Dinar</displayName>
+ </currency>
+ <currency type="BIF">
+ <displayName>Burundi-Franc</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName>Bermuda-Dollar</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName>Brunei-Dollar</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>Boliviano</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>Bolivianischer Peso</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Mvdol</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>Brasilianischer Cruzeiro Novo (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>Brasilianischer Cruzado</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>Brasilianischer Cruzeiro (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Real</displayName>
+ </currency>
+ <currency type="BRN">
+ <displayName>Brasilianischer Cruzado Novo</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>Brasilianischer Cruzeiro</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>Bahama-Dollar</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>Ngultrum</displayName>
+ </currency>
+ <currency type="BUK">
+ <displayName>Birmanischer Kyat</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>Pula</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>Belarus Rubel (alt)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>Belarus Rubel (neu)</displayName>
+ </currency>
+ <currency type="BZD">
+ <displayName>Belize-Dollar</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>Kanadischer Dollar</displayName>
+ </currency>
+ <currency type="CDF">
+ <displayName>Franc congolais</displayName>
+ </currency>
+ <currency type="CHE">
+ <displayName draft="provisional">WIR Euro</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Schweizer Franken</displayName>
+ <symbol>SFr.</symbol>
+ </currency>
+ <currency type="CHW">
+ <displayName draft="provisional">WIR Franken</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>Unidades de Fomento</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Chilenischer Peso</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>Renminbi Yuan</displayName>
+ </currency>
+ <currency type="COP">
+ <displayName>Kolumbianischer Peso</displayName>
+ </currency>
+ <currency type="COU">
+ <displayName draft="provisional">Unidad de Valor Real</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>Costa Rica Colon</displayName>
+ </currency>
+ <currency type="CSD">
+ <displayName draft="provisional">Serbischer Dinar</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName draft="provisional">Tschechoslowakische Krone</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Kubanischer Peso</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Kap Verde Escudo</displayName>
+ </currency>
+ <currency type="CYP">
+ <displayName>Zypern Pfund</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName>Tschechische Krone</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName draft="provisional">Mark der DDR</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Deutsche Mark</displayName>
+ <symbol>DM</symbol>
+ </currency>
+ <currency type="DJF">
+ <displayName>Dschibuti-Franc</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName>Dänische Krone</displayName>
+ </currency>
+ <currency type="DOP">
+ <displayName>Dominikanischer Peso</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName>Algerischer Dinar</displayName>
+ </currency>
+ <currency type="ECS">
+ <displayName>Ecuadorianischer Sucre</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>Verrechnungseinheit für EC</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>Estnische Krone</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>Ägyptisches Pfund</displayName>
+ </currency>
+ <currency type="EQE">
+ <displayName draft="provisional">Ekwele</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Nakfa</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName references="RP10" draft="provisional">Spanische Peseta (A-Konten)</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName references="RP10" draft="provisional">Spanische Peseta (konvertibel)</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Spanische Pesete</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>Birr</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>Finnische Mark</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Fidschi Dollar</displayName>
+ </currency>
+ <currency type="FKP">
+ <displayName>Falkland Pfund</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Französischer Franc</displayName>
+ <symbol>FF</symbol>
+ </currency>
+ <currency type="GBP">
+ <displayName>Pfund Sterling</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>Georgischer Kupon Larit</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>Georgischer Lari</displayName>
+ </currency>
+ <currency type="GHC">
+ <displayName>Cedi</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>Gibraltar Pfund</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>Dalasi</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Guinea Franc</displayName>
+ </currency>
+ <currency type="GNS">
+ <displayName references="RP10" draft="provisional">Guineischer Syli</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Äquatorialguinea Ekwele Guineana</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Griechische Drachme</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Quetzal</displayName>
+ </currency>
+ <currency type="GWE">
+ <displayName>Portugiesisch Guinea Escudo</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Guinea Bissau Peso</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>Guyana Dollar</displayName>
+ </currency>
+ <currency type="HKD">
+ <displayName>Hongkong Dollar</displayName>
+ </currency>
+ <currency type="HNL">
+ <displayName>Lempira</displayName>
+ </currency>
+ <currency type="HRD">
+ <displayName>Kroatischer Dinar</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Kuna</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>Gourde</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Forint</displayName>
+ </currency>
+ <currency type="IDR">
+ <displayName>Rupiah</displayName>
+ </currency>
+ <currency type="IEP">
+ <displayName>Irisches Pfund</displayName>
+ </currency>
+ <currency type="ILP">
+ <displayName>Israelisches Pfund</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Schekel</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Indische Rupie</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>Irak Dinar</displayName>
+ </currency>
+ <currency type="IRR">
+ <displayName>Rial</displayName>
+ </currency>
+ <currency type="ISK">
+ <displayName>Isländische Krone</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>Italienische Lire</displayName>
+ <displayName alt="proposed-u45-1" draft="provisional">Italienische Lira</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>Jamaika Dollar</displayName>
+ </currency>
+ <currency type="JOD">
+ <displayName>Jordanischer Dinar</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>Yen</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>Kenia Schilling</displayName>
+ </currency>
+ <currency type="KGS">
+ <displayName>Som</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>Riel</displayName>
+ </currency>
+ <currency type="KMF">
+ <displayName>Komoren Franc</displayName>
+ </currency>
+ <currency type="KPW">
+ <displayName>Nordkoreanischer Won</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Südkoreanischer Won</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>Kuwait Dinar</displayName>
+ </currency>
+ <currency type="KYD">
+ <displayName>Kaiman-Dollar</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Tenge</displayName>
+ </currency>
+ <currency type="LAK">
+ <displayName>Kip</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>Libanesisches Pfund</displayName>
+ </currency>
+ <currency type="LKR">
+ <displayName>Sri Lanka Rupie</displayName>
+ </currency>
+ <currency type="LRD">
+ <displayName>Liberianischer Dollar</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Loti</displayName>
+ </currency>
+ <currency type="LSM">
+ <displayName draft="provisional">Maloti</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>Litauischer Litas</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Litauischer Talonas</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName draft="provisional">Luxemburgischer Franc (konvertibel)</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Luxemburgischer Franc</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName draft="provisional">Luxemburgischer Finanz-Franc</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Lettischer Lats</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>Lettischer Rubel</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>Libyscher Dinar</displayName>
+ </currency>
+ <currency type="MAD">
+ <displayName>Marokkanischer Dirham</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>Marokkanischer Franc</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>Moldau Leu</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>Madagaskar Ariary</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Madagaskar Franc</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>Denar</displayName>
+ </currency>
+ <currency type="MLF">
+ <displayName draft="provisional">Malischer Franc</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Kyat</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>Tugrik</displayName>
+ </currency>
+ <currency type="MOP">
+ <displayName>Pataca</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Ouguiya</displayName>
+ </currency>
+ <currency type="MTL">
+ <displayName>Maltesische Lira</displayName>
+ </currency>
+ <currency type="MTP">
+ <displayName>Maltesisches Pfund</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>Mauritius Rupie</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>Rufiyaa</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Malawi Kwacha</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName>Mexikanischer Peso</displayName>
+ </currency>
+ <currency type="MXP">
+ <displayName>Mexikanischer Silber-Peso (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>Mexican Unidad de Inversion (UDI)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Malaysischer Ringgit</displayName>
+ </currency>
+ <currency type="MZE">
+ <displayName draft="provisional">Mosambikanischer Escudo</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Metical</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName>Namibia Dollar</displayName>
+ </currency>
+ <currency type="NGN">
+ <displayName>Naira</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>Cordoba</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>Gold-Cordoba</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Holländischer Gulden</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Norwegische Krone</displayName>
+ </currency>
+ <currency type="NPR">
+ <displayName>Nepalesische Rupie</displayName>
+ </currency>
+ <currency type="NZD">
+ <displayName>Neuseeland Dollar</displayName>
+ </currency>
+ <currency type="OMR">
+ <displayName>Rial Omani</displayName>
+ </currency>
+ <currency type="PAB">
+ <displayName>Balboa</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>Peruanischer Inti</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>Neuer Sol</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>Sol</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Kina</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>Philippinischer Peso</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>Pakistanische Rupie</displayName>
+ </currency>
+ <currency type="PLN">
+ <displayName>Zloty</displayName>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Zloty (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Portugiesischer Escudo</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>Guarani</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>Katar Riyal</displayName>
+ </currency>
+ <currency type="RHD">
+ <displayName draft="provisional">Rhodesischer Dollar</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>Leu</displayName>
+ </currency>
+ <currency type="RON">
+ <displayName references="RP10" draft="provisional">Neuer Rumänischer Leu</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>Russischer Rubel (neu)</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Russischer Rubel (alt)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>Ruanda Franc</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>Saudi Riyal</displayName>
+ </currency>
+ <currency type="SBD">
+ <displayName>Salomonen Dollar</displayName>
+ </currency>
+ <currency type="SCR">
+ <displayName>Seychellen Rupie</displayName>
+ </currency>
+ <currency type="SDD">
+ <displayName>Sudanesischer Dinar</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>Sudanesisches Pfund</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>Schwedische Krone</displayName>
+ </currency>
+ <currency type="SGD">
+ <displayName>Singapur Dollar</displayName>
+ </currency>
+ <currency type="SHP">
+ <displayName>St. Helena Pfund</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Tolar</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Slowakische Krone</displayName>
+ </currency>
+ <currency type="SLL">
+ <displayName>Leone</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>Somalia Schilling</displayName>
+ </currency>
+ <currency type="SRD">
+ <displayName references="RP10" draft="provisional">Surinamischer Dollar</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>Suriname Gulden</displayName>
+ </currency>
+ <currency type="STD">
+ <displayName>Dobra</displayName>
+ </currency>
+ <currency type="SUR">
+ <displayName>Sowjetischer Rubel</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>El Salvador Colon</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>Syrisches Pfund</displayName>
+ </currency>
+ <currency type="SZL">
+ <displayName>Lilangeni</displayName>
+ </currency>
+ <currency type="THB">
+ <displayName>Baht</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>Tadschikistan Rubel</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Tadschikistan Somoni</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Turkmenistan-Manat</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>Tunesischer Dinar</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>Paʻanga</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>Timor Escudo</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Türkische Lira</displayName>
+ </currency>
+ <currency type="TRY">
+ <displayName>Neue Türkische Lira</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Trinidad und Tobago Dollar</displayName>
+ </currency>
+ <currency type="TWD">
+ <displayName>Neuer Taiwan Dollar</displayName>
+ </currency>
+ <currency type="TZS">
+ <displayName>Tansania Schilling</displayName>
+ </currency>
+ <currency type="UAH">
+ <displayName>Hryvnia</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Ukrainischer Karbovanetz</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Uganda Schilling (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Uganda Schilling</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>US Dollar</displayName>
+ </currency>
+ <currency type="USN">
+ <displayName>US Dollar (Nächster Tag)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>US Dollar (Gleicher Tag)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName references="RP10" draft="provisional">Uruguayischer Neuer Peso (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>Uruguayischer Peso</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName>Usbekistan Sum</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Bolivar</displayName>
+ </currency>
+ <currency type="VND">
+ <displayName>Dong</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>Vatu</displayName>
+ </currency>
+ <currency type="WST">
+ <displayName>Tala</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>CFA Franc (Äquatorial)</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName draft="provisional">Silber</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>Gold</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>Europäische Rechnungseinheit</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName draft="provisional">Europäische Währungseinheit (XBB)</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>Europäische Rechnungseinheit (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>Europäische Rechnungseinheit (XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>Ostkaribischer Dollar</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>Sonderziehungsrechte</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName draft="provisional">Europäische Währungseinheit (XEU)</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>Französischer Gold-Franc</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>Französischer UIC-Franc</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>CFA Franc (West)</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName draft="provisional">Palladium</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>CFP Franc</displayName>
+ </currency>
+ <currency type="XPT">
+ <displayName draft="provisional">Platin</displayName>
+ </currency>
+ <currency type="XRE">
+ <displayName draft="provisional">RINET Funds</displayName>
+ </currency>
+ <currency type="XTS">
+ <displayName draft="provisional">Testwährung</displayName>
+ </currency>
+ <currency type="XXX">
+ <displayName draft="unconfirmed">keine Währung</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>Jemen Dinar</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Jemen Rial</displayName>
+ </currency>
+ <currency type="YUD">
+ <displayName>Jugoslawischer Dinar (1966-1990)</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>Neuer Dinar</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>Jugoslawischer Dinar (konvertibel)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Rand</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Kwacha</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Neuer Zaire</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Zaire</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Simbabwe Dollar</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>ja:j</yesstr>
+ <nostr>nein:n</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1" uri="http://www2.bibliothek.uni-augsburg.de/kfe/kkb_mab_037.html">Languages</reference>
+ <reference type="RP10" uri="http://www.ids-mannheim.de/reform/regelwerk.pdf">German spelling, official new rules (for capitalization see pp. 51, 64-67 = §§ 60-64)</reference>
+ <reference type="RP11" uri="http://de.wikipedia.org/wiki/Angloamerikanisches_Ma%C3%9Fsystem">US measurement system in German</reference>
+ <reference type="RP2" uri="http://www.allegro-c.de/formate/sprachen.htm">Languages 2</reference>
+ <reference type="RP3" uri="http://www.metatab.de/meta_tags/sprachenkuerzel2.htm">Languages 3</reference>
+ <reference type="RP4" uri="http://www.auswaertiges-amt.de/www/de/infoservice/download/pdf/publikationen/staatennamen.pdf">Territories</reference>
+ <reference type="RP5" uri="http://de.wikipedia.org/wiki/Liste_der_Unicode-Blöcke">Scripts</reference>
+ <reference type="RP6" uri="http://www.oenb.at/ebusinesscodes/isocodes?lang=de&amp;mode=isocodes">Currencies</reference>
+ <reference type="RP7" uri="http://de.wikipedia.org/wiki/ISO_4217">Currencies 2</reference>
+ <reference type="RP8" uri="http://de.wikipedia.org/wiki/Prozent">Prozent</reference>
+ <reference type="RP9" uri="http://afrika.heim.at">Territories of Africa in German</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/de_AT.xml b/libs/Zend/Locale/Data/de_AT.xml
new file mode 100755
index 0000000000..40944ef1a8
--- /dev/null
+++ b/libs/Zend/Locale/Data/de_AT.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.42 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="de"/>
+ <territory type="AT"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Jän</month>
+ <month type="3">Mär</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Jänner</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, dd. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH:mm' Uhr 'z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd. MMMM</dateFormatItem>
+ <dateFormatItem id="yyMMdd" draft="provisional">dd.MM.yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/de_BE.xml b/libs/Zend/Locale/Data/de_BE.xml
new file mode 100755
index 0000000000..8bc57b9482
--- /dev/null
+++ b/libs/Zend/Locale/Data/de_BE.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.42 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="de"/>
+ <territory type="BE"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="3">Mär</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Son</day>
+ <day type="mon">Mon</day>
+ <day type="tue">Die</day>
+ <day type="wed">Mit</day>
+ <day type="thu">Don</day>
+ <day type="fri">Fre</day>
+ <day type="sat">Sam</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH 'h' mm 'min' ss 's' z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMd" draft="provisional">d/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="FRF">
+ <displayName>Franken</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/de_CH.xml b/libs/Zend/Locale/Data/de_CH.xml
new file mode 100755
index 0000000000..8e020312b4
--- /dev/null
+++ b/libs/Zend/Locale/Data/de_CH.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.45 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="de"/>
+ <territory type="CH"/>
+ </identity>
+ <localeDisplayNames>
+ <territories>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BN">Brunei</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="CV">Kapverden</territory>
+ <territory type="DJ">Djibouti</territory>
+ <territory type="GB">Grossbritannien</territory>
+ <territory type="MH">Marshall-Inseln</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SB">Salomon-Inseln</territory>
+ <territory type="ST">Sao Tomé und Principe</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ </localeDisplayNames>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMdd" draft="provisional">MM-dd</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>.</decimal>
+ <group>'</group>
+ </symbols>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##0.00;¤-#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/de_DE.xml b/libs/Zend/Locale/Data/de_DE.xml
new file mode 100755
index 0000000000..ef840d132b
--- /dev/null
+++ b/libs/Zend/Locale/Data/de_DE.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="de"/>
+ <territory type="DE"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/de_LI.xml b/libs/Zend/Locale/Data/de_LI.xml
new file mode 100755
index 0000000000..4cd5062c40
--- /dev/null
+++ b/libs/Zend/Locale/Data/de_LI.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.33 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="de"/>
+ <territory type="LI"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyMMdd" draft="provisional">dd.MM.yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>.</decimal>
+ <group>'</group>
+ </symbols>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/de_LU.xml b/libs/Zend/Locale/Data/de_LU.xml
new file mode 100755
index 0000000000..8fcbde0d94
--- /dev/null
+++ b/libs/Zend/Locale/Data/de_LU.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.43 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="de"/>
+ <territory type="LU"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyMMdd" draft="provisional">dd.MM.yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="LUF">
+ <symbol>F</symbol>
+ <decimal>.</decimal>
+ <group>,</group>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/dv.xml b/libs/Zend/Locale/Data/dv.xml
new file mode 100755
index 0000000000..97a4a95afb
--- /dev/null
+++ b/libs/Zend/Locale/Data/dv.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.31 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="dv"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="dv" draft="unconfirmed">Þ‹Þ¨ÞˆÞ¬Þ€Þ¨Þ„Þ¦ÞÞ°</language>
+ </languages>
+ <territories>
+ <territory type="MV" draft="unconfirmed">Þ‹Þ¨ÞˆÞ¬Þ€Þ¨ ÞƒÞ§Þ‡Þ°Þ–Þ¬</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[Þ€-Þ— Þ¦-Þ°]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D Þ™ Þš Þœ Þ¢ Þ£ Þ¥ Þ› Þ˜ Þ  Þ¡ Þ¤ Þ-ÞŸ Þ±]</exemplarCharacters>
+ </characters>
+ <numbers>
+ <symbols>
+ <list draft="unconfirmed">،</list>
+ <nativeZeroDigit draft="unconfirmed">Ù </nativeZeroDigit>
+ </symbols>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern draft="unconfirmed">#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern draft="unconfirmed">#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="MVR">
+ <symbol draft="unconfirmed">Þƒ.</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/dv_MV.xml b/libs/Zend/Locale/Data/dv_MV.xml
new file mode 100755
index 0000000000..486747ea09
--- /dev/null
+++ b/libs/Zend/Locale/Data/dv_MV.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.30 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="dv"/>
+ <territory type="MV"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">d-M-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/dz.xml b/libs/Zend/Locale/Data/dz.xml
new file mode 100755
index 0000000000..dfaf0a4fb8
--- /dev/null
+++ b/libs/Zend/Locale/Data/dz.xml
@@ -0,0 +1,364 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.40 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="dz"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar" draft="unconfirmed">ཨེ་ར་སྦིག</language>
+ <language type="art" draft="unconfirmed">བཟོ་བཟོའ(གཞན)</language>
+ <language type="as" draft="unconfirmed">ཨ་ས་མི་སི</language>
+ <language type="bh" draft="unconfirmed">བི་ཧ་ལི</language>
+ <language type="bn" draft="unconfirmed">བེངྒ་ལི</language>
+ <language type="bo" draft="unconfirmed">བོད་à½</language>
+ <language type="cs" draft="unconfirmed">ཅེཀ</language>
+ <language type="da" draft="unconfirmed">ཌེ་ནིཤ</language>
+ <language type="de" draft="unconfirmed">ཇཱར་མཱན</language>
+ <language type="dv" draft="unconfirmed">དི་བེ་ཧི</language>
+ <language type="dz" draft="unconfirmed">རྫོང་à½</language>
+ <language type="egy" draft="unconfirmed">ཨི་ཇིཔ་ཤཱན (སྔ་དུས་ཀྱི)</language>
+ <language type="el" draft="unconfirmed">གིརིཀ</language>
+ <language type="en" draft="unconfirmed">ཨིང་ལིཤ</language>
+ <language type="es" draft="unconfirmed">སིཔེ་ནིཤ</language>
+ <language type="fa" draft="unconfirmed">པར་ཤི་ཡན</language>
+ <language type="fr" draft="unconfirmed">ཕེ་རེནཆེ</language>
+ <language type="ga" draft="unconfirmed">ཨའི་རིཤ</language>
+ <language type="grc" draft="unconfirmed">གིརིཀ, སྔ་དུས་ཀྱི (༡༤༥༣)</language>
+ <language type="he" draft="unconfirmed">ཧི་བུརུ</language>
+ <language type="hi" draft="unconfirmed">ཧིན་དི</language>
+ <language type="him" draft="unconfirmed">ཧི་མ་ཅ་ལི</language>
+ <language type="inc" draft="unconfirmed">ཨིན་ཌིཀ (གཞན)</language>
+ <language type="it" draft="unconfirmed">ཨི་ཊ་ལི་རན</language>
+ <language type="km" draft="unconfirmed">à½à½ºà¼‹à½˜à½¢</language>
+ <language type="kn" draft="unconfirmed">ཀ་ན་ཌ</language>
+ <language type="ko" draft="unconfirmed">ཀོ་རིཡན</language>
+ <language type="ks" draft="unconfirmed">ཀེཤ་མི་རི</language>
+ <language type="lo" draft="unconfirmed">ལའོ</language>
+ <language type="ml" draft="unconfirmed">མ་ལ་ཡ་ལམ</language>
+ <language type="mn" draft="unconfirmed">སོག་པོའི་à½</language>
+ <language type="mnc" draft="unconfirmed">མཱན་ཅུ</language>
+ <language type="mni" draft="unconfirmed">མ་ནི་པུ་རི</language>
+ <language type="mr" draft="unconfirmed">མ་ར་à½à½²</language>
+ <language type="my" draft="unconfirmed">བར་མིསི</language>
+ <language type="ne" draft="unconfirmed">ནེ་པ་ལི</language>
+ <language type="new" draft="unconfirmed">ནི་à½à¼‹à½¢à½²</language>
+ <language type="nl" draft="unconfirmed">ཌཆ</language>
+ <language type="no" draft="unconfirmed">ནོར་à½à½²à¼‹à½‡à½²à¼‹à½¡à½“</language>
+ <language type="or" draft="unconfirmed">ཨོ་རི་ཡ</language>
+ <language type="pa" draft="unconfirmed">པཱན་ཇ་བི</language>
+ <language type="pi" draft="unconfirmed">པ་ལི</language>
+ <language type="ru" draft="unconfirmed">ར་ཤི་ཡན</language>
+ <language type="sa" draft="unconfirmed">སཾསà¾à¾²à¾€à½</language>
+ <language type="si" draft="unconfirmed">སིན་ཧ་ལིསི</language>
+ <language type="ta" draft="unconfirmed">à½à¼‹à½˜à½²à½£</language>
+ <language type="te" draft="unconfirmed">à½à½ºà¼‹à½£à½´à¼‹à½‚ུ</language>
+ <language type="th" draft="unconfirmed">à½à½±à½ à½º</language>
+ <language type="ur" draft="unconfirmed">ཨུར་དུ</language>
+ <language type="zh" draft="unconfirmed">རགྱ་མི་à½</language>
+ </languages>
+ <scripts>
+ <script type="Arab" draft="unconfirmed">ཨེ་རེ་སྦིག</script>
+ <script type="Beng" draft="unconfirmed">བེངྒ་ལི</script>
+ <script type="Brai" draft="unconfirmed">བེརེལ</script>
+ <script type="Cyrl" draft="unconfirmed">སིརི་ལིཀ</script>
+ <script type="Deva" draft="unconfirmed">དི་à½à¼‹à½“་གརི</script>
+ <script type="Grek" draft="unconfirmed">གིརིཀ</script>
+ <script type="Gujr" draft="unconfirmed">གུ་ཇ་ར་à½à½²</script>
+ <script type="Guru" draft="unconfirmed">གུར་མུ་à½à½²</script>
+ <script type="Hang" draft="unconfirmed">ཧང་གུལ</script>
+ <script type="Hani" draft="unconfirmed">ཧཱན</script>
+ <script type="Hans" draft="unconfirmed">ལུགས་གསར ཧཱན</script>
+ <script type="Hant" draft="unconfirmed">ལུགས་རྙིང ཧཱན</script>
+ <script type="Hebr" draft="unconfirmed">ཧི་བུརུ</script>
+ <script type="Hira" draft="unconfirmed">ཧི་ར་ག་ན</script>
+ <script type="Kana" draft="unconfirmed">ཀ་à½à¼‹à½€à¼‹à½“</script>
+ <script type="Khmr" draft="unconfirmed">à½à½ºà¼‹à½˜à½¢</script>
+ <script type="Knda" draft="unconfirmed">ཀ་ན་ཌ</script>
+ <script type="Laoo" draft="unconfirmed">ལའོ</script>
+ <script type="Latn" draft="unconfirmed">ལེ་ཊིན</script>
+ <script type="Limb" draft="unconfirmed">ལིམ་བུ</script>
+ <script type="Mlym" draft="unconfirmed">མ་ལ་ཡ་ལམ</script>
+ <script type="Mong" draft="unconfirmed">སོག་པོ</script>
+ <script type="Mymr" draft="unconfirmed">མི་མར</script>
+ <script type="Orya" draft="unconfirmed">ཨོ་རི་ཡ</script>
+ <script type="Qaai" draft="unconfirmed">སྔར་རྒྱུན</script>
+ <script type="Sinh" draft="unconfirmed">སིན་ཧ་ལ</script>
+ <script type="Taml" draft="unconfirmed">à½à¼‹à½˜à½²à½£</script>
+ <script type="Telu" draft="unconfirmed">à½à½ºà¼‹à½£à½´à¼‹à½‚ུ</script>
+ <script type="Thaa" draft="unconfirmed">à½à½±à¼‹à½“</script>
+ <script type="Tibt" draft="unconfirmed">བོད</script>
+ <script type="Zyyy" draft="unconfirmed">སྤྱིར</script>
+ </scripts>
+ <territories>
+ <territory type="AE" draft="unconfirmed">ཡུ་ནའི་ཊེཊ་ཨ་ར བ་ཨེ་མི་རེཊསི</territory>
+ <territory type="AF" draft="unconfirmed">ཨཕ་ག་ནིསི་à½à½±à½“</territory>
+ <territory type="AQ" draft="unconfirmed">ཨེན་ཊཱག་ཊི་ཀ</territory>
+ <territory type="AR" draft="unconfirmed">ཨར་ཇེན་ཊི་ན</territory>
+ <territory type="AT" draft="unconfirmed">ཨས་ཊི་ཡ</territory>
+ <territory type="AU" draft="unconfirmed">ཨས་ཊེཡེ་ལི་ཡ</territory>
+ <territory type="BD" draft="unconfirmed">བངྒ་ལ་དེཤ</territory>
+ <territory type="BE" draft="unconfirmed">བེལ་ཇིཡམ</territory>
+ <territory type="BH" draft="unconfirmed">བཧ་རེན</territory>
+ <territory type="BR" draft="unconfirmed">བཱརཱ་ཛིལ</territory>
+ <territory type="BT" draft="unconfirmed">འབྲུག</territory>
+ <territory type="CA" draft="unconfirmed">ཀེ་ན་ཌ</territory>
+ <territory type="CH" draft="unconfirmed">སུའིཊ་ཛར་ལེན</territory>
+ <territory type="CN" draft="unconfirmed">རྒྱ་མི</territory>
+ <territory type="CU" draft="unconfirmed">ཀིའུ་སྦ</territory>
+ <territory type="CZ" draft="unconfirmed">ཅེཀ་རི་པབ་ལིཀ</territory>
+ <territory type="DE" draft="unconfirmed">ཇཱར་མ་ནི</territory>
+ <territory type="DK" draft="unconfirmed">ཌེན་མཱཀ</territory>
+ <territory type="EG" draft="unconfirmed">ཨི་ཇིཔཊ</territory>
+ <territory type="ES" draft="unconfirmed">སིཔཱེན</territory>
+ <territory type="FI" draft="unconfirmed">ཕིན་ལེནཌ</territory>
+ <territory type="FR" draft="unconfirmed">ཕརཱནསི</territory>
+ <territory type="GB" draft="unconfirmed">ཡུ་ནའི་ཊེཊ་ཀིང་ཌམ</territory>
+ <territory type="GR" draft="unconfirmed">གིརིསི</territory>
+ <territory type="HK" draft="unconfirmed">ཧོང་ཀོང</territory>
+ <territory type="IE" draft="unconfirmed">ཨའིརི་ལེནཌ</territory>
+ <territory type="IL" draft="unconfirmed">ཨིཛ་རཱེལ</territory>
+ <territory type="IN" draft="unconfirmed">རྒྱ་གར</territory>
+ <territory type="IQ" draft="unconfirmed">ཨི་རཀ</territory>
+ <territory type="IR" draft="unconfirmed">ཨི་རཱན</territory>
+ <territory type="IS" draft="unconfirmed">ཨའིསི་ལེནཌ</territory>
+ <territory type="IT" draft="unconfirmed">ཨྀཊ་ལི</territory>
+ <territory type="JM" draft="unconfirmed">ཇ་མའི་ཀ</territory>
+ <territory type="JP" draft="unconfirmed">ཇ་པཱན</territory>
+ <territory type="KE" draft="unconfirmed">ཀེ་ནི་ཡ</territory>
+ <territory type="KH" draft="unconfirmed">ཀམ་བོ་ཌི་ཡ</territory>
+ <territory type="KP" draft="unconfirmed">བྱང་ཀོ་རི་ཡ</territory>
+ <territory type="KR" draft="unconfirmed">ལྷོ་ཀོ་རི་ཡ</territory>
+ <territory type="KW" draft="unconfirmed">ཀུ་à½à½ºà½Š</territory>
+ <territory type="LA" draft="unconfirmed">ལ་འོསུ</territory>
+ <territory type="LB" draft="unconfirmed">ལེ་བཱ་ནཱོན</territory>
+ <territory type="LK" draft="unconfirmed">ཤྲཱྀ་ལངཀ</territory>
+ <territory type="MM" draft="unconfirmed">མེ་མར</territory>
+ <territory type="MN" draft="unconfirmed">སོག་པོ</territory>
+ <territory type="MS" draft="unconfirmed">མོན་ས་རཊི</territory>
+ <territory type="MU" draft="unconfirmed">མོ་རི་ཤིཡསི</territory>
+ <territory type="MV" draft="unconfirmed">མཱལ་ཌིབས</territory>
+ <territory type="MX" draft="unconfirmed">མེཀསི་ཀོ</territory>
+ <territory type="MY" draft="unconfirmed">མ་ལེ་ཤི་ཡ</territory>
+ <territory type="NL" draft="unconfirmed">ནེ་དར་ལེནཌསི</territory>
+ <territory type="NO" draft="unconfirmed">ནོ་à½à½º</territory>
+ <territory type="NP" draft="unconfirmed">བལ་ཡུལ</territory>
+ <territory type="NZ" draft="unconfirmed">ནིའུ་ཛི་ལེནཌ</territory>
+ <territory type="PA" draft="unconfirmed">པ་ན་མཱ</territory>
+ <territory type="PK" draft="unconfirmed">པ་ཀིསི་à½à½±à½“</territory>
+ <territory type="PS" draft="unconfirmed">པེ་ལིསི་ཊི་ནིཡ ན་ཊེ་རི་ངོ་རི</territory>
+ <territory type="PT" draft="unconfirmed">པོར་ཅུ་གལ</territory>
+ <territory type="QA" draft="unconfirmed">ཀ་à½à½¢</territory>
+ <territory type="SA" draft="unconfirmed">སའུ་དི་ཨེ་ར་སྦི་ཡ</territory>
+ <territory type="SE" draft="unconfirmed">སུའི་ཌན</territory>
+ <territory type="SI" draft="unconfirmed">སིལོ་བེ་ནི་ཡ</territory>
+ <territory type="TH" draft="unconfirmed">à½à½±à½ à½²à¼‹à½£à½ºà½“ཌ</territory>
+ <territory type="TJ" draft="unconfirmed">à½à¼‹à½‡à½‚་ཀིསི་à½à½±à½“</territory>
+ <territory type="TW" draft="unconfirmed">à½à½ à½²à¼‹à½à½±à½“</territory>
+ <territory type="US" draft="unconfirmed">ཡུ་ནའིཊེཊ་སི་ཊེསི</territory>
+ <territory type="UZ" draft="unconfirmed">ཨུཛ་བེ་ཀིསི་à½à½±à½“</territory>
+ <territory type="VN" draft="unconfirmed">བེཊ་ནཱམ</territory>
+ <territory type="ZA" draft="unconfirmed">སའུà½à¼‹à½¨à½•à¼‹à½¢à½²à¼‹à½€</territory>
+ <territory type="ZM" draft="unconfirmed">ཛམ་བི་ཡ</territory>
+ <territory type="ZW" draft="unconfirmed">ཛིམ་བབ་à½à½º</territory>
+ </territories>
+ <keys>
+ <key type="collation" draft="unconfirmed">གནས་སདུད་རིམ་ སགྲིག</key>
+ </keys>
+ <types>
+ <type type="traditional" key="collation" draft="unconfirmed">ལུགས་སྲོལ</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[ཀ ྠའྑ ག ྒ ང ྔ ཅ-ཇ ྗ ཉ ྙ འྟ འད ྡ ན ྣ པ ྤ ཕ བ ྦ མ ྨ ཙ ྩ ཚ ཛ ྫ འྭ ཞ-ཡ ྱ ར ྲ ལ ླ ཤ ྵ ས ཧ ྷ ཨ ི ུ ེ ོ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[ཊ-ཌ ཎ ཥ]</exemplarCharacters>
+ <mapping choice="utf-8" registry="iana" draft="unconfirmed"/>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">&quot;</quotationStart>
+ <quotationEnd draft="unconfirmed">&quot;</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">'</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">'</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">ཟླ་ ༡</month>
+ <month type="2" draft="unconfirmed">ཟླ་ ༢</month>
+ <month type="3" draft="unconfirmed">ཟླ་ ༣</month>
+ <month type="4" draft="unconfirmed">ཟླ་ ༤</month>
+ <month type="5" draft="unconfirmed">ཟླ་ ༥</month>
+ <month type="6" draft="unconfirmed">ཟླ་ ༦</month>
+ <month type="7" draft="unconfirmed">ཟླ་ ༧</month>
+ <month type="8" draft="unconfirmed">ཟླ་ ༨</month>
+ <month type="9" draft="unconfirmed">ཟླ་ ༩</month>
+ <month type="10" draft="unconfirmed">ཟླ་ ༡༠</month>
+ <month type="11" draft="unconfirmed">ཟླ་ ༡༡</month>
+ <month type="12" draft="unconfirmed">ཟླ་ ༡༢</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">སྤྱི་ཟླà½à¼‹à½‘ངཔ་</month>
+ <month type="2" draft="unconfirmed">སྤྱི་ཟླà½à¼‹à½‚ཉིས་པ་</month>
+ <month type="3" draft="unconfirmed">སྤྱི་ཟླà½à¼‹à½‚སུམ་པ་</month>
+ <month type="4" draft="unconfirmed">སྤྱི་ཟླà½à¼‹à½–ཞི་པ་</month>
+ <month type="5" draft="unconfirmed">སྤྱི་ཟླà½à¼‹à½£à¾”་པ་</month>
+ <month type="6" draft="unconfirmed">སྤྱི་ཟླà½à¼‹à½‘ྲུག་པ་</month>
+ <month type="7" draft="unconfirmed">སྤྱི་ཟླà½à¼‹à½–དུན་པ་</month>
+ <month type="8" draft="unconfirmed">སྤྱི་ཟླà½à¼‹à½–རྒྱད་པ་</month>
+ <month type="9" draft="unconfirmed">སྤྱི་ཟླà½à¼‹à½‘གུ་པ་</month>
+ <month type="10" draft="unconfirmed">སྤྱི་ཟླà½à¼‹à½–ཅུ་པ་</month>
+ <month type="11" draft="unconfirmed">སྤྱི་ཟླà½à¼‹à½–ཅུ་གཅིག་པ་</month>
+ <month type="12" draft="unconfirmed">སྤྱི་ཟླà½à¼‹à½–ཅུ་གཉིས་པ་</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">ཟླ་</day>
+ <day type="mon" draft="unconfirmed">མིར་</day>
+ <day type="tue" draft="unconfirmed">ལྷག་</day>
+ <day type="wed" draft="unconfirmed">ཕུར་</day>
+ <day type="thu" draft="unconfirmed">སངས་</day>
+ <day type="fri" draft="unconfirmed">སྤེན་</day>
+ <day type="sat" draft="unconfirmed">ཉི་</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">གཟའ་ཟླ་བ་</day>
+ <day type="mon" draft="unconfirmed">གཟའ་མིག་དམར་</day>
+ <day type="tue" draft="unconfirmed">གཟའ་ལྷག་པ་</day>
+ <day type="wed" draft="unconfirmed">གཟའ་ཕུར་བུ་</day>
+ <day type="thu" draft="unconfirmed">གཟའ་པ་སངས་</day>
+ <day type="fri" draft="unconfirmed">གཟའ་སྤེན་པ་</day>
+ <day type="sat" draft="unconfirmed">གཟའ་ཉི་མ་</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">བཞི་དཔྱ་༡</quarter>
+ <quarter type="2" draft="unconfirmed">བཞི་དཔྱ་༢</quarter>
+ <quarter type="3" draft="unconfirmed">བཞི་དཔྱ་༣</quarter>
+ <quarter type="4" draft="unconfirmed">བཞི་དཔྱ་༤</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">བཞི་དཔྱ་དང་པ་</quarter>
+ <quarter type="2" draft="unconfirmed">བཞི་དཔྱ་གཉིས་པ་</quarter>
+ <quarter type="3" draft="unconfirmed">བཞི་དཔྱ་གསུམ་པ་</quarter>
+ <quarter type="4" draft="unconfirmed">བཞི་དཔྱ་བཞི་པ་</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am draft="unconfirmed">སྔ་ཆ་</am>
+ <pm draft="unconfirmed">ཕྱི་ཆ་</pm>
+ <dateFormats>
+ <default choice="long" draft="unconfirmed"/>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">སྤྱི་ལོ་yyyy ཟླ་ MMMM ཚེས་ dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">སྤྱི་ལོ་yyyy ཟླ་ MMMM ཚེས་ dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">སྤྱི་ལོ་yyyy ཟླ་ MMM ཚེས་ dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">སྤྱི་ལོ་ yyyy ཟླ་ MMM ཚེས་ dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <default choice="long" draft="unconfirmed"/>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">ཆུ་ཚོད་ h སà¾à½¢à¼‹à½˜à¼‹ mm སà¾à½¢à¼‹à½†à½±à¼‹ ss a zzzz</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">ཆུ་ཚོད་ h སà¾à½¢à¼‹à½˜à¼‹ mm སà¾à½¢à¼‹à½†à½±à¼‹ ss a zzz</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">ཆུ་ཚོད་h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">ཆུ་ཚོད་ h སà¾à½¢à¼‹à½˜à¼‹ mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <default choice="long" draft="unconfirmed"/>
+ <dateTimeFormatLength type="full">
+ <dateTimeFormat>
+ <pattern draft="unconfirmed">{1} {0}</pattern>
+ </dateTimeFormat>
+ </dateTimeFormatLength>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Asia/Thimphu">
+ <long>
+ <generic draft="unconfirmed">Bhutan Standard Time</generic>
+ <standard draft="unconfirmed">Bhutan Standard Time</standard>
+ <daylight draft="unconfirmed">Bhutan Standard Time</daylight>
+ </long>
+ <short>
+ <generic draft="unconfirmed">BST</generic>
+ <standard draft="unconfirmed">BST</standard>
+ <daylight draft="unconfirmed">BST</daylight>
+ </short>
+ <exemplarCity draft="unconfirmed">à½à½²à½˜à¼‹à½•à½´à½‚</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength type="long">
+ <decimalFormat>
+ <pattern draft="unconfirmed">#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <scientificFormats>
+ <default choice="long" draft="unconfirmed"/>
+ <scientificFormatLength type="long">
+ <scientificFormat>
+ <pattern draft="unconfirmed">#E+00</pattern>
+ </scientificFormat>
+ </scientificFormatLength>
+ </scientificFormats>
+ <percentFormats>
+ <percentFormatLength type="long">
+ <percentFormat>
+ <pattern draft="unconfirmed">#,##,##0 %</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength type="long">
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/dz_BT.xml b/libs/Zend/Locale/Data/dz_BT.xml
new file mode 100755
index 0000000000..d2bd7eec14
--- /dev/null
+++ b/libs/Zend/Locale/Data/dz_BT.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.33 $"/>
+ <generation date="$Date: 2006/06/28 06:03:59 $"/>
+ <language type="dz"/>
+ <territory type="BT"/>
+ </identity>
+ <numbers>
+ <symbols>
+ <list draft="unconfirmed">དང་</list>
+ <percentSign draft="unconfirmed">བརྒ་ཆཱ</percentSign>
+ <nativeZeroDigit draft="unconfirmed">༠</nativeZeroDigit>
+ <infinity draft="unconfirmed">གྲངས་མེད</infinity>
+ <nan draft="unconfirmed">ཨང་མད</nan>
+ </symbols>
+ <currencies>
+ <currency type="BTN">
+ <displayName draft="unconfirmed">དངུལ་ཀྲམ་</displayName>
+ <symbol draft="unconfirmed">Nu</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ee.xml b/libs/Zend/Locale/Data/ee.xml
new file mode 100755
index 0000000000..b2173ae98b
--- /dev/null
+++ b/libs/Zend/Locale/Data/ee.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.18 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="ee"/>
+ </identity>
+ <characters>
+ <exemplarCharacters references="RP2">[a b d {dz} ɖ e ɛ f ƒ g {gb} ɣ h i k {kp} l-n {ny} ŋ o ɔ p r-t {ts} u v ʋ w-z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[c j q]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Dzv</month>
+ <month type="2" draft="unconfirmed">Dzd</month>
+ <month type="3" draft="unconfirmed">Ted</month>
+ <month type="4" draft="unconfirmed">AfÉ”</month>
+ <month type="5" draft="unconfirmed">Dam</month>
+ <month type="6" draft="unconfirmed">Mas</month>
+ <month type="7" draft="unconfirmed">Sia</month>
+ <month type="8" draft="unconfirmed">Dea</month>
+ <month type="9" draft="unconfirmed">Any</month>
+ <month type="10" draft="unconfirmed">Kel</month>
+ <month type="11" draft="unconfirmed">Ade</month>
+ <month type="12" draft="unconfirmed">Dzm</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Dzove</month>
+ <month type="2" draft="unconfirmed">Dzodze</month>
+ <month type="3" draft="unconfirmed">Tedoxe</month>
+ <month type="4" draft="unconfirmed">Afɔfiɛ</month>
+ <month type="5" draft="unconfirmed">Dama</month>
+ <month type="6" draft="unconfirmed">Masa</month>
+ <month type="7" draft="unconfirmed">Siamlɔm</month>
+ <month type="8" draft="unconfirmed">Deasiamime</month>
+ <month type="9" draft="unconfirmed">Anyɔnyɔ</month>
+ <month type="10" draft="unconfirmed">Kele</month>
+ <month type="11" draft="unconfirmed">Adeɛmekpɔxe</month>
+ <month type="12" draft="unconfirmed">Dzome</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">D</month>
+ <month type="2" draft="unconfirmed">D</month>
+ <month type="3" draft="unconfirmed">T</month>
+ <month type="4" draft="unconfirmed">A</month>
+ <month type="5" draft="unconfirmed">D</month>
+ <month type="6" draft="unconfirmed">M</month>
+ <month type="7" draft="unconfirmed">S</month>
+ <month type="8" draft="unconfirmed">D</month>
+ <month type="9" draft="unconfirmed">A</month>
+ <month type="10" draft="unconfirmed">K</month>
+ <month type="11" draft="unconfirmed">A</month>
+ <month type="12" draft="unconfirmed">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Kɔs Kwe</day>
+ <day type="mon" draft="unconfirmed">Dzo</day>
+ <day type="tue" draft="unconfirmed">Bra</day>
+ <day type="wed" draft="unconfirmed">KuÉ–</day>
+ <day type="thu" draft="unconfirmed">Yaw</day>
+ <day type="fri" draft="unconfirmed">FiÉ–</day>
+ <day type="sat" draft="unconfirmed">Mem</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Kɔsiɖa</day>
+ <day type="mon" draft="unconfirmed">DzoÉ–a</day>
+ <day type="tue" draft="unconfirmed">BraÉ–a</day>
+ <day type="wed" draft="unconfirmed">KuÉ–a</day>
+ <day type="thu" draft="unconfirmed">YawoÉ–a</day>
+ <day type="fri" draft="unconfirmed">FiÉ–a</day>
+ <day type="sat" draft="unconfirmed">MemleÉ–a</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">K</day>
+ <day type="mon" draft="unconfirmed">D</day>
+ <day type="tue" draft="unconfirmed">B</day>
+ <day type="wed" draft="unconfirmed">K</day>
+ <day type="thu" draft="unconfirmed">Y</day>
+ <day type="fri" draft="unconfirmed">F</day>
+ <day type="sat" draft="unconfirmed">M</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">AN</am>
+ <pm draft="unconfirmed">EW</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">Hafi Yesu Va Do Å‹gÉ” na Yesu</era>
+ <era type="1" draft="unconfirmed">Yesu Ŋɔli</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">HY</era>
+ <era type="1" draft="unconfirmed">YÅŠ</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="GHC">
+ <displayName draft="unconfirmed">SiÉ–i</displayName>
+ <symbol draft="unconfirmed">¢</symbol>
+ <symbol alt="variant" draft="unconfirmed">₵</symbol>
+ </currency>
+ <currency type="XOF">
+ <displayName draft="unconfirmed">Sefa</displayName>
+ <symbol draft="unconfirmed">CFA</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1" uri="http://www.omniglot.com/writing/ewe.htm">Omniglot on Ewe</reference>
+ <reference type="RP2" uri="http://developer.mimer.com/charts/ewe.htm">Mimer Ewe collation</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ee_GH.xml b/libs/Zend/Locale/Data/ee_GH.xml
new file mode 100755
index 0000000000..3af24d0c67
--- /dev/null
+++ b/libs/Zend/Locale/Data/ee_GH.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="ee"/>
+ <territory type="GH"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ee_TG.xml b/libs/Zend/Locale/Data/ee_TG.xml
new file mode 100755
index 0000000000..1ab116f91a
--- /dev/null
+++ b/libs/Zend/Locale/Data/ee_TG.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.11 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="ee"/>
+ <territory type="TG"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/el.xml b/libs/Zend/Locale/Data/el.xml
new file mode 100755
index 0000000000..5ac98cc2f3
--- /dev/null
+++ b/libs/Zend/Locale/Data/el.xml
@@ -0,0 +1,1578 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.69 $"/>
+ <generation date="$Date: 2006/10/26 22:46:08 $"/>
+ <language type="el"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar">ΑÏαβικά</language>
+ <language type="arc">ΑÏαμαϊκά</language>
+ <language type="be">ΛευκοÏωσικά</language>
+ <language type="bg">ΒουλγαÏικά</language>
+ <language type="bn">Μπενγκάλι</language>
+ <language type="bo">Θιβετιανά</language>
+ <language type="bs">Βοσνιακά</language>
+ <language type="ca">Καταλανικά</language>
+ <language type="co">ΚοÏσικανικά</language>
+ <language type="cop">Κοπτικά</language>
+ <language type="cs">Τσεχικά</language>
+ <language type="cy">Ουαλικά</language>
+ <language type="da">Δανικά</language>
+ <language type="de">ΓεÏμανικά</language>
+ <language type="egy">Αιγυπτιακά (ΑÏχαία)</language>
+ <language type="el">Ελληνικά</language>
+ <language type="en">Αγγλικά</language>
+ <language type="es">Ισπανικά</language>
+ <language type="et">Εσθονικά</language>
+ <language type="eu">Βασκικά</language>
+ <language type="fa">ΠεÏσικά</language>
+ <language type="fi">Φινλανδικά</language>
+ <language type="fr">Γαλλικά</language>
+ <language type="ga">ΙÏλανδικά</language>
+ <language type="gd">Σκωτικά Κελτικά</language>
+ <language type="grc">Ελληνικά, ΑÏχαία (έως 1453)</language>
+ <language type="grc" alt="proposed-u145-1" draft="provisional">ΑÏχαία Ελληνικά</language>
+ <language type="haw">Χαβανεζικά</language>
+ <language type="he">ΕβÏαϊκά</language>
+ <language type="hi">Χίντι</language>
+ <language type="hr">ΚÏοατικά</language>
+ <language type="hu">ΟυγγÏικά</language>
+ <language type="hy">ΑÏμενικά</language>
+ <language type="id">Ινδονησιακά</language>
+ <language type="ine">ΙνδοευÏωπαϊκά (¨Αλλη)</language>
+ <language type="ine" alt="proposed-u145-1" draft="provisional">ΙνδοευÏωπαϊκά (Άλλα)</language>
+ <language type="ira">ΙÏανικά</language>
+ <language type="is">Ισλανδικά</language>
+ <language type="it">Ιταλικά</language>
+ <language type="ja">Ιαπωνικά</language>
+ <language type="ka">ΓεωÏγιανά</language>
+ <language type="ko">ΚοÏεατικά</language>
+ <language type="la">Λατινικά</language>
+ <language type="lt">Λιθουανικά</language>
+ <language type="lv">Λετονικά</language>
+ <language type="mk">Σλαβομακεδονικά</language>
+ <language type="mn">Μογγολικά</language>
+ <language type="mo">Μολδαβικά</language>
+ <language type="mt">Μαλτεζικά</language>
+ <language type="mul">Πολλαπλές Γλώσσες</language>
+ <language type="nai">Ινδιανικά Î’ÏŒÏειας ΑμεÏικής (Άλλα)</language>
+ <language type="nl">Ολλανδικά</language>
+ <language type="no">ÎοÏβηγικά</language>
+ <language type="ota">ΤουÏκικά, Οθωμανικά (1500-1928)</language>
+ <language type="ota" alt="proposed-u145-1" draft="provisional">ΤουÏκικά, Οθωμανικά</language>
+ <language type="peo">ΑÏχαία ΠεÏσικά (600-400 Ï€.Χ.)</language>
+ <language type="peo" alt="proposed-u145-1" draft="provisional">ΑÏχαία ΠεÏσικά</language>
+ <language type="phi">Φιλιππινέζικα (Άλλα)</language>
+ <language type="phn">Φοινικικά</language>
+ <language type="pl">Πολωνικά</language>
+ <language type="pt">ΠοÏτογαλικά</language>
+ <language type="ro">Ρουμανικά</language>
+ <language type="rom">Ρωμανικά</language>
+ <language type="ru">Ρωσικά</language>
+ <language type="sem">Σημιτικά (Άλλα)</language>
+ <language type="sh">ΣεÏβοκÏοατικά</language>
+ <language type="sk">Σλοβακικά</language>
+ <language type="sl">Σλοβενικά</language>
+ <language type="sla">Σλαβικά (Άλλα)</language>
+ <language type="sq">Αλβανικά</language>
+ <language type="sr">ΣεÏβικά</language>
+ <language type="sv">Σουηδικά</language>
+ <language type="th">Ταϊλανδικά</language>
+ <language type="tr">ΤουÏκικά</language>
+ <language type="uk">ΟυκÏανικά</language>
+ <language type="vi">Βιετναμεζικά</language>
+ <language type="yi">Ιουδαϊκά</language>
+ <language type="zh">Κινεζικά</language>
+ </languages>
+ <scripts>
+ <script type="Arab">ΑÏαβικό</script>
+ <script type="Armn">ΑÏμενικό</script>
+ <script type="Brai">ΜπÏάιγ</script>
+ <script type="Copt">Κοπτικό</script>
+ <script type="Cprt">ΚυπÏιακό</script>
+ <script type="Cyrl">ΚυÏιλλικό</script>
+ <script type="Ethi">Αιθιοπικό</script>
+ <script type="Geor">ΓεωÏγιανό</script>
+ <script type="Goth">Γοτθικό</script>
+ <script type="Grek">Ελληνικό</script>
+ <script type="Hebr">ΕβÏαϊκό</script>
+ <script type="Latn">Λατινικό</script>
+ <script type="Mong">Μογγολικό</script>
+ <script type="Syrc">ΣυÏιακό</script>
+ <script type="Thai">Ταϊλανδικό</script>
+ <script type="Tibt">Θιβετιανό</script>
+ <script type="Zyyy">Κοινό</script>
+ </scripts>
+ <territories>
+ <territory type="001">Κόσμος</territory>
+ <territory type="002">ΑφÏική</territory>
+ <territory type="005">Îότια ΑμεÏική</territory>
+ <territory type="009">Ωκεανία</territory>
+ <territory type="011">Δυτική ΑφÏική</territory>
+ <territory type="013">ΚεντÏική ΑμεÏική</territory>
+ <territory type="014">Ανατολική ΑφÏική</territory>
+ <territory type="015">Î’ÏŒÏεια ΑφÏική</territory>
+ <territory type="017">Μέση ΑφÏική</territory>
+ <territory type="018">Îότια ΑφÏική [018]</territory>
+ <territory type="019">ΑμεÏική</territory>
+ <territory type="021">Î’ÏŒÏεια ΑμεÏική</territory>
+ <territory type="029">ΚαÏαϊβική</territory>
+ <territory type="030">Ανατολική Ασία</territory>
+ <territory type="034" draft="provisional">Îότια Ασία</territory>
+ <territory type="035">Îοτιοανατολική Ασία</territory>
+ <territory type="039" draft="provisional">Îότια ΕυÏώπη</territory>
+ <territory type="053">ΑυστÏαλία και Îέα Ζηλανδία</territory>
+ <territory type="054">Μελανησία</territory>
+ <territory type="057" draft="provisional">ΠεÏιοχή ΜικÏονησίας</territory>
+ <territory type="061">Πολυνησία</territory>
+ <territory type="062">Îότια ΚεντÏική Ασία</territory>
+ <territory type="142">Ασία</territory>
+ <territory type="143" draft="provisional">ΚεντÏική Ασία</territory>
+ <territory type="145">Δυτική Ασία</territory>
+ <territory type="150">ΕυÏώπη</territory>
+ <territory type="151">Ανατολική ΕυÏώπη</territory>
+ <territory type="154">Î’ÏŒÏεια ΕυÏώπη</territory>
+ <territory type="155">Δυτική ΕυÏώπη</territory>
+ <territory type="419" draft="provisional">Λατινική ΑμεÏική και ΚαÏαϊβική</territory>
+ <territory type="830">Îήσοι ΚαναλιοÏ</territory>
+ <territory type="IM">Îήσος Μαν</territory>
+ <territory type="AD">ΑνδόÏα</territory>
+ <territory type="AE">Ηνωμένα ΑÏαβικά ΕμιÏάτα</territory>
+ <territory type="AF">Αφγανιστάν</territory>
+ <territory type="AG">Αντίγκουα και ΜπαÏμποÏντα</territory>
+ <territory type="AI">Ανγκουίλα</territory>
+ <territory type="AL">Αλβανία</territory>
+ <territory type="AM">ΑÏμενία</territory>
+ <territory type="AN">Ολλανδικές Αντίλλες</territory>
+ <territory type="AO">Ανγκόλα</territory>
+ <territory type="AQ">ΑνταÏκτική</territory>
+ <territory type="AR">ΑÏγεντινή</territory>
+ <territory type="AS">ΑμεÏικανική Σαμόα</territory>
+ <territory type="AT">ΑυστÏία</territory>
+ <territory type="AU">ΑυστÏαλία</territory>
+ <territory type="AW">ΑÏοÏμπα</territory>
+ <territory type="AX">Îήσοι Aland</territory>
+ <territory type="AZ">ΑζεÏμπαϊτζάν</territory>
+ <territory type="BA">Βοσνία - ΕÏζεγοβίνη</territory>
+ <territory type="BB">ΜπαÏμπάντος</territory>
+ <territory type="BD">Μπανγκλαντές</territory>
+ <territory type="BE">Βέλγιο</territory>
+ <territory type="BF">ΜπουÏκίνα Φάσο</territory>
+ <territory type="BG">ΒουλγαÏία</territory>
+ <territory type="BH">ΜπαχÏέιν</territory>
+ <territory type="BI">ΜπουÏοÏντι</territory>
+ <territory type="BJ">Μπένιν</territory>
+ <territory type="BM">ΒεÏμοÏδες</territory>
+ <territory type="BN">ΜπÏουνέι ÎταÏουσαλάμ</territory>
+ <territory type="BO">Βολιβία</territory>
+ <territory type="BR">Î’Ïαζιλία</territory>
+ <territory type="BS">Μπαχάμες</territory>
+ <territory type="BT">Μπουτάν</territory>
+ <territory type="BV">Îήσος Μπουβέ</territory>
+ <territory type="BW">Μποτσουάνα</territory>
+ <territory type="BY">ΛευκοÏωσία</territory>
+ <territory type="BZ">Μπελίζ</territory>
+ <territory type="CA">Καναδάς</territory>
+ <territory type="CC">Îήσοι Κόκος (Κήλινγκ)</territory>
+ <territory type="CD">Κονγκό, Λαϊκή ΔημοκÏατία του</territory>
+ <territory type="CF">ΚεντÏοαφÏικανική ΔημοκÏατία</territory>
+ <territory type="CG">Κονγκό</territory>
+ <territory type="CH">Ελβετία</territory>
+ <territory type="CI">Ακτή Ελεφαντόδοντος</territory>
+ <territory type="CI" alt="proposed-u208-1" draft="provisional">Ακτή ΕλεφαντοστοÏ</territory>
+ <territory type="CK">Îήσοι Κουκ</territory>
+ <territory type="CL">Χιλή</territory>
+ <territory type="CM">ΚαμεÏοÏν</territory>
+ <territory type="CN">Κίνα</territory>
+ <territory type="CO">Κολομβία</territory>
+ <territory type="CR">Κόστα Ρίκα</territory>
+ <territory type="CS">ΣεÏβία και ΜαυÏοβοÏνιο</territory>
+ <territory type="CU">ΚοÏβα</territory>
+ <territory type="CV">Îήσοι ΠÏάσινου ΑκÏωτηÏίου</territory>
+ <territory type="CV" alt="proposed-u208-1" draft="provisional">ΠÏάσινο ΑκÏωτήÏιο</territory>
+ <territory type="CX">Îήσος ΧÏιστουγέννων</territory>
+ <territory type="CY">ΚÏÏ€Ïος</territory>
+ <territory type="CZ">Τσεχία</territory>
+ <territory type="DE">ΓεÏμανία</territory>
+ <territory type="DJ">Τζιμπουτί</territory>
+ <territory type="DK">Δανία</territory>
+ <territory type="DM">Îτομίνικα</territory>
+ <territory type="DO">Δομινικανή ΔημοκÏατία</territory>
+ <territory type="DZ">ΑλγεÏία</territory>
+ <territory type="EC">ΙσημεÏινός</territory>
+ <territory type="EE">Εσθονία</territory>
+ <territory type="EG">Αίγυπτος</territory>
+ <territory type="EH">Δυτική ΣαχάÏα</territory>
+ <territory type="ER">ΕÏυθÏαία</territory>
+ <territory type="ES">Ισπανία</territory>
+ <territory type="ET">Αιθιοπία</territory>
+ <territory type="FI">Φινλανδία</territory>
+ <territory type="FJ">Φίτζι</territory>
+ <territory type="FK">Îήσοι Φώκλαντ</territory>
+ <territory type="FM">ΜικÏονησία, Ομόσπονδες Πολιτείες της</territory>
+ <territory type="FO">Îήσοι ΦεÏόες</territory>
+ <territory type="FR">Γαλλία</territory>
+ <territory type="GA">Γκαμπόν</territory>
+ <territory type="GB">Ηνωμένο Βασίλειο</territory>
+ <territory type="GD">ΓÏενάδα</territory>
+ <territory type="GE">ΓεωÏγία</territory>
+ <territory type="GF">Γαλλική Γουιάνα</territory>
+ <territory type="GH">Γκάνα</territory>
+ <territory type="GI">ΓιβÏαλτάÏ</territory>
+ <territory type="GL">ΓÏοιλανδία</territory>
+ <territory type="GM">Γκάμπια</territory>
+ <territory type="GN">Γουινέα</territory>
+ <territory type="GP">ΓουαδελοÏπη</territory>
+ <territory type="GQ">ΙσημεÏινή Γουινέα</territory>
+ <territory type="GR">Ελλάδα</territory>
+ <territory type="GS">Îότια ΓεωÏγία και Îήσοι Îότιες Σάντουιτς</territory>
+ <territory type="GS" alt="proposed-u208-1" draft="provisional">Îότια ΓεωÏγία και Îότιες Îήσοι Σάντουιτς</territory>
+ <territory type="GT">Γουατεμάλα</territory>
+ <territory type="GU">Γκουάμ</territory>
+ <territory type="GW">Γουινέα-Μπισάου</territory>
+ <territory type="GY">Γουιάνα</territory>
+ <territory type="HK">Χονγκ Κονγκ, Ειδική Διοικητική ΠεÏιφέÏεια της Κίνας</territory>
+ <territory type="HM">Îήσοι ΧεÏντ και Μακντόναλντ</territory>
+ <territory type="HN">ΟνδοÏÏα</territory>
+ <territory type="HR">ΚÏοατία</territory>
+ <territory type="HT">Αϊτή</territory>
+ <territory type="HU">ΟυγγαÏία</territory>
+ <territory type="ID">Ινδονησία</territory>
+ <territory type="IE">ΙÏλανδία</territory>
+ <territory type="IL">ΙσÏαήλ</territory>
+ <territory type="IN">Ινδία</territory>
+ <territory type="IO">Î’Ïετανικά Έδάφη Î™Î½Î´Î¹ÎºÎ¿Ï Î©ÎºÎµÎ±Î½Î¿Ï</territory>
+ <territory type="IQ">ΙÏάκ</territory>
+ <territory type="IR">ΙÏάν, Ισλαμική ΔημοκÏατία του</territory>
+ <territory type="IS">Ισλανδία</territory>
+ <territory type="IT">Ιταλία</territory>
+ <territory type="JM">Τζαμάικα</territory>
+ <territory type="JO">ΙοÏδανία</territory>
+ <territory type="JP">Ιαπωνία</territory>
+ <territory type="KE">Κένυα</territory>
+ <territory type="KG">ΚιÏγιζία</territory>
+ <territory type="KH">Καμπότζη</territory>
+ <territory type="KI">ΚιÏιμπάτι</territory>
+ <territory type="KM">ΚομόÏες</territory>
+ <territory type="KN">Σαιντ Κιτς και Îέβις</territory>
+ <territory type="KP">ΚοÏέα, Î’ÏŒÏεια</territory>
+ <territory type="KR">ΚοÏέα, Îότια</territory>
+ <territory type="KW">Κουβέιτ</territory>
+ <territory type="KY">Îήσοι Κέιμαν</territory>
+ <territory type="KZ">Καζακστάν</territory>
+ <territory type="LA">Λατινική ΑμεÏική</territory>
+ <territory type="LB">Λίβανος</territory>
+ <territory type="LC">Αγία Λουκία</territory>
+ <territory type="LI">Λιχτενστάιν</territory>
+ <territory type="LK">ΣÏι Λάνκα</territory>
+ <territory type="LR">ΛιβεÏία</territory>
+ <territory type="LS">Λεσότο</territory>
+ <territory type="LT">Λιθουανία</territory>
+ <territory type="LU">ΛουξεμβοÏÏγο</territory>
+ <territory type="LV">Λετονία</territory>
+ <territory type="LY">ΛιβÏη</territory>
+ <territory type="MA">ΜαÏόκο</territory>
+ <territory type="MC">Μονακό</territory>
+ <territory type="MD">Μολδαβία, ΔημοκÏατία της</territory>
+ <territory type="MG">ΜαδαγασκάÏη</territory>
+ <territory type="MH">Îήσοι ΜάÏσαλ</territory>
+ <territory type="MK">ΠΓΔ Μακεδονίας</territory>
+ <territory type="ML">Μάλι</territory>
+ <territory type="MM">ΜιανμάÏ</territory>
+ <territory type="MN">Μογγολία</territory>
+ <territory type="MO">Μακάο, Ειδική Διοικητική ΠεÏιφέÏεια της Κίνας</territory>
+ <territory type="MP">Îήσοι Î’ÏŒÏειες ΜαÏιάνες</territory>
+ <territory type="MQ">ΜαÏτινίκα</territory>
+ <territory type="MR">ΜαυÏιτανία</territory>
+ <territory type="MS">ΜονσεÏάτ</territory>
+ <territory type="MT">Μάλτα</territory>
+ <territory type="MU">ΜαυÏίκιος</territory>
+ <territory type="MV">Μαλδίβες</territory>
+ <territory type="MW">Μαλάουι</territory>
+ <territory type="MX">Μεξικό</territory>
+ <territory type="MY">Μαλαισία</territory>
+ <territory type="MZ">Μοζαμβίκη</territory>
+ <territory type="NA">Îαμίμπια</territory>
+ <territory type="NC">Îέα Καληδονία</territory>
+ <territory type="NE">ÎίγηÏ</territory>
+ <territory type="NF">Îήσος ÎÏŒÏφολκ</territory>
+ <territory type="NG">ÎιγηÏία</territory>
+ <territory type="NI">ÎικαÏάγουα</territory>
+ <territory type="NL">Ολλανδία</territory>
+ <territory type="NO">ÎοÏβηγία</territory>
+ <territory type="NP">Îεπάλ</territory>
+ <territory type="NR">ÎαοÏÏου</territory>
+ <territory type="NU">ÎιοÏε</territory>
+ <territory type="NZ">Îέα Ζηλανδία</territory>
+ <territory type="OM">Ομάν</territory>
+ <territory type="PA">Παναμάς</territory>
+ <territory type="PE">ΠεÏοÏ</territory>
+ <territory type="PF">Γαλλική Πολυνησία</territory>
+ <territory type="PG">ΠαποÏα - Îέα Γουινέα</territory>
+ <territory type="PH">Φιλιππίνες</territory>
+ <territory type="PK">Πακιστάν</territory>
+ <territory type="PL">Πολωνία</territory>
+ <territory type="PM">Σαιντ Î Î¹Î­Ï ÎºÎ±Î¹ Μικελόν</territory>
+ <territory type="PN">ΠίτκεÏν</territory>
+ <territory type="PR">ΠουέÏτο Ρίκο</territory>
+ <territory type="PS">Παλαιστινιακά Εδάφη</territory>
+ <territory type="PT">ΠοÏτογαλία</territory>
+ <territory type="PW">Παλάου</territory>
+ <territory type="PY">ΠαÏαγουάη</territory>
+ <territory type="QA">ΚατάÏ</territory>
+ <territory type="QO">ΠεÏιφεÏειακή Ωκεανία</territory>
+ <territory type="RE">Ρεϋνιόν</territory>
+ <territory type="RO">Ρουμανία</territory>
+ <territory type="RU">Ρωσία</territory>
+ <territory type="RW">Ρουάντα</territory>
+ <territory type="SA">Σαουδική ΑÏαβία</territory>
+ <territory type="SB">Îήσοι Σολομώντος</territory>
+ <territory type="SC">Σεϋχέλλες</territory>
+ <territory type="SD">Σουδάν</territory>
+ <territory type="SE">Σουηδία</territory>
+ <territory type="SG">ΣιγκαποÏÏη</territory>
+ <territory type="SH">Αγία Ελένη</territory>
+ <territory type="SI">Σλοβενία</territory>
+ <territory type="SJ">Îήσοι Î£Î²Î¬Î»Î¼Ï€Î±Ï ÎºÎ±Î¹ Γιαν Μαγιέν</territory>
+ <territory type="SK">Σλοβακία</territory>
+ <territory type="SL">ΣιέÏα Λεόνε</territory>
+ <territory type="SM">Άγιος ΜαÏίνος</territory>
+ <territory type="SN">Σενεγάλη</territory>
+ <territory type="SO">Σομαλία</territory>
+ <territory type="SR">ΣουÏινάμ</territory>
+ <territory type="ST">Σάο Τομέ και ΠÏίνσιπε</territory>
+ <territory type="SV">Ελ ΣαλβαδόÏ</territory>
+ <territory type="SY">ΣυÏία, ΑÏαβική ΔημοκÏατία της</territory>
+ <territory type="SZ">Σουαζιλάνδη</territory>
+ <territory type="TC">Îήσοι ΤεÏκς και Κάικος</territory>
+ <territory type="TD">Τσαντ</territory>
+ <territory type="TF">Γαλλικά Îότια Εδάφη</territory>
+ <territory type="TG">Τόγκο</territory>
+ <territory type="TH">Ταϊλάνδη</territory>
+ <territory type="TJ">Τατζικιστάν</territory>
+ <territory type="TK">Τοκελάου</territory>
+ <territory type="TL">Ανατολικό ΤιμόÏ</territory>
+ <territory type="TM">ΤουÏκμενιστάν</territory>
+ <territory type="TN">Τυνησία</territory>
+ <territory type="TO">Τόνγκα</territory>
+ <territory type="TR">ΤουÏκία</territory>
+ <territory type="TT">ΤÏινιδάδ και Τομπάγκο</territory>
+ <territory type="TV">ΤουβαλοÏ</territory>
+ <territory type="TW">Ταϊβάν</territory>
+ <territory type="TZ">Τανζανία</territory>
+ <territory type="UA">ΟυκÏανία</territory>
+ <territory type="UG">Ουγκάντα</territory>
+ <territory type="UM">ΑπομακÏυσμένες Îησίδες των Ηνωμένων Πολιτειών</territory>
+ <territory type="US">Ηνωμένες Πολιτείες</territory>
+ <territory type="UY">ΟυÏουγουάη</territory>
+ <territory type="UZ">Ουζμπεκιστάν</territory>
+ <territory type="VA">Αγία ΈδÏα (Βατικανό)</territory>
+ <territory type="VC">Άγιος Βικέντιος και ΓÏεναδίνες</territory>
+ <territory type="VE">Βενεζουέλα</territory>
+ <territory type="VG">Î’Ïετανικές ΠαÏθένοι Îήσοι</territory>
+ <territory type="VI">ΑμεÏικανικές ΠαÏθένοι Îήσοι</territory>
+ <territory type="VN">Βιετνάμ</territory>
+ <territory type="VU">Βανουάτου</territory>
+ <territory type="WF">Îήσοι Ουαλλίς και Φουτουνά</territory>
+ <territory type="WS">Σαμόα</territory>
+ <territory type="YE">Υεμένη</territory>
+ <territory type="YT">Μαγιότ</territory>
+ <territory type="ZA">Îότια ΑφÏική</territory>
+ <territory type="ZM">Ζάμπια</territory>
+ <territory type="ZW">Ζιμπάμπουε</territory>
+ </territories>
+ <keys>
+ <key type="calendar">ΗμεÏολόγιο</key>
+ <key type="collation">Τακτοποίηση</key>
+ <key type="collation" alt="proposed-u145-1" draft="provisional">Ταξινόμηση</key>
+ <key type="currency">Îόμισμα</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">Βουδιστικό ΗμεÏολόγιο</type>
+ <type type="chinese" key="calendar">Κινέζικο ΗμεÏολόγιο</type>
+ <type type="direct" key="collation">ΣειÏά Direct</type>
+ <type type="gregorian" key="calendar">ΓÏηγοÏιανό ΗμεÏολόγιο</type>
+ <type type="hebrew" key="calendar">ΕβÏαϊκό ΗμεÏολόγιο</type>
+ <type type="islamic" key="calendar">Ισλαμικό ΗμεÏολόγιο</type>
+ <type type="islamic-civil" key="calendar">Ισλαμικό-Αστικό ΗμεÏολόγιο</type>
+ <type type="japanese" key="calendar">Ιαπωνικό ΗμεÏολόγιο</type>
+ <type type="phonebook" key="collation">ΣειÏά Î¤Î·Î»ÎµÏ†Ï‰Î½Î¹ÎºÎ¿Ï ÎšÎ±Ï„Î±Î»ÏŒÎ³Î¿Ï…</type>
+ <type type="pinyin" key="collation">ΣειÏά Pinyin</type>
+ <type type="stroke" key="collation">ΣειÏά Stroke</type>
+ <type type="traditional" key="collation">ΠαÏαδοσιακή</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[α ά β-ε έ ζ η ή θ ι ί ÏŠ Πκ-ο ÏŒ Ï€ Ï Ïƒ Ï‚ Ï„ Ï… Ï Ï‹ ΰ φ-ω ÏŽ]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Ιαν</month>
+ <month type="2">Φεβ</month>
+ <month type="3">ΜαÏ</month>
+ <month type="4">ΑπÏ</month>
+ <month type="5">Μαϊ</month>
+ <month type="6">Ιουν</month>
+ <month type="7">Ιουλ</month>
+ <month type="8">Αυγ</month>
+ <month type="9">Σεπ</month>
+ <month type="10">Οκτ</month>
+ <month type="11">Îοε</month>
+ <month type="12">Δεκ</month>
+ </monthWidth>
+ <monthWidth type="narrow">
+ <month type="1">Ι</month>
+ <month type="2">Φ</month>
+ <month type="3">Μ</month>
+ <month type="4">Α</month>
+ <month type="5">Μ</month>
+ <month type="6">Ι</month>
+ <month type="7">Ι</month>
+ <month type="8">Α</month>
+ <month type="9">Σ</month>
+ <month type="10">Ο</month>
+ <month type="11">Î</month>
+ <month type="12">Δ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">ΙανουαÏίου</month>
+ <month type="2">ΦεβÏουαÏίου</month>
+ <month type="3">ΜαÏτίου</month>
+ <month type="4">ΑπÏιλίου</month>
+ <month type="5">ΜαÎου</month>
+ <month type="6">Ιουνίου</month>
+ <month type="7">Ιουλίου</month>
+ <month type="8">ΑυγοÏστου</month>
+ <month type="9">ΣεπτεμβÏίου</month>
+ <month type="10">ΟκτωβÏίου</month>
+ <month type="11">ÎοεμβÏίου</month>
+ <month type="12">ΔεκεμβÏίου</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="abbreviated">
+ <month type="1">Ιαν</month>
+ <month type="2">Φεβ</month>
+ <month type="3">ΜαÏ</month>
+ <month type="4">ΑπÏ</month>
+ <month type="5">Μαϊ</month>
+ <month type="6">Ιουν</month>
+ <month type="7">Ιουλ</month>
+ <month type="8">Αυγ</month>
+ <month type="9">Σεπ</month>
+ <month type="10">Οκτ</month>
+ <month type="11">Îοε</month>
+ <month type="12">Δεκ</month>
+ </monthWidth>
+ <monthWidth type="narrow">
+ <month type="1">Ι</month>
+ <month type="2">Φ</month>
+ <month type="3">Μ</month>
+ <month type="4">Α</month>
+ <month type="5">Μ</month>
+ <month type="6">Ι</month>
+ <month type="7">Ι</month>
+ <month type="8">Α</month>
+ <month type="9">Σ</month>
+ <month type="10">Ο</month>
+ <month type="11">Î</month>
+ <month type="12">Δ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">ΙανουάÏιος</month>
+ <month type="2">ΦεβÏουάÏιος</month>
+ <month type="3">ΜάÏτιος</month>
+ <month type="4">ΑπÏίλιος</month>
+ <month type="5">Μάιος</month>
+ <month type="6">ΙοÏνιος</month>
+ <month type="7">ΙοÏλιος</month>
+ <month type="8">ΑÏγουστος</month>
+ <month type="9">ΣεπτέμβÏιος</month>
+ <month type="10">ΟκτώβÏιος</month>
+ <month type="11">ÎοέμβÏιος</month>
+ <month type="12">ΔεκέμβÏιος</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">ΚυÏ</day>
+ <day type="mon">Δευ</day>
+ <day type="tue">ΤÏι</day>
+ <day type="wed">Τετ</day>
+ <day type="thu">Πεμ</day>
+ <day type="fri">ΠαÏ</day>
+ <day type="sat">Σαβ</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">ΚυÏιακή</day>
+ <day type="mon">ΔευτέÏα</day>
+ <day type="tue">ΤÏίτη</day>
+ <day type="wed">ΤετάÏτη</day>
+ <day type="thu">Πέμπτη</day>
+ <day type="fri">ΠαÏασκευή</day>
+ <day type="sat">Σάββατο</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">Κ</day>
+ <day type="mon">Δ</day>
+ <day type="tue">Τ</day>
+ <day type="wed">Τ</day>
+ <day type="thu">Π</day>
+ <day type="fri">Π</day>
+ <day type="sat">Σ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1">1ο Ï„Ïίμηνο</quarter>
+ <quarter type="2">2ο Ï„Ïίμηνο</quarter>
+ <quarter type="3">3ο Ï„Ïίμηνο</quarter>
+ <quarter type="4">4ο Ï„Ïίμηνο</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>ΠΜ</am>
+ <pm>ΜΜ</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">π.Χ.</era>
+ <era type="1">μ.Χ.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, dd MMMM yyyy</pattern>
+ <pattern alt="proposed-u208-1" draft="provisional">EEEE, d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ <pattern alt="proposed-u208-1" draft="provisional">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd MMM yyyy</pattern>
+ <pattern alt="proposed-u208-1" draft="provisional">d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ <pattern alt="proposed-u208-1" draft="provisional">d/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="provisional">QQQQ yy</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HHmm;-HHmm</hourFormat>
+ <zone type="Africa/Timbuktu">
+ <exemplarCity>ΤιμπουκτοÏ</exemplarCity>
+ </zone>
+ <zone type="Europe/Belfast">
+ <exemplarCity>Μπέλφαστ</exemplarCity>
+ </zone>
+ <zone type="America/Buenos_Aires">
+ <exemplarCity>Μπουένος ΆιÏες</exemplarCity>
+ </zone>
+ <zone type="Australia/Adelaide">
+ <exemplarCity>ΑδελαÎδα</exemplarCity>
+ </zone>
+ <zone type="Australia/Melbourne">
+ <exemplarCity>ΜελβοÏÏνη</exemplarCity>
+ </zone>
+ <zone type="Australia/Sydney">
+ <exemplarCity>ΣÏδνεϊ</exemplarCity>
+ </zone>
+ <zone type="America/Manaus">
+ <exemplarCity>Μανάος</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>Σάο Πάολο</exemplarCity>
+ </zone>
+ <zone type="America/Vancouver">
+ <exemplarCity>ΒανκοÏβεÏ</exemplarCity>
+ </zone>
+ <zone type="America/Toronto">
+ <exemplarCity>ΤοÏόντο</exemplarCity>
+ </zone>
+ <zone type="America/Montreal">
+ <exemplarCity>ΜόντÏεαλ</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity>Κινσάσα</exemplarCity>
+ </zone>
+ <zone type="America/Santiago">
+ <exemplarCity>Σαντιάγκο</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity>Σανγκάη</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity>Γκαλαπάγκος</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>ΚανάÏια</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity>ΜαδÏίτη</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>Λονδίνο</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity>ΤζακάÏτα</exemplarCity>
+ </zone>
+ <zone type="Africa/Bamako">
+ <exemplarCity>Μπαμάκο</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>Ουλάν ΜπατόÏ</exemplarCity>
+ </zone>
+ <zone type="America/Tijuana">
+ <exemplarCity>Τιχουάνα</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>Πόλη του ΜεξικοÏ</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>ΚανκοÏν</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuala_Lumpur">
+ <exemplarCity>Κουάλα ΛουμποÏÏ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Auckland">
+ <exemplarCity>Όκλαντ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity>Αϊτή</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>ΑζόÏες</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Madeira">
+ <exemplarCity>ΜαδέÏα</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Λισσαβώνα</exemplarCity>
+ </zone>
+ <zone type="Europe/Kaliningrad">
+ <exemplarCity>Καλλίπολη</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Μόσχα</exemplarCity>
+ </zone>
+ <zone type="Europe/Samara">
+ <exemplarCity>ΣαμάÏα</exemplarCity>
+ </zone>
+ <zone type="Asia/Omsk">
+ <exemplarCity>Ομσκ</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity>ÎοβοσιμπίÏσκ</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity>ΙÏκοÏτσκ</exemplarCity>
+ </zone>
+ <zone type="Asia/Vladivostok">
+ <exemplarCity>Βλαδιβοστόκ</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>Κίεβο</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <exemplarCity>ΧονολουλοÏ</exemplarCity>
+ </zone>
+ <zone type="America/Anchorage">
+ <exemplarCity>ΆνκοÏατζ</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <exemplarCity>Λος Άντζελες</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <exemplarCity>Φοίνιξ</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <exemplarCity>ÎτένβεÏ</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <exemplarCity>Σικάγο</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <exemplarCity>Ινδιανάπολη</exemplarCity>
+ </zone>
+ <zone type="America/Detroit">
+ <exemplarCity>ÎτητÏόιτ</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <exemplarCity>Îέα ΥόÏκη</exemplarCity>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity>ΣαμαÏκάνδη</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Πεσέτα ΑνδόÏας</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>ÎτιÏάμ Ηνωμένων ΑÏαβικών ΕμιÏάτων</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName>Λεκ Αλβανίας</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>Dram ΑÏμενίας</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>Γκίλντα Ολλανδικών Αντιλλών</displayName>
+ <symbol>NA f.</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>Kwanza Ανγκόλας</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Kwanza Ανγκόλας (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>Îέα Kwanza Ανγκόλας (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>Kwanza Reajustado Ανγκόλας (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>Austral ΑÏγεντινής</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Πέσο ΑÏγεντινής (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Πέσο ΑÏγεντινής</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>Σελίνι ΑυστÏίας</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>ΔολάÏιο ΑυστÏαλίας</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>Γκίλντα ΑÏοÏμπα</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>Μανάτ ΑζεÏμπαϊτζάν</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>ΔηνάÏιο Βοσνίας-ΕÏζεγοβίνης</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>ΜάÏκο Βοσνίας-ΕÏζεγοβίνης</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>ΔολάÏιο ΜπαÏμπάντος</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>Τάκα Μπαγκλαντές</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>ΦÏάγκο Βελγίου (μετατÏέψιμο)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>ΦÏάγκο Βελγίου</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>ΦÏάγκο Βελγίου (οικονομικό)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>Μεταλλικό Λεβ ΒουλγαÏίας</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>Îέο Λεβ ΒουλγαÏίας</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>ΔηνάÏιο Bahraini</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>ΦÏάγκο Burundi</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>ΔολάÏιο ΒεÏμοÏδων</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>ΔολάÏιο Brunei</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>Πέσο Βολιβίας</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Mvdol Βολιβίας</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>Îέο Cruzeiro Î’Ïαζιλίας (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>Cruzado Î’Ïαζιλίας</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>Cruzeiro Î’Ïαζιλίας (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Real Î’Ïαζιλίας</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRN">
+ <displayName>Îέο Cruzado Î’Ïαζιλίας</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>Cruzeiro Î’Ïαζιλίας</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>ΔολάÏιο Μπαχάμες</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>Ngultrum Μπουτάν</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>Kyat ΒιÏμανίας</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>Pula Μποτσουάνα</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>Îέο ΡοÏβλι ΛευκοÏωσίας (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>ΡοÏβλι ΛευκοÏωσίας</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>ΔολάÏιο Belize</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>ΔολάÏιο Καναδά</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>ΦÏάγκο Congolais Κονγκό</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>ΦÏάγκο Ελβετίας</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CLF">
+ <displayName>Unidades de Fomento Χιλής</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Πέσο Χιλής</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>Yuan Renminbi Κίνας</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>Πέσο Κολομβίας</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="CRC">
+ <displayName>Colon Κόστα Ρίκα</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSK">
+ <displayName>ΣκληÏή ΚοÏόνα Τσεχοσλοβακίας</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Πέσο ΚοÏβας</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>ΕσκοÏδο ΠÏάσινου ΑκÏωτηÏίου</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>ΛίÏα ΚÏÏ€Ïου</displayName>
+ <symbol>£</symbol>
+ <symbol alt="proposed" draft="provisional">C£</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>ΚοÏόνα Τσέχικης ΔημοκÏατίας</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>Ostmark Ανατολικής ΓεÏμανίας</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>ΜάÏκο ΓεÏμανίας</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>ΦÏάγκο Τζιμπουτί</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>ΚοÏόνα Δανίας</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>Πέσο Δομίνικου</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>ΔηνάÏιο ΑλγεÏίας</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>Sucre ΙσημεÏινοÏ</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>Unidad de Valor Constante (UVC) ΙσημεÏινοÏ</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>ΚοÏόνα Εσθονίας</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>ΛίÏα ΑιγÏπτου</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Eritrean Nakfa</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Πεσέτα Ισπανίας</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>Birr Αιθιοπίας</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>ΕυÏÏŽ</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>ΜάÏκο Φινλανδίας</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>ΔολάÏιο Φίτζι</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>ΛίÏα Îησιών Φώλκλαντ</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>ΦÏάγκο Γαλλίας</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>ΛίÏα ΣτεÏλίνα Î’Ïετανίας</displayName>
+ <symbol>GBP</symbol>
+ </currency>
+ <currency type="GEK">
+ <displayName>Kupon Larit ΓεωÏγίας</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>Lari ΓεωÏγίας</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>Cedi Γκάνας</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>ΛίÏα ΓιβÏαλτάÏ</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>Dalasi Γκάμπια</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>ΦÏάγκο Γουινέας</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>Syli Γουινέας</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Ekwele Guineana ΙσημεÏινής Γουινέας</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>ΔÏαχμή Ελλάδας</displayName>
+ <symbol>ΔÏχ</symbol>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Quetzal Γουατεμάλα</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>Γκινέα ΕσκοÏδο ΠοÏτογαλίας</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Πέσο Guinea-Bissau</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>ΔολάÏιο Γουιάνας</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>ΔολάÏιο Χονγκ Κονγκ</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>ΔηνάÏιο ΚÏοατίας</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Kuna ΔηνάÏιο</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>Gourde Αϊτής</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>ΦιοÏίνι ΟυγγαÏίας</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>ΡοÏπια Ινδονησίας</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>ΛίÏα ΙÏλανδίας</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>ΛίÏα ΙσÏαήλ</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Îέο Sheqel ΙσÏαήλ</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>ΡοÏπια Ινδίας</displayName>
+ <symbol>INR</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>ΔηνάÏιο ΙÏάκ</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>Rial ΙÏάκ</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>ΚοÏόνα Ισλανδίας</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>ΛιÏέτα Ιταλίας</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>ΔολάÏιο Τζαμάικας</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>ΔηνάÏιο ΙοÏδανίας</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>Γιεν Ιαπωνίας</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>Σελίνι Κένυας</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>Riel Καμπότζης</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>ΦÏάγκο Comoro</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>Won Î’ÏŒÏειας ΚοÏέας</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Won Îότιας ΚοÏέας</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>ΔηνάÏιο Κουβέιτ</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>ΔολάÏιο Îήσων Κάιμαν</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Tenge Καζακστάν</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>Kip Λάος</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>ΛίÏα Λιβάνου</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>ΡοÏπια ΣÏι Λάνκα</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>ΔολάÏιο ΛιβεÏίας</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>Lita Λιθουανίας</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Talonas Λιθουανίας</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>ΦÏάγκο ΛουξεμβοÏÏγου</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Lats Λετονίας</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>ΡοÏβλι Λετονίας</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>ΔηνάÏιο ΛιβÏης</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>ÎτιÏάμ ΜαÏόκου</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>ΦÏάγκο ΜαÏόκου</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>Λέι Μολδαβίας</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>Ariary ΜαδαγασκάÏης</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>ΦÏάγκο ΜαδαγασκάÏης</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>ΔηνάÏιο Π.Γ.Δ.Îœ.</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>ΦÏάγκο Μαλί</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Kyat ΜιανμάÏ</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>Tugrik Μογγολίας</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Pataca Μακάο</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Ouguiya ΜαυÏιτανίας</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>ΛιÏέτα Μάλτας</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>ΛίÏα Μάλτας</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>ΡοÏπια ΜαυÏικίου</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>Rufiyaa Îήσων Μαλδίβων</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Kwacha Μαλάουι</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>Πέσο ΜεξικοÏ</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>Ασημένιο Πέσο ÎœÎµÎ¾Î¹ÎºÎ¿Ï (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>Unidad de Inversion (UDI) ΜεξικοÏ</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Ringgit Μαλαισίας</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>ΕσκοÏδο Μοζαμβίκης</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Metical Μοζαμβίκης</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>ΔολάÏιο Îαμίμπια</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>Naira ÎιγηÏίας</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>ΚόÏδοβα ÎικαÏάγουας</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>ΧÏυσή ΚόÏδοβα ÎικαÏάγουας</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Γκίλντα Ολλανδίας</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>ΚοÏόνα ÎοÏβηγίας</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>ΡοÏπια Îεπάλ</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>ΔολάÏιο Îέας Ζηλανδίας</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>Rial Ομάν</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>Μπαλμπόα Παναμά</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>Inti ΠεÏοÏ</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>Sol Nuevo ΠεÏοÏ</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>Sol ΠεÏοÏ</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Kina ΠαποÏα Îέα Γουινέα</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>Πέσο Φιλιππίνων</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>ΡοÏπια Πακιστάν</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>Ζλότυ Πολωνίας</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Ζλότυ Πολωνίας (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>ΕσκοÏδο ΠοÏτογαλίας</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>ΓκουαÏανί ΠαÏαγουάης</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>Rial ΚατάÏ</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="ROL">
+ <displayName>Λέι Ρουμανίας</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>ΡοÏβλι Ρωσίας</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>ΡοÏβλι Ρωσίας (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>ΦÏάγκο Ρουάντας</displayName>
+ </currency>
+ <currency type="SBD">
+ <displayName>ΔολάÏιο Îήσων Σολομώντος</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>ΡοÏπια Σεϋχέλες</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>ΔηνάÏιο Σουδάν</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>ΛίÏα Σουδάν</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>ΚοÏόνα Σουηδίας</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>ΔολάÏιο ΣιγκαποÏÏης</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>ΛίÏα Αγίας Ελένης</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Tolar Σλοβενίας</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>ΚοÏόνα Σλοβενίας</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>Leone ΣιέÏα Λεόνε</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>Σελίνι Σομαλίας</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRG">
+ <displayName>Γκίλντα ΣουÏινάμ</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>Σοβιετικό ΡοÏβλι</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>Colon Ελ ΣαλβαδόÏ</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>ΛίÏα ΣυÏίας</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>Lilangeni Ζουαζιλάνδη</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>Μπατ Ταϊλάνδης</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>ΡοÏβλι Τατζικιστάν</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Somoni Τατζικιστάν</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Μανάτ ΤουÏκμενιστάν</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>ΔηνάÏιο Τυνησίας</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>ΕσκοÏδο ΤιμόÏ</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>ΛίÏα ΤουÏκίας</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName>Îέα ΤουÏκική ΛίÏα</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>ΔολάÏιο ΤÏινιδάδ και Τομπάγκο</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>Îέο ΔολάÏιο Ταϊβάν</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>Σελίνι Τανζανίας</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>Hryvnia ΟυκÏανίας</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Karbovanetz ΟυκÏανίας</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Σελίνι Ουγκάντας (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Σελίνι Ουγκάντας</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>ΔολάÏιο ΗΠΑ</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>ΔολάÏιο ΗΠΑ (Επόμενη ΗμέÏα)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>ΔολάÏιο ΗΠΑ (Ίδια ΗμέÏα)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>Πέσο ΟυÏουγουάης (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>Πέσο Uruguayo ΟυÏουγουάης</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>Sum Ουζμπεκιστάν</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Μπολιβάλ Βενεζουέλας</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>Dong Βιετνάμ</displayName>
+ </currency>
+ <currency type="WST">
+ <displayName>Tala Δυτικής Σαμόα</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>ΦÏάγκο BEAC CFA</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>ΧÏυσός</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>ΕυÏωπαϊκή ΣÏνθετη Μονάδα</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>ΕυÏωπαϊκή Îομισματική Μονάδα</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>ΕυÏωπαϊκή Μονάδα ΛογαÏÎ¹Î±ÏƒÎ¼Î¿Ï (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>ΕυÏωπαϊκή Μονάδα ΛογαÏÎ¹Î±ÏƒÎ¼Î¿Ï (XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>ΔολάÏιο Ανατολικής ΚαÏαϊβικής</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>Ειδικά Δικαιώματα Ανάληψης</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>ΕυÏωπαϊκή Συναλλαγματική Μονάδα</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>ΧÏυσό ΦÏάγκο Γαλλίας</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>UIC-ΦÏάγκο Γαλλίας</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>ΦÏάγκο BCEAO CFA</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>ΦÏάγκο CFP</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="YDD">
+ <displayName>ΔηνάÏιο Υεμένης</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Rial Υεμένης</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>Μεταλλικό ΔηνάÏιο Γιουγκοσλαβίας</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>Îέο ΔηνάÏιο Γιουγκοσλαβίας</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>ΜετατÏέψιμο ΔηνάÏιο Γιουγκοσλαβίας</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>Ραντ Îότιας ΑφÏικής (οικονομικό)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Ραντ Îότιας ΑφÏικής</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Kwacha Ζάμπιας</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Îέο Zaire ΖαÎÏ</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Zaire ΖαÎÏ</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>ΔολάÏιο Ζιμπάμπουε</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>ναι:ν</yesstr>
+ <nostr>οχι:όχι:ο:ό</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/el_CY.xml b/libs/Zend/Locale/Data/el_CY.xml
new file mode 100755
index 0000000000..d3e3c11c4f
--- /dev/null
+++ b/libs/Zend/Locale/Data/el_CY.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.17 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="el"/>
+ <territory type="CY"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/el_GR.xml b/libs/Zend/Locale/Data/el_GR.xml
new file mode 100755
index 0000000000..ab1d23746b
--- /dev/null
+++ b/libs/Zend/Locale/Data/el_GR.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="el"/>
+ <territory type="GR"/>
+ </identity>
+ <delimiters>
+ <quotationStart>‘</quotationStart>
+ <quotationEnd>’</quotationEnd>
+ <alternateQuotationStart>“</alternateQuotationStart>
+ <alternateQuotationEnd>â€</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00¤;-¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="GRD">
+ <pattern>#,##0.00 ¤;-#,##0.00 ¤</pattern>
+ <decimal>,</decimal>
+ <group>.</group>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/el_POLYTONI.xml b/libs/Zend/Locale/Data/el_POLYTONI.xml
new file mode 100755
index 0000000000..d306681784
--- /dev/null
+++ b/libs/Zend/Locale/Data/el_POLYTONI.xml
@@ -0,0 +1,559 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.18 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="el"/>
+ <variant type="POLYTONI"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar">ἈÏαβικά</language>
+ <language type="arc">ἈÏαμαϊκά</language>
+ <language type="cy">Οá½Î±Î»Î¹ÎºÎ¬</language>
+ <language type="egy">Αἰγυπτιακὰ (á¼€Ïχαῖα)</language>
+ <language type="el">Ἑλληνικά</language>
+ <language type="en">Ἀγγλικά</language>
+ <language type="es">Ἱσπανικά</language>
+ <language type="et">Ἐσθονικά</language>
+ <language type="ga">ἸÏλανδικά</language>
+ <language type="gd">Σκωτικὰ κελτικά</language>
+ <language type="grc" draft="provisional">ἈÏχαῖα Ἑλληνικά</language>
+ <language type="he">ἙβÏαϊκά</language>
+ <language type="hu">ΟὑγγÏικά</language>
+ <language type="hy">ἈÏμενικά</language>
+ <language type="id">Ἰνδονησιακά</language>
+ <language type="ine">ἸνδοευÏωπαϊκὰ (ἄλλα)</language>
+ <language type="ira">ἸÏανικά</language>
+ <language type="is">Ἰσλανδικά</language>
+ <language type="it">Ἰταλικά</language>
+ <language type="ja">Ἰαπωνικά</language>
+ <language type="mul">Πολλαπλές γλῶσσες</language>
+ <language type="nai">Ἰνδιανικὰ βόÏειας ἈμεÏικῆς (ἄλλα)</language>
+ <language type="nl">Ὁλλανδικά</language>
+ <language type="ota">ΤουÏκικά, ὀθωμανικὰ (1500-1928)</language>
+ <language type="peo">ἈÏχαῖα πεÏσικὰ (600-400 Ï€.Χ.)</language>
+ <language type="phi">Φιλιππινέζικα (ἄλλα)</language>
+ <language type="sem">Σημιτικὰ (ἄλλα)</language>
+ <language type="sla">Σλαβικὰ (ἄλλα)</language>
+ <language type="sq">Ἀλβανικά</language>
+ <language type="uk">Οá½ÎºÏανικά</language>
+ <language type="yi">Ἰουδαϊκά</language>
+ </languages>
+ <scripts>
+ <script type="Arab">ἈÏαβικό</script>
+ <script type="Armn">ἈÏμενικό</script>
+ <script type="Ethi">Αἰθιοπικό</script>
+ <script type="Grek">Ἑλληνικό</script>
+ <script type="Hebr">ἙβÏαϊκό</script>
+ </scripts>
+ <territories>
+ <territory type="AD">ἈνδόÏα</territory>
+ <territory type="AE">Ἠνωμένα ἈÏαβικὰ ἘμιÏάτα</territory>
+ <territory type="AF">Ἀφγανιστάν</territory>
+ <territory type="AG">Ἀντίγκουα καὶ ΜπαÏμποÏντα</territory>
+ <territory type="AI">Ἀνγκουίλα</territory>
+ <territory type="AL">Ἀλβανία</territory>
+ <territory type="AM">ἈÏμενία</territory>
+ <territory type="AN">Ὁλλανδικὲς Ἀντίλλες</territory>
+ <territory type="AO">Ἀνγκόλα</territory>
+ <territory type="AQ">ἈνταÏκτική</territory>
+ <territory type="AR">ἈÏγεντινή</territory>
+ <territory type="AS">ἈμεÏικανικὴ Σαμόα</territory>
+ <territory type="AT">Αá½ÏƒÏ„Ïία</territory>
+ <territory type="AU">Αá½ÏƒÏ„Ïαλία</territory>
+ <territory type="AW">ἈÏοÏμπα</territory>
+ <territory type="AZ">ἈζεÏμπαϊτζάν</territory>
+ <territory type="BA">Βοσνία - ἘÏζεγοβίνη</territory>
+ <territory type="BM">ΒεÏμοῦδες</territory>
+ <territory type="BV">Îῆσος Μπουβέ</territory>
+ <territory type="CC">Îῆσοι Κόκος (Κήλινγκ)</territory>
+ <territory type="CD">Κονγκό, Λαϊκὴ ΔημοκÏατία τοῦ</territory>
+ <territory type="CF">ΚεντÏοαφÏικανικὴ ΔημοκÏατία</territory>
+ <territory type="CH">Ἑλβετία</territory>
+ <territory type="CI" draft="provisional">Ἀκτὴ ἘλεφαντοστοÏ</territory>
+ <territory type="CK">Îῆσοι ΚοÏκ</territory>
+ <territory type="CV" draft="provisional">ΠÏάσινο ἈκÏωτήÏιο</territory>
+ <territory type="CX">Îῆσος ΧÏιστουγέννων</territory>
+ <territory type="DO">Δομινικανὴ ΔημοκÏατία</territory>
+ <territory type="DZ">ἈλγεÏία</territory>
+ <territory type="EC">ἸσημεÏινός</territory>
+ <territory type="EE">Ἐσθονία</territory>
+ <territory type="EG">Αἴγυπτος</territory>
+ <territory type="EH">Δυτικὴ ΣαχάÏα</territory>
+ <territory type="ER">ἘÏυθÏαία</territory>
+ <territory type="ES">Ἱσπανία</territory>
+ <territory type="ET">Αἰθιοπία</territory>
+ <territory type="FM">ΜικÏονησία, Ὁμόσπονδες Πολιτεῖες τῆς</territory>
+ <territory type="FO">Îῆσοι ΦεÏόες</territory>
+ <territory type="GB">Ἡνωμένο Βασίλειο</territory>
+ <territory type="GF">Γαλλικὴ Γουιάνα</territory>
+ <territory type="GQ">ἸσημεÏινὴ Γουινέα</territory>
+ <territory type="GR">Ἑλλάδα</territory>
+ <territory type="GS" draft="provisional">Îότια ΓεωÏγία καὶ Îότιες Îήσοι Σάντουιτς</territory>
+ <territory type="HK">Χὸνγκ Κόνγκ, Εἰδικὴ Διοικητικὴ ΠεÏιφέÏεια τῆς Κίνας</territory>
+ <territory type="HM">Îῆσοι ΧὲÏντ καὶ Μακντόναλντ</territory>
+ <territory type="HN">ὉνδοÏÏα</territory>
+ <territory type="HT">Ἁϊτή</territory>
+ <territory type="HU">ΟὑγγαÏία</territory>
+ <territory type="ID">Ἰνδονησία</territory>
+ <territory type="IE">ἸÏλανδία</territory>
+ <territory type="IL">ἸσÏαήλ</territory>
+ <territory type="IN">Ἰνδία</territory>
+ <territory type="IO">Î’Ïετανικὰ Ἐδάφη Ἰνδικοῦ Ὠκεανοῦ</territory>
+ <territory type="IQ">ἸÏάκ</territory>
+ <territory type="IR">ἸÏάν, Ἰσλαμικὴ ΔημοκÏατία τοῦ</territory>
+ <territory type="IS">Ἰσλανδία</territory>
+ <territory type="IT">Ἰταλία</territory>
+ <territory type="JO">ἸοÏδανία</territory>
+ <territory type="JP">Ἰαπωνία</territory>
+ <territory type="KN">Σαὶντ Κὶτς καὶ Îέβις</territory>
+ <territory type="KY">Îῆσοι Κέιμαν</territory>
+ <territory type="LA">Λατινικὴ ἈμεÏική</territory>
+ <territory type="LC">Ἁγία Λουκία</territory>
+ <territory type="LK">ΣÏὶ Λάνκα</territory>
+ <territory type="LU">ΛουξεμβοῦÏγο</territory>
+ <territory type="MD">Μολδαβία, ΔημοκÏατία τῆς</territory>
+ <territory type="MH">Îῆσοι ΜάÏσαλ</territory>
+ <territory type="ML">Μαλί</territory>
+ <territory type="MO">Μακάο, Εἰδικὴ Διοικητικὴ ΠεÏιφέÏεια τῆς Κίνας</territory>
+ <territory type="MP">Îῆσοι Î’ÏŒÏειες ΜαÏιάνες</territory>
+ <territory type="NF">Îῆσος ÎÏŒÏφολκ</territory>
+ <territory type="NL">Ὁλλανδία</territory>
+ <territory type="OM">Ὀμάν</territory>
+ <territory type="PF">Γαλλικὴ Πολυνησία</territory>
+ <territory type="PM">Σαὶντ Î Î¹á½²Ï ÎºÎ±á½¶ Μικελόν</territory>
+ <territory type="PS">Παλαιστινιακὰ Ἐδάφη</territory>
+ <territory type="SA">Σαουδικὴ ἈÏαβία</territory>
+ <territory type="SB">Îῆσοι Σολομῶντος</territory>
+ <territory type="SH">Ἁγία Ἑλένη</territory>
+ <territory type="SJ">Îῆσοι Î£Î²Î¬Î»Î¼Ï€Î±Ï ÎºÎ±á½¶ Γιὰν Μαγιέν</territory>
+ <territory type="SM">á¼Î³Î¹Î¿Ï‚ ΜαÏίνος</territory>
+ <territory type="ST">Σάο Τομὲ καὶ ΠÏίνσιπε</territory>
+ <territory type="SV">Ἒλ ΣαλβαδόÏ</territory>
+ <territory type="SY">ΣυÏία, ἈÏαβικὴ ΔημοκÏατία τῆς</territory>
+ <territory type="TC">Îῆσοι ΤὲÏκς καὶ Κάικος</territory>
+ <territory type="TD">Τσάντ</territory>
+ <territory type="TF">Γαλλικὰ Îότια Ἐδάφη</territory>
+ <territory type="TL">Ἀνατολικὸ ΤιμόÏ</territory>
+ <territory type="TT">ΤÏινιδὰδ καὶ Τομπάγκο</territory>
+ <territory type="UA">Οá½ÎºÏανία</territory>
+ <territory type="UG">Οá½Î³ÎºÎ¬Î½Ï„α</territory>
+ <territory type="UM">ἈπομακÏυσμένες Îησίδες τῶν Ἡνωμένων Πολιτειῶν</territory>
+ <territory type="US">Ἡνωμένες Πολιτεῖες</territory>
+ <territory type="UY">Οá½Ïουγουάη</territory>
+ <territory type="UZ">Οá½Î¶Î¼Ï€ÎµÎºÎ¹ÏƒÏ„άν</territory>
+ <territory type="VA">Ἁγία á¼Î´Ïα (Βατικανό)</territory>
+ <territory type="VC">á¼Î³Î¹Î¿Ï‚ Βικέντιος καὶ ΓÏεναδίνες</territory>
+ <territory type="VG">Î’Ïετανικὲς ΠαÏθένοι Îῆσοι</territory>
+ <territory type="VI">ἈμεÏικανικὲς ΠαÏθένοι Îῆσοι</territory>
+ <territory type="WF">Îῆσοι Οá½Î¬Î»Î»Î¹Ï‚ καὶ Φουτουνά</territory>
+ <territory type="YE">Ὑεμένη</territory>
+ <territory type="ZA">Îότια ἈφÏική</territory>
+ </territories>
+ <keys>
+ <key type="calendar">ἩμεÏολόγιο</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">Βουδιστικὸ ἡμεÏολόγιο</type>
+ <type type="chinese" key="calendar">Κινεζικὸ ἡμεÏολόγιο</type>
+ <type type="direct" key="collation">ΣειÏá½° Direct</type>
+ <type type="gregorian" key="calendar">ΓÏηγοÏιανὸ ἡμεÏολόγιο</type>
+ <type type="hebrew" key="calendar">ἙβÏαϊκὸ ἡμεÏολόγιο</type>
+ <type type="islamic" key="calendar">Ἰσλαμικὸ ἡμεÏολόγιο</type>
+ <type type="islamic-civil" key="calendar">Ἰσλαμικὸ ἀστικὸ ἡμεÏολόγιο</type>
+ <type type="japanese" key="calendar">Ἰαπωνικὸ ἡμεÏολόγιο</type>
+ <type type="phonebook" key="collation">ΣειÏá½° τηλεφωνικοῦ καταλόγου</type>
+ <type type="pinyin" key="collation">ΣειÏá½° Πίνγιν</type>
+ <type type="stroke" key="collation">ΣειÏá½° Stroke</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[α á¼€ ἄ ἂ ἆ á¼ á¼… ἃ ἇ ά á½° ᾶ β-ε á¼ á¼” á¼’ ἑ ἕ ἓ έ á½² ζ η á¼  ἤ á¼¢ ἦ ἡ á¼¥ á¼£ ἧ ή á½´ ῆ θ ι á¼° á¼´ á¼² ἶ á¼± á¼µ á¼³ á¼· ί ὶ á¿– ÏŠ Î á¿’ á¿— κ-ο ὄ ὂ ὃ ÏŒ ὸ Ï€ Ï Ïƒ Ï‚ Ï„ Ï… á½ á½” á½’ á½– ὑ ὕ ὓ á½— Ï á½º ῦ Ï‹ ΰ á¿¢ ῧ φ-ω ὤ á½¢ ὦ á½¥ á½£ ὧ ÏŽ á½¼ ῶ]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>«</quotationStart>
+ <quotationEnd>»</quotationEnd>
+ <alternateQuotationStart>‛</alternateQuotationStart>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Ἰαν</month>
+ <month type="4">ἈπÏ</month>
+ <month type="6">Ἰουν</month>
+ <month type="7">Ἰουλ</month>
+ <month type="8">Αá½Î³</month>
+ <month type="10">Ὀκτ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">ἸανουαÏίου</month>
+ <month type="4">ἈπÏιλίου</month>
+ <month type="6">Ἰουνίου</month>
+ <month type="7">Ἰουλίου</month>
+ <month type="8">Αá½Î³Î¿Ïστου</month>
+ <month type="10">ὈκτωβÏίου</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="abbreviated">
+ <month type="1">Ἰαν</month>
+ <month type="4">ἈπÏ</month>
+ <month type="6">Ἰουν</month>
+ <month type="7">Ἰουλ</month>
+ <month type="8">Αá½Î³</month>
+ <month type="10">Ὀκτ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">ἸανουάÏιος</month>
+ <month type="4">ἈπÏίλιος</month>
+ <month type="6">ἸοÏνιος</month>
+ <month type="7">ἸοÏλιος</month>
+ <month type="8">Αὔγουστος</month>
+ <month type="10">ὈκτώβÏιος</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Πεσέτα ἈνδόÏας</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>ÎτιÏὰμ Ἡνωμένων ἈÏαβικῶν ἘμιÏάτων</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName>Λὲκ Ἀλβανίας</displayName>
+ </currency>
+ <currency type="AMD">
+ <displayName>Dram ἈÏμενίας</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName>Γκίλντα Ὁλλανδικῶν Ἀντιλλῶν</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName>Kwanza Ἀνγκόλας</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Kwanza Ἀνγκόλας (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>Îέα Kwanza Ἀνγκόλας (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>Kwanza Reajustado Ἀνγκόλας (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>Austral ἈÏγεντινῆς</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Πέσο ἈÏγεντινῆς (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Πέσο ἈÏγεντινῆς</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName>Σελίνι Αá½ÏƒÏ„Ïίας</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>ΔολάÏιο Αá½ÏƒÏ„Ïαλίας</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName>Γκίλντα ἈÏοÏμπα</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>Μανὰτ ἈζεÏμπαϊτζάν</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>ΔηνάÏιο Βοσνίας-á¼™Ïζεγοβίνης</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>ΜάÏκο Βοσνίας-á¼™Ïζεγοβίνης</displayName>
+ </currency>
+ <currency type="BEL">
+ <displayName>ΦÏάγκο Βελγίου (οἰκονομικό)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>Μεταλλικὸ Λὲβ ΒουλγαÏίας</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName>Îέο Λὲβ ΒουλγαÏίας</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>ΔολάÏιο Καναδᾶ</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>ΦÏάγκο Ἑλβετίας</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>Unidades de Fomento Χιλῆς</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Πέσο Χιλῆς</displayName>
+ </currency>
+ <currency type="CNY">
+ <symbol> Y</symbol>
+ </currency>
+ <currency type="CRC">
+ <symbol> C</symbol>
+ </currency>
+ <currency type="CSK">
+ <displayName>ΣκληÏá½´ ΚοÏόνα Τσεχοσλοβακίας</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>ἘσκοÏδο ΠÏάσινου ἈκÏωτηÏίου</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>Ostmark Ἀνατολικῆς ΓεÏμανίας</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName>ΔηνάÏιο ἈλγεÏίας</displayName>
+ </currency>
+ <currency type="ECS">
+ <displayName>Sucre ἸσημεÏινοῦ</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>Unidad de Valor Constante (UVC) ἸσημεÏινοῦ</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>ΚοÏόνα Ἐστονίας</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>ΛίÏα ΑἰγÏπτου</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Nakfa ἘÏυθÏαίας</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Πεσέτα Ἱσπανίας</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>Birr Αἰθιοπίας</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>Εá½ÏÏŽ</displayName>
+ <symbol> €</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>ΛίÏα Îήσων Φώλκλαντ</displayName>
+ </currency>
+ <currency type="GBP">
+ <symbol> £</symbol>
+ </currency>
+ <currency type="GMD">
+ <displayName>Dalasi Γκάμπιας</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Ekwele Guineana ἸσημεÏινῆς Γουινέας</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Quetzal Γουατεμάλας</displayName>
+ <symbol> Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>Γκινέα ἘσκοÏδο ΠοÏτογαλίας</displayName>
+ </currency>
+ <currency type="HKD">
+ <displayName>ΔολάÏιο Χὸνγκ Κόνγκ</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>Gourde Ἁϊτῆς</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>ΦιοÏίνι ΟὑγγαÏίας</displayName>
+ </currency>
+ <currency type="IDR">
+ <displayName>ΡοÏπια Ἰνδονησίας</displayName>
+ </currency>
+ <currency type="IEP">
+ <displayName>ΛίÏα ἸÏλανδίας</displayName>
+ </currency>
+ <currency type="ILP">
+ <displayName>ΛίÏα ἸσÏαήλ</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Îέο Sheqel ἸσÏαήλ</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>ΡοÏπια Ἰνδίας</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>ΔηνάÏιο ἸÏάκ</displayName>
+ </currency>
+ <currency type="IRR">
+ <displayName>Rial ἸÏάκ</displayName>
+ </currency>
+ <currency type="ISK">
+ <displayName>ΚοÏόνα Ἰσλανδίας</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>ΛιÏέτα Ἰταλίας</displayName>
+ </currency>
+ <currency type="JOD">
+ <displayName>ΔηνάÏιο ἸοÏδανίας</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>Γιὲν Ἰαπωνίας</displayName>
+ </currency>
+ <currency type="KZT">
+ <symbol> T</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>ΡοÏπια ΣÏὶ Λάνκας</displayName>
+ </currency>
+ <currency type="MOP">
+ <displayName>Pataca Μακάου</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName>Πέσο Μεξικοῦ</displayName>
+ </currency>
+ <currency type="MXP">
+ <displayName>Ἀσημένιο Πέσο Μεξικοῦ (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>Unidad de Inversion (UDI) Μεξικοῦ</displayName>
+ </currency>
+ <currency type="MZE">
+ <displayName>ἘσκοÏδο Μοζαμβίκης</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName>ΔολάÏιο Îαμίμπιας</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>ΧÏυσὴ ΚόÏδοβα ÎικαÏάγουας</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Γκίλντα Ὁλλανδίας</displayName>
+ </currency>
+ <currency type="PAB">
+ <displayName>Μπαλμπόα Παναμᾶ</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Kina ΠαποÏα Îέα Γουινέας</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>ἘσκοÏδο ΠοÏτογαλίας</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>ΓκουαÏανὶ ΠαÏαγουάης</displayName>
+ </currency>
+ <currency type="SBD">
+ <displayName>ΔολάÏιο Îήσων Σολομῶντος</displayName>
+ </currency>
+ <currency type="SCR">
+ <displayName>ΡοÏπια Σεϋχελῶν</displayName>
+ </currency>
+ <currency type="SHP">
+ <displayName>ΛίÏα Ἀγίας Ἑλένης</displayName>
+ </currency>
+ <currency type="SUR">
+ <displayName>Σοβιετικὸ ΡοÏβλι</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>Colon Ἒλ ΣαλβαδόÏ</displayName>
+ </currency>
+ <currency type="SZL">
+ <displayName>Lilangeni Ζουαζιλάνδης</displayName>
+ <symbol> E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>Μπὰτ Ταϊλάνδης</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Μανὰτ ΤουÏκμενιστάν</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>ἘσκοÏδο ΤιμόÏ</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>ΔολάÏιο ΤÏινιδὰδ καὶ Τομπάγκο</displayName>
+ </currency>
+ <currency type="UAH">
+ <displayName>Hryvnia Οá½ÎºÏανίας</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Karbovanetz Οá½ÎºÏανίας</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Σελίνι Οá½Î³ÎºÎ¬Î½Ï„ας (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Σελίνι Οá½Î³ÎºÎ¬Î½Ï„ας</displayName>
+ </currency>
+ <currency type="USN">
+ <displayName>ΔολάÏιο ΗΠΑ (Ἑπόμενη ἡμέÏα)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>ΔολάÏιο ΗΠΑ (Ἴδια ἡμέÏα)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>Πέσο Οá½Ïουγουάης (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>Πέσο Uruguayo Οá½Ïουγουάης</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName>Sum Οá½Î¶Î¼Ï€ÎµÎºÎ¹ÏƒÏ„άν</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Μπολιβὰλ Βενεζουέλας</displayName>
+ </currency>
+ <currency type="WST">
+ <displayName>Tala Δυτικῆς Σαμόας</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>Εá½Ïωπαϊκὴ ΣÏνθετη Μονάδα</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>Εá½Ïωπαϊκὴ Îομισματικὴ Μονάδα</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>Εá½Ïωπαϊκὴ Μονάδα ΛογαÏιασμοῦ (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>Εá½Ïωπαϊκὴ Μονάδα ΛογαÏιασμοῦ (XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>ΔολάÏιο Ἀνατολικῆς ΚαÏαϊβικῆς</displayName>
+ </currency>
+ <currency type="XDR">
+ <displayName>Εἰδικὰ Δικαιώματα Ἀνάληψης</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>Εá½Ïωπαϊκὴ Συναλλαγματικὴ Μονάδα</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>ΧÏυσὸ ΦÏάγκο Γαλλίας</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>ΔηνάÏιο Ὑεμένης</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Rial Ὑεμένης</displayName>
+ </currency>
+ <currency type="YUD">
+ <displayName>Μεταλλικὸ ΔηνάÏιο Γιουγκοσλαβίας</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>Ραντ Îότιας ἈφÏικῆς (οἰκονομικό)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Ρὰντ Îότιας ἈφÏικῆς</displayName>
+ <symbol> R</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>Îαί</yesstr>
+ <nostr>Ὄχι</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/en.xml b/libs/Zend/Locale/Data/en.xml
new file mode 100755
index 0000000000..86bb4d0251
--- /dev/null
+++ b/libs/Zend/Locale/Data/en.xml
@@ -0,0 +1,2282 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.114 $"/>
+ <generation date="$Date: 2006/10/28 02:18:53 $"/>
+ <language type="en"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">Afar</language>
+ <language type="ab">Abkhazian</language>
+ <language type="ace">Achinese</language>
+ <language type="ach">Acoli</language>
+ <language type="ada">Adangme</language>
+ <language type="ady">Adyghe</language>
+ <language type="ae">Avestan</language>
+ <language type="af">Afrikaans</language>
+ <language type="afa">Afro-Asiatic (Other)</language>
+ <language type="afh">Afrihili</language>
+ <language type="ain">Ainu</language>
+ <language type="ak">Akan</language>
+ <language type="akk">Akkadian</language>
+ <language type="ale">Aleut</language>
+ <language type="alg">Algonquian Languages</language>
+ <language type="alt">Southern Altai</language>
+ <language type="am">Amharic</language>
+ <language type="an">Aragonese</language>
+ <language type="ang">Old English (ca.450-1100)</language>
+ <language type="anp">Angika</language>
+ <language type="apa">Apache Languages</language>
+ <language type="ar">Arabic</language>
+ <language type="arc">Aramaic</language>
+ <language type="arn">Araucanian</language>
+ <language type="arp">Arapaho</language>
+ <language type="art">Artificial (Other)</language>
+ <language type="arw">Arawak</language>
+ <language type="as">Assamese</language>
+ <language type="ast">Asturian</language>
+ <language type="ath">Athapascan Languages</language>
+ <language type="aus">Australian Languages</language>
+ <language type="av">Avaric</language>
+ <language type="awa">Awadhi</language>
+ <language type="ay">Aymara</language>
+ <language type="az">Azerbaijani</language>
+ <language type="ba">Bashkir</language>
+ <language type="bad">Banda</language>
+ <language type="bai">Bamileke Languages</language>
+ <language type="bal">Baluchi</language>
+ <language type="ban">Balinese</language>
+ <language type="bas">Basa</language>
+ <language type="bat">Baltic (Other)</language>
+ <language type="be">Belarusian</language>
+ <language type="bej">Beja</language>
+ <language type="bem">Bemba</language>
+ <language type="ber">Berber</language>
+ <language type="bg">Bulgarian</language>
+ <language type="bh">Bihari</language>
+ <language type="bho">Bhojpuri</language>
+ <language type="bi">Bislama</language>
+ <language type="bik">Bikol</language>
+ <language type="bin">Bini</language>
+ <language type="bla">Siksika</language>
+ <language type="bm">Bambara</language>
+ <language type="bn">Bengali</language>
+ <language type="bnt">Bantu</language>
+ <language type="bo">Tibetan</language>
+ <language type="br">Breton</language>
+ <language type="bra">Braj</language>
+ <language type="bs">Bosnian</language>
+ <language type="btk">Batak</language>
+ <language type="bua">Buriat</language>
+ <language type="bug">Buginese</language>
+ <language type="byn">Blin</language>
+ <language type="ca">Catalan</language>
+ <language type="cad">Caddo</language>
+ <language type="cai">Central American Indian (Other)</language>
+ <language type="car">Carib</language>
+ <language type="cau">Caucasian (Other)</language>
+ <language type="cch">Atsam</language>
+ <language type="ce">Chechen</language>
+ <language type="ceb">Cebuano</language>
+ <language type="cel">Celtic (Other)</language>
+ <language type="ch">Chamorro</language>
+ <language type="chb">Chibcha</language>
+ <language type="chg">Chagatai</language>
+ <language type="chk">Chuukese</language>
+ <language type="chm">Mari</language>
+ <language type="chn">Chinook Jargon</language>
+ <language type="cho">Choctaw</language>
+ <language type="chp">Chipewyan</language>
+ <language type="chr">Cherokee</language>
+ <language type="chy">Cheyenne</language>
+ <language type="cmc">Chamic Languages</language>
+ <language type="co">Corsican</language>
+ <language type="cop">Coptic</language>
+ <language type="cpe">Other English-based Creoles and Pidgins</language>
+ <language type="cpf">Other French-based Creoles and Pidgins</language>
+ <language type="cpp">Other Portuguese-based Creoles and Pidgins</language>
+ <language type="cr">Cree</language>
+ <language type="crh">Crimean Turkish; Crimean Tatar</language>
+ <language type="crp">Creoles and Pidgins (Other)</language>
+ <language type="cs">Czech</language>
+ <language type="csb">Kashubian</language>
+ <language type="cu">Church Slavic</language>
+ <language type="cus">Cushitic (Other)</language>
+ <language type="cv">Chuvash</language>
+ <language type="cy">Welsh</language>
+ <language type="da">Danish</language>
+ <language type="dak">Dakota</language>
+ <language type="dar">Dargwa</language>
+ <language type="day">Dayak</language>
+ <language type="de">German</language>
+ <language type="del">Delaware</language>
+ <language type="den">Slave</language>
+ <language type="dgr">Dogrib</language>
+ <language type="din">Dinka</language>
+ <language type="doi">Dogri</language>
+ <language type="dra">Dravidian (Other)</language>
+ <language type="dsb">Lower Sorbian</language>
+ <language type="dua">Duala</language>
+ <language type="dum">Middle Dutch</language>
+ <language type="dv">Divehi</language>
+ <language type="dyu">Dyula</language>
+ <language type="dz">Dzongkha</language>
+ <language type="ee">Ewe</language>
+ <language type="efi">Efik</language>
+ <language type="egy">Egyptian (Ancient)</language>
+ <language type="eka">Ekajuk</language>
+ <language type="el">Greek</language>
+ <language type="elx">Elamite</language>
+ <language type="en">English</language>
+ <language type="enm">Middle English</language>
+ <language type="eo">Esperanto</language>
+ <language type="es">Spanish</language>
+ <language type="et">Estonian</language>
+ <language type="eu">Basque</language>
+ <language type="ewo">Ewondo</language>
+ <language type="fa">Persian</language>
+ <language type="fan">Fang</language>
+ <language type="fat">Fanti</language>
+ <language type="ff">Fulah</language>
+ <language type="fi">Finnish</language>
+ <language type="fil">Filipino</language>
+ <language type="fiu">Finno - Ugrian (Other)</language>
+ <language type="fj">Fijian</language>
+ <language type="fo">Faroese</language>
+ <language type="fon">Fon</language>
+ <language type="fr">French</language>
+ <language type="frm">Middle French</language>
+ <language type="fro">Old French</language>
+ <language type="frr">Northern Frisian</language>
+ <language type="frs">Eastern Frisian</language>
+ <language type="fur">Friulian</language>
+ <language type="fy">Western Frisian</language>
+ <language type="ga">Irish</language>
+ <language type="gaa">Ga</language>
+ <language type="gay">Gayo</language>
+ <language type="gba">Gbaya</language>
+ <language type="gd">Scottish Gaelic</language>
+ <language type="gem">Germanic (Other)</language>
+ <language type="gez">Geez</language>
+ <language type="gil">Gilbertese</language>
+ <language type="gl">Galician</language>
+ <language type="gmh">Middle High German</language>
+ <language type="gn">Guarani</language>
+ <language type="goh">Old High German</language>
+ <language type="gon">Gondi</language>
+ <language type="gor">Gorontalo</language>
+ <language type="got">Gothic</language>
+ <language type="grb">Grebo</language>
+ <language type="grc">Ancient Greek</language>
+ <language type="gsw">Swiss German</language>
+ <language type="gu">Gujarati</language>
+ <language type="gv">Manx</language>
+ <language type="gwi">Gwichʼin</language>
+ <language type="ha">Hausa</language>
+ <language type="hai">Haida</language>
+ <language type="haw">Hawaiian</language>
+ <language type="he">Hebrew</language>
+ <language type="hi">Hindi</language>
+ <language type="hil">Hiligaynon</language>
+ <language type="him">Himachali</language>
+ <language type="hit">Hittite</language>
+ <language type="hmn">Hmong</language>
+ <language type="ho">Hiri Motu</language>
+ <language type="hr">Croatian</language>
+ <language type="hsb">Upper Sorbian</language>
+ <language type="ht">Haitian</language>
+ <language type="hu">Hungarian</language>
+ <language type="hup">Hupa</language>
+ <language type="hy">Armenian</language>
+ <language type="hz">Herero</language>
+ <language type="ia">Interlingua</language>
+ <language type="iba">Iban</language>
+ <language type="id">Indonesian</language>
+ <language type="ie">Interlingue</language>
+ <language type="ig">Igbo</language>
+ <language type="ii">Sichuan Yi</language>
+ <language type="ijo">Ijo</language>
+ <language type="ik">Inupiaq</language>
+ <language type="ilo">Iloko</language>
+ <language type="inc">Indic (Other)</language>
+ <language type="ine">Indo-European (Other)</language>
+ <language type="inh">Ingush</language>
+ <language type="io">Ido</language>
+ <language type="ira">Iranian (Other)</language>
+ <language type="iro">Iroquoian languages</language>
+ <language type="is">Icelandic</language>
+ <language type="it">Italian</language>
+ <language type="iu">Inuktitut</language>
+ <language type="ja">Japanese</language>
+ <language type="jbo">Lojban</language>
+ <language type="jpr">Judeo-Persian</language>
+ <language type="jrb">Judeo-Arabic</language>
+ <language type="jv">Javanese</language>
+ <language type="ka">Georgian</language>
+ <language type="kaa">Kara-Kalpak</language>
+ <language type="kab">Kabyle</language>
+ <language type="kac">Kachin</language>
+ <language type="kaj">Jju</language>
+ <language type="kam">Kamba</language>
+ <language type="kar">Karen</language>
+ <language type="kaw">Kawi</language>
+ <language type="kbd">Kabardian</language>
+ <language type="kcg">Tyap</language>
+ <language type="kfo">Koro</language>
+ <language type="kg">Kongo</language>
+ <language type="kha">Khasi</language>
+ <language type="khi">Khoisan (Other)</language>
+ <language type="kho">Khotanese</language>
+ <language type="ki">Kikuyu</language>
+ <language type="kj">Kuanyama</language>
+ <language type="kk">Kazakh</language>
+ <language type="kl">Kalaallisut</language>
+ <language type="km">Khmer</language>
+ <language type="kmb">Kimbundu</language>
+ <language type="kn">Kannada</language>
+ <language type="ko">Korean</language>
+ <language type="kok">Konkani</language>
+ <language type="kos">Kosraean</language>
+ <language type="kpe">Kpelle</language>
+ <language type="kr">Kanuri</language>
+ <language type="krc">Karachay-Balkar</language>
+ <language type="krl">Karelian</language>
+ <language type="kro">Kru</language>
+ <language type="kru">Kurukh</language>
+ <language type="ks">Kashmiri</language>
+ <language type="ku">Kurdish</language>
+ <language type="kum">Kumyk</language>
+ <language type="kut">Kutenai</language>
+ <language type="kv">Komi</language>
+ <language type="kw">Cornish</language>
+ <language type="ky">Kirghiz</language>
+ <language type="la">Latin</language>
+ <language type="lad">Ladino</language>
+ <language type="lah">Lahnda</language>
+ <language type="lam">Lamba</language>
+ <language type="lb">Luxembourgish</language>
+ <language type="lez">Lezghian</language>
+ <language type="lg">Ganda</language>
+ <language type="li">Limburgish</language>
+ <language type="ln">Lingala</language>
+ <language type="lo">Lao</language>
+ <language type="lol">Mongo</language>
+ <language type="loz">Lozi</language>
+ <language type="lt">Lithuanian</language>
+ <language type="lu">Luba-Katanga</language>
+ <language type="lua">Luba-Lulua</language>
+ <language type="lui">Luiseno</language>
+ <language type="lun">Lunda</language>
+ <language type="luo">Luo</language>
+ <language type="lus">Lushai</language>
+ <language type="lv">Latvian</language>
+ <language type="mad">Madurese</language>
+ <language type="mag">Magahi</language>
+ <language type="mai">Maithili</language>
+ <language type="mak">Makasar</language>
+ <language type="man">Mandingo</language>
+ <language type="map">Austronesian</language>
+ <language type="mas">Masai</language>
+ <language type="mdf">Moksha</language>
+ <language type="mdr">Mandar</language>
+ <language type="men">Mende</language>
+ <language type="mg">Malagasy</language>
+ <language type="mga">Middle Irish</language>
+ <language type="mh">Marshallese</language>
+ <language type="mi">Maori</language>
+ <language type="mic">Micmac</language>
+ <language type="min">Minangkabau</language>
+ <language type="mis">Miscellaneous Languages</language>
+ <language type="mk">Macedonian</language>
+ <language type="mkh">Mon-Khmer (Other)</language>
+ <language type="ml">Malayalam</language>
+ <language type="mn">Mongolian</language>
+ <language type="mnc">Manchu</language>
+ <language type="mni">Manipuri</language>
+ <language type="mno">Manobo Languages</language>
+ <language type="mo">Moldavian</language>
+ <language type="moh">Mohawk</language>
+ <language type="mos">Mossi</language>
+ <language type="mr">Marathi</language>
+ <language type="ms">Malay</language>
+ <language type="mt">Maltese</language>
+ <language type="mul">Multiple Languages</language>
+ <language type="mun">Munda Languages</language>
+ <language type="mus">Creek</language>
+ <language type="mwl">Mirandese</language>
+ <language type="mwr">Marwari</language>
+ <language type="my">Burmese</language>
+ <language type="myn">Mayan languages</language>
+ <language type="myv">Erzya</language>
+ <language type="na">Nauru</language>
+ <language type="nah">Nahuatl</language>
+ <language type="nai">North American Indian (Other)</language>
+ <language type="nap">Neapolitan</language>
+ <language type="nb">Norwegian Bokmål</language>
+ <language type="nd">North Ndebele</language>
+ <language type="nds">Low German; Low Saxon</language>
+ <language type="ne">Nepali</language>
+ <language type="new">Newari</language>
+ <language type="ng">Ndonga</language>
+ <language type="nia">Nias</language>
+ <language type="nic">Niger - Kordofanian (Other)</language>
+ <language type="niu">Niuean</language>
+ <language type="nl">Dutch</language>
+ <language type="nn">Norwegian Nynorsk</language>
+ <language type="no">Norwegian</language>
+ <language type="nog">Nogai</language>
+ <language type="non">Norse, Old</language>
+ <language type="nqo">N’Ko</language>
+ <language type="nr">South Ndebele</language>
+ <language type="nso">Northern Sotho</language>
+ <language type="nub">Nubian Languages</language>
+ <language type="nv">Navajo</language>
+ <language type="nwc">Classical Newari</language>
+ <language type="ny">Nyanja; Chichewa; Chewa</language>
+ <language type="nym">Nyamwezi</language>
+ <language type="nyn">Nyankole</language>
+ <language type="nyo">Nyoro</language>
+ <language type="nzi">Nzima</language>
+ <language type="oc">Occitan (post 1500); Provençal</language>
+ <language type="oj">Ojibwa</language>
+ <language type="om">Oromo</language>
+ <language type="or">Oriya</language>
+ <language type="os">Ossetic</language>
+ <language type="osa">Osage</language>
+ <language type="ota">Ottoman Turkish</language>
+ <language type="oto">Otomian Languages</language>
+ <language type="pa">Punjabi</language>
+ <language type="paa">Papuan (Other)</language>
+ <language type="pag">Pangasinan</language>
+ <language type="pal">Pahlavi</language>
+ <language type="pam">Pampanga</language>
+ <language type="pap">Papiamento</language>
+ <language type="pau">Palauan</language>
+ <language type="peo">Old Persian</language>
+ <language type="phi">Philippine (Other)</language>
+ <language type="phn">Phoenician</language>
+ <language type="pi">Pali</language>
+ <language type="pl">Polish</language>
+ <language type="pon">Pohnpeian</language>
+ <language type="pra">Prakrit Languages</language>
+ <language type="pro">Old Provençal</language>
+ <language type="ps" references="RP1">Pashto</language>
+ <language type="ps" alt="variant">Pushto</language>
+ <language type="pt">Portuguese</language>
+ <language type="qu">Quechua</language>
+ <language type="raj">Rajasthani</language>
+ <language type="rap">Rapanui</language>
+ <language type="rar">Rarotongan</language>
+ <language type="rm">Rhaeto-Romance</language>
+ <language type="rn">Rundi</language>
+ <language type="ro">Romanian</language>
+ <language type="roa">Romance (Other)</language>
+ <language type="rom">Romany</language>
+ <language type="root">Root</language>
+ <language type="ru">Russian</language>
+ <language type="rup">Aromanian</language>
+ <language type="rw">Kinyarwanda</language>
+ <language type="sa">Sanskrit</language>
+ <language type="sad">Sandawe</language>
+ <language type="sah">Yakut</language>
+ <language type="sai">South American Indian (Other)</language>
+ <language type="sal">Salishan languages</language>
+ <language type="sam">Samaritan Aramaic</language>
+ <language type="sas">Sasak</language>
+ <language type="sat">Santali</language>
+ <language type="sc">Sardinian</language>
+ <language type="scn">Sicilian</language>
+ <language type="sco">Scots</language>
+ <language type="sd">Sindhi</language>
+ <language type="se">Northern Sami</language>
+ <language type="sel">Selkup</language>
+ <language type="sem">Semitic (Other)</language>
+ <language type="sg">Sango</language>
+ <language type="sga">Old Irish</language>
+ <language type="sgn">Sign Languages</language>
+ <language type="sh">Serbo-Croatian</language>
+ <language type="shn">Shan</language>
+ <language type="si">Sinhalese</language>
+ <language type="sid">Sidamo</language>
+ <language type="sio">Siouan Languages</language>
+ <language type="sit">Sino-Tibetan (Other)</language>
+ <language type="sk">Slovak</language>
+ <language type="sl">Slovenian</language>
+ <language type="sla">Slavic (Other)</language>
+ <language type="sm">Samoan</language>
+ <language type="sma">Southern Sami</language>
+ <language type="smi">Sami languages (Other)</language>
+ <language type="smj">Lule Sami</language>
+ <language type="smn">Inari Sami</language>
+ <language type="sms">Skolt Sami</language>
+ <language type="sn">Shona</language>
+ <language type="snk">Soninke</language>
+ <language type="so">Somali</language>
+ <language type="sog">Sogdien</language>
+ <language type="son">Songhai</language>
+ <language type="sq">Albanian</language>
+ <language type="sr">Serbian</language>
+ <language type="srn">Sranan Tongo</language>
+ <language type="srr">Serer</language>
+ <language type="ss">Swati</language>
+ <language type="ssa">Nilo-Saharan (Other)</language>
+ <language type="st">Southern Sotho</language>
+ <language type="su">Sundanese</language>
+ <language type="suk">Sukuma</language>
+ <language type="sus">Susu</language>
+ <language type="sux">Sumerian</language>
+ <language type="sv">Swedish</language>
+ <language type="sw">Swahili</language>
+ <language type="syr">Syriac</language>
+ <language type="ta">Tamil</language>
+ <language type="tai">Tai (Other)</language>
+ <language type="te">Telugu</language>
+ <language type="tem">Timne</language>
+ <language type="ter">Tereno</language>
+ <language type="tet">Tetum</language>
+ <language type="tg">Tajik</language>
+ <language type="th">Thai</language>
+ <language type="ti">Tigrinya</language>
+ <language type="tig">Tigre</language>
+ <language type="tiv">Tiv</language>
+ <language type="tk">Turkmen</language>
+ <language type="tkl">Tokelau</language>
+ <language type="tl">Tagalog</language>
+ <language type="tlh">Klingon</language>
+ <language type="tli">Tlingit</language>
+ <language type="tmh">Tamashek</language>
+ <language type="tn">Tswana</language>
+ <language type="to">Tonga (Tonga Islands)</language>
+ <language type="tog">Tonga (Nyasa)</language>
+ <language type="tpi">Tok Pisin</language>
+ <language type="tr">Turkish</language>
+ <language type="ts">Tsonga</language>
+ <language type="tsi">Tsimshian</language>
+ <language type="tt">Tatar</language>
+ <language type="tum">Tumbuka</language>
+ <language type="tup">Tupi languages</language>
+ <language type="tut">Altaic (Other)</language>
+ <language type="tvl">Tuvalu</language>
+ <language type="tw">Twi</language>
+ <language type="ty">Tahitian</language>
+ <language type="tyv">Tuvinian</language>
+ <language type="udm">Udmurt</language>
+ <language type="ug">Uighur</language>
+ <language type="uga">Ugaritic</language>
+ <language type="uk">Ukrainian</language>
+ <language type="umb">Umbundu</language>
+ <language type="und">Unknown or Invalid Language</language>
+ <language type="ur">Urdu</language>
+ <language type="uz">Uzbek</language>
+ <language type="vai">Vai</language>
+ <language type="ve">Venda</language>
+ <language type="vi">Vietnamese</language>
+ <language type="vo">Volapük</language>
+ <language type="vot">Votic</language>
+ <language type="wa">Walloon</language>
+ <language type="wak">Wakashan Languages</language>
+ <language type="wal">Walamo</language>
+ <language type="war">Waray</language>
+ <language type="was">Washo</language>
+ <language type="wen">Sorbian Languages</language>
+ <language type="wo">Wolof</language>
+ <language type="xal">Kalmyk</language>
+ <language type="xh">Xhosa</language>
+ <language type="yao">Yao</language>
+ <language type="yap">Yapese</language>
+ <language type="yi">Yiddish</language>
+ <language type="yo">Yoruba</language>
+ <language type="ypk">Yupik Languages</language>
+ <language type="za">Zhuang</language>
+ <language type="zap">Zapotec</language>
+ <language type="zen">Zenaga</language>
+ <language type="zh">Chinese</language>
+ <language type="znd">Zande</language>
+ <language type="zu">Zulu</language>
+ <language type="zun">Zuni</language>
+ <language type="zza">Zaza</language>
+ <language type="zxx">No linguistic content</language>
+ </languages>
+ <scripts>
+ <script type="Arab">Arabic</script>
+ <script type="Armn">Armenian</script>
+ <script type="Bali">Balinese</script>
+ <script type="Batk">Batak</script>
+ <script type="Beng">Bengali</script>
+ <script type="Blis">Blissymbols</script>
+ <script type="Bopo">Bopomofo</script>
+ <script type="Brah">Brahmi</script>
+ <script type="Brai">Braille</script>
+ <script type="Bugi">Buginese</script>
+ <script type="Buhd">Buhid</script>
+ <script type="Cans">Unified Canadian Aboriginal Symbols</script>
+ <script type="Cari">Carian</script>
+ <script type="Cham" references="R1">Cham</script>
+ <script type="Cher">Cherokee</script>
+ <script type="Cirt">Cirth</script>
+ <script type="Copt">Coptic</script>
+ <script type="Cprt">Cypriot</script>
+ <script type="Cyrl">Cyrillic</script>
+ <script type="Cyrs">Cyrillic (Old Church Slavonic variant)</script>
+ <script type="Deva">Devanagari</script>
+ <script type="Dsrt">Deseret</script>
+ <script type="Egyd">Egyptian demotic</script>
+ <script type="Egyh">Egyptian hieratic</script>
+ <script type="Egyp">Egyptian hieroglyphs</script>
+ <script type="Ethi">Ethiopic</script>
+ <script type="Geok">Khutsuri (Asomtavruli and Nuskhuri)</script>
+ <script type="Geor">Georgian</script>
+ <script type="Glag">Glagolitic</script>
+ <script type="Goth">Gothic</script>
+ <script type="Grek">Greek</script>
+ <script type="Gujr">Gujarati</script>
+ <script type="Guru">Gurmukhi</script>
+ <script type="Hang">Hangul</script>
+ <script type="Hani">Han</script>
+ <script type="Hano">Hanunoo</script>
+ <script type="Hans">Simplified Han</script>
+ <script type="Hant">Traditional Han</script>
+ <script type="Hebr">Hebrew</script>
+ <script type="Hira">Hiragana</script>
+ <script type="Hmng">Pahawh Hmong</script>
+ <script type="Hrkt">Katakana or Hiragana</script>
+ <script type="Hung">Old Hungarian</script>
+ <script type="Inds">Indus (Harappan)</script>
+ <script type="Ital">Old Italic</script>
+ <script type="Jpan">Japanese</script>
+ <script type="Java">Javanese</script>
+ <script type="Kali">Kayah Li</script>
+ <script type="Kana">Katakana</script>
+ <script type="Khar">Kharoshthi</script>
+ <script type="Khmr">Khmer</script>
+ <script type="Knda">Kannada</script>
+ <script type="Lana">Lanna</script>
+ <script type="Laoo">Lao</script>
+ <script type="Latf">Latin (Fraktur variant)</script>
+ <script type="Latg">Latin (Gaelic variant)</script>
+ <script type="Latn">Latin</script>
+ <script type="Lepc">Lepcha (Róng)</script>
+ <script type="Limb">Limbu</script>
+ <script type="Lina">Linear A</script>
+ <script type="Linb">Linear B</script>
+ <script type="Lyci">Lycian</script>
+ <script type="Lydi">Lydian</script>
+ <script type="Mand">Mandaean</script>
+ <script type="Maya">Mayan hieroglyphs</script>
+ <script type="Mero">Meroitic</script>
+ <script type="Mlym">Malayalam</script>
+ <script type="Mong">Mongolian</script>
+ <script type="Mymr">Myanmar</script>
+ <script type="Nkoo">N’Ko</script>
+ <script type="Ogam">Ogham</script>
+ <script type="Olck">Ol Chiki</script>
+ <script type="Orkh">Orkhon</script>
+ <script type="Orya">Oriya</script>
+ <script type="Osma">Osmanya</script>
+ <script type="Perm">Old Permic</script>
+ <script type="Phag">Phags-pa</script>
+ <script type="Phnx">Phoenician</script>
+ <script type="Plrd">Pollard Phonetic</script>
+ <script type="Qaai">Inherited</script>
+ <script type="Rjng">Rejang</script>
+ <script type="Roro">Rongorongo</script>
+ <script type="Runr">Runic</script>
+ <script type="Sara">Sarati</script>
+ <script type="Saur">Saurashtra</script>
+ <script type="Sgnw">SignWriting</script>
+ <script type="Shaw">Shavian</script>
+ <script type="Sinh">Sinhala</script>
+ <script type="Sund">Sundanese</script>
+ <script type="Sylo">Syloti Nagri</script>
+ <script type="Syrc">Syriac</script>
+ <script type="Syre">Syriac (Estrangelo variant)</script>
+ <script type="Syrj">Syriac (Western variant)</script>
+ <script type="Syrn">Syriac (Eastern variant)</script>
+ <script type="Tagb">Tagbanwa</script>
+ <script type="Tale">Tai Le</script>
+ <script type="Talu">New Tai Lue</script>
+ <script type="Taml">Tamil</script>
+ <script type="Telu">Telugu</script>
+ <script type="Teng">Tengwar</script>
+ <script type="Tfng">Tifinagh (Berber)</script>
+ <script type="Tglg">Tagalog</script>
+ <script type="Thaa">Thaana</script>
+ <script type="Thai" references="R1">Thai</script>
+ <script type="Tibt">Tibetan</script>
+ <script type="Ugar">Ugaritic</script>
+ <script type="Vaii">Vai</script>
+ <script type="Visp">Visible Speech</script>
+ <script type="Xpeo">Old Persian</script>
+ <script type="Xsux">Sumero-Akkadian Cuneiform</script>
+ <script type="Yiii">Yi</script>
+ <script type="Zxxx">Unwritten</script>
+ <script type="Zyyy">Common</script>
+ <script type="Zzzz">Unknown or Invalid Script</script>
+ </scripts>
+ <territories>
+ <territory type="001">World</territory>
+ <territory type="002">Africa</territory>
+ <territory type="003">North America</territory>
+ <territory type="005">South America</territory>
+ <territory type="009">Oceania</territory>
+ <territory type="011">Western Africa</territory>
+ <territory type="013">Central America</territory>
+ <territory type="014">Eastern Africa</territory>
+ <territory type="015">Northern Africa</territory>
+ <territory type="017">Middle Africa</territory>
+ <territory type="018">Southern Africa</territory>
+ <territory type="019">Americas</territory>
+ <territory type="021">Northern America</territory>
+ <territory type="029">Caribbean</territory>
+ <territory type="030">Eastern Asia</territory>
+ <territory type="034">Southern Asia</territory>
+ <territory type="035">South-Eastern Asia</territory>
+ <territory type="039">Southern Europe</territory>
+ <territory type="053">Australia and New Zealand</territory>
+ <territory type="054">Melanesia</territory>
+ <territory type="057">Micronesian Region</territory>
+ <territory type="061">Polynesia</territory>
+ <territory type="062">South-Central Asia</territory>
+ <territory type="142">Asia</territory>
+ <territory type="143">Central Asia</territory>
+ <territory type="145">Western Asia</territory>
+ <territory type="150">Europe</territory>
+ <territory type="151">Eastern Europe</territory>
+ <territory type="154">Northern Europe</territory>
+ <territory type="155">Western Europe</territory>
+ <territory type="172">Commonwealth of Independent States</territory>
+ <territory type="200">Czechoslovakia</territory>
+ <territory type="419">Latin America and the Caribbean</territory>
+ <territory type="830">Channel Islands</territory>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">United Arab Emirates</territory>
+ <territory type="AF">Afghanistan</territory>
+ <territory type="AG">Antigua and Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albania</territory>
+ <territory type="AM">Armenia</territory>
+ <territory type="AN">Netherlands Antilles</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarctica</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">American Samoa</territory>
+ <territory type="AT">Austria</territory>
+ <territory type="AU">Australia</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Aland Islands</territory>
+ <territory type="AZ">Azerbaijan</territory>
+ <territory type="BA">Bosnia and Herzegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BE">Belgium</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgaria</territory>
+ <territory type="BH">Bahrain</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei</territory>
+ <territory type="BO">Bolivia</territory>
+ <territory type="BQ">British Antarctic Territory</territory>
+ <territory type="BR">Brazil</territory>
+ <territory type="BS">Bahamas</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BV">Bouvet Island</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Belarus</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Canada</territory>
+ <territory type="CC">Cocos (Keeling) Islands</territory>
+ <territory type="CD">Congo (Kinshasa)</territory>
+ <territory type="CF">Central African Republic</territory>
+ <territory type="CG">Congo (Brazzaville)</territory>
+ <territory type="CH">Switzerland</territory>
+ <territory type="CI">Ivory Coast</territory>
+ <territory type="CK">Cook Islands</territory>
+ <territory type="CL">Chile</territory>
+ <territory type="CM">Cameroon</territory>
+ <territory type="CN">China</territory>
+ <territory type="CO">Colombia</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS">Serbia And Montenegro</territory>
+ <territory type="CT">Canton and Enderbury Islands</territory>
+ <territory type="CU">Cuba</territory>
+ <territory type="CV">Cape Verde</territory>
+ <territory type="CX">Christmas Island</territory>
+ <territory type="CY">Cyprus</territory>
+ <territory type="CZ">Czech Republic</territory>
+ <territory type="DD">East Germany</territory>
+ <territory type="DE">Germany</territory>
+ <territory type="DJ">Djibouti</territory>
+ <territory type="DK">Denmark</territory>
+ <territory type="DM">Dominica</territory>
+ <territory type="DO">Dominican Republic</territory>
+ <territory type="DZ">Algeria</territory>
+ <territory type="EC">Ecuador</territory>
+ <territory type="EE">Estonia</territory>
+ <territory type="EG">Egypt</territory>
+ <territory type="EH">Western Sahara</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Spain</territory>
+ <territory type="ET">Ethiopia</territory>
+ <territory type="FI">Finland</territory>
+ <territory type="FJ">Fiji</territory>
+ <territory type="FK">Falkland Islands</territory>
+ <territory type="FM">Micronesia</territory>
+ <territory type="FO">Faroe Islands</territory>
+ <territory type="FQ">French Southern and Antarctic Territories</territory>
+ <territory type="FR">France</territory>
+ <territory type="FX">Metropolitan France</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">United Kingdom</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Georgia</territory>
+ <territory type="GF">French Guiana</territory>
+ <territory type="GG">Guernsey</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Greenland</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Equatorial Guinea</territory>
+ <territory type="GR">Greece</territory>
+ <territory type="GS">South Georgia and the South Sandwich Islands</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinea-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Hong Kong SAR China</territory>
+ <territory type="HM">Heard Island and McDonald Islands</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Croatia</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Hungary</territory>
+ <territory type="ID">Indonesia</territory>
+ <territory type="IE">Ireland</territory>
+ <territory type="IL">Israel</territory>
+ <territory type="IM">Isle of Man</territory>
+ <territory type="IN">India</territory>
+ <territory type="IO">British Indian Ocean Territory</territory>
+ <territory type="IQ">Iraq</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Iceland</territory>
+ <territory type="IT">Italy</territory>
+ <territory type="JE">Jersey</territory>
+ <territory type="JM">Jamaica</territory>
+ <territory type="JO">Jordan</territory>
+ <territory type="JP">Japan</territory>
+ <territory type="JT">Johnston Island</territory>
+ <territory type="KE">Kenya</territory>
+ <territory type="KG">Kyrgyzstan</territory>
+ <territory type="KH">Cambodia</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Comoros</territory>
+ <territory type="KN">Saint Kitts and Nevis</territory>
+ <territory type="KP">North Korea</territory>
+ <territory type="KR">South Korea</territory>
+ <territory type="KW">Kuwait</territory>
+ <territory type="KY">Cayman Islands</territory>
+ <territory type="KZ">Kazakhstan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Lebanon</territory>
+ <territory type="LC">Saint Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberia</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Lithuania</territory>
+ <territory type="LU">Luxembourg</territory>
+ <territory type="LV">Latvia</territory>
+ <territory type="LY">Libya</territory>
+ <territory type="MA">Morocco</territory>
+ <territory type="MC">Monaco</territory>
+ <territory type="MD">Moldova</territory>
+ <territory type="ME">Montenegro</territory>
+ <territory type="MG">Madagascar</territory>
+ <territory type="MH">Marshall Islands</territory>
+ <territory type="MI">Midway Islands</territory>
+ <territory type="MK">Macedonia</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongolia</territory>
+ <territory type="MO">Macao SAR China</territory>
+ <territory type="MP">Northern Mariana Islands</territory>
+ <territory type="MQ">Martinique</territory>
+ <territory type="MR">Mauritania</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Maldives</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Mexico</territory>
+ <territory type="MY">Malaysia</territory>
+ <territory type="MZ">Mozambique</territory>
+ <territory type="NA">Namibia</territory>
+ <territory type="NC">New Caledonia</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Norfolk Island</territory>
+ <territory type="NG">Nigeria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Netherlands</territory>
+ <territory type="NO">Norway</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NQ">Dronning Maud Land</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NT">Neutral Zone</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">New Zealand</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PC">Pacific Islands Trust Territory</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">French Polynesia</territory>
+ <territory type="PG">Papua New Guinea</territory>
+ <territory type="PH">Philippines</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Poland</territory>
+ <territory type="PM">Saint Pierre and Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Puerto Rico</territory>
+ <territory type="PS">Palestinian Territory</territory>
+ <territory type="PT">Portugal</territory>
+ <territory type="PU">U.S. Miscellaneous Pacific Islands</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="PZ">Panama Canal Zone</territory>
+ <territory type="QA">Qatar</territory>
+ <territory type="QO">Outlying Oceania</territory>
+ <territory type="QU">European Union</territory>
+ <territory type="RE">Reunion</territory>
+ <territory type="RO">Romania</territory>
+ <territory type="RS">Serbia</territory>
+ <territory type="RU">Russia</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Saudi Arabia</territory>
+ <territory type="SB">Solomon Islands</territory>
+ <territory type="SC">Seychelles</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Sweden</territory>
+ <territory type="SG">Singapore</territory>
+ <territory type="SH">Saint Helena</territory>
+ <territory type="SI">Slovenia</territory>
+ <territory type="SJ">Svalbard and Jan Mayen</territory>
+ <territory type="SK">Slovakia</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalia</territory>
+ <territory type="SR">Suriname</territory>
+ <territory type="ST">Sao Tome and Principe</territory>
+ <territory type="SU">Union of Soviet Socialist Republics</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Syria</territory>
+ <territory type="SZ">Swaziland</territory>
+ <territory type="TC">Turks and Caicos Islands</territory>
+ <territory type="TD">Chad</territory>
+ <territory type="TF">French Southern Territories</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Thailand</territory>
+ <territory type="TJ">Tajikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">East Timor</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunisia</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turkey</territory>
+ <territory type="TT">Trinidad and Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TZ">Tanzania</territory>
+ <territory type="UA">Ukraine</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">United States Minor Outlying Islands</territory>
+ <territory type="US">United States</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Uzbekistan</territory>
+ <territory type="VA">Vatican</territory>
+ <territory type="VC">Saint Vincent and the Grenadines</territory>
+ <territory type="VD">North Vietnam</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">British Virgin Islands</territory>
+ <territory type="VI">U.S. Virgin Islands</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis and Futuna</territory>
+ <territory type="WK">Wake Island</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YD">People's Democratic Republic of Yemen</territory>
+ <territory type="YE">Yemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">South Africa</territory>
+ <territory type="ZM">Zambia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ <territory type="ZZ">Unknown or Invalid Region</territory>
+ </territories>
+ <variants>
+ <variant type="1901">Traditional German orthography</variant>
+ <variant type="1996">German orthography of 1996</variant>
+ <variant type="BOONT">Boontling</variant>
+ <variant type="AREVELA">Eastern Armenian</variant>
+ <variant type="AREVMDA">Western Armenian</variant>
+ <variant type="GAULISH">Gaulish</variant>
+ <variant type="GUOYU">Mandarin or Standard Chinese</variant>
+ <variant type="HAKKA">Hakka</variant>
+ <variant type="LOJBAN">Lojban</variant>
+ <variant type="NEDIS">Natisone dialect</variant>
+ <variant type="POLYTONI">Polytonic</variant>
+ <variant type="POSIX">Computer</variant>
+ <variant type="REVISED">Revised Orthography</variant>
+ <variant type="ROZAJ">Resian</variant>
+ <variant type="SAAHO">Saho</variant>
+ <variant type="SCOUSE">Scouse</variant>
+ <variant type="XIANG">Xiang or Hunanese</variant>
+ </variants>
+ <keys>
+ <key type="calendar">Calendar</key>
+ <key type="collation">Collation</key>
+ <key type="currency">Currency</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">Traditional Chinese (Big5)</type>
+ <type type="buddhist" key="calendar">Buddhist Calendar</type>
+ <type type="chinese" key="calendar">Chinese Calendar</type>
+ <type type="direct" key="collation">Direct Order</type>
+ <type type="gb2312han" key="collation">Simplified Chinese (GB2312)</type>
+ <type type="gregorian" key="calendar">Gregorian Calendar</type>
+ <type type="hebrew" key="calendar">Hebrew Calendar</type>
+ <type type="islamic" key="calendar">Islamic Calendar</type>
+ <type type="islamic-civil" key="calendar">Islamic-Civil Calendar</type>
+ <type type="japanese" key="calendar">Japanese Calendar</type>
+ <type type="phonebook" key="collation">Phonebook Order</type>
+ <type type="pinyin" key="collation">Pinyin Order</type>
+ <type type="stroke" key="collation">Stroke Order</type>
+ <type type="traditional" key="collation">Traditional</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[á à ă â Ã¥ ä Ä Ã¦ ç é è Ä• ê ë Ä“ í ì Ä­ î ï Ä« ñ ó ò Šô ö ø Å Å“ ß ú ù Å­ û ü Å« ÿ]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Jan</month>
+ <month type="2">Feb</month>
+ <month type="3">Mar</month>
+ <month type="4">Apr</month>
+ <month type="5">May</month>
+ <month type="6">Jun</month>
+ <month type="7">Jul</month>
+ <month type="8">Aug</month>
+ <month type="9">Sep</month>
+ <month type="10">Oct</month>
+ <month type="11">Nov</month>
+ <month type="12">Dec</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">January</month>
+ <month type="2">February</month>
+ <month type="3">March</month>
+ <month type="4">April</month>
+ <month type="5">May</month>
+ <month type="6">June</month>
+ <month type="7">July</month>
+ <month type="8">August</month>
+ <month type="9">September</month>
+ <month type="10">October</month>
+ <month type="11">November</month>
+ <month type="12">December</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">J</month>
+ <month type="2">F</month>
+ <month type="3">M</month>
+ <month type="4">A</month>
+ <month type="5">M</month>
+ <month type="6">J</month>
+ <month type="7">J</month>
+ <month type="8">A</month>
+ <month type="9">S</month>
+ <month type="10">O</month>
+ <month type="11">N</month>
+ <month type="12">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Sun</day>
+ <day type="mon">Mon</day>
+ <day type="tue">Tue</day>
+ <day type="wed">Wed</day>
+ <day type="thu">Thu</day>
+ <day type="fri">Fri</day>
+ <day type="sat">Sat</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Sunday</day>
+ <day type="mon">Monday</day>
+ <day type="tue">Tuesday</day>
+ <day type="wed">Wednesday</day>
+ <day type="thu">Thursday</day>
+ <day type="fri">Friday</day>
+ <day type="sat">Saturday</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">S</day>
+ <day type="mon">M</day>
+ <day type="tue">T</day>
+ <day type="wed">W</day>
+ <day type="thu">T</day>
+ <day type="fri">F</day>
+ <day type="sat">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1">1st quarter</quarter>
+ <quarter type="2">2nd quarter</quarter>
+ <quarter type="3">3rd quarter</quarter>
+ <quarter type="4">4th quarter</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraNames>
+ <era type="0">Before Christ</era>
+ <era type="1">Anno Domini</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">BC</era>
+ <era type="1">AD</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, MMMM d, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>MMMM d, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>MMM d, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>M/d/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a v</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="MMMMd" draft="provisional">MMMM d</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">M/d</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="provisional">QQQQ yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMM" draft="provisional">MMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="day">
+ <relative type="0">Today</relative>
+ <relative type="1">Tomorrow</relative>
+ <relative type="-1">Yesterday</relative>
+ </field>
+ <field type="dayperiod">
+ <displayName>AM/PM</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="America/Vancouver">
+ <long>
+ <generic>Pacific Time (CA)</generic>
+ <standard>Pacific Standard Time (CA)</standard>
+ <daylight>Pacific Daylight Time (CA)</daylight>
+ </long>
+ <short>
+ <generic>PT (CA)</generic>
+ <standard>PST (CA)</standard>
+ <daylight>PDT (CA)</daylight>
+ </short>
+ </zone>
+ <zone type="America/Edmonton">
+ <long>
+ <generic>Mountain Time (CA)</generic>
+ <standard>Mountain Standard Time (CA)</standard>
+ <daylight>Mountain Daylight Time (CA)</daylight>
+ </long>
+ <short>
+ <generic>MT (CA)</generic>
+ <standard>MST (CA)</standard>
+ <daylight>MDT (CA)</daylight>
+ </short>
+ </zone>
+ <zone type="America/Winnipeg">
+ <long>
+ <generic>Central Time (CA)</generic>
+ <standard>Central Standard Time (CA)</standard>
+ <daylight>Central Daylight Time (CA)</daylight>
+ </long>
+ <short>
+ <generic>CT (CA)</generic>
+ <standard>CST (CA)</standard>
+ <daylight>CDT (CA)</daylight>
+ </short>
+ </zone>
+ <zone type="America/Montreal">
+ <long>
+ <generic>Eastern Time (CA)</generic>
+ <standard>Eastern Standard Time (CA)</standard>
+ <daylight>Eastern Daylight Time (CA)</daylight>
+ </long>
+ <short>
+ <generic>ET (CA)</generic>
+ <standard>EST (CA)</standard>
+ <daylight>EDT (CA)</daylight>
+ </short>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <generic>Atlantic Time</generic>
+ <standard>Atlantic Standard Time</standard>
+ <daylight>Atlantic Daylight Time</daylight>
+ </long>
+ <short>
+ <generic>AT</generic>
+ <standard>AST</standard>
+ <daylight>ADT</daylight>
+ </short>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <generic>Newfoundland Time</generic>
+ <standard>Newfoundland Standard Time</standard>
+ <daylight>Newfoundland Daylight Time</daylight>
+ </long>
+ <short>
+ <generic>NT</generic>
+ <standard>NST</standard>
+ <daylight>NDT</daylight>
+ </short>
+ <exemplarCity>St. John’s</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <standard>China Standard Time</standard>
+ <daylight>China Daylight Time</daylight>
+ </long>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <generic>Central European Time</generic>
+ <standard>Central European Standard Time</standard>
+ <daylight>Central European Daylight Time</daylight>
+ </long>
+ <short>
+ <generic>CET</generic>
+ <standard>CEST</standard>
+ <daylight>CEDT</daylight>
+ </short>
+ <exemplarCity>Paris</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <long>
+ <standard>Greenwich Mean Time</standard>
+ <daylight>British Summer Time</daylight>
+ </long>
+ <short>
+ <standard>GMT</standard>
+ <daylight>BST</daylight>
+ </short>
+ </zone>
+ <zone type="Europe/Dublin">
+ <long>
+ <standard>Greenwich Mean Time</standard>
+ <daylight>Irish Summer Time</daylight>
+ </long>
+ <short>
+ <standard>GMT</standard>
+ <daylight>IST</daylight>
+ </short>
+ <exemplarCity>Dublin</exemplarCity>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <standard>Israel Standard Time</standard>
+ <daylight>Israel Daylight Time</daylight>
+ </long>
+ <exemplarCity>Jerusalem</exemplarCity>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <standard>Japan Standard Time</standard>
+ <daylight>Japan Daylight Time</daylight>
+ </long>
+ <short>
+ <standard>JST</standard>
+ <daylight>JDT</daylight>
+ </short>
+ <exemplarCity>Tokyo</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>Eastern European Standard Time</standard>
+ <daylight>Eastern European Daylight Time</daylight>
+ </long>
+ <short>
+ <standard>EET</standard>
+ <daylight>EEST</daylight>
+ </short>
+ <exemplarCity>Bucharest</exemplarCity>
+ </zone>
+ <zone type="Asia/Singapore">
+ <long>
+ <standard>Singapore Standard Time</standard>
+ <daylight>Singapore Standard Time</daylight>
+ </long>
+ <short>
+ <standard>SST</standard>
+ <daylight>SST</daylight>
+ </short>
+ <exemplarCity>Singapore</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <generic>Hawaii Time</generic>
+ <standard>Hawaii Standard Time</standard>
+ <daylight>Hawaii Daylight Time</daylight>
+ </long>
+ <short>
+ <generic>HT</generic>
+ <standard>HST</standard>
+ <daylight>HDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <generic>Alaska Time</generic>
+ <standard>Alaska Standard Time</standard>
+ <daylight>Alaska Daylight Time</daylight>
+ </long>
+ <short>
+ <generic>AKT</generic>
+ <standard>AKST</standard>
+ </short>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <generic>Pacific Time</generic>
+ <standard>Pacific Standard Time</standard>
+ <daylight>Pacific Daylight Time</daylight>
+ </long>
+ <short>
+ <generic>PT</generic>
+ <standard>PST</standard>
+ <daylight>PDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <generic>Mountain Time</generic>
+ <standard>Mountain Standard Time</standard>
+ <daylight>Mountain Daylight Time</daylight>
+ </long>
+ <short>
+ <generic>MT</generic>
+ <standard>MST</standard>
+ <daylight>MDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <generic>Central Time</generic>
+ <standard>Central Standard Time</standard>
+ <daylight>Central Daylight Time</daylight>
+ </long>
+ <short>
+ <generic>CT</generic>
+ <standard>CST</standard>
+ <daylight>CDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <generic>Eastern Time</generic>
+ <standard>Eastern Standard Time</standard>
+ <daylight>Eastern Daylight Time</daylight>
+ </long>
+ <short>
+ <generic>ET</generic>
+ <standard>EST</standard>
+ <daylight>EDT</daylight>
+ </short>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Andorran Peseta</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>United Arab Emirates Dirham</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>Afghani (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>Afghani</displayName>
+ <symbol>Af</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>Albanian Lek</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>Armenian Dram</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>Netherlands Antillan Guilder</displayName>
+ <symbol>NA f.</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>Angolan Kwanza</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Angolan Kwanza (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>Angolan New Kwanza (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>Angolan Kwanza Reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>Argentine Austral</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Argentine Peso (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Argentine Peso</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>Austrian Schilling</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>Australian Dollar</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>Aruban Guilder</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>Azerbaijanian Manat (1993-2006)</displayName>
+ </currency>
+ <currency type="AZN">
+ <displayName>Azerbaijanian Manat</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>Bosnia-Herzegovina Dinar</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>Bosnia-Herzegovina Convertible Mark</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>Barbados Dollar</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>Bangladesh Taka</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>Belgian Franc (convertible)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Belgian Franc</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>Belgian Franc (financial)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>Bulgarian Hard Lev</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>Bulgarian New Lev</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>Bahraini Dinar</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>Burundi Franc</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>Bermudan Dollar</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>Brunei Dollar</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>Boliviano</displayName>
+ <symbol>Bs</symbol>
+ </currency>
+ <currency type="BOP">
+ <displayName>Bolivian Peso</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Bolivian Mvdol</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>Brazilian Cruzeiro Novo (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>Brazilian Cruzado</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>Brazilian Cruzeiro (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Brazilian Real</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRN">
+ <displayName>Brazilian Cruzado Novo</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>Brazilian Cruzeiro</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>Bahamian Dollar</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>Bhutan Ngultrum</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>Burmese Kyat</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>Botswanan Pula</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>Belarussian New Ruble (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>Belarussian Ruble</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>Belize Dollar</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>Canadian Dollar</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>Congolese Franc Congolais</displayName>
+ </currency>
+ <currency type="CHE">
+ <displayName>WIR Euro</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Swiss Franc</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CHW">
+ <displayName>WIR Franc</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>Chilean Unidades de Fomento</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Chilean Peso</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>Chinese Yuan Renminbi</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>Colombian Peso</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="COU">
+ <displayName>Unidad de Valor Real</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>Costa Rican Colon</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSD">
+ <displayName>Serbian Dinar</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>Czechoslovak Hard Koruna</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Cuban Peso</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Cape Verde Escudo</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>Cyprus Pound</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>Czech Republic Koruna</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>East German Ostmark</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Deutsche Mark</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Djibouti Franc</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>Danish Krone</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>Dominican Peso</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>Algerian Dinar</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>Ecuador Sucre</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>Ecuador Unidad de Valor Constante (UVC)</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>Estonian Kroon</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>Egyptian Pound</displayName>
+ </currency>
+ <currency type="EQE">
+ <displayName>Ekwele</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Eritrean Nakfa</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName>Spanish Peseta (A account)</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName>Spanish Peseta (convertible account)</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Spanish Peseta</displayName>
+ <symbol>₧</symbol>
+ </currency>
+ <currency type="ETB">
+ <displayName>Ethiopian Birr</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>Finnish Markka</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Fiji Dollar</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>Falkland Islands Pound</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>French Franc</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>British Pound Sterling</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>Georgian Kupon Larit</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>Georgian Lari</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>Ghana Cedi</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>Gibraltar Pound</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>Gambia Dalasi</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Guinea Franc</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>Guinea Syli</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Equatorial Guinea Ekwele Guineana</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Greek Drachma</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Guatemala Quetzal</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>Portuguese Guinea Escudo</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Guinea-Bissau Peso</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>Guyana Dollar</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>Hong Kong Dollar</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>Hoduras Lempira</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>Croatian Dinar</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Croatian Kuna</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>Haitian Gourde</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Hungarian Forint</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>Indonesian Rupiah</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>Irish Pound</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>Israeli Pound</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Israeli New Sheqel</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Indian Rupee</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>Iraqi Dinar</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>Iranian Rial</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>Icelandic Krona</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>Italian Lira</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>Jamaican Dollar</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>Jordanian Dinar</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>Japanese Yen</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>Kenyan Shilling</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>Kyrgystan Som</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>Cambodian Riel</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>Comoro Franc</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>North Korean Won</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>South Korean Won</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>Kuwaiti Dinar</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>Cayman Islands Dollar</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Kazakhstan Tenge</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>Laotian Kip</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>Lebanese Pound</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>Sri Lanka Rupee</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>Liberian Dollar</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Lesotho Loti</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LSM">
+ <displayName>Maloti</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>Lithuanian Lita</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Lithuanian Talonas</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName>Luxembourg Convertible Franc</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Luxembourg Franc</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName>Luxembourg Financial Franc</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Latvian Lats</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>Latvian Ruble</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>Libyan Dinar</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>Moroccan Dirham</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>Moroccan Franc</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>Moldovan Leu</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>Madagascar Ariary</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Madagascar Franc</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>Macedonian Denar</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>Mali Franc</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Myanmar Kyat</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>Mongolian Tugrik</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Macao Pataca</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Mauritania Ouguiya</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>Maltese Lira</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>Maltese Pound</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>Mauritius Rupee</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>Maldive Islands Rufiyaa</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Malawi Kwacha</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>Mexican Peso</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>Mexican Silver Peso (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>Mexican Unidad de Inversion (UDI)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Malaysian Ringgit</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>Mozambique Escudo</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Old Mozambique Metical</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="MZN">
+ <displayName>Mozambique Metical</displayName>
+ <symbol>MTn</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>Namibia Dollar</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>Nigerian Naira</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>Nicaraguan Cordoba</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>Nicaraguan Cordoba Oro</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Netherlands Guilder</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Norwegian Krone</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>Nepalese Rupee</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>New Zealand Dollar</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>Oman Rial</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>Panamanian Balboa</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>Peruvian Inti</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>Peruvian Sol Nuevo</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>Peruvian Sol</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Papua New Guinea Kina</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>Philippine Peso</displayName>
+ <symbol>Php</symbol>
+ </currency>
+ <currency type="PKR">
+ <displayName>Pakistan Rupee</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>Polish Zloty</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Polish Zloty (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Portuguese Escudo</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>Paraguay Guarani</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>Qatari Rial</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="RHD">
+ <displayName>Rhodesian Dollar</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>Old Romanian Leu</displayName>
+ <symbol>=0#Old lei|1#Old leu|1&lt;Old lei</symbol>
+ </currency>
+ <currency type="RON">
+ <displayName>Romanian Leu</displayName>
+ <symbol>=0#lei|1#leu|1&lt;lei</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>Russian Ruble</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Russian Ruble (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>Rwandan Franc</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>Saudi Riyal</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>Solomon Islands Dollar</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>Seychelles Rupee</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>Sudanese Dinar</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>Sudanese Pound</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>Swedish Krona</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>Singapore Dollar</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>Saint Helena Pound</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Slovenia Tolar</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Slovak Koruna</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>Sierra Leone Leone</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>Somali Shilling</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRD">
+ <displayName>Surinam Dollar</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>Suriname Guilder</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>Sao Tome and Principe Dobra</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>Soviet Rouble</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>El Salvador Colon</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>Syrian Pound</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>Swaziland Lilangeni</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>Thai Baht</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>Tajikistan Ruble</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Tajikistan Somoni</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Turkmenistan Manat</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>Tunisian Dinar</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>Tonga Paʻanga</displayName>
+ <symbol>T$</symbol>
+ </currency>
+ <currency type="TPE">
+ <displayName>Timor Escudo</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Turkish Lira</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName>New Turkish Lira</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Trinidad and Tobago Dollar</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>Taiwan New Dollar</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>Tanzanian Shilling</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>Ukrainian Hryvnia</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Ukrainian Karbovanetz</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Ugandan Shilling (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Ugandan Shilling</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>US Dollar</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>US Dollar (Next day)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>US Dollar (Same day)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>Uruguay Peso (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>Uruguay Peso Uruguayo</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>Uzbekistan Sum</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Venezuelan Bolivar</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>Vietnamese Dong</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>Vanuatu Vatu</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>Western Samoa Tala</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>CFA Franc BEAC</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName>Silver</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>Gold</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>European Composite Unit</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>European Monetary Unit</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>European Unit of Account (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>European Unit of Account (XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>East Caribbean Dollar</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>Special Drawing Rights</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>European Currency Unit</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>French Gold Franc</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>French UIC-Franc</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>CFA Franc BCEAO</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName>Palladium</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>CFP Franc</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="XPT">
+ <displayName>Platinum</displayName>
+ </currency>
+ <currency type="XRE">
+ <displayName>RINET Funds</displayName>
+ </currency>
+ <currency type="XTS">
+ <displayName>Testing Currency Code</displayName>
+ </currency>
+ <currency type="XXX">
+ <displayName>No Currency</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>Yemeni Dinar</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Yemeni Rial</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>Yugoslavian Hard Dinar</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>Yugoslavian Noviy Dinar</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>Yugoslavian Convertible Dinar</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>South African Rand (financial)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>South African Rand</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Zambian Kwacha</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Zairean New Zaire</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Zairean Zaire</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Zimbabwe Dollar</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="R01" draft="unconfirmed"/>
+ <reference type="R02" draft="provisional"/>
+ <reference type="R03" uri="http://unstats.un.org/unsd/geoinfo/">UN Geographical Names</reference>
+ <reference type="R1">Special reference used only to prevent minimalization</reference>
+ <reference type="RP1" uri="isbn:0-321-18578-1">The Unicode Standard 4.0</reference>
+ <reference type="RP2">The Economist Style Guide</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/en_AS.xml b/libs/Zend/Locale/Data/en_AS.xml
new file mode 100755
index 0000000000..c8b9392c10
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_AS.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.28 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="en"/>
+ <territory type="AS"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_AU.xml b/libs/Zend/Locale/Data/en_AU.xml
new file mode 100755
index 0000000000..19a396ba91
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_AU.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="en"/>
+ <territory type="AU"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="AUD">
+ <symbol>$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_BE.xml b/libs/Zend/Locale/Data/en_BE.xml
new file mode 100755
index 0000000000..7d560a28e9
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_BE.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.46 $"/>
+ <generation date="$Date: 2006/06/29 16:00:25 $"/>
+ <language type="en"/>
+ <territory type="BE"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>EEE d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH' h 'mm' min 'ss' s 'z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>HH:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>HH:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMdd" draft="provisional">dd MMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="BEF">
+ <pattern>#,##0.00 ¤;-#,##0.00 ¤</pattern>
+ <decimal>,</decimal>
+ <group>.</group>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/en_BW.xml b/libs/Zend/Locale/Data/en_BW.xml
new file mode 100755
index 0000000000..a369e5d0e6
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_BW.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.36 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="en"/>
+ <territory type="BW"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>MMM dd,yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_BZ.xml b/libs/Zend/Locale/Data/en_BZ.xml
new file mode 100755
index 0000000000..5e2063db33
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_BZ.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.33 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="en"/>
+ <territory type="BZ"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">HH:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">HH:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_CA.xml b/libs/Zend/Locale/Data/en_CA.xml
new file mode 100755
index 0000000000..bf8e85842b
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_CA.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.46 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="en"/>
+ <territory type="CA"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMd" draft="provisional">d-MMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMMM" draft="provisional">MMM-yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="CAD">
+ <symbol>$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/en_GB.xml b/libs/Zend/Locale/Data/en_GB.xml
new file mode 100755
index 0000000000..14c6a0f8ad
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_GB.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.47 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="en"/>
+ <territory type="GB"/>
+ </identity>
+ <delimiters>
+ <quotationStart>‘</quotationStart>
+ <quotationEnd>’</quotationEnd>
+ <alternateQuotationStart>“</alternateQuotationStart>
+ <alternateQuotationEnd>â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>HH:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>HH:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_GU.xml b/libs/Zend/Locale/Data/en_GU.xml
new file mode 100755
index 0000000000..737b774654
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_GU.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.28 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="en"/>
+ <territory type="GU"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_HK.xml b/libs/Zend/Locale/Data/en_HK.xml
new file mode 100755
index 0000000000..b76cf5c4b0
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_HK.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="en"/>
+ <territory type="HK"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="HKD">
+ <symbol>$</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>USD</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_IE.xml b/libs/Zend/Locale/Data/en_IE.xml
new file mode 100755
index 0000000000..ba66a1808b
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_IE.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.45 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="en"/>
+ <territory type="IE"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <am>a.m.</am>
+ <pm>p.m.</pm>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>HH:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>HH:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="GBP">
+ <symbol>GBP</symbol>
+ </currency>
+ <currency type="IEP">
+ <symbol>£</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/en_IN.xml b/libs/Zend/Locale/Data/en_IN.xml
new file mode 100755
index 0000000000..f76ef82667
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_IN.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.44 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="en"/>
+ <territory type="IN"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_JM.xml b/libs/Zend/Locale/Data/en_JM.xml
new file mode 100755
index 0000000000..c6b046503d
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_JM.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.33 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="en"/>
+ <territory type="JM"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_MH.xml b/libs/Zend/Locale/Data/en_MH.xml
new file mode 100755
index 0000000000..dcdd656cc5
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_MH.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.28 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="en"/>
+ <territory type="MH"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_MP.xml b/libs/Zend/Locale/Data/en_MP.xml
new file mode 100755
index 0000000000..d93ff3af5a
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_MP.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.28 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="en"/>
+ <territory type="MP"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_MT.xml b/libs/Zend/Locale/Data/en_MT.xml
new file mode 100755
index 0000000000..dada979a8d
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_MT.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.43 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="en"/>
+ <territory type="MT"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>HH:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>HH:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="GBP">
+ <symbol>GBP</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/en_NA.xml b/libs/Zend/Locale/Data/en_NA.xml
new file mode 100755
index 0000000000..56bbe64be0
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_NA.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="en"/>
+ <territory type="NA"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_NZ.xml b/libs/Zend/Locale/Data/en_NZ.xml
new file mode 100755
index 0000000000..38a49aae08
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_NZ.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="en"/>
+ <territory type="NZ"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMd" draft="provisional">d/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="NZD">
+ <symbol>$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/en_PH.xml b/libs/Zend/Locale/Data/en_PH.xml
new file mode 100755
index 0000000000..8e96a88bd3
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_PH.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.36 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="en"/>
+ <territory type="PH"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>MM d, yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMd" draft="provisional">MM d</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="PHP">
+ <displayName>Peso</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_PK.xml b/libs/Zend/Locale/Data/en_PK.xml
new file mode 100755
index 0000000000..5b2fa28e0c
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_PK.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.21 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="en"/>
+ <territory type="PK"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern draft="unconfirmed">#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern draft="unconfirmed">#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_SG.xml b/libs/Zend/Locale/Data/en_SG.xml
new file mode 100755
index 0000000000..27185c15bb
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_SG.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.43 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="en"/>
+ <territory type="SG"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">a hh:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">a hh:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">a hh:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">a hh:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="SGD">
+ <symbol>$</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>USD</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/en_TT.xml b/libs/Zend/Locale/Data/en_TT.xml
new file mode 100755
index 0000000000..31aeec6e8f
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_TT.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.31 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="en"/>
+ <territory type="TT"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_UM.xml b/libs/Zend/Locale/Data/en_UM.xml
new file mode 100755
index 0000000000..913b3bc794
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_UM.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.28 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="en"/>
+ <territory type="UM"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_US.xml b/libs/Zend/Locale/Data/en_US.xml
new file mode 100755
index 0000000000..11703eb730
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_US.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.43 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="en"/>
+ <territory type="US"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="USD">
+ <symbol>$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/en_US_POSIX.xml b/libs/Zend/Locale/Data/en_US_POSIX.xml
new file mode 100755
index 0000000000..3ce82bea50
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_US_POSIX.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.47 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="en"/>
+ <territory type="US"/>
+ <variant type="POSIX"/>
+ </identity>
+ <numbers>
+ <symbols>
+ <perMille>0/00</perMille>
+ <infinity>INF</infinity>
+ </symbols>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#0.######</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <scientificFormats>
+ <scientificFormatLength>
+ <scientificFormat>
+ <pattern>0.000000E+000</pattern>
+ </scientificFormat>
+ </scientificFormatLength>
+ </scientificFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/en_VI.xml b/libs/Zend/Locale/Data/en_VI.xml
new file mode 100755
index 0000000000..779082a510
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_VI.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.36 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="en"/>
+ <territory type="VI"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_ZA.xml b/libs/Zend/Locale/Data/en_ZA.xml
new file mode 100755
index 0000000000..ffa01be57a
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_ZA.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="en"/>
+ <territory type="ZA"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yyyy/MM/dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">MM/dd</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">yyyy/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <references>
+ <reference type="RP1" uri="isbn:0-19-571804-6">South African Concise Oxford Dictionary 1999</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/en_ZW.xml b/libs/Zend/Locale/Data/en_ZW.xml
new file mode 100755
index 0000000000..ba6ed34ce5
--- /dev/null
+++ b/libs/Zend/Locale/Data/en_ZW.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.36 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="en"/>
+ <territory type="ZW"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd MMM,yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d/M/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">d/M</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">M/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ZWD">
+ <displayName>Zimbabwean Dollar</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/eo.xml b/libs/Zend/Locale/Data/eo.xml
new file mode 100755
index 0000000000..a262c9bebd
--- /dev/null
+++ b/libs/Zend/Locale/Data/eo.xml
@@ -0,0 +1,502 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.52 $"/>
+ <generation date="$Date: 2006/06/27 23:30:53 $"/>
+ <language type="eo"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">afara</language>
+ <language type="ab">abĥaza</language>
+ <language type="af">afrikansa</language>
+ <language type="am">amhara</language>
+ <language type="ar">araba</language>
+ <language type="as">asama</language>
+ <language type="ay">ajmara</language>
+ <language type="az">azerbajÄana</language>
+ <language type="ba">baÅkira</language>
+ <language type="be">belorusa</language>
+ <language type="bg">bulgara</language>
+ <language type="bh">bihara</language>
+ <language type="bi">bislamo</language>
+ <language type="bn">bengala</language>
+ <language type="bo">tibeta</language>
+ <language type="br">bretona</language>
+ <language type="ca">kataluna</language>
+ <language type="co">korsika</language>
+ <language type="cs">ĉeĥa</language>
+ <language type="cy">kimra</language>
+ <language type="da">dana</language>
+ <language type="de">germana</language>
+ <language type="dz">dzonko</language>
+ <language type="el">greka</language>
+ <language type="en">angla</language>
+ <language type="eo">esperanto</language>
+ <language type="es">hispana</language>
+ <language type="et">estona</language>
+ <language type="eu">eÅ­ska</language>
+ <language type="fa">persa</language>
+ <language type="fi">finna</language>
+ <language type="fj">fiÄia</language>
+ <language type="fo">feroa</language>
+ <language type="fr">franca</language>
+ <language type="fy">frisa</language>
+ <language type="ga">irlanda</language>
+ <language type="gd">gaela</language>
+ <language type="gl">galega</language>
+ <language type="gn">gvarania</language>
+ <language type="gu">guÄarata</language>
+ <language type="ha">haÅ­sa</language>
+ <language type="he">hebrea</language>
+ <language type="hi">hinda</language>
+ <language type="hr">kroata</language>
+ <language type="hu">hungara</language>
+ <language type="hy">armena</language>
+ <language type="ia">interlingvao</language>
+ <language type="id">indonezia</language>
+ <language type="ie">okcidentalo</language>
+ <language type="ik">eskima</language>
+ <language type="is">islanda</language>
+ <language type="it">itala</language>
+ <language type="iu">inuita</language>
+ <language type="ja">japana</language>
+ <language type="jv">java</language>
+ <language type="ka">kartvela</language>
+ <language type="kk">kazaĥa</language>
+ <language type="kl">gronlanda</language>
+ <language type="km">kmera</language>
+ <language type="kn">kanara</language>
+ <language type="ko">korea</language>
+ <language type="ks">kaÅmira</language>
+ <language type="ku">kurda</language>
+ <language type="ky">kirgiza</language>
+ <language type="la">latino</language>
+ <language type="ln">lingala</language>
+ <language type="lo">laÅ­a</language>
+ <language type="lt">litova</language>
+ <language type="lv">latva</language>
+ <language type="mg">malagasa</language>
+ <language type="mi">maoria</language>
+ <language type="mk">makedona</language>
+ <language type="ml">malajalama</language>
+ <language type="mn">mongola</language>
+ <language type="mr">marata</language>
+ <language type="ms">malaja</language>
+ <language type="mt">malta</language>
+ <language type="my">birma</language>
+ <language type="na">naura</language>
+ <language type="ne">nepala</language>
+ <language type="nl">nederlanda</language>
+ <language type="no">norvega</language>
+ <language type="oc">okcitana</language>
+ <language type="om">oroma</language>
+ <language type="or">orijo</language>
+ <language type="pa">panÄaba</language>
+ <language type="pl">pola</language>
+ <language type="ps">paÅtua</language>
+ <language type="pt">portugala</language>
+ <language type="qu">keĉua</language>
+ <language type="rm">romanĉa</language>
+ <language type="rn">burunda</language>
+ <language type="ro">rumana</language>
+ <language type="ru">rusa</language>
+ <language type="rw">ruanda</language>
+ <language type="sa">sanskrito</language>
+ <language type="sd">sinda</language>
+ <language type="sg">sangoa</language>
+ <language type="sh">serbo-Kroata</language>
+ <language type="si">sinhala</language>
+ <language type="sk">slovaka</language>
+ <language type="sl">slovena</language>
+ <language type="sm">samoa</language>
+ <language type="sn">Åona</language>
+ <language type="so">somala</language>
+ <language type="sq">albana</language>
+ <language type="sr">serba</language>
+ <language type="ss">svazia</language>
+ <language type="st">sota</language>
+ <language type="su">sunda</language>
+ <language type="sv">sveda</language>
+ <language type="sw">svahila</language>
+ <language type="ta">tamila</language>
+ <language type="te">telugua</language>
+ <language type="tg">taÄika</language>
+ <language type="th">taja</language>
+ <language type="ti">tigraja</language>
+ <language type="tk">turkmena</language>
+ <language type="tl">filipina</language>
+ <language type="tn">cvana</language>
+ <language type="to">tongaa</language>
+ <language type="tr">turka</language>
+ <language type="ts">conga</language>
+ <language type="tt">tatara</language>
+ <language type="tw">akana</language>
+ <language type="ug">ujgura</language>
+ <language type="uk">ukraina</language>
+ <language type="ur">urduo</language>
+ <language type="uz">uzbeka</language>
+ <language type="vi">vjetnama</language>
+ <language type="vo">volapuko</language>
+ <language type="wo">volofa</language>
+ <language type="xh">ksosa</language>
+ <language type="yi">jida</language>
+ <language type="yo">joruba</language>
+ <language type="za">Äuanga</language>
+ <language type="zh">ĉina</language>
+ <language type="zu">zulua</language>
+ </languages>
+ <territories>
+ <territory type="AD">Andoro</territory>
+ <territory type="AE">UnuiÄintaj Arabaj Emirlandos</territory>
+ <territory type="AF">Afganujo</territory>
+ <territory type="AG">Antigvo-Barbudo</territory>
+ <territory type="AI">Angvilo</territory>
+ <territory type="AL">Albanujo</territory>
+ <territory type="AM">Armenujo</territory>
+ <territory type="AN">Nederlandaj Antiloj</territory>
+ <territory type="AO">Angolo</territory>
+ <territory type="AQ">Antarkto</territory>
+ <territory type="AR">Argentino</territory>
+ <territory type="AT">AÅ­strujo</territory>
+ <territory type="AU">AÅ­stralio</territory>
+ <territory type="AW">Arubo</territory>
+ <territory type="AZ">AzerbajÄano</territory>
+ <territory type="BA">Bosnio-Hercegovino</territory>
+ <territory type="BB">Barbado</territory>
+ <territory type="BD">BangladeÅo</territory>
+ <territory type="BE">Belgujo</territory>
+ <territory type="BF">Burkino</territory>
+ <territory type="BG">Bulgarujo</territory>
+ <territory type="BH">Barejno</territory>
+ <territory type="BI">Burundo</territory>
+ <territory type="BJ">Benino</territory>
+ <territory type="BM">Bermudoj</territory>
+ <territory type="BN">Brunejo</territory>
+ <territory type="BO">Bolivio</territory>
+ <territory type="BR">Brazilo</territory>
+ <territory type="BS">Bahamoj</territory>
+ <territory type="BT">Butano</territory>
+ <territory type="BW">Bocvano</territory>
+ <territory type="BY">Belorusujo</territory>
+ <territory type="BZ">Belizo</territory>
+ <territory type="CA">Kanado</territory>
+ <territory type="CF">Centr-Afrika Respubliko</territory>
+ <territory type="CG">Kongolo</territory>
+ <territory type="CH">Svisujo</territory>
+ <territory type="CI">Ebur-Bordo</territory>
+ <territory type="CK">Kukinsuloj</territory>
+ <territory type="CL">Ĉilio</territory>
+ <territory type="CM">Kameruno</territory>
+ <territory type="CN">Ĉinujo</territory>
+ <territory type="CO">Kolombio</territory>
+ <territory type="CR">Kostariko</territory>
+ <territory type="CS" draft="unconfirmed">Serbujo</territory>
+ <territory type="CU">Kubo</territory>
+ <territory type="CV">Kabo-Verdo</territory>
+ <territory type="CY">Kipro</territory>
+ <territory type="CZ">Ĉeĥujo</territory>
+ <territory type="DE">Germanujo</territory>
+ <territory type="DJ">Äœibutio</territory>
+ <territory type="DK">Danujo</territory>
+ <territory type="DM">Dominiko</territory>
+ <territory type="DO">Domingo</territory>
+ <territory type="DZ">AlÄerio</territory>
+ <territory type="EC">Ekvadoro</territory>
+ <territory type="EE">Estonujo</territory>
+ <territory type="EG">Egipto</territory>
+ <territory type="EH">Okcidenta Saharo</territory>
+ <territory type="ER">Eritreo</territory>
+ <territory type="ES">Hispanujo</territory>
+ <territory type="ET">Etiopujo</territory>
+ <territory type="FI">Finnlando</territory>
+ <territory type="FJ">FiÄoj</territory>
+ <territory type="FM">Mikronezio</territory>
+ <territory type="FO">Ferooj</territory>
+ <territory type="FR">Francujo</territory>
+ <territory type="GA">Gabono</territory>
+ <territory type="GB">UnuiÄinta ReÄlando</territory>
+ <territory type="GD">Grenado</territory>
+ <territory type="GE">Kartvelujo</territory>
+ <territory type="GF">Franca Gviano</territory>
+ <territory type="GH">Ganao</territory>
+ <territory type="GI">Äœibraltaro</territory>
+ <territory type="GL">Gronlando</territory>
+ <territory type="GM">Gambio</territory>
+ <territory type="GN">Gvineo</territory>
+ <territory type="GP">Gvadelupo</territory>
+ <territory type="GQ">Ekvatora Gvineo</territory>
+ <territory type="GR">Grekujo</territory>
+ <territory type="GS">Sud-Georgio kaj Sud-Sandviĉinsuloj</territory>
+ <territory type="GT">Gvatemalo</territory>
+ <territory type="GU">Gvamo</territory>
+ <territory type="GW">Gvineo-BisaÅ­o</territory>
+ <territory type="GY">Gujano</territory>
+ <territory type="HM">Herda kaj Makdonaldaj Insuloj</territory>
+ <territory type="HN">Honduro</territory>
+ <territory type="HR">Kroatujo</territory>
+ <territory type="HT">Haitio</territory>
+ <territory type="HU">Hungarujo</territory>
+ <territory type="ID">Indonezio</territory>
+ <territory type="IE">Irlando</territory>
+ <territory type="IL">Israelo</territory>
+ <territory type="IN">Hindujo</territory>
+ <territory type="IO">Brita Hindoceana Teritorio</territory>
+ <territory type="IQ">Irako</territory>
+ <territory type="IR">Irano</territory>
+ <territory type="IS">Islando</territory>
+ <territory type="IT">Italujo</territory>
+ <territory type="JM">Jamajko</territory>
+ <territory type="JO">Jordanio</territory>
+ <territory type="JP">Japanujo</territory>
+ <territory type="KE">Kenjo</territory>
+ <territory type="KG">Kirgizistano</territory>
+ <territory type="KH">KamboÄo</territory>
+ <territory type="KI">Kiribato</territory>
+ <territory type="KM">Komoroj</territory>
+ <territory type="KN">Sent-Kristofo kaj Neviso</territory>
+ <territory type="KP">Nord-Koreo</territory>
+ <territory type="KR">Sud-Koreo</territory>
+ <territory type="KW">Kuvajto</territory>
+ <territory type="KY">Kejmanoj</territory>
+ <territory type="KZ">Kazaĥstano</territory>
+ <territory type="LA">Laoso</territory>
+ <territory type="LB">Libano</territory>
+ <territory type="LC">Sent-Lucio</territory>
+ <territory type="LI">LiÄ¥tenÅtejno</territory>
+ <territory type="LK">Sri-Lanko</territory>
+ <territory type="LR">Liberio</territory>
+ <territory type="LS">Lesoto</territory>
+ <territory type="LT">Litovujo</territory>
+ <territory type="LU">Luksemburgo</territory>
+ <territory type="LV">Latvujo</territory>
+ <territory type="LY">Libio</territory>
+ <territory type="MA">Maroko</territory>
+ <territory type="MC">Monako</territory>
+ <territory type="MD">Moldavujo</territory>
+ <territory type="MG">Madagaskaro</territory>
+ <territory type="MH">MarÅaloj</territory>
+ <territory type="MK">Makedonujo</territory>
+ <territory type="ML">Malio</territory>
+ <territory type="MM">Mjanmao</territory>
+ <territory type="MN">Mongolujo</territory>
+ <territory type="MP">Nord-Marianoj</territory>
+ <territory type="MQ">Martiniko</territory>
+ <territory type="MR">MaÅ­ritanujo</territory>
+ <territory type="MT">Malto</territory>
+ <territory type="MU">MaÅ­ricio</territory>
+ <territory type="MV">Maldivoj</territory>
+ <territory type="MW">Malavio</territory>
+ <territory type="MX">Meksiko</territory>
+ <territory type="MY">Malajzio</territory>
+ <territory type="MZ">Mozambiko</territory>
+ <territory type="NA">Namibio</territory>
+ <territory type="NC">Nov-Kaledonio</territory>
+ <territory type="NE">NiÄero</territory>
+ <territory type="NF">Norfolkinsulo</territory>
+ <territory type="NG">NiÄerio</territory>
+ <territory type="NI">Nikaragvo</territory>
+ <territory type="NL">Nederlando</territory>
+ <territory type="NO">Norvegujo</territory>
+ <territory type="NP">Nepalo</territory>
+ <territory type="NR">Nauro</territory>
+ <territory type="NU">Niuo</territory>
+ <territory type="NZ">Nov-Zelando</territory>
+ <territory type="OM">Omano</territory>
+ <territory type="PA">Panamo</territory>
+ <territory type="PE">Peruo</territory>
+ <territory type="PF">Franca Polinezio</territory>
+ <territory type="PG">Papuo-Nov-Gvineo</territory>
+ <territory type="PH">Filipinoj</territory>
+ <territory type="PK">Pakistano</territory>
+ <territory type="PL">Pollando</territory>
+ <territory type="PM">Sent-Piero kaj Mikelono</territory>
+ <territory type="PN">Pitkarna Insulo</territory>
+ <territory type="PR">Puerto-Riko</territory>
+ <territory type="PT">Portugalujo</territory>
+ <territory type="PW">BelaÅ­o</territory>
+ <territory type="PY">Paragvajo</territory>
+ <territory type="QA">Kataro</territory>
+ <territory type="RE">Reunio</territory>
+ <territory type="RO">Rumanujo</territory>
+ <territory type="RU">Rusujo</territory>
+ <territory type="RW">Ruando</territory>
+ <territory type="SA">SaÅ­da Arabujo</territory>
+ <territory type="SB">Salomonoj</territory>
+ <territory type="SC">SejÅeloj</territory>
+ <territory type="SD">Sudano</territory>
+ <territory type="SE">Svedujo</territory>
+ <territory type="SG">Singapuro</territory>
+ <territory type="SH">Sent-Heleno</territory>
+ <territory type="SI">Slovenujo</territory>
+ <territory type="SJ">Svalbardo kaj Jan-Majen-insulo</territory>
+ <territory type="SK">Slovakujo</territory>
+ <territory type="SL">Siera-Leono</territory>
+ <territory type="SM">San-Marino</territory>
+ <territory type="SN">Senegalo</territory>
+ <territory type="SO">Somalujo</territory>
+ <territory type="SR">Surinamo</territory>
+ <territory type="ST">Sao-Tomeo kaj Principeo</territory>
+ <territory type="SV">Salvadoro</territory>
+ <territory type="SY">Sirio</territory>
+ <territory type="SZ">Svazilando</territory>
+ <territory type="TD">Ĉado</territory>
+ <territory type="TG">Togolo</territory>
+ <territory type="TH">Tajlando</territory>
+ <territory type="TJ">TaÄikujo</territory>
+ <territory type="TM">Turkmenujo</territory>
+ <territory type="TN">Tunizio</territory>
+ <territory type="TO">Tongo</territory>
+ <territory type="TR">Turkujo</territory>
+ <territory type="TT">Trinidado kaj Tobago</territory>
+ <territory type="TV">Tuvalo</territory>
+ <territory type="TW">Tajvano</territory>
+ <territory type="TZ">Tanzanio</territory>
+ <territory type="UA">Ukrajno</territory>
+ <territory type="UG">Ugando</territory>
+ <territory type="UM">Usonaj malgrandaj insuloj</territory>
+ <territory type="US">Usono</territory>
+ <territory type="UY">Urugvajo</territory>
+ <territory type="UZ">Uzbekujo</territory>
+ <territory type="VA">Vatikano</territory>
+ <territory type="VC">Sent-Vincento kaj la Grenadinoj</territory>
+ <territory type="VE">Venezuelo</territory>
+ <territory type="VG">Britaj Virgulininsuloj</territory>
+ <territory type="VI">Usonaj Virgulininsuloj</territory>
+ <territory type="VN">Vjetnamo</territory>
+ <territory type="VU">Vanuatuo</territory>
+ <territory type="WF">Valiso kaj Futuno</territory>
+ <territory type="WS">Samoo</territory>
+ <territory type="YE">Jemeno</territory>
+ <territory type="YT">Majoto</territory>
+ <territory type="ZA">Sud-Afriko</territory>
+ <territory type="ZM">Zambio</territory>
+ <territory type="ZW">Zimbabvo</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-c ĉ d-g Ä h Ä¥ i j ĵ k-p r s Å t u Å­ v z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[q w-y]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GjMtkHmslTDUSnahKzJdugAZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">jan</month>
+ <month type="2">feb</month>
+ <month type="3">mar</month>
+ <month type="4">apr</month>
+ <month type="5">maj</month>
+ <month type="6">jun</month>
+ <month type="7">jul</month>
+ <month type="8">aÅ­g</month>
+ <month type="9">sep</month>
+ <month type="10">okt</month>
+ <month type="11">nov</month>
+ <month type="12">dec</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">januaro</month>
+ <month type="2">februaro</month>
+ <month type="3">marto</month>
+ <month type="4">aprilo</month>
+ <month type="5">majo</month>
+ <month type="6">junio</month>
+ <month type="7">julio</month>
+ <month type="8">aÅ­gusto</month>
+ <month type="9">septembro</month>
+ <month type="10">oktobro</month>
+ <month type="11">novembro</month>
+ <month type="12">decembro</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">di</day>
+ <day type="mon">lu</day>
+ <day type="tue">ma</day>
+ <day type="wed">me</day>
+ <day type="thu">ĵa</day>
+ <day type="fri">ve</day>
+ <day type="sat">sa</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">dimanĉo</day>
+ <day type="mon">lundo</day>
+ <day type="tue">mardo</day>
+ <day type="wed">merkredo</day>
+ <day type="thu">ĵaŭdo</day>
+ <day type="fri">vendredo</day>
+ <day type="sat">sabato</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">K1</quarter>
+ <quarter type="2" draft="unconfirmed">K2</quarter>
+ <quarter type="3" draft="unconfirmed">K3</quarter>
+ <quarter type="4" draft="unconfirmed">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">1a kvaronjaro</quarter>
+ <quarter type="2" draft="unconfirmed">2a kvaronjaro</quarter>
+ <quarter type="3" draft="unconfirmed">3a kvaronjaro</quarter>
+ <quarter type="4" draft="unconfirmed">4a kvaronjaro</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>atm</am>
+ <pm>ptm</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">aK</era>
+ <era type="1">pK</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d'-a de 'MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>yyyy-MMMM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy-MMM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yy-MM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H'-a horo kaj 'm z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/es.xml b/libs/Zend/Locale/Data/es.xml
new file mode 100755
index 0000000000..287ced93a6
--- /dev/null
+++ b/libs/Zend/Locale/Data/es.xml
@@ -0,0 +1,2196 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.79 $"/>
+ <generation date="$Date: 2006/06/28 06:03:59 $"/>
+ <language type="es"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">afar</language>
+ <language type="ab">abjaso</language>
+ <language type="ace">acehnés</language>
+ <language type="ach">acoli</language>
+ <language type="ada">adangme</language>
+ <language type="ady">adigeo</language>
+ <language type="ae">avéstico</language>
+ <language type="af">afrikaans</language>
+ <language type="afa">afroasiáticas (otras)</language>
+ <language type="afh">afrihili</language>
+ <language type="ain" references="RP1">ainu</language>
+ <language type="ak">akan</language>
+ <language type="akk">acadio</language>
+ <language type="ale">aleutiano</language>
+ <language type="alg">lenguas algonquinas</language>
+ <language type="alt" references="RP3">altái meridional</language>
+ <language type="am">amárico</language>
+ <language type="an">aragonés</language>
+ <language type="ang">inglés antiguo (450-1100 aprox.)</language>
+ <language type="apa">lenguas apache</language>
+ <language type="ar">árabe</language>
+ <language type="arc">arameo</language>
+ <language type="arn">araucano</language>
+ <language type="arp">arapaho</language>
+ <language type="art">artificiales (otras)</language>
+ <language type="arw">arahuaco</language>
+ <language type="as">asamés</language>
+ <language type="ast">asturiano</language>
+ <language type="ath">lenguas atabascas</language>
+ <language type="aus">lenguas australianas</language>
+ <language type="av">avar</language>
+ <language type="awa">avadhi</language>
+ <language type="ay">aymara</language>
+ <language type="az">azerí</language>
+ <language type="ba">bashkir</language>
+ <language type="bad">banda</language>
+ <language type="bai">lenguas bamileke</language>
+ <language type="bal">baluchi</language>
+ <language type="ban">balinés</language>
+ <language type="bas">basa</language>
+ <language type="bat">bálticas (otras)</language>
+ <language type="be">bielorruso</language>
+ <language type="bej">beja</language>
+ <language type="bem">bemba</language>
+ <language type="ber">bereberes (otras)</language>
+ <language type="ber" alt="proposed-u167-1" draft="provisional">bereber</language>
+ <language type="bg">búlgaro</language>
+ <language type="bh">bihari</language>
+ <language type="bho">bhojpuri</language>
+ <language type="bi">bislama</language>
+ <language type="bik">bicol</language>
+ <language type="bin">bini</language>
+ <language type="bla">siksika</language>
+ <language type="bm">bambara</language>
+ <language type="bn">bengalí</language>
+ <language type="bnt">bantú</language>
+ <language type="bo">tibetano</language>
+ <language type="br">bretón</language>
+ <language type="bra">braj</language>
+ <language type="bs">bosnio</language>
+ <language type="btk">batak</language>
+ <language type="bua">buriat</language>
+ <language type="bua" alt="proposed-u167-1" draft="provisional">buriato</language>
+ <language type="bug">buginés</language>
+ <language type="byn">blin</language>
+ <language type="ca">catalán</language>
+ <language type="cad">caddo</language>
+ <language type="cai">indias centroamericanas (otras)</language>
+ <language type="car">caribe</language>
+ <language type="cau">caucásicas (otras)</language>
+ <language type="ce">checheno</language>
+ <language type="ceb">cebuano</language>
+ <language type="cel">celtas (otras)</language>
+ <language type="ch">chamorro</language>
+ <language type="chb">chibcha</language>
+ <language type="chg">chagatái</language>
+ <language type="chk">trukés</language>
+ <language type="chm">marí</language>
+ <language type="chn">jerga chinuk</language>
+ <language type="cho">choctaw</language>
+ <language type="chp">chipewyan</language>
+ <language type="chr">cherokee</language>
+ <language type="chy">cheyene</language>
+ <language type="cmc">lenguas chámicas</language>
+ <language type="co">corso</language>
+ <language type="cop">copto</language>
+ <language type="cpe">criollas y pidgins, basadas en el inglés (otras)</language>
+ <language type="cpf">criollas y pidgins, basadas en el francés (otras)</language>
+ <language type="cpp">criollas y pidgins, basadas en el portugués (otras)</language>
+ <language type="cr">cree</language>
+ <language type="crh">tártaro de Crimea</language>
+ <language type="crp">criollas y pidgins (otras)</language>
+ <language type="cs">checo</language>
+ <language type="csb">casubio</language>
+ <language type="cu">eslavo eclesiástico</language>
+ <language type="cus">cusitas (otras)</language>
+ <language type="cv">chuvash</language>
+ <language type="cy">galés</language>
+ <language type="da">danés</language>
+ <language type="dak">dakota</language>
+ <language type="dar">dargva</language>
+ <language type="day">dayak</language>
+ <language type="de">alemán</language>
+ <language type="del">delaware</language>
+ <language type="den">slave (atabasca)</language>
+ <language type="dgr">dogrib</language>
+ <language type="din">dinka</language>
+ <language type="doi">dogri</language>
+ <language type="dra">dravídicas (otras)</language>
+ <language type="dsb">sorbio inferior</language>
+ <language type="dua">duala</language>
+ <language type="dum">neerlandés medieval</language>
+ <language type="dv">divehi</language>
+ <language type="dyu">diula</language>
+ <language type="dz" references="RP1">dzongkha</language>
+ <language type="ee">ewe</language>
+ <language type="efi">efik</language>
+ <language type="egy">egipcio (antiguo)</language>
+ <language type="eka">ekajuk</language>
+ <language type="el">griego</language>
+ <language type="elx">elamita</language>
+ <language type="en">inglés</language>
+ <language type="enm">inglés medieval</language>
+ <language type="eo">esperanto</language>
+ <language type="es">español</language>
+ <language type="et">estonio</language>
+ <language type="eu">vasco</language>
+ <language type="ewo">ewondo</language>
+ <language type="fa">farsi</language>
+ <language type="fan">fang</language>
+ <language type="fat">fanti</language>
+ <language type="ff">fula</language>
+ <language type="fi">finés</language>
+ <language type="fil">filipino</language>
+ <language type="fiu">finougrias (otras)</language>
+ <language type="fj" references="RP1">fidjiano</language>
+ <language type="fo">feroés</language>
+ <language type="fr">francés</language>
+ <language type="frm">francés medieval</language>
+ <language type="fro">francés antiguo</language>
+ <language type="fur">friulano</language>
+ <language type="fy">frisón</language>
+ <language type="ga">irlandés</language>
+ <language type="gaa">ga</language>
+ <language type="gay">gayo</language>
+ <language type="gay" references="RP3" alt="proposed-u167-1" draft="provisional">gayón</language>
+ <language type="gba">gbaya</language>
+ <language type="gd">gaélico escocés</language>
+ <language type="gem">germánicas (otras)</language>
+ <language type="gez">geez</language>
+ <language type="gil">gilbertés</language>
+ <language type="gl">gallego</language>
+ <language type="gmh">alemán de la alta edad media</language>
+ <language type="gn">guaraní</language>
+ <language type="goh">alemán de la alta edad antigua</language>
+ <language type="gon">gondi</language>
+ <language type="gor">gorontalo</language>
+ <language type="got">gótico</language>
+ <language type="grb">grebo</language>
+ <language type="grc">griego antiguo</language>
+ <language type="gu">gujarati</language>
+ <language type="gv">gaélico manés</language>
+ <language type="gwi">kutchin</language>
+ <language type="ha">hausa</language>
+ <language type="hai">haida</language>
+ <language type="haw">hawaiano</language>
+ <language type="he">hebreo</language>
+ <language type="hi">hindi</language>
+ <language type="hil">hiligaynon</language>
+ <language type="him">himachali</language>
+ <language type="hit">hitita</language>
+ <language type="hmn">hmong</language>
+ <language type="ho">hiri motu</language>
+ <language type="hr">croata</language>
+ <language type="hsb">sorbio superior</language>
+ <language type="ht">haitiano</language>
+ <language type="hu">húngaro</language>
+ <language type="hup">hupa</language>
+ <language type="hy">armenio</language>
+ <language type="hz">herero</language>
+ <language type="ia">interlingua</language>
+ <language type="iba">iban</language>
+ <language type="id">indonesio</language>
+ <language type="ie">interlingue</language>
+ <language type="ig">igbo</language>
+ <language type="ii">sichuan yi</language>
+ <language type="ik">inupiak</language>
+ <language type="ilo">ilocano</language>
+ <language type="inc">índicas (otras)</language>
+ <language type="ine">indoeuropeas (otras)</language>
+ <language type="inh">ingush</language>
+ <language type="io">ido</language>
+ <language type="ira">iranias (otras)</language>
+ <language type="iro">lenguas iroquesas</language>
+ <language type="is">islandés</language>
+ <language type="it">italiano</language>
+ <language type="iu">inuktitut</language>
+ <language type="ja">japonés</language>
+ <language type="jbo">lojban</language>
+ <language type="jpr">judeo-persa</language>
+ <language type="jrb">judeo-árabe</language>
+ <language type="jv">javanés</language>
+ <language type="ka">georgiano</language>
+ <language type="kaa">karakalpako</language>
+ <language type="kab">cabila</language>
+ <language type="kac">kachin</language>
+ <language type="kam">kamba</language>
+ <language type="kar">karen</language>
+ <language type="kaw">kawi</language>
+ <language type="kbd">kabardiano</language>
+ <language type="kg">kongo</language>
+ <language type="kha">khasi</language>
+ <language type="khi">khoisan (otras)</language>
+ <language type="kho">kotanés</language>
+ <language type="ki">kikuyu</language>
+ <language type="kj">kuanyama</language>
+ <language type="kk">kazajo</language>
+ <language type="kl">groenlandés</language>
+ <language type="km">jemer</language>
+ <language type="kmb">kimbundu</language>
+ <language type="kn">canarés</language>
+ <language type="ko">coreano</language>
+ <language type="kok">konkani</language>
+ <language type="kos">kosraeano</language>
+ <language type="kpe">kpelle</language>
+ <language type="kr">kanuri</language>
+ <language type="krc">karachay-balkar</language>
+ <language type="kro">kru</language>
+ <language type="kru">kurukh</language>
+ <language type="ks">cachemiro</language>
+ <language type="ku">kurdo</language>
+ <language type="kum">kumyk</language>
+ <language type="kut">kutenai</language>
+ <language type="kv">komi</language>
+ <language type="kw">córnico</language>
+ <language type="ky">kirghiz</language>
+ <language type="la">latín</language>
+ <language type="lad">ladino</language>
+ <language type="lah">lahnda</language>
+ <language type="lam">lamba</language>
+ <language type="lb">luxemburgués</language>
+ <language type="lez">lezgiano</language>
+ <language type="lg">ganda</language>
+ <language type="li">limburgués</language>
+ <language type="ln">lingala</language>
+ <language type="lo">laosiano</language>
+ <language type="lol">mongo</language>
+ <language type="loz">lozi</language>
+ <language type="lt">lituano</language>
+ <language type="lu">luba-katanga</language>
+ <language type="lua">luba-lulua</language>
+ <language type="lui">luiseño</language>
+ <language type="lun">lunda</language>
+ <language type="lus">lushai</language>
+ <language type="lv">letón</language>
+ <language type="mad">madurés</language>
+ <language type="mag">magahi</language>
+ <language type="mai">maithili</language>
+ <language type="mak">macasar</language>
+ <language type="man">mandingo</language>
+ <language type="map">austronesias (otras)</language>
+ <language type="mas">masai</language>
+ <language type="mdf">moksha</language>
+ <language type="mdr">mandar</language>
+ <language type="men">mende</language>
+ <language type="mg">malgache</language>
+ <language type="mga">irlandés medieval</language>
+ <language type="mh">marshalés</language>
+ <language type="mi">maorí</language>
+ <language type="mic">micmac</language>
+ <language type="min">minangkabau</language>
+ <language type="mis">lenguas varias</language>
+ <language type="mk">macedonio</language>
+ <language type="mkh">mon-jemer (otras)</language>
+ <language type="ml">malayalam</language>
+ <language type="mn">mongol</language>
+ <language type="mnc">manchú</language>
+ <language type="mni">manipuri</language>
+ <language type="mno">lenguas manobo</language>
+ <language type="mo">moldavo</language>
+ <language type="moh">mohawk</language>
+ <language type="mos">mossi</language>
+ <language type="mr">marathi</language>
+ <language type="ms">malayo</language>
+ <language type="mt">maltés</language>
+ <language type="mul">lenguas múltiples</language>
+ <language type="mun">lenguas munda</language>
+ <language type="mus">creek</language>
+ <language type="mwl" references="RP1">mirandés</language>
+ <language type="mwr">marwari</language>
+ <language type="my">birmano</language>
+ <language type="myn">maya</language>
+ <language type="myv">erzya</language>
+ <language type="na">nauruano</language>
+ <language type="nah">náhuatl</language>
+ <language type="nai">indias norteamericanas (otras)</language>
+ <language type="nap">napolitano</language>
+ <language type="nb">bokmal noruego</language>
+ <language type="nd">ndebele septentrional</language>
+ <language type="nds">bajo alemán</language>
+ <language type="ne">nepalí</language>
+ <language type="new">newari</language>
+ <language type="ng">ndonga</language>
+ <language type="nia">nias</language>
+ <language type="nic">níger-kordofanianas (otras)</language>
+ <language type="niu">niueano</language>
+ <language type="nl" draft="provisional">neerlandés</language>
+ <language type="nn">nynorsk noruego</language>
+ <language type="no">noruego</language>
+ <language type="nog">nogai</language>
+ <language type="non">nórdico antiguo</language>
+ <language type="nr">ndebele meridional</language>
+ <language type="nso">sotho septentrional</language>
+ <language type="nub">lenguas nubias</language>
+ <language type="nv">navajo</language>
+ <language type="nwc" references="RP3">newari clásico</language>
+ <language type="ny">nyanja</language>
+ <language type="nym">nyamwezi</language>
+ <language type="nyn">nyankole</language>
+ <language type="nyo">nyoro</language>
+ <language type="nzi">nzima</language>
+ <language type="oc">occitano (después del 1500)</language>
+ <language type="oj">ojibwa</language>
+ <language type="om">oromo</language>
+ <language type="or">oriya</language>
+ <language type="os">osético</language>
+ <language type="osa">osage</language>
+ <language type="ota">turco otomano</language>
+ <language type="oto">lenguas otomanas</language>
+ <language type="pa">punjabí</language>
+ <language type="paa">papúes (otras)</language>
+ <language type="pag">pangasinán</language>
+ <language type="pal">pahlavi</language>
+ <language type="pam">pampanga</language>
+ <language type="pap">papiamento</language>
+ <language type="pau" references="RP1">palauano</language>
+ <language type="peo">persa antiguo</language>
+ <language type="phi">filipinas (otras)</language>
+ <language type="phn">fenicio</language>
+ <language type="pi">pali</language>
+ <language type="pl">polaco</language>
+ <language type="pon">pohnpeiano</language>
+ <language type="pra" references="RP1">lenguas prácritas</language>
+ <language type="pro">provenzal antiguo</language>
+ <language type="ps">pashto</language>
+ <language type="pt">portugués</language>
+ <language type="qu">quechua</language>
+ <language type="raj">rajasthani</language>
+ <language type="rap">rapanui</language>
+ <language type="rar">rarotongano</language>
+ <language type="rm">reto-romance</language>
+ <language type="rn">kiroundi</language>
+ <language type="ro">rumano</language>
+ <language type="roa">románicas (otras)</language>
+ <language type="rom">romaní</language>
+ <language type="root">raíz</language>
+ <language type="ru">ruso</language>
+ <language type="rup" references="RP1">arrumano</language>
+ <language type="rw">kinyarwanda</language>
+ <language type="sa">sánscrito</language>
+ <language type="sad">sandawe</language>
+ <language type="sah">yakut</language>
+ <language type="sai">indias sudamericanas (otras)</language>
+ <language type="sal">lenguas salish</language>
+ <language type="sam">arameo samaritano</language>
+ <language type="sas">sasak</language>
+ <language type="sat">santali</language>
+ <language type="sc">sardo</language>
+ <language type="scn" references="RP1">siciliano</language>
+ <language type="sco">escocés</language>
+ <language type="sd">sindhi</language>
+ <language type="se">sami septentrional</language>
+ <language type="sel">selkup</language>
+ <language type="sem">semíticas (otras)</language>
+ <language type="sg">sango</language>
+ <language type="sga">irlandés antiguo</language>
+ <language type="sgn">lenguajes de signos</language>
+ <language type="sh">serbocroata</language>
+ <language type="shn">shan</language>
+ <language type="si" references="RP3">cingalés</language>
+ <language type="sid">sidamo</language>
+ <language type="sio">lenguas sioux</language>
+ <language type="sit">sino-tibetanas (otras)</language>
+ <language type="sk">eslovaco</language>
+ <language type="sl">esloveno</language>
+ <language type="sla">eslavas (otras)</language>
+ <language type="sm">samoano</language>
+ <language type="sma">sami meridional</language>
+ <language type="smi">lenguas sami (otras)</language>
+ <language type="smj">sami lule</language>
+ <language type="smn">sami inari</language>
+ <language type="sms" references="RP3">sami skolt</language>
+ <language type="sn">shona</language>
+ <language type="snk">soninké</language>
+ <language type="so">somalí</language>
+ <language type="sog">sogdiano</language>
+ <language type="son">songhai</language>
+ <language type="sq">albanés</language>
+ <language type="sr">serbio</language>
+ <language type="srn" references="RP1">sranan tongo</language>
+ <language type="srr">serer</language>
+ <language type="ss">siswati</language>
+ <language type="ssa">nilosaharianas (otras)</language>
+ <language type="st">sesotho</language>
+ <language type="su">sundanés</language>
+ <language type="suk">sukuma</language>
+ <language type="sus">susu</language>
+ <language type="sux">sumerio</language>
+ <language type="sv">sueco</language>
+ <language type="sw">swahili</language>
+ <language type="syr">siriaco</language>
+ <language type="ta">tamil</language>
+ <language type="tai">tai (otras)</language>
+ <language type="te">telugu</language>
+ <language type="tem">temne</language>
+ <language type="ter">tereno</language>
+ <language type="tet">tetún</language>
+ <language type="tet" references="RP1" alt="proposed-u167-1" draft="provisional">tetun</language>
+ <language type="tg">tayiko</language>
+ <language type="th">tailandés</language>
+ <language type="ti" references="RP1">tigriña</language>
+ <language type="tig">tigré</language>
+ <language type="tk" references="RP1">turcomano</language>
+ <language type="tkl">tokelauano</language>
+ <language type="tl">tagalo</language>
+ <language type="tlh">klingon</language>
+ <language type="tli">tlingit</language>
+ <language type="tmh">tamashek</language>
+ <language type="tn">setchwana</language>
+ <language type="tn" references="RP3" alt="proposed-u167-1" draft="provisional">sechuanés</language>
+ <language type="to">tonga (Islas Tonga)</language>
+ <language type="tog">tonga (Niasa)</language>
+ <language type="tpi">tok pisin</language>
+ <language type="tr">turco</language>
+ <language type="ts">tsonga</language>
+ <language type="tsi">tsimshiano</language>
+ <language type="tt" references="RP1">tártaro</language>
+ <language type="tum">tumbuka</language>
+ <language type="tup">lenguas tupí</language>
+ <language type="tut">altaicas (otras)</language>
+ <language type="tvl">tuvaluano</language>
+ <language type="tw">twi</language>
+ <language type="ty">tahitiano</language>
+ <language type="tyv">tuviniano</language>
+ <language type="udm">udmurt</language>
+ <language type="ug">uigur</language>
+ <language type="uga">ugarítico</language>
+ <language type="uk">ucraniano</language>
+ <language type="umb">umbundu</language>
+ <language type="und">indeterminada</language>
+ <language type="ur">urdu</language>
+ <language type="uz">uzbeko</language>
+ <language type="ve">venda</language>
+ <language type="vi">vietnamita</language>
+ <language type="vo" references="RP1">volapük</language>
+ <language type="vot">vótico</language>
+ <language type="wa">valón</language>
+ <language type="wak">lenguas wakasha</language>
+ <language type="wal">walamo</language>
+ <language type="war">waray</language>
+ <language type="was">washo</language>
+ <language type="wen">lenguas sorbias</language>
+ <language type="wo">uolof</language>
+ <language type="wo" references="RP3" alt="proposed-u167-1" draft="provisional">wolof</language>
+ <language type="xal">kalmyk</language>
+ <language type="xh">xhosa</language>
+ <language type="yap">yapés</language>
+ <language type="yi" references="RP1">yídish</language>
+ <language type="yo">yoruba</language>
+ <language type="ypk">lenguas yupik</language>
+ <language type="za">zhuang</language>
+ <language type="zap">zapoteco</language>
+ <language type="zen">zenaga</language>
+ <language type="zh">chino</language>
+ <language type="znd">zande</language>
+ <language type="zu">zulú</language>
+ <language type="zun">zuni</language>
+ </languages>
+ <scripts>
+ <script type="Arab">árabe</script>
+ <script type="Armn">armenio</script>
+ <script type="Batk">batak</script>
+ <script type="Beng">bengalí</script>
+ <script type="Blis">símbolos blis</script>
+ <script type="Bopo">bopomofo</script>
+ <script type="Brah">brahmi</script>
+ <script type="Brai">braille</script>
+ <script type="Buhd">buhid</script>
+ <script type="Cans">símbolos aborígenes canadienses unificados</script>
+ <script type="Cher">cherokee</script>
+ <script type="Cirt">cirth</script>
+ <script type="Copt">copto</script>
+ <script type="Cprt">chipriota</script>
+ <script type="Cyrl">cirílico</script>
+ <script type="Deva">devanagari</script>
+ <script type="Dsrt">deseret</script>
+ <script type="Egyd">egipcio demótico</script>
+ <script type="Egyh">egipcio hierático</script>
+ <script type="Egyp" references="RP2">jeroglíficos egipcios</script>
+ <script type="Ethi" references="RP3">etiópico</script>
+ <script type="Geor">georgiano</script>
+ <script type="Goth">gótico</script>
+ <script type="Grek">griego</script>
+ <script type="Gujr">gujarati</script>
+ <script type="Guru">gurmuji</script>
+ <script type="Hang">hangul</script>
+ <script type="Hani">han</script>
+ <script type="Hano">hanunoo</script>
+ <script type="Hans">han simplificado</script>
+ <script type="Hant">han tradicional</script>
+ <script type="Hebr">hebreo</script>
+ <script type="Hira">hiragana</script>
+ <script type="Hmng">pahawh hmong</script>
+ <script type="Hrkt" references="RP1">katakana o hiragana</script>
+ <script type="Hung" references="RP3">húngaro antiguo</script>
+ <script type="Inds">Indio (harappan)</script>
+ <script type="Ital">antigua bastardilla</script>
+ <script type="Java" references="RP1">javanés</script>
+ <script type="Kana">katakana</script>
+ <script type="Khmr">jemer</script>
+ <script type="Knda">canarés</script>
+ <script type="Laoo">lao</script>
+ <script type="Latf">latín (variante fraktur)</script>
+ <script type="Latg">latín (variante gaélica)</script>
+ <script type="Latn">latín</script>
+ <script type="Limb">limbu</script>
+ <script type="Lina">lineal A</script>
+ <script type="Linb" references="RP3">lineal B</script>
+ <script type="Maya" references="RP2">jeroglíficos mayas</script>
+ <script type="Mero">meroítico</script>
+ <script type="Mlym">malayálam</script>
+ <script type="Mong" references="RP1">mongol</script>
+ <script type="Mymr" references="RP3">birmano</script>
+ <script type="Ogam">ogham</script>
+ <script type="Orya">oriya</script>
+ <script type="Osma">osmaniya</script>
+ <script type="Phnx" references="RP3">fenicio</script>
+ <script type="Qaai">heredado</script>
+ <script type="Runr">rúnico</script>
+ <script type="Shaw" references="RP1">shaviano</script>
+ <script type="Sinh">binhala</script>
+ <script type="Syrc">siriaco</script>
+ <script type="Tagb">tagbanúa</script>
+ <script type="Tale">tai le</script>
+ <script type="Taml">tamil</script>
+ <script type="Telu">telugu</script>
+ <script type="Tglg">tagalo</script>
+ <script type="Thaa">thaana</script>
+ <script type="Thai">tailandés</script>
+ <script type="Tibt">tibetano</script>
+ <script type="Ugar">ugarítico</script>
+ <script type="Yiii">yi</script>
+ <script type="Zyyy">común</script>
+ </scripts>
+ <territories>
+ <territory type="001">Mundo</territory>
+ <territory type="002">Ãfrica</territory>
+ <territory type="005">Suramérica</territory>
+ <territory type="009">Oceanía</territory>
+ <territory type="011">Ãfrica occidental</territory>
+ <territory type="013">Centroamérica</territory>
+ <territory type="014">Ãfrica oriental</territory>
+ <territory type="015">Ãfrica septentrional</territory>
+ <territory type="017">Ãfrica central</territory>
+ <territory type="018">Ãfrica meridional</territory>
+ <territory type="019">Américas</territory>
+ <territory type="021">Norteamérica</territory>
+ <territory type="029">Caribe</territory>
+ <territory type="030">Asia oriental</territory>
+ <territory type="034">Asia meridional</territory>
+ <territory type="035">Sudeste asiático</territory>
+ <territory type="039">Europa meridional</territory>
+ <territory type="053">Australia y Nueva Zelanda</territory>
+ <territory type="054">Melanesia</territory>
+ <territory type="057">Micronesia [057]</territory>
+ <territory type="061">Polinesia</territory>
+ <territory type="142">Asia</territory>
+ <territory type="143">Asia central</territory>
+ <territory type="145">Asia occidental</territory>
+ <territory type="150">Europa</territory>
+ <territory type="151">Europa oriental</territory>
+ <territory type="154">Europa septentrional</territory>
+ <territory type="155">Europa occidental</territory>
+ <territory type="172" draft="provisional">Commonwealth de Estados Independientes</territory>
+ <territory type="419">Latinoamérica y el Caribe</territory>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Emiratos Ãrabes Unidos</territory>
+ <territory type="AF">Afganistán</territory>
+ <territory type="AG">Antigua y Barbuda</territory>
+ <territory type="AI">Anguila</territory>
+ <territory type="AL">Albania</territory>
+ <territory type="AM">Armenia</territory>
+ <territory type="AN">Antillas Neerlandesas</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antártida</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">Samoa Americana</territory>
+ <territory type="AT">Austria</territory>
+ <territory type="AU">Australia</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Islas Ã…land</territory>
+ <territory type="AZ">Azerbaiyán</territory>
+ <territory type="BA">Bosnia-Herzegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BE">Bélgica</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgaria</territory>
+ <territory type="BH" references="RP4">Bahréin</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benín</territory>
+ <territory type="BM">Bermudas</territory>
+ <territory type="BN">Brunéi</territory>
+ <territory type="BO">Bolivia</territory>
+ <territory type="BR">Brasil</territory>
+ <territory type="BS">Bahamas</territory>
+ <territory type="BT">Bután</territory>
+ <territory type="BV">Isla Bouvet</territory>
+ <territory type="BW">Botsuana</territory>
+ <territory type="BY">Bielorrusia</territory>
+ <territory type="BZ">Belice</territory>
+ <territory type="CA">Canadá</territory>
+ <territory type="CC">Islas Cocos (Keeling)</territory>
+ <territory type="CD">República Democrática del Congo</territory>
+ <territory type="CF">República Centroafricana</territory>
+ <territory type="CG">Congo</territory>
+ <territory type="CH">Suiza</territory>
+ <territory type="CI">Costa de Marfil</territory>
+ <territory type="CK">Islas Cook</territory>
+ <territory type="CL">Chile</territory>
+ <territory type="CM">Camerún</territory>
+ <territory type="CN">China</territory>
+ <territory type="CO">Colombia</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS">Serbia y Montenegro</territory>
+ <territory type="CU">Cuba</territory>
+ <territory type="CV">Cabo Verde</territory>
+ <territory type="CX">Isla Navidad</territory>
+ <territory type="CX" references="RP4" alt="proposed-u167-1" draft="provisional">Isla Christmas</territory>
+ <territory type="CY">Chipre</territory>
+ <territory type="CZ">República Checa</territory>
+ <territory type="DE">Alemania</territory>
+ <territory type="DJ">Yibuti</territory>
+ <territory type="DK">Dinamarca</territory>
+ <territory type="DM">Dominica</territory>
+ <territory type="DO">República Dominicana</territory>
+ <territory type="DZ">Argelia</territory>
+ <territory type="EC">Ecuador</territory>
+ <territory type="EE">Estonia</territory>
+ <territory type="EG">Egipto</territory>
+ <territory type="EH">Sáhara Occidental</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">España</territory>
+ <territory type="ET">Etiopía</territory>
+ <territory type="FI">Finlandia</territory>
+ <territory type="FJ">Fiyi</territory>
+ <territory type="FK">Islas Falkland (Malvinas)</territory>
+ <territory type="FM">Micronesia</territory>
+ <territory type="FO">Islas Feroe</territory>
+ <territory type="FR">Francia</territory>
+ <territory type="GA">Gabón</territory>
+ <territory type="GB">Reino Unido</territory>
+ <territory type="GD">Granada</territory>
+ <territory type="GE">Georgia</territory>
+ <territory type="GF">Guayana Francesa</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Groenlandia</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadalupe</territory>
+ <territory type="GQ">Guinea Ecuatorial</territory>
+ <territory type="GR">Grecia</territory>
+ <territory type="GS">Islas Georgia del Sur y Sandwich del Sur</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinea-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Hong-Kong, Región administrativa especial de China</territory>
+ <territory type="HM">Islas Heard y McDonald</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Croacia</territory>
+ <territory type="HT">Haití</territory>
+ <territory type="HU">Hungría</territory>
+ <territory type="ID">Indonesia</territory>
+ <territory type="IE">Irlanda</territory>
+ <territory type="IL">Israel</territory>
+ <territory type="IN">India</territory>
+ <territory type="IO" references="RP4">Territorio Británico del Océano Ãndico</territory>
+ <territory type="IQ">Iraq</territory>
+ <territory type="IR">Irán</territory>
+ <territory type="IS">Islandia</territory>
+ <territory type="IT">Italia</territory>
+ <territory type="JM">Jamaica</territory>
+ <territory type="JO">Jordania</territory>
+ <territory type="JP">Japón</territory>
+ <territory type="KE">Kenia</territory>
+ <territory type="KG" references="RP4">Kirguistán</territory>
+ <territory type="KH">Camboya</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Comoras</territory>
+ <territory type="KN">San Cristóbal y Nieves</territory>
+ <territory type="KP">Corea del Norte</territory>
+ <territory type="KR">Corea del Sur</territory>
+ <territory type="KW">Kuwait</territory>
+ <territory type="KY">Islas Caimán</territory>
+ <territory type="KZ">Kazajstán</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Líbano</territory>
+ <territory type="LC">Saint Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberia</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Lituania</territory>
+ <territory type="LU">Luxemburgo</territory>
+ <territory type="LV">Letonia</territory>
+ <territory type="LY">Libia</territory>
+ <territory type="MA">Marruecos</territory>
+ <territory type="MC">Mónaco</territory>
+ <territory type="MD" references="RP1">Moldavia</territory>
+ <territory type="MG">Madagascar</territory>
+ <territory type="MH">Islas Marshall</territory>
+ <territory type="MK">Macedonia</territory>
+ <territory type="ML">Malí</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongolia</territory>
+ <territory type="MO">Macao, Región administrativa especial de China</territory>
+ <territory type="MP">Islas Marianas del Norte</territory>
+ <territory type="MQ">Martinica</territory>
+ <territory type="MR">Mauritania</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauricio</territory>
+ <territory type="MV">Maldivas</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">México</territory>
+ <territory type="MY">Malasia</territory>
+ <territory type="MZ">Mozambique</territory>
+ <territory type="NA">Namibia</territory>
+ <territory type="NC">Nueva Caledonia</territory>
+ <territory type="NE">Níger</territory>
+ <territory type="NF">Isla Norfolk</territory>
+ <territory type="NG">Nigeria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Países Bajos</territory>
+ <territory type="NO">Noruega</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Isla Niue</territory>
+ <territory type="NZ">Nueva Zelanda</territory>
+ <territory type="OM">Omán</territory>
+ <territory type="PA">Panamá</territory>
+ <territory type="PE">Perú</territory>
+ <territory type="PF">Polinesia Francesa</territory>
+ <territory type="PG">Papúa Nueva Guinea</territory>
+ <territory type="PH">Filipinas</territory>
+ <territory type="PK">Pakistán</territory>
+ <territory type="PL">Polonia</territory>
+ <territory type="PM">San Pedro y Miquelón</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Puerto Rico</territory>
+ <territory type="PS">Territorios Palestinos</territory>
+ <territory type="PT">Portugal</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Qatar</territory>
+ <territory type="QO">Territorios alejados de Oceanía</territory>
+ <territory type="RE">Reunión</territory>
+ <territory type="RO">Rumanía</territory>
+ <territory type="RU">Rusia</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SA">Arabia Saudí</territory>
+ <territory type="SB">Islas Salomón</territory>
+ <territory type="SC">Seychelles</territory>
+ <territory type="SD">Sudán</territory>
+ <territory type="SE">Suecia</territory>
+ <territory type="SG">Singapur</territory>
+ <territory type="SH">Santa Elena</territory>
+ <territory type="SI">Eslovenia</territory>
+ <territory type="SJ">Svalbard y Jan Mayen</territory>
+ <territory type="SK">Eslovaquia</territory>
+ <territory type="SL">Sierra Leona</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalia</territory>
+ <territory type="SR" references="RP4">Surinam</territory>
+ <territory type="ST">Santo Tomé y Príncipe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Siria</territory>
+ <territory type="SZ">Suazilandia</territory>
+ <territory type="TC">Islas Turcas y Caicos</territory>
+ <territory type="TD">Chad</territory>
+ <territory type="TF">Territorios Australes Franceses</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Tailandia</territory>
+ <territory type="TJ">Tayikistán</territory>
+ <territory type="TK">Islas Tokelau</territory>
+ <territory type="TL">Timor Oriental</territory>
+ <territory type="TM">Turkmenistán</territory>
+ <territory type="TN">Túnez</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turquía</territory>
+ <territory type="TT">Trinidad y Tabago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwán</territory>
+ <territory type="TZ">Tanzania</territory>
+ <territory type="UA">Ucrania</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">Islas menores alejadas de los Estados Unidos</territory>
+ <territory type="US">Estados Unidos</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Uzbekistán</territory>
+ <territory type="VA">Ciudad del Vaticano</territory>
+ <territory type="VC">San Vicente y las Granadinas</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Islas Vírgenes Británicas</territory>
+ <territory type="VI">Islas Vírgenes de los Estados Unidos</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis y Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Yemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Sudáfrica</territory>
+ <territory type="ZM">Zambia</territory>
+ <territory type="ZW">Zimbabue</territory>
+ </territories>
+ <variants>
+ <variant type="REVISED" references="RP3">Ortografía revisada</variant>
+ </variants>
+ <keys>
+ <key type="calendar">calendario</key>
+ <key type="collation">intercalación</key>
+ <key type="currency">moneda</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">calendario budista</type>
+ <type type="chinese" key="calendar">calendario chino</type>
+ <type type="direct" key="collation">orden directo</type>
+ <type type="gregorian" key="calendar">calendario gregoriano</type>
+ <type type="hebrew" key="calendar">calendario hebreo</type>
+ <type type="islamic" key="calendar">calendario islámico</type>
+ <type type="islamic-civil" key="calendar">calendario civil islámico</type>
+ <type type="japanese" key="calendar">calendario japonés</type>
+ <type type="phonebook" key="collation">orden de listín telefónico</type>
+ <type type="pinyin" key="collation">orden pinyin</type>
+ <type type="stroke" key="collation" references="RP3">orden de los trazos</type>
+ <type type="traditional" key="collation">orden tradicional</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US" references="RP3">estadounidense</measurementSystemName>
+ <measurementSystemName type="metric" references="RP3">métrico</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a á b-e é f-i í j-n ñ o ó p-u ú ü v-z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[ü]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>‘</quotationStart>
+ <quotationEnd>’</quotationEnd>
+ <alternateQuotationStart>“</alternateQuotationStart>
+ <alternateQuotationEnd>â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <localizedPatternChars>GuMtkHmsSEDFwWahKzUeygAZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">ene</month>
+ <month type="2">feb</month>
+ <month type="3">mar</month>
+ <month type="4">abr</month>
+ <month type="5">may</month>
+ <month type="6">jun</month>
+ <month type="7">jul</month>
+ <month type="8">ago</month>
+ <month type="9">sep</month>
+ <month type="10">oct</month>
+ <month type="11">nov</month>
+ <month type="12">dic</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">enero</month>
+ <month type="2">febrero</month>
+ <month type="3">marzo</month>
+ <month type="4">abril</month>
+ <month type="5">mayo</month>
+ <month type="6">junio</month>
+ <month type="7">julio</month>
+ <month type="8">agosto</month>
+ <month type="9">septiembre</month>
+ <month type="10">octubre</month>
+ <month type="11">noviembre</month>
+ <month type="12">diciembre</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">E</month>
+ <month type="2">F</month>
+ <month type="3">M</month>
+ <month type="4">A</month>
+ <month type="5">M</month>
+ <month type="6">J</month>
+ <month type="7">J</month>
+ <month type="8">A</month>
+ <month type="9">S</month>
+ <month type="10">O</month>
+ <month type="11">N</month>
+ <month type="12">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">dom</day>
+ <day type="mon">lun</day>
+ <day type="tue">mar</day>
+ <day type="wed">mié</day>
+ <day type="thu">jue</day>
+ <day type="fri">vie</day>
+ <day type="sat">sáb</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">domingo</day>
+ <day type="mon">lunes</day>
+ <day type="tue">martes</day>
+ <day type="wed">miércoles</day>
+ <day type="thu">jueves</day>
+ <day type="fri">viernes</day>
+ <day type="sat">sábado</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">D</day>
+ <day type="mon">L</day>
+ <day type="tue">M</day>
+ <day type="wed">M</day>
+ <day type="thu">J</day>
+ <day type="fri">V</day>
+ <day type="sat">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">T1</quarter>
+ <quarter type="2">T2</quarter>
+ <quarter type="3">T3</quarter>
+ <quarter type="4">T4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1er trimestre</quarter>
+ <quarter type="2">2º trimestre</quarter>
+ <quarter type="3">3er trimestre</quarter>
+ <quarter type="4">4º trimestre</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am references="RP1">a.m.</am>
+ <pm references="RP1">p.m.</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">a.C.</era>
+ <era type="1">d.C.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d' de 'MMMM' de 'yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d' de 'MMMM' de 'yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH'H'mm''ss&quot; z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="MMMdd" draft="provisional">dd-MMM</dateFormatItem>
+ <dateFormatItem id="MMd" draft="provisional">d/MM</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyMMM" draft="provisional">MMM-yy</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="provisional">QQQQ yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName>era</displayName>
+ </field>
+ <field type="year">
+ <displayName>año</displayName>
+ </field>
+ <field type="month">
+ <displayName>mes</displayName>
+ </field>
+ <field type="week">
+ <displayName>semana</displayName>
+ </field>
+ <field type="day">
+ <displayName>día</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>día de la semana</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName>periodo del día</displayName>
+ </field>
+ <field type="hour">
+ <displayName>hora</displayName>
+ </field>
+ <field type="minute">
+ <displayName>minuto</displayName>
+ </field>
+ <field type="second">
+ <displayName>segundo</displayName>
+ </field>
+ <field type="zone">
+ <displayName>zona</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Polo Sur</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Rio_Gallegos">
+ <exemplarCity references="RP3">Río Gallegos</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Tucuman">
+ <exemplarCity references="RP3">Tucumán</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity>Córdoba</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <standard>Hora estándar del Atlántico</standard>
+ <daylight>Hora de verano del Atlántico</daylight>
+ </long>
+ <short>
+ <standard>AST</standard>
+ <daylight>ADT</daylight>
+ </short>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <standard>Hora estándar de Newfoundland</standard>
+ <daylight>Hora de verano de Newfoundland</daylight>
+ </long>
+ <short>
+ <standard>CNT</standard>
+ </short>
+ <exemplarCity>St. Johns</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>Pascua</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <standard>Hora estándar de China</standard>
+ <daylight>Hora estándar de China</daylight>
+ </long>
+ <short>
+ <standard>CTT</standard>
+ </short>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity references="RP3">Galápagos</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>Canarias</exemplarCity>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <standard>Hora estándar de Europa Central</standard>
+ <daylight>Hora de verano de Europa Central</daylight>
+ </long>
+ <short>
+ <standard>CET</standard>
+ <daylight>CEST</daylight>
+ </short>
+ <exemplarCity>París</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>Londres</exemplarCity>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <standard>Hora estándar de Israel</standard>
+ <daylight>Hora de verano de Israel</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IDT</daylight>
+ </short>
+ <exemplarCity>Jerusalén</exemplarCity>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <standard>Hora estándar de Japón</standard>
+ <daylight>Hora estándar de Japón</daylight>
+ </long>
+ <short>
+ <standard>JST</standard>
+ <daylight>JST</daylight>
+ </short>
+ <exemplarCity>Tokio</exemplarCity>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <standard>Hora media de Greenwich</standard>
+ <daylight>Hora media de Greenwich</daylight>
+ </long>
+ <short>
+ <standard>GMT</standard>
+ <daylight>GMT</daylight>
+ </short>
+ <exemplarCity>Casablanca</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>Ciudad de México</exemplarCity>
+ </zone>
+ <zone type="America/Merida">
+ <exemplarCity>Mérida</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>Cancún</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity>Tahití</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lisboa</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>Hora estándar de Europa del Este</standard>
+ <daylight>Hora de verano de Europa del Este</daylight>
+ </long>
+ <short>
+ <standard>EET</standard>
+ <daylight>EEST</daylight>
+ </short>
+ <exemplarCity>Bucarest</exemplarCity>
+ </zone>
+ <zone type="Europe/Kaliningrad">
+ <exemplarCity>Kaliningrado</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moscú</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>Yekaterinburgo</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <standard>Hora estándar de Hawai</standard>
+ <daylight>Hora estándar de Hawai</daylight>
+ </long>
+ <short>
+ <standard>HST</standard>
+ <daylight>HST</daylight>
+ </short>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <standard>Hora estándar de Alaska</standard>
+ <daylight>Hora de verano de Alaska</daylight>
+ </long>
+ <short>
+ <standard>AKST</standard>
+ <daylight>AKDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <standard>Hora estándar del Pacífico</standard>
+ <daylight>Hora de verano del Pacífico</daylight>
+ </long>
+ <short>
+ <standard>PST</standard>
+ <daylight>PDT</daylight>
+ </short>
+ <exemplarCity>Los Ãngeles</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <long>
+ <standard>Hora estándar de Montaña</standard>
+ <daylight>Hora estándar de Montaña</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MST</daylight>
+ </short>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <standard>Hora estándar de Montaña</standard>
+ <daylight>Hora de verano de Montaña</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <standard>Hora estándar central</standard>
+ <daylight>Hora de verano central</daylight>
+ </long>
+ <short>
+ <standard>CST</standard>
+ <daylight>CDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Indianapolis">
+ <exemplarCity>Indianápolis</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <standard>Hora estándar oriental</standard>
+ <daylight>Hora de verano oriental</daylight>
+ </long>
+ <short>
+ <standard>EST</standard>
+ <daylight>EDT</daylight>
+ </short>
+ <exemplarCity>Nueva York</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ADP">
+ <displayName>peseta andorrana</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>dirham de los Emiratos Ãrabes Unidos</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>afgani (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>afgani</displayName>
+ <symbol>Af</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>lek albanés</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>dram armenio</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>florín de las Antillas Neerlandesas</displayName>
+ <symbol>NA f.</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>kwanza angoleño</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>kwanza angoleño (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>nuevo kwanza angoleño (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>kwanza reajustado angoleño (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>austral argentino</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>peso argentino (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>peso argentino</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>chelín austriaco</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>dólar australiano</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>florín de Aruba</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>manat azerí</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>dinar bosnio</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName references="RP1">marco convertible de Bosnia-Herzegovina</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>dólar de Barbados</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>taka de Bangladesh</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>franco belga (convertible)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>franco belga</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>franco belga (financiero)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>lev fuerte búlgaro</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>nuevo lev búlgaro</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>dinar bahreiní</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>franco de Burundi</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>dólar de Bermudas</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>dólar de Brunéi</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>boliviano</displayName>
+ <symbol>Bs</symbol>
+ </currency>
+ <currency type="BOP">
+ <displayName>peso boliviano</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>MVDOL boliviano</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>nuevo cruceiro brasileño (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>cruzado brasileño</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>cruceiro brasileño (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>real brasileño</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRN">
+ <displayName>nuevo cruzado brasileño</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>cruceiro brasileño</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>dólar de las Bahamas</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>ngultrum butanés</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>kyat birmano</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>pula botsuano</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>nuevo rublo bielorruso (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>rublo bielorruso</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>dólar de Belice</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>dólar canadiense</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>franco congoleño</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>franco suizo</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CHW">
+ <displayName references="RP3" draft="provisional">WIR franc</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>unidad de fomento chilena</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>peso chileno</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>yuan renminbi chino</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>peso colombiano</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="COU">
+ <displayName references="RP1">unidad de valor real colombiana</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>colón costarricense</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSD">
+ <displayName references="RP1">dinar serbio</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>corona fuerte checoslovaca</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>peso cubano</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>escudo de Cabo Verde</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>libra chipriota</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>corona checa</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>ostmark de Alemania del Este</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>marco alemán</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>franco de Yibuti</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>corona danesa</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>peso dominicano</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>dinar argelino</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>sucre ecuatoriano</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>unidad de valor constante (UVC) ecuatoriana</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>corona estonia</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>libra egipcia</displayName>
+ </currency>
+ <currency type="EQE">
+ <displayName draft="provisional">ekwele</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>nakfa eritreo</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName>peseta española (cuenta A)</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName>peseta española (cuenta convertible)</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>peseta española</displayName>
+ <symbol>₧</symbol>
+ </currency>
+ <currency type="ETB">
+ <displayName>birr etíope</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>marco finlandés</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>dólar de las Islas Fiyi</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>libra de las Islas Malvinas</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>franco francés</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>libra esterlina británica</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>kupon larit georgiano</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>lari georgiano</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>cedi ghanés</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>libra de Gibraltar</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>dalasi gambiano</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName references="RP1">franco guineano</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>syli guineano</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>ekuele de Guinea Ecuatorial</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>dracma griego</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>quetzal guatemalteco</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>escudo de Guinea Portuguesa</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>peso de Guinea-Bissáu</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>dólar guyanés</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>dólar de Hong Kong</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>lempira hondureño</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>dinar croata</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>kuna croata</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>gourde haitiano</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>florín húngaro</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>rupia indonesia</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>libra irlandesa</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>libra israelí</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>nuevo sheqel israelí</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>rupia india</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>dinar iraquí</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>rial iraní</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>corona islandesa</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>lira italiana</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>dólar de Jamaica</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>dinar jordano</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>yen japonés</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>chelín keniata</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>som kirguís</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>riel camboyano</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>franco comorense</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>won norcoreano</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>won surcoreano</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>dinar kuwaití</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>dólar de las Islas Caimán</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>tenge kazako</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>kip laosiano</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>libra libanesa</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>rupia de Sri Lanka</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>dólar liberiano</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>loti lesothense</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LSM">
+ <displayName references="RP1" draft="provisional">maloti lesothense</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>litas lituano</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>talonas lituano</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName>franco convertible luxemburgués</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>franco luxemburgués</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName>franco financiero luxemburgués</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>lats letón</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>rublo letón</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>dinar libio</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>dirham marroquí</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>franco marroquí</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>leu moldavo</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>ariary malgache</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>franco malgache</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>dinar macedonio</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>franco malí</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>kyat de Myanmar</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>tugrik mongol</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>pataca de Macao</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>ouguiya mauritano</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>lira maltesa</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>libra maltesa</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>rupia mauriciana</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>rufiyaa de Maldivas</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>kwacha de Malawi</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>peso mexicano</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>peso de plata mexicano (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>unidad de inversión (UDI) mexicana</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>ringgit malasio</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>escudo mozambiqueño</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>metical mozambiqueño</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>dólar de Namibia</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>naira nigeriano</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>córdoba nicaragüense</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>córdoba oro nicaragüense</displayName>
+ <symbol references="R1">C$</symbol>
+ </currency>
+ <currency type="NLG">
+ <displayName>florín neerlandés</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>corona noruega</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>rupia nepalesa</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>dólar neozelandés</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>rial omaní</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>balboa panameño</displayName>
+ <symbol draft="unconfirmed">B</symbol>
+ </currency>
+ <currency type="PEI">
+ <displayName>inti peruano</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>nuevo sol peruano</displayName>
+ <symbol draft="unconfirmed">S/</symbol>
+ </currency>
+ <currency type="PES">
+ <displayName>sol peruano</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>kina de Papúa Nueva Guinea</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>peso filipino</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>rupia pakistaní</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>zloty polaco</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>zloty polaco (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>escudo portugués</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>guaraní paraguayo</displayName>
+ <symbol draft="unconfirmed">G</symbol>
+ <symbol references="R2" alt="variant" draft="unconfirmed">₲</symbol>
+ </currency>
+ <currency type="QAR">
+ <displayName>riyal de Qatar</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="RHD">
+ <displayName references="RP3">dólar rodesiano</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName references="RP3">antiguo leu rumano</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RON">
+ <displayName references="RP1">leu rumano</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>rublo ruso</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>rublo ruso (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>franco ruandés</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>riyal saudí</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>dólar de las Islas Salomón</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>rupia de Seychelles</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>dinar sudanés</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>libra sudanesa</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>corona sueca</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>dólar singapurense</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>libra de Santa Elena</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>tólar esloveno</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>corona eslovaca</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>leone de Sierra Leona</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>chelín somalí</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRD">
+ <displayName references="RP1">dólar surinamés</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>florín surinamés</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>dobra de Santo Tomé y Príncipe</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>rublo soviético</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>colón salvadoreño</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>libra siria</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>lilangeni suazi</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>baht tailandés</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>rublo tayiko</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>somoni tayiko</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>manat turcomano</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>dinar tunecino</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>paʻanga tongano</displayName>
+ <symbol>T$</symbol>
+ </currency>
+ <currency type="TPE">
+ <displayName>escudo timorense</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>lira turca</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName references="RP1">nueva lira turca</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>dólar de Trinidad y Tobago</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>nuevo dólar taiwanés</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>chelín tanzano</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>grivna ucraniana</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>karbovanet ucraniano</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>chelín ugandés (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>chelín ugandés</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>dólar estadounidense</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>dólar estadounidense (día siguiente)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>dólar estadounidense (mismo día)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>peso uruguayo (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>peso uruguayo</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>sum uzbeko</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>bolívar venezolano</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>dong vietnamita</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>vatu vanuatuense</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>tala samoano</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>franco CFA BEAC</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName references="RP1">plata</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>oro</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>unidad compuesta europea</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>unidad monetaria europea</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>unidad de cuenta europea (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>unidad de cuenta europea (XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>dólar del Caribe Oriental</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>derechos especiales de giro</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>unidad de moneda europea</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>franco oro francés</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>franco UIC francés</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>franco CFA BCEAO</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName references="RP1">paladio</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>franco CFP</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="XPT">
+ <displayName references="RP1">platino</displayName>
+ </currency>
+ <currency type="XRE">
+ <displayName references="RP3">fondos RINET</displayName>
+ </currency>
+ <currency type="XTS">
+ <displayName references="RP1">código reservado para pruebas</displayName>
+ </currency>
+ <currency type="XXX">
+ <displayName>Sin divisa</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>dinar yemení</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>rial yemení</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>dinar fuerte yugoslavo</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>super dinar yugoslavo</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>dinar convertible yugoslavo</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>rand sudafricano (financiero)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>rand sudafricano</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>kwacha zambiano</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>nuevo zaire zaireño</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>zaire zaireño</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>dólar de Zimbabue</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>sí:si:s</yesstr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="R1" uri="http://www.bcn.gob.ni/">Banco Central de Nicaragua</reference>
+ <reference type="R2" uri="http://www.unicode.org/charts/PDF/U20A0.pdf">Unicode</reference>
+ <reference type="RP1" uri="http://es.wikipedia.org/wiki/Portada">Wikipedia (Spanish version)</reference>
+ <reference type="RP2" uri="http://www.rae.es/">Dictionary of the Real Academia Española</reference>
+ <reference type="RP3" uri="http://www.google.es/">Google search results</reference>
+ <reference type="RP4" uri="http://publications.eu.int/code/es/es-5000600.htm">Order of country codes (European Union Style Guide)</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/es_AR.xml b/libs/Zend/Locale/Data/es_AR.xml
new file mode 100755
index 0000000000..d7ca0121ad
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_AR.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="es"/>
+ <territory type="AR"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH'h'''mm z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ARS">
+ <displayName>Peso Argentino</displayName>
+ <symbol>$</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>Dólar Americano</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_BO.xml b/libs/Zend/Locale/Data/es_BO.xml
new file mode 100755
index 0000000000..63595ef474
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_BO.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/28 01:23:32 $"/>
+ <language type="es"/>
+ <territory type="BO"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_CL.xml b/libs/Zend/Locale/Data/es_CL.xml
new file mode 100755
index 0000000000..cec1727182
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_CL.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.43 $"/>
+ <generation date="$Date: 2006/06/28 02:00:53 $"/>
+ <language type="es"/>
+ <territory type="CL"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="arn" draft="provisional">mapudungun</language>
+ <language type="ira" draft="provisional">iraníes</language>
+ </languages>
+ <scripts>
+ <script type="Bali">balinés</script>
+ </scripts>
+ <territories>
+ <territory type="005">Sudamérica</territory>
+ <territory type="AN" draft="provisional">Antillas Holandesas</territory>
+ <territory type="AZ" draft="provisional">Azerbayán</territory>
+ <territory type="EH">Sahara Occidental</territory>
+ <territory type="PS" draft="provisional">Territorio Palestino</territory>
+ <territory type="RO" draft="provisional">Rumania</territory>
+ <territory type="SA" draft="provisional">Arabia Saudita</territory>
+ <territory type="TT">Trinidad y Tobago</territory>
+ <territory type="TZ" draft="provisional">Tanzanía</territory>
+ </territories>
+ <variants>
+ <variant type="1996">Ortografía alemana de 1996</variant>
+ </variants>
+ <keys>
+ <key type="currency" draft="provisional">divisa</key>
+ </keys>
+ <types>
+ <type type="phonebook" key="collation">orden de directorio telefónico</type>
+ </types>
+ </localeDisplayNames>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd-MM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;¤-#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="CLP">
+ <displayName>Peso Chileno</displayName>
+ <symbol>$</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>Dólar Americano</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_CO.xml b/libs/Zend/Locale/Data/es_CO.xml
new file mode 100755
index 0000000000..b3472bad6c
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_CO.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.42 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="es"/>
+ <territory type="CO"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="COP">
+ <displayName>Peso de Colombia</displayName>
+ <symbol>$</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>Dólar Americano</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_CR.xml b/libs/Zend/Locale/Data/es_CR.xml
new file mode 100755
index 0000000000..c33d6e122b
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_CR.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.42 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="es"/>
+ <territory type="CR"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_DO.xml b/libs/Zend/Locale/Data/es_DO.xml
new file mode 100755
index 0000000000..15b2e7b89f
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_DO.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="es"/>
+ <territory type="DO"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>.</decimal>
+ <group>,</group>
+ </symbols>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_EC.xml b/libs/Zend/Locale/Data/es_EC.xml
new file mode 100755
index 0000000000..6153f4d019
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_EC.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.43 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="es"/>
+ <territory type="EC"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;¤-#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="USD">
+ <symbol>$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_ES.xml b/libs/Zend/Locale/Data/es_ES.xml
new file mode 100755
index 0000000000..9cfe71b4a3
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_ES.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.40 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="es"/>
+ <territory type="ES"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="chg" draft="provisional">chagatai</language>
+ </languages>
+ <scripts>
+ <script type="Egyp" draft="provisional">gerogríficos egipcios</script>
+ <script type="Ethi">etíope</script>
+ <script type="Hung" draft="provisional">Húngaro antiguo</script>
+ <script type="Ital" draft="provisional">antigua itálica</script>
+ <script type="Latg" draft="provisional">Latín (variante gaélico)</script>
+ <script type="Lina" draft="provisional">linear A</script>
+ <script type="Maya" draft="provisional">gerogríficos mayas</script>
+ <script type="Mong" draft="provisional">mongol</script>
+ <script type="Phnx" draft="provisional">Fenicio</script>
+ </scripts>
+ </localeDisplayNames>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ESP">
+ <pattern>#,##0 ¤;-#,##0 ¤</pattern>
+ <decimal>,</decimal>
+ <group>.</group>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_GT.xml b/libs/Zend/Locale/Data/es_GT.xml
new file mode 100755
index 0000000000..cf6a3abb32
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_GT.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="es"/>
+ <territory type="GT"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>.</decimal>
+ <group>,</group>
+ </symbols>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_HN.xml b/libs/Zend/Locale/Data/es_HN.xml
new file mode 100755
index 0000000000..8208e01cfa
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_HN.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="es"/>
+ <territory type="HN"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE dd' de 'MMMM' de 'yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd' de 'MMMM' de 'yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>.</decimal>
+ <group>,</group>
+ </symbols>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_MX.xml b/libs/Zend/Locale/Data/es_MX.xml
new file mode 100755
index 0000000000..90b1595c08
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_MX.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="es"/>
+ <territory type="MX"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>.</decimal>
+ <group>,</group>
+ </symbols>
+ <currencies>
+ <currency type="MXN">
+ <displayName>MXN</displayName>
+ <symbol>$</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>Dólar Americano</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_NI.xml b/libs/Zend/Locale/Data/es_NI.xml
new file mode 100755
index 0000000000..b5d115f78c
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_NI.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="es"/>
+ <territory type="NI"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>.</decimal>
+ <group>,</group>
+ </symbols>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_PA.xml b/libs/Zend/Locale/Data/es_PA.xml
new file mode 100755
index 0000000000..2aa65e4e15
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_PA.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.42 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="es"/>
+ <territory type="PA"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>MM/dd/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>MM/dd/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMdd" draft="provisional">MM/dd</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>.</decimal>
+ <group>,</group>
+ </symbols>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_PE.xml b/libs/Zend/Locale/Data/es_PE.xml
new file mode 100755
index 0000000000..26fee613a3
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_PE.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.43 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="es"/>
+ <territory type="PE"/>
+ </identity>
+</ldml>
diff --git a/libs/Zend/Locale/Data/es_PR.xml b/libs/Zend/Locale/Data/es_PR.xml
new file mode 100755
index 0000000000..f8d302b58f
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_PR.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.43 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="es"/>
+ <territory type="PR"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>MM/dd/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>MM/dd/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMdd" draft="provisional">MM/dd</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>.</decimal>
+ <group>,</group>
+ </symbols>
+ <currencies>
+ <currency type="USD">
+ <displayName>Dólar Americano</displayName>
+ <symbol>$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_PY.xml b/libs/Zend/Locale/Data/es_PY.xml
new file mode 100755
index 0000000000..208802ba4f
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_PY.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.42 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="es"/>
+ <territory type="PY"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##0.00;¤ -#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_SV.xml b/libs/Zend/Locale/Data/es_SV.xml
new file mode 100755
index 0000000000..3e945a8643
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_SV.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="es"/>
+ <territory type="SV"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>.</decimal>
+ <group>,</group>
+ </symbols>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_US.xml b/libs/Zend/Locale/Data/es_US.xml
new file mode 100755
index 0000000000..6d427febc8
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_US.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.49 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="es"/>
+ <territory type="US"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>MMM d, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>M/d/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMd" draft="provisional">MMM d</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">M/d</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>.</decimal>
+ <group>,</group>
+ </symbols>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/es_UY.xml b/libs/Zend/Locale/Data/es_UY.xml
new file mode 100755
index 0000000000..c85b46792c
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_UY.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.42 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="es"/>
+ <territory type="UY"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="UYU">
+ <symbol>$U</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/es_VE.xml b/libs/Zend/Locale/Data/es_VE.xml
new file mode 100755
index 0000000000..fbc525f2c5
--- /dev/null
+++ b/libs/Zend/Locale/Data/es_VE.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="es"/>
+ <territory type="VE"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;¤ -#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/et.xml b/libs/Zend/Locale/Data/et.xml
new file mode 100755
index 0000000000..b630f2a42e
--- /dev/null
+++ b/libs/Zend/Locale/Data/et.xml
@@ -0,0 +1,456 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.56 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="et"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar">Araabia</language>
+ <language type="bg">Bulgaaria</language>
+ <language type="cs">Tiehhi</language>
+ <language type="cs" alt="proposed" draft="unconfirmed">TÅ¡ehhi</language>
+ <language type="da">Taani</language>
+ <language type="de">Saksa</language>
+ <language type="el">Kreeka</language>
+ <language type="en">Inglise</language>
+ <language type="es">Hispaania</language>
+ <language type="et">Eesti</language>
+ <language type="fi">Soome</language>
+ <language type="fr">Prantsuse</language>
+ <language type="he">Heebrea</language>
+ <language type="hr">Horvaadi</language>
+ <language type="hu">Ungari</language>
+ <language type="it">Itaalia</language>
+ <language type="ja">Jaapani</language>
+ <language type="ko">Korea</language>
+ <language type="lt">Leedu</language>
+ <language type="lv">Läti</language>
+ <language type="nl">Hollandi</language>
+ <language type="no">Norra</language>
+ <language type="pl">Poola</language>
+ <language type="pt">Portugali</language>
+ <language type="ro">Rumeenia</language>
+ <language type="ru">Vene</language>
+ <language type="sk">Slovaki</language>
+ <language type="sl">Sloveeni</language>
+ <language type="sv">Rootsi</language>
+ <language type="tr">Türgi</language>
+ <language type="zh">Hiina</language>
+ </languages>
+ <territories>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Araabia Ãœhendemiraadid</territory>
+ <territory type="AF">Afganistan</territory>
+ <territory type="AG">Antigua ja Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albaania</territory>
+ <territory type="AM">Armeenia</territory>
+ <territory type="AN">Hollandi Antillid</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktika</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">Ameerika Samoa</territory>
+ <territory type="AT">Austria</territory>
+ <territory type="AU">Austraalia</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AZ">AserbaidĪaan</territory>
+ <territory type="AZ" alt="proposed" draft="unconfirmed">Aserbaidžaan</territory>
+ <territory type="BA">Bosnia ja Hertsegoviina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BE">Belgia</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgaaria</territory>
+ <territory type="BH">Bahrein</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei</territory>
+ <territory type="BO">Boliivia</territory>
+ <territory type="BR">Brasiilia</territory>
+ <territory type="BS">Bahama saared</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BV">Bouvet’ saar</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Valgevene</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Kookossaared</territory>
+ <territory type="CD">Kongo DV</territory>
+ <territory type="CF">Kesk-Aafrika Vabariik</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Ĩveits</territory>
+ <territory type="CH" alt="proposed" draft="unconfirmed">Å veits</territory>
+ <territory type="CI">Cote d’Ivoire</territory>
+ <territory type="CK">Cooki saared</territory>
+ <territory type="CL">Tiiili</territory>
+ <territory type="CL" alt="proposed" draft="unconfirmed">TÅ¡iili</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Hiina</territory>
+ <territory type="CO">Colombia</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS">Serbia ja Montenegro</territory>
+ <territory type="CU">Kuuba</territory>
+ <territory type="CV">Cabo Verde</territory>
+ <territory type="CX">Jõulusaar</territory>
+ <territory type="CY">Küpros</territory>
+ <territory type="CZ">Tiehhi Vabariik</territory>
+ <territory type="CZ" alt="proposed" draft="unconfirmed">TÅ¡ehhi Vabariik</territory>
+ <territory type="DE">Saksamaa</territory>
+ <territory type="DJ">Djibouti</territory>
+ <territory type="DK">Taani</territory>
+ <territory type="DM">Dominica</territory>
+ <territory type="DO">Dominikaani Vabariik</territory>
+ <territory type="DZ">AlĪeeria</territory>
+ <territory type="DZ" alt="proposed" draft="unconfirmed">Alžeeria</territory>
+ <territory type="EC">Ecuador</territory>
+ <territory type="EE">Eesti</territory>
+ <territory type="EG">Egiptus</territory>
+ <territory type="EH">Lääne-Sahara</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Hispaania</territory>
+ <territory type="ET">Etioopia</territory>
+ <territory type="FI">Soome</territory>
+ <territory type="FJ">FidĪi</territory>
+ <territory type="FJ" alt="proposed" draft="unconfirmed">Fidži</territory>
+ <territory type="FK">Falklandi saared</territory>
+ <territory type="FM">Mikroneesia Liiduriigid</territory>
+ <territory type="FO">Fääri saared</territory>
+ <territory type="FR">Prantsusmaa</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Ãœhendkuningriik</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Gruusia</territory>
+ <territory type="GF">Prantsuse Guajaana</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Gröönimaa</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Ekvatoriaal-Guinea</territory>
+ <territory type="GR">Kreeka</territory>
+ <territory type="GS">Lõuna-Georgia ja Lõuna-Sandwichi saared</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinea-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Hongkongi erihalduspiirkond</territory>
+ <territory type="HM">Heard ja McDonald</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Horvaatia</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Ungari</territory>
+ <territory type="ID">Indoneesia</territory>
+ <territory type="IE">Iirimaa</territory>
+ <territory type="IL">Iisrael</territory>
+ <territory type="IN">India</territory>
+ <territory type="IO">Briti India ookeani ala</territory>
+ <territory type="IQ">Iraak</territory>
+ <territory type="IR">Iraan</territory>
+ <territory type="IS">Island</territory>
+ <territory type="IT">Itaalia</territory>
+ <territory type="JM">Jamaica</territory>
+ <territory type="JO">Jordaania</territory>
+ <territory type="JP">Jaapan</territory>
+ <territory type="KE">Kenya</territory>
+ <territory type="KG">Kõrgõzstan</territory>
+ <territory type="KH">KambodĪa</territory>
+ <territory type="KH" alt="proposed" draft="unconfirmed">Kambodža</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komoorid</territory>
+ <territory type="KN">Saint Kitts ja Nevis</territory>
+ <territory type="KP">Põhja-Korea</territory>
+ <territory type="KR">Lõuna-Korea</territory>
+ <territory type="KW">Kuveit</territory>
+ <territory type="KY">Kaimani saared</territory>
+ <territory type="KZ">Kasahstan</territory>
+ <territory type="LA">Laose DRV</territory>
+ <territory type="LB">Liibanon</territory>
+ <territory type="LC">Saint Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Libeeria</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Leedu</territory>
+ <territory type="LU">Luksemburg</territory>
+ <territory type="LV">Läti</territory>
+ <territory type="LY">Liibüa</territory>
+ <territory type="MA">Maroko</territory>
+ <territory type="MC">Monaco</territory>
+ <territory type="MD">Moldova</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshalli Saared</territory>
+ <territory type="MK">Makedoonia Vabariik</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongoolia</territory>
+ <territory type="MO">Aomeni Hiina erihalduspiirkond</territory>
+ <territory type="MP">Põhja-Mariaanid</territory>
+ <territory type="MQ">Martinique</territory>
+ <territory type="MR">Mauritaania</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Maldiivid</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Mehhiko</territory>
+ <territory type="MY">Malaisia</territory>
+ <territory type="MZ">Mosambiik</territory>
+ <territory type="NA">Namiibia</territory>
+ <territory type="NC">Uus-Kaledoonia</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Norfolk</territory>
+ <territory type="NG">Nigeeria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Holland</territory>
+ <territory type="NO">Norra</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Uus-Meremaa</territory>
+ <territory type="OM">Omaan</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peruu</territory>
+ <territory type="PF">Prantsuse Polüneesia</territory>
+ <territory type="PG">Paapua Uus-Guinea</territory>
+ <territory type="PH">Filipiinid</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Poola</territory>
+ <territory type="PM">Saint-Pierre ja Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Puerto Rico</territory>
+ <territory type="PS">Palestiina Omavalitsus</territory>
+ <territory type="PT">Portugal</territory>
+ <territory type="PW">Belau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Katar</territory>
+ <territory type="RE">Réunion</territory>
+ <territory type="RO">Rumeenia</territory>
+ <territory type="RU">Venemaa</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Saudi Araabia</territory>
+ <territory type="SB">Saalomoni Saared</territory>
+ <territory type="SC">Seiiellid</territory>
+ <territory type="SC" alt="proposed" draft="unconfirmed">Seišellid</territory>
+ <territory type="SD">Sudaan</territory>
+ <territory type="SE">Rootsi</territory>
+ <territory type="SG">Singapur</territory>
+ <territory type="SH">Saint Helena</territory>
+ <territory type="SI">Sloveenia</territory>
+ <territory type="SJ">Svalbard ja Jan Mayen</territory>
+ <territory type="SK">Slovakkia</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somaalia</territory>
+ <territory type="SR">Suriname</territory>
+ <territory type="ST">Sao Tomé ja Principe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Süüria</territory>
+ <territory type="SZ">Svaasimaa</territory>
+ <territory type="TC">Turks ja Caicos</territory>
+ <territory type="TD">Tiaad</territory>
+ <territory type="TD" alt="proposed" draft="unconfirmed">TÅ¡aad</territory>
+ <territory type="TF">Prantsuse Lõunaalad</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Tai</territory>
+ <territory type="TJ">TadĪikistan</territory>
+ <territory type="TJ" alt="proposed" draft="unconfirmed">Tadžikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Ida-Timor</territory>
+ <territory type="TM">Türkmenistan</territory>
+ <territory type="TN">Tuneesia</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Türgi</territory>
+ <territory type="TT">Trinidad ja Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TZ">Tansaania</territory>
+ <territory type="UA">Ukraina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">Ãœhendriikide hajasaared</territory>
+ <territory type="US">Ameerika Ãœhendriigid</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Usbekistan</territory>
+ <territory type="VA">Püha Tool (Vatikan)</territory>
+ <territory type="VC">Saint Vincent ja Grenadiinid</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Briti Neitsisaared</territory>
+ <territory type="VI">USA Neitsisaared</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis ja Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Jeemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Lõuna-Aafrika Vabariik</territory>
+ <territory type="ZM">Sambia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-s š z ž t-w õ ä ö ü x y]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">jaan</month>
+ <month type="2">veebr</month>
+ <month type="3">märts</month>
+ <month type="4">apr</month>
+ <month type="5">mai</month>
+ <month type="6">juuni</month>
+ <month type="7">juuli</month>
+ <month type="8">aug</month>
+ <month type="9">sept</month>
+ <month type="10">okt</month>
+ <month type="11">nov</month>
+ <month type="12">dets</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">jaanuar</month>
+ <month type="2">veebruar</month>
+ <month type="3">märts</month>
+ <month type="4">aprill</month>
+ <month type="5">mai</month>
+ <month type="6">juuni</month>
+ <month type="7">juuli</month>
+ <month type="8">august</month>
+ <month type="9">september</month>
+ <month type="10">oktoober</month>
+ <month type="11">november</month>
+ <month type="12">detsember</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">P</day>
+ <day type="mon">E</day>
+ <day type="tue">T</day>
+ <day type="wed">K</day>
+ <day type="thu">N</day>
+ <day type="fri">R</day>
+ <day type="sat">L</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">pühapäev</day>
+ <day type="mon">esmaspäev</day>
+ <day type="tue">teisipäev</day>
+ <day type="wed">kolmapäev</day>
+ <day type="thu">neljapäev</day>
+ <day type="fri">reede</day>
+ <day type="sat">laupäev</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">K1</quarter>
+ <quarter type="2" draft="unconfirmed">K2</quarter>
+ <quarter type="3" draft="unconfirmed">K3</quarter>
+ <quarter type="4" draft="unconfirmed">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">1. kvartal</quarter>
+ <quarter type="2" draft="unconfirmed">2. kvartal</quarter>
+ <quarter type="3" draft="unconfirmed">3. kvartal</quarter>
+ <quarter type="4" draft="unconfirmed">4. kvartal</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraAbbr>
+ <era type="0">e.m.a.</era>
+ <era type="1">m.a.j.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d, MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd.MM.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd.MM.yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd.MM</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM.yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <currencies>
+ <currency type="EEK">
+ <displayName references="R1" draft="unconfirmed">kroon</displayName>
+ <symbol>kr</symbol>
+ <decimal>.</decimal>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">jah:j</yesstr>
+ <nostr draft="unconfirmed">ei:e</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="R1">Bank Of Estonia http://www.eestipank.info/pub/en/majandus/rahasysteem/yldalused</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/et_EE.xml b/libs/Zend/Locale/Data/et_EE.xml
new file mode 100755
index 0000000000..8c2494c5b4
--- /dev/null
+++ b/libs/Zend/Locale/Data/et_EE.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="et"/>
+ <territory type="EE"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">„</quotationStart>
+ <quotationEnd draft="unconfirmed">“</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">„</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">“</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">enne meie aega</era>
+ <era type="1" draft="unconfirmed">meie aja järgi</era>
+ </eraNames>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/eu.xml b/libs/Zend/Locale/Data/eu.xml
new file mode 100755
index 0000000000..19d1c8d1fd
--- /dev/null
+++ b/libs/Zend/Locale/Data/eu.xml
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.51 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="eu"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="de">alemanera</language>
+ <language type="en">ingelera</language>
+ <language type="es">espainiera</language>
+ <language type="eu">euskara</language>
+ <language type="fr">frantsesera</language>
+ <language type="it">italiera</language>
+ <language type="ja">japoniera</language>
+ <language type="pt">portugalera</language>
+ <language type="ru">errusiera</language>
+ <language type="zh">txinera</language>
+ </languages>
+ <territories>
+ <territory type="AE">Arabiar Emirrerri Batuak</territory>
+ <territory type="AF">Afganistan</territory>
+ <territory type="AG">Antigua eta Barbuda</territory>
+ <territory type="AQ">Antartika</territory>
+ <territory type="BA">Bosnia-Herzegovina</territory>
+ <territory type="BE">Belgika</territory>
+ <territory type="BO">Bolibia</territory>
+ <territory type="BR">Brasil</territory>
+ <territory type="BS">Bahamak</territory>
+ <territory type="BY">Bielorrusia</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CF">Afrika Erdiko Errepublika</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Suitza</territory>
+ <territory type="CI">Boli Kosta</territory>
+ <territory type="CL">Txile</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Txina</territory>
+ <territory type="CO">Kolonbia</territory>
+ <territory type="CS">Serbia eta Montenegro</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Cabo Verde</territory>
+ <territory type="CY">Zipre</territory>
+ <territory type="CZ">Txekiar errepublika</territory>
+ <territory type="DE">Alemania</territory>
+ <territory type="DJ">Djibuti</territory>
+ <territory type="DK">Danimarka</territory>
+ <territory type="DM">Dominika</territory>
+ <territory type="DO">Dominikar Errepublika</territory>
+ <territory type="DZ">Aljeria</territory>
+ <territory type="EC">Ekuador</territory>
+ <territory type="EG">Egipto</territory>
+ <territory type="EH">Mendebaldeko Sahara</territory>
+ <territory type="ES">Espainia</territory>
+ <territory type="ET">Etiopia</territory>
+ <territory type="FI">Finlandia</territory>
+ <territory type="FM">Mikronesia</territory>
+ <territory type="FR">Frantzia</territory>
+ <territory type="GN">Ginea</territory>
+ <territory type="GQ">Ekuatore Ginea</territory>
+ <territory type="GR">Grezia</territory>
+ <territory type="GW">Ginea-Bissau</territory>
+ <territory type="HR">Kroazia</territory>
+ <territory type="HU">Hungaria</territory>
+ <territory type="IE">Irlanda</territory>
+ <territory type="IN">India</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IS">Islandia</territory>
+ <territory type="IT">Italia</territory>
+ <territory type="JM">Jamaika</territory>
+ <territory type="JO">Jordania</territory>
+ <territory type="JP">Japonia</territory>
+ <territory type="KE">Kenia</territory>
+ <territory type="KG">Kirgizistan</territory>
+ <territory type="KH">Kanbodia</territory>
+ <territory type="KM">Komoreak</territory>
+ <territory type="KN">Saint Kitts eta Nevis</territory>
+ <territory type="KP">Ipar Korea</territory>
+ <territory type="KR">Hego Korea</territory>
+ <territory type="LB">Libano</territory>
+ <territory type="LC">Santa Luzia</territory>
+ <territory type="LT">Lituania</territory>
+ <territory type="LU">Luxenburgo</territory>
+ <territory type="LV">Letonia</territory>
+ <territory type="LY">Libia</territory>
+ <territory type="MA">Maroko</territory>
+ <territory type="MC">Monako</territory>
+ <territory type="MD">Moldavia</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshall uharteak</territory>
+ <territory type="MK">Mazedonia</territory>
+ <territory type="MU">Maurizio</territory>
+ <territory type="MV">Maldivak</territory>
+ <territory type="MX">Mexiko</territory>
+ <territory type="MY">Malasia</territory>
+ <territory type="MZ">Mozambike</territory>
+ <territory type="NI">Nikaragua</territory>
+ <territory type="NL">Herbehereak</territory>
+ <territory type="NO">Norvegia</territory>
+ <territory type="NZ">Zeelanda Berria</territory>
+ <territory type="PG">Papua Ginea Berria</territory>
+ <territory type="PH">Filipinak</territory>
+ <territory type="PL">Polonia</territory>
+ <territory type="PY">Paraguai</territory>
+ <territory type="QA">Katar</territory>
+ <territory type="RO">Errumania</territory>
+ <territory type="RU">Errusia</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SB">Salomon uharteak</territory>
+ <territory type="SC">Seychelleak</territory>
+ <territory type="SE">Suedia</territory>
+ <territory type="SG">Singapur</territory>
+ <territory type="SI">Eslovenia</territory>
+ <territory type="SK">Eslovakia</territory>
+ <territory type="SL">Sierra Leona</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">Sao Tomé eta Principe</territory>
+ <territory type="SY">Siria</territory>
+ <territory type="SZ">Swazilandia</territory>
+ <territory type="TD">Txad</territory>
+ <territory type="TH">Tailandia</territory>
+ <territory type="TJ">Tadjikistan</territory>
+ <territory type="TR">Turkia</territory>
+ <territory type="TT">Trinidad eta Tobago</territory>
+ <territory type="UA">Ukraina</territory>
+ <territory type="US">Ameriketako Estatu Batuak</territory>
+ <territory type="UY">Uruguai</territory>
+ <territory type="VA">Vatikano</territory>
+ <territory type="VC">Saint Vincent eta Grenadinak</territory>
+ <territory type="ZA">Hegoafrika</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-c ç d-n ñ o-z]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">urt</month>
+ <month type="2">ots</month>
+ <month type="3">mar</month>
+ <month type="4">api</month>
+ <month type="5">mai</month>
+ <month type="6">eka</month>
+ <month type="7">uzt</month>
+ <month type="8">abu</month>
+ <month type="9">ira</month>
+ <month type="10">urr</month>
+ <month type="11">aza</month>
+ <month type="12">abe</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">urtarrila</month>
+ <month type="2">otsaila</month>
+ <month type="3">martxoa</month>
+ <month type="4">apirila</month>
+ <month type="5">maiatza</month>
+ <month type="6">ekaina</month>
+ <month type="7">uztaila</month>
+ <month type="8">abuztua</month>
+ <month type="9">iraila</month>
+ <month type="10">urria</month>
+ <month type="11">azaroa</month>
+ <month type="12">abendua</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">ig</day>
+ <day type="mon">al</day>
+ <day type="tue">as</day>
+ <day type="wed">az</day>
+ <day type="thu">og</day>
+ <day type="fri">or</day>
+ <day type="sat">lr</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">igandea</day>
+ <day type="mon">astelehena</day>
+ <day type="tue">asteartea</day>
+ <day type="wed">asteazkena</day>
+ <day type="thu">osteguna</day>
+ <day type="fri">ostirala</day>
+ <day type="sat">larunbata</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">Hh1</quarter>
+ <quarter type="2" draft="unconfirmed">Hh2</quarter>
+ <quarter type="3" draft="unconfirmed">Hh3</quarter>
+ <quarter type="4" draft="unconfirmed">Hh4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">1. hiruhilekoa</quarter>
+ <quarter type="2" draft="unconfirmed">2. hiruhilekoa</quarter>
+ <quarter type="3" draft="unconfirmed">3. hiruhilekoa</quarter>
+ <quarter type="4" draft="unconfirmed">4. hiruhilekoa</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="ESP">
+ <pattern>¤ #,##0;-¤ #,##0</pattern>
+ <symbol>₧</symbol>
+ <decimal>,</decimal>
+ <group>.</group>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/eu_ES.xml b/libs/Zend/Locale/Data/eu_ES.xml
new file mode 100755
index 0000000000..6056ebd791
--- /dev/null
+++ b/libs/Zend/Locale/Data/eu_ES.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="eu"/>
+ <territory type="ES"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, yyyy'eko' MMMM'ren' dd'a'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>EEE, yyyy'eko' MMM'ren' dd'a'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yy'-'MMM'-'dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yy'-'MM'-'dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/fa.xml b/libs/Zend/Locale/Data/fa.xml
new file mode 100755
index 0000000000..e36a2d0f92
--- /dev/null
+++ b/libs/Zend/Locale/Data/fa.xml
@@ -0,0 +1,1649 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.63 $"/>
+ <generation date="$Date: 2006/07/07 16:29:42 $"/>
+ <language type="fa"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa" references="RP1">Ø¢Ùاری</language>
+ <language type="ab" references="RP1">آبخازی</language>
+ <language type="ace" references="RP1">آچئی</language>
+ <language type="ach" references="RP1">آچولیایی</language>
+ <language type="ada" references="RP1">آدانگمه‌ای</language>
+ <language type="ady" references="RP1">آدیجیایی</language>
+ <language type="ae" references="RP1">اوستایی</language>
+ <language type="af" references="RP1">Ø¢Ùریکانس</language>
+ <language type="afa" references="RP1">اÙریقا Ùˆ آسیایی (دیگر)</language>
+ <language type="akk" references="RP1">آکدی</language>
+ <language type="ale" references="RP1">آلئوتی</language>
+ <language type="alg" references="RP1">زبانهای آلگونکینی</language>
+ <language type="am" references="RP1">امهری</language>
+ <language type="ang" references="RP1">انگلیسی باستان</language>
+ <language type="apa" references="RP1">زبانهای آپاچیایی</language>
+ <language type="ar" references="RP1">عربی</language>
+ <language type="arc" references="RP1">آرامی</language>
+ <language type="arn" references="RP1">آروکانیایی</language>
+ <language type="arp" references="RP1">آراپاهویی</language>
+ <language type="art" references="RP1">ساختگی (دیگر)</language>
+ <language type="arw" references="RP1">آراواکی</language>
+ <language type="as" references="RP1">آسامی</language>
+ <language type="ath" references="RP1">زبانهای آتاپاسکایی</language>
+ <language type="aus" references="RP1">زبانهای استرالیایی</language>
+ <language type="av" references="RP1">آواری</language>
+ <language type="ay" references="RP1">آیمارایی</language>
+ <language type="az">ترکی آذربایجانی</language>
+ <language type="ba" references="RP1">باشغیری</language>
+ <language type="bad" references="RP1">باندایی</language>
+ <language type="bal" references="RP1">بلوچی</language>
+ <language type="ban" references="RP1">بالیایی</language>
+ <language type="bas" references="RP1">باسایی</language>
+ <language type="bat" references="RP1">بالتیکی (دیگر)</language>
+ <language type="be" references="RP1">بلوروسی</language>
+ <language type="bej" references="RP1">بجایی</language>
+ <language type="bem" references="RP1">بمبایی</language>
+ <language type="ber" references="RP1">بربری (دیگر)</language>
+ <language type="bg" references="RP1">بلغاری</language>
+ <language type="bh" references="RP1">بیهاری</language>
+ <language type="bho" references="RP1">بوجپوری</language>
+ <language type="bi" references="RP1">بیسلاما</language>
+ <language type="bik" references="RP1">بیکولی</language>
+ <language type="bm" references="RP1">بامبارایی</language>
+ <language type="bn" references="RP1">بنگالی</language>
+ <language type="bnt" references="RP1">بانتویی (دیگر)</language>
+ <language type="bo" references="RP1">تبتی</language>
+ <language type="br" references="RP1">برتانیایی</language>
+ <language type="bs">بوسنیایی</language>
+ <language type="btk" references="RP1">باتاکی</language>
+ <language type="bua" references="RP1">بوریاتی</language>
+ <language type="bug" references="RP1">بوگیایی</language>
+ <language type="ca" references="RP1">کاتالونیایی</language>
+ <language type="cad" references="RP1">کادویی</language>
+ <language type="cai">سرخپوستی امریکای مرکزی (دیگر)</language>
+ <language type="car" references="RP1">کاریبی</language>
+ <language type="cau" references="RP1">Ù‚Ùقازی (دیگر)</language>
+ <language type="ce" references="RP1">چچنی</language>
+ <language type="ceb" references="RP1">سبویی</language>
+ <language type="cel" references="RP1">سلتی (دیگر)</language>
+ <language type="ch" references="RP1">چامورویی</language>
+ <language type="chm" references="RP1">ماریایی</language>
+ <language type="cho" references="RP1">چوکتویی</language>
+ <language type="chp" references="RP1">چیپه‌ویه‌ای</language>
+ <language type="chr" references="RP1">چروکیایی</language>
+ <language type="chy" references="RP1">شایانی</language>
+ <language type="cop" references="RP1">قبطی</language>
+ <language type="cpe">کریول‌ها و پیجین‌های مبتنی بر انگلیسی (دیگر)</language>
+ <language type="cpf">کریول‌ها Ùˆ پیجین‌های مبتنی بر Ùرانسوی (دیگر)</language>
+ <language type="cpp">کریول‌ها و پیجین‌های مبتنی بر پرتغالی (دیگر)</language>
+ <language type="cr" references="RP1">کریایی</language>
+ <language type="crh">ترکی کریمه؛ تاتاری کریمه</language>
+ <language type="crp" references="RP1">کریول‌ها و پیجین‌ها (دیگر)</language>
+ <language type="cs" references="RP1">چکی</language>
+ <language type="csb" references="RP1">کاشوبی</language>
+ <language type="cu">اسلاوی کلیسایی</language>
+ <language type="cus" references="RP1">کوشی (دیگر)</language>
+ <language type="cv" references="RP1">چوواشی</language>
+ <language type="cy" references="RP1">ویلزی</language>
+ <language type="da" references="RP1">دانمارکی</language>
+ <language type="dak" references="RP1">داکوتایی</language>
+ <language type="de" references="RP1">آلمانی</language>
+ <language type="del" references="RP1">دلاواری</language>
+ <language type="din" references="RP1">دینکایی</language>
+ <language type="dra" references="RP1">دراویدی (دیگر)</language>
+ <language type="dsb" references="RP1">صÙربی سÙÙ„ÛŒ</language>
+ <language type="dua" references="RP1">دوآلایی</language>
+ <language type="dum">هلندی میانه</language>
+ <language type="dyu" references="RP1">دایولایی</language>
+ <language type="dz" references="RP1">جونخایی</language>
+ <language type="ee" references="RP1">اوه‌ای</language>
+ <language type="efi" references="RP1">اÙیکی</language>
+ <language type="egy">مصری (کهن)</language>
+ <language type="el" references="RP1">یونانی</language>
+ <language type="elx">عیلامی</language>
+ <language type="en" references="RP1">انگلیسی</language>
+ <language type="enm" references="RP1">انگلیسی میانه</language>
+ <language type="eo" references="RP1">اسپرانتو</language>
+ <language type="es" references="RP1">اسپانیایی</language>
+ <language type="et" references="RP1">استونیایی</language>
+ <language type="eu" references="RP1">باسکی</language>
+ <language type="fa" references="RP1">Ùارسی</language>
+ <language type="fan" references="RP1">Ùانکی</language>
+ <language type="fat" references="RP1">Ùانتیایی</language>
+ <language type="ff" references="RP1">Ùولایی</language>
+ <language type="fi" references="RP1">Ùنلاندی</language>
+ <language type="fiu" references="RP1">Ùین Ùˆ اوگرایی (دیگر)</language>
+ <language type="fj" references="RP1">Ùیجیایی</language>
+ <language type="fo" references="RP1">Ùارویی</language>
+ <language type="fon" references="RP1">Ùونی</language>
+ <language type="fr" references="RP1">Ùرانسوی</language>
+ <language type="frm">Ùرانسوی میانه</language>
+ <language type="fro" references="RP1">Ùرانسوی باستان</language>
+ <language type="fur" references="RP1">Ùریولیایی</language>
+ <language type="fy" references="RP1">Ùریزی</language>
+ <language type="ga" references="RP1">ایرلندی</language>
+ <language type="gaa" references="RP1">گایی</language>
+ <language type="gba" references="RP1">گبایایی</language>
+ <language type="gd" references="RP1">گیلی اسکاتلندی</language>
+ <language type="gem" references="RP1">ژرمنی (دیگر)</language>
+ <language type="gez" references="RP1">گی‌ئزی</language>
+ <language type="gil" references="RP1">گیلبرتی</language>
+ <language type="gl" references="RP1">گالیسیایی</language>
+ <language type="gmh">آلمانی علیای میانه</language>
+ <language type="gn" references="RP1">گوارانی</language>
+ <language type="goh">آلمانی علیای باستان</language>
+ <language type="gon" references="RP1">گوندی</language>
+ <language type="got">گوتیک</language>
+ <language type="grb" references="RP1">گریبویی</language>
+ <language type="grc">یونانی کهن</language>
+ <language type="gu" references="RP1">گجراتی</language>
+ <language type="gv" references="RP1">مانی</language>
+ <language type="ha" references="RP1">هوسیایی</language>
+ <language type="hai" references="RP1">هایدایی</language>
+ <language type="haw" references="RP1">هاوائیایی</language>
+ <language type="he" references="RP1">عبری</language>
+ <language type="hi" references="RP1">هندی</language>
+ <language type="hil" references="RP1">هیلی‌گاینونی</language>
+ <language type="hit">هیتی</language>
+ <language type="hr" references="RP1">کرواتی</language>
+ <language type="hsb" references="RP1">صÙربی علیا</language>
+ <language type="ht" references="RP1">هائیتیایی</language>
+ <language type="hu" references="RP1">مجاری</language>
+ <language type="hy" references="RP1">ارمنی</language>
+ <language type="hz" references="RP1">هریرویی</language>
+ <language type="ia" references="RP1">میان‌زبان</language>
+ <language type="id" references="RP1">اندونزیایی</language>
+ <language type="ig" references="RP1">ایگبویی</language>
+ <language type="ii">یی سیچوان</language>
+ <language type="ijo" references="RP1">ایجویی</language>
+ <language type="ik" references="RP1">اینوپیک</language>
+ <language type="ilo" references="RP1">ایلوکویی</language>
+ <language type="inc" references="RP1">هندیک (دیگر)</language>
+ <language type="ine" references="RP1">هند و اروپایی (دیگر)</language>
+ <language type="inh" references="RP1">اینگوشی</language>
+ <language type="ira" references="RP1">ایرانی (دیگر)</language>
+ <language type="iro" references="RP1">زبانهای ایروکوایی</language>
+ <language type="is" references="RP1">ایسلندی</language>
+ <language type="it" references="RP1">ایتالیایی</language>
+ <language type="iu">اینوکتیتوت</language>
+ <language type="ja" references="RP1">ژاپنی</language>
+ <language type="jpr">Ùارسی یهودی</language>
+ <language type="jrb">عربی یهودی</language>
+ <language type="jv" references="RP1">جاوه‌ای</language>
+ <language type="ka" references="RP1">گرجی</language>
+ <language type="kaa" references="RP1">قره‌قالپاقی</language>
+ <language type="kab" references="RP1">قبایلی</language>
+ <language type="kac" references="RP1">کاچینی</language>
+ <language type="kam" references="RP1">کامبایی</language>
+ <language type="kar" references="RP1">کارنی</language>
+ <language type="kbd" references="RP1">کاباردینی</language>
+ <language type="kg" references="RP1">کنگویی</language>
+ <language type="kha" references="RP1">خازیایی</language>
+ <language type="khi" references="RP1">خواسی (دیگر)</language>
+ <language type="kho">ختنی</language>
+ <language type="ki" references="RP1">کیکویویی</language>
+ <language type="kk" references="RP1">قزاقی</language>
+ <language type="kl" references="RP1">گرینلندی</language>
+ <language type="km" references="RP1">خمری</language>
+ <language type="kmb" references="RP1">کیمبوندویی</language>
+ <language type="kn" references="RP1">کاناده‌ای</language>
+ <language type="ko" references="RP1">کره‌ای</language>
+ <language type="kok" references="RP1">کنکانی</language>
+ <language type="kpe" references="RP1">کپله‌ای</language>
+ <language type="kr" references="RP1">کانوریایی</language>
+ <language type="krc" references="RP1">قره‌چاییâ€Ø¨Ø§Ù„کاری</language>
+ <language type="kro" references="RP1">کرویی</language>
+ <language type="kru" references="RP1">کوروخی</language>
+ <language type="ks" references="RP1">کشمیری</language>
+ <language type="ku" references="RP1">کردی</language>
+ <language type="kum" references="RP1">کومیکی</language>
+ <language type="kv" references="RP1">کومیایی</language>
+ <language type="kw" references="RP1">کرنوالی</language>
+ <language type="ky" references="RP1">قرقیزی</language>
+ <language type="la" references="RP1">لاتینی</language>
+ <language type="lad" references="RP1">لادینو</language>
+ <language type="lah" references="RP1">لاهندا</language>
+ <language type="lb" references="RP1">لوگزامبورگی</language>
+ <language type="lez" references="RP1">لزگی</language>
+ <language type="lg" references="RP1">گاندایی</language>
+ <language type="li">لیمبورگی</language>
+ <language type="ln" references="RP1">لینگالا</language>
+ <language type="lo" references="RP1">لائوسی</language>
+ <language type="lol" references="RP1">مونگویی</language>
+ <language type="loz" references="RP1">لوزیایی</language>
+ <language type="lt" references="RP1">لیتوانیایی</language>
+ <language type="lu">لوباییâ€Ú©Ø§ØªØ§Ù†Ú¯Ø§</language>
+ <language type="lua">لوباییâ€Ù„ولوا</language>
+ <language type="lun" references="RP1">لوندایی</language>
+ <language type="luo" references="RP1">لوئویی</language>
+ <language type="lus" references="RP1">لوشه‌ای</language>
+ <language type="lv" references="RP1">لتونیایی</language>
+ <language type="mad" references="RP1">مادورایی</language>
+ <language type="mag" references="RP1">ماگاهیایی</language>
+ <language type="mai" references="RP1">مایدیلی</language>
+ <language type="man" references="RP1">ماندینگویی</language>
+ <language type="map" references="RP1">آسترونیزیایی (دیگر)</language>
+ <language type="mas" references="RP1">ماسایی</language>
+ <language type="mdf" references="RP1">مکشایی</language>
+ <language type="men" references="RP1">منده‌ای</language>
+ <language type="mg" references="RP1">مالاگاسیایی</language>
+ <language type="mga">ایرلندی میانه</language>
+ <language type="mh" references="RP1">مارشالی</language>
+ <language type="mi" references="RP1">مائوریایی</language>
+ <language type="mic" references="RP1">میکماکی</language>
+ <language type="min" references="RP1">مینانگ‌کابویی</language>
+ <language type="mis">زبان‌های متÙرقه</language>
+ <language type="mk" references="RP1">مقدونی</language>
+ <language type="mkh" references="RP1">مون‌خمری (دیگر)</language>
+ <language type="ml" references="RP1">مالایالامی</language>
+ <language type="mn" references="RP1">مغولی</language>
+ <language type="mnc" references="RP1">مانچویی</language>
+ <language type="mo" references="RP1">مولداویایی</language>
+ <language type="moh" references="RP1">موهاکی</language>
+ <language type="mos" references="RP1">ماسیایی</language>
+ <language type="mr" references="RP1">مراتی</language>
+ <language type="ms" references="RP1">مالزیایی</language>
+ <language type="mt" references="RP1">مالتی</language>
+ <language type="mul">چندین زبان</language>
+ <language type="mun" references="RP1">زبانهای موندایی</language>
+ <language type="mus" references="RP1">کریکی</language>
+ <language type="my" references="RP1">برمه‌ای</language>
+ <language type="myn" references="RP1">زبانهای مایایی</language>
+ <language type="myv" references="RP1">ارزیایی</language>
+ <language type="na" references="RP1">نائورویی</language>
+ <language type="nah" references="RP1">ناواتلی</language>
+ <language type="nai" references="RP1">سرخپوستی امریکای شمالی (دیگر)</language>
+ <language type="nap">ناپلی</language>
+ <language type="nb" references="RP1">بوکسمال نروژی</language>
+ <language type="nd" references="RP1">انده‌بله‌ای شمالی</language>
+ <language type="nds" references="RP1">آلمانی سÙÙ„ÛŒ</language>
+ <language type="ne" references="RP1">نپالی</language>
+ <language type="new" references="RP1">نواریایی</language>
+ <language type="ng">ندونگایی</language>
+ <language type="niu" references="RP1">نیویی</language>
+ <language type="nl" references="RP1">هلندی</language>
+ <language type="nn" references="RP1">نرس جدید نروژی</language>
+ <language type="no" references="RP1">نروژی</language>
+ <language type="nog" references="RP1">نغایی</language>
+ <language type="non" references="RP1">نرس باستان</language>
+ <language type="nr" references="RP1">انده‌بله‌ای جنوبی</language>
+ <language type="nso" references="RP1">سوتویی شمالی</language>
+ <language type="nub" references="RP1">زبانهای نوبیایی</language>
+ <language type="nv" references="RP1">ناواهویی</language>
+ <language type="nwc" references="RP1">نواریایی کلاسیک</language>
+ <language type="ny" references="RP1">نیانجایی؛ چوایی</language>
+ <language type="nyn" references="RP1">نیانکوله‌ای</language>
+ <language type="nyo" references="RP1">نیورویی</language>
+ <language type="oj" references="RP1">اوجیبوایی</language>
+ <language type="or" references="RP1">اوریه‌ای</language>
+ <language type="os" references="RP1">آسی</language>
+ <language type="osa" references="RP1">اوسیجی</language>
+ <language type="ota">ترکی عثمانی</language>
+ <language type="oto" references="RP1">زبانهای اتومیایی</language>
+ <language type="pa" references="RP1">پنجابی</language>
+ <language type="paa" references="RP1">پاپوایی (دیگر)</language>
+ <language type="pag" references="RP1">پانگاسینانی</language>
+ <language type="pal">پهلوی</language>
+ <language type="pam" references="RP1">پامپانگایی</language>
+ <language type="pap" references="RP1">پاپیامنتو</language>
+ <language type="pau" references="RP1">پالائویی</language>
+ <language type="peo" references="RP1">Ùارسی باستان</language>
+ <language type="phi">Ùیلیپینی (دیگر)</language>
+ <language type="phn">Ùنیقی</language>
+ <language type="pi">پالی</language>
+ <language type="pl" references="RP1">لهستانی</language>
+ <language type="pra" references="RP1">زبانهای پراکریتی</language>
+ <language type="ps" references="RP1">پشتو</language>
+ <language type="pt" references="RP1">پرتغالی</language>
+ <language type="qu" references="RP1">کچوایی</language>
+ <language type="raj" references="RP1">راجستانی</language>
+ <language type="rar" references="RP1">راروتونگایی</language>
+ <language type="rm" references="RP1">رتوâ€Ø±ÙˆÙ…یایی</language>
+ <language type="rn" references="RP1">روندیایی</language>
+ <language type="ro" references="RP1">رومانیایی</language>
+ <language type="roa" references="RP1">رومیایی (دیگر)</language>
+ <language type="rom" references="RP1">رومانویی</language>
+ <language type="root">ریشه</language>
+ <language type="ru" references="RP1">روسی</language>
+ <language type="rw" references="RP1">کینیارواندایی</language>
+ <language type="sa" references="RP1">سنسکریت</language>
+ <language type="sad" references="RP1">سانداوه‌ای</language>
+ <language type="sah" references="RP1">یاقوتی</language>
+ <language type="sai">سرخپوستی امریکای جنوبی (دیگر)</language>
+ <language type="sal" references="RP1">زبانهای سالیشی</language>
+ <language type="sat" references="RP1">سانتالی</language>
+ <language type="sc" references="RP1">ساردینیایی</language>
+ <language type="sco" references="RP1">اسکاتلندی</language>
+ <language type="sd" references="RP1">سندی</language>
+ <language type="sel" references="RP1">سلکوپی</language>
+ <language type="sem" references="RP1">سامی (دیگر)</language>
+ <language type="sg" references="RP1">سانگویی</language>
+ <language type="sga">ایرلندی باستان</language>
+ <language type="sgn">زبان‌های نشانه‌ای</language>
+ <language type="shn" references="RP1">شانی</language>
+ <language type="si" references="RP1">سینهالی</language>
+ <language type="sid" references="RP1">سیدامویی</language>
+ <language type="sio" references="RP1">زبانهای سویی</language>
+ <language type="sit" references="RP1">چین و تبتی (دیگر)</language>
+ <language type="sk" references="RP1">اسلواکی</language>
+ <language type="sl" references="RP1">اسلووینیایی</language>
+ <language type="sla" references="RP1">اسلاوی (دیگر</language>
+ <language type="sm" references="RP1">ساموآیی</language>
+ <language type="sn" references="RP1">شونایی</language>
+ <language type="snk" references="RP1">سونینکه‌ای</language>
+ <language type="so" references="RP1">سومالیایی</language>
+ <language type="sog" references="RP1">سغدی</language>
+ <language type="son" references="RP1">سونغایی</language>
+ <language type="sq" references="RP1">آلبانیایی</language>
+ <language type="sr" references="RP1">صربی</language>
+ <language type="srr" references="RP1">سریری</language>
+ <language type="ssa" references="RP1">نیلی و صحرایی (دیگر)</language>
+ <language type="st" references="RP1">سوتویی جنوبی</language>
+ <language type="su" references="RP1">سوندایی</language>
+ <language type="suk" references="RP1">سوکومایی</language>
+ <language type="sus" references="RP1">سوسویی</language>
+ <language type="sux">سومری</language>
+ <language type="sv" references="RP1">سوئدی</language>
+ <language type="sw" references="RP1">سواحلی</language>
+ <language type="syr" references="RP1">سریانی</language>
+ <language type="ta" references="RP1">تامیلی</language>
+ <language type="tai" references="RP1">تایی (دیگر)</language>
+ <language type="te" references="RP1">تلوگویی</language>
+ <language type="tem">تیمنه‌ای</language>
+ <language type="tg" references="RP1">تاجیکی</language>
+ <language type="th" references="RP1">تایلندی</language>
+ <language type="ti" references="RP1">تیگرینیایی</language>
+ <language type="tig" references="RP1">تیگره‌ای</language>
+ <language type="tiv" references="RP1">تیوی</language>
+ <language type="tk" references="RP1">ترکمنی</language>
+ <language type="tl" references="RP1">تاگالوگی</language>
+ <language type="tlh">کلینگون</language>
+ <language type="tli" references="RP1">تلین‌گیتی</language>
+ <language type="tmh" references="RP1">تاماشقی</language>
+ <language type="tn" references="RP1">تسوانایی</language>
+ <language type="to" references="RP1">تونگایی (جزایر تونگا)</language>
+ <language type="tog" references="RP1">تونگایی (نیاسا)</language>
+ <language type="tr">ترکی استانبولی</language>
+ <language type="ts" references="RP1">تسونگایی</language>
+ <language type="tsi" references="RP1">تسیم‌شیانی</language>
+ <language type="tt" references="RP1">تاتاری</language>
+ <language type="tum" references="RP1">تومبوکایی</language>
+ <language type="tup" references="RP1">زبانهای توپیایی</language>
+ <language type="tut" references="RP1">آلتاییک (دیگر)</language>
+ <language type="tw" references="RP1">توی‌یایی</language>
+ <language type="ty" references="RP1">تاهیتیایی</language>
+ <language type="tyv" references="RP1">تووایی</language>
+ <language type="udm" references="RP1">اودمورتی</language>
+ <language type="ug" references="RP1">اویغوری</language>
+ <language type="uk" references="RP1">اوکراینی</language>
+ <language type="umb" references="RP1">امبندویی</language>
+ <language type="und">نامشخص</language>
+ <language type="ur" references="RP1">اردو</language>
+ <language type="uz" references="RP1">ازبکی</language>
+ <language type="vai" references="RP1">ویایی</language>
+ <language type="ve" references="RP1">وندایی</language>
+ <language type="vi" references="RP1">ویتنامی</language>
+ <language type="vo" references="RP1">ولاپوک</language>
+ <language type="wa" references="RP2">والونی</language>
+ <language type="wak" references="RP1">زبانهای واکاشی</language>
+ <language type="wen" references="RP1">زبانهای صÙربی</language>
+ <language type="wo" references="RP1">ولوÙÛŒ</language>
+ <language type="xal" references="RP1">قلموقی</language>
+ <language type="xh" references="RP1">خوسایی</language>
+ <language type="yao" references="RP1">یائویی</language>
+ <language type="yap" references="RP1">یاپی</language>
+ <language type="yi" references="RP1">یدی</language>
+ <language type="yo" references="RP1">یوروبایی</language>
+ <language type="ypk" references="RP1">زبانهای یوپیکی</language>
+ <language type="za" references="RP1">چوانگی</language>
+ <language type="zap" references="RP1">زاپوتکی</language>
+ <language type="zh" references="RP1">چینی</language>
+ <language type="znd" references="RP1">زانده‌ای</language>
+ <language type="zu" references="RP1">زولویی</language>
+ <language type="zun" references="RP1">زونیایی</language>
+ </languages>
+ <scripts>
+ <script type="Arab">عربی</script>
+ <script type="Armn">ارمنی</script>
+ <script type="Bali" references="RP1">بالیایی</script>
+ <script type="Batk" references="RP1">باتاکی</script>
+ <script type="Beng">بنگالی</script>
+ <script type="Bopo">بوپوموÙÙˆ</script>
+ <script type="Brai">بریل</script>
+ <script type="Bugi" references="RP1">بوگیایی</script>
+ <script type="Cher">چروکیایی</script>
+ <script type="Copt">قبطی</script>
+ <script type="Cyrl">سیریلی</script>
+ <script type="Deva">دوناگری</script>
+ <script type="Egyp">هیروگلیÙهای مصری</script>
+ <script type="Ethi">اتیوپیایی</script>
+ <script type="Geor">گرجی</script>
+ <script type="Goth">گوتیک</script>
+ <script type="Grek">یونانی</script>
+ <script type="Gujr">گجراتی</script>
+ <script type="Hang">هانگول</script>
+ <script type="Hani">هان</script>
+ <script type="Hans">هان ساده‌شده</script>
+ <script type="Hant">هان سنتی</script>
+ <script type="Hebr">عبری</script>
+ <script type="Hira">هیراگانا</script>
+ <script type="Hrkt">کاتاکانا یا هیراگانا</script>
+ <script type="Hung">مجاری باستان</script>
+ <script type="Java" references="RP1">جاوه‌ای</script>
+ <script type="Kana">کاتاکانا</script>
+ <script type="Khmr">خمری</script>
+ <script type="Knda">کاناده‌ای</script>
+ <script type="Laoo">لائوسی</script>
+ <script type="Latg">لاتینی (گیلی)</script>
+ <script type="Latn">لاتینی</script>
+ <script type="Maya">هیروگلیÙهای مایایی</script>
+ <script type="Mlym">مالایالامی</script>
+ <script type="Mong">مغولی</script>
+ <script type="Mymr">میانمار</script>
+ <script type="Orya">اوریه‌ای</script>
+ <script type="Phnx">Ùنیقی</script>
+ <script type="Qaai">موروثی</script>
+ <script type="Runr">رونی</script>
+ <script type="Shaw">شاوی</script>
+ <script type="Sinh" references="RP1">سینهالی</script>
+ <script type="Syrc">سریانی</script>
+ <script type="Syrj">سریانی (غربی)</script>
+ <script type="Syrn">سریانی (شرقی)</script>
+ <script type="Taml">تامیلی</script>
+ <script type="Telu">تلوگویی</script>
+ <script type="Tglg">تاگالوگی</script>
+ <script type="Thai">تایلندی</script>
+ <script type="Tibt">تبتی</script>
+ <script type="Vaii" references="RP1">ویایی</script>
+ <script type="Xpeo">Ùارسی باستان</script>
+ <script type="Yiii">یی</script>
+ <script type="Zxxx">کد زبانهای نوشته‌نشده</script>
+ <script type="Zyyy">مشترک</script>
+ <script type="Zzzz">کد خطهای کدگذاری‌نشده</script>
+ </scripts>
+ <territories>
+ <territory type="001">جهان</territory>
+ <territory type="002">اÙریقا</territory>
+ <territory type="003">امریکای شمالی</territory>
+ <territory type="005">امریکای جنوبی</territory>
+ <territory type="009">اقیانوسیه</territory>
+ <territory type="011">غرب اÙریقا</territory>
+ <territory type="013">امریکای مرکزی</territory>
+ <territory type="014">شرق اÙریقا</territory>
+ <territory type="015">شمال اÙریقا</territory>
+ <territory type="017">مرکز اÙریقا</territory>
+ <territory type="018">جنوب اÙریقا</territory>
+ <territory type="019">امریکا</territory>
+ <territory type="021">شمال امریکا</territory>
+ <territory type="029">کارائیب</territory>
+ <territory type="030">شرق آسیا</territory>
+ <territory type="034">جنوب آسیا</territory>
+ <territory type="035">جنوب شرقی آسیا</territory>
+ <territory type="039">جنوب اروپا</territory>
+ <territory type="053">استرالیا و زلاند نو</territory>
+ <territory type="061">پلی‌نزی</territory>
+ <territory type="142">آسیا</territory>
+ <territory type="143">آسیای مرکزی</territory>
+ <territory type="145">غرب آسیا</territory>
+ <territory type="150">اروپا</territory>
+ <territory type="151">شرق اروپا</territory>
+ <territory type="154">شمال اروپا</territory>
+ <territory type="155">غرب اروپا</territory>
+ <territory type="172">کشورهای مستقل مشترک‌المناÙع</territory>
+ <territory type="419">امریکای لاتین و کارائیب</territory>
+ <territory type="AD">آندورا</territory>
+ <territory type="AE" references="RP3">امارات متحدهٔ عربی</territory>
+ <territory type="AF">اÙغانستان</territory>
+ <territory type="AG">آنتیگوا و باربودا</territory>
+ <territory type="AI">آنگیل</territory>
+ <territory type="AL">آلبانی</territory>
+ <territory type="AM">ارمنستان</territory>
+ <territory type="AN">آنتیل هلند</territory>
+ <territory type="AO">آنگولا</territory>
+ <territory type="AQ">جنوبگان</territory>
+ <territory type="AR">آرژانتین</territory>
+ <territory type="AS">ساموای امریکا</territory>
+ <territory type="AT">اتریش</territory>
+ <territory type="AU">استرالیا</territory>
+ <territory type="AW">آروبا</territory>
+ <territory type="AZ">جمهوری آذربایجان</territory>
+ <territory type="BA">بوسنی و هرزگوین</territory>
+ <territory type="BB">باربادوس</territory>
+ <territory type="BD">بنگلادش</territory>
+ <territory type="BE">بلژیک</territory>
+ <territory type="BF">بورکیناÙاسو</territory>
+ <territory type="BG">بلغارستان</territory>
+ <territory type="BH">بحرین</territory>
+ <territory type="BI">بوروندی</territory>
+ <territory type="BJ">بنین</territory>
+ <territory type="BM">برمودا</territory>
+ <territory type="BN">برونئی</territory>
+ <territory type="BO">بولیوی</territory>
+ <territory type="BR">برزیل</territory>
+ <territory type="BS">باهاما</territory>
+ <territory type="BT">بوتان</territory>
+ <territory type="BV" references="RP3">جزیرهٔ بووت</territory>
+ <territory type="BW">بوتسوانا</territory>
+ <territory type="BY">بیلوروسی</territory>
+ <territory type="BZ">بلیز</territory>
+ <territory type="CA">کانادا</territory>
+ <territory type="CC">جزایر کوکوس</territory>
+ <territory type="CD">جمهوری دموکراتیک کنگو</territory>
+ <territory type="CF">جمهوری اÙریقای مرکزی</territory>
+ <territory type="CG">کونگو</territory>
+ <territory type="CH">سوئیس</territory>
+ <territory type="CI">ساحل عاج</territory>
+ <territory type="CK">جزایر کوک</territory>
+ <territory type="CL">شیلی</territory>
+ <territory type="CM">کامرون</territory>
+ <territory type="CN">چین</territory>
+ <territory type="CO">کلمبیا</territory>
+ <territory type="CR">کاستاریکا</territory>
+ <territory type="CS">صربستان و مونته‌نگرو</territory>
+ <territory type="CU">کوبا</territory>
+ <territory type="CV">کیپ ورد</territory>
+ <territory type="CX" references="RP3">جزیرهٔ کریسمس</territory>
+ <territory type="CY">قبرس</territory>
+ <territory type="CZ">جمهوری چک</territory>
+ <territory type="DE">آلمان</territory>
+ <territory type="DJ">جیبوتی</territory>
+ <territory type="DK">دانمارک</territory>
+ <territory type="DM">دومینیکا</territory>
+ <territory type="DO">جمهوری دومینیکن</territory>
+ <territory type="DZ">الجزایر</territory>
+ <territory type="EC">اکوادر</territory>
+ <territory type="EE">استونی</territory>
+ <territory type="EG">مصر</territory>
+ <territory type="EH">صحرای غربی</territory>
+ <territory type="ER">اریتره</territory>
+ <territory type="ES">اسپانیا</territory>
+ <territory type="ET">اتیوپی</territory>
+ <territory type="FI">Ùنلاند</territory>
+ <territory type="FJ">Ùیجی</territory>
+ <territory type="FK">جزایر Ùالکلند</territory>
+ <territory type="FM">میکرونزی</territory>
+ <territory type="FO">جزایر Ùارو</territory>
+ <territory type="FR">Ùرانسه</territory>
+ <territory type="GA">گابون</territory>
+ <territory type="GB">بریتانیا</territory>
+ <territory type="GD">گرانادا</territory>
+ <territory type="GE">گرجستان</territory>
+ <territory type="GF">گویان Ùرانسه</territory>
+ <territory type="GH">غنا</territory>
+ <territory type="GI">گیبرالتار</territory>
+ <territory type="GL">گروئنلند</territory>
+ <territory type="GM">گامبیا</territory>
+ <territory type="GN">گینه</territory>
+ <territory type="GP">گوادلوپ</territory>
+ <territory type="GQ" references="RP3">گینهٔ استوایی</territory>
+ <territory type="GR">یونان</territory>
+ <territory type="GS">جورجیای جنوبی و جزایر ساندویچ جنوبی</territory>
+ <territory type="GT">گواتمالا</territory>
+ <territory type="GU">گوام</territory>
+ <territory type="GW" references="RP3">گینهٔ بیسائو</territory>
+ <territory type="GY">گویان</territory>
+ <territory type="HK">هنگ‌کنگ، ناحیهٔ ویژهٔ حکومتی چین</territory>
+ <territory type="HM" references="RP3">جزیرهٔ هرد و جزایر مک‌دونالد</territory>
+ <territory type="HN">هندوراس</territory>
+ <territory type="HR">کرواسی</territory>
+ <territory type="HT">هاییتی</territory>
+ <territory type="HU">مجارستان</territory>
+ <territory type="ID">اندونزی</territory>
+ <territory type="IE">ایرلند</territory>
+ <territory type="IL">اسرائیل</territory>
+ <territory type="IN">هند</territory>
+ <territory type="IO">مستعمره‌های انگلستان در اقیانوس هند</territory>
+ <territory type="IQ">عراق</territory>
+ <territory type="IR">ایران</territory>
+ <territory type="IS">ایسلند</territory>
+ <territory type="IT">ایتالیا</territory>
+ <territory type="JM">جامائیکا</territory>
+ <territory type="JO">اردن</territory>
+ <territory type="JP">ژاپن</territory>
+ <territory type="KE">کنیا</territory>
+ <territory type="KG">قرقیزستان</territory>
+ <territory type="KH">کامبوج</territory>
+ <territory type="KI">کیریباتی</territory>
+ <territory type="KM">کومورو</territory>
+ <territory type="KN">سنت کیتس و نویس</territory>
+ <territory type="KP" references="RP3">کرهٔ شمالی</territory>
+ <territory type="KR" references="RP3">کرهٔ جنوبی</territory>
+ <territory type="KW">کویت</territory>
+ <territory type="KY">جزایر Ú©Ùیمن</territory>
+ <territory type="KZ">قزاقستان</territory>
+ <territory type="LA">لائوس</territory>
+ <territory type="LB">لبنان</territory>
+ <territory type="LC">سنت لوسیا</territory>
+ <territory type="LI">لیختن‌اشتاین</territory>
+ <territory type="LK">سری‌لانکا</territory>
+ <territory type="LR">لیبریا</territory>
+ <territory type="LS">لسوتو</territory>
+ <territory type="LT">لیتوانی</territory>
+ <territory type="LU">لوکزامبورگ</territory>
+ <territory type="LV">لتونی</territory>
+ <territory type="LY">لیبی</territory>
+ <territory type="MA">مراکش</territory>
+ <territory type="MC">موناکو</territory>
+ <territory type="MD">مولدووا</territory>
+ <territory type="MG">ماداگاسکار</territory>
+ <territory type="MH">جزایر مارشال</territory>
+ <territory type="MK">مقدونیه</territory>
+ <territory type="ML">مالی</territory>
+ <territory type="MM">میانمار</territory>
+ <territory type="MN">مغولستان</territory>
+ <territory type="MO">ماکائو، ناحیهٔ ویژهٔ حکومتی چین</territory>
+ <territory type="MP">جزایر ماریانای شمالی</territory>
+ <territory type="MQ">مارتینیک</territory>
+ <territory type="MR">موریتانی</territory>
+ <territory type="MS">مونت‌سرات</territory>
+ <territory type="MT">مالت</territory>
+ <territory type="MU">موریتیوس</territory>
+ <territory type="MV">مالدیو</territory>
+ <territory type="MW">مالاوی</territory>
+ <territory type="MX">مکزیک</territory>
+ <territory type="MY">مالزی</territory>
+ <territory type="MZ">موزامبیک</territory>
+ <territory type="NA">نامیبیا</territory>
+ <territory type="NC">کالدونیای جدید</territory>
+ <territory type="NE">نیجر</territory>
+ <territory type="NF" references="RP3">جزیرهٔ نورÙولک</territory>
+ <territory type="NG">نیجریه</territory>
+ <territory type="NI">نیکاراگوئه</territory>
+ <territory type="NL">هلند</territory>
+ <territory type="NO">نروژ</territory>
+ <territory type="NP">نپال</territory>
+ <territory type="NR">نائورو</territory>
+ <territory type="NU">نیوئه</territory>
+ <territory type="NZ">زلاند نو</territory>
+ <territory type="OM">عمان</territory>
+ <territory type="PA">پاناما</territory>
+ <territory type="PE">پرو</territory>
+ <territory type="PF">پلی‌نزی Ùرانسه</territory>
+ <territory type="PG" references="RP3">پاپوا گینهٔ نو</territory>
+ <territory type="PH">Ùیلیپین</territory>
+ <territory type="PK">پاکستان</territory>
+ <territory type="PL">لهستان</territory>
+ <territory type="PM">سنت پیر و میکلون</territory>
+ <territory type="PN">پیتکایرن</territory>
+ <territory type="PR">پورتو ریکو</territory>
+ <territory type="PS">Ùلسطین</territory>
+ <territory type="PT">پرتغال</territory>
+ <territory type="PW">پالائو</territory>
+ <territory type="PY">پاراگوئه</territory>
+ <territory type="QA">قطر</territory>
+ <territory type="RE">ریونیون</territory>
+ <territory type="RO">رومانی</territory>
+ <territory type="RU">روسیه</territory>
+ <territory type="RW">رواندا</territory>
+ <territory type="SA">عربستان سعودی</territory>
+ <territory type="SB">جزایر سلیمان</territory>
+ <territory type="SC">سیشل</territory>
+ <territory type="SD">سودان</territory>
+ <territory type="SE">سوئد</territory>
+ <territory type="SG">سنگاپور</territory>
+ <territory type="SH">سنت هلن</territory>
+ <territory type="SI">اسلوونی</territory>
+ <territory type="SJ">اسوالبارد و جان ماین</territory>
+ <territory type="SK">اسلواکی</territory>
+ <territory type="SL">سیرالئون</territory>
+ <territory type="SM">سان مارینو</territory>
+ <territory type="SN">سنگال</territory>
+ <territory type="SO">سومالی</territory>
+ <territory type="SR">سورینام</territory>
+ <territory type="ST">سائو تومه و پرینسیپه</territory>
+ <territory type="SV">السالوادور</territory>
+ <territory type="SY">سوریه</territory>
+ <territory type="SZ">سوازیلند</territory>
+ <territory type="TC">جزایر ترک و کایکوس</territory>
+ <territory type="TD">چاد</territory>
+ <territory type="TF">مستعمره‌های جنوبی Ùرانسه</territory>
+ <territory type="TG">توگو</territory>
+ <territory type="TH">تایلند</territory>
+ <territory type="TJ">تاجیکستان</territory>
+ <territory type="TK">توکلائو</territory>
+ <territory type="TL">تیمور شرقی</territory>
+ <territory type="TM">ترکمنستان</territory>
+ <territory type="TN">تونس</territory>
+ <territory type="TO">تونگا</territory>
+ <territory type="TR">ترکیه</territory>
+ <territory type="TT">ترینیداد و توباگو</territory>
+ <territory type="TV">تووالو</territory>
+ <territory type="TW">تایوان</territory>
+ <territory type="TZ">تانزانیا</territory>
+ <territory type="UA">اوکراین</territory>
+ <territory type="UG">اوگاندا</territory>
+ <territory type="UM" references="RP3">جزایر Ú©ÙˆÚ†Ú© دوراÙتادهٔ ایالات متحده</territory>
+ <territory type="US" references="RP3">ایالات متحدهٔ امریکا</territory>
+ <territory type="UY">اوروگوئه</territory>
+ <territory type="UZ">ازبکستان</territory>
+ <territory type="VA">واتیکان</territory>
+ <territory type="VC">سنت وینسنت و گرنادین</territory>
+ <territory type="VE">ونزوئلا</territory>
+ <territory type="VG">جزایر ویرجین انگلستان</territory>
+ <territory type="VI">جزایر ویرجین ایالات متحده</territory>
+ <territory type="VN">ویتنام</territory>
+ <territory type="VU">وانواتو</territory>
+ <territory type="WF">والیس Ùˆ Ùیوتونا</territory>
+ <territory type="WS">ساموا</territory>
+ <territory type="YE">یمن</territory>
+ <territory type="YT">مایوت</territory>
+ <territory type="ZA">اÙریقای جنوبی</territory>
+ <territory type="ZM">زامبیا</territory>
+ <territory type="ZW">زیمبابوه</territory>
+ </territories>
+ <variants>
+ <variant type="1901">رسم‌الخط سنتی آلمانی</variant>
+ <variant type="1996">رسم‌الخط آلمانی ۱۹۹۶ میلادی</variant>
+ <variant type="REVISED">رسم‌الخط تجدیدنظرشده</variant>
+ </variants>
+ <keys>
+ <key type="calendar">تقویم</key>
+ <key type="collation">ترتیب‌بندی</key>
+ <key type="currency">واحد پول</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">چینی سنتی (Big5)</type>
+ <type type="buddhist" key="calendar">تقویم بودایی</type>
+ <type type="chinese" key="calendar">تقویم چینی</type>
+ <type type="gb2312han" key="collation">چینی ساده‌شده (GB2312)</type>
+ <type type="gregorian" key="calendar">تقویم میلادی</type>
+ <type type="hebrew" key="calendar">تقویم عبری</type>
+ <type type="islamic" key="calendar" references="R6">تقویم هجری قمری</type>
+ <type type="islamic-civil" key="calendar">تقویم هجری قمری مدنی</type>
+ <type type="japanese" key="calendar">تقویم ژاپنی</type>
+ <type type="persian" key="calendar" references="R6">تقویم هجری شمسی</type>
+ <type type="phonebook" key="collation">ترتیب دÙتر تلÙÙ†</type>
+ <type type="traditional" key="collation">سنتی</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US">امریکایی</measurementSystemName>
+ <measurementSystemName type="metric">متریک</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <layout>
+ <orientation characters="right-to-left"/>
+ </layout>
+ <characters>
+ <exemplarCharacters>[َ ٠٠ً ٠ٌ ّ ْ ٔ آ ا ء أ ؤ ئ ب پ ت-ج چ ح-ز ژ س-غ ٠ق ک گ ل-ن و ه ة ی]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D Ù– Ù°]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart references="R6">«</quotationStart>
+ <quotationEnd references="R6">»</quotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1" references="R6">ژانویهٔ</month>
+ <month type="2" references="R6">Ùوریهٔ</month>
+ <month type="3" references="R6">مارس</month>
+ <month type="4" references="R6">آوریل</month>
+ <month type="5" references="R6">مهٔ</month>
+ <month type="6" references="R6">ژوئن</month>
+ <month type="7" references="R6">ژوئیهٔ</month>
+ <month type="8" references="R6">اوت</month>
+ <month type="9" references="R6">سپتامبر</month>
+ <month type="10" references="R6">اکتبر</month>
+ <month type="11" references="R6">نوامبر</month>
+ <month type="12" references="R6">دسامبر</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="abbreviated">
+ <alias source="locale" path="../monthWidth[@type='wide']" draft="unconfirmed"/>
+ </monthWidth>
+ <monthWidth type="narrow">
+ <month type="1" references="R6">Ú˜</month>
+ <month type="2" references="R6">Ù</month>
+ <month type="3" references="R6">Ù…</month>
+ <month type="4" references="R6">Ø¢</month>
+ <month type="5" references="R6">Ù…</month>
+ <month type="6" references="R6">Ú˜</month>
+ <month type="7" references="R6">Ú˜</month>
+ <month type="8" references="R6">ا</month>
+ <month type="9" references="R6">س</month>
+ <month type="10" references="R6">ا</month>
+ <month type="11" references="R6">Ù†</month>
+ <month type="12" references="R6">د</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" references="R6">ژانویه</month>
+ <month type="2" references="R6">Ùوریه</month>
+ <month type="3" references="R6">مارس</month>
+ <month type="4" references="R6">آوریل</month>
+ <month type="5" references="R6">مه</month>
+ <month type="6" references="R6">ژوئن</month>
+ <month type="7" references="R6">ژوئیه</month>
+ <month type="8" references="R6">اوت</month>
+ <month type="9" references="R6">سپتامبر</month>
+ <month type="10" references="R6">اکتبر</month>
+ <month type="11" references="R6">نوامبر</month>
+ <month type="12" references="R6">دسامبر</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" references="R6">یکشنبه</day>
+ <day type="mon" references="R6">دوشنبه</day>
+ <day type="tue" references="R6">سه‌شنبه</day>
+ <day type="wed" references="R6">چهارشنبه</day>
+ <day type="thu" references="R6">پنجشنبه</day>
+ <day type="fri" references="R6">جمعه</day>
+ <day type="sat" references="R6">شنبه</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" references="R6">یکشنبه</day>
+ <day type="mon" references="R6">دوشنبه</day>
+ <day type="tue" references="R6">سه‌شنبه</day>
+ <day type="wed" references="R6">چهارشنبه</day>
+ <day type="thu" references="R6">پنجشنبه</day>
+ <day type="fri" references="R6">جمعه</day>
+ <day type="sat" references="R6">شنبه</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" references="R6">ی</day>
+ <day type="mon" references="R6">د</day>
+ <day type="tue" references="R6">س</day>
+ <day type="wed" references="R6">Ú†</day>
+ <day type="thu" references="R6">Ù¾</day>
+ <day type="fri" references="R6">ج</day>
+ <day type="sat" references="R6">Ø´</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1">سه‌ماههٔ اول</quarter>
+ <quarter type="2">سه‌ماههٔ دوم</quarter>
+ <quarter type="3">سه‌ماههٔ سوم</quarter>
+ <quarter type="4">سه‌ماههٔ چهارم</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>قبل از ظهر</am>
+ <pm>بعد از ظهر</pm>
+ <eras>
+ <eraNames>
+ <era type="0">قبل از میلاد</era>
+ <era type="1" references="R6">میلادی</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">Ù‚.Ù….</era>
+ <era type="1" references="R6">Ù….</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <default choice="long" draft="unconfirmed"/>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern references="R6">EEEE d MMMM yyyy GGGG</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern references="R6">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern references="R6">yyyy/M/d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern references="R6">yy/M/d G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern references="R6">H:mm:ss (vvvv)</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern references="R6">H:mm:ss (zzzz)</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern references="R6">H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern references="R6">H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <dateTimeFormatLength>
+ <dateTimeFormat>
+ <pattern references="R6">{0}، ساعت {1}</pattern>
+ </dateTimeFormat>
+ </dateTimeFormatLength>
+ <availableFormats>
+ <dateFormatItem id="GGGGyyyyMMMMd" references="R6" draft="provisional">d MMMM yyyy GGGG</dateFormatItem>
+ <dateFormatItem id="HHmmZ" references="R6" draft="provisional">HH:mm (Z)</dateFormatItem>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">M/d</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">yyyy/M</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMMEEEEd" draft="provisional">EEEE d MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ <appendItems>
+ <appendItem request="Day-Of-Week" references="R6">{1} {0}</appendItem>
+ </appendItems>
+ </dateTimeFormats>
+ <fields>
+ <field type="year">
+ <displayName>سال</displayName>
+ </field>
+ <field type="month">
+ <displayName>ماه</displayName>
+ </field>
+ <field type="week">
+ <displayName>Ù‡Ùته</displayName>
+ </field>
+ <field type="day">
+ <displayName>روز</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>روز Ù‡Ùته</displayName>
+ </field>
+ <field type="hour">
+ <displayName>ساعت</displayName>
+ </field>
+ <field type="minute">
+ <displayName>دقیقه</displayName>
+ </field>
+ <field type="second">
+ <displayName>ثانیه</displayName>
+ </field>
+ <field type="zone">
+ <displayName>منطقهٔ زمانی</displayName>
+ </field>
+ </fields>
+ </calendar>
+ <calendar type="islamic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1" references="R6">محرم</month>
+ <month type="2" references="R6">صÙر</month>
+ <month type="3" references="R6">ربیع الاول</month>
+ <month type="4" references="R6">ربیع الثانی</month>
+ <month type="5" references="R6">جمادی الاول</month>
+ <month type="6" references="R6">جمادی الثانی</month>
+ <month type="7" references="R6">رجب</month>
+ <month type="8" references="R6">شعبان</month>
+ <month type="9" references="R6">رمضان</month>
+ <month type="10" references="R6">شوال</month>
+ <month type="11" references="R6">ذیقعدهٔ</month>
+ <month type="12" references="R6">ذیحجهٔ</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="abbreviated">
+ <alias source="locale" path="../monthWidth[@type='wide']" draft="unconfirmed"/>
+ </monthWidth>
+ <monthWidth type="narrow">
+ <month type="1" references="R6">Ù…</month>
+ <month type="2" references="R6">ص</month>
+ <month type="3" references="R6">ر</month>
+ <month type="4" references="R6">ر</month>
+ <month type="5" references="R6">ج</month>
+ <month type="6" references="R6">ج</month>
+ <month type="7" references="R6">ر</month>
+ <month type="8" references="R6">Ø´</month>
+ <month type="9" references="R6">ر</month>
+ <month type="10" references="R6">Ø´</month>
+ <month type="11" references="R6">Ø°</month>
+ <month type="12" references="R6">Ø°</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" references="R6">محرم</month>
+ <month type="2" references="R6">صÙر</month>
+ <month type="3" references="R6">ربیع الاول</month>
+ <month type="4" references="R6">ربیع الثانی</month>
+ <month type="5" references="R6">جمادی الاول</month>
+ <month type="6" references="R6">جمادی الثانی</month>
+ <month type="7" references="R6">رجب</month>
+ <month type="8" references="R6">شعبان</month>
+ <month type="9" references="R6">رمضان</month>
+ <month type="10" references="R6">شوال</month>
+ <month type="11" references="R6">ذیقعده</month>
+ <month type="12" references="R6">ذیحجه</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <eras>
+ <eraNames>
+ <era type="0" references="R6">هجری قمری</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" references="R6">Ù‡â€. Ù‚.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <default choice="long" draft="unconfirmed"/>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern references="R6">yyyy/M/d G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern references="R6">yy/M/d G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ </calendar>
+ <calendar type="persian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1" references="R6">Ùروردین</month>
+ <month type="2" references="R6">اردیبهشت</month>
+ <month type="3" references="R6">خرداد</month>
+ <month type="4" references="R6">تیر</month>
+ <month type="5" references="R6">مرداد</month>
+ <month type="6" references="R6">شهریور</month>
+ <month type="7" references="R6">مهر</month>
+ <month type="8" references="R6">آبان</month>
+ <month type="9" references="R6">آذر</month>
+ <month type="10" references="R6">دی</month>
+ <month type="11" references="R6">بهمن</month>
+ <month type="12" references="R6">اسÙند</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">Ù</month>
+ <month type="2">ا</month>
+ <month type="3">Ø®</month>
+ <month type="4">ت</month>
+ <month type="5">Ù…</month>
+ <month type="6">Ø´</month>
+ <month type="7">Ù…</month>
+ <month type="8">Ø¢</month>
+ <month type="9">Ø¢</month>
+ <month type="10">د</month>
+ <month type="11">ب</month>
+ <month type="12">ا</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">حمل</month>
+ <month type="2">ثور</month>
+ <month type="3">جوزا</month>
+ <month type="4">سرطان</month>
+ <month type="5">اسد</month>
+ <month type="6">سنبله</month>
+ <month type="7">میزان</month>
+ <month type="8">عقرب</month>
+ <month type="9">قوس</month>
+ <month type="10">جدی</month>
+ <month type="11">دلو</month>
+ <month type="12">حوت</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <eras>
+ <eraNames>
+ <era type="0" references="R6">هجری شمسی</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" references="R6">Ù‡â€. Ø´.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern references="R6">EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern references="R6">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern references="R6">yyyy/M/d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern references="R6">yy/M/d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <dateTimeFormatLength>
+ <dateTimeFormat>
+ <pattern references="R6">{0}، ساعت {1}</pattern>
+ </dateTimeFormat>
+ </dateTimeFormatLength>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HHmm;-HHmm</hourFormat>
+ <regionFormat>وقت {0}</regionFormat>
+ <fallbackFormat>وقت {0} ({1})</fallbackFormat>
+ <zone type="Asia/Kabul">
+ <long>
+ <generic>وقت اÙغانستان</generic>
+ </long>
+ <short>
+ <generic>AFT</generic>
+ </short>
+ <exemplarCity>کابل</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>قطب جنوب</exemplarCity>
+ </zone>
+ <zone type="America/Mendoza">
+ <exemplarCity>مندوسا</exemplarCity>
+ </zone>
+ <zone type="America/Catamarca">
+ <exemplarCity>کاتامارکا</exemplarCity>
+ </zone>
+ <zone type="America/Jujuy">
+ <exemplarCity>خوخوئی</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity>کوردووا</exemplarCity>
+ </zone>
+ <zone type="America/Buenos_Aires">
+ <exemplarCity>بوئنوس‌آیرس</exemplarCity>
+ </zone>
+ <zone type="Australia/Adelaide">
+ <exemplarCity>آدلاید</exemplarCity>
+ </zone>
+ <zone type="Australia/Sydney">
+ <exemplarCity>سیدنی</exemplarCity>
+ </zone>
+ <zone type="America/Rio_Branco">
+ <exemplarCity>ریو برانکو</exemplarCity>
+ </zone>
+ <zone type="America/Porto_Velho">
+ <exemplarCity>پورتوولیو</exemplarCity>
+ </zone>
+ <zone type="America/Boa_Vista">
+ <exemplarCity>بوئاویشتا</exemplarCity>
+ </zone>
+ <zone type="America/Manaus">
+ <exemplarCity>ماناوس</exemplarCity>
+ </zone>
+ <zone type="America/Cuiaba">
+ <exemplarCity>کویاوا</exemplarCity>
+ </zone>
+ <zone type="America/Campo_Grande">
+ <exemplarCity>کمپو گرانده</exemplarCity>
+ </zone>
+ <zone type="America/Araguaina">
+ <exemplarCity>آراگواینا</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>سائوپائولو</exemplarCity>
+ </zone>
+ <zone type="America/Fortaleza">
+ <exemplarCity>Ùورتالزا</exemplarCity>
+ </zone>
+ <zone type="America/Maceio">
+ <exemplarCity>ماسیو</exemplarCity>
+ </zone>
+ <zone type="America/Noronha">
+ <exemplarCity>نورونیا</exemplarCity>
+ </zone>
+ <zone type="America/Dawson">
+ <exemplarCity>داوسن</exemplarCity>
+ </zone>
+ <zone type="America/Vancouver">
+ <exemplarCity>ونکوور</exemplarCity>
+ </zone>
+ <zone type="America/Dawson_Creek">
+ <exemplarCity>داوسن کریک</exemplarCity>
+ </zone>
+ <zone type="America/Inuvik">
+ <exemplarCity>اینوویک</exemplarCity>
+ </zone>
+ <zone type="America/Edmonton">
+ <exemplarCity>ادمونتون</exemplarCity>
+ </zone>
+ <zone type="America/Cambridge_Bay">
+ <exemplarCity>خلیج کمبریج</exemplarCity>
+ </zone>
+ <zone type="America/Winnipeg">
+ <exemplarCity>وینیپگ</exemplarCity>
+ </zone>
+ <zone type="America/Rainy_River">
+ <exemplarCity>رینی‌ریور</exemplarCity>
+ </zone>
+ <zone type="America/Rankin_Inlet">
+ <exemplarCity>خلیجک رنکین</exemplarCity>
+ </zone>
+ <zone type="America/Nipigon">
+ <exemplarCity>نیپیگان</exemplarCity>
+ </zone>
+ <zone type="America/Coral_Harbour">
+ <exemplarCity>کورال هاربر</exemplarCity>
+ </zone>
+ <zone type="America/Toronto">
+ <exemplarCity>تورنتو</exemplarCity>
+ </zone>
+ <zone type="America/Montreal">
+ <exemplarCity>مونرئال</exemplarCity>
+ </zone>
+ <zone type="America/Iqaluit">
+ <exemplarCity>ایکلوئت</exemplarCity>
+ </zone>
+ <zone type="America/Pangnirtung">
+ <exemplarCity>پانگنیرتونگ</exemplarCity>
+ </zone>
+ <zone type="America/Moncton">
+ <exemplarCity>مانکتون</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <exemplarCity>هلیÙکس</exemplarCity>
+ </zone>
+ <zone type="America/Goose_Bay">
+ <exemplarCity>خلیج گوس</exemplarCity>
+ </zone>
+ <zone type="America/Glace_Bay">
+ <exemplarCity>گلیس بی</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity>کینشاسا</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity>لوبومباشی</exemplarCity>
+ </zone>
+ <zone type="America/Santiago">
+ <exemplarCity>سانتیاگو</exemplarCity>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity>کاشغر</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity>شانگهای</exemplarCity>
+ </zone>
+ <zone type="America/Guayaquil">
+ <exemplarCity>گوایاکیل</exemplarCity>
+ </zone>
+ <zone type="Africa/Ceuta">
+ <exemplarCity>سئوتا</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity>مادرید</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity>گودهوب</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity>جاکارتا</exemplarCity>
+ </zone>
+ <zone type="Asia/Tehran">
+ <long>
+ <generic>وقت ایران</generic>
+ <standard references="R6">وقت عادی ایران</standard>
+ <daylight references="R6">وقت تابستانی ایران</daylight>
+ </long>
+ <short>
+ <generic>IRT</generic>
+ <standard references="R6">IRST</standard>
+ <daylight references="R6">IRDT</daylight>
+ </short>
+ <exemplarCity>تهران</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity>آلماتی</exemplarCity>
+ </zone>
+ <zone type="America/Hermosillo">
+ <exemplarCity>ارموسیو</exemplarCity>
+ </zone>
+ <zone type="America/Mazatlan">
+ <exemplarCity>ماساتلان</exemplarCity>
+ </zone>
+ <zone type="America/Chihuahua">
+ <exemplarCity>چیئوائوا</exemplarCity>
+ </zone>
+ <zone type="America/Monterrey">
+ <exemplarCity>مونترئی</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>مکزیکوسیتی</exemplarCity>
+ </zone>
+ <zone type="America/Merida">
+ <exemplarCity>مریدا</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>کانکون</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity>تاهیتی</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>لیسبون</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>مسکو</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>Ú©ÛŒÙ</exemplarCity>
+ </zone>
+ <zone type="America/Adak">
+ <exemplarCity>ایدک</exemplarCity>
+ </zone>
+ <zone type="America/Nome">
+ <exemplarCity>نوم</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <exemplarCity>هونولولو</exemplarCity>
+ </zone>
+ <zone type="America/Anchorage">
+ <exemplarCity>انکریج</exemplarCity>
+ </zone>
+ <zone type="America/Juneau">
+ <exemplarCity>جونو</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <exemplarCity>لوس‌آنجلس</exemplarCity>
+ </zone>
+ <zone type="America/Boise">
+ <exemplarCity>بویسی</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <exemplarCity>Ùینکس</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <exemplarCity>دنور</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <exemplarCity>شیکاگو</exemplarCity>
+ </zone>
+ <zone type="America/Menominee">
+ <exemplarCity>منامینی</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Petersburg">
+ <exemplarCity>پترزبرگ</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Knox">
+ <exemplarCity>ناکس</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Marengo">
+ <exemplarCity>مارنگو</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <exemplarCity>ایندیاناپولیس</exemplarCity>
+ </zone>
+ <zone type="America/Louisville">
+ <exemplarCity>لوئیزویل</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vevay">
+ <exemplarCity>ویوی</exemplarCity>
+ </zone>
+ <zone type="America/Kentucky/Monticello">
+ <exemplarCity>مانتیسلو</exemplarCity>
+ </zone>
+ <zone type="America/Detroit">
+ <exemplarCity>دترویت</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <exemplarCity>نیویورک</exemplarCity>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity>سمرقند</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>تاشکند</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal references="R7">Ù«</decimal>
+ <group references="R7">Ù¬</group>
+ <list>Ø›</list>
+ <percentSign references="R7">Ùª</percentSign>
+ <nativeZeroDigit references="R7">Û°</nativeZeroDigit>
+ <minusSign references="R7">−</minusSign>
+ <exponential>×۱۰^</exponential>
+ </symbols>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#,##0.###;'‪'-#,##0.###'‬'</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern references="RP6">'‪'%#,##0'‬'</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern references="R6">#,##0.00 ¤;'‪'-#,##0.00'‬' ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="AED">
+ <displayName>درهم امارات متحدهٔ عربی</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>اÙغانی قدیم</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>اÙغانی</displayName>
+ <symbol>Ø‹</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>لک آلبانی</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>پزوی آرژانتین</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName>شیلینگ اتریش</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>دلار استرالیا</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>منات جمهوری آذربایجان</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>دینار بوسنی و هرزگوین</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName>دلار باربادوس</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Ùرانک بلژیک</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>دینار بحرین</displayName>
+ </currency>
+ <currency type="BIF">
+ <displayName>Ùرانک بوروندی</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName>دلار برمودا</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName>دلار برونئی</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>پزوی بولیوی</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName references="RP5">رئال برزیل</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>دلار باهاما</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>روبل بیلوروسی</displayName>
+ </currency>
+ <currency type="BZD">
+ <displayName>دلار بلیز</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName references="R6">دلار کانادا</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Ùرانک سوئیس</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>پزوی شیلی</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName references="RP5">رنمینبی یوآن چین</displayName>
+ </currency>
+ <currency type="COP">
+ <displayName>پزوی کلمبیا</displayName>
+ </currency>
+ <currency type="CSD">
+ <displayName>دینار صربستان</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>پزوی کوبا</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>مارک آلمان</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName>کرون دانمارک</displayName>
+ </currency>
+ <currency type="DOP">
+ <displayName>پزوی دومینیکا</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>یورو</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>دلار Ùیجی</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Ùرانک Ùرانسه</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>پوند استرلینگ بریتانیا</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Ùورینت مجارستان</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName references="RP3">روپیهٔ هند</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>دینار عراق</displayName>
+ </currency>
+ <currency type="IRR">
+ <displayName references="R6">ریال ایران</displayName>
+ <symbol>ï·¼</symbol>
+ </currency>
+ <currency type="ITL">
+ <displayName>لیرهٔ ایتالیا</displayName>
+ </currency>
+ <currency type="JOD">
+ <displayName>دینار اردن</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>ین ژاپن</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>دینار کویت</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName>پزوی مکزیک</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>گیلدر هلند</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>کرون نروژ</displayName>
+ </currency>
+ <currency type="OMR">
+ <displayName>ریال عمان</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName references="RP3">روپیهٔ پاکستان</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>ریال قطر</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>روبل روسیه</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>ریال سعودی</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName references="RP5">کرون سوئد</displayName>
+ </currency>
+ <currency type="SGD">
+ <displayName>دلار سنگاپور</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>روبل تاجیکستان</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>سامانی تاجیکستان</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>دینار تونس</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName references="RP3">لیرهٔ ترکیه</displayName>
+ </currency>
+ <currency type="TRY">
+ <displayName references="RP3">لیرهٔ جدید ترکیه</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>دلار امریکا</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName references="RP6">نقره</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName references="RP6">طلا</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName references="RP6">پالادیم</displayName>
+ </currency>
+ <currency type="XPT">
+ <displayName references="RP6">پلاتین</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>ریال یمن</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="R6">نیازهای شرایط محلی برای زبان Ùارسی ایران</reference>
+ <reference type="R7">ISIRI 6219:2002</reference>
+ <reference type="RP1" uri="isbn:964-01-0835-9">زبانهای جهان</reference>
+ <reference type="RP2" uri="isbn:964-303-044-X">دایرةالمعار٠Ùارسی</reference>
+ <reference type="RP3" uri="isbn:964-7531-13-3">دستور خط Ùارسی</reference>
+ <reference type="RP5" uri="isbn:964-342-147-3">اطلس جامع گیتاشناسی</reference>
+ <reference type="RP6">شیوه‌نامه</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/fa_AF.xml b/libs/Zend/Locale/Data/fa_AF.xml
new file mode 100755
index 0000000000..3977037e9f
--- /dev/null
+++ b/libs/Zend/Locale/Data/fa_AF.xml
@@ -0,0 +1,282 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.48.2.1 $"/>
+ <generation date="$Date: 2007/01/04 00:09:46 $"/>
+ <language type="fa"/>
+ <territory type="AF"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="es">هسپانوی</language>
+ <language type="fa">دری</language>
+ <language type="fi">Ùنلندی</language>
+ <language type="ga">آیرلندی</language>
+ <language type="hr">کروشیایی</language>
+ <language type="id">اندونیزیایی</language>
+ <language type="is">آیسلندی</language>
+ <language type="it">ایتالوی</language>
+ <language type="ja">جاپانی</language>
+ <language type="ko">کوریایی</language>
+ <language type="ky">قرغزی</language>
+ <language type="mn">مغلی</language>
+ <language type="ne">نیپالی</language>
+ <language type="nl">هالندی</language>
+ <language type="no">نارویژی</language>
+ <language type="pl">پولندی</language>
+ <language type="pt">پرتگالی</language>
+ <language type="sv">سویدنی</language>
+ <language type="tg">تاجکی</language>
+ </languages>
+ <scripts>
+ <script type="Mong">مغلی</script>
+ </scripts>
+ <territories>
+ <territory type="AD">اندورا</territory>
+ <territory type="AE">امارات متحدهٔ عربی</territory>
+ <territory type="AG">انتیگوا و باربودا</territory>
+ <territory type="AL">البانیا</territory>
+ <territory type="AO">انگولا</territory>
+ <territory type="AR">ارجنتاین</territory>
+ <territory type="AU">آسترالیا</territory>
+ <territory type="BA">بوسنیا و هرزه‌گوینا</territory>
+ <territory type="BD">بنگله‌دیش</territory>
+ <territory type="BE">بلجیم</territory>
+ <territory type="BG">بلغاریا</territory>
+ <territory type="BN">برونی</territory>
+ <territory type="BO">بولیویا</territory>
+ <territory type="BR">برازیل</territory>
+ <territory type="BS">بهاماس</territory>
+ <territory type="BY">روسیهٔ سÙید</territory>
+ <territory type="CD">جمهوری دموکراتیک کانگو</territory>
+ <territory type="CF">اÙریقای مرکزی</territory>
+ <territory type="CG">کانگو</territory>
+ <territory type="CH">سویس</territory>
+ <territory type="CL">چلی</territory>
+ <territory type="CO">کولمبیا</territory>
+ <territory type="CR">کاستریکا</territory>
+ <territory type="CU">کیوبا</territory>
+ <territory type="DK">دنمارک</territory>
+ <territory type="EC">اکوادور</territory>
+ <territory type="EE">استونیا</territory>
+ <territory type="ER">اریتریا</territory>
+ <territory type="ES">هسپانیه</territory>
+ <territory type="ET">ایتوپیا</territory>
+ <territory type="FI">Ùنلند</territory>
+ <territory type="FM">میکرونزیا</territory>
+ <territory type="GD">گرینادا</territory>
+ <territory type="GN">گینیا</territory>
+ <territory type="GQ">گینیا استوایی</territory>
+ <territory type="GT">گواتیمالا</territory>
+ <territory type="GW">گینیا بیسائو</territory>
+ <territory type="GY">گیانا</territory>
+ <territory type="HN">هاندوراس</territory>
+ <territory type="HR">کروشیا</territory>
+ <territory type="HT">هایتی</territory>
+ <territory type="ID">اندونیزیا</territory>
+ <territory type="IE">آیرلند</territory>
+ <territory type="IS">آیسلند</territory>
+ <territory type="JP">جاپان</territory>
+ <territory type="KE">کینیا</territory>
+ <territory type="KG">قرغزستان</territory>
+ <territory type="KH">کمپوچیا</territory>
+ <territory type="KM">کومور</territory>
+ <territory type="KN">سنت کیتس و نیویس</territory>
+ <territory type="KP">کوریای شمالی</territory>
+ <territory type="KR">کوریای جنوبی</territory>
+ <territory type="LK">سریلانکا</territory>
+ <territory type="LS">لیسوتو</territory>
+ <territory type="LT">لتوانیا</territory>
+ <territory type="LV">لاتویا</territory>
+ <territory type="LY">لیبیا</territory>
+ <territory type="MG">مادغاسکر</territory>
+ <territory type="MN">منگولیا</territory>
+ <territory type="MR">موریتانیا</territory>
+ <territory type="MT">مالتا</territory>
+ <territory type="MX">مکسیکو</territory>
+ <territory type="MY">مالیزیا</territory>
+ <territory type="MZ">موزمبیق</territory>
+ <territory type="NG">نیجریا</territory>
+ <territory type="NI">نیکاراگوا</territory>
+ <territory type="NL">هالند</territory>
+ <territory type="NO">ناروی</territory>
+ <territory type="NP">نیپال</territory>
+ <territory type="NZ">زیلاند جدید</territory>
+ <territory type="PA">پانامه</territory>
+ <territory type="PE">پیرو</territory>
+ <territory type="PG">پاپوا نیو گینیا</territory>
+ <territory type="PL">پولند</territory>
+ <territory type="PT">پرتگال</territory>
+ <territory type="PY">پاراگوای</territory>
+ <territory type="RO">رومانیا</territory>
+ <territory type="RW">روآندا</territory>
+ <territory type="SB">جزایر سلومون</territory>
+ <territory type="SE">سویدن</territory>
+ <territory type="SG">سینگاپور</territory>
+ <territory type="SI">سلونیا</territory>
+ <territory type="SK">سلواکیا</territory>
+ <territory type="SL">سیرالیون</territory>
+ <territory type="SN">سینیگال</territory>
+ <territory type="SO">سومالیه</territory>
+ <territory type="ST">سائو تومه و پرینسیپ</territory>
+ <territory type="SV">السلوادور</territory>
+ <territory type="TJ">تاجکستان</territory>
+ <territory type="UA">اکراین</territory>
+ <territory type="US">ایالات متحدهٔ امریکا</territory>
+ <territory type="UY">یوروگوای</territory>
+ <territory type="VC">سنت وینسنت و گرینادین</territory>
+ <territory type="VE">ونزویلا</territory>
+ <territory type="WS">ساموآی غربی</territory>
+ <territory type="ZW">زیمبابوی</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters type="auxiliary" references="RP1">[Ù– Ù° \u200C \u200D Ù¼ Ú Ú… Ú‰ Ú“ Ú– Úš Ú« Ú¼ ÙŠ]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">جنو</month>
+ <month type="5">مـی</month>
+ <month type="6">جون</month>
+ <month type="7">جول</month>
+ <month type="12">دسم</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">جنوری</month>
+ <month type="2">Ùبروری</month>
+ <month type="3">مارچ</month>
+ <month type="4">اپریل</month>
+ <month type="5">می</month>
+ <month type="6">جون</month>
+ <month type="7">جولای</month>
+ <month type="8">اگست</month>
+ <month type="9">سپتمبر</month>
+ <month type="10">اکتوبر</month>
+ <month type="11">نومبر</month>
+ <month type="12">دسمبر</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">ج</month>
+ <month type="2">Ù</month>
+ <month type="3">Ù…</month>
+ <month type="4">ا</month>
+ <month type="5">Ù…</month>
+ <month type="6">ج</month>
+ <month type="7">ج</month>
+ <month type="8">ا</month>
+ <month type="9">س</month>
+ <month type="10">ا</month>
+ <month type="11">Ù†</month>
+ <month type="12">د</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="persian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1">حمل</month>
+ <month type="2">ثور</month>
+ <month type="3">جوزا</month>
+ <month type="4">سرطان</month>
+ <month type="5">اسد</month>
+ <month type="6">سنبلهٔ</month>
+ <month type="7">میزان</month>
+ <month type="8">عقرب</month>
+ <month type="9">قوس</month>
+ <month type="10">جدی</month>
+ <month type="11">دلو</month>
+ <month type="12">حوت</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">Ø­</month>
+ <month type="2">Ø«</month>
+ <month type="3">ج</month>
+ <month type="4">س</month>
+ <month type="5">ا</month>
+ <month type="6">س</month>
+ <month type="8">ع</month>
+ <month type="9">Ù‚</month>
+ <month type="10">ج</month>
+ <month type="11">د</month>
+ <month type="12">Ø­</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>Ù«</decimal>
+ <group>Ù¬</group>
+ <percentSign>Ùª</percentSign>
+ <nativeZeroDigit>Û°</nativeZeroDigit>
+ <minusSign>−</minusSign>
+ </symbols>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>'‪'#,##0%'‬'</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencies>
+ <currency type="AUD">
+ <displayName>دالر آسترالیا</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName>دالر برونی</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>روبل روسیهٔ سÙید</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>دالر کانادا</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Ùرانک سویس</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName>کرون دنمارک</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>ین جاپان</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName>پزوی مکسیکو</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>گیلدر هالند</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>کرون ناروی</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>کرون سویدن</displayName>
+ </currency>
+ <currency type="SGD">
+ <displayName>دالر سینگاپور</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>سامانی تاجکستان</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>دالر امریکا</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1" uri="http://www.evertype.com/standards/af/">Computer Locale Requirements for Afghanistan</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/fa_IR.xml b/libs/Zend/Locale/Data/fa_IR.xml
new file mode 100755
index 0000000000..1d19d2c205
--- /dev/null
+++ b/libs/Zend/Locale/Data/fa_IR.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.45 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="fa"/>
+ <territory type="IR"/>
+ </identity>
+</ldml>
diff --git a/libs/Zend/Locale/Data/fi.xml b/libs/Zend/Locale/Data/fi.xml
new file mode 100755
index 0000000000..b25a5a961a
--- /dev/null
+++ b/libs/Zend/Locale/Data/fi.xml
@@ -0,0 +1,2236 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.76 $"/>
+ <generation date="$Date: 2006/10/26 22:46:08 $"/>
+ <language type="fi"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">afar</language>
+ <language type="ab">abhaasi</language>
+ <language type="ace">aceh</language>
+ <language type="ach">atšoli</language>
+ <language type="ada">adangme</language>
+ <language type="ady">adyge</language>
+ <language type="ae">avesta</language>
+ <language type="af">afrikaans</language>
+ <language type="afa">muut afroaasialaiset kielet</language>
+ <language type="afh">afrihili</language>
+ <language type="ain">ainu</language>
+ <language type="ak">akan</language>
+ <language type="akk">akkadi</language>
+ <language type="ale">aleutti</language>
+ <language type="alg">algonkin-kielet</language>
+ <language type="alt">altai</language>
+ <language type="am">amhara</language>
+ <language type="an">aragonia</language>
+ <language type="ang">muinaisenglanti</language>
+ <language type="anp">angika</language>
+ <language type="apa">apaššikielet</language>
+ <language type="ar">arabia</language>
+ <language type="arc">aramea</language>
+ <language type="arn">araukaani</language>
+ <language type="arp">arapaho</language>
+ <language type="art">muut keinotekoiset kielet</language>
+ <language type="arw">arawak</language>
+ <language type="as">assami</language>
+ <language type="ast">asturia</language>
+ <language type="ath">athabasca-kielet</language>
+ <language type="aus">australialaiset kielet</language>
+ <language type="av">avaari</language>
+ <language type="awa">awadhi</language>
+ <language type="ay">aimara</language>
+ <language type="az">azeri</language>
+ <language type="ba">baškiiri</language>
+ <language type="bad">banda</language>
+ <language type="bai">bamileke-kielet</language>
+ <language type="bal">belutši</language>
+ <language type="ban">bali</language>
+ <language type="bas">basa</language>
+ <language type="bat">muut balttilaiset kielet</language>
+ <language type="be">valkovenäjä</language>
+ <language type="bej">bedža</language>
+ <language type="bem">bemba</language>
+ <language type="ber">muut berberikielet</language>
+ <language type="bg">bulgaria</language>
+ <language type="bh">bihari</language>
+ <language type="bho">bhodžpuri</language>
+ <language type="bi">bislama</language>
+ <language type="bik">bikol</language>
+ <language type="bin">bini</language>
+ <language type="bla">mustajalka</language>
+ <language type="bm">bambara</language>
+ <language type="bn">bengali</language>
+ <language type="bnt">muut bantukielet</language>
+ <language type="bo">tiibet</language>
+ <language type="br">bretoni</language>
+ <language type="bra">bradž</language>
+ <language type="bs">bosnia</language>
+ <language type="btk">batak</language>
+ <language type="bua">burjaatti</language>
+ <language type="bug">bugi</language>
+ <language type="byn">bilin</language>
+ <language type="ca">katalaani</language>
+ <language type="cad">caddo</language>
+ <language type="cai">muut Keski-Amerikan intiaanikielet</language>
+ <language type="car">karibi</language>
+ <language type="cau">muut kaukasialaiset kielet</language>
+ <language type="ce">tšetšeeni</language>
+ <language type="ceb">cebuano</language>
+ <language type="cel">muut kelttiläiset kielet</language>
+ <language type="ch">tšamorro</language>
+ <language type="chb">tšibtša</language>
+ <language type="chg">tšagatai</language>
+ <language type="chk">chuuk</language>
+ <language type="chm">mari</language>
+ <language type="chn">chinook-jargon</language>
+ <language type="cho">choctaw</language>
+ <language type="chp">chipewyan</language>
+ <language type="chr">cherokee</language>
+ <language type="chy">cheyenne</language>
+ <language type="cmc">tšam-kielet</language>
+ <language type="co">korsika</language>
+ <language type="cop">kopti</language>
+ <language type="cpe">muut englantiin perustuvat kreolit ja pidginit</language>
+ <language type="cpf">muut ranskaan perustuvat kreolit ja pidginit</language>
+ <language type="cpp">muut portugaliin perustuvat kreolit ja pidginit</language>
+ <language type="cr">cree</language>
+ <language type="crh">krimintataari; kriminturkki</language>
+ <language type="crp">muut kreolit ja pidginit</language>
+ <language type="cs">tšekki</language>
+ <language type="csb">kašubi</language>
+ <language type="cu">kirkkoslaavi</language>
+ <language type="cus">muut kuušilaiset kielet</language>
+ <language type="cv">tšuvassi</language>
+ <language type="cy">kymri</language>
+ <language type="da">tanska</language>
+ <language type="dak">dakota</language>
+ <language type="dar">dargi</language>
+ <language type="day">dajakki</language>
+ <language type="de">saksa</language>
+ <language type="del">delaware</language>
+ <language type="den">slevi</language>
+ <language type="dgr">dogrib</language>
+ <language type="din">dinka</language>
+ <language type="doi">dogri</language>
+ <language type="dra">muut dravidakielet</language>
+ <language type="dsb">alasorbi</language>
+ <language type="dua">duala</language>
+ <language type="dum">keskihollanti</language>
+ <language type="dv">divehi</language>
+ <language type="dyu">djula</language>
+ <language type="dz">dzongkha</language>
+ <language type="ee">ewe</language>
+ <language type="efi">efik</language>
+ <language type="egy">muinaisegypti</language>
+ <language type="eka">ekajuk</language>
+ <language type="el">kreikka</language>
+ <language type="elx">elami</language>
+ <language type="en">englanti</language>
+ <language type="enm">keskienglanti</language>
+ <language type="eo">esperanto</language>
+ <language type="es">espanja</language>
+ <language type="et">viro</language>
+ <language type="eu">baski</language>
+ <language type="ewo">ewondo</language>
+ <language type="fa" references="R1">farsi; persia</language>
+ <language type="fan">fang</language>
+ <language type="fat">fanti</language>
+ <language type="ff">fulani</language>
+ <language type="fi">suomi</language>
+ <language type="fil">filipino</language>
+ <language type="fiu">muut suomalais-ugrilaiset kielet</language>
+ <language type="fj">fidži</language>
+ <language type="fo">fääri</language>
+ <language type="fon">fon</language>
+ <language type="fr">ranska</language>
+ <language type="frm">keskiranska</language>
+ <language type="fro">muinaisranska</language>
+ <language type="frr">pohjoisfriisi</language>
+ <language type="frs">itäfriisi</language>
+ <language type="fur">friuli</language>
+ <language type="fy">länsifriisi</language>
+ <language type="ga">iiri</language>
+ <language type="gaa">ga</language>
+ <language type="gay">gajo</language>
+ <language type="gba">gbaja</language>
+ <language type="gd">gaeli</language>
+ <language type="gem">muut germaaniset kielet</language>
+ <language type="gez">ge’ez</language>
+ <language type="gil">kiribati</language>
+ <language type="gl">galicia</language>
+ <language type="gmh">keskiyläsaksa</language>
+ <language type="gn">guarani</language>
+ <language type="goh">muinaisyläsaksa</language>
+ <language type="gon">gondi</language>
+ <language type="gor">gorontalo</language>
+ <language type="got">gootti</language>
+ <language type="grb">grebo</language>
+ <language type="grc">muinaiskreikka</language>
+ <language type="gsw">sveitsinsaksa</language>
+ <language type="gu" references="R1">gudžarati</language>
+ <language type="gv">manx</language>
+ <language type="gwi">gwitšin</language>
+ <language type="ha">hausa</language>
+ <language type="hai">haida</language>
+ <language type="haw">havaiji</language>
+ <language type="he">heprea</language>
+ <language type="hi">hindi</language>
+ <language type="hil">hiligaino</language>
+ <language type="him">himatšali</language>
+ <language type="hit">heetti</language>
+ <language type="hmn">hmong</language>
+ <language type="ho">hiri-motu</language>
+ <language type="hr">kroatia</language>
+ <language type="hsb">yläsorbi</language>
+ <language type="ht">haiti</language>
+ <language type="hu">unkari</language>
+ <language type="hup">hupa</language>
+ <language type="hy">armenia</language>
+ <language type="hz">herero</language>
+ <language type="ia">interlingua</language>
+ <language type="iba">iban</language>
+ <language type="id">indonesia</language>
+ <language type="ie">interlingue</language>
+ <language type="ig">igbo</language>
+ <language type="ii">sichuanin-yi</language>
+ <language type="ijo">idžo</language>
+ <language type="ik">inupiatun</language>
+ <language type="ilo">iloko</language>
+ <language type="inc">muut indoarjalaiset kielet</language>
+ <language type="ine">muut indoeurooppalaiset kielet</language>
+ <language type="inh">inguuši</language>
+ <language type="io">ido</language>
+ <language type="ira">muut iranilaiset kielet</language>
+ <language type="iro">irokeesikielet</language>
+ <language type="is">islanti</language>
+ <language type="it">italia</language>
+ <language type="iu">inuktitut</language>
+ <language type="ja">japani</language>
+ <language type="jbo">lojban</language>
+ <language type="jpr">juutalaispersia</language>
+ <language type="jrb">juutalaisarabia</language>
+ <language type="jv">jaava</language>
+ <language type="ka">georgia</language>
+ <language type="kaa">karakalpakki</language>
+ <language type="kab">kabyyli</language>
+ <language type="kac">kachin</language>
+ <language type="kam">kamba</language>
+ <language type="kar">karen</language>
+ <language type="kaw">kavi</language>
+ <language type="kbd">kabardi</language>
+ <language type="kg">kongo</language>
+ <language type="kha">khasi</language>
+ <language type="khi">muut khoisan-kielet</language>
+ <language type="kho">khotani</language>
+ <language type="ki">kikuju</language>
+ <language type="kj">kuanjama</language>
+ <language type="kk">kazakki</language>
+ <language type="kl">kalaallisut; grönlanti</language>
+ <language type="km">khmer</language>
+ <language type="kmb">kimbundu</language>
+ <language type="kn">kannada</language>
+ <language type="ko">korea</language>
+ <language type="kok">konkani</language>
+ <language type="kos">kosrae</language>
+ <language type="kpe">kpelle</language>
+ <language type="kr">kanuri</language>
+ <language type="krc">karatšai-balkaari</language>
+ <language type="krl">karjala</language>
+ <language type="kro">kru-kielet</language>
+ <language type="kru">kurukh</language>
+ <language type="ks">kašmiri</language>
+ <language type="ku">kurdi</language>
+ <language type="kum">kumykki</language>
+ <language type="kut">kutenai</language>
+ <language type="kv">komi</language>
+ <language type="kw">korni</language>
+ <language type="ky">kirgiisi</language>
+ <language type="la">latina</language>
+ <language type="lad">ladino; juutalaisespanja</language>
+ <language type="lah">lahnda</language>
+ <language type="lam">lamba</language>
+ <language type="lb">luxemburg</language>
+ <language type="lez">lezgi</language>
+ <language type="lg">ganda</language>
+ <language type="li">limburg</language>
+ <language type="ln">lingala</language>
+ <language type="lo">lao</language>
+ <language type="lol">mongo</language>
+ <language type="loz">lozi</language>
+ <language type="lt">liettua</language>
+ <language type="lu">luba (Katanga)</language>
+ <language type="lua">luba (Lulua)</language>
+ <language type="lui">luiseño</language>
+ <language type="lun">lunda</language>
+ <language type="luo">luo</language>
+ <language type="lus">lusai</language>
+ <language type="lv">latvia</language>
+ <language type="mad">madura</language>
+ <language type="mag">magahi</language>
+ <language type="mai">maithili</language>
+ <language type="mak">makassar</language>
+ <language type="man">mandingo</language>
+ <language type="map">muut austronesialaiset kielet</language>
+ <language type="mas">maasai</language>
+ <language type="mdf">mokša</language>
+ <language type="mdr">mandar</language>
+ <language type="men">mende</language>
+ <language type="mg">malagassi</language>
+ <language type="mga">keski-iiri</language>
+ <language type="mh">marshall</language>
+ <language type="mi">maori</language>
+ <language type="mic">micmac</language>
+ <language type="min">minangkabau</language>
+ <language type="mis">luokittelemattomat kielet</language>
+ <language type="mk">makedonia</language>
+ <language type="mkh">muut mon-khmer-kielet</language>
+ <language type="ml">malajalam</language>
+ <language type="mn">mongoli</language>
+ <language type="mnc">mantšu</language>
+ <language type="mni">manipuri</language>
+ <language type="mno">manobo-kielet</language>
+ <language type="mo">moldavia</language>
+ <language type="moh">mohawk</language>
+ <language type="mos">mossi</language>
+ <language type="mr">marathi</language>
+ <language type="ms">malaiji</language>
+ <language type="mt">malta</language>
+ <language type="mul">monia kieliä</language>
+ <language type="mun">mundakielet</language>
+ <language type="mus">creek</language>
+ <language type="mwl">mirandeesi</language>
+ <language type="mwr">marwari</language>
+ <language type="my">burma</language>
+ <language type="myn">maya-kielet</language>
+ <language type="myv">ersä</language>
+ <language type="na">nauru</language>
+ <language type="nah">nahuatl</language>
+ <language type="nai">muut Pohjois-Amerikan intiaanikielet</language>
+ <language type="nap">napoli</language>
+ <language type="nb">norja (bokmål)</language>
+ <language type="nd">ndebele, pohjois-</language>
+ <language type="nds">alasaksa</language>
+ <language type="ne">nepali</language>
+ <language type="new">newari</language>
+ <language type="ng">ndonga</language>
+ <language type="nia">nias</language>
+ <language type="nic">muut nigeriläis-kongolaiset kielet</language>
+ <language type="niu">niue</language>
+ <language type="nl">hollanti</language>
+ <language type="nn">norja (nynorsk)</language>
+ <language type="no">norja</language>
+ <language type="nog">nogai</language>
+ <language type="non">muinaisnorja</language>
+ <language type="nr">ndebele, etelä-</language>
+ <language type="nso">sotho, pohjois-</language>
+ <language type="nub">nubialaiset kielet</language>
+ <language type="nv">navajo</language>
+ <language type="nwc">klassinen newari</language>
+ <language type="ny">njandža</language>
+ <language type="nym">nyamwezi</language>
+ <language type="nyn">nyankole</language>
+ <language type="nyo">nyoro</language>
+ <language type="nzi">nzima</language>
+ <language type="oc">oksitaani</language>
+ <language type="oj">odžibwa</language>
+ <language type="om">oromo</language>
+ <language type="or">orija</language>
+ <language type="os">osseetti</language>
+ <language type="osa">osage</language>
+ <language type="ota">osmani</language>
+ <language type="oto">otomi-kielet</language>
+ <language type="pa">pandžabi</language>
+ <language type="paa">muut papualaiskielet</language>
+ <language type="pag">pangasinan</language>
+ <language type="pal">pahlavi</language>
+ <language type="pam">pampanga</language>
+ <language type="pap">papiamentu</language>
+ <language type="pau">palau</language>
+ <language type="peo">muinaispersia</language>
+ <language type="phi">muut filippiiniläiset kielet</language>
+ <language type="phn">foinikia</language>
+ <language type="pi">paali</language>
+ <language type="pl">puola</language>
+ <language type="pon">pohnpei</language>
+ <language type="pra">prakrit-kielet</language>
+ <language type="pro">muinaisprovensaali</language>
+ <language type="ps">paštu</language>
+ <language type="pt">portugali</language>
+ <language type="qu">ketšua</language>
+ <language type="raj">radžastani</language>
+ <language type="rap">rapanui</language>
+ <language type="rar">rarotonga</language>
+ <language type="rm">retoromaani</language>
+ <language type="rn">rundi</language>
+ <language type="ro">romania</language>
+ <language type="roa">muut romaaniset kielet</language>
+ <language type="rom">romani</language>
+ <language type="root">juuri</language>
+ <language type="ru">venäjä</language>
+ <language type="rup">aromania</language>
+ <language type="rw">ruanda</language>
+ <language type="sa">sanskrit</language>
+ <language type="sad">sandawe</language>
+ <language type="sah">jakuutti</language>
+ <language type="sai">muut Etelä-Amerikan intiaanikielet</language>
+ <language type="sal">sališilaiset kielet</language>
+ <language type="sam">samarianaramea</language>
+ <language type="sas">sasak</language>
+ <language type="sat">santali</language>
+ <language type="sc">sardi</language>
+ <language type="scn">sisilia</language>
+ <language type="sco">skotti</language>
+ <language type="sd">sindhi</language>
+ <language type="se">saame, pohjois-</language>
+ <language type="sel">selkuppi</language>
+ <language type="sem">muut seemiläiset kielet</language>
+ <language type="sg">sango</language>
+ <language type="sga">muinaisiiri</language>
+ <language type="sgn">viittomakielet</language>
+ <language type="shn">shan</language>
+ <language type="si">sinhali</language>
+ <language type="sid">sidamo</language>
+ <language type="sio">sioux-kielet</language>
+ <language type="sit">muut sinotiibetiläiset kielet</language>
+ <language type="sk">slovakki</language>
+ <language type="sl">sloveeni</language>
+ <language type="sla">muut slaavilaiset kielet</language>
+ <language type="sm">samoa</language>
+ <language type="sma">saame, etelä-</language>
+ <language type="smi">muut saamelaiskielet</language>
+ <language type="smj">saame, luulajan-</language>
+ <language type="smn">saame, inarin-</language>
+ <language type="sms">saame, koltan-</language>
+ <language type="sn">Å¡ona</language>
+ <language type="snk">soninke</language>
+ <language type="so">somali</language>
+ <language type="sog">sogdi</language>
+ <language type="son">songhai</language>
+ <language type="sq">albania</language>
+ <language type="sr">serbia</language>
+ <language type="srn">sranan</language>
+ <language type="srr">serer</language>
+ <language type="ss">swazi</language>
+ <language type="ssa">muut niililäis-saharalaiset kielet</language>
+ <language type="st">sotho, etelä-</language>
+ <language type="su">sunda</language>
+ <language type="suk">sukuma</language>
+ <language type="sus">susu</language>
+ <language type="sux">sumeri</language>
+ <language type="sv">ruotsi</language>
+ <language type="sw">swahili</language>
+ <language type="syr">syyria</language>
+ <language type="ta">tamil</language>
+ <language type="tai">muut thaikielet</language>
+ <language type="te">telugu</language>
+ <language type="tem">temne</language>
+ <language type="ter">tereno</language>
+ <language type="tet">tetum</language>
+ <language type="tg">tadžikki</language>
+ <language type="th">thai</language>
+ <language type="ti">tigrinja</language>
+ <language type="tig">tigre</language>
+ <language type="tiv">tiv</language>
+ <language type="tk">turkmeeni</language>
+ <language type="tkl">tokelau</language>
+ <language type="tl">tagalog</language>
+ <language type="tlh">klingon</language>
+ <language type="tli">tlingit</language>
+ <language type="tmh">tamašek</language>
+ <language type="tn">tswana</language>
+ <language type="to">tonga (Tonga)</language>
+ <language type="tog">tonga (Malawi)</language>
+ <language type="tpi">tok-pisin</language>
+ <language type="tr">turkki</language>
+ <language type="ts">tsonga</language>
+ <language type="tsi">tsimši</language>
+ <language type="tt">tataari</language>
+ <language type="tum">tumbuka</language>
+ <language type="tup">tupi-kielet</language>
+ <language type="tut">muut altailaiset kielet</language>
+ <language type="tvl">tuvalu</language>
+ <language type="tw">twi</language>
+ <language type="ty">tahiti</language>
+ <language type="tyv">tuva</language>
+ <language type="udm">udmurtti</language>
+ <language type="ug">uiguuri</language>
+ <language type="uga">ugarit</language>
+ <language type="uk">ukraina</language>
+ <language type="umb">umbundu</language>
+ <language type="und">määrittämätön</language>
+ <language type="ur">urdu</language>
+ <language type="uz">uzbekki</language>
+ <language type="vai">vai</language>
+ <language type="ve">venda</language>
+ <language type="vi">vietnam</language>
+ <language type="vo">volapük</language>
+ <language type="vot">vatja</language>
+ <language type="wa">valloni</language>
+ <language type="wak">wakash-kielet</language>
+ <language type="wal">walamo</language>
+ <language type="war">waray</language>
+ <language type="was">washo</language>
+ <language type="wen">sorbin kielet</language>
+ <language type="wo">wolof</language>
+ <language type="xal">kalmukki</language>
+ <language type="xh">xhosa</language>
+ <language type="yao">jao</language>
+ <language type="yap">japi</language>
+ <language type="yi">jiddiš</language>
+ <language type="yo">joruba</language>
+ <language type="ypk">jupikkikielet</language>
+ <language type="za">zhuang</language>
+ <language type="zap">sapoteekki</language>
+ <language type="zen">zenaga</language>
+ <language type="zh">kiina</language>
+ <language type="znd">zande</language>
+ <language type="zu">zulu</language>
+ <language type="zun">zuni</language>
+ <language type="zxx">ei kielellistä sisältöä</language>
+ </languages>
+ <scripts>
+ <script type="Arab">arabialainen</script>
+ <script type="Armn">armenialainen</script>
+ <script type="Bali">balilainen</script>
+ <script type="Batk">batakilainen</script>
+ <script type="Beng">bengalilainen</script>
+ <script type="Blis">Bliss-symbolit</script>
+ <script type="Bopo">bopomofo</script>
+ <script type="Brah">brahmi</script>
+ <script type="Brai">pistekirjoitus (Braille)</script>
+ <script type="Bugi">bugilainen</script>
+ <script type="Buhd">buhidilainen</script>
+ <script type="Cans">Kanadan alkuperäiskansojen yhtenäistetty tavukirjoitus</script>
+ <script type="Cham">tšamilainen</script>
+ <script type="Cher">cherokeelainen</script>
+ <script type="Cirt" references="RP1">cirth</script>
+ <script type="Copt">koptilainen</script>
+ <script type="Cprt">muinaiskyproslainen</script>
+ <script type="Cyrl">kyrillinen</script>
+ <script type="Cyrs">kyrillinen (muinaiskirkkoslaavimuunnelma)</script>
+ <script type="Deva">devanagari</script>
+ <script type="Dsrt">deseret</script>
+ <script type="Egyd">egyptiläinen demoottinen</script>
+ <script type="Egyh">egyptiläinen hieraattinen</script>
+ <script type="Egyp">egyptiläiset hieroglyfit</script>
+ <script type="Ethi">etiopialainen (ge’ez)</script>
+ <script type="Geok">muinaisgeorgialainen (khutsuri)</script>
+ <script type="Geor">georgialainen (mkhedruli)</script>
+ <script type="Glag">glagoliittinen</script>
+ <script type="Goth">goottilainen</script>
+ <script type="Grek">kreikkalainen</script>
+ <script type="Gujr">gudžaratilainen</script>
+ <script type="Guru">gurmukhi</script>
+ <script type="Hang">hangul</script>
+ <script type="Hani">kiinalainen (han)</script>
+ <script type="Hano">hanunoolainen</script>
+ <script type="Hans">kiinalainen (han), yksinkertaistettu</script>
+ <script type="Hant">kiinalainen (han), perinteinen</script>
+ <script type="Hebr">heprealainen</script>
+ <script type="Hira">hiragana</script>
+ <script type="Hmng">pahawh hmong</script>
+ <script type="Hrkt">hiragana+katakana</script>
+ <script type="Hung">muinaisunkarilainen</script>
+ <script type="Inds">induslainen</script>
+ <script type="Ital">muinaisitalialainen</script>
+ <script type="Java">jaavalainen</script>
+ <script type="Kali">kayah li</script>
+ <script type="Kana">katakana</script>
+ <script type="Khar">kharoshthi</script>
+ <script type="Khmr">khmeriläinen</script>
+ <script type="Knda">kannadalainen</script>
+ <script type="Laoo">laolainen</script>
+ <script type="Latf">latinalainen (fraktuuramuunnelma)</script>
+ <script type="Latg">latinalainen (gaelimuunnelma)</script>
+ <script type="Latn">latinalainen</script>
+ <script type="Lepc">lepchalainen</script>
+ <script type="Limb">limbulainen</script>
+ <script type="Lina">lineaari-A</script>
+ <script type="Linb">lineaari-B</script>
+ <script type="Mand">mandealainen</script>
+ <script type="Maya">maya-hieroglyfit</script>
+ <script type="Mero">meroiittinen</script>
+ <script type="Mlym">malajalamilainen</script>
+ <script type="Mong">mongolilainen</script>
+ <script type="Mymr">burmalainen</script>
+ <script type="Nkoo">n'ko</script>
+ <script type="Ogam">ogam</script>
+ <script type="Orkh">orkhon</script>
+ <script type="Orya">orijalainen</script>
+ <script type="Osma">osmanjalainen</script>
+ <script type="Perm">muinaispermiläinen</script>
+ <script type="Phag">phags-pa</script>
+ <script type="Phnx">foinikialainen</script>
+ <script type="Plrd">Pollardin foneettinen</script>
+ <script type="Qaai">peritty</script>
+ <script type="Roro">rongorongo</script>
+ <script type="Runr">riimukirjoitus</script>
+ <script type="Sara" references="RP1">sarati</script>
+ <script type="Shaw">shaw’lainen</script>
+ <script type="Sinh">sinhalilainen</script>
+ <script type="Sylo">syloti nagri</script>
+ <script type="Syrc">syyrialainen</script>
+ <script type="Syre">syyrialainen (estrangelo-muunnelma)</script>
+ <script type="Syrj">syyrialainen (läntinen muunnelma)</script>
+ <script type="Syrn">syyrialainen (itäinen muunnelma)</script>
+ <script type="Tagb">tagbanwalainen</script>
+ <script type="Tale">tailelainen</script>
+ <script type="Talu">uusi tailuelainen</script>
+ <script type="Taml">tamililainen</script>
+ <script type="Telu">telugulainen</script>
+ <script type="Teng" references="RP1">tengwar</script>
+ <script type="Tfng">tifinagh</script>
+ <script type="Tglg">tagalogilainen</script>
+ <script type="Thaa">thaana</script>
+ <script type="Thai">thailainen</script>
+ <script type="Tibt">tiibetiläinen</script>
+ <script type="Ugar">ugaritilainen</script>
+ <script type="Vaii">vailainen</script>
+ <script type="Visp">näkyvä puhe (Visible Speech)</script>
+ <script type="Xpeo">muinaispersialainen</script>
+ <script type="Xsux">nuolenpääkirjoitus, sumerilais-akkadilainen</script>
+ <script type="Yiii">yiläinen</script>
+ <script type="Zxxx">kirjoittamaton</script>
+ <script type="Zyyy">määrittämätön</script>
+ <script type="Zzzz">määrittelemätön</script>
+ </scripts>
+ <territories>
+ <territory type="001">maailma</territory>
+ <territory type="002">Afrikka</territory>
+ <territory type="005">Etelä-Amerikka</territory>
+ <territory type="009">Oseania</territory>
+ <territory type="011">Länsi-Afrikka</territory>
+ <territory type="013">Väli-Amerikka</territory>
+ <territory type="014">Itä-Afrikka</territory>
+ <territory type="015">Pohjois-Afrikka</territory>
+ <territory type="017">Keski-Afrikka</territory>
+ <territory type="018">eteläinen Afrikka</territory>
+ <territory type="019">Amerikka</territory>
+ <territory type="021">Pohjois-Amerikka</territory>
+ <territory type="029">Karibia</territory>
+ <territory type="030">Itä-Aasia</territory>
+ <territory type="034">Etelä-Aasia</territory>
+ <territory type="035">Kaakkois-Aasia</territory>
+ <territory type="039">Etelä-Eurooppa</territory>
+ <territory type="053">Australia ja Uusi-Seelanti</territory>
+ <territory type="054">Melanesia</territory>
+ <territory type="057">Mikronesia</territory>
+ <territory type="061">Polynesia</territory>
+ <territory type="142">Aasia</territory>
+ <territory type="143">Keski-Aasia</territory>
+ <territory type="145">Länsi-Aasia</territory>
+ <territory type="150">Eurooppa</territory>
+ <territory type="151">Itä-Eurooppa</territory>
+ <territory type="154">Pohjois-Eurooppa</territory>
+ <territory type="155">Länsi-Eurooppa</territory>
+ <territory type="172">Itsenäisten valtioiden yhteisö</territory>
+ <territory type="419">Latinalainen Amerikka ja Karibia</territory>
+ <territory type="830">Kanaalisaaret</territory>
+ <territory type="IM">Mansaari</territory>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Arabiemiirikunnat</territory>
+ <territory type="AF">Afganistan</territory>
+ <territory type="AG">Antigua ja Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albania</territory>
+ <territory type="AM">Armenia</territory>
+ <territory type="AN">Alankomaiden Antillit</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktis</territory>
+ <territory type="AR">Argentiina</territory>
+ <territory type="AS">Amerikan Samoa</territory>
+ <territory type="AT">Itävalta</territory>
+ <territory type="AU">Australia</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Ahvenanmaa</territory>
+ <territory type="AZ">Azerbaidžan</territory>
+ <territory type="BA">Bosnia ja Hertsegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BE">Belgia</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgaria</territory>
+ <territory type="BH">Bahrain</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei</territory>
+ <territory type="BO">Bolivia</territory>
+ <territory type="BR">Brasilia</territory>
+ <territory type="BS">Bahama</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BV">Bouvet’nsaari</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Valko-Venäjä</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Kookossaaret</territory>
+ <territory type="CD">Kongo (Kinshasa)</territory>
+ <territory type="CF">Keski-Afrikan tasavalta</territory>
+ <territory type="CG">Kongo (Brazzaville)</territory>
+ <territory type="CH">Sveitsi</territory>
+ <territory type="CI">Norsunluurannikko</territory>
+ <territory type="CK">Cookinsaaret</territory>
+ <territory type="CL">Chile</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Kiina</territory>
+ <territory type="CO">Kolumbia</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS">Serbia ja Montenegro</territory>
+ <territory type="CU">Kuuba</territory>
+ <territory type="CV">Kap Verde</territory>
+ <territory type="CX">Joulusaari</territory>
+ <territory type="CY">Kypros</territory>
+ <territory type="CZ">TÅ¡ekki</territory>
+ <territory type="DE">Saksa</territory>
+ <territory type="DJ">Djibouti</territory>
+ <territory type="DK">Tanska</territory>
+ <territory type="DM">Dominica</territory>
+ <territory type="DO">Dominikaaninen tasavalta</territory>
+ <territory type="DZ">Algeria</territory>
+ <territory type="EC">Ecuador</territory>
+ <territory type="EE">Viro</territory>
+ <territory type="EG">Egypti</territory>
+ <territory type="EH">Länsi-Sahara</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Espanja</territory>
+ <territory type="ET">Etiopia</territory>
+ <territory type="FI">Suomi</territory>
+ <territory type="FJ">Fidži</territory>
+ <territory type="FK">Falklandinsaaret</territory>
+ <territory type="FM">Mikronesian liittovaltio</territory>
+ <territory type="FO">Färsaaret</territory>
+ <territory type="FR">Ranska</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Britannia</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Georgia</territory>
+ <territory type="GF">Ranskan Guayana</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Grönlanti</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Päiväntasaajan Guinea</territory>
+ <territory type="GR">Kreikka</territory>
+ <territory type="GS">Etelä-Georgia ja Eteläiset Sandwichsaaret</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinea-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Hongkong, Kiinan erityishallintoalue</territory>
+ <territory type="HM">Heard- ja McDonaldinsaaret</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Kroatia</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Unkari</territory>
+ <territory type="ID">Indonesia</territory>
+ <territory type="IE">Irlanti</territory>
+ <territory type="IL">Israel</territory>
+ <territory type="IN">Intia</territory>
+ <territory type="IO">Brittiläinen Intian valtameren alue</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Islanti</territory>
+ <territory type="IT">Italia</territory>
+ <territory type="JM">Jamaika</territory>
+ <territory type="JO">Jordania</territory>
+ <territory type="JP">Japani</territory>
+ <territory type="KE">Kenia</territory>
+ <territory type="KG">Kirgisia</territory>
+ <territory type="KH">Kambodža</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komorit</territory>
+ <territory type="KN">Saint Kitts ja Nevis</territory>
+ <territory type="KP">Pohjois-Korea</territory>
+ <territory type="KR">Etelä-Korea</territory>
+ <territory type="KW">Kuwait</territory>
+ <territory type="KY">Caymansaaret</territory>
+ <territory type="KZ">Kazakstan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Libanon</territory>
+ <territory type="LC">Saint Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberia</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Liettua</territory>
+ <territory type="LU">Luxemburg</territory>
+ <territory type="LV">Latvia</territory>
+ <territory type="LY">Libya</territory>
+ <territory type="MA">Marokko</territory>
+ <territory type="MC">Monaco</territory>
+ <territory type="MD">Moldova</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshallinsaaret</territory>
+ <territory type="MK">Makedonia</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongolia</territory>
+ <territory type="MO">Macao, Kiinan erityishallintoalue</territory>
+ <territory type="MP">Pohjois-Mariaanit</territory>
+ <territory type="MQ">Martinique</territory>
+ <territory type="MR">Mauritania</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Malediivit</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Meksiko</territory>
+ <territory type="MY">Malesia</territory>
+ <territory type="MZ">Mosambik</territory>
+ <territory type="NA">Namibia</territory>
+ <territory type="NC">Uusi-Kaledonia</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Norfolkinsaari</territory>
+ <territory type="NG">Nigeria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Alankomaat</territory>
+ <territory type="NO">Norja</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Uusi-Seelanti</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Ranskan Polynesia</territory>
+ <territory type="PG">Papua-Uusi-Guinea</territory>
+ <territory type="PH">Filippiinit</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Puola</territory>
+ <territory type="PM">Saint-Pierre ja Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Puerto Rico</territory>
+ <territory type="PS">Palestiina</territory>
+ <territory type="PT">Portugali</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Qatar</territory>
+ <territory type="QO">ulkomeri</territory>
+ <territory type="RE">Réunion</territory>
+ <territory type="RO">Romania</territory>
+ <territory type="RU">Venäjä</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SA">Saudi-Arabia</territory>
+ <territory type="SB">Salomonsaaret</territory>
+ <territory type="SC">Seychellit</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Ruotsi</territory>
+ <territory type="SG">Singapore</territory>
+ <territory type="SH">Saint Helena</territory>
+ <territory type="SI">Slovenia</territory>
+ <territory type="SJ">Huippuvuoret ja Jan Mayen</territory>
+ <territory type="SK">Slovakia</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalia</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">São Tomé ja Príncipe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Syyria</territory>
+ <territory type="SZ">Swazimaa</territory>
+ <territory type="TC">Turks- ja Caicossaaret</territory>
+ <territory type="TD">TÅ¡ad</territory>
+ <territory type="TF">Ranskan ulkopuoliset eteläiset alueet</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Thaimaa</territory>
+ <territory type="TJ">Tadžikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Itä-Timor</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunisia</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turkki</territory>
+ <territory type="TT">Trinidad ja Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TZ">Tansania</territory>
+ <territory type="UA">Ukraina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">Yhdysvaltain pienet erillissaaret</territory>
+ <territory type="US">Yhdysvallat</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Uzbekistan</territory>
+ <territory type="VA">Vatikaani</territory>
+ <territory type="VC">Saint Vincent ja Grenadiinit</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Brittiläiset Neitsytsaaret</territory>
+ <territory type="VI">Yhdysvaltain Neitsytsaaret</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis ja Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Etelä-Afrikka</territory>
+ <territory type="ZM">Sambia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ <variants>
+ <variant type="1901">saksan perinteinen oikeinkirjoitus</variant>
+ <variant type="1996">saksan uusi oikeinkirjoitus</variant>
+ <variant type="NEDIS">sloveenin natisone-murre</variant>
+ <variant type="POLYTONI">polytoninen kreikka</variant>
+ <variant type="REVISED">uudistettu oikeinkirjoitus</variant>
+ <variant type="ROZAJ">sloveenin resia-murre</variant>
+ <variant type="SAAHO">afarin saho-murre</variant>
+ </variants>
+ <keys>
+ <key type="calendar">kalenteri</key>
+ <key type="collation">lajittelu</key>
+ <key type="currency">valuutta</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">perinteinen kiinalainen (Big5)</type>
+ <type type="buddhist" key="calendar">buddhalainen kalenteri</type>
+ <type type="chinese" key="calendar">kiinalainen kalenteri</type>
+ <type type="direct" key="collation">suora järjestys</type>
+ <type type="gb2312han" key="collation">yksinkertaistettu kiinalainen (GB2312)</type>
+ <type type="gregorian" key="calendar">gregoriaaninen kalenteri</type>
+ <type type="hebrew" key="calendar">juutalainen kalenteri</type>
+ <type type="islamic" key="calendar">islamilainen kalenteri</type>
+ <type type="islamic-civil" key="calendar">islamilainen siviilikalenteri</type>
+ <type type="japanese" key="calendar">japanilainen kalenteri</type>
+ <type type="phonebook" key="collation">puhelinluettelojärjestys</type>
+ <type type="pinyin" key="collation">pinyin-järjestys</type>
+ <type type="stroke" key="collation">piirtojärjestys</type>
+ <type type="traditional" key="collation">perinteinen järjestys</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US" draft="unconfirmed">amerikkalainen</measurementSystemName>
+ <measurementSystemName type="metric">metrinen</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-s š t-z ž å ä ö]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[á à ã Ä Ã§ é è ë í ï ñ ô Å™ ú ü æ ø õ Å“]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>â€</quotationStart>
+ <alternateQuotationStart>’</alternateQuotationStart>
+ </delimiters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">tammi</month>
+ <month type="2">helmi</month>
+ <month type="3">maalis</month>
+ <month type="4">huhti</month>
+ <month type="5">touko</month>
+ <month type="6">kesä</month>
+ <month type="7">heinä</month>
+ <month type="8">elo</month>
+ <month type="9">syys</month>
+ <month type="10">loka</month>
+ <month type="11">marras</month>
+ <month type="12">joulu</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">tammikuu</month>
+ <month type="2">helmikuu</month>
+ <month type="3">maaliskuu</month>
+ <month type="4">huhtikuu</month>
+ <month type="5">toukokuu</month>
+ <month type="6">kesäkuu</month>
+ <month type="7">heinäkuu</month>
+ <month type="8">elokuu</month>
+ <month type="9">syyskuu</month>
+ <month type="10">lokakuu</month>
+ <month type="11">marraskuu</month>
+ <month type="12">joulukuu</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">T</month>
+ <month type="2">H</month>
+ <month type="3">M</month>
+ <month type="4">H</month>
+ <month type="5">T</month>
+ <month type="6">K</month>
+ <month type="7">H</month>
+ <month type="8">E</month>
+ <month type="9">S</month>
+ <month type="10">L</month>
+ <month type="11">M</month>
+ <month type="12">J</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">su</day>
+ <day type="mon">ma</day>
+ <day type="tue">ti</day>
+ <day type="wed">ke</day>
+ <day type="thu">to</day>
+ <day type="fri">pe</day>
+ <day type="sat">la</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">sunnuntai</day>
+ <day type="mon">maanantai</day>
+ <day type="tue">tiistai</day>
+ <day type="wed">keskiviikko</day>
+ <day type="thu">torstai</day>
+ <day type="fri">perjantai</day>
+ <day type="sat">lauantai</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">S</day>
+ <day type="mon">M</day>
+ <day type="tue">T</day>
+ <day type="wed">K</day>
+ <day type="thu">T</day>
+ <day type="fri">P</day>
+ <day type="sat">L</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">1. nelj.</quarter>
+ <quarter type="2">2. nelj.</quarter>
+ <quarter type="3">3. nelj.</quarter>
+ <quarter type="4">4.nelj.</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1. neljännes</quarter>
+ <quarter type="2">2. neljännes</quarter>
+ <quarter type="3">3. neljännes</quarter>
+ <quarter type="4">4. neljännes</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>ap.</am>
+ <pm>ip.</pm>
+ <eras>
+ <eraNames>
+ <era type="0">ennen Kristuksen syntymää</era>
+ <era type="1">jälkeen Kristuksen syntymän</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">eKr.</era>
+ <era type="1">jKr.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE'na 'd. MMMM'ta 'yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d. MMMM'ta 'yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d.M.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d.M.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H.mm.ss v</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>'klo 'H.mm.ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H.mm.ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H.mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d. MMMM'ta'</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">d.M</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm.ss</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">M.yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMEEEd" draft="provisional">EEE d.M.yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM'ta 'yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyQQQQ" draft="provisional">QQQQ yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName>aikakausi</displayName>
+ </field>
+ <field type="year">
+ <displayName>vuosi</displayName>
+ </field>
+ <field type="month">
+ <displayName>kuukausi</displayName>
+ </field>
+ <field type="week">
+ <displayName>viikko</displayName>
+ </field>
+ <field type="day">
+ <displayName>päivä</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>viikonpäivä</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName>ap/ip-valinta</displayName>
+ </field>
+ <field type="hour">
+ <displayName>tunti</displayName>
+ </field>
+ <field type="minute">
+ <displayName>minuutti</displayName>
+ </field>
+ <field type="second">
+ <displayName>sekunti</displayName>
+ </field>
+ <field type="zone">
+ <displayName>aikavyöhyke</displayName>
+ </field>
+ </fields>
+ </calendar>
+ <calendar type="hebrew">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" references="R2">tišrí</month>
+ <month type="2">hešván</month>
+ <month type="3">kislév</month>
+ <month type="4">tevét</month>
+ <month type="5">ševát</month>
+ <month type="6">adár</month>
+ <month type="7">adár II</month>
+ <month type="8">nisán</month>
+ <month type="9">ijjár</month>
+ <month type="10">siván</month>
+ <month type="11">tammúz</month>
+ <month type="12">ab</month>
+ <month type="13">elúl</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" references="R2">tišríkuu</month>
+ <month type="2">hešvánkuu</month>
+ <month type="3">kislévkuu</month>
+ <month type="4">tevétkuu</month>
+ <month type="5">ševátkuu</month>
+ <month type="6">adárkuu</month>
+ <month type="7">adárkuu II</month>
+ <month type="8">nisánkuu</month>
+ <month type="9">ijjárkuu</month>
+ <month type="10">sivánkuu</month>
+ <month type="11">tammúzkuu</month>
+ <month type="12">abkuu</month>
+ <month type="13">elúlkuu</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="islamic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1" references="R2">muharram</month>
+ <month type="2" references="R2">safar</month>
+ <month type="3" references="R2">rabi’ al-awwal</month>
+ <month type="4" references="R2">rabi’ al-akhir</month>
+ <month type="5" references="R2">džumada-l-ula</month>
+ <month type="6" references="R2">džumada-l-akhira</month>
+ <month type="7" references="R2">radžab</month>
+ <month type="8" references="R2">ša’ban</month>
+ <month type="9" references="R2">ramadan</month>
+ <month type="10" references="R2">Å¡awwal</month>
+ <month type="11" references="R2">dhu-l-qa’da</month>
+ <month type="12" references="R2">dhu-l-hiddža</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="islamic-civil">
+ <months>
+ <alias source="locale" path="../../calendar[@type='islamic']/months"/>
+ </months>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="America/Argentina/ComodRivadavia">
+ <exemplarCity>Comodoro Rivadavia</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Etelänapa</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity>Dumont d'Urville</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>São Paulo</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <standard>Kanadan Atlantin normaaliaika</standard>
+ <daylight>Kanadan Atlantin kesäaika</daylight>
+ </long>
+ <short>
+ <standard>AST</standard>
+ <daylight>ADT</daylight>
+ </short>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <standard>Newfoundlandin normaaliaika</standard>
+ <daylight>Newfoundlandin kesäaika</daylight>
+ </long>
+ <short>
+ <standard>CNT</standard>
+ </short>
+ <exemplarCity>St. Johns</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>Pääsiäissaari</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <standard>Kiinan normaaliaika</standard>
+ <daylight>Kiinan kesäaika</daylight>
+ </long>
+ <short>
+ <standard>CTT</standard>
+ <daylight>CTT</daylight>
+ </short>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>Kanariansaaret</exemplarCity>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <standard>Keski-Euroopan normaaliaika</standard>
+ <daylight>Keski-Euroopan kesäaika</daylight>
+ </long>
+ <short>
+ <standard>CEST</standard>
+ <daylight>CEDT</daylight>
+ </short>
+ <exemplarCity>Pariisi</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>Lontoo</exemplarCity>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <standard>Israelin normaaliaika</standard>
+ <daylight>Israelin kesäaika</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IDT</daylight>
+ </short>
+ <exemplarCity>Jerusalem</exemplarCity>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <standard>Japanin normaaliaika</standard>
+ <daylight>Japanin kesäaika</daylight>
+ </long>
+ <short>
+ <standard>JST</standard>
+ <daylight>JST</daylight>
+ </short>
+ <exemplarCity>Tokio</exemplarCity>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <standard draft="provisional">Greenwichin normaaliaika</standard>
+ <daylight draft="provisional">Greenwichin kesäaika</daylight>
+ </long>
+ <short>
+ <standard>GMT</standard>
+ <daylight>GMT</daylight>
+ </short>
+ <exemplarCity>Casablanca</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>Ulan Bator</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>Cancún</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>Azorit</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lissabon</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>Itä-Euroopan normaaliaika</standard>
+ <daylight>Itä-Euroopan kesäaika</daylight>
+ </long>
+ <short>
+ <standard>EET</standard>
+ <daylight>EEST</daylight>
+ </short>
+ <exemplarCity>Bukarest</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moskova</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>Jekaterinburg</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>Krasnojarsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>Jakutsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>Sahalin</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>Kamtšatka</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>Užgorod</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>Kiova</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <standard>Havaijin normaaliaika</standard>
+ <daylight>Havaijin kesäaika</daylight>
+ </long>
+ <short>
+ <standard>HST</standard>
+ <daylight>HDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <standard>Alaskan normaaliaika</standard>
+ <daylight>Alaskan kesäaika</daylight>
+ </long>
+ <short>
+ <standard>AKST</standard>
+ <daylight>AKDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <standard>Yhdysvaltain Tyynenmeren normaaliaika</standard>
+ <daylight>Yhdysvaltain Tyynenmeren kesäaika</daylight>
+ </long>
+ <short>
+ <standard>PST</standard>
+ <daylight>PDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <standard>Kalliovuorten normaaliaika</standard>
+ <daylight>Kalliovuorten kesäaika</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity>keskinen North Dakota</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <standard>Yhdysvaltain keskinen normaaliaika</standard>
+ <daylight>Yhdysvaltain keskinen kesäaika</daylight>
+ </long>
+ <short>
+ <standard>CST</standard>
+ <daylight>CDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Indianapolis">
+ <long>
+ <standard>Yhdysvaltain itäinen normaaliaika</standard>
+ <daylight>Yhdysvaltain itäinen kesäaika</daylight>
+ </long>
+ <short>
+ <standard>EST</standard>
+ <daylight>EDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <standard>Yhdysvaltain itäinen normaaliaika</standard>
+ <daylight>Yhdysvaltain itäinen kesäaika</daylight>
+ </long>
+ <short>
+ <standard>EST</standard>
+ <daylight>EDT</daylight>
+ </short>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Taškent</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##0 %</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Andorran peseta</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>Arabiemiirikuntien dirhami</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>Afganistanin afgaani (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>Afganistanin afgaani</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName>Albanian lek</displayName>
+ </currency>
+ <currency type="AMD">
+ <displayName>Armenian dram</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName>Alankomaiden Antillien guldeni</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName>Angolan kwanza</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Angolan kwanza (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>Angolan uusi kwanza (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>Angolan kwanza reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>Argentiinan austral</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Argentiinan peso (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Argentiinan peso</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName>Itävallan šillinki</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>Australian dollari</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName>Aruban guldeni</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>Azerbaidžanin manat</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>Bosnia-Hertsegovinan dinaari</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>Bosnia-Hertsegovinan vaihdettava markka</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName>Barbadosin dollari</displayName>
+ </currency>
+ <currency type="BDT">
+ <displayName>Bangladeshin taka</displayName>
+ </currency>
+ <currency type="BEC">
+ <displayName>Belgian frangi (vaihdettava)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Belgian frangi</displayName>
+ </currency>
+ <currency type="BEL">
+ <displayName>Belgian frangi (rahoitus)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>Bulgarian kova lev</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName>Bulgarian uusi lev</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>Bahrainin dinaari</displayName>
+ </currency>
+ <currency type="BIF">
+ <displayName>Burundin frangi</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName>Bermudan dollari</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName>Brunein dollari</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>Bolivian boliviano</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>Bolivian peso</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Bolivian MVDOL</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>Brasilian uusi cruzeiro (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>Brasilian cruzado</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>Brasilian cruzeiro (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Brasilian real</displayName>
+ </currency>
+ <currency type="BRN">
+ <displayName>Brasilian uusi cruzado</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>Brasilian cruzeiro</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>Bahaman dollari</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>Bhutanin ngultrum</displayName>
+ </currency>
+ <currency type="BUK">
+ <displayName>Burman kyat</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>Botswanan pula</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>Valko-Venäjän uusi rupla (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>Valko-Venäjän rupla</displayName>
+ </currency>
+ <currency type="BZD">
+ <displayName>Belizen dollari</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>Kanadan dollari</displayName>
+ </currency>
+ <currency type="CDF">
+ <displayName>Kongon frangi</displayName>
+ </currency>
+ <currency type="CHE">
+ <displayName>Sveitsin WIR-euro</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Sveitsin frangi</displayName>
+ </currency>
+ <currency type="CHW">
+ <displayName>Sveitsin WIR-frangi</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>Chilen unidades de fomento</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Chilen peso</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>Kiinan yuan</displayName>
+ </currency>
+ <currency type="COP">
+ <displayName>Kolumbian peso</displayName>
+ </currency>
+ <currency type="COU">
+ <displayName references="RP2">Kolumbian unidad de valor real</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>Costa Rican colon</displayName>
+ </currency>
+ <currency type="CSD">
+ <displayName references="RP2">Serbian dinaari</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>TÅ¡ekkoslovakian kova koruna</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Kuuban peso</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Kap Verden escudo</displayName>
+ </currency>
+ <currency type="CYP">
+ <displayName>Kyproksen punta</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName>TÅ¡ekin koruna</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>Itä-Saksan markka</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Saksan markka</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Djiboutin frangi</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName>Tanskan kruunu</displayName>
+ <symbol>Tkr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>Dominikaanisen tasavallan peso</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName>Algerian dinaari</displayName>
+ </currency>
+ <currency type="ECS">
+ <displayName>Ecuadorin sucre</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>Ecuadorin UVC</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>Viron kruunu</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>Egyptin punta</displayName>
+ </currency>
+ <currency type="EQE">
+ <displayName>Päiväntasaajan Guinean ekwele (1986-1989)</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Eritrean nakfa</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName>Espanjan peseta (A-tili)</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName>Espanjan peseta (vaihdettava tili)</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Espanjan peseta</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>Etiopian birr</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>Suomen markka</displayName>
+ <symbol>mk</symbol>
+ </currency>
+ <currency type="FJD">
+ <displayName>Fidžin dollari</displayName>
+ </currency>
+ <currency type="FKP">
+ <displayName>Falklandinsaarten punta</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Ranskan frangi</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Englannin punta</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>Georgian kuponkilari</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>Georgian lari</displayName>
+ </currency>
+ <currency type="GHC">
+ <displayName>Ghanan cedi</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>Gibraltarin punta</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>Gambian dalasi</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Guinean frangi</displayName>
+ </currency>
+ <currency type="GNS">
+ <displayName>Guinean syli</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Päiväntasaajan Guinean ekwele (-1986)</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Kreikan drakma</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Guatemalan quetzal</displayName>
+ </currency>
+ <currency type="GWE">
+ <displayName>Portugalin Guinean escudo</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Guinea-Bissaun peso</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>Guyanan dollari</displayName>
+ </currency>
+ <currency type="HKD">
+ <displayName>Hongkongin dollari</displayName>
+ </currency>
+ <currency type="HNL">
+ <displayName>Hondurasin lempira</displayName>
+ </currency>
+ <currency type="HRD">
+ <displayName>Kroatian dinaari</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Kroatian kuna</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>Haitin gourde</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Unkarin forintti</displayName>
+ </currency>
+ <currency type="IDR">
+ <displayName>Indonesian rupia</displayName>
+ </currency>
+ <currency type="IEP">
+ <displayName>Irlannin punta</displayName>
+ </currency>
+ <currency type="ILP">
+ <displayName>Israelin punta</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Israelin uusi sekeli</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Intian rupia</displayName>
+ <symbol>INR</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>Irakin dinaari</displayName>
+ </currency>
+ <currency type="IRR">
+ <displayName>Iranin rial</displayName>
+ </currency>
+ <currency type="ISK">
+ <displayName>Islannin kruunu</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>Italian liira</displayName>
+ <symbol>ITL</symbol>
+ </currency>
+ <currency type="JMD">
+ <displayName>Jamaikan dollari</displayName>
+ </currency>
+ <currency type="JOD">
+ <displayName>Jordanian dinaari</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>Japanin jeni</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>Kenian Å¡illinki</displayName>
+ </currency>
+ <currency type="KGS">
+ <displayName>Kirgisian som</displayName>
+ </currency>
+ <currency type="KHR">
+ <displayName>Kambodžan riel</displayName>
+ </currency>
+ <currency type="KMF">
+ <displayName>Komorien frangi</displayName>
+ </currency>
+ <currency type="KPW">
+ <displayName>Pohjois-Korean won</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Etelä-Korean won</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>Kuwaitin dinaari</displayName>
+ </currency>
+ <currency type="KYD">
+ <displayName>Caymansaarten dollari</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Kazakstanin tenge</displayName>
+ </currency>
+ <currency type="LAK">
+ <displayName>Laosin kip</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>Libanonin punta</displayName>
+ </currency>
+ <currency type="LKR">
+ <displayName>Sri Lankan rupia</displayName>
+ </currency>
+ <currency type="LRD">
+ <displayName>Liberian dollari</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Lesothon loti</displayName>
+ </currency>
+ <currency type="LSM">
+ <displayName>Lesothon maloti</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>Liettuan liti</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Liettuan talonas</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName>Luxemburgin vaihdettava frangi</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Luxemburgin frangi</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName>Luxemburgin rahoitusfrangi</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Latvian lati</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>Latvian rupla</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>Libyan dinaari</displayName>
+ </currency>
+ <currency type="MAD">
+ <displayName>Marokon dirhami</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>Marokon frangi</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>Moldovan leu</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>Madagaskarin ariary</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Madagaskarin frangi</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>Makedonian dinaari</displayName>
+ </currency>
+ <currency type="MLF">
+ <displayName>Malin frangi</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Myanmarin kyat</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>Mongolian tugrik</displayName>
+ </currency>
+ <currency type="MOP">
+ <displayName>Macaon pataca</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Mauritanian ouguiya</displayName>
+ </currency>
+ <currency type="MTL">
+ <displayName>Maltan liira</displayName>
+ </currency>
+ <currency type="MTP">
+ <displayName>Maltan punta</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>Mauritiuksen rupia</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>Malediivien rufiyaa</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Malawin kwacha</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName>Meksikon peso</displayName>
+ </currency>
+ <currency type="MXP">
+ <displayName>Meksikon hopeapeso (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>Meksikon UDI</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Malesian ringgit</displayName>
+ </currency>
+ <currency type="MZE">
+ <displayName>Mosambikin escudo</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Mosambikin metical</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName>Namibian dollari</displayName>
+ </currency>
+ <currency type="NGN">
+ <displayName>Nigerian naira</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>Nicaraguan cordoba</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>Nicaraguan kultacordoba</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Alankomaiden guldeni</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Norjan kruunu</displayName>
+ <symbol>Nkr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>Nepalin rupia</displayName>
+ </currency>
+ <currency type="NZD">
+ <displayName>Uuden-Seelannin dollari</displayName>
+ </currency>
+ <currency type="OMR">
+ <displayName>Omanin rial</displayName>
+ </currency>
+ <currency type="PAB">
+ <displayName>Panaman balboa</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>Perun inti</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>Perun uusi sol</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>Perun sol</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Papua-Uuden-Guinean kina</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>Filippiinien peso</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>Pakistanin rupia</displayName>
+ </currency>
+ <currency type="PLN">
+ <displayName>Puolan zloty</displayName>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Puolan zloty (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Portugalin escudo</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>Paraguayn guarani</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>Qatarin rial</displayName>
+ </currency>
+ <currency type="RHD">
+ <displayName>Rhodesian dollari</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>Romanian vanha leu</displayName>
+ </currency>
+ <currency type="RON">
+ <displayName>Romanian uusi leu</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>Venäjän rupla</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Venäjän rupla (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>Ruandan frangi</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>Saudi-Arabian rial</displayName>
+ </currency>
+ <currency type="SBD">
+ <displayName>Salomonsaarten dollari</displayName>
+ </currency>
+ <currency type="SCR">
+ <displayName>Seychellien rupia</displayName>
+ </currency>
+ <currency type="SDD">
+ <displayName>Sudanin dinaari</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>Sudanin punta</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>Ruotsin kruunu</displayName>
+ <symbol>Rkr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>Singaporen dollari</displayName>
+ </currency>
+ <currency type="SHP">
+ <displayName>Saint Helenan punta</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Slovenian tolar</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Slovakian koruna</displayName>
+ </currency>
+ <currency type="SLL">
+ <displayName>Sierra Leonen leone</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>Somalian Å¡illinki</displayName>
+ </currency>
+ <currency type="SRD">
+ <displayName references="RP2">Surinamin dollari</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>Surinamin guldeni</displayName>
+ </currency>
+ <currency type="STD">
+ <displayName>São Tomén ja Príncipen dobra</displayName>
+ </currency>
+ <currency type="SUR">
+ <displayName>Neuvostoliiton rupla</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>El Salvadorin colon</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>Syyrian punta</displayName>
+ </currency>
+ <currency type="SZL">
+ <displayName>Swazimaan lilangeni</displayName>
+ </currency>
+ <currency type="THB">
+ <displayName>Thaimaan baht</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>Tadžikistanin rupla</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Tadžikistanin somoni</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Turkmenistanin manat</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>Tunisian dinaari</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>Tongan pa’anga</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>Timorin escudo</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Turkin liira</displayName>
+ </currency>
+ <currency type="TRY">
+ <displayName>Turkin uusi liira</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Trinidadin ja Tobagon dollari</displayName>
+ </currency>
+ <currency type="TWD">
+ <displayName>Taiwanin uusi dollari</displayName>
+ </currency>
+ <currency type="TZS">
+ <displayName>Tansanian Å¡illinki</displayName>
+ </currency>
+ <currency type="UAH">
+ <displayName>Ukrainan hryvnia</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Ukrainan karbovanetz</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Ugandan Å¡illinki (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Ugandan Å¡illinki</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>Yhdysvaltain dollari</displayName>
+ </currency>
+ <currency type="USN">
+ <displayName>Yhdysvaltain dollari (seuraava päivä)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>Yhdysvaltain dollari (sama päivä)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>Uruguayn peso (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>Uruguayn peso</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName>Uzbekistanin som</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Venezuelan bolivar</displayName>
+ </currency>
+ <currency type="VND">
+ <displayName>Vietnamin dong</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>Vanuatun vatu</displayName>
+ </currency>
+ <currency type="WST">
+ <displayName>Samoan tala</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>CFA-frangi BEAC</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName>hopea</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>kulta</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>EURCO</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>Euroopan rahayksikkö (EMU)</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>EUA (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>EUA (XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>Itä-Karibian dollari</displayName>
+ </currency>
+ <currency type="XDR">
+ <displayName>erityisnosto-oikeus (SDR)</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>Euroopan valuuttayksikkö (ECU)</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>Ranskan kultafrangi</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>Ranskan UIC-frangi</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>CFA-frangi BCEAO</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName>palladium</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>CFP-frangi</displayName>
+ </currency>
+ <currency type="XPT">
+ <displayName>platina</displayName>
+ </currency>
+ <currency type="XRE">
+ <displayName>RINET-rahastot</displayName>
+ </currency>
+ <currency type="XTS">
+ <displayName>testaustarkoitukseen varattu valuuttakoodi</displayName>
+ </currency>
+ <currency type="XXX">
+ <displayName>ei rahayksikköä</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>Jemenin dinaari</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Jemenin rial</displayName>
+ </currency>
+ <currency type="YUD">
+ <displayName>Jugoslavian kova dinaari</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>Jugoslavian uusi dinaari</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>Jugoslavian vaihdettava dinaari</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>Etelä-Afrikan randi (rahoitus)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Etelä-Afrikan randi</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Sambian kwacha</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Zairen uusi zaire</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Zairen zaire</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Zimbabwen dollari</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>kyllä:kylla:k</yesstr>
+ <nostr>ei:e</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="R1">Consensus of Open National Review (Kotoistus)</reference>
+ <reference type="RP1" uri="http://kontu.merri.net/wiki/Etusivu">KontuWiki</reference>
+ <reference type="RP2" draft="provisional"/>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/fi_FI.xml b/libs/Zend/Locale/Data/fi_FI.xml
new file mode 100755
index 0000000000..984f2e5a11
--- /dev/null
+++ b/libs/Zend/Locale/Data/fi_FI.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="fi"/>
+ <territory type="FI"/>
+ </identity>
+ <characters>
+ <exemplarCharacters type="auxiliary">[á à â ã Ä Ã§ Ä‘ é è ë ǧ Ç¥ ÈŸ í ï Ç© Å„ ñ Å‹ ô Å™ ŧ ú ü æ ø õ Å“ Ê’ ǯ]</exemplarCharacters>
+ </characters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/fo.xml b/libs/Zend/Locale/Data/fo.xml
new file mode 100755
index 0000000000..428b02bab9
--- /dev/null
+++ b/libs/Zend/Locale/Data/fo.xml
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.43 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="fo"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="fo">føroyskt</language>
+ </languages>
+ <territories>
+ <territory type="AE">Sameindu Emirríkini</territory>
+ <territory type="AF">Afganistan</territory>
+ <territory type="AG">Antigua og Barbuda</territory>
+ <territory type="AQ">Antarktis</territory>
+ <territory type="AT">Eysturríki</territory>
+ <territory type="AU">Avstralia</territory>
+ <territory type="AZ">Aserbajdsjan</territory>
+ <territory type="BA">Bosnia-Hersegovina</territory>
+ <territory type="BD">Bangladesj</territory>
+ <territory type="BE">Belgia</territory>
+ <territory type="BR">Brasilia</territory>
+ <territory type="BT">Butan</territory>
+ <territory type="BW">Botsvana</territory>
+ <territory type="BY">Hvítarussland</territory>
+ <territory type="BZ">Belis</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CF">Miðafrikalýðveldið</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Sveis</territory>
+ <territory type="CI">Fílabeinsstrondin</territory>
+ <territory type="CL">Kili</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Kina</territory>
+ <territory type="CO">Kolombia</territory>
+ <territory type="CR">Kosta Rika</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Grønhøvdaoyggjarnar</territory>
+ <territory type="CY">Kýpros</territory>
+ <territory type="CZ">Kekkia</territory>
+ <territory type="DE">Týskland</territory>
+ <territory type="DK">Danmørk</territory>
+ <territory type="DM">Dominika</territory>
+ <territory type="DO">Domingo lýðveldið</territory>
+ <territory type="EC">Ekvador</territory>
+ <territory type="EE">Estland</territory>
+ <territory type="EG">Egyptaland</territory>
+ <territory type="ES">Spania</territory>
+ <territory type="ET">Etiopia</territory>
+ <territory type="FI">Finnland</territory>
+ <territory type="FM">Mikronesia</territory>
+ <territory type="FO">Føroyar</territory>
+ <territory type="FR">Frakland</territory>
+ <territory type="GQ">Ekvator Guinea</territory>
+ <territory type="GR">Grikkaland</territory>
+ <territory type="GW">Guinea Bissau</territory>
+ <territory type="GY">Gujana</territory>
+ <territory type="HR">Kroatia</territory>
+ <territory type="HU">Ungarn</territory>
+ <territory type="IE">Ãrland</territory>
+ <territory type="IL">Ãsrael</territory>
+ <territory type="IN">India</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IS">Ãsland</territory>
+ <territory type="IT">Italia</territory>
+ <territory type="JM">Jameika</territory>
+ <territory type="JP">Japan</territory>
+ <territory type="KE">Kenja</territory>
+ <territory type="KG">Kirgisia</territory>
+ <territory type="KH">Kambodja</territory>
+ <territory type="KM">Komorooyggjarnar</territory>
+ <territory type="KN">Saint Kitts og Nevis</territory>
+ <territory type="KP">Norður-Korea</territory>
+ <territory type="KR">Suður-Korea</territory>
+ <territory type="KW">Kuvait</territory>
+ <territory type="KZ">Kasakstan</territory>
+ <territory type="LB">Libanon</territory>
+ <territory type="LC">Saint Lusia</territory>
+ <territory type="LI">Liktenstein</territory>
+ <territory type="LS">Lesoto</territory>
+ <territory type="LT">Litava</territory>
+ <territory type="LU">Luksemborg</territory>
+ <territory type="LV">Lettland</territory>
+ <territory type="MA">Marokko</territory>
+ <territory type="MC">Monako</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshalloyggjarnar</territory>
+ <territory type="MK">Makedónia</territory>
+ <territory type="MR">Móritania</territory>
+ <territory type="MU">Móritius</territory>
+ <territory type="MV">Maldivuoyggjarnar</territory>
+ <territory type="MW">Malavi</territory>
+ <territory type="MX">Meksiko</territory>
+ <territory type="MY">Maleisia</territory>
+ <territory type="MZ">Mosambik</territory>
+ <territory type="NI">Nikaragua</territory>
+ <territory type="NL">Niðurlond</territory>
+ <territory type="NO">Noreg</territory>
+ <territory type="NZ">Ný Sæland</territory>
+ <territory type="PE">Perú</territory>
+ <territory type="PG">Papua Nýguinea</territory>
+ <territory type="PH">Filipsoyggjar</territory>
+ <territory type="PL">Pólland</territory>
+ <territory type="PY">Paraguei</territory>
+ <territory type="QA">Katar</territory>
+ <territory type="RO">Rumenia</territory>
+ <territory type="RU">Russland</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SA">Saudi-Arábia</territory>
+ <territory type="SB">Sálomonoyggjarnar</territory>
+ <territory type="SC">Seyskelloyggjarnar</territory>
+ <territory type="SE">Svøríki</territory>
+ <territory type="SG">Singapor</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">Sao Tome og Prinsipi</territory>
+ <territory type="SZ">Svasiland</territory>
+ <territory type="TD">Kjad</territory>
+ <territory type="TJ">Tadsjikistan</territory>
+ <territory type="TN">Tunesia</territory>
+ <territory type="TR">Turkaland</territory>
+ <territory type="TT">Trinidad og Tobago</territory>
+ <territory type="TW">Teivan</territory>
+ <territory type="TZ">Tansania</territory>
+ <territory type="UA">Ukreina</territory>
+ <territory type="US">Sambandsríki Amerika</territory>
+ <territory type="UY">Uruguei</territory>
+ <territory type="UZ">Usbekistan</territory>
+ <territory type="VA">Vatikan</territory>
+ <territory type="VC">Saint Vinsent og Grenadinoyggjar</territory>
+ <territory type="VE">Venesuela</territory>
+ <territory type="WS">Sámoa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="ZA">Suðurafrika</territory>
+ <territory type="ZM">Sambia</territory>
+ <territory type="ZW">Simbabvi</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a á b d ð e-i í j-o ó p r-u ú v x y ý æ ø]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[c q w z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">jan</month>
+ <month type="2">feb</month>
+ <month type="3">mar</month>
+ <month type="4">apr</month>
+ <month type="5">mai</month>
+ <month type="6">jun</month>
+ <month type="7">jul</month>
+ <month type="8">aug</month>
+ <month type="9">sep</month>
+ <month type="10">okt</month>
+ <month type="11">nov</month>
+ <month type="12">des</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">januar</month>
+ <month type="2">februar</month>
+ <month type="3">mars</month>
+ <month type="4">apríl</month>
+ <month type="5">mai</month>
+ <month type="6">juni</month>
+ <month type="7">juli</month>
+ <month type="8">august</month>
+ <month type="9">september</month>
+ <month type="10">oktober</month>
+ <month type="11">november</month>
+ <month type="12">desember</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">sun</day>
+ <day type="mon">mán</day>
+ <day type="tue">týs</day>
+ <day type="wed">mik</day>
+ <day type="thu">hós</day>
+ <day type="fri">frí</day>
+ <day type="sat">ley</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">sunnudagur</day>
+ <day type="mon">mánadagur</day>
+ <day type="tue">týsdagur</day>
+ <day type="wed">mikudagur</day>
+ <day type="thu">hósdagur</day>
+ <day type="fri">fríggjadagur</day>
+ <day type="sat">leygardagur</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">K1</quarter>
+ <quarter type="2">K2</quarter>
+ <quarter type="3">K3</quarter>
+ <quarter type="4">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1. kvartal</quarter>
+ <quarter type="2">2. kvartal</quarter>
+ <quarter type="3">3. kvartal</quarter>
+ <quarter type="4">4. kvartal</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d. MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd-MM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="unconfirmed">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="unconfirmed">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="MMMd" draft="provisional">d. MMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMM" draft="provisional">MMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="DKK">
+ <symbol>kr</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/fo_FO.xml b/libs/Zend/Locale/Data/fo_FO.xml
new file mode 100755
index 0000000000..10ee0948f9
--- /dev/null
+++ b/libs/Zend/Locale/Data/fo_FO.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="fo"/>
+ <territory type="FO"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">’</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">â€</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;¤ -#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/fr.xml b/libs/Zend/Locale/Data/fr.xml
new file mode 100755
index 0000000000..dc3d9c0810
--- /dev/null
+++ b/libs/Zend/Locale/Data/fr.xml
@@ -0,0 +1,2511 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.85 $"/>
+ <generation date="$Date: 2006/10/26 22:56:54 $"/>
+ <language type="fr"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">afar</language>
+ <language type="ab">abkhaze</language>
+ <language type="ace">aceh</language>
+ <language type="ach">acoli</language>
+ <language type="ada">adangme</language>
+ <language type="ady">adyghéen</language>
+ <language type="ae">avestique</language>
+ <language type="af">afrikaans</language>
+ <language type="afa">afro-asiatiques, autres langues</language>
+ <language type="afa" alt="proposed-u148-1" draft="unconfirmed">langues afro-asiatiques (autres)</language>
+ <language type="afh">afrihili</language>
+ <language type="ain">aïnou</language>
+ <language type="ak">akan</language>
+ <language type="akk">akkadien</language>
+ <language type="ale">aléoute</language>
+ <language type="alg" references="RP1">algonquines, langues</language>
+ <language type="alg" references="RP1" alt="proposed-u148-1" draft="unconfirmed">langues algonquines</language>
+ <language type="alt">altaï du Sud</language>
+ <language type="alt" alt="proposed-u148-1" draft="unconfirmed">altaï méridional</language>
+ <language type="am">amharique</language>
+ <language type="an">aragonais</language>
+ <language type="ang" references="RP1">anglo-saxon (vers 450-1100)</language>
+ <language type="apa" draft="unconfirmed">apaches, langues</language>
+ <language type="ar">arabe</language>
+ <language type="arc">araméen</language>
+ <language type="arn">araukan</language>
+ <language type="arp">arapaho</language>
+ <language type="art">artificielles, autres langues</language>
+ <language type="art" alt="proposed-u148-1" draft="unconfirmed">langues artificielles (autres)</language>
+ <language type="arw">arawak</language>
+ <language type="as">assamais</language>
+ <language type="ast">asturien</language>
+ <language type="ath" references="RP1" draft="unconfirmed">athapascanes, langues</language>
+ <language type="aus" references="RP1" draft="unconfirmed">australiennes, langues</language>
+ <language type="av">avar</language>
+ <language type="awa">awadhi</language>
+ <language type="ay">aymara</language>
+ <language type="az">azéri</language>
+ <language type="ba">bachkir</language>
+ <language type="bad">banda</language>
+ <language type="bai">bamilékés, langues</language>
+ <language type="bai" alt="proposed-u148-1" draft="unconfirmed">langues bamilékées</language>
+ <language type="bal">baloutchi</language>
+ <language type="ban">balinais</language>
+ <language type="bas">bassa</language>
+ <language type="bat">baltiques, autres langues</language>
+ <language type="bat" alt="proposed-u148-1" draft="unconfirmed">langues baltes (autres)</language>
+ <language type="be">biélorusse</language>
+ <language type="bej">bedja</language>
+ <language type="bem">bemba</language>
+ <language type="ber">berbère</language>
+ <language type="bg">bulgare</language>
+ <language type="bh">bihari</language>
+ <language type="bho">bhojpuri</language>
+ <language type="bho" alt="proposed-u148-1" draft="unconfirmed">bhojpurî</language>
+ <language type="bi">bichlamar</language>
+ <language type="bi" alt="proposed-u148-1" draft="unconfirmed">bichelamar, bislama</language>
+ <language type="bik">bikol</language>
+ <language type="bin">bini</language>
+ <language type="bla">pieds-noirs</language>
+ <language type="bla" references="RP1" alt="proposed-u169-1" draft="provisional">blackfoot</language>
+ <language type="bm">bambara</language>
+ <language type="bn">bengali</language>
+ <language type="bnt">bantou</language>
+ <language type="bo">tibétain</language>
+ <language type="br">breton</language>
+ <language type="bra">braj</language>
+ <language type="bs">bosniaque</language>
+ <language type="btk">batak</language>
+ <language type="bua" draft="provisional">bouriate</language>
+ <language type="bug">bugi</language>
+ <language type="bug" alt="proposed-u148-1" draft="unconfirmed">bouguis</language>
+ <language type="byn">blin</language>
+ <language type="byn" alt="proposed-u148-1" draft="unconfirmed">blin, bilen</language>
+ <language type="ca">catalan</language>
+ <language type="cad">caddo</language>
+ <language type="cai">indiennes d'Amérique centrale, autres langues</language>
+ <language type="cai" alt="proposed-u148-1" draft="unconfirmed">langues amérindiennes centrales (autres)</language>
+ <language type="car">caribe</language>
+ <language type="cau">caucasiennes, autres langues</language>
+ <language type="cau" alt="proposed-u148-1" draft="unconfirmed">langues caucasiennes (autres)</language>
+ <language type="ce">tchétchène</language>
+ <language type="ceb">cebuano</language>
+ <language type="cel">celtiques, autres langues</language>
+ <language type="cel" alt="proposed-u148-1" draft="unconfirmed">langues celtiques (autres)</language>
+ <language type="ch">chamorro</language>
+ <language type="chb">chibcha</language>
+ <language type="chg">jagataic</language>
+ <language type="chg" alt="proposed-u148-1" draft="unconfirmed">tchaghataï, djaghataï</language>
+ <language type="chg" alt="proposed-u169-1" draft="provisional">djaghataï</language>
+ <language type="chk">chuuk</language>
+ <language type="chm">mari</language>
+ <language type="chm" alt="proposed-u148-2" draft="unconfirmed">tchérémisse, mari</language>
+ <language type="chn">jargon chinook</language>
+ <language type="chn" references="RP1" alt="proposed-u169-1" draft="provisional">chinook, jargon</language>
+ <language type="cho">choctaw</language>
+ <language type="chp" draft="provisional">chipewyan</language>
+ <language type="chr">cherokee</language>
+ <language type="chy">cheyenne</language>
+ <language type="cmc">langues chames</language>
+ <language type="cmc" references="RP1" alt="proposed-u169-1" draft="provisional">chames, langues</language>
+ <language type="co">corse</language>
+ <language type="cop">copte</language>
+ <language type="cpe">pidgin anglais (autre)</language>
+ <language type="cpe" alt="proposed-u148-1" draft="unconfirmed">langues créoles et pidgins anglais (autres)</language>
+ <language type="cpe" alt="proposed-u169-1" draft="provisional">créoles et pidgins anglais, autres</language>
+ <language type="cpf">pidgin français (autre)</language>
+ <language type="cpf" alt="proposed-u148-1" draft="unconfirmed">langues créoles et pidgins français (autres)</language>
+ <language type="cpf" alt="proposed-u169-1" draft="provisional">créoles et pidgins français, autres</language>
+ <language type="cpp">pidgin portugais (autre)</language>
+ <language type="cpp" alt="proposed-u148-1" draft="unconfirmed">langues créoles et pidgins portugais (autres)</language>
+ <language type="cpp" alt="proposed-u169-1" draft="provisional">créoles et pidgins portugais, autres</language>
+ <language type="cr">cree</language>
+ <language type="crh">turc de Crimée; tatar de Crimée</language>
+ <language type="crh" alt="proposed-u148-1" draft="unconfirmed">turc de Crimée, tatar de Crimée</language>
+ <language type="crh" alt="proposed-u169-1" draft="provisional">tatar de Crimée</language>
+ <language type="crp">pidgins et langues créoles (autre)</language>
+ <language type="crp" alt="proposed-u148-1" draft="unconfirmed">langues créoles et pidgins (autres)</language>
+ <language type="crp" alt="proposed-u169-1" draft="provisional">créoles et pidgins divers, autres</language>
+ <language type="cs">tchèque</language>
+ <language type="csb">cashubian</language>
+ <language type="csb" alt="proposed-u148-1" draft="provisional">kachoube</language>
+ <language type="cu">slavon d’église</language>
+ <language type="cus">couchitiques, autres langues</language>
+ <language type="cus" alt="proposed-u148-1" draft="unconfirmed">langues couchitiques (autres)</language>
+ <language type="cv">tchouvache</language>
+ <language type="cy">gallois</language>
+ <language type="da">danois</language>
+ <language type="dak">dakota</language>
+ <language type="dar">dargwa</language>
+ <language type="day">dayak</language>
+ <language type="de">allemand</language>
+ <language type="del">delaware</language>
+ <language type="den">slave (athapascan)</language>
+ <language type="den" alt="proposed-u169-1" draft="provisional">esclave (athapascan)</language>
+ <language type="dgr">dogrib</language>
+ <language type="dgr" alt="proposed-u148-1" draft="unconfirmed">dogrib, tlicho</language>
+ <language type="din">dinka</language>
+ <language type="doi">dogra</language>
+ <language type="doi" references="RP3" alt="proposed-u169-1" draft="provisional">dogri</language>
+ <language type="dra">dravidiennes, autres langues</language>
+ <language type="dra" alt="proposed-u148-1" draft="unconfirmed">langues dravidiennes (autres)</language>
+ <language type="dsb">bas-sorabe</language>
+ <language type="dua">douala</language>
+ <language type="dum">néerlandais moyen (vers 1050-1350)</language>
+ <language type="dv">maldivien</language>
+ <language type="dv" alt="proposed-u148-1" draft="unconfirmed">divehi, maldivien</language>
+ <language type="dyu" draft="provisional">dioula</language>
+ <language type="dz">dzongkha</language>
+ <language type="ee">éwé</language>
+ <language type="efi">efik</language>
+ <language type="egy">égyptien (ancien)</language>
+ <language type="eka">ekajuk</language>
+ <language type="el">grec</language>
+ <language type="elx">élamite</language>
+ <language type="en">anglais</language>
+ <language type="enm">anglais moyen (1100-1500)</language>
+ <language type="eo">espéranto</language>
+ <language type="es">espagnol</language>
+ <language type="et">estonien</language>
+ <language type="eu">basque</language>
+ <language type="ewo" draft="provisional">éwondo</language>
+ <language type="fa">persan</language>
+ <language type="fan">fang</language>
+ <language type="fat">fanti</language>
+ <language type="ff">peul</language>
+ <language type="fi">finnois</language>
+ <language type="fil">filipino</language>
+ <language type="fil" alt="proposed-u148-1" draft="unconfirmed">pilipino</language>
+ <language type="fiu">finno-ougriennes, autres langues</language>
+ <language type="fiu" alt="proposed-u148-1" draft="unconfirmed">langues finno-ougriennes (autres)</language>
+ <language type="fj">fidjien</language>
+ <language type="fo">féroïen</language>
+ <language type="fo" alt="proposed-u148-1" draft="unconfirmed">féringien</language>
+ <language type="fr">français</language>
+ <language type="frm">français moyen (ca.1400-1600)</language>
+ <language type="frm" alt="proposed-u169-1" draft="provisional">français moyen (1400-1600)</language>
+ <language type="fro">français ancien (842-vers 1400)</language>
+ <language type="fur">frioulan</language>
+ <language type="fy">frison</language>
+ <language type="ga">irlandais</language>
+ <language type="gaa">ga</language>
+ <language type="gay">gayo</language>
+ <language type="gba">gbaya</language>
+ <language type="gd">gaélique écossais</language>
+ <language type="gem">germaniques, autres langues</language>
+ <language type="gem" alt="proposed-u148-1" draft="unconfirmed">langues germaniques (autres)</language>
+ <language type="gez">guèze</language>
+ <language type="gil">gilbertais</language>
+ <language type="gil" alt="proposed-u148-1" draft="provisional">gilbertin</language>
+ <language type="gl">galicien</language>
+ <language type="gmh">allemand, moyen haut (vers 1050-1500)</language>
+ <language type="gn">guarani</language>
+ <language type="goh">allemand, vieux haut (ca. 750-1050)</language>
+ <language type="goh" alt="proposed-u148-2" draft="unconfirmed">allemand ancien haut (vers 750-1050)</language>
+ <language type="goh" alt="proposed-u169-1" draft="provisional">allemand, vieux haut (vers 750-1050)</language>
+ <language type="gon">gondi</language>
+ <language type="gon" alt="proposed-u148-1" draft="unconfirmed">gondî</language>
+ <language type="gor">gorontalo</language>
+ <language type="got">gotique</language>
+ <language type="grb">grebo</language>
+ <language type="grb" alt="proposed-u148-1" draft="unconfirmed">grébo</language>
+ <language type="grc" references="RP1">grec ancien (jusqu'à 1453)</language>
+ <language type="gu">goudjrati</language>
+ <language type="gu" alt="proposed-u148-1" draft="unconfirmed">goudjarâtî, gujarâtî</language>
+ <language type="gv">manx</language>
+ <language type="gv" references="RP3" alt="proposed-u169-1" draft="provisional">mannois</language>
+ <language type="gwi">gwichʼin</language>
+ <language type="ha">haoussa</language>
+ <language type="hai">haida</language>
+ <language type="hai" alt="proposed-u148-1" draft="unconfirmed">haïda</language>
+ <language type="haw">hawaïen</language>
+ <language type="he">hébreu</language>
+ <language type="hi">hindi</language>
+ <language type="hi" alt="proposed-u148-1" draft="unconfirmed">hindî</language>
+ <language type="hil">hiligaynon</language>
+ <language type="hil" alt="proposed-u148-2" draft="unconfirmed">ilonggo, hiligaynon</language>
+ <language type="him">himachali</language>
+ <language type="hit">hittite</language>
+ <language type="hmn">hmong</language>
+ <language type="ho">hiri motu</language>
+ <language type="hr">croate</language>
+ <language type="hsb">haut-sorabe</language>
+ <language type="ht">haïtien</language>
+ <language type="hu">hongrois</language>
+ <language type="hup">hupa</language>
+ <language type="hy">arménien</language>
+ <language type="hz">héréro</language>
+ <language type="hz" references="RP1" alt="proposed-u169-1" draft="provisional">herero</language>
+ <language type="ia">interlingua</language>
+ <language type="iba">iban</language>
+ <language type="id">indonésien</language>
+ <language type="ie">interlingue</language>
+ <language type="ig">igbo</language>
+ <language type="ii">yi de Sichuan</language>
+ <language type="ik">inupiaq</language>
+ <language type="ilo" draft="unconfirmed">ilokano</language>
+ <language type="inc">langue indo-aryenne (autre)</language>
+ <language type="inc" alt="proposed-u148-1" draft="unconfirmed">langues indo-aryennes (autres)</language>
+ <language type="inc" alt="proposed-u169-1" draft="provisional">indo-aryennes, autres langues</language>
+ <language type="ine">langue indo-européenne (autre)</language>
+ <language type="ine" alt="proposed-u148-1" draft="unconfirmed">langues indo-européennes (autres)</language>
+ <language type="ine" alt="proposed-u169-1" draft="provisional">indo-européennes, autres langues</language>
+ <language type="inh">ingouche</language>
+ <language type="io">ido</language>
+ <language type="ira">iranien</language>
+ <language type="iro">langues iroquoiennes</language>
+ <language type="iro" alt="proposed-u148-1" draft="unconfirmed">langues iroquoises</language>
+ <language type="iro" references="RP3" alt="proposed-u169-1" draft="provisional">iroquoises, langues</language>
+ <language type="is">islandais</language>
+ <language type="it">italien</language>
+ <language type="iu">inuktitut</language>
+ <language type="ja">japonais</language>
+ <language type="jbo">lojban</language>
+ <language type="jpr">judéo-persan</language>
+ <language type="jrb">judéo-arabe</language>
+ <language type="jv">javanais</language>
+ <language type="ka">géorgien</language>
+ <language type="kaa" draft="provisional">karakalpak</language>
+ <language type="kab">kabyle</language>
+ <language type="kac">kachin</language>
+ <language type="kac" alt="proposed-u148-1" draft="unconfirmed">jinghpo</language>
+ <language type="kam">kamba</language>
+ <language type="kar">karen</language>
+ <language type="kar" alt="proposed-u148-1" draft="unconfirmed">karène</language>
+ <language type="kaw">kawi</language>
+ <language type="kaw" alt="proposed-u148-1" draft="unconfirmed">kavi</language>
+ <language type="kbd">kabardine</language>
+ <language type="kbd" alt="proposed-u148-1" draft="provisional">kabardien</language>
+ <language type="kg">kongo</language>
+ <language type="kha">khasi</language>
+ <language type="kha" alt="proposed-u148-1" draft="unconfirmed">khasî</language>
+ <language type="khi">khoisan (autre)</language>
+ <language type="khi" alt="proposed-u148-1" draft="unconfirmed">langues khoïsans (autres)</language>
+ <language type="khi" alt="proposed-u169-1" draft="provisional">khoïsan, autres langues</language>
+ <language type="kho">khotanais</language>
+ <language type="ki">kikuyu</language>
+ <language type="ki" alt="proposed-u148-1" draft="unconfirmed">kikouyou, gikuyu</language>
+ <language type="kj">kuanyama</language>
+ <language type="kk">kazakh</language>
+ <language type="kl">groenlandais</language>
+ <language type="kl" alt="proposed-u148-1" draft="unconfirmed">kalaallisut, groenlandais</language>
+ <language type="km">khmer</language>
+ <language type="kmb">kiMboundou</language>
+ <language type="kmb" alt="proposed-u148-1" draft="unconfirmed">kimboundou</language>
+ <language type="kmb" alt="proposed-u169-1" draft="provisional">kimbundu</language>
+ <language type="kn">kannada</language>
+ <language type="kn" alt="proposed-u148-1" draft="unconfirmed">kannara, kannada</language>
+ <language type="ko">coréen</language>
+ <language type="kok">konkani</language>
+ <language type="kok" alt="proposed-u148-1" draft="unconfirmed">konkânî</language>
+ <language type="kos">kusaien</language>
+ <language type="kos" alt="proposed-u148-1" draft="unconfirmed">kosraéen</language>
+ <language type="kos" alt="proposed-u169-1" draft="provisional">kosrae</language>
+ <language type="kpe">kpellé</language>
+ <language type="kr">kanouri</language>
+ <language type="krc" draft="provisional">karatchaï balkar</language>
+ <language type="kro" draft="provisional">krou</language>
+ <language type="kru">kurukh</language>
+ <language type="ks">kashmiri</language>
+ <language type="ks" alt="proposed-u148-1" draft="unconfirmed">kâshmîrî</language>
+ <language type="ku">kurde</language>
+ <language type="kum">koumyk</language>
+ <language type="kut">kutenai</language>
+ <language type="kut" alt="proposed-u148-1" draft="unconfirmed">kutenaï</language>
+ <language type="kv">komi</language>
+ <language type="kw">cornique</language>
+ <language type="ky">kirghize</language>
+ <language type="la">latin</language>
+ <language type="lad">ladino</language>
+ <language type="lad" alt="proposed-u148-1" draft="unconfirmed">judéo-espagnol, ladino</language>
+ <language type="lad" references="RP1" alt="proposed-u169-1" draft="provisional">judéo-espagnol</language>
+ <language type="lah">lahnda</language>
+ <language type="lam">lamba</language>
+ <language type="lb">luxembourgeois</language>
+ <language type="lez">lezghien</language>
+ <language type="lg">ganda</language>
+ <language type="li">limbourgeois</language>
+ <language type="ln">lingala</language>
+ <language type="lo">lao</language>
+ <language type="lol">mongo</language>
+ <language type="loz">lozi</language>
+ <language type="lt">lituanien</language>
+ <language type="lu">luba-katanga</language>
+ <language type="lua">luba-lulua</language>
+ <language type="lui">luiseno</language>
+ <language type="lun">lunda</language>
+ <language type="lus">lushai</language>
+ <language type="lus" alt="proposed-u148-1" draft="unconfirmed">lushaï</language>
+ <language type="lv">letton</language>
+ <language type="mad">madurais</language>
+ <language type="mad" references="RP1" alt="proposed-u169-1" draft="provisional">madourais</language>
+ <language type="mag">magahi</language>
+ <language type="mag" alt="proposed-u148-1" draft="unconfirmed">magahî</language>
+ <language type="mai">maithili</language>
+ <language type="mai" alt="proposed-u148-1" draft="unconfirmed">maïthilî</language>
+ <language type="mak" draft="provisional">makassar</language>
+ <language type="man" references="RP1">mandingue</language>
+ <language type="map">malayo-polynésien</language>
+ <language type="mas">masai</language>
+ <language type="mas" references="RP1" alt="proposed-u169-1" draft="provisional">massaï</language>
+ <language type="mdf">moksa</language>
+ <language type="mdf" alt="proposed-u148-1" draft="unconfirmed">moksha</language>
+ <language type="mdr">mandar</language>
+ <language type="men">mendé</language>
+ <language type="mg">malgache</language>
+ <language type="mga">irlandais moyen (900-1200)</language>
+ <language type="mh">marshall</language>
+ <language type="mh" alt="proposed-u148-1" draft="unconfirmed">marshallais</language>
+ <language type="mi">maori</language>
+ <language type="mic">micmac</language>
+ <language type="min">minangkabau</language>
+ <language type="mis">langues diverses</language>
+ <language type="mis" references="RP1" alt="proposed-u169-1" draft="provisional">diverses, langues</language>
+ <language type="mk">macédonien</language>
+ <language type="mkh">mon-khmer (autre)</language>
+ <language type="mkh" alt="proposed-u148-1" draft="unconfirmed">langues mon-khmères (autres)</language>
+ <language type="mkh" alt="proposed-u169-1" draft="provisional">môn-khmer, autres langues</language>
+ <language type="ml">malayalam</language>
+ <language type="ml" alt="proposed-u148-1" draft="unconfirmed">malayâlam, malayî</language>
+ <language type="mn">mongol</language>
+ <language type="mnc">mandchou</language>
+ <language type="mni">manipuri</language>
+ <language type="mni" alt="proposed-u148-1" draft="unconfirmed">meitei, manipourî</language>
+ <language type="mni" alt="proposed-u169-1" draft="provisional">meitei</language>
+ <language type="mno">langues manobo</language>
+ <language type="mno" alt="proposed-u148-1" draft="unconfirmed">langues manobos</language>
+ <language type="mno" alt="proposed-u169-1" draft="provisional">manobo, langues</language>
+ <language type="mo">moldave</language>
+ <language type="moh">mohawk</language>
+ <language type="mos" draft="provisional">moré</language>
+ <language type="mr">marathe</language>
+ <language type="mr" alt="proposed-u148-1" draft="unconfirmed">marâthî, marathe</language>
+ <language type="mr" alt="proposed-u169-1" draft="provisional">marathi</language>
+ <language type="ms">malais</language>
+ <language type="mt">maltais</language>
+ <language type="mul">langues multiples</language>
+ <language type="mul" references="RP1" alt="proposed-u169-1" draft="provisional">multilingue</language>
+ <language type="mun">langues mounda</language>
+ <language type="mun" alt="proposed-u148-1" draft="unconfirmed">langues moundas</language>
+ <language type="mun" alt="proposed-u169-1" draft="provisional">mounda, langues</language>
+ <language type="mus">creek</language>
+ <language type="mus" alt="proposed-u148-1" draft="unconfirmed">muskogee, creek</language>
+ <language type="mus" references="RP1" alt="proposed-u169-1" draft="provisional">muskogee</language>
+ <language type="mwl">mirandais</language>
+ <language type="mwr" draft="unconfirmed">marwarî</language>
+ <language type="my">birman</language>
+ <language type="myn">maya, langues</language>
+ <language type="myn" alt="proposed-u148-1" draft="unconfirmed">langues mayas</language>
+ <language type="myv">erzya</language>
+ <language type="myv" alt="proposed-u169-1" draft="provisional">erza</language>
+ <language type="na">nauruan</language>
+ <language type="nah">nahuatl</language>
+ <language type="nai">indiennes d'Amérique du nord, autres langues</language>
+ <language type="nai" alt="proposed-u148-1" draft="unconfirmed">langues amérindiennes du Nord (autres)</language>
+ <language type="nap">napolitain</language>
+ <language type="nb">bokmål norvégien</language>
+ <language type="nb" alt="proposed-u148-1" draft="unconfirmed">norvégien littéraire</language>
+ <language type="nb" alt="proposed-u169-1" draft="provisional">norvégien bokmal</language>
+ <language type="nd">ndébélé du Nord</language>
+ <language type="nds">bas allemand, bas saxon</language>
+ <language type="nds" alt="proposed-u169-1" draft="provisional">bas allemand ; bas saxon</language>
+ <language type="ne">népalais</language>
+ <language type="new">newari</language>
+ <language type="new" alt="proposed-u148-1" draft="unconfirmed">néware, nepâlbhâsa</language>
+ <language type="ng">ndonga</language>
+ <language type="nia">nias</language>
+ <language type="nic">nigéro-congolaise (autre)</language>
+ <language type="nic" alt="proposed-u148-1" draft="unconfirmed">langues nigéro-congolaises (autres)</language>
+ <language type="nic" alt="proposed-u169-1" draft="provisional">nigéro-congolaises, autres langues</language>
+ <language type="niu">niué</language>
+ <language type="niu" alt="proposed-u148-1" draft="unconfirmed">niouéen</language>
+ <language type="nl">néerlandais</language>
+ <language type="nn">nynorsk norvégien</language>
+ <language type="nn" alt="proposed-u148-1" draft="unconfirmed">néo-norvégien</language>
+ <language type="nn" alt="proposed-u169-1" draft="provisional">norvégien nynorsk</language>
+ <language type="no">norvégien</language>
+ <language type="nog">nogaï, nogay</language>
+ <language type="nog" references="RP3" alt="proposed-u169-1" draft="provisional">nogaï</language>
+ <language type="non">vieux norrois</language>
+ <language type="nr">ndébélé du Sud</language>
+ <language type="nr" alt="proposed-u148-1" draft="unconfirmed">ndébélé méridional</language>
+ <language type="nso" draft="provisional">sotho du Nord</language>
+ <language type="nub">langues nubiennes</language>
+ <language type="nub" alt="proposed-u169-1" draft="provisional">nubiennes, langues</language>
+ <language type="nv">navaho</language>
+ <language type="nwc">newari classique</language>
+ <language type="nwc" alt="proposed-u148-1" draft="unconfirmed">newarî classique</language>
+ <language type="ny">nyanja</language>
+ <language type="ny" alt="proposed-u148-2" draft="unconfirmed">nyanja, chichewa, chewa</language>
+ <language type="ny" alt="proposed-u169-1" draft="provisional">nyanja ; chichewa ; chewa</language>
+ <language type="nym">nyamwezi</language>
+ <language type="nyn">nyankolé</language>
+ <language type="nyo">nyoro</language>
+ <language type="nzi">nzema</language>
+ <language type="oc">occitan (après 1500)</language>
+ <language type="oc" alt="proposed-u148-1" draft="unconfirmed">occitan (après 1500), provençal</language>
+ <language type="oc" alt="proposed-u169-1" draft="provisional">occitan (après 1500) ; provençal</language>
+ <language type="oj">ojibwa</language>
+ <language type="om">galla</language>
+ <language type="om" alt="proposed-u148-1" draft="unconfirmed">oromo, galla</language>
+ <language type="om" alt="proposed-u169-1" draft="provisional">oromo</language>
+ <language type="or">oriya</language>
+ <language type="os">ossète</language>
+ <language type="osa">osage</language>
+ <language type="ota">turc ottoman (1500-1928)</language>
+ <language type="oto">langues otomangues</language>
+ <language type="pa">pendjabi</language>
+ <language type="pa" alt="proposed-u148-1" draft="unconfirmed">panjâbî</language>
+ <language type="paa">papoues (autre)</language>
+ <language type="paa" alt="proposed-u148-1" draft="unconfirmed">langues papoues (autres)</language>
+ <language type="paa" alt="proposed-u169-1" draft="provisional">papoues, autres langues</language>
+ <language type="pag">pangasinan</language>
+ <language type="pal">pahlavi</language>
+ <language type="pam" draft="provisional">pampangan</language>
+ <language type="pap">papiamento</language>
+ <language type="pau">palau</language>
+ <language type="pau" alt="proposed-u148-1" draft="unconfirmed">paluan, palaosien</language>
+ <language type="pau" alt="proposed-u169-1" draft="provisional">paluan</language>
+ <language type="peo">vieux perser (ca. 600-400 av. J.-C.)</language>
+ <language type="peo" alt="proposed-u148-2" draft="unconfirmed">persan ancien (vers 600-400 av. J.-C.)</language>
+ <language type="peo" alt="proposed-u169-1" draft="provisional">perse, vieux (vers 600-400 av. J.-C.)</language>
+ <language type="phi">philippines (autre)</language>
+ <language type="phi" alt="proposed-u148-1" draft="unconfirmed">langues philippines (autres)</language>
+ <language type="phi" alt="proposed-u169-1" draft="provisional">philippines, autres langues</language>
+ <language type="phn">phénicien</language>
+ <language type="pi">pali</language>
+ <language type="pi" alt="proposed-u148-1" draft="unconfirmed">pâli</language>
+ <language type="pl">polonais</language>
+ <language type="pon">pohnpei</language>
+ <language type="pra">langues prâkrit</language>
+ <language type="pra" alt="proposed-u148-1" draft="unconfirmed">langues prâkrits</language>
+ <language type="pra" alt="proposed-u169-1" draft="provisional">prâkrit</language>
+ <language type="pro">vieux provençal (jusqu’à 1500)</language>
+ <language type="pro" references="RP1" alt="proposed-u169-1" draft="provisional">provençal ancien (jusqu'à 1500)</language>
+ <language type="ps">pachto</language>
+ <language type="pt">portugais</language>
+ <language type="qu">quechua</language>
+ <language type="qu" alt="proposed-u148-1" draft="unconfirmed">langues quechuas</language>
+ <language type="raj">rajasthani</language>
+ <language type="raj" alt="proposed-u148-2" draft="unconfirmed">langues râjasthânîes</language>
+ <language type="rap">rapanui</language>
+ <language type="rar">Rarotonga</language>
+ <language type="rar" alt="proposed-u148-1" draft="unconfirmed">rarotongien, maori des ÃŽles Cook</language>
+ <language type="rar" references="RP1" alt="proposed-u169-1" draft="provisional">rarotonga</language>
+ <language type="rm">rhéto-roman</language>
+ <language type="rn">roundi</language>
+ <language type="ro">roumain</language>
+ <language type="roa" references="RP1">romanes, autres langues</language>
+ <language type="roa" references="RP1" alt="proposed-u148-1" draft="unconfirmed">langues romanes (autres)</language>
+ <language type="rom">tzigane</language>
+ <language type="rom" references="RP1" alt="proposed-u169-1" draft="provisional">tsigane</language>
+ <language type="root">racine</language>
+ <language type="root" alt="proposed-u148-1" draft="provisional">(racine)</language>
+ <language type="ru">russe</language>
+ <language type="rup" references="RP1">aroumain ; macédo-roumain</language>
+ <language type="rup" references="RP1" alt="proposed-u148-2" draft="unconfirmed">aroumain, valaque, macédo-roumain</language>
+ <language type="rw">rwanda</language>
+ <language type="sa">sanskrit</language>
+ <language type="sad">sandawe</language>
+ <language type="sah">iakoute</language>
+ <language type="sai" references="RP1">indiennes d'Amérique du Sud, autres langues</language>
+ <language type="sai" references="RP1" alt="proposed-u148-2" draft="unconfirmed">langues amérindiennes du Sud (autres)</language>
+ <language type="sal">langues salisha</language>
+ <language type="sal" alt="proposed-u148-1" draft="unconfirmed">langues salishas</language>
+ <language type="sal" references="RP1" alt="proposed-u169-1" draft="provisional">salish, langues</language>
+ <language type="sam">samaritain</language>
+ <language type="sam" alt="proposed-u148-1" draft="unconfirmed">araméen samaritain</language>
+ <language type="sas">sasak</language>
+ <language type="sat">santal</language>
+ <language type="sat" alt="proposed-u148-1" draft="unconfirmed">santâlî</language>
+ <language type="sc">sarde</language>
+ <language type="scn">sicilien</language>
+ <language type="sco">écossais</language>
+ <language type="sd">sindhi</language>
+ <language type="sd" alt="proposed-u148-1" draft="unconfirmed">sindhî</language>
+ <language type="se">sami du Nord</language>
+ <language type="sel">selkoupe</language>
+ <language type="sem" references="RP1">sémitiques, autres langues</language>
+ <language type="sem" references="RP1" alt="proposed-u148-1" draft="unconfirmed">langues sémitiques (autres)</language>
+ <language type="sg">sango</language>
+ <language type="sga">irlandais ancien (jusqu’à 900)</language>
+ <language type="sgn">langues des signes</language>
+ <language type="sh">serbo-croate</language>
+ <language type="shn">chan</language>
+ <language type="shn" alt="proposed-u148-1" draft="unconfirmed">taï shan</language>
+ <language type="si">singhalais</language>
+ <language type="sid">sidamo</language>
+ <language type="sio" references="RP1" draft="unconfirmed">sioux, langues</language>
+ <language type="sit" references="RP1">sino-tibétaines, autres langues</language>
+ <language type="sit" references="RP1" alt="proposed-u148-1" draft="unconfirmed">langues sino-tibétaines (autres)</language>
+ <language type="sk">slovaque</language>
+ <language type="sl">slovène</language>
+ <language type="sla" references="RP1">slaves, autres langues</language>
+ <language type="sla" references="RP1" alt="proposed-u148-1" draft="unconfirmed">langues slaves (autres)</language>
+ <language type="sm">samoan</language>
+ <language type="sma">sami du Sud</language>
+ <language type="sma" alt="proposed-u148-1" draft="unconfirmed">sami méridional</language>
+ <language type="smi">sami (autre)</language>
+ <language type="smi" alt="proposed-u148-1" draft="unconfirmed">langues samies (autres)</language>
+ <language type="smi" references="RP1" alt="proposed-u169-1" draft="provisional">sami, autres langues</language>
+ <language type="smj">sami de Lule</language>
+ <language type="smn">sami d’Inari</language>
+ <language type="sms">sami skolt</language>
+ <language type="sn">shona</language>
+ <language type="snk">soninké</language>
+ <language type="so">somali</language>
+ <language type="sog">sogdien</language>
+ <language type="son">songhai</language>
+ <language type="son" alt="proposed-u148-1" draft="unconfirmed">sonrhaï</language>
+ <language type="sq">albanais</language>
+ <language type="sr">serbe</language>
+ <language type="srn" references="RP1" draft="provisional">sranan tongo</language>
+ <language type="srr">sérère</language>
+ <language type="ss">swati</language>
+ <language type="ss" alt="proposed-u148-1" draft="unconfirmed">siswati, swati</language>
+ <language type="ssa">nilo-sahariennes (autre)</language>
+ <language type="ssa" alt="proposed-u148-1" draft="unconfirmed">langues nilo-sahariennes (autres)</language>
+ <language type="ssa" references="RP1" alt="proposed-u169-1" draft="provisional">nilo-sahariennes, autres langues</language>
+ <language type="st">sotho du Sud</language>
+ <language type="st" alt="proposed-u148-1" draft="unconfirmed">sotho méridional</language>
+ <language type="su">soundanais</language>
+ <language type="suk">sukuma</language>
+ <language type="sus">soussou</language>
+ <language type="sux">sumérien</language>
+ <language type="sv">suédois</language>
+ <language type="sw">swahili</language>
+ <language type="syr">syriaque</language>
+ <language type="ta">tamoul</language>
+ <language type="tai">thaïes, autres langues</language>
+ <language type="tai" alt="proposed-u148-2" draft="unconfirmed">langues thaïes (autres)</language>
+ <language type="te">télougou</language>
+ <language type="tem">temne</language>
+ <language type="ter">tereno</language>
+ <language type="tet">tetum</language>
+ <language type="tg">tadjik</language>
+ <language type="th">thaï</language>
+ <language type="ti">tigrigna</language>
+ <language type="tig">tigré</language>
+ <language type="tk">turkmène</language>
+ <language type="tkl" draft="provisional">tokelauan</language>
+ <language type="tl">tagalog</language>
+ <language type="tlh">klingon</language>
+ <language type="tli">tlingit</language>
+ <language type="tmh">tamacheq</language>
+ <language type="tn">setswana</language>
+ <language type="tn" references="RP3" alt="proposed-u169-1" draft="provisional">tswana</language>
+ <language type="to">tongan (ÃŽles Tonga)</language>
+ <language type="tog">tonga (Nyasa)</language>
+ <language type="tog" alt="proposed-u148-1" draft="unconfirmed">tongan (Nyasa)</language>
+ <language type="tpi">tok pisin</language>
+ <language type="tr">turc</language>
+ <language type="ts">tsonga</language>
+ <language type="tsi">tsimshian</language>
+ <language type="tt">tatar</language>
+ <language type="tum">tumbuka</language>
+ <language type="tup">langues tupi</language>
+ <language type="tup" alt="proposed-u148-1" draft="unconfirmed">langues tupis</language>
+ <language type="tup" references="RP1" alt="proposed-u169-1" draft="provisional">tupi, langues</language>
+ <language type="tut" references="RP1">altaïques, autres langues</language>
+ <language type="tut" references="RP1" alt="proposed-u148-2" draft="unconfirmed">langues altaïques (autres)</language>
+ <language type="tvl" references="RP3" draft="provisional">tuvaluan</language>
+ <language type="tw">twi</language>
+ <language type="ty">tahitien</language>
+ <language type="tyv">touva</language>
+ <language type="udm">oudmourte</language>
+ <language type="ug">ouïgour</language>
+ <language type="uga">ougaritique</language>
+ <language type="uk">ukrainien</language>
+ <language type="umb">umbundu</language>
+ <language type="und">indéterminé</language>
+ <language type="ur">ourdou</language>
+ <language type="uz">ouzbek</language>
+ <language type="vai">vaï</language>
+ <language type="ve">venda</language>
+ <language type="vi">vietnamien</language>
+ <language type="vo">volapük</language>
+ <language type="vot">vote</language>
+ <language type="wa">wallon</language>
+ <language type="wak">langues wakashennes</language>
+ <language type="wak" references="RP1" alt="proposed-u169-1" draft="provisional">wakashennes, langues</language>
+ <language type="wal">walamo</language>
+ <language type="war">waray</language>
+ <language type="was">washo</language>
+ <language type="wen">langues sorabes</language>
+ <language type="wen" references="RP1" alt="proposed-u169-1" draft="provisional">sorabes, langues</language>
+ <language type="wo">wolof</language>
+ <language type="xal">kalmouk</language>
+ <language type="xh">xhosa</language>
+ <language type="yap">yapois</language>
+ <language type="yi">yiddish</language>
+ <language type="yo">yoruba</language>
+ <language type="ypk">langues yupik</language>
+ <language type="ypk" alt="proposed-u148-1" draft="unconfirmed">langues yupiks</language>
+ <language type="ypk" references="RP1" alt="proposed-u169-1" draft="provisional">yupik, langues</language>
+ <language type="za">zhuang</language>
+ <language type="zap">zapotèque</language>
+ <language type="zen">zenaga</language>
+ <language type="zh">chinois</language>
+ <language type="znd" references="RP1" draft="provisional">zandé</language>
+ <language type="zu">zoulou</language>
+ <language type="zun">zuni</language>
+ </languages>
+ <scripts>
+ <script type="Arab">arabe</script>
+ <script type="Armn">arménien</script>
+ <script type="Bali" draft="provisional">balinais</script>
+ <script type="Batk" draft="provisional">batak</script>
+ <script type="Beng">bengâglî</script>
+ <script type="Beng" alt="proposed-u148-1" draft="provisional">bengalî</script>
+ <script type="Blis" references="RP5">symboles Bliss</script>
+ <script type="Bopo">bopomofo</script>
+ <script type="Brah" draft="provisional">brâhmî</script>
+ <script type="Brai">braille</script>
+ <script type="Bugi" references="RP5" draft="provisional">bouguis</script>
+ <script type="Buhd">bouhide</script>
+ <script type="Cans">syllabaire autochthone canadien unifié</script>
+ <script type="Cans" references="RP5" alt="proposed-u169-1" draft="provisional">syllabaire autochtone canadien unifié</script>
+ <script type="Cham" draft="provisional">cham</script>
+ <script type="Cher">tchérokî</script>
+ <script type="Cirt" draft="provisional">cirth</script>
+ <script type="Copt">copte</script>
+ <script type="Cprt" references="RP5">syllabaire chypriote</script>
+ <script type="Cyrl">cyrillique</script>
+ <script type="Cyrs" references="RP5">cyrillique (variante slavonne)</script>
+ <script type="Deva">dévanâgarî</script>
+ <script type="Dsrt">déséret</script>
+ <script type="Egyd">démotique égyptien</script>
+ <script type="Egyh">hiératique égyptien</script>
+ <script type="Egyp">hiéroglyphes égyptiens</script>
+ <script type="Ethi">éthiopique</script>
+ <script type="Ethi" references="RP5" alt="proposed-u169-1" draft="provisional">éthiopien</script>
+ <script type="Geok" draft="unconfirmed">khoutsouri (assomtavrouli et nuskhuri)</script>
+ <script type="Geor">géorgien</script>
+ <script type="Glag">glagolitique</script>
+ <script type="Goth">gotique</script>
+ <script type="Grek">grec</script>
+ <script type="Gujr">goudjarâtî</script>
+ <script type="Guru">gourmoukhî</script>
+ <script type="Hang">hangûl</script>
+ <script type="Hani" references="RP5">idéogrammes han</script>
+ <script type="Hano">hanounóo</script>
+ <script type="Hano" alt="proposed-u148-2" draft="unconfirmed">hanounoo</script>
+ <script type="Hans" references="RP5">idéogrammes han (variante simplifiée)</script>
+ <script type="Hant" references="RP5">idéogrammes han (variante traditionnelle)</script>
+ <script type="Hebr">hébreu</script>
+ <script type="Hira">hiragana</script>
+ <script type="Hmng" draft="provisional">pahawh hmong</script>
+ <script type="Hrkt">katakana ou hiragana</script>
+ <script type="Hung" references="RP5" draft="provisional">ancien hongrois</script>
+ <script type="Inds" draft="unconfirmed">indus (harappan)</script>
+ <script type="Ital">ancien italique</script>
+ <script type="Java" draft="provisional">javanais</script>
+ <script type="Kali" references="RP5" draft="provisional">kayah li</script>
+ <script type="Kana">katakana</script>
+ <script type="Khar" references="RP5" draft="provisional">kharochthî</script>
+ <script type="Khmr">khmer</script>
+ <script type="Knda">kannara</script>
+ <script type="Laoo" draft="provisional">lao</script>
+ <script type="Latf" references="RP5">latin (variante brisée)</script>
+ <script type="Latg">latin (variante gaélique)</script>
+ <script type="Latn">latin</script>
+ <script type="Lepc" draft="unconfirmed">lepcha (rong)</script>
+ <script type="Limb">limbou</script>
+ <script type="Lina">linéaire A</script>
+ <script type="Linb">linéaire B</script>
+ <script type="Mand" draft="provisional">mandéen</script>
+ <script type="Maya">hiéroglyphes mayas</script>
+ <script type="Mero" draft="provisional">méroïtique</script>
+ <script type="Mlym">malayâlam</script>
+ <script type="Mong">mongol</script>
+ <script type="Mymr">birman</script>
+ <script type="Nkoo" draft="provisional">n’ko</script>
+ <script type="Ogam">ogam</script>
+ <script type="Orkh" draft="provisional">orkhon</script>
+ <script type="Orya">oriyâ</script>
+ <script type="Osma">osmanais</script>
+ <script type="Perm" draft="provisional">ancien permien</script>
+ <script type="Phag" references="RP5" draft="provisional">phags pa</script>
+ <script type="Phnx" draft="provisional">phénicien</script>
+ <script type="Plrd" draft="provisional">phonétique de Pollard</script>
+ <script type="Qaai">hérité</script>
+ <script type="Qaai" alt="proposed-u148-1" draft="unconfirmed">(hérité)</script>
+ <script type="Roro" draft="provisional">rongorongo</script>
+ <script type="Runr">runique</script>
+ <script type="Sara" references="RP5" draft="provisional">sarati</script>
+ <script type="Shaw">shavien</script>
+ <script type="Sinh">singhalais</script>
+ <script type="Sylo" references="RP5" draft="provisional">sylotî nâgrî</script>
+ <script type="Syrc">syriaque</script>
+ <script type="Syre" references="RP5" draft="provisional">syriaque (variante estranghélo)</script>
+ <script type="Syrj" draft="provisional">syriaque (variante occidentale)</script>
+ <script type="Syrn" draft="provisional">syriaque (variante orientale)</script>
+ <script type="Tagb">tagbanoua</script>
+ <script type="Tale">taï-le</script>
+ <script type="Talu" references="RP5" draft="provisional">nouveau taï-lue</script>
+ <script type="Taml">tamoul</script>
+ <script type="Telu">télougou</script>
+ <script type="Teng" draft="provisional">tengwar</script>
+ <script type="Tfng" draft="provisional">tifinagh (berbère)</script>
+ <script type="Tglg">tagal</script>
+ <script type="Thaa">thâna</script>
+ <script type="Thai">thaï</script>
+ <script type="Tibt">tibétain</script>
+ <script type="Ugar">ougaritique</script>
+ <script type="Vaii" draft="provisional">vaï</script>
+ <script type="Visp" references="RP5" draft="provisional">parole visible</script>
+ <script type="Xpeo" references="RP5">cunéiforme persépolitain</script>
+ <script type="Xsux" references="RP5">cunéiforme suméro-akkadien</script>
+ <script type="Yiii">yi</script>
+ <script type="Zxxx" draft="unconfirmed">(codet pour les langues non écrites)</script>
+ <script type="Zyyy" draft="unconfirmed">(commun)</script>
+ <script type="Zzzz" references="RP5" draft="provisional">codet pour écriture non codée</script>
+ </scripts>
+ <territories>
+ <territory type="001">Monde</territory>
+ <territory type="002">Afrique</territory>
+ <territory type="003">Amérique du Nord continentale</territory>
+ <territory type="005">Amérique du Sud</territory>
+ <territory type="009">Océanie</territory>
+ <territory type="011">Afrique occidentale</territory>
+ <territory type="013">Amérique centrale</territory>
+ <territory type="014">Afrique orientale</territory>
+ <territory type="015">Afrique septentrionale</territory>
+ <territory type="017">Afrique centrale</territory>
+ <territory type="018">Afrique australe</territory>
+ <territory type="019">Amériques</territory>
+ <territory type="021">Amérique du Nord</territory>
+ <territory type="029">Caraïbes</territory>
+ <territory type="030">Asie orientale</territory>
+ <territory type="034">Asie du Sud</territory>
+ <territory type="035">Asie du Sud-Est</territory>
+ <territory type="039">Europe méridionale</territory>
+ <territory type="053">Australie et Nouvelle-Zélande</territory>
+ <territory type="054">Mélanésie</territory>
+ <territory type="057">région micronésienne</territory>
+ <territory type="061">Polynésie</territory>
+ <territory type="062">Asie centrale et du Sud</territory>
+ <territory type="142">Asie</territory>
+ <territory type="143">Asie centrale</territory>
+ <territory type="145">Asie occidentale</territory>
+ <territory type="150">Europe</territory>
+ <territory type="151">Europe orientale</territory>
+ <territory type="154">Europe septentrionale</territory>
+ <territory type="155">Europe occidentale</territory>
+ <territory type="172">Communauté des États indépendants</territory>
+ <territory type="419">Amérique latine et Caraïbes</territory>
+ <territory type="830">anglo-normandes, îles</territory>
+ <territory type="830" alt="proposed-u148-1" draft="unconfirmed">Iles anglo-normandes</territory>
+ <territory type="IM">ÃŽle de Man</territory>
+ <territory type="IM" alt="proposed-u148-1" draft="unconfirmed">Ile de Man</territory>
+ <territory type="AD">Andorre</territory>
+ <territory type="AE">Émirats arabes unis</territory>
+ <territory type="AF">Afghanistan</territory>
+ <territory type="AG">Antigua-et-Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albanie</territory>
+ <territory type="AM">Arménie</territory>
+ <territory type="AN">Antilles néerlandaises</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarctique</territory>
+ <territory type="AR">Argentine</territory>
+ <territory type="AS">Samoa américaines</territory>
+ <territory type="AT">Autriche</territory>
+ <territory type="AU">Australie</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX" references="RP7">Åland, îles</territory>
+ <territory type="AX" references="RP7" alt="proposed-u148-1" draft="unconfirmed">Iles Ã…land</territory>
+ <territory type="AZ">Azerbaïdjan</territory>
+ <territory type="BA">Bosnie-Herzégovine</territory>
+ <territory type="BB">Barbade</territory>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BE">Belgique</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgarie</territory>
+ <territory type="BH">Bahreïn</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Bénin</territory>
+ <territory type="BM">Bermudes</territory>
+ <territory type="BN" references="RP6">Brunéi Darussalam</territory>
+ <territory type="BO">Bolivie</territory>
+ <territory type="BR">Brésil</territory>
+ <territory type="BS">Bahamas</territory>
+ <territory type="BT">Bhoutan</territory>
+ <territory type="BV" references="RP7">Bouvet, île</territory>
+ <territory type="BV" references="RP7" alt="proposed-u148-1" draft="unconfirmed">Ile Bouvet</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Bélarus</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Canada</territory>
+ <territory type="CC" references="RP7">Cocos (Keeling), îles</territory>
+ <territory type="CC" references="RP7" alt="proposed-u148-1" draft="unconfirmed">Iles Cocos (Keeling)</territory>
+ <territory type="CD" references="RP6" draft="unconfirmed">Congo, la république démocratique du</territory>
+ <territory type="CF" references="RP6" draft="unconfirmed">Centrafricaine, république</territory>
+ <territory type="CG">Congo</territory>
+ <territory type="CH">Suisse</territory>
+ <territory type="CI">Côte d’Ivoire</territory>
+ <territory type="CK" references="RP6">Cook, îles</territory>
+ <territory type="CK" references="RP6" alt="proposed-u148-1" draft="unconfirmed">Iles Cook</territory>
+ <territory type="CL">Chili</territory>
+ <territory type="CM">Cameroun</territory>
+ <territory type="CN">Chine</territory>
+ <territory type="CO">Colombie</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS">Serbie-et-Monténégro</territory>
+ <territory type="CU">Cuba</territory>
+ <territory type="CV">Cap Vert</territory>
+ <territory type="CX" references="RP6">Christmas, île</territory>
+ <territory type="CX" references="RP6" alt="proposed-u148-1" draft="unconfirmed">Ile Christmas</territory>
+ <territory type="CY">Chypre</territory>
+ <territory type="CZ" references="RP6" draft="unconfirmed">Tchèque, république</territory>
+ <territory type="DE">Allemagne</territory>
+ <territory type="DJ">Djibouti</territory>
+ <territory type="DK">Danemark</territory>
+ <territory type="DM">Dominique</territory>
+ <territory type="DO" references="RP6" draft="unconfirmed">Dominicaine, république</territory>
+ <territory type="DZ">Algérie</territory>
+ <territory type="EC">Équateur</territory>
+ <territory type="EE">Estonie</territory>
+ <territory type="EG">Égypte</territory>
+ <territory type="EH">Sahara occidental</territory>
+ <territory type="ER">Érythrée</territory>
+ <territory type="ES">Espagne</territory>
+ <territory type="ET">Éthiopie</territory>
+ <territory type="FI">Finlande</territory>
+ <territory type="FJ">Fidji</territory>
+ <territory type="FK" references="RP6">Falkland, îles (Malvinas)</territory>
+ <territory type="FK" references="RP6" alt="proposed-u148-2" draft="unconfirmed">Iles Falkland (Malouines)</territory>
+ <territory type="FM" references="RP6">Micronésie, états fédérés de</territory>
+ <territory type="FM" references="RP6" alt="proposed-u148-1" draft="unconfirmed">Micronésie, États fédérés de</territory>
+ <territory type="FO" references="RP6">Féroé, îles</territory>
+ <territory type="FO" references="RP6" alt="proposed-u148-1" draft="unconfirmed">Iles Féroé</territory>
+ <territory type="FR">France</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Royaume-Uni</territory>
+ <territory type="GD">Grenade</territory>
+ <territory type="GE">Géorgie</territory>
+ <territory type="GF">Guyane française</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Groenland</territory>
+ <territory type="GM">Gambie</territory>
+ <territory type="GN">Guinée</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Guinée équatoriale</territory>
+ <territory type="GR">Grèce</territory>
+ <territory type="GS" references="RP6">Géorgie du Sud et les îles Sandwich du Sud</territory>
+ <territory type="GS" references="RP6" alt="proposed-u148-3" draft="unconfirmed">Géorgie du Sud et les iles Sandwich du Sud</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinée-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK" references="RP6" draft="unconfirmed">Hong-Kong</territory>
+ <territory type="HM" references="RP6">Heard, île et McDonald, îles</territory>
+ <territory type="HM" references="RP6" alt="proposed-u148-2" draft="unconfirmed">Iles Heard et McDonald</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Croatie</territory>
+ <territory type="HT">Haïti</territory>
+ <territory type="HU">Hongrie</territory>
+ <territory type="ID">Indonésie</territory>
+ <territory type="IE">Irlande</territory>
+ <territory type="IL">Israël</territory>
+ <territory type="IN">Inde</territory>
+ <territory type="IO" references="RP6" draft="unconfirmed">Océan indien, territoire britannique de l'</territory>
+ <territory type="IQ">Iraq</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Islande</territory>
+ <territory type="IT">Italie</territory>
+ <territory type="JM">Jamaïque</territory>
+ <territory type="JO">Jordanie</territory>
+ <territory type="JP">Japon</territory>
+ <territory type="KE">Kenya</territory>
+ <territory type="KG">Kirghizistan</territory>
+ <territory type="KH">Cambodge</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Comores</territory>
+ <territory type="KN" references="RP6">Saint-Kitts-et-Nevis</territory>
+ <territory type="KN" references="RP6" alt="proposed-u148-1" draft="unconfirmed">Saint-Christophe-et-Niévès</territory>
+ <territory type="KP">Corée du Nord</territory>
+ <territory type="KR">Corée du Sud</territory>
+ <territory type="KW">Koweït</territory>
+ <territory type="KY">Caïmanes, îles</territory>
+ <territory type="KY" alt="proposed-u148-1" draft="unconfirmed">Iles Caïmanes</territory>
+ <territory type="KZ">Kazakhstan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Liban</territory>
+ <territory type="LC">Sainte-Lucie</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Libéria</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT" references="RP6">Lituanie</territory>
+ <territory type="LU">Luxembourg</territory>
+ <territory type="LV">Lettonie</territory>
+ <territory type="LY">Libye</territory>
+ <territory type="MA">Maroc</territory>
+ <territory type="MC">Monaco</territory>
+ <territory type="MD" references="RP7">Moldavie</territory>
+ <territory type="MG">Madagascar</territory>
+ <territory type="MH" references="RP6">Marshall, îles</territory>
+ <territory type="MH" references="RP6" alt="proposed-u148-1" draft="unconfirmed">Iles Marshall</territory>
+ <territory type="MK">Macédoine</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongolie</territory>
+ <territory type="MO" references="RP6" draft="unconfirmed">Macao</territory>
+ <territory type="MP" references="RP6">Mariannes du Nord, îles</territory>
+ <territory type="MP" references="RP6" alt="proposed-u148-1" draft="unconfirmed">Iles Mariannes du Nord</territory>
+ <territory type="MQ">Martinique</territory>
+ <territory type="MR">Mauritanie</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malte</territory>
+ <territory type="MU">Maurice</territory>
+ <territory type="MV">Maldives</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Mexique</territory>
+ <territory type="MY">Malaisie</territory>
+ <territory type="MZ">Mozambique</territory>
+ <territory type="NA">Namibie</territory>
+ <territory type="NC">Nouvelle-Calédonie</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF" references="RP6">Norfolk, île</territory>
+ <territory type="NF" references="RP6" alt="proposed-u148-1" draft="unconfirmed">Ile Norfolk</territory>
+ <territory type="NG">Nigéria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Pays-Bas</territory>
+ <territory type="NO">Norvège</territory>
+ <territory type="NP">Népal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Nioué</territory>
+ <territory type="NZ">Nouvelle-Zélande</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Pérou</territory>
+ <territory type="PF">Polynésie française</territory>
+ <territory type="PG">Papouasie-Nouvelle-Guinée</territory>
+ <territory type="PH">Philippines</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Pologne</territory>
+ <territory type="PM">Saint-Pierre-et-Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Porto Rico</territory>
+ <territory type="PS">Territoire palestinien</territory>
+ <territory type="PT">Portugal</territory>
+ <territory type="PW">Palaos</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Qatar</territory>
+ <territory type="QO" draft="provisional">régions éloignées de l’Océanie</territory>
+ <territory type="RE">Réunion</territory>
+ <territory type="RO">Roumanie</territory>
+ <territory type="RU">Russie</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Arabie saoudite</territory>
+ <territory type="SB">Salomon, îles</territory>
+ <territory type="SB" alt="proposed-u148-1" draft="unconfirmed">Iles Salomon</territory>
+ <territory type="SC">Seychelles</territory>
+ <territory type="SD">Soudan</territory>
+ <territory type="SE">Suède</territory>
+ <territory type="SG">Singapour</territory>
+ <territory type="SH">Sainte-Hélène</territory>
+ <territory type="SI">Slovénie</territory>
+ <territory type="SJ">Svalbard et ÃŽle Jan Mayen</territory>
+ <territory type="SJ" alt="proposed-u148-1" draft="unconfirmed">Svalbard et Ile Jan Mayen</territory>
+ <territory type="SK">Slovaquie</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">Saint-Marin</territory>
+ <territory type="SN">Sénégal</territory>
+ <territory type="SO">Somalie</territory>
+ <territory type="SR">Suriname</territory>
+ <territory type="ST">Sao Tomé-et-Principe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Syrie</territory>
+ <territory type="SZ">Swaziland</territory>
+ <territory type="TC" references="RP6">Turks et Caïques, îles</territory>
+ <territory type="TC" references="RP6" alt="proposed-u148-1" draft="unconfirmed">Iles Turks et Caïques</territory>
+ <territory type="TD">Tchad</territory>
+ <territory type="TF">Terres australes françaises</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Thaïlande</territory>
+ <territory type="TJ">Tadjikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Timor-Leste</territory>
+ <territory type="TM">Turkménistan</territory>
+ <territory type="TN">Tunisie</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turquie</territory>
+ <territory type="TT">Trinité-et-Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taïwan</territory>
+ <territory type="TZ">Tanzanie</territory>
+ <territory type="UA">Ukraine</territory>
+ <territory type="UG">Ouganda</territory>
+ <territory type="UM">Îles Mineures Éloignées des États-Unis</territory>
+ <territory type="UM" alt="proposed-u148-1" draft="unconfirmed">Iles mineures éloignées des États-Unis</territory>
+ <territory type="UM" references="RP6" alt="proposed-u169-1" draft="provisional">Îles mineures éloignées des États-Unis</territory>
+ <territory type="US">États-Unis</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Ouzbékistan</territory>
+ <territory type="VA">Saint-Siège (Etat de la Cité du Vatican)</territory>
+ <territory type="VA" alt="proposed-u148-1" draft="provisional">Saint-Siège (État de la Cité du Vatican)</territory>
+ <territory type="VC">Saint-Vincent-et-les Grenadines</territory>
+ <territory type="VE" draft="provisional">Venezuela</territory>
+ <territory type="VG">ÃŽles Vierges britanniques</territory>
+ <territory type="VG" alt="proposed-u148-1" draft="unconfirmed">Iles Vierges britanniques</territory>
+ <territory type="VI">Îles Vierges des États-Unis</territory>
+ <territory type="VI" alt="proposed-u148-1" draft="unconfirmed">Iles Vierges des États-Unis</territory>
+ <territory type="VN">Viêt Nam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis-et-Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Yémen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Afrique du Sud</territory>
+ <territory type="ZM">Zambie</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ <variants>
+ <variant type="1901">orthographe allemande traditionnelle</variant>
+ <variant type="1996">orthographe allemande de 1996</variant>
+ <variant type="NEDIS">dialecte de Natisone</variant>
+ <variant type="POLYTONI">polytonique</variant>
+ <variant type="REVISED">orthographe révisée</variant>
+ <variant type="ROZAJ">dialecte de Resia</variant>
+ <variant type="SAAHO" draft="provisional">sialecte saho</variant>
+ </variants>
+ <keys>
+ <key type="calendar">Calendrier</key>
+ <key type="collation">Ordonnancement</key>
+ <key type="currency">Devise</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">chinois traditionnel (Big5)</type>
+ <type type="buddhist" key="calendar">Calendrier bouddhiste</type>
+ <type type="chinese" key="calendar">Calendrier chinois</type>
+ <type type="direct" key="collation">Ordre direct</type>
+ <type type="gb2312han" key="collation">chinois simplifié (GB2312)</type>
+ <type type="gregorian" key="calendar">Calendrier grégorien</type>
+ <type type="hebrew" key="calendar">Calendrier hébraïque</type>
+ <type type="islamic" key="calendar">Calendrier musulman</type>
+ <type type="islamic-civil" key="calendar">Calendrier civil musulman</type>
+ <type type="japanese" key="calendar">Calendrier japonais</type>
+ <type type="phonebook" key="collation">Ordre de l’annuaire</type>
+ <type type="pinyin" key="collation">Ordre pinyin</type>
+ <type type="stroke" key="collation">Ordre des traits</type>
+ <type type="traditional" key="collation">Ordre traditionnel</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US">américain</measurementSystemName>
+ <measurementSystemName type="metric">métrique</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a à â æ b c ç d e é è ê ë f-i î ï j-o ô œ p-u ù û ü v-y ÿ z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[å ñ ó]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>«</quotationStart>
+ <quotationEnd>»</quotationEnd>
+ <alternateQuotationStart>“</alternateQuotationStart>
+ <alternateQuotationEnd>â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <localizedPatternChars>GaMjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">janv.</month>
+ <month type="2">févr.</month>
+ <month type="3">mars</month>
+ <month type="4">avr.</month>
+ <month type="5">mai</month>
+ <month type="6">juin</month>
+ <month type="7">juil.</month>
+ <month type="8">août</month>
+ <month type="9">sept.</month>
+ <month type="10">oct.</month>
+ <month type="11">nov.</month>
+ <month type="12">déc.</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">janvier</month>
+ <month type="2">février</month>
+ <month type="3">mars</month>
+ <month type="4">avril</month>
+ <month type="5">mai</month>
+ <month type="6">juin</month>
+ <month type="7">juillet</month>
+ <month type="8">août</month>
+ <month type="9">septembre</month>
+ <month type="10">octobre</month>
+ <month type="11">novembre</month>
+ <month type="12">décembre</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">J</month>
+ <month type="2">F</month>
+ <month type="3">M</month>
+ <month type="4">A</month>
+ <month type="5">M</month>
+ <month type="6">J</month>
+ <month type="7">J</month>
+ <month type="8">A</month>
+ <month type="9">S</month>
+ <month type="10">O</month>
+ <month type="11">N</month>
+ <month type="12">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">dim.</day>
+ <day type="mon">lun.</day>
+ <day type="tue">mar.</day>
+ <day type="wed">mer.</day>
+ <day type="thu">jeu.</day>
+ <day type="fri">ven.</day>
+ <day type="sat">sam.</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">dimanche</day>
+ <day type="mon">lundi</day>
+ <day type="tue">mardi</day>
+ <day type="wed">mercredi</day>
+ <day type="thu">jeudi</day>
+ <day type="fri">vendredi</day>
+ <day type="sat">samedi</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">D</day>
+ <day type="mon">L</day>
+ <day type="tue">M</day>
+ <day type="wed">M</day>
+ <day type="thu">J</day>
+ <day type="fri">V</day>
+ <day type="sat">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">T1</quarter>
+ <quarter type="2">T2</quarter>
+ <quarter type="3">T3</quarter>
+ <quarter type="4">T4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1er trimestre</quarter>
+ <quarter type="2">2e trimestre</quarter>
+ <quarter type="3">3e trimestre</quarter>
+ <quarter type="4">4e trimestre</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraNames>
+ <era type="0">av. J.-C.</era>
+ <era type="1">ap. J.-C.</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">av. J.-C.</era>
+ <era type="1">apr. J.-C.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d MMM yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH' h 'mm z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="provisional">QQQQ yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ <calendar type="hebrew">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1">Tisseri</month>
+ <month type="2">Hesvan</month>
+ <month type="4">Tébeth</month>
+ <month type="5">Schébat</month>
+ <month type="6">Adar</month>
+ <month type="7">Adar II</month>
+ <month type="8">Nissan</month>
+ <month type="11">Tamouz</month>
+ <month type="12">Ab</month>
+ <month type="13">Elloul</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="islamic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1">Mouharram</month>
+ <month type="3">RabiÊ»-oul-Aououal</month>
+ <month type="4">RabiÊ»-out-Tani</month>
+ <month type="5">Djoumada-l-Oula</month>
+ <month type="6">Djoumada-t-Tania</month>
+ <month type="7">Radjab</month>
+ <month type="8">Chaʻban</month>
+ <month type="10">Chaououal</month>
+ <month type="11">Dou-l-Qaʻda</month>
+ <month type="12">Dou-l-Hidjja</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <gmtFormat draft="unconfirmed">HMG{0}</gmtFormat>
+ <zone type="Africa/Timbuktu">
+ <exemplarCity>Tombouctou</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/ComodRivadavia">
+ <exemplarCity>Comodoro Rivadavia</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Pôle Sud</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity>Dumont d'Urville</exemplarCity>
+ </zone>
+ <zone type="Antarctica/McMurdo">
+ <exemplarCity>Mac Murdo</exemplarCity>
+ </zone>
+ <zone type="Australia/Adelaide">
+ <exemplarCity>Adélaïde</exemplarCity>
+ </zone>
+ <zone type="America/Manaus">
+ <exemplarCity>Manaos</exemplarCity>
+ </zone>
+ <zone type="America/Vancouver">
+ <long>
+ <generic>Heure du Pacifique</generic>
+ <standard>Heure normale du Pacifique</standard>
+ <daylight>Heure avancée du Pacifique</daylight>
+ </long>
+ <short>
+ <generic>HP</generic>
+ <standard>HNP</standard>
+ <daylight>HAP</daylight>
+ </short>
+ </zone>
+ <zone type="America/Edmonton">
+ <long>
+ <generic>Heure des Rocheuses</generic>
+ <standard>Heure normale des Rocheuses</standard>
+ <daylight>Heure avancée des Rocheuses</daylight>
+ </long>
+ <short>
+ <generic>HR</generic>
+ <standard>HNR</standard>
+ <daylight>HAR</daylight>
+ </short>
+ </zone>
+ <zone type="America/Winnipeg">
+ <long>
+ <generic>Heure du Centre</generic>
+ <standard>Heure normale du Centre</standard>
+ <daylight>Heure avancée du Centre</daylight>
+ </long>
+ <short>
+ <generic>HC</generic>
+ </short>
+ </zone>
+ <zone type="America/Montreal">
+ <long>
+ <generic>Heure de l’Est</generic>
+ <standard>Heure normale de l’Est</standard>
+ <daylight>Heure avancée de l’Est</daylight>
+ </long>
+ <short>
+ <generic>HE</generic>
+ <standard>HNE</standard>
+ <daylight>HAE</daylight>
+ </short>
+ <exemplarCity>Montréal</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <generic>Heure de l’Atlantique</generic>
+ <standard>Heure normale de l’Atlantique</standard>
+ <daylight>Heure avancée de l’Atlantique</daylight>
+ </long>
+ <short>
+ <generic>HA</generic>
+ <standard>HNA</standard>
+ <daylight>HAA</daylight>
+ </short>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <generic>Heure de Terre-Neuve</generic>
+ <standard>Heure normale de Terre-Neuve</standard>
+ <daylight>Heure avancée de Terre-Neuve</daylight>
+ </long>
+ <short>
+ <generic>HT</generic>
+ <standard>HNT</standard>
+ <daylight>HAT</daylight>
+ </short>
+ <exemplarCity>Saint-Jean de Terre-Neuve</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>Île de Pâques</exemplarCity>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity>Kachgar</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <standard>Heure normale de Chine</standard>
+ <daylight>Heure avancée de Chine</daylight>
+ </long>
+ <short>
+ <standard>HNC</standard>
+ <daylight>HAC</daylight>
+ </short>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>ÃŽles Canaries</exemplarCity>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <generic>Heure de l’Europe centrale</generic>
+ <standard>Heure normale de l’Europe centrale</standard>
+ <daylight>Heure avancée de l’Europe centrale</daylight>
+ </long>
+ <short>
+ <generic>HEC</generic>
+ <standard>HNEC</standard>
+ <daylight>HAEC</daylight>
+ </short>
+ <exemplarCity>Paris</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>Londres</exemplarCity>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <standard>Heure normale d’Israël</standard>
+ <daylight>Heure avancée d’Israël</daylight>
+ </long>
+ <short>
+ <standard>HNI</standard>
+ <daylight>HAI</daylight>
+ </short>
+ <exemplarCity>Jérusalem</exemplarCity>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <standard>Heure normale du Japon</standard>
+ <daylight>Heure avancée du Japon</daylight>
+ </long>
+ <short>
+ <standard>HNJ</standard>
+ <daylight>HAJ</daylight>
+ </short>
+ <exemplarCity>Tokyo</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtau">
+ <exemplarCity>Chevtchenko</exemplarCity>
+ </zone>
+ <zone type="Asia/Oral">
+ <exemplarCity>Ouralsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtobe">
+ <exemplarCity>Aktioubinsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Qyzylorda">
+ <exemplarCity>Kzyl Orda</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity>Alma Ata</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>Oulan-Bator</exemplarCity>
+ </zone>
+ <zone type="Asia/Choibalsan">
+ <exemplarCity>Tchoïbalsan</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>Mexico</exemplarCity>
+ </zone>
+ <zone type="Pacific/Marquesas">
+ <exemplarCity>Marquises</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>Açores</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Madeira">
+ <exemplarCity>Madère</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lisbonne</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>Heure normale de l’Europe de l’Est</standard>
+ <daylight>Heure avancée de l’Europe de l’Est</daylight>
+ </long>
+ <short>
+ <standard>HEE</standard>
+ <daylight>HAEE</daylight>
+ </short>
+ <exemplarCity>Bucarest</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moscou</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>Ekaterinbourg</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity>Novossibirsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>Krasnoïarsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity>Irkoutsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>Iakoutsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>Sakhaline</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>Kamtchatka</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>Oujgorod</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>Zaporojie</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <generic>Heure d’Hawaï</generic>
+ <standard>Heure normale d’Hawaï</standard>
+ <daylight>Heure avancée d’Hawaï</daylight>
+ </long>
+ <short>
+ <standard>HST</standard>
+ <daylight>HDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <generic>Heure de l’Alaska</generic>
+ <standard>Heure normale de l’Alaska</standard>
+ <daylight>Heure avancée de l’Alaska</daylight>
+ </long>
+ <short>
+ <generic>HAK</generic>
+ <standard>HNAK</standard>
+ <daylight>HAAK</daylight>
+ </short>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <generic>Heure du Pacifique (ÉUA)</generic>
+ <standard>Heure normale du Pacifique (ÉUA)</standard>
+ <daylight>Heure avancée du Pacifique (ÉUA)</daylight>
+ </long>
+ <short>
+ <generic>HP (ÉUA)</generic>
+ <standard>HNP (ÉUA)</standard>
+ <daylight>HAP (ÉUA)</daylight>
+ </short>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <generic>Heure des Rocheuses (ÉUA)</generic>
+ <standard>Heure normale des Rocheuses (ÉUA)</standard>
+ <daylight>Heure avancée des Rocheuses (ÉUA)</daylight>
+ </long>
+ <short>
+ <generic>HR (ÉUA)</generic>
+ <standard>HNR (ÉUA)</standard>
+ <daylight>HAR (ÉUA)</daylight>
+ </short>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <generic>Heure du Centre (ÉUA)</generic>
+ <standard>Heure normale du Centre (ÉUA)</standard>
+ <daylight>Heure avancée du Centre (ÉUA)</daylight>
+ </long>
+ <short>
+ <generic>HC (ÉUA)</generic>
+ <standard>HNC (ÉUA)</standard>
+ <daylight>HAC (ÉUA)</daylight>
+ </short>
+ </zone>
+ <zone type="America/Detroit">
+ <exemplarCity>Détroit</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <generic>Heure de l’Est (ÉUA)</generic>
+ <standard>Heure normale de l’Est (ÉUA)</standard>
+ <daylight>Heure avancée de l’Est (ÉUA)</daylight>
+ </long>
+ <short>
+ <generic>HE (ÉUA)</generic>
+ <standard>HNE (ÉUA)</standard>
+ <daylight>HAE (ÉUA)</daylight>
+ </short>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##0 %</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ADP">
+ <displayName>peseta andorrane</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>dirham des Émirats arabes unis</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>afghani [AFA]</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>afghani</displayName>
+ <symbol>Af</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName references="RP8">lek</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>dram arménien</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName references="RP8">florin des Antilles</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName>kwanza angolais</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>kwanza angolais (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>nouveau kwanza angolais (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>kwanza angolais réajusté (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName references="RP2">austral argentin</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>peso argentin (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>peso argentin</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>schilling autrichien</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>dollar australien</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName>florin d’Aruba</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>manat azéri</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>dinar de Bosnie-Herzegovine</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName references="RP9">mark bosniaque convertible</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>dollar de Barbade</displayName>
+ </currency>
+ <currency type="BDT">
+ <displayName>taka</displayName>
+ </currency>
+ <currency type="BEC">
+ <displayName>franc belge (convertible)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>franc belge</displayName>
+ <symbol>FB</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>franc belge (financier)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>lev</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName references="RP2">nouveau lev</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName references="RP8">dinar de Bahreïn</displayName>
+ </currency>
+ <currency type="BIF">
+ <displayName>franc du Burundi</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName>dollar des Bermudes</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName>dollar de Brunei</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>boliviano</displayName>
+ <symbol>Bs</symbol>
+ </currency>
+ <currency type="BOP">
+ <displayName>peso bolivien</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName references="RP9">mvdol</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>nouveau cruzeiro (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>cruzado</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>cruzeiro (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>réal</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRN">
+ <displayName>nouveau cruzado</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>cruzeiro</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>dollar des Bahamas</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>ngultrum</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>kyat [BUK]</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>pula</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>nouveau rouble biélorusse (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>rouble biélorusse</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>dollar de Belize</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>dollar canadien</displayName>
+ </currency>
+ <currency type="CDF">
+ <displayName>franc congolais</displayName>
+ </currency>
+ <currency type="CHE">
+ <displayName>euro WIR</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>franc suisse</displayName>
+ <symbol>sFr.</symbol>
+ </currency>
+ <currency type="CHW">
+ <displayName>franc WIR</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>unité d’investissement chilienne</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>peso chilien</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>Yuan Ren-min-bi</displayName>
+ </currency>
+ <currency type="COP">
+ <displayName>peso colombien</displayName>
+ </currency>
+ <currency type="COU">
+ <displayName draft="unconfirmed">Unité de valeur réelle colombienne</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>colon de Costa Rica</displayName>
+ <displayName alt="proposed-u148-1" draft="unconfirmed">colon costaricain</displayName>
+ </currency>
+ <currency type="CSD">
+ <displayName>dinar serbe</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>couronne tchèque [CSK]</displayName>
+ <displayName alt="proposed-u148-1" draft="unconfirmed">couronne forte tchécoslovaque</displayName>
+ <displayName alt="proposed-u169-1" draft="provisional">couronne forte tchèque</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>peso cubain</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>escudo du Cap-Vert</displayName>
+ </currency>
+ <currency type="CYP">
+ <displayName>livre cypriote</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName>couronne tchèque</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>mark est-allemand</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>deutsche mark</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>franc de Djibouti</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>couronne danoise</displayName>
+ </currency>
+ <currency type="DOP">
+ <displayName>peso dominicain</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName>dinar algérien</displayName>
+ </currency>
+ <currency type="ECS">
+ <displayName>sucre</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>unité de valeur constante équatoriale (UVC)</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>couronne estonienne</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>livre égyptienne</displayName>
+ </currency>
+ <currency type="EQE">
+ <displayName references="RP2" draft="provisional">ekwele</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Eritrean Nakfa</displayName>
+ <displayName references="RP8" alt="proposed-u169-1" draft="provisional">nafka</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName>peseta espagnole (compte A)</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName>peseta espagnole (compte convertible)</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>peseta espagnole</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>birr</displayName>
+ <displayName references="RP8" alt="proposed-u169-1" draft="provisional">birr éthiopien</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>mark finlandais</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>dollar de Fidji</displayName>
+ </currency>
+ <currency type="FKP">
+ <displayName>livre des Falkland (Malvinas)</displayName>
+ <displayName alt="proposed-u148-1" draft="unconfirmed">livre des Falkland</displayName>
+ <displayName references="RP8" alt="proposed-u169-1" draft="provisional">livre de Falkland</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>franc français</displayName>
+ <symbol>F</symbol>
+ </currency>
+ <currency type="GBP">
+ <displayName>livre sterling</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>Georgian Kupon Larit</displayName>
+ <displayName alt="proposed-u148-1" draft="provisional">coupon de larit géorgien</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>lari</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>cédi</displayName>
+ <displayName references="RP8" alt="proposed-u169-1" draft="provisional">cedi</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>livre de Gibraltar</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>dalasie</displayName>
+ <displayName references="RP8" alt="proposed-u169-1" draft="provisional">dalasi</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>franc guinéen</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>syli</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>ekwélé</displayName>
+ <displayName alt="proposed-u148-1" draft="unconfirmed">ekwélé de Guinée équatoriale</displayName>
+ <displayName references="RP2" alt="proposed-u169-1" draft="provisional">ekwele de Guinée équatoriale</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>drachme</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>quetzal</displayName>
+ </currency>
+ <currency type="GWE">
+ <displayName references="RP2">escudo de Guinée portugaise</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>peso de Guinée-Bissau</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>dollar du Guyana</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>dollar de Hong Kong</displayName>
+ </currency>
+ <currency type="HNL">
+ <displayName>lempira</displayName>
+ </currency>
+ <currency type="HRD">
+ <displayName>dinar croate</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>kuna</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>gourde</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>forint</displayName>
+ </currency>
+ <currency type="IDR">
+ <displayName>rupiah</displayName>
+ </currency>
+ <currency type="IEP">
+ <displayName>livre irlandaise</displayName>
+ </currency>
+ <currency type="ILP">
+ <displayName>livre israélienne</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName references="RP10" draft="provisional">shekel</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>roupie indienne</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName references="RP8" draft="provisional">dinar iraquien</displayName>
+ </currency>
+ <currency type="IRR">
+ <displayName>rial iranien</displayName>
+ </currency>
+ <currency type="ISK">
+ <displayName>couronne islandaise</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>lire italienne</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>dollar jamaïcain</displayName>
+ </currency>
+ <currency type="JOD">
+ <displayName>dinar jordanien</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>yen</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>shilling du Kenya</displayName>
+ </currency>
+ <currency type="KGS">
+ <displayName references="RP8">som</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>riel</displayName>
+ </currency>
+ <currency type="KMF">
+ <displayName>franc des Comores</displayName>
+ </currency>
+ <currency type="KPW">
+ <displayName>won nord-coréen</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>won sud-coréen</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName references="RP8" draft="provisional">dinar koweïtien</displayName>
+ </currency>
+ <currency type="KYD">
+ <displayName>dollar des îles Caïmanes</displayName>
+ <displayName alt="proposed-u148-1" draft="unconfirmed">dollar des iles Caïmanes</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>tenge du Kazakhstan</displayName>
+ <displayName alt="proposed-u148-1" draft="unconfirmed">tengé kazakh</displayName>
+ <displayName references="RP8" alt="proposed-u169-1" draft="provisional">tenge</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>kip</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>livre libanaise</displayName>
+ </currency>
+ <currency type="LKR">
+ <displayName>roupie de Sri Lanka</displayName>
+ </currency>
+ <currency type="LRD">
+ <displayName>dollar libérien</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName references="RP8">loti</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LSM">
+ <displayName references="RP2" draft="provisional">maloti</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName references="RP8">litas lituanien</displayName>
+ <displayName references="RP8" alt="proposed-u148-1" draft="unconfirmed">litas</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName references="RP2">talonas</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName>franc luxembourgeois convertible</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>franc luxembourgeois</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName>franc luxembourgeois financier</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>lats letton</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>rouble letton</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName references="RP8">dinar lybien</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>dirham marocain</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>franc marocain</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>leu moldave</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName references="RP10">ariary</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>franc malgache</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName references="RP8">denar</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>franc malien</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Myanmar Kyat</displayName>
+ <displayName alt="proposed-u148-1" draft="unconfirmed">kyat de Myanmar</displayName>
+ <displayName references="RP8" alt="proposed-u169-1" draft="provisional">kyat</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>tugrik</displayName>
+ </currency>
+ <currency type="MOP">
+ <displayName>pataca</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>ouguija</displayName>
+ </currency>
+ <currency type="MTL">
+ <displayName>lire maltaise</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>livre maltaise</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName references="RP2">roupie mauricienne</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>roupie des Maldives</displayName>
+ <displayName references="RP8" alt="proposed-u169-1" draft="provisional">rufiyaa</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>kwacha [MWK]</displayName>
+ <displayName references="RP9" alt="proposed-u169-1" draft="provisional">kwacha du Malawi</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName references="RP8">peso mexicain</displayName>
+ </currency>
+ <currency type="MXP">
+ <displayName>peso d’argent mexicain (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>unité de conversion mexicaine (UDI)</displayName>
+ <displayName references="RP2" alt="proposed-u169-1" draft="provisional">unidad de inversion</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>ringgit</displayName>
+ <displayName alt="proposed-u148-1" draft="unconfirmed">ringgit malais</displayName>
+ <displayName references="RP8" alt="proposed-u169-1" draft="provisional">ringgit de Malaisie</displayName>
+ </currency>
+ <currency type="MZE">
+ <displayName>escudo du Mozambique</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>métical</displayName>
+ <displayName references="RP3" alt="proposed-u169-1" draft="provisional">metical</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName references="RP8">dollar namibien</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>naira</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>cordoba</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>cordoba d’or</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>florin néerlandais</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>couronne norvégienne</displayName>
+ </currency>
+ <currency type="NPR">
+ <displayName>roupie du Népal</displayName>
+ </currency>
+ <currency type="NZD">
+ <displayName>dollar néo-zélandais</displayName>
+ </currency>
+ <currency type="OMR">
+ <displayName>rial omani</displayName>
+ </currency>
+ <currency type="PAB">
+ <displayName>balboa</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName references="RP2">inti péruvien</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>nouveau sol péruvien</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>sol péruvien</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>kina</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>peso philippin</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>roupie du Pakistan</displayName>
+ </currency>
+ <currency type="PLN">
+ <displayName>zloty</displayName>
+ </currency>
+ <currency type="PLZ">
+ <displayName>zloty (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>escudo portugais</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>guarani</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>rial du Qatar</displayName>
+ </currency>
+ <currency type="RHD">
+ <displayName references="RP2">dollar rhodésien</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName references="RP9">ancien leu roumain</displayName>
+ <displayName references="RP9" alt="proposed-u148-1" draft="unconfirmed">ancien leu</displayName>
+ </currency>
+ <currency type="RON">
+ <displayName references="RP9">nouveau leu roumain</displayName>
+ <displayName references="RP9" alt="proposed-u148-1" draft="unconfirmed">nouveau leu</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>rouble</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>rouble de Russie (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName references="RP9">franc rwandais</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName references="RP2">rial saoudien</displayName>
+ </currency>
+ <currency type="SBD">
+ <displayName references="RP9">dollar des ÃŽles Salomon</displayName>
+ </currency>
+ <currency type="SCR">
+ <displayName>roupie des Seychelles</displayName>
+ </currency>
+ <currency type="SDD">
+ <displayName>dinar soudanais</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>livre soudanaise</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>couronne suédoise</displayName>
+ </currency>
+ <currency type="SGD">
+ <displayName>dollar de Singapour</displayName>
+ </currency>
+ <currency type="SHP">
+ <displayName>livre de Sainte-Hélène</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName references="RP8">tolar</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>couronne slovaque</displayName>
+ </currency>
+ <currency type="SLL">
+ <displayName>léone</displayName>
+ <displayName references="RP8" alt="proposed-u169-1" draft="provisional">leone</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>shilling de Somalie</displayName>
+ </currency>
+ <currency type="SRD">
+ <displayName references="RP9">dollar surinamais</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>florin du Surinam</displayName>
+ </currency>
+ <currency type="STD">
+ <displayName>dobra</displayName>
+ </currency>
+ <currency type="SUR">
+ <displayName>rouble de C.E.I.</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName references="RP9">colon salvadorien</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>livre syrienne</displayName>
+ </currency>
+ <currency type="SZL">
+ <displayName>lilangeni</displayName>
+ </currency>
+ <currency type="THB">
+ <displayName>baht</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>rouble du Tadjikistan</displayName>
+ <displayName references="RP2" alt="proposed-u169-1" draft="provisional">rouble tadjik</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>somoni du Tadjikistan</displayName>
+ <displayName alt="proposed-u148-1" draft="unconfirmed">somoni tadjik</displayName>
+ <displayName references="RP8" alt="proposed-u169-1" draft="provisional">somoni</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Turkmenistan Manat</displayName>
+ <displayName alt="proposed-u148-1" draft="unconfirmed">manat turkmène</displayName>
+ <displayName references="RP8" alt="proposed-u169-1" draft="provisional">manat</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>dinar tunisien</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>paʻanga</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>escudo de Timor</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>livre turque</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName references="RP9">nouvelle livre turque</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>dollar de la Trinité</displayName>
+ <displayName references="RP9" alt="proposed-u169-1" draft="provisional">dollar de Trinité-et-Tobago</displayName>
+ </currency>
+ <currency type="TWD">
+ <displayName>dollar taïwanais</displayName>
+ <displayName alt="proposed-u148-1" draft="unconfirmed">nouveau dollar taïwanais</displayName>
+ <displayName references="RP8" alt="proposed-u169-1" draft="provisional">nouveau dollar de Taïwan</displayName>
+ </currency>
+ <currency type="TZS">
+ <displayName>shilling de Tanzanie</displayName>
+ </currency>
+ <currency type="UAH">
+ <displayName>hryvnia</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>karbovanetz</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>shilling ougandais (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>shilling ougandais</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>dollar des États-Unis</displayName>
+ </currency>
+ <currency type="USN">
+ <displayName>dollar des Etats-Unis (jour suivant)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>dollar des Etats-Unis (jour même)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>peso uruguayen (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>peso uruguayen</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>sum</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>bolivar</displayName>
+ </currency>
+ <currency type="VND">
+ <displayName>dong</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>vatu</displayName>
+ </currency>
+ <currency type="WST">
+ <displayName>tala</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>franc CFA (BEAC)</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName references="RP8">argent</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>or</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName references="RP8">unité européenne composée</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>unité monétaire européenne</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>unité de compte européenne (XBC)</displayName>
+ <displayName references="RP8" alt="proposed-u169-1" draft="provisional">unité de compte 9</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>unité de compte européenne (XBD)</displayName>
+ <displayName references="RP8" alt="proposed-u169-1" draft="provisional">unité de compte 17</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName references="RP8">dollar des Caraïbes orientales</displayName>
+ </currency>
+ <currency type="XDR">
+ <displayName references="RP8">droit de tirage spécial</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>unité de compte européenne (ECU)</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>franc or</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>franc UIC</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>franc CFA (BCEAO)</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName references="RP8">palladium</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>franc CFP</displayName>
+ </currency>
+ <currency type="XPT">
+ <displayName>platine</displayName>
+ </currency>
+ <currency type="XRE">
+ <displayName references="RP2">type de fonds RINET</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>dinar du Yémen</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>riyal du Yémen</displayName>
+ </currency>
+ <currency type="YUD">
+ <displayName>nouveau dinar yougoslave</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>dinar yougoslave Noviy</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>dinar yougoslave convertible</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>rand sud-africain (financier)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>rand</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName>kwacha</displayName>
+ <displayName alt="proposed-u148-1" draft="unconfirmed">kwacha zambien</displayName>
+ <displayName references="RP2" alt="proposed-u169-1" draft="provisional">kwacha de Zambie</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>nouveau zaïre</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>zaïre</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>dollar du Zimbabwe</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>oui:o</yesstr>
+ <nostr>non:n</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1" uri="http://www.loc.gov/standards/iso639-2/englangn.html">ISO 639.2 Standard</reference>
+ <reference type="RP1" alt="proposed-u148-1" draft="unconfirmed">ISO 639.2 - Codes pour la représentation des noms de langues</reference>
+ <reference type="RP10" uri="http://fr.wikipedia.org/wiki/Codes_des_monnaies">Codes des monnaies (ISO 4217) - Wikipedia</reference>
+ <reference type="RP11" uri="http://atlas.gc.ca/site/francais/maps/reference/national/timezones/map.pdf">Canadian Timezones</reference>
+ <reference type="RP11" alt="proposed-u148-1" draft="unconfirmed">Fuseaux horaires canadiens (sur atlas.gc.ca)</reference>
+ <reference type="RP12" uri="http://meta.wikimedia.org/wiki/List_of_Wikipedias">List of Wikipedias on Meta (Wikimedia.org)</reference>
+ <reference type="RP13" uri="http://www.tlfi.fr/">Le Trésor de la langue française informatisé (CDROM)</reference>
+ <reference type="RP2" uri="http://www.google.fr">Results of Google searches</reference>
+ <reference type="RP2" alt="proposed-u148-1" draft="unconfirmed">Résultats des recherches sur Google (édition française)</reference>
+ <reference type="RP3" uri="http://fr.wikipedia.org/wiki/Accueil">Entries/articles on Wikipedia (French version)</reference>
+ <reference type="RP3" alt="proposed-u148-2" draft="unconfirmed">Articles de Wikipédia (édition francophone)</reference>
+ <reference type="RP4" uri="CD-Rom">Le Robert &amp; Collins (bilingual dictionary French-English)</reference>
+ <reference type="RP5" uri="http://www.unicode.org/iso15924/iso15924-fr.html">ISO 15924 Strandard for Scripts names</reference>
+ <reference type="RP5" alt="proposed-u148-1" draft="unconfirmed">ISO 15924 - Liste alphabétique des noms d’écriture en français</reference>
+ <reference type="RP6" uri="http://www.iso.org/iso/fr/prods-services/iso3166ma/02iso-3166-code-lists/list-fr1.html">ISO 3166 Standard for Territories</reference>
+ <reference type="RP6" alt="proposed-u148-1" draft="unconfirmed">ISO 3166 - Listes de codes et noms de pays (French country names and code elements)</reference>
+ <reference type="RP7" uri="http://fr.wikipedia.org/wiki/ISO_3166-1">ISO 3166-1 Standard for Territories (from Wikipedia)</reference>
+ <reference type="RP7" alt="proposed-u148-1" draft="unconfirmed">ISO 3166-1 (article de Wikipédia, édition francophone)</reference>
+ <reference type="RP8" uri="http://www.iso.org/iso/fr/prods-services/popstds/currencycodeslist.html">ISO 4217 Standard for Currencies</reference>
+ <reference type="RP8" alt="proposed-u148-1" draft="unconfirmed">ISO 4217 - Liste des codes des monnaies et des types de fonds</reference>
+ <reference type="RP9" uri="http://www.geocities.com/jusjih/iso3166-fr.html">ISO 4217 Standard for Currencies (from Geocities)</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/fr_BE.xml b/libs/Zend/Locale/Data/fr_BE.xml
new file mode 100755
index 0000000000..56df85079a
--- /dev/null
+++ b/libs/Zend/Locale/Data/fr_BE.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="fr"/>
+ <territory type="BE"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H' h 'mm' min 'ss' s 'z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMdd" draft="provisional">dd-MMM</dateFormatItem>
+ <dateFormatItem id="MMd" draft="provisional">d/MM</dateFormatItem>
+ <dateFormatItem id="yyMMM" draft="provisional">MMM-yy</dateFormatItem>
+ <dateFormatItem id="yyMMMEEEd" draft="provisional">EEE d MMM yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <group>.</group>
+ </symbols>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/fr_CA.xml b/libs/Zend/Locale/Data/fr_CA.xml
new file mode 100755
index 0000000000..a1a99ae39c
--- /dev/null
+++ b/libs/Zend/Locale/Data/fr_CA.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.43 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="fr"/>
+ <territory type="CA"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yy-MM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yy-MM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH' h 'mm' min 'ss' s 'z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMdd" draft="provisional">MM-dd</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">yy-MM</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤;(#,##0.00¤)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="CAD">
+ <symbol>$</symbol>
+ </currency>
+ <currency type="USD">
+ <symbol>$ US</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/fr_CH.xml b/libs/Zend/Locale/Data/fr_CH.xml
new file mode 100755
index 0000000000..3748c5a833
--- /dev/null
+++ b/libs/Zend/Locale/Data/fr_CH.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="fr"/>
+ <territory type="CH"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd.MM.yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH.mm:ss' h' z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMdd" draft="provisional">dd.MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM.yy</dateFormatItem>
+ <dateFormatItem id="yyMMMd" draft="provisional">d. MMM yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>.</decimal>
+ <group>'</group>
+ </symbols>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##0.00;¤-#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/fr_FR.xml b/libs/Zend/Locale/Data/fr_FR.xml
new file mode 100755
index 0000000000..5a128b419d
--- /dev/null
+++ b/libs/Zend/Locale/Data/fr_FR.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.36 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="fr"/>
+ <territory type="FR"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/fr_LU.xml b/libs/Zend/Locale/Data/fr_LU.xml
new file mode 100755
index 0000000000..2096261546
--- /dev/null
+++ b/libs/Zend/Locale/Data/fr_LU.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="fr"/>
+ <territory type="LU"/>
+ </identity>
+ <numbers>
+ <symbols>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="FRF">
+ <symbol>FRF</symbol>
+ </currency>
+ <currency type="LUF">
+ <symbol>F</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/fr_MC.xml b/libs/Zend/Locale/Data/fr_MC.xml
new file mode 100755
index 0000000000..522c3806c7
--- /dev/null
+++ b/libs/Zend/Locale/Data/fr_MC.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.31 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="fr"/>
+ <territory type="MC"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/fur.xml b/libs/Zend/Locale/Data/fur.xml
new file mode 100755
index 0000000000..5ced414fbe
--- /dev/null
+++ b/libs/Zend/Locale/Data/fur.xml
@@ -0,0 +1,869 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.12 $"/>
+ <generation date="$Date: 2006/07/11 19:26:44 $"/>
+ <language type="fur"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa" draft="unconfirmed">afar</language>
+ <language type="ae" draft="unconfirmed">avestan</language>
+ <language type="af" draft="unconfirmed">afrikaans</language>
+ <language type="am" draft="unconfirmed">amaric</language>
+ <language type="an" draft="unconfirmed">aragonês</language>
+ <language type="ang" draft="unconfirmed">vieri inglês (450-1100)</language>
+ <language type="apa" draft="unconfirmed">lenghis Apache</language>
+ <language type="ar" draft="unconfirmed">arap</language>
+ <language type="arc" draft="unconfirmed">aramaic</language>
+ <language type="as" draft="unconfirmed">assamês</language>
+ <language type="ast" draft="unconfirmed">asturian</language>
+ <language type="aus" draft="unconfirmed">lenghis australianis</language>
+ <language type="av" draft="unconfirmed">avar</language>
+ <language type="ay" draft="unconfirmed">aymarà</language>
+ <language type="az" draft="unconfirmed">azerbaijani</language>
+ <language type="be" draft="unconfirmed">bielorùs</language>
+ <language type="bg" draft="unconfirmed">bulgar</language>
+ <language type="bn" draft="unconfirmed">bengalês</language>
+ <language type="bo" draft="unconfirmed">tibetan</language>
+ <language type="br" draft="unconfirmed">breton</language>
+ <language type="bs" draft="unconfirmed">bosniac</language>
+ <language type="ca" draft="unconfirmed">catalan</language>
+ <language type="ce" draft="unconfirmed">cecen</language>
+ <language type="cel" draft="unconfirmed">celtiche (altre)</language>
+ <language type="ch" draft="unconfirmed">chamorro</language>
+ <language type="co" draft="unconfirmed">cors</language>
+ <language type="cop" draft="unconfirmed">coptic</language>
+ <language type="cr" draft="unconfirmed">cree</language>
+ <language type="cs" draft="unconfirmed">cec</language>
+ <language type="cu" draft="unconfirmed">sclâf de glesie</language>
+ <language type="cy" draft="unconfirmed">galês</language>
+ <language type="da" draft="unconfirmed">danês</language>
+ <language type="de" draft="unconfirmed">todesc</language>
+ <language type="den" draft="unconfirmed">sclâf</language>
+ <language type="egy" draft="unconfirmed">vieri egjizian</language>
+ <language type="el" draft="unconfirmed">grêc</language>
+ <language type="en" draft="unconfirmed">inglês</language>
+ <language type="eo" draft="unconfirmed">esperanto</language>
+ <language type="es" draft="unconfirmed">spagnûl</language>
+ <language type="et" draft="unconfirmed">eston</language>
+ <language type="eu" draft="unconfirmed">basc</language>
+ <language type="fa" draft="unconfirmed">persian</language>
+ <language type="ff" draft="unconfirmed">fulah</language>
+ <language type="fi" draft="unconfirmed">finlandês</language>
+ <language type="fj" draft="unconfirmed">fizian</language>
+ <language type="fo" draft="unconfirmed">faroês</language>
+ <language type="fr" draft="unconfirmed">francês</language>
+ <language type="fro" draft="unconfirmed">vieri francês</language>
+ <language type="fur" draft="unconfirmed">furlan</language>
+ <language type="fy" draft="unconfirmed">frisian</language>
+ <language type="ga" draft="unconfirmed">gaelic irlandês</language>
+ <language type="gd" draft="unconfirmed">gaelic scozês</language>
+ <language type="gem" draft="unconfirmed">gjermaniche (altre)</language>
+ <language type="gl" draft="unconfirmed">galizian</language>
+ <language type="got" draft="unconfirmed">gotic</language>
+ <language type="grc" draft="unconfirmed">vieri grêc</language>
+ <language type="gv" draft="unconfirmed">manx</language>
+ <language type="he" draft="unconfirmed">Ebraic</language>
+ <language type="hi" draft="unconfirmed">hindi</language>
+ <language type="hr" draft="unconfirmed">cravuat</language>
+ <language type="ht" draft="unconfirmed">haitian</language>
+ <language type="hu" draft="unconfirmed">ongjarês</language>
+ <language type="hy" draft="unconfirmed">armen</language>
+ <language type="id" draft="unconfirmed">indonesian</language>
+ <language type="ik" draft="unconfirmed">inupiaq</language>
+ <language type="io" draft="unconfirmed">ido</language>
+ <language type="is" draft="unconfirmed">islandês</language>
+ <language type="it" draft="unconfirmed">talian</language>
+ <language type="iu" draft="unconfirmed">inuktitut</language>
+ <language type="ja" draft="unconfirmed">gjaponês</language>
+ <language type="ka" draft="unconfirmed">gjeorgjian</language>
+ <language type="kk" draft="unconfirmed">kazac</language>
+ <language type="kl" draft="unconfirmed">kalaallisut</language>
+ <language type="km" draft="unconfirmed">khmer</language>
+ <language type="kn" draft="unconfirmed">kannada</language>
+ <language type="ko" draft="unconfirmed">corean</language>
+ <language type="ku" draft="unconfirmed">curd</language>
+ <language type="kw" draft="unconfirmed">cornualiês</language>
+ <language type="la" draft="unconfirmed">latin</language>
+ <language type="lad" draft="unconfirmed">ladin</language>
+ <language type="lb" draft="unconfirmed">lussemburghês</language>
+ <language type="li" draft="unconfirmed">limburghês</language>
+ <language type="ln" draft="unconfirmed">lingala</language>
+ <language type="lt" draft="unconfirmed">lituan</language>
+ <language type="lv" draft="unconfirmed">leton</language>
+ <language type="map" draft="unconfirmed">austronesian</language>
+ <language type="mi" draft="unconfirmed">maori</language>
+ <language type="mis" draft="unconfirmed">lenghis variis</language>
+ <language type="mk" draft="unconfirmed">macedon</language>
+ <language type="ml" draft="unconfirmed">malayalam</language>
+ <language type="mn" draft="unconfirmed">mongul</language>
+ <language type="mo" draft="unconfirmed">moldâf</language>
+ <language type="mr" draft="unconfirmed">marathi</language>
+ <language type="ms" draft="unconfirmed">malês</language>
+ <language type="mt" draft="unconfirmed">maltês</language>
+ <language type="mul" draft="unconfirmed">lenghis multiplis</language>
+ <language type="mwl" draft="unconfirmed">mirandês</language>
+ <language type="myn" draft="unconfirmed">lenghis Maya</language>
+ <language type="nap" draft="unconfirmed">napoletan</language>
+ <language type="nb" draft="unconfirmed">norvegjês bokmål</language>
+ <language type="nds" draft="unconfirmed">bas todesc</language>
+ <language type="ne" draft="unconfirmed">nepalês</language>
+ <language type="nl" draft="unconfirmed">olandês</language>
+ <language type="nn" draft="unconfirmed">norvegjês nynorsk</language>
+ <language type="no" draft="unconfirmed">norvegjês</language>
+ <language type="non" draft="unconfirmed">vieri norvegjês</language>
+ <language type="nv" draft="unconfirmed">navajo</language>
+ <language type="oc" draft="unconfirmed">ocitan</language>
+ <language type="os" draft="unconfirmed">osetic</language>
+ <language type="ota" draft="unconfirmed">turc otoman</language>
+ <language type="pa" draft="unconfirmed">punjabi</language>
+ <language type="pap" draft="unconfirmed">papiamento</language>
+ <language type="peo" draft="unconfirmed">vieri persian</language>
+ <language type="pl" draft="unconfirmed">polac</language>
+ <language type="pro" draft="unconfirmed">vieri provenzâl</language>
+ <language type="ps" draft="unconfirmed">pashto</language>
+ <language type="pt" draft="unconfirmed">portughês</language>
+ <language type="qu" draft="unconfirmed">quechua</language>
+ <language type="rm" draft="unconfirmed">rumanç</language>
+ <language type="ro" draft="unconfirmed">romen</language>
+ <language type="roa" draft="unconfirmed">romanze (altre)</language>
+ <language type="ru" draft="unconfirmed">rus</language>
+ <language type="sa" draft="unconfirmed">sanscrit</language>
+ <language type="sc" draft="unconfirmed">sardegnûl</language>
+ <language type="scn" draft="unconfirmed">sicilian</language>
+ <language type="sco" draft="unconfirmed">scozês</language>
+ <language type="sd" draft="unconfirmed">sindhi</language>
+ <language type="se" draft="unconfirmed">sami setentrionâl</language>
+ <language type="sga" draft="unconfirmed">vieri irlandês</language>
+ <language type="si" draft="unconfirmed">sinalês</language>
+ <language type="sk" draft="unconfirmed">slovac</language>
+ <language type="sl" draft="unconfirmed">sloven</language>
+ <language type="sla" draft="unconfirmed">sclave (altre)</language>
+ <language type="sm" draft="unconfirmed">samoan</language>
+ <language type="so" draft="unconfirmed">somal</language>
+ <language type="sq" draft="unconfirmed">Albanês</language>
+ <language type="sr" draft="unconfirmed">serp</language>
+ <language type="sux" draft="unconfirmed">sumeric</language>
+ <language type="sv" draft="unconfirmed">svedês</language>
+ <language type="sw" draft="unconfirmed">swahili</language>
+ <language type="ta" draft="unconfirmed">tamil</language>
+ <language type="te" draft="unconfirmed">telegu</language>
+ <language type="tet" draft="unconfirmed">tetum</language>
+ <language type="tg" draft="unconfirmed">tagic</language>
+ <language type="th" draft="unconfirmed">thai</language>
+ <language type="tl" draft="unconfirmed">tagalog</language>
+ <language type="tr" draft="unconfirmed">turc</language>
+ <language type="tt" draft="unconfirmed">tartar</language>
+ <language type="ty" draft="unconfirmed">tahitian</language>
+ <language type="uk" draft="unconfirmed">ucrain</language>
+ <language type="und" draft="unconfirmed">indeterminade</language>
+ <language type="ur" draft="unconfirmed">urdu</language>
+ <language type="uz" draft="unconfirmed">uzbec</language>
+ <language type="vi" draft="unconfirmed">vietnamite</language>
+ <language type="wa" draft="unconfirmed">valon</language>
+ <language type="yi" draft="unconfirmed">yiddish</language>
+ <language type="zh" draft="unconfirmed">cinês</language>
+ <language type="zu" draft="unconfirmed">zulu</language>
+ </languages>
+ <scripts>
+ <script type="Arab" draft="unconfirmed">arap</script>
+ <script type="Armn" draft="unconfirmed">armen</script>
+ <script type="Bali" draft="unconfirmed">balinês</script>
+ <script type="Beng" draft="unconfirmed">bengalês</script>
+ <script type="Brai" draft="unconfirmed">Braille</script>
+ <script type="Bugi" draft="unconfirmed">buginês</script>
+ <script type="Cans" draft="unconfirmed">Simbui unificâts aborigjens canadês</script>
+ <script type="Copt" draft="unconfirmed">copt</script>
+ <script type="Cprt" draft="unconfirmed">cipriot</script>
+ <script type="Cyrl" draft="unconfirmed">cirilic</script>
+ <script type="Cyrs" draft="unconfirmed">cirilic (variant dal vieri slavonic de glesie)</script>
+ <script type="Deva" draft="unconfirmed">devanagari</script>
+ <script type="Egyd" draft="unconfirmed">demotic egjizian</script>
+ <script type="Egyh" draft="unconfirmed">jeratic egjizian</script>
+ <script type="Egyp" draft="unconfirmed">jeroglifics egjizians</script>
+ <script type="Ethi" draft="unconfirmed">etiopic</script>
+ <script type="Geor" draft="unconfirmed">georgjian</script>
+ <script type="Glag" draft="unconfirmed">glagolitic</script>
+ <script type="Goth" draft="unconfirmed">gotic</script>
+ <script type="Grek" draft="unconfirmed">grêc</script>
+ <script type="Hani" draft="unconfirmed">han</script>
+ <script type="Hans" draft="unconfirmed">Han semplificât</script>
+ <script type="Hant" draft="unconfirmed">Han tradizionâl</script>
+ <script type="Hebr" draft="unconfirmed">ebreu</script>
+ <script type="Hrkt" draft="unconfirmed">katakana o hiragana</script>
+ <script type="Hung" draft="unconfirmed">vieri ongjarês</script>
+ <script type="Ital" draft="unconfirmed">vieri italic</script>
+ <script type="Java" draft="unconfirmed">gjavanês</script>
+ <script type="Khmr" draft="unconfirmed">khmer</script>
+ <script type="Knda" draft="unconfirmed">kannada</script>
+ <script type="Laoo" draft="unconfirmed">lao</script>
+ <script type="Latf" draft="unconfirmed">latin (variant Fraktur)</script>
+ <script type="Latg" draft="unconfirmed">latin (variant gaeliche)</script>
+ <script type="Latn" draft="unconfirmed">latin</script>
+ <script type="Lina" draft="unconfirmed">lineâr A</script>
+ <script type="Linb" draft="unconfirmed">lineâr B</script>
+ <script type="Maya" draft="unconfirmed">jeroglifics Maya</script>
+ <script type="Mlym" draft="unconfirmed">malayalam</script>
+ <script type="Mong" draft="unconfirmed">mongul</script>
+ <script type="Runr" draft="unconfirmed">runic</script>
+ <script type="Syrc" draft="unconfirmed">siriac</script>
+ <script type="Syre" draft="unconfirmed">siriac (variant Estrangelo)</script>
+ <script type="Syrj" draft="unconfirmed">siriac (variant ocidentâl)</script>
+ <script type="Syrn" draft="unconfirmed">siriac (variant orientâl)</script>
+ <script type="Taml" draft="unconfirmed">tamil</script>
+ <script type="Telu" draft="unconfirmed">telegu</script>
+ <script type="Tglg" draft="unconfirmed">tagalog</script>
+ <script type="Thai" draft="unconfirmed">thai</script>
+ <script type="Tibt" draft="unconfirmed">tibetan</script>
+ <script type="Ugar" draft="unconfirmed">ugaritic</script>
+ <script type="Xpeo" draft="unconfirmed">vieri persian</script>
+ <script type="Xsux" draft="unconfirmed">cuneiform sumeric-acadic</script>
+ <script type="Zxxx" draft="unconfirmed">codiç pes lenghis no scritis</script>
+ <script type="Zyyy" draft="unconfirmed">comun</script>
+ <script type="Zzzz" draft="unconfirmed">codiç par scrituris no codificadis</script>
+ </scripts>
+ <territories>
+ <territory type="001" draft="unconfirmed">Mont</territory>
+ <territory type="002" draft="unconfirmed">Afriche</territory>
+ <territory type="005" draft="unconfirmed">Americhe meridionâl</territory>
+ <territory type="009" draft="unconfirmed">Oceanie</territory>
+ <territory type="011" draft="unconfirmed">Afriche ocidentâl</territory>
+ <territory type="013" draft="unconfirmed">Americhe centrâl</territory>
+ <territory type="014" draft="unconfirmed">Afriche orientâl</territory>
+ <territory type="015" draft="unconfirmed">Afriche setentrionâl</territory>
+ <territory type="017" draft="unconfirmed">Afriche di mieç</territory>
+ <territory type="018" draft="unconfirmed">Afriche meridionâl</territory>
+ <territory type="019" draft="unconfirmed">Americhis</territory>
+ <territory type="021" draft="unconfirmed">Americhe setentrionâl</territory>
+ <territory type="029" draft="unconfirmed">caraibic</territory>
+ <territory type="030" draft="unconfirmed">Asie orientâl</territory>
+ <territory type="034" draft="unconfirmed">Asie meridionâl</territory>
+ <territory type="035" draft="unconfirmed">Asie sud orientâl</territory>
+ <territory type="039" draft="unconfirmed">Europe meridionâl</territory>
+ <territory type="053" draft="unconfirmed">Australie e Gnove Zelande</territory>
+ <territory type="054" draft="unconfirmed">Melanesie</territory>
+ <territory type="057" draft="unconfirmed">Regjon de Micronesie</territory>
+ <territory type="061" draft="unconfirmed">Polinesie</territory>
+ <territory type="142" draft="unconfirmed">Asie</territory>
+ <territory type="143" draft="unconfirmed">Asie centrâl</territory>
+ <territory type="145" draft="unconfirmed">Asie ocidentâl</territory>
+ <territory type="150" draft="unconfirmed">Europe</territory>
+ <territory type="151" draft="unconfirmed">Europe orientâl</territory>
+ <territory type="154" draft="unconfirmed">Europe setentrionâl</territory>
+ <territory type="155" draft="unconfirmed">Europe ocidentâl</territory>
+ <territory type="172" draft="unconfirmed">Commonwealth dai stâts indipendents</territory>
+ <territory type="419" draft="unconfirmed">Americhe latine e caraibiche</territory>
+ <territory type="AD" draft="unconfirmed">Andorra</territory>
+ <territory type="AE" draft="unconfirmed">Emirâts araps unîts</territory>
+ <territory type="AF" draft="unconfirmed">Afghanistan</territory>
+ <territory type="AG" draft="unconfirmed">Antigua e Barbuda</territory>
+ <territory type="AI" draft="unconfirmed">Anguilla</territory>
+ <territory type="AL" draft="unconfirmed">Albanie</territory>
+ <territory type="AM" draft="unconfirmed">Armenie</territory>
+ <territory type="AN" draft="unconfirmed">Antilis olandesis</territory>
+ <territory type="AO" draft="unconfirmed">Angola</territory>
+ <territory type="AQ" draft="unconfirmed">Antartic</territory>
+ <territory type="AR" draft="unconfirmed">Argjentine</territory>
+ <territory type="AS" draft="unconfirmed">Samoa merecanis</territory>
+ <territory type="AT" draft="unconfirmed">Austrie</territory>
+ <territory type="AU" draft="unconfirmed">Australie</territory>
+ <territory type="AW" draft="unconfirmed">Aruba</territory>
+ <territory type="AX" draft="unconfirmed">Isulis Aland</territory>
+ <territory type="AZ" draft="unconfirmed">Azerbaigian</territory>
+ <territory type="BA" draft="unconfirmed">Bosnie e Ercegovine</territory>
+ <territory type="BB" draft="unconfirmed">Barbados</territory>
+ <territory type="BD" draft="unconfirmed">Bangladesh</territory>
+ <territory type="BE" draft="unconfirmed">Belgjiche</territory>
+ <territory type="BF" draft="unconfirmed">Burkina Faso</territory>
+ <territory type="BG" draft="unconfirmed">Bulgarie</territory>
+ <territory type="BH" draft="unconfirmed">Bahrain</territory>
+ <territory type="BI" draft="unconfirmed">Burundi</territory>
+ <territory type="BJ" draft="unconfirmed">Benin</territory>
+ <territory type="BM" draft="unconfirmed">Bermuda</territory>
+ <territory type="BN" draft="unconfirmed">Brunei</territory>
+ <territory type="BO" draft="unconfirmed">Bolivie</territory>
+ <territory type="BR" draft="unconfirmed">Brasîl</territory>
+ <territory type="BS" draft="unconfirmed">Bahamas</territory>
+ <territory type="BT" draft="unconfirmed">Bhutan</territory>
+ <territory type="BV" draft="unconfirmed">Isule Bouvet</territory>
+ <territory type="BW" draft="unconfirmed">Botswana</territory>
+ <territory type="BY" draft="unconfirmed">Bielorussie</territory>
+ <territory type="BZ" draft="unconfirmed">Belize</territory>
+ <territory type="CA" draft="unconfirmed">Canade</territory>
+ <territory type="CC" draft="unconfirmed">Isulis Cocos (Keeling)</territory>
+ <territory type="CD" draft="unconfirmed">Republiche Democratiche dal Congo</territory>
+ <territory type="CF" draft="unconfirmed">Republiche centri africane</territory>
+ <territory type="CG" draft="unconfirmed">Congo</territory>
+ <territory type="CH" draft="unconfirmed">Svuizare</territory>
+ <territory type="CI" draft="unconfirmed">Cueste di Avoli</territory>
+ <territory type="CK" draft="unconfirmed">Isulis Cook</territory>
+ <territory type="CL" draft="unconfirmed">Cile</territory>
+ <territory type="CM" draft="unconfirmed">Camerun</territory>
+ <territory type="CN" draft="unconfirmed">Cine</territory>
+ <territory type="CO" draft="unconfirmed">Colombie</territory>
+ <territory type="CR" draft="unconfirmed">Costa Rica</territory>
+ <territory type="CS" draft="unconfirmed">Serbia e Montenegro</territory>
+ <territory type="CU" draft="unconfirmed">Cuba</territory>
+ <territory type="CV" draft="unconfirmed">Cjâf vert</territory>
+ <territory type="CX" draft="unconfirmed">Isule Christmas</territory>
+ <territory type="CY" draft="unconfirmed">Cipri</territory>
+ <territory type="CZ" draft="unconfirmed">Republiche ceche</territory>
+ <territory type="DE" draft="unconfirmed">Gjermanie</territory>
+ <territory type="DJ" draft="unconfirmed">Gibuti</territory>
+ <territory type="DK" draft="unconfirmed">Danimarcje</territory>
+ <territory type="DM" draft="unconfirmed">Dominiche</territory>
+ <territory type="DO" draft="unconfirmed">Republiche dominicane</territory>
+ <territory type="DZ" draft="unconfirmed">Alzerie</territory>
+ <territory type="EC" draft="unconfirmed">Ecuador</territory>
+ <territory type="EE" draft="unconfirmed">Estonie</territory>
+ <territory type="EG" draft="unconfirmed">Egit</territory>
+ <territory type="EH" draft="unconfirmed">Sahara ocidentâl</territory>
+ <territory type="ER" draft="unconfirmed">Eritree</territory>
+ <territory type="ES" draft="unconfirmed">Spagne</territory>
+ <territory type="ET" draft="unconfirmed">Etiopie</territory>
+ <territory type="FI" draft="unconfirmed">Finlandie</territory>
+ <territory type="FJ" draft="unconfirmed">Fizi</territory>
+ <territory type="FK" draft="unconfirmed">Isulis Falkland</territory>
+ <territory type="FM" draft="unconfirmed">Micronesie</territory>
+ <territory type="FO" draft="unconfirmed">Isulis Faroe</territory>
+ <territory type="FR" draft="unconfirmed">France</territory>
+ <territory type="GA" draft="unconfirmed">Gabon</territory>
+ <territory type="GB" draft="unconfirmed">Ream unît</territory>
+ <territory type="GD" draft="unconfirmed">Grenada</territory>
+ <territory type="GE" draft="unconfirmed">Gjeorgjie</territory>
+ <territory type="GF" draft="unconfirmed">Guiana francês</territory>
+ <territory type="GH" draft="unconfirmed">Ghana</territory>
+ <territory type="GI" draft="unconfirmed">Gjibraltar</territory>
+ <territory type="GL" draft="unconfirmed">Groenlande</territory>
+ <territory type="GM" draft="unconfirmed">Gambia</territory>
+ <territory type="GN" draft="unconfirmed">Guinee</territory>
+ <territory type="GP" draft="unconfirmed">Guadalupe</territory>
+ <territory type="GQ" draft="unconfirmed">Guinee ecuatoriâl</territory>
+ <territory type="GR" draft="unconfirmed">Grecie</territory>
+ <territory type="GS" draft="unconfirmed">Georgia dal Sud e Isulis Sandwich dal Sud</territory>
+ <territory type="GT" draft="unconfirmed">Guatemala</territory>
+ <territory type="GU" draft="unconfirmed">Guam</territory>
+ <territory type="GW" draft="unconfirmed">Guinea-Bissau</territory>
+ <territory type="GY" draft="unconfirmed">Guyana</territory>
+ <territory type="HK" draft="unconfirmed">Regjon aministrative speciâl di Hong Kong, Cine</territory>
+ <territory type="HM" draft="unconfirmed">Isule Heard e Isulis McDonald</territory>
+ <territory type="HN" draft="unconfirmed">Honduras</territory>
+ <territory type="HR" draft="unconfirmed">Cravuazie</territory>
+ <territory type="HT" draft="unconfirmed">Haiti</territory>
+ <territory type="HU" draft="unconfirmed">Ongjarie</territory>
+ <territory type="ID" draft="unconfirmed">Indonesie</territory>
+ <territory type="IE" draft="unconfirmed">Irlande</territory>
+ <territory type="IL" draft="unconfirmed">Israêl</territory>
+ <territory type="IN" draft="unconfirmed">India</territory>
+ <territory type="IO" draft="unconfirmed">Teritori britanic dal Ocean Indian</territory>
+ <territory type="IQ" draft="unconfirmed">Iraq</territory>
+ <territory type="IR" draft="unconfirmed">Iran</territory>
+ <territory type="IS" draft="unconfirmed">Islande</territory>
+ <territory type="IT" draft="unconfirmed">Italie</territory>
+ <territory type="JM" draft="unconfirmed">Gjamaiche</territory>
+ <territory type="JO" draft="unconfirmed">Jordanie</territory>
+ <territory type="JP" draft="unconfirmed">Gjapon</territory>
+ <territory type="KE" draft="unconfirmed">Kenya</territory>
+ <territory type="KG" draft="unconfirmed">Kirghizstan</territory>
+ <territory type="KH" draft="unconfirmed">Camboze</territory>
+ <territory type="KI" draft="unconfirmed">Kiribati</territory>
+ <territory type="KM" draft="unconfirmed">Comoris</territory>
+ <territory type="KN" draft="unconfirmed">San Kitts e Nevis</territory>
+ <territory type="KP" draft="unconfirmed">Coree dal nord</territory>
+ <territory type="KR" draft="unconfirmed">Coree dal sud</territory>
+ <territory type="KW" draft="unconfirmed">Kuwait</territory>
+ <territory type="KY" draft="unconfirmed">Isulis Cayman</territory>
+ <territory type="KZ" draft="unconfirmed">Kazachistan</territory>
+ <territory type="LA" draft="unconfirmed">Laos</territory>
+ <territory type="LB" draft="unconfirmed">Liban</territory>
+ <territory type="LC" draft="unconfirmed">Sante Lusie</territory>
+ <territory type="LI" draft="unconfirmed">Liechtenstein</territory>
+ <territory type="LK" draft="unconfirmed">Sri Lanka</territory>
+ <territory type="LR" draft="unconfirmed">Liberie</territory>
+ <territory type="LS" draft="unconfirmed">Lesotho</territory>
+ <territory type="LT" draft="unconfirmed">Lituanie</territory>
+ <territory type="LU" draft="unconfirmed">Lussemburc</territory>
+ <territory type="LV" draft="unconfirmed">Letonie</territory>
+ <territory type="LY" draft="unconfirmed">Libie</territory>
+ <territory type="MA" draft="unconfirmed">Maroc</territory>
+ <territory type="MC" draft="unconfirmed">Monaco</territory>
+ <territory type="MD" draft="unconfirmed">Moldavie</territory>
+ <territory type="MG" draft="unconfirmed">Madagascar</territory>
+ <territory type="MH" draft="unconfirmed">Isulis Marshall</territory>
+ <territory type="MK" draft="unconfirmed">Macedonie</territory>
+ <territory type="ML" draft="unconfirmed">Mali</territory>
+ <territory type="MM" draft="unconfirmed">Birmanie</territory>
+ <territory type="MN" draft="unconfirmed">Mongolie</territory>
+ <territory type="MO" draft="unconfirmed">Regjon aministradive di Macao, Cine</territory>
+ <territory type="MP" draft="unconfirmed">Isulis Mariana dal Nord</territory>
+ <territory type="MQ" draft="unconfirmed">Martiniche</territory>
+ <territory type="MR" draft="unconfirmed">Mauritanie</territory>
+ <territory type="MS" draft="unconfirmed">Montserrat</territory>
+ <territory type="MT" draft="unconfirmed">Malta</territory>
+ <territory type="MU" draft="unconfirmed">Maurizi</territory>
+ <territory type="MV" draft="unconfirmed">Maldivis</territory>
+ <territory type="MW" draft="unconfirmed">Malawi</territory>
+ <territory type="MX" draft="unconfirmed">Messic</territory>
+ <territory type="MY" draft="unconfirmed">Malaysia</territory>
+ <territory type="MZ" draft="unconfirmed">Mozambic</territory>
+ <territory type="NA" draft="unconfirmed">Namibie</territory>
+ <territory type="NC" draft="unconfirmed">Gnove Caledonie</territory>
+ <territory type="NE" draft="unconfirmed">Niger</territory>
+ <territory type="NF" draft="unconfirmed">Isole Norfolk</territory>
+ <territory type="NG" draft="unconfirmed">Nigerie</territory>
+ <territory type="NI" draft="unconfirmed">Nicaragua</territory>
+ <territory type="NL" draft="unconfirmed">Paîs bas</territory>
+ <territory type="NO" draft="unconfirmed">Norvegje</territory>
+ <territory type="NP" draft="unconfirmed">Nepal</territory>
+ <territory type="NR" draft="unconfirmed">Nauru</territory>
+ <territory type="NU" draft="unconfirmed">Niue</territory>
+ <territory type="NZ" draft="unconfirmed">Gnove Zelande</territory>
+ <territory type="OM" draft="unconfirmed">Oman</territory>
+ <territory type="PA" draft="unconfirmed">Panamà</territory>
+ <territory type="PE" draft="unconfirmed">Perù</territory>
+ <territory type="PF" draft="unconfirmed">Polinesie francês</territory>
+ <territory type="PG" draft="unconfirmed">Papue Gnove Guinee</territory>
+ <territory type="PH" draft="unconfirmed">Filipinis</territory>
+ <territory type="PK" draft="unconfirmed">Pakistan</territory>
+ <territory type="PL" draft="unconfirmed">Polonie</territory>
+ <territory type="PM" draft="unconfirmed">San Pierre e Miquelon</territory>
+ <territory type="PN" draft="unconfirmed">Pitcairn</territory>
+ <territory type="PR" draft="unconfirmed">Porto Rico</territory>
+ <territory type="PS" draft="unconfirmed">Teritori palestinês</territory>
+ <territory type="PT" draft="unconfirmed">Portugal</territory>
+ <territory type="PW" draft="unconfirmed">Palau</territory>
+ <territory type="PY" draft="unconfirmed">Paraguay</territory>
+ <territory type="QA" draft="unconfirmed">Qatar</territory>
+ <territory type="QO" draft="unconfirmed">Oceanie periferiche</territory>
+ <territory type="RE" draft="unconfirmed">Reunion</territory>
+ <territory type="RO" draft="unconfirmed">Romanie</territory>
+ <territory type="RU" draft="unconfirmed">Russie</territory>
+ <territory type="RW" draft="unconfirmed">Ruande</territory>
+ <territory type="SA" draft="unconfirmed">Arabie Saudide</territory>
+ <territory type="SB" draft="unconfirmed">Isulis Salomon</territory>
+ <territory type="SC" draft="unconfirmed">Seychelles</territory>
+ <territory type="SE" draft="unconfirmed">Svezie</territory>
+ <territory type="SG" draft="unconfirmed">Singapore</territory>
+ <territory type="SH" draft="unconfirmed">Sante Eline</territory>
+ <territory type="SI" draft="unconfirmed">Slovenie</territory>
+ <territory type="SJ" draft="unconfirmed">Svalbard e Jan Mayen</territory>
+ <territory type="SK" draft="unconfirmed">Slovachie</territory>
+ <territory type="SL" draft="unconfirmed">Sierra Leone</territory>
+ <territory type="SM" draft="unconfirmed">San Marin</territory>
+ <territory type="SN" draft="unconfirmed">Senegal</territory>
+ <territory type="SO" draft="unconfirmed">Somalie</territory>
+ <territory type="SR" draft="unconfirmed">Suriname</territory>
+ <territory type="ST" draft="unconfirmed">Sao Tomè e Principe</territory>
+ <territory type="SV" draft="unconfirmed">El Salvador</territory>
+ <territory type="SY" draft="unconfirmed">Sirie</territory>
+ <territory type="SZ" draft="unconfirmed">Swaziland</territory>
+ <territory type="TC" draft="unconfirmed">Isulis Turks e Caicos</territory>
+ <territory type="TD" draft="unconfirmed">Çad</territory>
+ <territory type="TF" draft="unconfirmed">Teritoris meridionâi francês</territory>
+ <territory type="TG" draft="unconfirmed">Togo</territory>
+ <territory type="TH" draft="unconfirmed">Tailandie</territory>
+ <territory type="TJ" draft="unconfirmed">Tazikistan</territory>
+ <territory type="TK" draft="unconfirmed">Tokelau</territory>
+ <territory type="TL" draft="unconfirmed">Timor orientâl</territory>
+ <territory type="TM" draft="unconfirmed">Turkmenistan</territory>
+ <territory type="TN" draft="unconfirmed">Tunisie</territory>
+ <territory type="TO" draft="unconfirmed">Tonga</territory>
+ <territory type="TR" draft="unconfirmed">Turchie</territory>
+ <territory type="TT" draft="unconfirmed">Trinidad e Tobago</territory>
+ <territory type="TV" draft="unconfirmed">Tuvalu</territory>
+ <territory type="TW" draft="unconfirmed">Taiwan</territory>
+ <territory type="TZ" draft="unconfirmed">Tanzanie</territory>
+ <territory type="UA" draft="unconfirmed">Ucraine</territory>
+ <territory type="UG" draft="unconfirmed">Uganda</territory>
+ <territory type="UM" draft="unconfirmed">Isulis periferichis minôrs dai Stâts Unîts</territory>
+ <territory type="US" draft="unconfirmed">Stâts Unîts</territory>
+ <territory type="UY" draft="unconfirmed">Uruguay</territory>
+ <territory type="UZ" draft="unconfirmed">Uzbechistan</territory>
+ <territory type="VA" draft="unconfirmed">Vatican</territory>
+ <territory type="VC" draft="unconfirmed">San Vincent e lis Grenadinis</territory>
+ <territory type="VE" draft="unconfirmed">Venezuela</territory>
+ <territory type="VG" draft="unconfirmed">Isulis vergjinis britanichis</territory>
+ <territory type="VI" draft="unconfirmed">Isulis vergjinis americanis</territory>
+ <territory type="VN" draft="unconfirmed">Vietnam</territory>
+ <territory type="VU" draft="unconfirmed">Vanuatu</territory>
+ <territory type="WF" draft="unconfirmed">Wallis e Futuna</territory>
+ <territory type="WS" draft="unconfirmed">Samoa</territory>
+ <territory type="YE" draft="unconfirmed">Yemen</territory>
+ <territory type="YT" draft="unconfirmed">Mayotte</territory>
+ <territory type="ZA" draft="unconfirmed">Sud Afriche</territory>
+ <territory type="ZM" draft="unconfirmed">Zambia</territory>
+ <territory type="ZW" draft="unconfirmed">Zimbabwe</territory>
+ </territories>
+ <variants>
+ <variant type="1901" draft="unconfirmed">Ortografie todescje tradizionâl</variant>
+ <variant type="1996" draft="unconfirmed">Ortografie todescje dal 1996</variant>
+ <variant type="NEDIS" draft="unconfirmed">Dialet des valadis dal Nadison</variant>
+ <variant type="POLYTONI" draft="unconfirmed">Politoniche</variant>
+ <variant type="REVISED" draft="unconfirmed">Ortografie revisade</variant>
+ <variant type="ROZAJ" draft="unconfirmed">Resian</variant>
+ </variants>
+ <keys>
+ <key type="calendar" draft="unconfirmed">Lunari</key>
+ <key type="collation" draft="unconfirmed">Ordenament</key>
+ <key type="currency" draft="unconfirmed">Monede</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation" draft="unconfirmed">cinês tradizionâl (Big5)</type>
+ <type type="buddhist" key="calendar" draft="unconfirmed">Lunari budist</type>
+ <type type="chinese" key="calendar" draft="unconfirmed">Lunari cinês</type>
+ <type type="direct" key="collation" draft="unconfirmed">Ordin diret</type>
+ <type type="gb2312han" key="collation" draft="unconfirmed">cinês semplificât (GB2312)</type>
+ <type type="gregorian" key="calendar" draft="unconfirmed">Lunari gregorian</type>
+ <type type="hebrew" key="calendar" draft="unconfirmed">Lunari ebreu</type>
+ <type type="islamic" key="calendar" draft="unconfirmed">Lunari islamic</type>
+ <type type="islamic-civil" key="calendar" draft="unconfirmed">Lunari islamic civîl</type>
+ <type type="japanese" key="calendar" draft="unconfirmed">Lunari gjaponês</type>
+ <type type="phonebook" key="collation" draft="unconfirmed">Ordin dal elenc telefonic</type>
+ <type type="pinyin" key="collation" draft="unconfirmed">Ordin pinyin</type>
+ <type type="stroke" key="collation" draft="unconfirmed">Ordin Stroke</type>
+ <type type="traditional" key="collation" draft="unconfirmed">tradizionâl</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US" draft="unconfirmed">anglosasson</measurementSystemName>
+ <measurementSystemName type="metric" draft="unconfirmed">metric</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a à â b c ç d e è ê f-i ì î j-o ò ô p-u ù û v-z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[Ã¥ Ä Ã© ë ÄŸ ï ñ ó Å¡ ü]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Zen</month>
+ <month type="2" draft="unconfirmed">Fev</month>
+ <month type="3" draft="unconfirmed">Mar</month>
+ <month type="4" draft="unconfirmed">Avr</month>
+ <month type="5" draft="unconfirmed">Mai</month>
+ <month type="6" draft="unconfirmed">Jug</month>
+ <month type="7" draft="unconfirmed">Lui</month>
+ <month type="8" draft="unconfirmed">Avo</month>
+ <month type="9" draft="unconfirmed">Set</month>
+ <month type="10" draft="unconfirmed">Otu</month>
+ <month type="11" draft="unconfirmed">Nov</month>
+ <month type="12" draft="unconfirmed">Dic</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Zenâr</month>
+ <month type="2" draft="unconfirmed">Fevrâr</month>
+ <month type="3" draft="unconfirmed">Març</month>
+ <month type="4" draft="unconfirmed">Avrîl</month>
+ <month type="5" draft="unconfirmed">Mai</month>
+ <month type="6" draft="unconfirmed">Jugn</month>
+ <month type="7" draft="unconfirmed">Lui</month>
+ <month type="8" draft="unconfirmed">Avost</month>
+ <month type="9" draft="unconfirmed">Setembar</month>
+ <month type="10" draft="unconfirmed">Otubar</month>
+ <month type="11" draft="unconfirmed">Novembar</month>
+ <month type="12" draft="unconfirmed">Dicembar</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">Z</month>
+ <month type="2" draft="unconfirmed">F</month>
+ <month type="3" draft="unconfirmed">M</month>
+ <month type="4" draft="unconfirmed">A</month>
+ <month type="5" draft="unconfirmed">M</month>
+ <month type="6" draft="unconfirmed">J</month>
+ <month type="7" draft="unconfirmed">L</month>
+ <month type="8" draft="unconfirmed">A</month>
+ <month type="9" draft="unconfirmed">S</month>
+ <month type="10" draft="unconfirmed">O</month>
+ <month type="11" draft="unconfirmed">N</month>
+ <month type="12" draft="unconfirmed">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">dom</day>
+ <day type="mon" draft="unconfirmed">lun</day>
+ <day type="tue" draft="unconfirmed">mar</day>
+ <day type="wed" draft="unconfirmed">mie</day>
+ <day type="thu" draft="unconfirmed">joi</day>
+ <day type="fri" draft="unconfirmed">vin</day>
+ <day type="sat" draft="unconfirmed">sab</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">domenie</day>
+ <day type="mon" draft="unconfirmed">lunis</day>
+ <day type="tue" draft="unconfirmed">martars</day>
+ <day type="wed" draft="unconfirmed">miercus</day>
+ <day type="thu" draft="unconfirmed">joibe</day>
+ <day type="fri" draft="unconfirmed">vinars</day>
+ <day type="sat" draft="unconfirmed">sabide</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">D</day>
+ <day type="mon" draft="unconfirmed">L</day>
+ <day type="tue" draft="unconfirmed">M</day>
+ <day type="wed" draft="unconfirmed">M</day>
+ <day type="thu" draft="unconfirmed">J</day>
+ <day type="fri" draft="unconfirmed">V</day>
+ <day type="sat" draft="unconfirmed">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">T1</quarter>
+ <quarter type="2" draft="unconfirmed">T2</quarter>
+ <quarter type="3" draft="unconfirmed">T3</quarter>
+ <quarter type="4" draft="unconfirmed">T4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">Prin trimestri</quarter>
+ <quarter type="2" draft="unconfirmed">Secont trimestri</quarter>
+ <quarter type="3" draft="unconfirmed">Tierç trimestri</quarter>
+ <quarter type="4" draft="unconfirmed">Cuart trimestri</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am draft="unconfirmed">a.</am>
+ <pm draft="unconfirmed">p.</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">pdC</era>
+ <era type="1" draft="unconfirmed">ddC</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">pdC</era>
+ <era type="1" draft="unconfirmed">ddC</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMMM yyyy EEEE</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">d/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMd" draft="provisional">d/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName draft="unconfirmed">ere</displayName>
+ </field>
+ <field type="year">
+ <displayName draft="unconfirmed">an</displayName>
+ </field>
+ <field type="month">
+ <displayName draft="unconfirmed">mês</displayName>
+ </field>
+ <field type="week">
+ <displayName draft="unconfirmed">setemane</displayName>
+ </field>
+ <field type="day">
+ <displayName draft="unconfirmed">dì</displayName>
+ </field>
+ <field type="weekday">
+ <displayName draft="unconfirmed">dì de setemane</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName draft="unconfirmed">toc dal dì</displayName>
+ </field>
+ <field type="hour">
+ <displayName draft="unconfirmed">ore</displayName>
+ </field>
+ <field type="minute">
+ <displayName draft="unconfirmed">minût</displayName>
+ </field>
+ <field type="second">
+ <displayName draft="unconfirmed">secont</displayName>
+ </field>
+ <field type="zone">
+ <displayName draft="unconfirmed">zone</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity draft="unconfirmed">San Pauli dal Brasîl</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity draft="unconfirmed">Canariis</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity draft="unconfirmed">Azoris</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity draft="unconfirmed">Lisbone</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity draft="unconfirmed">Mosche</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal draft="unconfirmed">,</decimal>
+ <group draft="unconfirmed">.</group>
+ </symbols>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ARS">
+ <displayName draft="unconfirmed">Peso argjentin</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName draft="unconfirmed">Selin austriac</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName draft="unconfirmed">Dolar australian</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName draft="unconfirmed">Franc de Belgjiche</displayName>
+ </currency>
+ <currency type="BIF">
+ <displayName draft="unconfirmed">Franc burundês</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName draft="unconfirmed">Dolar dal Brunei</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">Real brasilian</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName draft="unconfirmed">Rubli bielorùs</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName draft="unconfirmed">Dolar canadês</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName draft="unconfirmed">Franc svuizar</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="unconfirmed">Yuan Renminbi cinês </displayName>
+ </currency>
+ <currency type="CSD">
+ <displayName draft="unconfirmed">Dinar serp</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName draft="unconfirmed">Peso cuban</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName draft="unconfirmed">Corone de Republiche Ceche</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName draft="unconfirmed">Marc todesc</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName draft="unconfirmed">Corone danês</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName draft="unconfirmed">Dinar algerin</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="unconfirmed">Euro</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName draft="unconfirmed">Franc francês</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">Sterline britaniche</displayName>
+ </currency>
+ <currency type="HRD">
+ <displayName draft="unconfirmed">Dinar cravuat</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName draft="unconfirmed">Kuna cravuate</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">Rupie indiane</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName draft="unconfirmed">Lire taliane</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="unconfirmed">Yen gjaponês</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName draft="unconfirmed">Won de Coree dal Sud</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName draft="unconfirmed">Peso messican</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName draft="unconfirmed">Dolar namibian</displayName>
+ </currency>
+ <currency type="NZD">
+ <displayName draft="unconfirmed">Dollar neozelandês</displayName>
+ </currency>
+ <currency type="PLN">
+ <displayName draft="unconfirmed">Zloty polac</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">Rubli rus</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName draft="unconfirmed">Corone svedês</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName draft="unconfirmed">Talar sloven</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName draft="unconfirmed">Corone slovache</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName draft="unconfirmed">Lire turche</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">Dolar american</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName draft="unconfirmed">Rand sudafrican</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">sì:si:s</yesstr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1" uri="http://en.wikipedia.org/wiki/Friulian#Writing_systems">Wikipedia on Friulian writing</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/fur_IT.xml b/libs/Zend/Locale/Data/fur_IT.xml
new file mode 100755
index 0000000000..2787ee624e
--- /dev/null
+++ b/libs/Zend/Locale/Data/fur_IT.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="fur"/>
+ <territory type="IT"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ga.xml b/libs/Zend/Locale/Data/ga.xml
new file mode 100755
index 0000000000..f3e170b562
--- /dev/null
+++ b/libs/Zend/Locale/Data/ga.xml
@@ -0,0 +1,1426 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.51 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ga"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">Afar</language>
+ <language type="ab">Abcáisis</language>
+ <language type="ae">Aivéistis</language>
+ <language type="af">Afracáinis</language>
+ <language type="ar">Araibis</language>
+ <language type="as">Asaimis</language>
+ <language type="az">Asarbaiseáinis</language>
+ <language type="ba">Baiscíris</language>
+ <language type="be">Bealarúisis</language>
+ <language type="bg">Bulgáiris</language>
+ <language type="bn">Beangálais</language>
+ <language type="bo">Tibéadais</language>
+ <language type="br">Briotáinis</language>
+ <language type="bs">Boisnis</language>
+ <language type="ca">Catalóinis</language>
+ <language type="ce">Sisinis</language>
+ <language type="co">Corsaicis</language>
+ <language type="cr">Craíais</language>
+ <language type="cs">Seicis</language>
+ <language type="cu">Slavais na hEaglaise</language>
+ <language type="cv">Suvaisis</language>
+ <language type="cy">Breatnais</language>
+ <language type="da">Danmhairgis</language>
+ <language type="de">Gearmáinis</language>
+ <language type="el">Gréigis</language>
+ <language type="en">Béarla</language>
+ <language type="eo">Esperanto</language>
+ <language type="es">Spáinnis</language>
+ <language type="et">Eastóinis</language>
+ <language type="eu">Bascais</language>
+ <language type="fa">Peirsis</language>
+ <language type="fi">Fionnlainnis</language>
+ <language type="fj">Fidsis</language>
+ <language type="fo">Faróis</language>
+ <language type="fr">Fraincis</language>
+ <language type="fy">Freaslainnais</language>
+ <language type="ga">Gaeilge</language>
+ <language type="gd">Gaeilge na hAlban</language>
+ <language type="gu">Gúisearáitis</language>
+ <language type="gv">Mannainis</language>
+ <language type="haw">Haváíais</language>
+ <language type="he">Eabhrais</language>
+ <language type="hi">Hiondúis</language>
+ <language type="hr">Cróitis</language>
+ <language type="hu">Ungáiris</language>
+ <language type="hy">Airméinis</language>
+ <language type="ia">Interlingua</language>
+ <language type="id">Indinéisis</language>
+ <language type="ie">Interlingue</language>
+ <language type="ik">Inupiaq</language>
+ <language type="io">Ido</language>
+ <language type="is">Ãoslainnais</language>
+ <language type="it">Iodáilis</language>
+ <language type="iu">Ionúitis</language>
+ <language type="ja">Seapáinis</language>
+ <language type="jv">Iávais</language>
+ <language type="ka">Seoirsis</language>
+ <language type="kk">Casachais</language>
+ <language type="kn">Cannadais</language>
+ <language type="ko">Cóiréis</language>
+ <language type="ks">Caismíris</language>
+ <language type="kw">Cornais</language>
+ <language type="ky">Cirgeasais</language>
+ <language type="la">Laidin</language>
+ <language type="lb">Leitseabuirgis</language>
+ <language type="lo">Laosais</language>
+ <language type="lt">Liotuáinis</language>
+ <language type="lv">Laitvis</language>
+ <language type="mg">Malagásais</language>
+ <language type="mi">Maorais</language>
+ <language type="mk">Macadóinis</language>
+ <language type="ml">Mailéalaimis</language>
+ <language type="mn">Mongóilis</language>
+ <language type="mo">Moldáivis</language>
+ <language type="mr">Maraitis</language>
+ <language type="mt">Maltais</language>
+ <language type="my">Burmais</language>
+ <language type="na">Nárúis</language>
+ <language type="nb">Ioruais Bokmål</language>
+ <language type="ne">Neipealais</language>
+ <language type="nl">Ollainnais</language>
+ <language type="nn">Ioruais Nynorsk</language>
+ <language type="no">Ioruais</language>
+ <language type="nv">Navachóis</language>
+ <language type="oc">Ocatáinis (tar éis 1500); Provençal</language>
+ <language type="oc" alt="proposed-u216-1" draft="unconfirmed">Ocatáinis (tar éis 1500); Proibhinsis</language>
+ <language type="os">Óiséitis</language>
+ <language type="pa">Puinseaibis</language>
+ <language type="pl">Polainnis</language>
+ <language type="ps">Paisteo</language>
+ <language type="pt">Portaingéilis</language>
+ <language type="qu">Ceatsuais</language>
+ <language type="ro">Romáinis</language>
+ <language type="ru">Rúisis</language>
+ <language type="sa">Sanscrait</language>
+ <language type="sc">Sairdínis</language>
+ <language type="sd">Sindis</language>
+ <language type="se">Sáimis Thuaidh</language>
+ <language type="sh">Seirbea-Chróitis</language>
+ <language type="sk">Slóvacais</language>
+ <language type="sl">Slóvéinis</language>
+ <language type="sm">Samóis</language>
+ <language type="so">Somálais</language>
+ <language type="sq">Albáinis</language>
+ <language type="sr">Seirbis</language>
+ <language type="sv">Sualainnis</language>
+ <language type="sw">Svahaílis</language>
+ <language type="ta">Tamailis</language>
+ <language type="th">Téalainnis</language>
+ <language type="tl">Tagálaigis</language>
+ <language type="tr">Tuircis</language>
+ <language type="tt">Tatarais</language>
+ <language type="ty">Taihítis</language>
+ <language type="uk">Úcráinis</language>
+ <language type="ur">Urdais</language>
+ <language type="uz">Úisbéicis</language>
+ <language type="vi">Vítneamais</language>
+ <language type="wa">Vallúnais</language>
+ <language type="yi">Giúdais</language>
+ <language type="zh">Sínis</language>
+ <language type="zu">Súlúis</language>
+ </languages>
+ <scripts>
+ <script type="Arab" draft="unconfirmed">Arabach</script>
+ <script type="Armn" draft="unconfirmed">Airméanach</script>
+ <script type="Beng" draft="unconfirmed">Beangálach</script>
+ <script type="Cyrl" draft="unconfirmed">Coireallach</script>
+ <script type="Deva" draft="unconfirmed">Déiveanágrach</script>
+ <script type="Ethi" draft="unconfirmed">Aetópach</script>
+ <script type="Goth" draft="unconfirmed">Gotach</script>
+ <script type="Grek" draft="unconfirmed">Gréagach</script>
+ <script type="Gujr" draft="unconfirmed">Gúisearátach</script>
+ <script type="Guru" draft="unconfirmed">Gurmúcach</script>
+ <script type="Hang" draft="unconfirmed">Hangalach</script>
+ <script type="Hani" draft="unconfirmed">Han</script>
+ <script type="Hans" draft="unconfirmed">Han Símplithe</script>
+ <script type="Hant" draft="unconfirmed">Han Traidisiúnta</script>
+ <script type="Hebr" draft="unconfirmed">Eabhrach</script>
+ <script type="Hira" draft="unconfirmed">Híreagánach</script>
+ <script type="Hrkt" draft="unconfirmed">Catacánach nó Híreagánach</script>
+ <script type="Kana" draft="unconfirmed">Catacánach</script>
+ <script type="Knda" draft="unconfirmed">Cannadach</script>
+ <script type="Latg" draft="unconfirmed">Laidineach (Cló Gaelach)</script>
+ <script type="Latn" draft="unconfirmed">Laidineach</script>
+ <script type="Mlym" draft="unconfirmed">Mailéalamach</script>
+ <script type="Mong" draft="unconfirmed">Mongólach</script>
+ <script type="Ogam" draft="unconfirmed">Ogham</script>
+ <script type="Orya" draft="unconfirmed">Oiríseach</script>
+ <script type="Runr" draft="unconfirmed">Rúnach</script>
+ <script type="Taml" draft="unconfirmed">Tamalach</script>
+ <script type="Telu" draft="unconfirmed">Teileagúch</script>
+ <script type="Thai" draft="unconfirmed">Téallanach</script>
+ <script type="Tibt" draft="unconfirmed">Tibéadach</script>
+ </scripts>
+ <territories>
+ <territory type="001" draft="unconfirmed">An Domhan</territory>
+ <territory type="002" draft="unconfirmed">An Afraic</territory>
+ <territory type="053" draft="unconfirmed">An Astráil agus an Nua-Shéalainn</territory>
+ <territory type="142" draft="unconfirmed">An Ãise</territory>
+ <territory type="150" draft="unconfirmed">An Eoraip</territory>
+ <territory type="AD">Andóra</territory>
+ <territory type="AE">Aontas na nÉimíríochtaí Arabacha</territory>
+ <territory type="AF">An Afganastáin</territory>
+ <territory type="AG">Antigua agus Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">An Albáin</territory>
+ <territory type="AM">An Airméin</territory>
+ <territory type="AN">Antillí na hÃsiltíre</territory>
+ <territory type="AO">Angóla</territory>
+ <territory type="AQ">An Antartaice</territory>
+ <territory type="AR">An Airgintín</territory>
+ <territory type="AS">Samó Meiriceánach</territory>
+ <territory type="AT">An Ostair</territory>
+ <territory type="AU">An Astráil</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AW" alt="proposed-u216-1" draft="unconfirmed">Arúba</territory>
+ <territory type="AX" draft="unconfirmed">Oileáin Alaind</territory>
+ <territory type="AZ">An Asarbaiseáin</territory>
+ <territory type="BA">An Bhoisnia-Heirseagaivéin</territory>
+ <territory type="BA" alt="proposed-u216-1" draft="unconfirmed">An Bhoisnia agus Heirseagóvéin</territory>
+ <territory type="BB">Barbadós</territory>
+ <territory type="BD">An Bhanglaidéis</territory>
+ <territory type="BE">An Bheilg</territory>
+ <territory type="BF">Buircíne Fasó</territory>
+ <territory type="BG">An Bhulgáir</territory>
+ <territory type="BH">Bairéin</territory>
+ <territory type="BI">An Bhurúin</territory>
+ <territory type="BJ">Beinin</territory>
+ <territory type="BM">Beirmiúda</territory>
+ <territory type="BN">Brúiné</territory>
+ <territory type="BO">An Bholaiv</territory>
+ <territory type="BR">An Bhrasaíl</territory>
+ <territory type="BS">Na Bahámaí</territory>
+ <territory type="BT">An Bhútáin</territory>
+ <territory type="BV">Oileáin Bouvet</territory>
+ <territory type="BV" alt="proposed-u216-1" draft="unconfirmed">Oileán Bouvet</territory>
+ <territory type="BW">An Bhotsuáin</territory>
+ <territory type="BY">An Bhealarúis</territory>
+ <territory type="BZ">An Bheilís</territory>
+ <territory type="CA">Ceanada</territory>
+ <territory type="CC">Oileáin Cocos (Keeling)</territory>
+ <territory type="CC" alt="proposed-u216-1" draft="unconfirmed">Oileáin na gCócónna (Keeling)</territory>
+ <territory type="CD">Poblacht Dhaonlathach an Chongó</territory>
+ <territory type="CF">Poblacht na hAfraice Láir</territory>
+ <territory type="CG">An Congó</territory>
+ <territory type="CH">An Eilvéis</territory>
+ <territory type="CI">An Cósta Eabhair</territory>
+ <territory type="CK">Oileáin Cook</territory>
+ <territory type="CL">An tSile</territory>
+ <territory type="CM">Camarún</territory>
+ <territory type="CN">An tSín</territory>
+ <territory type="CO">An Cholóim</territory>
+ <territory type="CR">Cósta Ríce</territory>
+ <territory type="CS" draft="unconfirmed">An tSeirbia agus Montainéagró</territory>
+ <territory type="CU">Cúba</territory>
+ <territory type="CV">Rinn Verde</territory>
+ <territory type="CV" alt="proposed-u216-1" draft="unconfirmed">An Rinn Ghlas</territory>
+ <territory type="CX">Oileán na Nollag</territory>
+ <territory type="CY">An Chipir</territory>
+ <territory type="CZ">Poblacht na Seice</territory>
+ <territory type="DE">An Ghearmáin</territory>
+ <territory type="DJ">Djibouti</territory>
+ <territory type="DK">An Danmhairg</territory>
+ <territory type="DM">Doiminice</territory>
+ <territory type="DO">An Phoblacht Dhoiminiceach</territory>
+ <territory type="DZ">An Ailgéir</territory>
+ <territory type="EC">Eacuadór</territory>
+ <territory type="EE">An Eastóin</territory>
+ <territory type="EG">An Éigipt</territory>
+ <territory type="EH">An Sahára Thiar</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ER" alt="proposed-u216-1" draft="unconfirmed">An Eiritré</territory>
+ <territory type="ES">An Spáinn</territory>
+ <territory type="ET">An Aetóip</territory>
+ <territory type="FI">An Fhionlainn</territory>
+ <territory type="FJ">Fidsí</territory>
+ <territory type="FK">Oileáin Fháclainne</territory>
+ <territory type="FM">An Mhicrinéis</territory>
+ <territory type="FO">Oileáin Fharó</territory>
+ <territory type="FR">An Fhrainc</territory>
+ <territory type="GA">An Ghabúin</territory>
+ <territory type="GB">An Ríocht Aontaithe</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">An tSeoirsia</territory>
+ <territory type="GF">An Ghuáin Fhrancach</territory>
+ <territory type="GH">Gána</territory>
+ <territory type="GI">Giobráltar</territory>
+ <territory type="GL">An Ghraonlainn</territory>
+ <territory type="GM">An Ghaimbia</territory>
+ <territory type="GN">An Ghuine</territory>
+ <territory type="GP">Guadalúip</territory>
+ <territory type="GQ">An Ghuine Mheánchriosach</territory>
+ <territory type="GR">An Ghréig</territory>
+ <territory type="GS">An tSeoirsia Theas agus Oileáin Sandwich Theas</territory>
+ <territory type="GT">Guatamala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">An Ghuine-Bhissau</territory>
+ <territory type="GY">An Ghuáin</territory>
+ <territory type="HK" draft="unconfirmed">Hong Cong (R.R.S. na Síne)</territory>
+ <territory type="HM">Oileán Heard agus Oileáin McDonald</territory>
+ <territory type="HN">Hondúras</territory>
+ <territory type="HR">An Chróit</territory>
+ <territory type="HT">Háití</territory>
+ <territory type="HU">An Ungáir</territory>
+ <territory type="ID">An Indinéis</territory>
+ <territory type="IE">Éire</territory>
+ <territory type="IL">Iosrael</territory>
+ <territory type="IN">An India</territory>
+ <territory type="IO">Críocha Briotanacha an Aigéin Indiagh</territory>
+ <territory type="IQ">An Iaráic</territory>
+ <territory type="IR">An Iaráin</territory>
+ <territory type="IS">An Ãoslainn</territory>
+ <territory type="IT">An Iodáil</territory>
+ <territory type="JM">Iamáice</territory>
+ <territory type="JO">An Iordáin</territory>
+ <territory type="JP">An tSeapáin</territory>
+ <territory type="KE">An Chéinia</territory>
+ <territory type="KG">An Chirgeastáin</territory>
+ <territory type="KH">An Chambóid</territory>
+ <territory type="KI">Cireabaití</territory>
+ <territory type="KI" alt="proposed-u216-1" draft="unconfirmed">Ciribeas</territory>
+ <territory type="KM">Oileáin Chomóra</territory>
+ <territory type="KN">Saint Kitts agus Nevis</territory>
+ <territory type="KP">An Chóiré Thuaidh</territory>
+ <territory type="KR">An Chóiré Theas</territory>
+ <territory type="KW">Cuáit</territory>
+ <territory type="KY">Oileáin Cayman</territory>
+ <territory type="KY" alt="proposed-u216-1" draft="unconfirmed">Oileáin na gCadhman</territory>
+ <territory type="KZ">An Chasacstáin</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">An Liobáin</territory>
+ <territory type="LC">Saint Lucia</territory>
+ <territory type="LC" alt="proposed-u216-1" draft="unconfirmed">San Lúisia</territory>
+ <territory type="LI">Lichtinstéin</territory>
+ <territory type="LK">Srí Lanca</territory>
+ <territory type="LR">An Libéir</territory>
+ <territory type="LS">Leosóta</territory>
+ <territory type="LT">An Liotuáin</territory>
+ <territory type="LU">Lucsamburg</territory>
+ <territory type="LV">An Laitvia</territory>
+ <territory type="LY">An Libia</territory>
+ <territory type="MA">Maracó</territory>
+ <territory type="MC">Monacó</territory>
+ <territory type="MD">An Mholdóiv</territory>
+ <territory type="MG">Madagascar</territory>
+ <territory type="MH">Oileáin Marshall</territory>
+ <territory type="MK">An Mhacadóin</territory>
+ <territory type="ML">Mailí</territory>
+ <territory type="MM">Maenmar</territory>
+ <territory type="MN">An Mhongóil</territory>
+ <territory type="MO" draft="unconfirmed">Macáó (R.R.S. na Síne)</territory>
+ <territory type="MP">Oileáin Mariana Thuaidh</territory>
+ <territory type="MQ">Martinique</territory>
+ <territory type="MQ" alt="proposed-u216-1" draft="unconfirmed">Martainíc</territory>
+ <territory type="MR">An Mharatáin</territory>
+ <territory type="MS">Montsarat</territory>
+ <territory type="MT">Málta</territory>
+ <territory type="MU">Oileán Mhuirís</territory>
+ <territory type="MV">Mhaildiví</territory>
+ <territory type="MV" alt="proposed-u216-1" draft="unconfirmed">Na Maildiví</territory>
+ <territory type="MW">An Mhaláiv</territory>
+ <territory type="MX">Meicsiceo</territory>
+ <territory type="MY">An Mhalaeisia</territory>
+ <territory type="MZ">Mósaimbíc</territory>
+ <territory type="NA">An Namaib</territory>
+ <territory type="NC">An Nua-Chaladóin</territory>
+ <territory type="NE">An Nígir</territory>
+ <territory type="NF">Oileán Norfolk</territory>
+ <territory type="NG">An Nigéir</territory>
+ <territory type="NI">Nicearagua</territory>
+ <territory type="NL">An Ãsiltír</territory>
+ <territory type="NO">An Iorua</territory>
+ <territory type="NP">Neipeal</territory>
+ <territory type="NR">Nárú</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">An Nua-Shéalainn</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peiriú</territory>
+ <territory type="PF">An Pholainéis Fhrancach</territory>
+ <territory type="PG">Nua-Ghuine Phapua</territory>
+ <territory type="PH">Na hOileáin Fhilipíneacha</territory>
+ <territory type="PK">An Phacastáin</territory>
+ <territory type="PL">An Pholainn</territory>
+ <territory type="PM">Saint Pierre agus Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Portó Ríce</territory>
+ <territory type="PS">Na Críocha Pailistíneacha</territory>
+ <territory type="PT">An Phortaingéil</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paragua</territory>
+ <territory type="QA">Catar</territory>
+ <territory type="RE">Réunion</territory>
+ <territory type="RO">An Rómáin</territory>
+ <territory type="RU">Cónaidhm na Rúise</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SA">An Araib Shádach</territory>
+ <territory type="SB">Oileáin Solomon</territory>
+ <territory type="SB" alt="proposed-u216-1" draft="unconfirmed">Oileáin Sholaimh</territory>
+ <territory type="SC">Na Séiséil</territory>
+ <territory type="SD">An tSúdáin</territory>
+ <territory type="SE">An tSualainn</territory>
+ <territory type="SG">Singeapór</territory>
+ <territory type="SH">San Héilin</territory>
+ <territory type="SI">An tSlóvéin</territory>
+ <territory type="SJ">Svalbard agus Jan Mayen</territory>
+ <territory type="SK">An tSlóvaic</territory>
+ <territory type="SL">Siarra Leon</territory>
+ <territory type="SM">San Mairíne</territory>
+ <territory type="SN">An tSeineagáil</territory>
+ <territory type="SO">An tSomáil</territory>
+ <territory type="SR">Suranam</territory>
+ <territory type="ST">Sao Tome agus Principe</territory>
+ <territory type="SV">An tSalvadóir</territory>
+ <territory type="SY">An tSiria</territory>
+ <territory type="SZ">An tSuasalainn</territory>
+ <territory type="TC">Oileáin Turks agus Caicos</territory>
+ <territory type="TD">Sead</territory>
+ <territory type="TF">Críocha Francacha Theas</territory>
+ <territory type="TG">Tóga</territory>
+ <territory type="TH">An Téalainn</territory>
+ <territory type="TJ">An Táidsíceastáin</territory>
+ <territory type="TK">Tócalá</territory>
+ <territory type="TL">Tíomór-Leste</territory>
+ <territory type="TL" alt="proposed-u216-1" draft="unconfirmed">Tíomór Thoir</territory>
+ <territory type="TM">An Tuircméanastáin</territory>
+ <territory type="TN">An Túinéis</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">An Tuirc</territory>
+ <territory type="TT">Oileáin na Tríonóide agus Tobága</territory>
+ <territory type="TV">Tuvalú</territory>
+ <territory type="TW">An Téaváin</territory>
+ <territory type="TZ">An Tansáin</territory>
+ <territory type="UA">An Úcráin</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">Mion-Oileáin Imeallacha S.A.M.</territory>
+ <territory type="US">Stáit Aontaithe Mheiriceá</territory>
+ <territory type="UY">Urugua</territory>
+ <territory type="UZ">Úisbéiceastáin</territory>
+ <territory type="VA">An Chathaoir Naofa (Stát Chathair na Vatacáine)</territory>
+ <territory type="VC">Saint Vincent agus na Grenadines</territory>
+ <territory type="VE">Veiniséala</territory>
+ <territory type="VG">Oileáin Bhriotanacha na Maighdean</territory>
+ <territory type="VI">Oileáin na Maighdean S.A.M.</territory>
+ <territory type="VN">Vítneam</territory>
+ <territory type="VN" alt="proposed-u216-1" draft="unconfirmed">Vít Neam</territory>
+ <territory type="VU">Vanuatú</territory>
+ <territory type="WF">Oileáin Vailís agus Futúna</territory>
+ <territory type="WS">Samó</territory>
+ <territory type="YE">Éimin</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">An Afraic Theas</territory>
+ <territory type="ZM">An tSaimbia</territory>
+ <territory type="ZW">An tSiombáib</territory>
+ </territories>
+ <keys>
+ <key type="calendar" draft="unconfirmed">Féilire</key>
+ <key type="collation" draft="unconfirmed">Comhordú</key>
+ <key type="currency" draft="unconfirmed">Airgeadra</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation" draft="unconfirmed">Síneach Traidisiúnta (Big5)</type>
+ <type type="buddhist" key="calendar" draft="unconfirmed">Féilire Búdaíoch</type>
+ <type type="chinese" key="calendar" draft="unconfirmed">Féilire Síneach</type>
+ <type type="gb2312han" key="collation" draft="unconfirmed">Síneach Símplithe (GB2312)</type>
+ <type type="gregorian" key="calendar" draft="unconfirmed">Féilire Greagórach</type>
+ <type type="hebrew" key="calendar" draft="unconfirmed">Féilire Eabhrach</type>
+ <type type="islamic" key="calendar" draft="unconfirmed">Féilire Ioslamach</type>
+ <type type="islamic-civil" key="calendar" draft="unconfirmed">Féilire Ioslamach Sibhialta</type>
+ <type type="japanese" key="calendar" draft="unconfirmed">Féilire Seapánach</type>
+ <type type="traditional" key="collation" draft="unconfirmed">Traidisiúnta</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US" draft="unconfirmed">Meiriceánach</measurementSystemName>
+ <measurementSystemName type="metric" draft="unconfirmed">Méadrach</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a á b-e é f-i í j-o ó p-u ú v-z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[ḃ ċ ḋ ḟ ġ Ṡṗ ṡ ṫ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" alt="proposed-u216-1" draft="unconfirmed">[ḃ ċ ḋ ḟ ġ Ṡṗ ṡ ṫ]</exemplarCharacters>
+ <exemplarCharacters alt="proposed-u216-1" draft="unconfirmed">[a á b-e é f-i í j-o ó p-u ú v-z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>RbMLkUnsSElFtTauKcBeyrACvdz</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Ean</month>
+ <month type="2">Feabh</month>
+ <month type="3">Márta</month>
+ <month type="4">Aib</month>
+ <month type="5">Beal</month>
+ <month type="6">Meith</month>
+ <month type="7">Iúil</month>
+ <month type="8">Lún</month>
+ <month type="9">MFómh</month>
+ <month type="10">DFómh</month>
+ <month type="11">Samh</month>
+ <month type="12">Noll</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Eanáir</month>
+ <month type="2">Feabhra</month>
+ <month type="3">Márta</month>
+ <month type="4">Aibreán</month>
+ <month type="5">Bealtaine</month>
+ <month type="6">Meitheamh</month>
+ <month type="7">Iúil</month>
+ <month type="8">Lúnasa</month>
+ <month type="9">Meán Fómhair</month>
+ <month type="10">Deireadh Fómhair</month>
+ <month type="11">Samhain</month>
+ <month type="12">Nollaig</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">E</month>
+ <month type="2">F</month>
+ <month type="3">M</month>
+ <month type="4">A</month>
+ <month type="5">B</month>
+ <month type="6">M</month>
+ <month type="7">I</month>
+ <month type="8">L</month>
+ <month type="9">M</month>
+ <month type="10">D</month>
+ <month type="11">S</month>
+ <month type="12">N</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Domh</day>
+ <day type="mon">Luan</day>
+ <day type="tue">Máirt</day>
+ <day type="wed">Céad</day>
+ <day type="thu">Déar</day>
+ <day type="fri">Aoine</day>
+ <day type="sat">Sath</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Dé Domhnaigh</day>
+ <day type="mon">Dé Luain</day>
+ <day type="tue">Dé Máirt</day>
+ <day type="wed">Dé Céadaoin</day>
+ <day type="thu">Déardaoin</day>
+ <day type="fri">Dé hAoine</day>
+ <day type="sat">Dé Sathairn</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">R1</quarter>
+ <quarter type="2">R2</quarter>
+ <quarter type="3">R3</quarter>
+ <quarter type="4">R4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1ú ráithe</quarter>
+ <quarter type="2">2ú ráithe</quarter>
+ <quarter type="3">3ú ráithe</quarter>
+ <quarter type="4">4ú ráithe</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>a.m.</am>
+ <pm>p.m.</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">RC</era>
+ <era type="1">AD</era>
+ </eraAbbr>
+ </eras>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH:mm:ss</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Europe/Belfast">
+ <long>
+ <standard>Meán-Am Greenwich</standard>
+ <daylight>Am Samhraidh na Breataine</daylight>
+ </long>
+ <short>
+ <standard>MAG</standard>
+ <daylight>ASB</daylight>
+ </short>
+ <exemplarCity>Béal Feirste</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <long>
+ <standard>Meán-Am Greenwich</standard>
+ <daylight>Am Samhraidh na Breataine</daylight>
+ </long>
+ <short>
+ <standard>MAG</standard>
+ <daylight>ASB</daylight>
+ </short>
+ <exemplarCity>Londain</exemplarCity>
+ </zone>
+ <zone type="Europe/Dublin">
+ <long>
+ <standard>Meán-Am Greenwich</standard>
+ <daylight>Am Samhraidh na hÉireann</daylight>
+ </long>
+ <short>
+ <standard>MAG</standard>
+ <daylight>ASÉ</daylight>
+ </short>
+ <exemplarCity>Baile Ãtha Cliath</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Peseta Andóra</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>Dirham Aontas na nÉimíríochtaí Arabacha</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>Afgainí (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>Afgainí</displayName>
+ <symbol>Af</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>Lek Albánach</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>Dram Airméanach</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>Guilder na nAntillí Ãsiltíreach</displayName>
+ <symbol>AÃ f.</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>Kwanza Angólach</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Kwanza Angólach (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>Kwanza Nua Angólach (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>Kwanza Reajustado Angólach (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>Austral Airgintíneach</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Peso na Airgintíne (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Peso na Airgintíne</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>Scilling Ostarach</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>Dollar Astrálach</displayName>
+ <symbol>A$</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>Guilder Aruba</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>Manat Asarbaiseánach</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>Dínear Bhoisnia-Heirseagaivéin</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>Marc Inathraithe Bhoisnia-Heirseagaivéin</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>Dollar Bharbadóis</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>Taka Bhanglaidéiseach</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>Franc Beilgeach (inathraithe)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Franc Beilgeach</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>Franc Beilgeach (airgeadúil)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>Lev Bulgárach Crua</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>Lev Nua Bulgárach</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>Dínear na Bairéine</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>Franc na Burúine</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>Dollar Bheirmiúda</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>Dollar Bhrúiné</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>Boliviano</displayName>
+ <symbol>Bs</symbol>
+ </currency>
+ <currency type="BOP">
+ <displayName>Peso na Bolaive</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Mvdol Bolavach</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>Cruzeiro Novo Brasaíleach (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>Cruzado Brasaíleach</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>Cruzeiro Brasaíleach (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Real Brasaíleach</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRN">
+ <displayName>Cruzado Novo Brasaíleach</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>Cruzeiro Brasaíleach</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>Dollar na mBahámaí</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>Ngultrum Bútánach</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>Kyat Burmach</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>Pula Botsuánach</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>Rúbal Nua Béalarúiseach (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>Rúbal Béalarúiseach</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>Dollar na Beilíse</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>Dollar Ceanada</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>Franc Congolais an Chongó</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Franc na hEilvéise</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>Unidades de Fomento na Sile</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Peso na Sile</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>Yuan Renminbi Síneach</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>Peso na Colóime</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="CRC">
+ <displayName>Colon Chósta Ríce</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSK">
+ <displayName>Koruna Crua na Seicslóvaice</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Peso Cúba</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Escudo na Rinne Verde</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>Punt na Cipire</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>Koruna Phoblacht na Seice</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>Ostmark na hOirGhearmáine</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Deutsche Mark</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Franc Djibouti</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>Krone Danmhargach</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>Peso Doimineacach</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>Dínear na hAilgéire</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>Sucre Eacuadóir</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>Unidad de Valor Constante (UVC) Eacuadóir</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>Kroon na hEastóine</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>Punt na hÉigipte</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Peseta Spáinneach</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>Birr na hAetóipe</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>Markka Fionnlannach</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Dollar Fhidsí</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>Punt Oileáin Fháclainne</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Franc Francach</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Punt Steirling</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>Kupon Larit na Grúise</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>Lari na Grúise</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>Cedi Ghána</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>Punt Ghiobráltair</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>Dalasi Gaimbia</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Franc Guine</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>Syli Guine</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Ekwele Guineana na Guine Meánchriosaí</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Drachma Gréagach</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Quetzal Guatamala</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>Escudo na Guine Portaingéalaí</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Peso Guine-Bhissau</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>Dollar na Guáine</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>Dollar Hong Cong</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>Lempira Hondúrais</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>Dínear na Cróite</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Kuna Crótach</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>Gourde Háití</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Forint Ungárach</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>Rupiah Indinéiseach</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>Punt Éireannach</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>Punt Iosraelach</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Sheqel Nua Iosraelach</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Rúipí India</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>Dínear Irácach</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>Rial Iaránach</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>Krona Ãoslannach</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>Lira Iodálach</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>Dollar Iamácach</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>Dínear Iordánach</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>Yen Seapánach</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>Scilling Céiniach</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>Som na Cirgeastáine</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>Riel na Cambóide</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>Franc Chomóra</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>Won na Cóiré Thuaidh</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Won na Cóiré Theas</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>Dínear Cuátach</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>Dollar Oileáin Cayman</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Tenge Casacstánach</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>Kip Laosach</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>Punt na Liobáine</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>Rúipí Srí Lanca</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>Dollar na Libéire</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Loti Leosóta</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LTL">
+ <displayName>Lita Liotuánach</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Talonas Liotuánach</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Franc Lucsamburg</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Lats Laitviach</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>Rúbal Laitviach</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>Dínear Libia</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>Dirham Mharacó</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>Franc Mharacó</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>Leu Moldóvach</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>Ariary Madagascar</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Franc Madagascar</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>Denar na Macadóine</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>Franc Mhailí</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Kyat Mhaenmar</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>Tugrik Mongólach</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Pataca Macao</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Ouguiya na Maratáine</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>Lira Maltach</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>Punt Maltach</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>Rúipí Oileán Mhuirís</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>Maldive Islands Rufiyaa</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Kwacha na Maláive</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>Peso Meicsiceo</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>Peso Airgid Meicsiceo (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>Unidad de Inversion (UDI) Meicsiceo</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Ringgit Malaeisia</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>Escudo Mósaimbíce</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Metical Mósaimbíce</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>Dollar na Namaibe</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>Naira Nígéarach</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>Cordoba Nicearagua</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>Cordoba Oro Nicearagua</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Guilder Ãsiltíreach</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Krone Ioruach</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>Rúipí Neipeáil</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>Dollar na Nua-Shéalainne</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>Rial Omain</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>Balboa Panamach</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>Inti Pheiriú</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>Sol Nuevo Pheiriú</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>Sol Pheiriú</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Kina Nua-Ghuine Phapua</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>Peso Filipíneach</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>Rúipí na Pacastáine</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>Zloty Polannach</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Zloty Polannach (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Escudo Portaingélach</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>Guarani Pharagua</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>Rial Catarach</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="ROL">
+ <displayName>Leu Rómánach</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>Rúbal Rúiseach</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Rúbal Rúiseach (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>Franc Ruanda</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>Riyal Sádach</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>Dollar Oileáin Solomon</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>Rúipí na Séiséil</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>Dínear na Súdáine</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>Punt na Súdáine</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>Krona Sualannach</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>Dollar Singeapóir</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>Punt San Héilin</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Tolar Slóvénach</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Koruna na Slóvaice</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>Leone Shiarra Leon</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>Scilling na Sómáile</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRG">
+ <displayName>Guilder Shuranaim</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>Dobra Sao Tome agus Principe</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>Rúbal Sóvéadach</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>Colon na Salvadóire</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>Punt Siria</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>Lilangeni na Suasalainne</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>Baht na Téalainne</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>Rúbal na Táidsíceastáine</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Somoni na Táidsíceastáine</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Manat na An Tuircméanastáine</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>Dínear na Túinéise</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>Paʻanga Tonga</displayName>
+ <symbol>T$</symbol>
+ </currency>
+ <currency type="TPE">
+ <displayName>Escudo Tíomóir</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Lira Turcach</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TTD">
+ <displayName>Dollar Oileáin na Tríonóide agus Tobága</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>Dollar Nua na Téaváine</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>Scilling na Tansáine</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>Hryvnia Úcránach</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Karbovanetz Úcránach</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Scilling Uganda (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Scilling Uganda</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>Dollar S.A.M.</displayName>
+ </currency>
+ <currency type="USN">
+ <displayName>Dollar S.A.M. (an chéad lá eile)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>Dollar S.A.M. (an la céanna)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>Peso Uragua (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>Peso Uruguayo Uragua</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>Sum na hÚisbéiceastáine</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Bolivar Veiniséala</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>Dong Vítneamach</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>Vatu Vanuatú</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>Tala Samó Thiar</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>CFA Franc BEAC</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>Ór</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>Aonad Ilchodach Eorpach</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>Aonad Airgeadaíochta Eorpach</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>Aonad Cuntais Eorpach (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>Aonad Cuntais Eorpach (XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>Dollar Oirthear na Cairibe</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>Cearta Speisialta Tarraingthe</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>Aonad Airgeadra Eorpach</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>Franc Ór Francach</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>UIC-Franc Francach</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>CFA Franc BCEAO</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>CFP Franc</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="YDD">
+ <displayName>Dínear Éimin</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Rial Éimin</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>Dínear Crua Iúgslavach</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>Noviy Dinar Iúgslavach</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>Dínear Inathraithe Iúgslavach</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>Rand na hAfraice Theas (airgeadúil)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Rand na hAfraice Theas</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Kwacha Saimbiach</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Zaire Nua Sáíreach</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Zaire Sáíreach</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Dollar Siombábach</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ga_IE.xml b/libs/Zend/Locale/Data/ga_IE.xml
new file mode 100755
index 0000000000..5d78714c60
--- /dev/null
+++ b/libs/Zend/Locale/Data/ga_IE.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="ga"/>
+ <territory type="IE"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="GBP">
+ <symbol draft="provisional">UK£</symbol>
+ </currency>
+ <currency type="IEP">
+ <symbol>£</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/gaa.xml b/libs/Zend/Locale/Data/gaa.xml
new file mode 100755
index 0000000000..ee454e3b48
--- /dev/null
+++ b/libs/Zend/Locale/Data/gaa.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.13 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="gaa"/>
+ </identity>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[a-z]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">'</quotationStart>
+ <quotationEnd draft="unconfirmed">'</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">&quot;</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">&quot;</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Aha</month>
+ <month type="2" draft="unconfirmed">Ofl</month>
+ <month type="3" draft="unconfirmed">Och</month>
+ <month type="4" draft="unconfirmed">Abe</month>
+ <month type="5" draft="unconfirmed">Agb</month>
+ <month type="6" draft="unconfirmed">Otu</month>
+ <month type="7" draft="unconfirmed">Maa</month>
+ <month type="8" draft="unconfirmed">Man</month>
+ <month type="9" draft="unconfirmed">Gbo</month>
+ <month type="10" draft="unconfirmed">Ant</month>
+ <month type="11" draft="unconfirmed">Ale</month>
+ <month type="12" draft="unconfirmed">Afu</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Aharabata</month>
+ <month type="2" draft="unconfirmed">Oflo</month>
+ <month type="3" draft="unconfirmed">Ochokrikri</month>
+ <month type="4" draft="unconfirmed">Abeibee</month>
+ <month type="5" draft="unconfirmed">Agbeinaa</month>
+ <month type="6" draft="unconfirmed">Otukwadan</month>
+ <month type="7" draft="unconfirmed">Maawe</month>
+ <month type="8" draft="unconfirmed">Manyawale</month>
+ <month type="9" draft="unconfirmed">Gbo</month>
+ <month type="10" draft="unconfirmed">Anton</month>
+ <month type="11" draft="unconfirmed">Alemle</month>
+ <month type="12" draft="unconfirmed">Afuabee</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Ho</day>
+ <day type="mon" draft="unconfirmed">Dzu</day>
+ <day type="tue" draft="unconfirmed">Dzf</day>
+ <day type="wed" draft="unconfirmed">Sho</day>
+ <day type="thu" draft="unconfirmed">Soo</day>
+ <day type="fri" draft="unconfirmed">Soh</day>
+ <day type="sat" draft="unconfirmed">Ho</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Hogbaa</day>
+ <day type="mon" draft="unconfirmed">Dzu</day>
+ <day type="tue" draft="unconfirmed">Dzufo</day>
+ <day type="wed" draft="unconfirmed">Sho</day>
+ <day type="thu" draft="unconfirmed">Soo</day>
+ <day type="fri" draft="unconfirmed">Sohaa</day>
+ <day type="sat" draft="unconfirmed">Ho</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">LB</am>
+ <pm draft="unconfirmed">SN</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">Dani Jesu</era>
+ <era type="1" draft="unconfirmed">KJ</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">DJ</era>
+ <era type="1" draft="unconfirmed">KJ</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="GHC">
+ <displayName draft="unconfirmed">Sidi</displayName>
+ <symbol draft="unconfirmed">¢</symbol>
+ <symbol alt="variant" draft="unconfirmed">₵</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/gaa_GH.xml b/libs/Zend/Locale/Data/gaa_GH.xml
new file mode 100755
index 0000000000..c9b789e8ff
--- /dev/null
+++ b/libs/Zend/Locale/Data/gaa_GH.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="gaa"/>
+ <territory type="GH"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/gez.xml b/libs/Zend/Locale/Data/gez.xml
new file mode 100755
index 0000000000..e21c5fc451
--- /dev/null
+++ b/libs/Zend/Locale/Data/gez.xml
@@ -0,0 +1,425 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.40 $"/>
+ <generation date="$Date: 2006/06/27 23:37:13 $"/>
+ <language type="gez"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa" draft="unconfirmed">አá‹áˆ­áŠ›</language>
+ <language type="ab" draft="unconfirmed">አብáˆá‹šáŠ›</language>
+ <language type="af" draft="unconfirmed">አáሪቃንስኛ</language>
+ <language type="am" draft="unconfirmed">አáˆáˆáˆ¨áŠ›</language>
+ <language type="ar" draft="unconfirmed">á‹áˆ­á‰¢áŠ›</language>
+ <language type="as" draft="unconfirmed">አሳሜዛዊ</language>
+ <language type="ay" draft="unconfirmed">አያማርኛ</language>
+ <language type="az" draft="unconfirmed">አዜርባይጃንኛ</language>
+ <language type="ba" draft="unconfirmed">ባስኪርኛ</language>
+ <language type="be" draft="unconfirmed">ቤላራሻኛ</language>
+ <language type="bg" draft="unconfirmed">ቡáˆáŒ‹áˆªáŠ›</language>
+ <language type="bh" draft="unconfirmed">ቢሃሪ</language>
+ <language type="bi" draft="unconfirmed">ቢስላáˆáŠ›</language>
+ <language type="bn" draft="unconfirmed">በንጋሊኛ</language>
+ <language type="bo" draft="unconfirmed">ትበትንኛ</language>
+ <language type="br" draft="unconfirmed">ብሬቶንኛ</language>
+ <language type="byn" draft="unconfirmed">ብሊን</language>
+ <language type="ca" draft="unconfirmed">ካታላንኛ</language>
+ <language type="co" draft="unconfirmed">ኮርሲካኛ</language>
+ <language type="cs" draft="unconfirmed">ቼክኛ</language>
+ <language type="cy" draft="unconfirmed">ወáˆáˆ½</language>
+ <language type="da" draft="unconfirmed">ዴኒሽ</language>
+ <language type="de" draft="unconfirmed">ጀርመን</language>
+ <language type="dz" draft="unconfirmed">ድዞንáŒáŠ»áŠ›</language>
+ <language type="el" draft="unconfirmed">áŒáˆªáŠ­áŠ›</language>
+ <language type="en" draft="unconfirmed">እንáŒáˆŠá‹áŠ›</language>
+ <language type="eo" draft="unconfirmed">ኤስáራንቶ</language>
+ <language type="es" draft="unconfirmed">ስá“ኒሽ</language>
+ <language type="et" draft="unconfirmed">ኤስቶኒአን</language>
+ <language type="eu" draft="unconfirmed">ባስክኛ</language>
+ <language type="fa" draft="unconfirmed">áርሲያኛ</language>
+ <language type="fi" draft="unconfirmed">áŠáŠ’ሽ</language>
+ <language type="fj" draft="unconfirmed">áŠáŒ‚ኛ</language>
+ <language type="fo" draft="unconfirmed">á‹áˆ®áŠ›</language>
+ <language type="fr" draft="unconfirmed">áˆáˆ¨áŠ•áˆ³á‹­áŠ›</language>
+ <language type="fy" draft="unconfirmed">áሪስኛ</language>
+ <language type="ga" draft="unconfirmed">አይሪሽ</language>
+ <language type="gd" draft="unconfirmed">እስኮትስá¡áŒŒáˆáŠ­áŠ›</language>
+ <language type="gez" draft="unconfirmed">áŒá‹•á‹áŠ›</language>
+ <language type="gl" draft="unconfirmed">ጋለጋኛ</language>
+ <language type="gn" draft="unconfirmed">ጓራኒኛ</language>
+ <language type="gu" draft="unconfirmed">ጉጃርቲኛ</language>
+ <language type="ha" draft="unconfirmed">ሃá‹áˆ³áŠ›</language>
+ <language type="he" draft="unconfirmed">ዕብራስጥ</language>
+ <language type="hi" draft="unconfirmed">áˆáŠ•á‹µáŠ›</language>
+ <language type="hr" draft="unconfirmed">ክሮሽያንኛ</language>
+ <language type="hu" draft="unconfirmed">ሀንጋሪኛ</language>
+ <language type="hy" draft="unconfirmed">አርመናዊ</language>
+ <language type="ia" draft="unconfirmed">ኢንቴርሊንጓ</language>
+ <language type="id" draft="unconfirmed">እንዶኒሲኛ</language>
+ <language type="ie" draft="unconfirmed">እንተርሊንáŒá‹ˆ</language>
+ <language type="ik" draft="unconfirmed">እኑá’ያቅኛ</language>
+ <language type="is" draft="unconfirmed">አይስላንድኛ</language>
+ <language type="it" draft="unconfirmed">ጣሊያንኛ</language>
+ <language type="iu" draft="unconfirmed">እኑክቲቱትኛ</language>
+ <language type="ja" draft="unconfirmed">ጃá“ንኛ</language>
+ <language type="jv" draft="unconfirmed">ጃቫንኛ</language>
+ <language type="ka" draft="unconfirmed">ጊዮርጊያን</language>
+ <language type="kk" draft="unconfirmed">ካዛክኛ</language>
+ <language type="kl" draft="unconfirmed">ካላሊሱትኛ</language>
+ <language type="km" draft="unconfirmed">ክመርኛ</language>
+ <language type="kn" draft="unconfirmed">ካናዳኛ</language>
+ <language type="ko" draft="unconfirmed">ኮሪያኛ</language>
+ <language type="ks" draft="unconfirmed">ካሽሚርኛ</language>
+ <language type="ku" draft="unconfirmed">ኩርድሽኛ</language>
+ <language type="ky" draft="unconfirmed">ኪርጊá‹áŠ›</language>
+ <language type="la" draft="unconfirmed">ላቲንኛ</language>
+ <language type="ln" draft="unconfirmed">ሊንጋላኛ</language>
+ <language type="lo" draft="unconfirmed">ላá‹áˆµáŠ›</language>
+ <language type="lt" draft="unconfirmed">ሊቱአኒያን</language>
+ <language type="lv" draft="unconfirmed">ላትቪያን</language>
+ <language type="mg" draft="unconfirmed">ማላጋስኛ</language>
+ <language type="mi" draft="unconfirmed">ማዮሪኛ</language>
+ <language type="mk" draft="unconfirmed">ማከዶኒኛ</language>
+ <language type="ml" draft="unconfirmed">ማላያላáˆáŠ›</language>
+ <language type="mn" draft="unconfirmed">ሞንጎላዊኛ</language>
+ <language type="mo" draft="unconfirmed">ሞáˆá‹³á‰«á‹ŠáŠ“</language>
+ <language type="mr" draft="unconfirmed">ማራዚኛ</language>
+ <language type="ms" draft="unconfirmed">ማላይኛ</language>
+ <language type="mt" draft="unconfirmed">ማáˆá‰²áˆµáŠ›</language>
+ <language type="my" draft="unconfirmed">ቡርማኛ</language>
+ <language type="na" draft="unconfirmed">ናኡሩ</language>
+ <language type="ne" draft="unconfirmed">ኔá“ሊኛ</language>
+ <language type="nl" draft="unconfirmed">ደች</language>
+ <language type="no" draft="unconfirmed">ኖርዌጂያን</language>
+ <language type="oc" draft="unconfirmed">ኦኪታንኛ</language>
+ <language type="om" draft="unconfirmed">ኦሮáˆáŠ›</language>
+ <language type="or" draft="unconfirmed">ኦሪያኛ</language>
+ <language type="pa" draft="unconfirmed">á“ንጃቢኛ</language>
+ <language type="pl" draft="unconfirmed">á–ሊሽ</language>
+ <language type="ps" draft="unconfirmed">á‘ሽቶኛ</language>
+ <language type="pt" draft="unconfirmed">á–ርቱጋሊኛ</language>
+ <language type="qu" draft="unconfirmed">ኵቿኛ</language>
+ <language type="rm" draft="unconfirmed">ሮማንስ</language>
+ <language type="rn" draft="unconfirmed">ሩንዲኛ</language>
+ <language type="ro" draft="unconfirmed">ሮማኒያን</language>
+ <language type="ru" draft="unconfirmed">ራሽኛ</language>
+ <language type="rw" draft="unconfirmed">ኪንያርዋንድኛ</language>
+ <language type="sa" draft="unconfirmed">ሳንስክሪትኛ</language>
+ <language type="sd" draft="unconfirmed">ሲንድሂኛ</language>
+ <language type="sg" draft="unconfirmed">ሳንጎኛ</language>
+ <language type="si" draft="unconfirmed">ስንሃáˆáŠ›</language>
+ <language type="sid" draft="unconfirmed">ሲዳáˆáŠ›</language>
+ <language type="sk" draft="unconfirmed">ስሎቫክኛ</language>
+ <language type="sl" draft="unconfirmed">ስሎቪኛ</language>
+ <language type="sm" draft="unconfirmed">ሳሞአኛ</language>
+ <language type="sn" draft="unconfirmed">ሾናኛ</language>
+ <language type="so" draft="unconfirmed">ሱማáˆáŠ›</language>
+ <language type="sq" draft="unconfirmed">áˆá‰¤áŠ’ኛ</language>
+ <language type="sr" draft="unconfirmed">ሰርቢኛ</language>
+ <language type="ss" draft="unconfirmed">ስዋቲኛ</language>
+ <language type="st" draft="unconfirmed">ሶዞኛ</language>
+ <language type="su" draft="unconfirmed">ሱዳንኛ</language>
+ <language type="sv" draft="unconfirmed">ስዊድንኛ</language>
+ <language type="sw" draft="unconfirmed">ስዋሂሊኛ</language>
+ <language type="ta" draft="unconfirmed">ታሚáˆáŠ›</language>
+ <language type="te" draft="unconfirmed">ተሉጉኛ</language>
+ <language type="tg" draft="unconfirmed">ታጂኪኛ</language>
+ <language type="th" draft="unconfirmed">ታይኛ</language>
+ <language type="ti" draft="unconfirmed">ትáŒáˆ­áŠ›</language>
+ <language type="tig" draft="unconfirmed">ትáŒáˆ¨</language>
+ <language type="tk" draft="unconfirmed">ቱርክመንኛ</language>
+ <language type="tl" draft="unconfirmed">ታጋሎገኛ</language>
+ <language type="tn" draft="unconfirmed">ጽዋናዊኛ</language>
+ <language type="to" draft="unconfirmed">ቶንጋ</language>
+ <language type="tr" draft="unconfirmed">ቱርክኛ</language>
+ <language type="ts" draft="unconfirmed">ጾንጋኛ</language>
+ <language type="tt" draft="unconfirmed">ታታርኛ</language>
+ <language type="tw" draft="unconfirmed">ትዊኛ</language>
+ <language type="ug" draft="unconfirmed">ኡዊáŒáˆáˆ­áŠ›</language>
+ <language type="uk" draft="unconfirmed">ዩክረኒኛ</language>
+ <language type="ur" draft="unconfirmed">ኡርዱኛ</language>
+ <language type="uz" draft="unconfirmed">ኡá‹á‰ áŠ­áŠ›</language>
+ <language type="vi" draft="unconfirmed">ቪትናáˆáŠ›</language>
+ <language type="vo" draft="unconfirmed">ቮላá‘ክኛ</language>
+ <language type="wo" draft="unconfirmed">ዎሎáኛ</language>
+ <language type="xh" draft="unconfirmed">ዞሳኛ</language>
+ <language type="yi" draft="unconfirmed">ይዲሻዊኛ</language>
+ <language type="yo" draft="unconfirmed">ዮሩባዊኛ</language>
+ <language type="za" draft="unconfirmed">ዡዋንáŒáŠ›</language>
+ <language type="zh" draft="unconfirmed">ቻይንኛ</language>
+ <language type="zu" draft="unconfirmed">ዙሉኛ</language>
+ </languages>
+ <scripts>
+ <script type="Latn" draft="unconfirmed">ላቲን</script>
+ </scripts>
+ <territories>
+ <territory type="AD" draft="unconfirmed">አንዶራ</territory>
+ <territory type="AE" draft="unconfirmed">የተባበሩትá¡áŠ áˆ¨á‰¥á¡áŠ¤áˆáˆ¬á‰µáˆµ</territory>
+ <territory type="AL" draft="unconfirmed">አáˆá‰£áŠ’á‹«</territory>
+ <territory type="AM" draft="unconfirmed">አርሜኒያ</territory>
+ <territory type="AN" draft="unconfirmed">ኔዘርላንድስá¡áŠ áŠ•á‰²áˆáˆµ</territory>
+ <territory type="AR" draft="unconfirmed">አርጀንቲና</territory>
+ <territory type="AT" draft="unconfirmed">ኦስትሪያ</territory>
+ <territory type="AU" draft="unconfirmed">አá‹áˆµá‰µáˆ¬áˆŠá‹«</territory>
+ <territory type="AZ" draft="unconfirmed">አዘርባጃን</territory>
+ <territory type="BA" draft="unconfirmed">ቦስኒያá¡áŠ¥áŠ“á¡áˆ„ርዞጎቪኒያ</territory>
+ <territory type="BB" draft="unconfirmed">ባርቤዶስ</territory>
+ <territory type="BE" draft="unconfirmed">ቤáˆáŒ„áˆ</territory>
+ <territory type="BG" draft="unconfirmed">ቡáˆáŒŒáˆªá‹«</territory>
+ <territory type="BH" draft="unconfirmed">ባህሬን</territory>
+ <territory type="BM" draft="unconfirmed">ቤርሙዳ</territory>
+ <territory type="BO" draft="unconfirmed">ቦሊቪያ</territory>
+ <territory type="BR" draft="unconfirmed">ብራዚáˆ</territory>
+ <territory type="BT" draft="unconfirmed">ቡህታን</territory>
+ <territory type="BY" draft="unconfirmed">ቤላሩስ</territory>
+ <territory type="BZ" draft="unconfirmed">ቤሊዘ</territory>
+ <territory type="CF" draft="unconfirmed">የመካከለኛá‹á¡áŠ áሪካá¡áˆªáብሊክ</territory>
+ <territory type="CH" draft="unconfirmed">ስዊዘርላንድ</territory>
+ <territory type="CL" draft="unconfirmed">ቺሊ</territory>
+ <territory type="CM" draft="unconfirmed">ካሜሩን</territory>
+ <territory type="CN" draft="unconfirmed">ቻይና</territory>
+ <territory type="CO" draft="unconfirmed">ኮሎáˆá‰¢á‹«</territory>
+ <territory type="CS" draft="unconfirmed">ሰርቢያ</territory>
+ <territory type="CV" draft="unconfirmed">ኬá•á¡á‰¬áˆ­á‹´</territory>
+ <territory type="CY" draft="unconfirmed">ሳይá•áˆ¨áˆµ</territory>
+ <territory type="CZ" draft="unconfirmed">ቼክá¡áˆªá‘ብሊክ</territory>
+ <territory type="DE" draft="unconfirmed">ጀርመን</territory>
+ <territory type="DK" draft="unconfirmed">ዴንማርክ</territory>
+ <territory type="DM" draft="unconfirmed">ዶሚኒካ</territory>
+ <territory type="DO" draft="unconfirmed">ዶሚኒክá¡áˆªá‘ብሊክ</territory>
+ <territory type="DZ" draft="unconfirmed">አáˆáŒ„ሪያ</territory>
+ <territory type="EC" draft="unconfirmed">ኢኳዶር</territory>
+ <territory type="EE" draft="unconfirmed">ኤስቶኒያ</territory>
+ <territory type="EG" draft="unconfirmed">áŒá‰¥áŒ½</territory>
+ <territory type="EH" draft="unconfirmed">áˆá‹•áˆ«á‰£á‹Šá¡áˆ³áˆ…ራ</territory>
+ <territory type="ER" draft="unconfirmed">ኤርትራ</territory>
+ <territory type="ES" draft="unconfirmed">ስá”ን</territory>
+ <territory type="ET" draft="unconfirmed">ኢትዮጵያ</territory>
+ <territory type="FI" draft="unconfirmed">áŠáŠ•áˆ‹áŠ•á‹µ</territory>
+ <territory type="FJ" draft="unconfirmed">áŠáŒ‚</territory>
+ <territory type="FM" draft="unconfirmed">ሚክሮኔዢያ</territory>
+ <territory type="FR" draft="unconfirmed">áˆáˆ¨áŠ•áˆ³á‹­</territory>
+ <territory type="GB" draft="unconfirmed">እንáŒáˆŠá‹</territory>
+ <territory type="GE" draft="unconfirmed">ጆርጂያ</territory>
+ <territory type="GF" draft="unconfirmed">የáˆáˆ¨áŠ•áˆ³á‹­á¡áŒ‰á‹ŠáŠ áŠ“</territory>
+ <territory type="GM" draft="unconfirmed">ጋáˆá‰¢á‹«</territory>
+ <territory type="GN" draft="unconfirmed">ጊኒ</territory>
+ <territory type="GQ" draft="unconfirmed">ኢኳቶሪያáˆá¡áŒŠáŠ’</territory>
+ <territory type="GR" draft="unconfirmed">áŒáˆªáŠ­</territory>
+ <territory type="GW" draft="unconfirmed">ቢሳዎ</territory>
+ <territory type="GY" draft="unconfirmed">ጉያና</territory>
+ <territory type="HK" draft="unconfirmed">ሆንáŒá¡áŠ®áŠ•áŒ</territory>
+ <territory type="HR" draft="unconfirmed">ክሮኤሽያ</territory>
+ <territory type="HT" draft="unconfirmed">ሀይቲ</territory>
+ <territory type="HU" draft="unconfirmed">ሀንጋሪ</territory>
+ <territory type="ID" draft="unconfirmed">ኢንዶኔዢያ</territory>
+ <territory type="IE" draft="unconfirmed">አየርላንድ</territory>
+ <territory type="IL" draft="unconfirmed">እስራኤáˆ</territory>
+ <territory type="IN" draft="unconfirmed">ህንድ</territory>
+ <territory type="IQ" draft="unconfirmed">ኢራቅ</territory>
+ <territory type="IS" draft="unconfirmed">አይስላንድ</territory>
+ <territory type="IT" draft="unconfirmed">ጣሊያን</territory>
+ <territory type="JM" draft="unconfirmed">ጃማይካ</territory>
+ <territory type="JO" draft="unconfirmed">ጆርዳን</territory>
+ <territory type="JP" draft="unconfirmed">ጃá“ን</territory>
+ <territory type="KH" draft="unconfirmed">ካáˆá‰¦á‹²á‹«</territory>
+ <territory type="KM" draft="unconfirmed">ኮሞሮስ</territory>
+ <territory type="KP" draft="unconfirmed">ደቡብá¡áŠ®áˆªá‹«</territory>
+ <territory type="KR" draft="unconfirmed">ሰሜንá¡áŠ®áˆªá‹«</territory>
+ <territory type="KW" draft="unconfirmed">ክዌት</territory>
+ <territory type="LB" draft="unconfirmed">ሊባኖስ</territory>
+ <territory type="LT" draft="unconfirmed">ሊቱዌኒያ</territory>
+ <territory type="LV" draft="unconfirmed">ላትቪያ</territory>
+ <territory type="LY" draft="unconfirmed">ሊቢያ</territory>
+ <territory type="MA" draft="unconfirmed">ሞሮኮ</territory>
+ <territory type="MD" draft="unconfirmed">ሞáˆá‹¶á‰«</territory>
+ <territory type="MK" draft="unconfirmed">ማከዶኒያ</territory>
+ <territory type="MN" draft="unconfirmed">ሞንጎሊያ</territory>
+ <territory type="MO" draft="unconfirmed">ማካዎ</territory>
+ <territory type="MR" draft="unconfirmed">ሞሪቴኒያ</territory>
+ <territory type="MT" draft="unconfirmed">ማáˆá‰³</territory>
+ <territory type="MU" draft="unconfirmed">ማሩሸስ</territory>
+ <territory type="MX" draft="unconfirmed">ሜክሲኮ</territory>
+ <territory type="MY" draft="unconfirmed">ማሌዢያ</territory>
+ <territory type="NA" draft="unconfirmed">ናሚቢያ</territory>
+ <territory type="NC" draft="unconfirmed">ኒá‹á¡áŠ«áˆŒá‹¶áŠ’á‹«</territory>
+ <territory type="NG" draft="unconfirmed">ናይጄሪያ</territory>
+ <territory type="NL" draft="unconfirmed">ኔዘርላንድ</territory>
+ <territory type="NO" draft="unconfirmed">ኖርዌ</territory>
+ <territory type="NP" draft="unconfirmed">ኔá“áˆ</territory>
+ <territory type="NZ" draft="unconfirmed">ኒá‹á¡á‹šáˆ‹áŠ•á‹µ</territory>
+ <territory type="PE" draft="unconfirmed">á”ሩ</territory>
+ <territory type="PF" draft="unconfirmed">የáˆáˆ¨áŠ•áˆ³á‹­á¡á–ሊኔዢያ</territory>
+ <territory type="PG" draft="unconfirmed">á“á‘á‹‹á¡áŠ’á‹á¡áŒŠáŠ’</territory>
+ <territory type="PL" draft="unconfirmed">á–ላንድ</territory>
+ <territory type="PR" draft="unconfirmed">á–ርታá¡áˆªáŠ®</territory>
+ <territory type="RO" draft="unconfirmed">ሮሜኒያ</territory>
+ <territory type="RU" draft="unconfirmed">ራሺያ</territory>
+ <territory type="SA" draft="unconfirmed">ሳá‹á‹µáŠ áˆ¨á‰¢á‹«</territory>
+ <territory type="SD" draft="unconfirmed">ሱዳን</territory>
+ <territory type="SE" draft="unconfirmed">ስዊድን</territory>
+ <territory type="SG" draft="unconfirmed">ሲንጋá–ር</territory>
+ <territory type="SI" draft="unconfirmed">ስሎቬኒያ</territory>
+ <territory type="SK" draft="unconfirmed">ስሎቫኪያ</territory>
+ <territory type="SN" draft="unconfirmed">ሴኔጋáˆ</territory>
+ <territory type="SO" draft="unconfirmed">ሱማሌ</territory>
+ <territory type="SY" draft="unconfirmed">ሲሪያ</territory>
+ <territory type="TD" draft="unconfirmed">ቻድ</territory>
+ <territory type="TF" draft="unconfirmed">የáˆáˆ¨áŠ•áˆ³á‹­á¡á‹°á‰¡á‰£á‹Šá¡áŒá‹›á‰¶á‰½</territory>
+ <territory type="TH" draft="unconfirmed">ታይላንድ</territory>
+ <territory type="TJ" draft="unconfirmed">ታጃኪስታን</territory>
+ <territory type="TL" draft="unconfirmed">áˆáˆµáˆ«á‰…á¡á‰²áˆžáˆ­</territory>
+ <territory type="TN" draft="unconfirmed">ቱኒዚያ</territory>
+ <territory type="TR" draft="unconfirmed">ቱርክ</territory>
+ <territory type="TT" draft="unconfirmed">ትሪኒዳድá¡áŠ¥áŠ“á¡á‰¶á‰£áŒŽ</territory>
+ <territory type="TZ" draft="unconfirmed">ታንዛኒያ</territory>
+ <territory type="UG" draft="unconfirmed">ዩጋንዳ</territory>
+ <territory type="US" draft="unconfirmed">አሜሪካ</territory>
+ <territory type="UZ" draft="unconfirmed">á‹©á‹á‰ áŠªáˆµá‰³áŠ•</territory>
+ <territory type="VE" draft="unconfirmed">ቬንዙዌላ</territory>
+ <territory type="VG" draft="unconfirmed">የእንáŒáˆŠá‹á¡á‹µáŠ•áŒáˆá¡á‹°áˆ´á‰¶á‰½</territory>
+ <territory type="VI" draft="unconfirmed">የአሜሪካá¡á‰¨áˆ­áŒ‚ንá¡á‹°áˆ´á‰¶á‰½</territory>
+ <territory type="YE" draft="unconfirmed">የመን</territory>
+ <territory type="ZA" draft="unconfirmed">ደቡብá¡áŠ áሪካ</territory>
+ <territory type="ZM" draft="unconfirmed">á‹›áˆá‰¢á‹«</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[០áŽ-᎙ ሀ-ሆ ለ-ሎ áˆ-ሖ መ-ሞ ሠ-ሦ ረ-ሮ ሰ-ሶ ቀ-ቆ ቈ ቊ-በበ-ቦ ተ-ቶ ኀ-ኆ ኈ ኊ-አáŠ-ኖ አ-ኦ ከ-ኮ ኰ ኲ-ኵ ወ-á‹Ž á‹-á‹– ዘ-á‹ž የ-á‹® á‹°-ዶ ገ-ጎ ጠጒ-ጕ ጠ-ጦ ጰ-ጶ ጸ-ጾ á€-ᆠáˆ-Ꭰá-á–]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" draft="unconfirmed">[ሇ ሠⶀ ሗ ሟ ᎀ-ᎃ ⶠሧ ሯ ⶂ ሷ ⶃ ሸ-ሿ ⶄ ቇ á‰-ቖ ቘ ቚ-በቧ ᎄ-ᎇ ⶅ ቮ ቯ ቷ ⶆ ቿ ⶇ ኇ ኗ ⶈ ኟ ⶉ ኧ ⶊ ኯ ኸ-ኾ á‹€ á‹‚-á‹… á‹ á‹Ÿ ⶋ á‹ -ዧ á‹· ⶌ ዸ-á‹¿ ⶠጀ-ጇ ⶎ ጠጘ-ጟ ⶓ-ⶖ ጧ ⶠጨ-ጯ ⶠጷ ⶑ ጿ ᇠá ᎈ-ᎋ ᗠᎌ-Ꭰⶒ á˜-ᚠⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ â·€-â·† â·ˆ-â·Ž â·-â·– â·˜-â·ž]</exemplarCharacters>
+ <exemplarCharacters alt="proposed-u121-1" draft="unconfirmed">[០ᡠá£-á§ á¢ á  á¨ áŽ-᎙ á²-á¼ á©-ᱠሀ-ሆ ለ-ሎ áˆ-ሖ መ-ሞ ሠ-ሦ ረ-ሮ ሰ-ሶ ቀ-ቆ ቈ ቊ-በበ-ቦ ተ-ቶ ኀ-ኆ ኈ ኊ-አáŠ-ኖ አ-ኦ ከ-ኮ ኰ ኲ-ኵ ወ-á‹Ž á‹-á‹– ዘ-á‹ž የ-á‹® á‹°-ዶ ገ-ጎ ጠጒ-ጕ ጠ-ጦ ጰ-ጶ ጸ-ጾ á€-ᆠáˆ-Ꭰá-á–]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">ጠáˆáˆ¨</month>
+ <month type="2" draft="unconfirmed">ከተተ</month>
+ <month type="3" draft="unconfirmed">መገበ</month>
+ <month type="4" draft="unconfirmed">አኀዘ</month>
+ <month type="5" draft="unconfirmed">áŒáŠ•á‰£</month>
+ <month type="6" draft="unconfirmed">ሠንየ</month>
+ <month type="7" draft="unconfirmed">áˆáˆ˜áˆˆ</month>
+ <month type="8" draft="unconfirmed">áŠáˆáˆ°</month>
+ <month type="9" draft="unconfirmed">ከረመ</month>
+ <month type="10" draft="unconfirmed">ጠቀመ</month>
+ <month type="11" draft="unconfirmed">ኀደረ</month>
+ <month type="12" draft="unconfirmed">ኀሠሠ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">ጠáˆáˆ¨</month>
+ <month type="2" draft="unconfirmed">ከተተ</month>
+ <month type="3" draft="unconfirmed">መገበ</month>
+ <month type="4" draft="unconfirmed">አኀዘ</month>
+ <month type="5" draft="unconfirmed">áŒáŠ•á‰£á‰µ</month>
+ <month type="6" draft="unconfirmed">ሠንየ</month>
+ <month type="7" draft="unconfirmed">áˆáˆ˜áˆˆ</month>
+ <month type="8" draft="unconfirmed">áŠáˆáˆ°</month>
+ <month type="9" draft="unconfirmed">ከረመ</month>
+ <month type="10" draft="unconfirmed">ጠቀመ</month>
+ <month type="11" draft="unconfirmed">ኀደረ</month>
+ <month type="12" draft="unconfirmed">ኀሠሠ</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">ጠ</month>
+ <month type="2" draft="unconfirmed">ከ</month>
+ <month type="3" draft="unconfirmed">መ</month>
+ <month type="4" draft="unconfirmed">አ</month>
+ <month type="5" draft="unconfirmed">áŒ</month>
+ <month type="6" draft="unconfirmed">ሠ</month>
+ <month type="7" draft="unconfirmed">áˆ</month>
+ <month type="8" draft="unconfirmed">áŠ</month>
+ <month type="9" draft="unconfirmed">ከ</month>
+ <month type="10" draft="unconfirmed">ጠ</month>
+ <month type="11" draft="unconfirmed">ኀ</month>
+ <month type="12" draft="unconfirmed">ኀ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">እáŠá‹µ</day>
+ <day type="mon" draft="unconfirmed">ሰኑይ</day>
+ <day type="tue" draft="unconfirmed">ሠሉስ</day>
+ <day type="wed" draft="unconfirmed">ራብዕ</day>
+ <day type="thu" draft="unconfirmed">áˆáˆ™áˆµ</day>
+ <day type="fri" draft="unconfirmed">ዓርበ</day>
+ <day type="sat" draft="unconfirmed">ቀዳሚ</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">እáŠá‹µ</day>
+ <day type="mon" draft="unconfirmed">ሰኑይ</day>
+ <day type="tue" draft="unconfirmed">ሠሉስ</day>
+ <day type="wed" draft="unconfirmed">ራብዕ</day>
+ <day type="thu" draft="unconfirmed">áˆáˆ™áˆµ</day>
+ <day type="fri" draft="unconfirmed">ዓርበ</day>
+ <day type="sat" draft="unconfirmed">ቀዳሚት</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">እ</day>
+ <day type="mon" draft="unconfirmed">ሰ</day>
+ <day type="tue" draft="unconfirmed">ሠ</day>
+ <day type="wed" draft="unconfirmed">ራ</day>
+ <day type="thu" draft="unconfirmed">áˆ</day>
+ <day type="fri" draft="unconfirmed">á‹“</day>
+ <day type="sat" draft="unconfirmed">ቀ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">ጽባሕ</am>
+ <pm draft="unconfirmed">áˆáˆ´á‰µ</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">á‹“/á‹“</era>
+ <era type="1" draft="unconfirmed">á‹“/áˆ</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">የብራዚሠሪáˆ</displayName>
+ <symbol draft="unconfirmed">R$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="unconfirmed">የቻይና ዩአን ረንሚንቢ</displayName>
+ <symbol draft="unconfirmed">Y</symbol>
+ </currency>
+ <currency type="ETB">
+ <displayName draft="unconfirmed">የኢትዮጵያ ብር</displayName>
+ <symbol draft="unconfirmed">$</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="unconfirmed">አá‹áˆ®</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">የእንáŒáˆŠá‹ á“á‹áŠ•á‹µ ስተርሊንáŒ</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">የሕንድ ሩá’</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="unconfirmed">የጃá“ን የን</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">የራሻ ሩብáˆ</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">የአሜሪካን ዶላር</displayName>
+ <symbol draft="unconfirmed">USD</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/gez_ER.xml b/libs/Zend/Locale/Data/gez_ER.xml
new file mode 100755
index 0000000000..4a5aa78b8b
--- /dev/null
+++ b/libs/Zend/Locale/Data/gez_ER.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.31 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="gez"/>
+ <territory type="ER"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEEᥠdd MMMM መዓáˆá‰µ yyyy G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MMM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <group draft="unconfirmed">ወ</group>
+ </symbols>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ERN">
+ <symbol draft="unconfirmed">$</symbol>
+ </currency>
+ <currency type="ETB">
+ <symbol draft="unconfirmed">ETB$</symbol>
+ </currency>
+ <currency type="USD">
+ <symbol draft="unconfirmed">US$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/gez_ET.xml b/libs/Zend/Locale/Data/gez_ET.xml
new file mode 100755
index 0000000000..ae52c965a7
--- /dev/null
+++ b/libs/Zend/Locale/Data/gez_ET.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.30 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="gez"/>
+ <territory type="ET"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEEᥠdd MMMM መዓáˆá‰µ yyyy G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MMM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <group draft="unconfirmed">ወ</group>
+ </symbols>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="USD">
+ <symbol draft="unconfirmed">US$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/gl.xml b/libs/Zend/Locale/Data/gl.xml
new file mode 100755
index 0000000000..07d48d9601
--- /dev/null
+++ b/libs/Zend/Locale/Data/gl.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="gl"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="gl">galego</language>
+ </languages>
+ <territories>
+ <territory type="ES">España</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[a á b-e é f-i í j-n ñ o ó p-u ú ü v-z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Xan</month>
+ <month type="2">Feb</month>
+ <month type="3">Mar</month>
+ <month type="4">Abr</month>
+ <month type="5">Mai</month>
+ <month type="6">Xuñ</month>
+ <month type="7">Xul</month>
+ <month type="8">Ago</month>
+ <month type="9">Set</month>
+ <month type="10">Out</month>
+ <month type="11">Nov</month>
+ <month type="12">Dec</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Xaneiro</month>
+ <month type="2">Febreiro</month>
+ <month type="3">Marzo</month>
+ <month type="4">Abril</month>
+ <month type="5">Maio</month>
+ <month type="6">Xuño</month>
+ <month type="7">Xullo</month>
+ <month type="8">Agosto</month>
+ <month type="9">Setembro</month>
+ <month type="10">Outubro</month>
+ <month type="11">Novembro</month>
+ <month type="12">Decembro</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Dom</day>
+ <day type="mon">Lun</day>
+ <day type="tue">Mar</day>
+ <day type="wed">Mér</day>
+ <day type="thu">Xov</day>
+ <day type="fri">Ven</day>
+ <day type="sat">Sáb</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Domingo</day>
+ <day type="mon">Luns</day>
+ <day type="tue">Martes</day>
+ <day type="wed">Mércores</day>
+ <day type="thu">Xoves</day>
+ <day type="fri">Venres</day>
+ <day type="sat">Sábado</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">T1</quarter>
+ <quarter type="2" draft="unconfirmed">T2</quarter>
+ <quarter type="3" draft="unconfirmed">T3</quarter>
+ <quarter type="4" draft="unconfirmed">T4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">1er trimestre</quarter>
+ <quarter type="2" draft="unconfirmed">2on trimestre</quarter>
+ <quarter type="3" draft="unconfirmed">3er trimestre</quarter>
+ <quarter type="4" draft="unconfirmed">4rt trimestre</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="ESP">
+ <pattern>¤ #,##0;-¤ #,##0</pattern>
+ <symbol>₧</symbol>
+ <decimal>,</decimal>
+ <group>.</group>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/gl_ES.xml b/libs/Zend/Locale/Data/gl_ES.xml
new file mode 100755
index 0000000000..474dd38c03
--- /dev/null
+++ b/libs/Zend/Locale/Data/gl_ES.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.40 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="gl"/>
+ <territory type="ES"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>MMM dd,yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/gu.xml b/libs/Zend/Locale/Data/gu.xml
new file mode 100755
index 0000000000..38cad7d461
--- /dev/null
+++ b/libs/Zend/Locale/Data/gu.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.44 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="gu"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="gu">ગà«àªœàª°àª¾àª¤à«€</language>
+ </languages>
+ <territories>
+ <territory type="CN">ચીન</territory>
+ <territory type="DE">જમિની</territory>
+ <territory type="EG">મિસર</territory>
+ <territory type="GE">જà«àª¯à«‹àª°à«àªœà«€àª¯àª¾</territory>
+ <territory type="IN">ભારત</territory>
+ <territory type="NP">નેપાળ</territory>
+ <territory type="PK">કરાંચી</territory>
+ <territory type="TM">તà«àª°à«àª•à«àª®àª¨àª¿àª¸à«àª¤àª¾àª¨</territory>
+ <territory type="TR">તà«àª°à«àª•àª¸à«àª¤àª¾àª¨</territory>
+ <territory type="US">સંયà«àª•àª¤ રાજà«àª¯ અમેરિકા</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[૦-૯ ૠઅ-ઋ à«  ઠàª-ઑ ઓ-ન પ-ર લ ળ વ-હ ઼ àª-ઃ ઽ ૠા-à«… ે-ૉ à«‹ à«Œ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">જાનà«àª¯à«</month>
+ <month type="2">ફેબà«àª°à«</month>
+ <month type="3">મારà«àªš</month>
+ <month type="4">àªàªªà«àª°àª¿àª²</month>
+ <month type="5">મે</month>
+ <month type="6">જૂન</month>
+ <month type="7">જà«àª²àª¾àªˆ</month>
+ <month type="8">ઑગસà«àªŸ</month>
+ <month type="9">સપà«àªŸà«‡</month>
+ <month type="10">ઑકà«àªŸà«‹</month>
+ <month type="11">નવે</month>
+ <month type="12">ડિસે</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">જાનà«àª¯à«àª†àª°à«€</month>
+ <month type="2">ફેબà«àª°à«àª†àª°à«€</month>
+ <month type="3">મારà«àªš</month>
+ <month type="4">àªàªªà«àª°àª¿àª²</month>
+ <month type="5">મે</month>
+ <month type="6">જૂન</month>
+ <month type="7">જà«àª²àª¾àªˆ</month>
+ <month type="8">ઑગસà«àªŸ</month>
+ <month type="9">સપà«àªŸà«‡àª®à«àª¬àª°</month>
+ <month type="10">ઑકà«àªŸà«àª¬àª°</month>
+ <month type="11">નવેમà«àª¬àª°</month>
+ <month type="12">ડિસેમà«àª¬àª°</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">રવિ</day>
+ <day type="mon">સોમ</day>
+ <day type="tue">મંગળ</day>
+ <day type="wed">બà«àª§</day>
+ <day type="thu">ગà«àª°à«</day>
+ <day type="fri">શà«àª•à«àª°</day>
+ <day type="sat">શનિ</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">રવિવાર</day>
+ <day type="mon">સોમવાર</day>
+ <day type="tue">મંગળવાર</day>
+ <day type="wed">બà«àª§àªµàª¾àª°</day>
+ <day type="thu">ગà«àª°à«àªµàª¾àª°</day>
+ <day type="fri">શà«àª•à«àª°àªµàª¾àª°</day>
+ <day type="sat">શનિવાર</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">પેહલા હંત 1</quarter>
+ <quarter type="2" draft="unconfirmed">ડૂસઋા હંત 2</quarter>
+ <quarter type="3" draft="unconfirmed">તીસઋા હંત 3</quarter>
+ <quarter type="4" draft="unconfirmed">ચૌતા હંત 4</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>પૂરà«àªµÂ àª®àª§à«àª¯àª¾àª¹à«àª¨</am>
+ <pm>ઉતà«àª¤àª°Â àª®àª§à«àª¯àª¾àª¹à«àª¨</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">ઈસાપૂઋà«àªµ.</era>
+ <era type="1" draft="unconfirmed">સન.</era>
+ </eraNames>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <nativeZeroDigit>૦</nativeZeroDigit>
+ </symbols>
+ <currencies>
+ <currency type="INR">
+ <symbol>રà«</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>હા</yesstr>
+ <nostr>ના</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1" uri="isbn:0781800579">Learn Gujarati in 30 Days</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/gu_IN.xml b/libs/Zend/Locale/Data/gu_IN.xml
new file mode 100755
index 0000000000..660cc018b7
--- /dev/null
+++ b/libs/Zend/Locale/Data/gu_IN.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.46 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="gu"/>
+ <territory type="IN"/>
+ </identity>
+ <delimiters>
+ <quotationStart>'</quotationStart>
+ <quotationEnd>'</quotationEnd>
+ <alternateQuotationStart>&quot;</alternateQuotationStart>
+ <alternateQuotationEnd>&quot;</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d-MM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+ <references>
+ <reference type="RP1" uri="http://tdil.mit.gov.in/newsIndexApr02.htm">TDIL Vishwabharat magazine with Gujarati data, April 2002</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/gv.xml b/libs/Zend/Locale/Data/gv.xml
new file mode 100755
index 0000000000..110d82322e
--- /dev/null
+++ b/libs/Zend/Locale/Data/gv.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="gv"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="gv">Gaelg</language>
+ </languages>
+ <territories>
+ <territory type="GB">Rywvaneth Unys</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-c ç d-z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">J-guer</month>
+ <month type="2">T-arree</month>
+ <month type="3">Mayrnt</month>
+ <month type="4">Avrril</month>
+ <month type="5">Boaldyn</month>
+ <month type="6">M-souree</month>
+ <month type="7">J-souree</month>
+ <month type="8">Luanistyn</month>
+ <month type="9">M-fouyir</month>
+ <month type="10">J-fouyir</month>
+ <month type="11">M.Houney</month>
+ <month type="12">M.Nollick</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Jerrey-geuree</month>
+ <month type="2">Toshiaght-arree</month>
+ <month type="3">Mayrnt</month>
+ <month type="4">Averil</month>
+ <month type="5">Boaldyn</month>
+ <month type="6">Mean-souree</month>
+ <month type="7">Jerrey-souree</month>
+ <month type="8">Luanistyn</month>
+ <month type="9">Mean-fouyir</month>
+ <month type="10">Jerrey-fouyir</month>
+ <month type="11">Mee Houney</month>
+ <month type="12">Mee ny Nollick</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Jed</day>
+ <day type="mon">Jel</day>
+ <day type="tue">Jem</day>
+ <day type="wed">Jerc</day>
+ <day type="thu">Jerd</day>
+ <day type="fri">Jeh</day>
+ <day type="sat">Jes</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Jedoonee</day>
+ <day type="mon">Jelhein</day>
+ <day type="tue">Jemayrt</day>
+ <day type="wed">Jercean</day>
+ <day type="thu">Jerdein</day>
+ <day type="fri">Jeheiney</day>
+ <day type="sat">Jesarn</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am>a.m.</am>
+ <pm>p.m.</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">RC</era>
+ <era type="1">AD</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
diff --git a/libs/Zend/Locale/Data/gv_GB.xml b/libs/Zend/Locale/Data/gv_GB.xml
new file mode 100755
index 0000000000..5afae65270
--- /dev/null
+++ b/libs/Zend/Locale/Data/gv_GB.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="gv"/>
+ <territory type="GB"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>MMM dd,yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>HH:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ha.xml b/libs/Zend/Locale/Data/ha.xml
new file mode 100755
index 0000000000..e8d8b498ad
--- /dev/null
+++ b/libs/Zend/Locale/Data/ha.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.13 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="ha"/>
+ </identity>
+ <characters>
+ <exemplarCharacters>[a b ɓ c d ɗ e-k ƙ l-o r s {sh} t {ts} u w y z ʼ {ʼy}]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[á à â é è ê í ì î ó ò ô p q {r̃} ú ù û v x ƴ]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Jan</month>
+ <month type="2" draft="unconfirmed">Fab</month>
+ <month type="3" draft="unconfirmed">Mar</month>
+ <month type="4" draft="unconfirmed">Afr</month>
+ <month type="5" draft="unconfirmed">May</month>
+ <month type="6" draft="unconfirmed">Yun</month>
+ <month type="7" draft="unconfirmed">Yul</month>
+ <month type="8" draft="unconfirmed">Agu</month>
+ <month type="9" draft="unconfirmed">Sat</month>
+ <month type="10" draft="unconfirmed">Okt</month>
+ <month type="11" draft="unconfirmed">Nuw</month>
+ <month type="12" draft="unconfirmed">Dis</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Janairu</month>
+ <month type="2" draft="unconfirmed">Fabrairu</month>
+ <month type="3" draft="unconfirmed">Maris</month>
+ <month type="4" draft="unconfirmed">Afrilu</month>
+ <month type="5" draft="unconfirmed">Mayu</month>
+ <month type="6" draft="unconfirmed">Yuni</month>
+ <month type="7" draft="unconfirmed">Yuli</month>
+ <month type="8" draft="unconfirmed">Agusta</month>
+ <month type="9" draft="unconfirmed">Satumba</month>
+ <month type="10" draft="unconfirmed">Oktoba</month>
+ <month type="11" draft="unconfirmed">Nuwamba</month>
+ <month type="12" draft="unconfirmed">Disamba</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Lah</day>
+ <day type="mon" draft="unconfirmed">Lit</day>
+ <day type="tue" draft="unconfirmed">Tal</day>
+ <day type="wed" draft="unconfirmed">Lar</day>
+ <day type="thu" draft="unconfirmed">Alh</day>
+ <day type="fri" draft="unconfirmed">Jum</day>
+ <day type="sat" draft="unconfirmed">Asa</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Lahadi</day>
+ <day type="mon" draft="unconfirmed">Littinin</day>
+ <day type="tue" draft="unconfirmed">Talata</day>
+ <day type="wed" draft="unconfirmed">Laraba</day>
+ <day type="thu" draft="unconfirmed">Alhamis</day>
+ <day type="fri" draft="unconfirmed">Jumma'a</day>
+ <day type="sat" draft="unconfirmed">Asabar</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">Gabanin Miladi</era>
+ <era type="1" draft="unconfirmed">Miladi</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">GM</era>
+ <era type="1" draft="unconfirmed">M</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="GHC">
+ <displayName draft="unconfirmed">Sidi</displayName>
+ </currency>
+ <currency type="NGN">
+ <displayName draft="unconfirmed">Neira</displayName>
+ <symbol draft="unconfirmed">₦</symbol>
+ </currency>
+ <currency type="XOF">
+ <displayName draft="unconfirmed">Sefa</displayName>
+ <symbol draft="unconfirmed">CFA</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1" uri="http://www.omniglot.com/writing/hausa.htm">Omniglot on Hausa</reference>
+ <reference type="RP2" uri="http://developer.mimer.com/charts/hausa.htm">Mimer Hausa Collation</reference>
+ <reference type="RP3" uri="http://en.wikipedia.org/wiki/Hausa_language">Wikipedia on Hausa language</reference>
+ <reference type="RP4" uri="http://www.teachyourselfhausa.com/hausa-alphabet.php">Teach Yourself Hausa, alphabet section</reference>
+ <reference type="RP5" uri="http://www.motherlandnigeria.com/languages.html#Hausa">Nigerian languages - Hausa</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ha_Arab.xml b/libs/Zend/Locale/Data/ha_Arab.xml
new file mode 100755
index 0000000000..bb46ad7453
--- /dev/null
+++ b/libs/Zend/Locale/Data/ha_Arab.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.13 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="ha"/>
+ <script type="Arab"/>
+ </identity>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[ا ب ت-غ ٠ڢ ك-ن]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">جَن</month>
+ <month type="2" draft="unconfirmed">ڢَب</month>
+ <month type="3" draft="unconfirmed">مَر</month>
+ <month type="4" draft="unconfirmed">أَڢْر</month>
+ <month type="5" draft="unconfirmed">Ù…ÙŽÙŠ</month>
+ <month type="6" draft="unconfirmed">ÙŠÙون</month>
+ <month type="7" draft="unconfirmed">ÙŠÙول</month>
+ <month type="8" draft="unconfirmed">أَغÙ</month>
+ <month type="9" draft="unconfirmed">سَت</month>
+ <month type="10" draft="unconfirmed">Ø£Ùكْت</month>
+ <month type="11" draft="unconfirmed">Ù†ÙÙˆ</month>
+ <month type="12" draft="unconfirmed">دÙس</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">جَنَيْرÙ</month>
+ <month type="2" draft="unconfirmed">ڢَبْرَيْرÙ</month>
+ <month type="3" draft="unconfirmed">مَرÙسْ</month>
+ <month type="4" draft="unconfirmed">أَڢْرÙÙ„Ù</month>
+ <month type="5" draft="unconfirmed">Ù…ÙŽÙŠÙ</month>
+ <month type="6" draft="unconfirmed">ÙŠÙونÙ</month>
+ <month type="7" draft="unconfirmed">ÙŠÙولÙ</month>
+ <month type="8" draft="unconfirmed">أَغÙسْتَ</month>
+ <month type="9" draft="unconfirmed">سَتÙمْبَ</month>
+ <month type="10" draft="unconfirmed">Ø£ÙكْتوÙبَ</month>
+ <month type="11" draft="unconfirmed">Ù†Ùوَمْبَ</month>
+ <month type="12" draft="unconfirmed">دÙسَمْبَ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Ù„ÙŽØ­</day>
+ <day type="mon" draft="unconfirmed">Ù„Ùت</day>
+ <day type="tue" draft="unconfirmed">تَل</day>
+ <day type="wed" draft="unconfirmed">لَر</day>
+ <day type="thu" draft="unconfirmed">أَلْح</day>
+ <day type="fri" draft="unconfirmed">جÙÙ…</day>
+ <day type="sat" draft="unconfirmed">أَسَ</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">لَحَدÙ</day>
+ <day type="mon" draft="unconfirmed">Ù„ÙتÙÙ†Ùنْ</day>
+ <day type="tue" draft="unconfirmed">تَلَتَ</day>
+ <day type="wed" draft="unconfirmed">لَرَبَ</day>
+ <day type="thu" draft="unconfirmed">أَلْحَمÙسْ</day>
+ <day type="fri" draft="unconfirmed">جÙمَعَ</day>
+ <day type="sat" draft="unconfirmed">أَسَبَرْ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">A.M.</am>
+ <pm draft="unconfirmed">P.M.</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">غَبَنÙنْ Ù…ÙلَدÙ</era>
+ <era type="1" draft="unconfirmed">Ù…ÙلَدÙ</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">غَبَنÙنْ Ù…ÙلَدÙ</era>
+ <era type="1" draft="unconfirmed">Ù…ÙلَدÙ</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="NGN">
+ <displayName draft="unconfirmed">نَيْرَ</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ha_Arab_NG.xml b/libs/Zend/Locale/Data/ha_Arab_NG.xml
new file mode 100755
index 0000000000..038ed8887d
--- /dev/null
+++ b/libs/Zend/Locale/Data/ha_Arab_NG.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ha"/>
+ <script type="Arab"/>
+ <territory type="NG"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ha_GH.xml b/libs/Zend/Locale/Data/ha_GH.xml
new file mode 100755
index 0000000000..2aaf5301ff
--- /dev/null
+++ b/libs/Zend/Locale/Data/ha_GH.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ha"/>
+ <territory type="GH"/>
+ </identity>
+ <alias source="ha_Latn_GH" path="//ldml" draft="unconfirmed"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ha_Latn.xml b/libs/Zend/Locale/Data/ha_Latn.xml
new file mode 100755
index 0000000000..4527afe4e7
--- /dev/null
+++ b/libs/Zend/Locale/Data/ha_Latn.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.4 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ha"/>
+ <script type="Latn"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ha_Latn_GH.xml b/libs/Zend/Locale/Data/ha_Latn_GH.xml
new file mode 100755
index 0000000000..ccf1e22632
--- /dev/null
+++ b/libs/Zend/Locale/Data/ha_Latn_GH.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.4 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ha"/>
+ <script type="Latn"/>
+ <territory type="GH"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ha_Latn_NE.xml b/libs/Zend/Locale/Data/ha_Latn_NE.xml
new file mode 100755
index 0000000000..39e46608ca
--- /dev/null
+++ b/libs/Zend/Locale/Data/ha_Latn_NE.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.4 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ha"/>
+ <script type="Latn"/>
+ <territory type="NE"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ha_Latn_NG.xml b/libs/Zend/Locale/Data/ha_Latn_NG.xml
new file mode 100755
index 0000000000..8d037e12fc
--- /dev/null
+++ b/libs/Zend/Locale/Data/ha_Latn_NG.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.4 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ha"/>
+ <script type="Latn"/>
+ <territory type="NG"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ha_NE.xml b/libs/Zend/Locale/Data/ha_NE.xml
new file mode 100755
index 0000000000..ab95397d5e
--- /dev/null
+++ b/libs/Zend/Locale/Data/ha_NE.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ha"/>
+ <territory type="NE"/>
+ </identity>
+ <alias source="ha_Latn_NE" path="//ldml" draft="unconfirmed"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ha_NG.xml b/libs/Zend/Locale/Data/ha_NG.xml
new file mode 100755
index 0000000000..cc91ce86af
--- /dev/null
+++ b/libs/Zend/Locale/Data/ha_NG.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ha"/>
+ <territory type="NG"/>
+ </identity>
+ <alias source="ha_Latn_NG" path="//ldml" draft="unconfirmed"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/haw.xml b/libs/Zend/Locale/Data/haw.xml
new file mode 100755
index 0000000000..28ef0db8ee
--- /dev/null
+++ b/libs/Zend/Locale/Data/haw.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.26 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="haw"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="haw">Ê»Ålelo HawaiÊ»i</language>
+ </languages>
+ <territories>
+ <territory type="AU">NÅ«hÅlani</territory>
+ <territory type="CA">KanakÄ</territory>
+ <territory type="CN">Kina</territory>
+ <territory type="DE">KelemÄnia</territory>
+ <territory type="DK">Kenemaka</territory>
+ <territory type="ES">Kepania</territory>
+ <territory type="FR">Palani</territory>
+ <territory type="GB">Aupuni MÅʻī Hui PÅ« Ê»Ia</territory>
+ <territory type="GR">Helene</territory>
+ <territory type="IE">ʻIlelani</territory>
+ <territory type="IL">ʻIseraʻela</territory>
+ <territory type="IN">ʻĪnia</territory>
+ <territory type="IT">ʻĪkÄlia</territory>
+ <territory type="JP">IÄpana</territory>
+ <territory type="MX">Mekiko</territory>
+ <territory type="NL">HÅlani</territory>
+ <territory type="NZ">Aotearoa</territory>
+ <territory type="PH">ʻĀina Pilipino</territory>
+ <territory type="RU">LÅ«kia</territory>
+ <territory type="US">ʻAmelika Hui Pū ʻIa</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a Ä e Ä“ h Ê» i Ä« k-o Å p u Å« w]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[b-d f g j q-t v x-z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Ian.</month>
+ <month type="2">Pep.</month>
+ <month type="3">Mal.</month>
+ <month type="4">ʻAp.</month>
+ <month type="5">Mei</month>
+ <month type="6">Iun.</month>
+ <month type="7">Iul.</month>
+ <month type="8">ʻAu.</month>
+ <month type="9">Kep.</month>
+ <month type="10">ʻOk.</month>
+ <month type="11">Now.</month>
+ <month type="12">Kek.</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Ianuali</month>
+ <month type="2">Pepeluali</month>
+ <month type="3">Malaki</month>
+ <month type="4">ʻApelila</month>
+ <month type="5">Mei</month>
+ <month type="6">Iune</month>
+ <month type="7">Iulai</month>
+ <month type="8">ʻAukake</month>
+ <month type="9">Kepakemapa</month>
+ <month type="10">ʻOkakopa</month>
+ <month type="11">Nowemapa</month>
+ <month type="12">Kekemapa</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">LP</day>
+ <day type="mon">P1</day>
+ <day type="tue">P2</day>
+ <day type="wed">P3</day>
+ <day type="thu">P4</day>
+ <day type="fri">P5</day>
+ <day type="sat">P6</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">LÄpule</day>
+ <day type="mon">Poʻakahi</day>
+ <day type="tue">Poʻalua</day>
+ <day type="wed">Poʻakolu</day>
+ <day type="thu">PoÊ»ahÄ</day>
+ <day type="fri">Poʻalima</day>
+ <day type="sat">Poʻaono</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/haw_US.xml b/libs/Zend/Locale/Data/haw_US.xml
new file mode 100755
index 0000000000..4b99d3aedd
--- /dev/null
+++ b/libs/Zend/Locale/Data/haw_US.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.27 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="haw"/>
+ <territory type="US"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d/M/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">d/M</dateFormatItem>
+ <dateFormatItem id="yyM" draft="provisional">M/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/he.xml b/libs/Zend/Locale/Data/he.xml
new file mode 100755
index 0000000000..3dc9efcdc6
--- /dev/null
+++ b/libs/Zend/Locale/Data/he.xml
@@ -0,0 +1,1575 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.71 $"/>
+ <generation date="$Date: 2006/08/04 21:51:50 $"/>
+ <language type="he"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">×תיופית</language>
+ <language type="ab">×בחזית</language>
+ <language type="ady">×דיגית</language>
+ <language type="ae">×בסטן</language>
+ <language type="af">×פריקנית</language>
+ <language type="afa" draft="provisional">×פרו-×סי×תית (×חר)</language>
+ <language type="afh">×פריהילי</language>
+ <language type="ain">×ינו</language>
+ <language type="ak">×ק×ן</language>
+ <language type="akk">×כדית</language>
+ <language type="am">×מהרית</language>
+ <language type="apa">שפות ×פצ'יות</language>
+ <language type="ar">ערבית</language>
+ <language type="arc">×רמית</language>
+ <language type="as">×ס×מית</language>
+ <language type="ast">×וסטרית</language>
+ <language type="aus">שפות ×וסטרליות</language>
+ <language type="awa">×וו×דית</language>
+ <language type="az">×זרית</language>
+ <language type="ba">בשקירית</language>
+ <language type="bal">ב×לוצ'×™</language>
+ <language type="be">בל×רוסית</language>
+ <language type="bej">בז'ה</language>
+ <language type="ber">ברברית</language>
+ <language type="bg">בולגרית</language>
+ <language type="bn">בנגלית</language>
+ <language type="bo">טיבטית</language>
+ <language type="br">ברטונית</language>
+ <language type="bs">בוסנית</language>
+ <language type="ca">קטלונית</language>
+ <language type="cad">ק×דו</language>
+ <language type="cau">קווקזית (×חר)</language>
+ <language type="ce">צ'צ'נית</language>
+ <language type="ceb">קבו×נו</language>
+ <language type="cel">קלטית</language>
+ <language type="chg">צ'××’×ט××™</language>
+ <language type="chr">צ'ירוקית</language>
+ <language type="co">קורסיק×ית</language>
+ <language type="cop">קופטית</language>
+ <language type="cs">צ׳כית</language>
+ <language type="cy">וולשית</language>
+ <language type="da">דנית</language>
+ <language type="dak">דקוטה</language>
+ <language type="de">גרמנית</language>
+ <language type="del" draft="provisional">דל×וור</language>
+ <language type="doi" draft="provisional">דוגרי</language>
+ <language type="dv">דיבהי</language>
+ <language type="dz" draft="provisional">דזונקה</language>
+ <language type="egy">מצרית (עתיקה)</language>
+ <language type="el">יוונית</language>
+ <language type="elx">עילמית</language>
+ <language type="en">×נגלית</language>
+ <language type="eo">×ספרנטו</language>
+ <language type="es">ספרדית</language>
+ <language type="et">×סטונית</language>
+ <language type="eu">בסקית</language>
+ <language type="fa">פרסית</language>
+ <language type="fi">פינית</language>
+ <language type="fil">פיליפינית</language>
+ <language type="fj">פיג'ית</language>
+ <language type="fo">פ×רו×זית</language>
+ <language type="fr">צרפתית</language>
+ <language type="fro">צרפתית עתיקה</language>
+ <language type="fy" draft="provisional">פריזית</language>
+ <language type="ga">×ירית</language>
+ <language type="gd">סקוטית ×’×לית</language>
+ <language type="gem" draft="provisional">גרמ×נית (×חר)</language>
+ <language type="gez" draft="provisional">×’×¢×–</language>
+ <language type="gl">גליצי×נית</language>
+ <language type="gn" draft="provisional">גו×רני</language>
+ <language type="gon" draft="provisional">גונדי</language>
+ <language type="got">גותית</language>
+ <language type="grc">יוונית עתיקה</language>
+ <language type="gu">גוג'ר×טית</language>
+ <language type="gv" draft="provisional">מ×נית</language>
+ <language type="ha">×”×וסה</language>
+ <language type="haw">הוו×ית</language>
+ <language type="he">עברית</language>
+ <language type="hi">הינדית</language>
+ <language type="hit">חיתית</language>
+ <language type="ho" draft="provisional">×”×רי מוטו</language>
+ <language type="hr">קרו×טית</language>
+ <language type="ht">×”×יטית</language>
+ <language type="hu">הונגרית</language>
+ <language type="hy">×רמנית</language>
+ <language type="id">×ינדונזית</language>
+ <language type="inh">×ינגושית</language>
+ <language type="ira">×יר×נית</language>
+ <language type="is">×יסלנדית</language>
+ <language type="it">×יטלקית</language>
+ <language type="ja">יפנית</language>
+ <language type="jpr" draft="provisional">עברית-פרסית</language>
+ <language type="jrb" draft="provisional">עברית-ערבית</language>
+ <language type="ka">גרוזינית</language>
+ <language type="kab" draft="provisional">קבילה</language>
+ <language type="kk">קזחית</language>
+ <language type="ko">קורי×נית</language>
+ <language type="ks">קשמירית</language>
+ <language type="ku">כורדית</language>
+ <language type="la">לטינית</language>
+ <language type="lad">לדינו</language>
+ <language type="lb">לוקסמבורגית</language>
+ <language type="lt">ליט×ית</language>
+ <language type="lv">לטבית</language>
+ <language type="mag">מ××’×הית</language>
+ <language type="mai" draft="provisional">מ×יטילית</language>
+ <language type="map">×וסטרונזית</language>
+ <language type="mas">מ×ס×ית</language>
+ <language type="mg">מלגשית</language>
+ <language type="mi">מ×ורית</language>
+ <language type="mk">מקדונית</language>
+ <language type="mn">מונגולית</language>
+ <language type="mni">מניפורית</language>
+ <language type="mo">מולדבית</language>
+ <language type="mr">מ×רתית</language>
+ <language type="mt">מלטזית</language>
+ <language type="mul">מספר שפות</language>
+ <language type="my">בורמזית</language>
+ <language type="myn">מ××™×”</language>
+ <language type="nap">נפוליטנית</language>
+ <language type="nb">נורבגית שפת הספר (בוקמול)</language>
+ <language type="nds" draft="provisional">גרמניה תחתית, סקסון תחתית</language>
+ <language type="ne">נפ×לית</language>
+ <language type="nl">הולנדית</language>
+ <language type="nn">נורבגית חדשה (נינורשק)</language>
+ <language type="no">נורווגית</language>
+ <language type="nub">שפות נבטיות</language>
+ <language type="nv">נבחו</language>
+ <language type="ota">טורקית עותומנית</language>
+ <language type="peo">פרסית עתיקה</language>
+ <language type="pl">פולנית</language>
+ <language type="ps">פ×שטו</language>
+ <language type="pt">פורטוגזית</language>
+ <language type="raj" draft="provisional">ר××’'סטן</language>
+ <language type="ro">רומנית</language>
+ <language type="rom">רומ×נית</language>
+ <language type="ru">רוסית</language>
+ <language type="sa">סנסקרית</language>
+ <language type="sam" draft="provisional">שומרונית ×רמית</language>
+ <language type="sat" draft="provisional">ס×נטלי</language>
+ <language type="sc">סרדינית</language>
+ <language type="scn">סיצילי×נית</language>
+ <language type="sco">סקוטית</language>
+ <language type="sd">סינדהית</language>
+ <language type="sem" draft="provisional">שמית (×חר)</language>
+ <language type="sga">×ירית עתיקה</language>
+ <language type="sgn">שפת סימני×</language>
+ <language type="sh">סרבו-קרו×טית</language>
+ <language type="si" draft="provisional">סינהלה</language>
+ <language type="sid" draft="provisional">סידמו</language>
+ <language type="sit">סינו-טיבטית (×חר)</language>
+ <language type="sk">סלובקית</language>
+ <language type="sl">סלובנית</language>
+ <language type="sla">סל×בית (×חר)</language>
+ <language type="sm">סמו×ית</language>
+ <language type="smi">שפות ס×מיות (×חר)</language>
+ <language type="so">סומלית</language>
+ <language type="sq">×לבנית</language>
+ <language type="sr">סרבית</language>
+ <language type="sv">שוודית</language>
+ <language type="sw">סווהילית</language>
+ <language type="ta">טמילית</language>
+ <language type="th">ת××™</language>
+ <language type="tk">טורקמנית</language>
+ <language type="tlh" draft="provisional">קלינגון</language>
+ <language type="tr">טורקית</language>
+ <language type="uga">×וגריתית</language>
+ <language type="uk">×וקר×ינית</language>
+ <language type="ur">×ורדו</language>
+ <language type="uz">×וזבקית</language>
+ <language type="vi">וי×טנמית</language>
+ <language type="wo" draft="provisional">ג'ולוף</language>
+ <language type="yap">×™×פזית</language>
+ <language type="yi">יידיש</language>
+ <language type="yo" draft="provisional">יורובה</language>
+ <language type="zap" draft="provisional">×–×פוטק</language>
+ <language type="zen" draft="provisional">×–× ××’×”</language>
+ <language type="zh">סינית</language>
+ <language type="zu">זולו</language>
+ </languages>
+ <scripts>
+ <script type="Arab">ערבית</script>
+ <script type="Armn">×רמנית</script>
+ <script type="Bali">ב×לינזית</script>
+ <script type="Beng">בנג×לית</script>
+ <script type="Brai">ברייל</script>
+ <script type="Cher">צ'רוקית</script>
+ <script type="Copt">קופטית</script>
+ <script type="Cprt">קפריס×ית</script>
+ <script type="Cyrl">קירילית</script>
+ <script type="Ethi">×תיופית</script>
+ <script type="Geor">גרוזינית</script>
+ <script type="Goth">גותית</script>
+ <script type="Grek">יוונית</script>
+ <script type="Hebr">עברית</script>
+ <script type="Hung">הונגרית עתיקה</script>
+ <script type="Knda">ק×נדה</script>
+ <script type="Laoo">ל×ית</script>
+ <script type="Latn">לטינית</script>
+ <script type="Mong">מונגולית</script>
+ <script type="Syrc">סורית</script>
+ <script type="Taml">טמיל</script>
+ <script type="Telu">טלוגו</script>
+ <script type="Thai">ת×ילנדית</script>
+ <script type="Tibt">טיבטית</script>
+ <script type="Ugar">×וגריתית</script>
+ <script type="Xpeo">פרסית עתיקה</script>
+ </scripts>
+ <territories>
+ <territory type="001">עול×</territory>
+ <territory type="002">×פריקה</territory>
+ <territory type="005">×“×¨×•× ×מריקה</territory>
+ <territory type="009">×וקיניה</territory>
+ <territory type="011">מערב ×פריקה</territory>
+ <territory type="013">מרכז ×מריקה</territory>
+ <territory type="014">מזרח ×פריקה</territory>
+ <territory type="015">צפון ×פריקה</territory>
+ <territory type="017">מרכז ×פריקה</territory>
+ <territory type="018" draft="provisional">×פריקה הדרומית</territory>
+ <territory type="019">×מריקות</territory>
+ <territory type="021">צפון ×מריקה</territory>
+ <territory type="029">קריביי×</territory>
+ <territory type="030">מזרח ×סיה</territory>
+ <territory type="035">דרו×-מזרח ×סיה</territory>
+ <territory type="039">×“×¨×•× ×ירופה</territory>
+ <territory type="053">×וסטרליה וניו-זילנד</territory>
+ <territory type="054">מלנסיה</territory>
+ <territory type="057" draft="provisional">חבל מקרונזיה</territory>
+ <territory type="061">פולינזיה</territory>
+ <territory type="062" draft="unconfirmed">דרו×-מרכז ×סיה</territory>
+ <territory type="142">×סיה</territory>
+ <territory type="145" draft="unconfirmed">מערב ×סיה</territory>
+ <territory type="150">×ירופה</territory>
+ <territory type="151">מזרח ×ירופה</territory>
+ <territory type="154">צפון ×ירופה</territory>
+ <territory type="155">מערב ×ירופה</territory>
+ <territory type="830">××™×™ קנל</territory>
+ <territory type="AD">×נדורה</territory>
+ <territory type="AE">×יחוד ×”×מירויות הערביות</territory>
+ <territory type="AF" draft="provisional">×פגניסטן</territory>
+ <territory type="AF" alt="proposed" draft="provisional">×פגניסט×ן</territory>
+ <territory type="AG">×נטיגו××” וברבודה</territory>
+ <territory type="AI" draft="provisional">×נגילה</territory>
+ <territory type="AI" alt="proposed" draft="provisional">×נגווילה</territory>
+ <territory type="AL">×לבניה</territory>
+ <territory type="AM">×רמניה</territory>
+ <territory type="AN">×× ×˜×™×œ×™× ×”×•×œ× ×“×™×™×</territory>
+ <territory type="AO">×נגולה</territory>
+ <territory type="AQ">×נט×רקטיקה</territory>
+ <territory type="AR">×רגנטינה</territory>
+ <territory type="AS">סמו××” ×”×מריקנית</territory>
+ <territory type="AT">×וסטריה</territory>
+ <territory type="AU">×וסטרליה</territory>
+ <territory type="AW">×רובה</territory>
+ <territory type="AX">××™×™ ×לנד</territory>
+ <territory type="AZ">×זרבייג׳×ן</territory>
+ <territory type="BA">בוסניה והרצגובינה</territory>
+ <territory type="BB">ברבדוס</territory>
+ <territory type="BD">בנגל×דש</territory>
+ <territory type="BE">בלגיה</territory>
+ <territory type="BF">בורקינה פ×סו</territory>
+ <territory type="BG">בולגריה</territory>
+ <territory type="BH">בחריין</territory>
+ <territory type="BI">בורונדי</territory>
+ <territory type="BJ">בנין</territory>
+ <territory type="BM">ברמודה</territory>
+ <territory type="BN">ברוניי ד×רסל××</territory>
+ <territory type="BN" alt="proposed" draft="provisional">ברוניי ד×רוס×ל××</territory>
+ <territory type="BO">בוליביה</territory>
+ <territory type="BR">ברזיל</territory>
+ <territory type="BS">ב××”×מה, ××™×™</territory>
+ <territory type="BT" draft="provisional">בוט×ן</territory>
+ <territory type="BT" alt="proposed" draft="provisional">בהוט×ן</territory>
+ <territory type="BV">בובה, ××™</territory>
+ <territory type="BW">בוטסוו×× ×”</territory>
+ <territory type="BY">בל×רוס</territory>
+ <territory type="BZ">בליז</territory>
+ <territory type="CA">קנדה</territory>
+ <territory type="CC" draft="provisional">××™×™ קוקוס (קילינג)</territory>
+ <territory type="CC" alt="proposed" draft="provisional">קוקוס, ××™×™</territory>
+ <territory type="CD">קונגו, הרפובליקה הדמוקרטית של</territory>
+ <territory type="CF">הרפובליקה של מרכז ×פריקה</territory>
+ <territory type="CG">קונגו</territory>
+ <territory type="CH">שווייץ</territory>
+ <territory type="CI">חוף השנהב</territory>
+ <territory type="CK" draft="provisional">××™×™ קוק</territory>
+ <territory type="CK" alt="proposed" draft="provisional">קוק, ××™×™</territory>
+ <territory type="CL">צ׳ילה</territory>
+ <territory type="CM" draft="provisional">קמרון</territory>
+ <territory type="CM" alt="proposed" draft="provisional">ק×מרון</territory>
+ <territory type="CN">סין</territory>
+ <territory type="CO">קולומביה</territory>
+ <territory type="CR">קוסטה ריקה</territory>
+ <territory type="CS">סרביה ומונטנגרו</territory>
+ <territory type="CU">קובה</territory>
+ <territory type="CV" draft="provisional">קייפ ורדה</territory>
+ <territory type="CV" alt="proposed" draft="provisional">ק×פ ורדה</territory>
+ <territory type="CX" draft="provisional">××™×™ כריסטמס</territory>
+ <territory type="CX" alt="proposed" draft="provisional">קריסמס, ××™</territory>
+ <territory type="CY">קפריסין</territory>
+ <territory type="CZ" draft="provisional">הרפובליקה הצ׳כית</territory>
+ <territory type="CZ" alt="proposed" draft="provisional">צ׳כיה, הרפובליקה של</territory>
+ <territory type="DE">גרמניה</territory>
+ <territory type="DJ">ג׳יבוטי</territory>
+ <territory type="DK">דנמרק</territory>
+ <territory type="DM">דומיניקה</territory>
+ <territory type="DO">הרפובליקה הדומיניקנית</territory>
+ <territory type="DZ">×לג׳יריה</territory>
+ <territory type="EC">×קוו×דור</territory>
+ <territory type="EE">×סטוניה</territory>
+ <territory type="EG">מצרי×</territory>
+ <territory type="EH">סהרה המערבית</territory>
+ <territory type="ER">×ריטר××”</territory>
+ <territory type="ES">ספרד</territory>
+ <territory type="ET">×תיופיה</territory>
+ <territory type="FI">פינלנד</territory>
+ <territory type="FJ">פיג׳י</territory>
+ <territory type="FK" draft="provisional">××™×™ פוקלנד</territory>
+ <territory type="FK" alt="proposed" draft="provisional">פוקלנד, ××™×™</territory>
+ <territory type="FM">מיקרונזיה</territory>
+ <territory type="FO" draft="provisional">××™×™ פ×רו</territory>
+ <territory type="FO" alt="proposed" draft="provisional">פרו×ר, ××™×™</territory>
+ <territory type="FR">צרפת</territory>
+ <territory type="GA">×’×בון</territory>
+ <territory type="GB">בריטניה</territory>
+ <territory type="GD" draft="provisional">גרנדה</territory>
+ <territory type="GD" alt="proposed" draft="provisional">גרנ×דה</territory>
+ <territory type="GE">גרוזיה</territory>
+ <territory type="GF">×’×™×× ×” הצרפתית</territory>
+ <territory type="GH">×’×× ×”</territory>
+ <territory type="GI">גיברלטר</territory>
+ <territory type="GL">גרינלנד</territory>
+ <territory type="GM">גמביה</territory>
+ <territory type="GN">×’×™× ×™××”</territory>
+ <territory type="GP">גוו×דלופ</territory>
+ <territory type="GQ">×’×™× ×™××” המשוונית</territory>
+ <territory type="GR">יוון</territory>
+ <territory type="GS">ג׳ורג׳יה הדרומית ו××™×™ סנדוויץ׳ הדרומיי×</territory>
+ <territory type="GT">גוו×טמ×לה</territory>
+ <territory type="GU">גו××</territory>
+ <territory type="GW">×’×™× ×™××”-ביס×ו</territory>
+ <territory type="GY">×’×™×× ×”</territory>
+ <territory type="HK">הונג קונג S.A.R. של סין</territory>
+ <territory type="HK" alt="proposed" draft="provisional">הונג קונג S.A.R.‎ של סין</territory>
+ <territory type="HK" alt="proposed-u80-1" draft="provisional">הונג קונג, ×”×זור המנהלי המיוחד של סין</territory>
+ <territory type="HM" draft="provisional">××™×™ הרד ו××™×™ מקדונלנד</territory>
+ <territory type="HM" alt="proposed" draft="provisional">הרד ומקדונלנד, ××™×™</territory>
+ <territory type="HN">הונדורס</territory>
+ <territory type="HR">קרו×טיה</territory>
+ <territory type="HT">×”×יטי</territory>
+ <territory type="HU">הונגריה</territory>
+ <territory type="ID">×ינדונזיה</territory>
+ <territory type="IE">×ירלנד</territory>
+ <territory type="IL">ישר×ל</territory>
+ <territory type="IN">הודו</territory>
+ <territory type="IO">טריטוריה בריטית ב×וקי×נוס ההודי</territory>
+ <territory type="IQ">עירק</territory>
+ <territory type="IR">×יר×ן</territory>
+ <territory type="IS">×יסלנד</territory>
+ <territory type="IT">×יטליה</territory>
+ <territory type="JM" draft="provisional">ג׳מייקה</territory>
+ <territory type="JM" alt="proposed" draft="provisional">ג׳×מייקה</territory>
+ <territory type="JO">ירדן</territory>
+ <territory type="JP">יפן</territory>
+ <territory type="KE">קניה</territory>
+ <territory type="KG" draft="provisional">קירגיזסטן</territory>
+ <territory type="KG" alt="proposed" draft="provisional">קירגיזסט×ן</territory>
+ <territory type="KH">קמבודיה</territory>
+ <territory type="KI">קיריב×טי</territory>
+ <territory type="KM">קומורוס</territory>
+ <territory type="KN">סנט קיטס ונוויס</territory>
+ <territory type="KP">קורי××”, צפון</territory>
+ <territory type="KP" alt="proposed" draft="provisional">קורי××” הצפונית</territory>
+ <territory type="KR">קורי××”, דרו×</territory>
+ <territory type="KR" alt="proposed" draft="provisional">קורי××” הדרומית</territory>
+ <territory type="KW" draft="provisional">כווית</territory>
+ <territory type="KW" alt="proposed" draft="provisional">כוויית</territory>
+ <territory type="KY" draft="provisional">××™×™ קיימ×ן</territory>
+ <territory type="KY" alt="proposed" draft="provisional">קיימ×ן, ××™×™</territory>
+ <territory type="KZ" draft="provisional">קזחסטן</territory>
+ <territory type="KZ" alt="proposed" draft="provisional">קז×חסט×ן</territory>
+ <territory type="LA">ל×וס</territory>
+ <territory type="LB">לבנון</territory>
+ <territory type="LC">סנט לוסיה</territory>
+ <territory type="LI">ליכטנשטיין</territory>
+ <territory type="LK">סרי לנקה</territory>
+ <territory type="LR">ליבריה</territory>
+ <territory type="LS" draft="provisional">לסוטו</territory>
+ <territory type="LS" alt="proposed" draft="provisional">לסותו</territory>
+ <territory type="LT">ליט×</territory>
+ <territory type="LU">לוקסמבורג</territory>
+ <territory type="LV">לטביה</territory>
+ <territory type="LY">לוב</territory>
+ <territory type="MA">מרוקו</territory>
+ <territory type="MC" draft="provisional">מונקו</territory>
+ <territory type="MC" alt="proposed" draft="provisional">מונ×קו</territory>
+ <territory type="MD">מולדובה</territory>
+ <territory type="MG">מדגסקר</territory>
+ <territory type="MH" draft="provisional">××™×™ מרשל</territory>
+ <territory type="MH" alt="proposed" draft="provisional">מרשל, ××™×™</territory>
+ <territory type="MK">מקדוניה</territory>
+ <territory type="ML">מ×לי</territory>
+ <territory type="MM">מיי×נמ×ר</territory>
+ <territory type="MN">מונגוליה</territory>
+ <territory type="MO">מק×ו S.A.R. של סין</territory>
+ <territory type="MO" alt="proposed" draft="provisional">מק×ו S.A.R.‎ של סין</territory>
+ <territory type="MO" alt="proposed-u80-1" draft="provisional">מק×ו, ×”×זור המנהלי המיוחד של סין</territory>
+ <territory type="MP" draft="provisional">××™×™ מרי×× ×” הצפוניי×</territory>
+ <territory type="MP" alt="proposed" draft="provisional">מרי×× ×” הצפוניי×, ××™×™</territory>
+ <territory type="MQ">מרטיניק</territory>
+ <territory type="MR">מ×וריטניה</territory>
+ <territory type="MS" draft="provisional">מונטסר×ט</territory>
+ <territory type="MS" alt="proposed" draft="provisional">מונסר×ט</territory>
+ <territory type="MT">מלטה</territory>
+ <territory type="MU">מ×וריציוס</territory>
+ <territory type="MV">מלדיבי×</territory>
+ <territory type="MW">מל×ווי</territory>
+ <territory type="MX">מקסיקו</territory>
+ <territory type="MY">מלזיה</territory>
+ <territory type="MZ">מוזמביק</territory>
+ <territory type="NA" draft="provisional">נמיביה</territory>
+ <territory type="NA" alt="proposed" draft="provisional">× ×מיביה</territory>
+ <territory type="NC">קלדוניה החדשה</territory>
+ <territory type="NE">ניז׳ר</territory>
+ <territory type="NF">××™×™ נורפק</territory>
+ <territory type="NF" alt="proposed" draft="provisional">נורפוק, ××™×™</territory>
+ <territory type="NF" alt="proposed-u80-1" draft="provisional">××™×™ נורפוק</territory>
+ <territory type="NG">ניגריה</territory>
+ <territory type="NI">ניק×ר×גו××”</territory>
+ <territory type="NL">הולנד</territory>
+ <territory type="NO">נורווגיה</territory>
+ <territory type="NP">נפ×ל</territory>
+ <territory type="NR">× ×ורו</territory>
+ <territory type="NU">ניווה</territory>
+ <territory type="NU" alt="proposed" draft="provisional">× ×™×ו</territory>
+ <territory type="NZ">ניו זילנד</territory>
+ <territory type="OM">עומ×ן</territory>
+ <territory type="PA">פנמה</territory>
+ <territory type="PE">פרו</territory>
+ <territory type="PF">פולינזיה הצרפתית</territory>
+ <territory type="PG">פפו××” ×’×™× ×™××” החדשה</territory>
+ <territory type="PH">פיליפיני×</territory>
+ <territory type="PK" draft="provisional">פקיסטן</territory>
+ <territory type="PK" alt="proposed" draft="provisional">פקיסט×ן</territory>
+ <territory type="PL">פולין</territory>
+ <territory type="PM">סנט פייר ומיקלון</territory>
+ <territory type="PN">פיטקרן</territory>
+ <territory type="PR" draft="provisional">פורטו ריקו</territory>
+ <territory type="PR" alt="proposed" draft="provisional">פו×רטו ריקו</territory>
+ <territory type="PS">הרשות הפלשתינית</territory>
+ <territory type="PT">פורטוגל</territory>
+ <territory type="PW">פ×ל×ו</territory>
+ <territory type="PY" draft="provisional">פר×גוו××™</territory>
+ <territory type="PY" alt="proposed" draft="provisional">פרגוו××™</territory>
+ <territory type="QA">ק×ט×ר</territory>
+ <territory type="RE">ר×וניון</territory>
+ <territory type="RO">רומניה</territory>
+ <territory type="RU">חבר המדינות הרוסיות</territory>
+ <territory type="RU" alt="proposed" draft="provisional">רוסיה, הפדרציה של</territory>
+ <territory type="RU" alt="proposed-u80-1" draft="provisional">רוסיה</territory>
+ <territory type="RW">רו×נדה</territory>
+ <territory type="SA">ערב הסעודית</territory>
+ <territory type="SB" draft="provisional">××™×™ שלמה</territory>
+ <territory type="SB" alt="proposed" draft="provisional">שלמה, ××™×™</territory>
+ <territory type="SC" draft="provisional">××™×™ סיישל</territory>
+ <territory type="SC" alt="proposed" draft="provisional">סיישל</territory>
+ <territory type="SD" draft="provisional">סודן</territory>
+ <territory type="SD" alt="proposed" draft="provisional">סוד×ן</territory>
+ <territory type="SE">שוודיה</territory>
+ <territory type="SG">סינגפור</territory>
+ <territory type="SH">סנט הלנה</territory>
+ <territory type="SI">סלובניה</territory>
+ <territory type="SJ">סוולב×רד וז׳×ן מ×יין</territory>
+ <territory type="SK">סלובקיה</territory>
+ <territory type="SL">סיירה ל×ונה</territory>
+ <territory type="SM">ס×ן מ×רינו</territory>
+ <territory type="SN" draft="provisional">סנגל</territory>
+ <territory type="SN" alt="proposed" draft="provisional">סנג×ל</territory>
+ <territory type="SO">סומ×ליה</territory>
+ <territory type="SR">סורינ××</territory>
+ <territory type="ST">ס×ו טומה ופרינסיפה</territory>
+ <territory type="SV">×ל סלב×דור</territory>
+ <territory type="SY">סוריה</territory>
+ <territory type="SZ" draft="provisional">סווזילנד</territory>
+ <territory type="SZ" alt="proposed" draft="provisional">סוו×זילנד</territory>
+ <territory type="TC" draft="provisional">××™×™ טורקס וק×יקוס</territory>
+ <territory type="TC" alt="proposed" draft="provisional">טרקס וקייקוס, ××™×™</territory>
+ <territory type="TD">צ׳×ד</territory>
+ <territory type="TF">טריטוריות דרומיות של צרפת</territory>
+ <territory type="TG">טוגו</territory>
+ <territory type="TH">ת×ילנד</territory>
+ <territory type="TJ" draft="provisional">טג׳יקיסטן</territory>
+ <territory type="TJ" alt="proposed" draft="provisional">טג׳יקיסט×ן</territory>
+ <territory type="TK">טוקל×ו</territory>
+ <territory type="TL">טימור המזרחית</territory>
+ <territory type="TM" draft="provisional">טורקמניסטן</territory>
+ <territory type="TM" alt="proposed" draft="provisional">טורקמניסט×ן</territory>
+ <territory type="TN">טוניסיה</territory>
+ <territory type="TO">טונגה</territory>
+ <territory type="TR">טורקיה</territory>
+ <territory type="TT" draft="provisional">טרינידד וטובגו</territory>
+ <territory type="TT" alt="proposed" draft="provisional">טריניד×ד וטובגו</territory>
+ <territory type="TV">טוב×לו</territory>
+ <territory type="TW" draft="provisional">טיוו×ן</territory>
+ <territory type="TW" alt="proposed" draft="provisional">טייוו×ן</territory>
+ <territory type="TZ">טנזניה</territory>
+ <territory type="UA">×וקר××™× ×”</territory>
+ <territory type="UG">×וגנדה</territory>
+ <territory type="UM">××™×™× ×§×˜× ×™× ×©×œ×—×•×£ ×רצות הברית</territory>
+ <territory type="US">×רצות הברית</territory>
+ <territory type="UY">×ורוגוו××™</territory>
+ <territory type="UZ" draft="provisional">×וזבקיסטן</territory>
+ <territory type="UZ" alt="proposed" draft="provisional">×וזבקיסט×ן</territory>
+ <territory type="VA" draft="provisional">הוותיקן</territory>
+ <territory type="VA" alt="proposed" draft="provisional">וטיק×ן</territory>
+ <territory type="VC">סנט וינסנט והגרנדיני×</territory>
+ <territory type="VC" alt="proposed" draft="provisional">סנט וינסנט ו××™×™ גרנ×דין</territory>
+ <territory type="VE">ונצו×לה</territory>
+ <territory type="VG" draft="provisional">××™×™ הבתולה הבריטיי×</territory>
+ <territory type="VG" alt="proposed" draft="provisional">בתולה, ××™×™ (בריטיי×)</territory>
+ <territory type="VI" draft="provisional">××™×™ הבתולה ×”×מריקניי×</territory>
+ <territory type="VI" alt="proposed" draft="provisional">בתולה, ××™×™ (×רה&quot;ב)</territory>
+ <territory type="VN">וייטנ××</territory>
+ <territory type="VU">ו×נו×טו</territory>
+ <territory type="WF">ו×ליס ופוטונה</territory>
+ <territory type="WS">סמו××”</territory>
+ <territory type="YE">תימן</territory>
+ <territory type="YT">מ×יוט</territory>
+ <territory type="ZA">×“×¨×•× ×פריקה</territory>
+ <territory type="ZM">זמביה</territory>
+ <territory type="ZW">זימב×בווה</territory>
+ </territories>
+ <keys>
+ <key type="calendar">לוח שנה</key>
+ <key type="collation">מיון</key>
+ <key type="currency">מטבע</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">לוח שנה בודהיסטי</type>
+ <type type="chinese" key="calendar">לוח שנה סיני</type>
+ <type type="gregorian" key="calendar">לוח שנה גרגורי×× ×™</type>
+ <type type="hebrew" key="calendar">לוח שנה עברי</type>
+ <type type="islamic" key="calendar">לוח שנה מוסלמי</type>
+ <type type="islamic-civil" key="calendar">לוח שנה מוסלמי-×זרחי</type>
+ <type type="japanese" key="calendar">לוח שנה יפני</type>
+ <type type="traditional" key="collation">מסורתי</type>
+ </types>
+ </localeDisplayNames>
+ <layout>
+ <orientation characters="right-to-left"/>
+ </layout>
+ <characters>
+ <exemplarCharacters>[×-×™ ×› ך ל מ × ×  ן ס ×¢ פ ×£ צ ×¥ ק-ת]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[Ö½ ׄ Ö°-Ö¹ Ö» ׂ × Ö¼ Ö¿ ׳ ×´ a-z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">ינו</month>
+ <month type="2">פבר</month>
+ <month type="3">מרץ</month>
+ <month type="4">×פר</month>
+ <month type="5">מ××™</month>
+ <month type="6">יונ</month>
+ <month type="7">יול</month>
+ <month type="8">×וג</month>
+ <month type="9">ספט</month>
+ <month type="10">×וק</month>
+ <month type="11">נוב</month>
+ <month type="12">דצמ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">ינו×ר</month>
+ <month type="2">פברו×ר</month>
+ <month type="3">מרץ</month>
+ <month type="4">×פריל</month>
+ <month type="5">מ××™</month>
+ <month type="6">יוני</month>
+ <month type="7">יולי</month>
+ <month type="8">×וגוסט</month>
+ <month type="9">ספטמבר</month>
+ <month type="10">×וקטובר</month>
+ <month type="11">נובמבר</month>
+ <month type="12">דצמבר</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">×</day>
+ <day type="mon">ב</day>
+ <day type="tue">×’</day>
+ <day type="wed">ד</day>
+ <day type="thu">×”</day>
+ <day type="fri">ו</day>
+ <day type="sat">ש</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">×™×•× ×¨×שון</day>
+ <day type="mon">×™×•× ×©× ×™</day>
+ <day type="tue">×™×•× ×©×œ×™×©×™</day>
+ <day type="wed">×™×•× ×¨×‘×™×¢×™</day>
+ <day type="thu">×™×•× ×—×ž×™×©×™</day>
+ <day type="fri">×™×•× ×©×™×©×™</day>
+ <day type="sat">שבת</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">×</day>
+ <day type="mon">ב</day>
+ <day type="tue">×’</day>
+ <day type="wed">ד</day>
+ <day type="thu">×”</day>
+ <day type="fri">ו</day>
+ <day type="sat">ש</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">רבעון ר×שון</quarter>
+ <quarter type="2">רבעון שני</quarter>
+ <quarter type="3">רבעון שלישי</quarter>
+ <quarter type="4">רבעון רביעי</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraAbbr>
+ <era type="0">לפנה״ס</era>
+ <era type="1">לסה״נ</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <dateTimeFormatLength>
+ <dateTimeFormat>
+ <pattern>{0} {1}</pattern>
+ </dateTimeFormat>
+ </dateTimeFormatLength>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName>תקופה</displayName>
+ </field>
+ <field type="year">
+ <displayName>שנה</displayName>
+ </field>
+ <field type="month">
+ <displayName>חודש</displayName>
+ </field>
+ <field type="week">
+ <displayName>שבוע</displayName>
+ </field>
+ <field type="day">
+ <displayName>יו×</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>×™×•× ×‘×©×‘×•×¢</displayName>
+ </field>
+ <field type="hour">
+ <displayName>שעה</displayName>
+ </field>
+ <field type="minute">
+ <displayName>דקה</displayName>
+ </field>
+ <field type="second">
+ <displayName>שני</displayName>
+ </field>
+ <field type="zone">
+ <displayName>×זור</displayName>
+ </field>
+ </fields>
+ </calendar>
+ <calendar type="hebrew">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1">תשרי</month>
+ <month type="2">חשון</month>
+ <month type="3">כסלו</month>
+ <month type="4">טבת</month>
+ <month type="5">שבט</month>
+ <month type="6">×דר ר×שון</month>
+ <month type="7">×דר שני</month>
+ <month type="8">ניסן</month>
+ <month type="9">×ייר</month>
+ <month type="10">סיון</month>
+ <month type="11">תמוז</month>
+ <month type="12">×ב</month>
+ <month type="13">×לול</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <eras>
+ <eraAbbr>
+ <era type="0">לבה&quot;ע</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ <calendar type="islamic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1">מוחר×</month>
+ <month type="2">ספר</month>
+ <month type="3">רביע ×ל-×וו×ל</month>
+ <month type="4">רביע ×ל-תני</month>
+ <month type="5">ג׳ומדה ×ל-×וו×ל</month>
+ <month type="6">ג׳ומדה ×ל-תני</month>
+ <month type="7">רג׳×ב</month>
+ <month type="8">שעב×ן</month>
+ <month type="9">ר×מדן</month>
+ <month type="10">שוו×ל</month>
+ <month type="11">זו ×ל-QI'DAH</month>
+ <month type="12">זו ×ל-חיג׳ה</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <eras>
+ <eraAbbr>
+ <era type="0">שנת היג׳רה</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ <calendar type="japanese">
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="provisional">ט×יקה</era>
+ <era type="24" draft="provisional">נינג'ו</era>
+ <era type="73" draft="provisional">שוטוקו</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Africa/Timbuktu">
+ <exemplarCity>×פריקה/טימבקטו</exemplarCity>
+ </zone>
+ <zone type="Europe/Belfast">
+ <exemplarCity>×ירופה/בלפסט</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Palmer">
+ <exemplarCity>×מריקה/פ×למר</exemplarCity>
+ </zone>
+ <zone type="America/Mendoza">
+ <exemplarCity>×מריקה/מנדוזה</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/San_Juan">
+ <exemplarCity>×מריקה/×רגנטינה/ס×ן-חו×ן</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity>×מריקה/קורדובה</exemplarCity>
+ </zone>
+ <zone type="America/Buenos_Aires">
+ <exemplarCity>בו×נוס ×יירס</exemplarCity>
+ </zone>
+ <zone type="Australia/Perth">
+ <exemplarCity>×וסטרליה/פרת'</exemplarCity>
+ </zone>
+ <zone type="Australia/Darwin">
+ <exemplarCity>×וסטרליה/דרווין</exemplarCity>
+ </zone>
+ <zone type="Australia/Adelaide">
+ <exemplarCity>×דלייד</exemplarCity>
+ </zone>
+ <zone type="Australia/Broken_Hill">
+ <exemplarCity>×וסטרליה/ברוקן-היל</exemplarCity>
+ </zone>
+ <zone type="Australia/Melbourne">
+ <exemplarCity>×וסטרליה/מלבורן</exemplarCity>
+ </zone>
+ <zone type="Australia/Hobart">
+ <exemplarCity>×וסטרליה/הוברט</exemplarCity>
+ </zone>
+ <zone type="Australia/Sydney">
+ <exemplarCity>×וסטרליה/סידני</exemplarCity>
+ </zone>
+ <zone type="Australia/Brisbane">
+ <exemplarCity>×וסטרליה/בריסבן</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>×מריקה/ס×ן-פ×ולו</exemplarCity>
+ </zone>
+ <zone type="America/Bahia">
+ <exemplarCity>×מריקה/בהי××”</exemplarCity>
+ </zone>
+ <zone type="America/Vancouver">
+ <exemplarCity>×מריקה/ונקובר</exemplarCity>
+ </zone>
+ <zone type="America/Dawson_Creek">
+ <exemplarCity>×מריקה/דוסון-קריק</exemplarCity>
+ </zone>
+ <zone type="America/Edmonton">
+ <exemplarCity>×מריקה/×דמנטון</exemplarCity>
+ </zone>
+ <zone type="America/Winnipeg">
+ <exemplarCity>×מריקה/וויניפוג</exemplarCity>
+ </zone>
+ <zone type="America/Toronto">
+ <exemplarCity>×מריקה/טורנטו</exemplarCity>
+ </zone>
+ <zone type="America/Montreal">
+ <exemplarCity>×מריקה/מונטרי×ול</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <exemplarCity>×מריקה/הליפקס</exemplarCity>
+ </zone>
+ <zone type="America/Santiago">
+ <exemplarCity>×מריקה/סנטי×גו</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity>×סיה/שנח××™</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity>פסיפי/גל×פגוס</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>×טלנטי/קנרי</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity>×ירופה/מדריד</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>×ירופה/לונדון</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity>×סיה/×’'קרטה</exemplarCity>
+ </zone>
+ <zone type="Asia/Oral">
+ <exemplarCity>×סיה/×ורל</exemplarCity>
+ </zone>
+ <zone type="America/Mazatlan">
+ <exemplarCity>×מריקה/מזטלן</exemplarCity>
+ </zone>
+ <zone type="America/Monterrey">
+ <exemplarCity>×מריקה/מונטריי</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>×מריקה/מקסיקו סיטי</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>×מריקה/קנקון</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuala_Lumpur">
+ <exemplarCity>קו×לה לומפור</exemplarCity>
+ </zone>
+ <zone type="Pacific/Auckland">
+ <exemplarCity>פסיפי/×וקלנד</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity>פסיפי/טהיטי</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>×ירופה/ליסבון</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>×ירופה/מוסקבה</exemplarCity>
+ </zone>
+ <zone type="Europe/Samara">
+ <exemplarCity>×ירופה/סמרה</exemplarCity>
+ </zone>
+ <zone type="Asia/Omsk">
+ <exemplarCity>××™×”/×ומסק</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity>×סיה/נובוסיבירסק</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>×ירופה/קייב</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <exemplarCity>פסיפי/הונולולו</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <exemplarCity>×מריקה/לוס-×× ×’'לס</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <exemplarCity>×מריקה/פיניקס</exemplarCity>
+ </zone>
+ <zone type="America/Shiprock">
+ <exemplarCity>×מריקה/שיפרוק</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <exemplarCity>×מריקה/דנוור</exemplarCity>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity>×מריקה/צפון דקוטה/מרכז</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <exemplarCity>×מריקה/שיקגו</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <exemplarCity>×ינדי×נפוליס</exemplarCity>
+ </zone>
+ <zone type="America/Louisville">
+ <exemplarCity>×מריקה/לו×יסוויל</exemplarCity>
+ </zone>
+ <zone type="America/Detroit">
+ <exemplarCity>×מריקה/דטרויט</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <exemplarCity>×מריקה/ניו-יורק</exemplarCity>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity>×סיה/סמרקנד</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>×סיה/טשקנט</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ADP">
+ <displayName>פזו ×נדורי</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>×פגני</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName draft="provisional">לק</displayName>
+ </currency>
+ <currency type="AMD">
+ <displayName draft="provisional">דר××</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName draft="provisional">גילדר [ANG]</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName draft="provisional">קו×× ×–×”</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName draft="provisional">קו×× ×–×” חדש</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName draft="provisional">קו×× ×–×” רג'וסטדו</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName draft="provisional">פזו ×רגנטינו</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>פזו ×רגנטינ××™</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName>שילינג ×וסטרי</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>דולר ×וסטרלי</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName draft="provisional">פלורין</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName draft="provisional">מ×× ×ט</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName draft="provisional">מ×רק בר המרה</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName draft="provisional">דולר ברבדי×× ×™</displayName>
+ </currency>
+ <currency type="BDT">
+ <displayName draft="provisional">ט×קה</displayName>
+ </currency>
+ <currency type="BEC">
+ <displayName draft="provisional">פרנק בלגי (בר המרה)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>פרנק בלגי</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName draft="provisional">לב</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName draft="provisional">לב בולגרי חדש</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>דינר בחרייני</displayName>
+ </currency>
+ <currency type="BIF">
+ <displayName>פרנק בורונדי</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName>דולר ברמודה</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>בוליבי×נו</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>פזו בוליבי</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName draft="provisional">קרוזי×רו</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName draft="provisional">קרוזדו</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>רי×ל ברזיל××™</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>דולר בה×מי</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName draft="provisional">נגולטרו×</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName draft="provisional">פולה</displayName>
+ </currency>
+ <currency type="BZD">
+ <displayName>דולר בליז××™</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>דולר קנדי</displayName>
+ </currency>
+ <currency type="CDF">
+ <displayName draft="provisional">פרנק קונגיני</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>פרנק שוויצרי</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>פזו צ'יל×× ×™</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="provisional">יו×ן</displayName>
+ <displayName alt="proposed-u80-1" draft="provisional">יו×ן רנמינבי</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName draft="provisional">קולון</displayName>
+ </currency>
+ <currency type="CSD">
+ <displayName>דינר סרבי</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName draft="provisional">קורונה צ'כית [1953-1992]</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>פזו קובני</displayName>
+ </currency>
+ <currency type="CYP">
+ <displayName>לירה קפריס×ית</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName draft="provisional">קורונה צ'כית</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>מרק מזרח גרמני</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>מרק גרמני</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName draft="provisional">פרנק [DJF]</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName>כתר דני</displayName>
+ </currency>
+ <currency type="DOP">
+ <displayName draft="provisional">פזו</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName>דינר ×לג'ירי</displayName>
+ </currency>
+ <currency type="ECS">
+ <displayName draft="provisional">סוקר</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>קרון ×סטוני</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>לירה מצרית</displayName>
+ </currency>
+ <currency type="EQE">
+ <displayName>×קוולה</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName draft="provisional">× ×קפה</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName draft="provisional">פזטה [ESA]</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName draft="provisional">פזטה [ESB]</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>פסטה ספרדי</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName draft="provisional">ביר</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>יורו</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>מרק פיני</displayName>
+ </currency>
+ <currency type="FKP">
+ <displayName draft="provisional">פ×ונד</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>פרנק צרפתי</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>לירה שטרלינג</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName draft="provisional">לרי</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>פ×ונד גיברלטר</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName draft="provisional">דלסי</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>פרנק ×’×™× ××™</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName draft="provisional">דרכמה</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName draft="provisional">קצ×ל</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>פזו ×’×™× ××™</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>דולר ×’×™×× ×™</displayName>
+ </currency>
+ <currency type="HKD">
+ <displayName>דולר הונג קונגי</displayName>
+ </currency>
+ <currency type="HNL">
+ <displayName draft="provisional">למפירה</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName draft="provisional">קונה</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName draft="provisional">×’×רד</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName draft="provisional">פורינט</displayName>
+ </currency>
+ <currency type="IDR">
+ <displayName draft="provisional">רופיה ×ינדונזית</displayName>
+ </currency>
+ <currency type="IEP">
+ <displayName>לירה ×ירית</displayName>
+ </currency>
+ <currency type="ILP">
+ <displayName>לירה ישר×לית</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>ש&quot;ח</displayName>
+ <symbol>₪</symbol>
+ </currency>
+ <currency type="INR">
+ <displayName>רופי הודית</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>דינר עירקי</displayName>
+ </currency>
+ <currency type="IRR">
+ <displayName>רי×ל ×יר×× ×™</displayName>
+ </currency>
+ <currency type="ISK">
+ <displayName>קרונה ×יסלנדית</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>לירה ×יטלקית</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>דולר ×’'מ×יקני</displayName>
+ </currency>
+ <currency type="JOD">
+ <displayName>דינר ירדני</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>ין</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>שילינג קניי×תי</displayName>
+ </currency>
+ <currency type="KGS">
+ <displayName>×¡×•× ×§×™×¨×’×™×–×™</displayName>
+ </currency>
+ <currency type="KHR">
+ <displayName draft="provisional">ריל</displayName>
+ </currency>
+ <currency type="KMF">
+ <displayName>פרנק קומורו××™</displayName>
+ </currency>
+ <currency type="KPW">
+ <displayName>וון צפון קור×× ×™</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>וון ×“×¨×•× ×§×•×¨×× ×™</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>דינר כוויתי</displayName>
+ </currency>
+ <currency type="KYD">
+ <displayName>דולר קיימ×× ×™</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName draft="provisional">טנגה</displayName>
+ </currency>
+ <currency type="LAK">
+ <displayName draft="provisional">קיפ</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>לירה לבנונית</displayName>
+ </currency>
+ <currency type="LKR">
+ <displayName>רופי סרי לנקי</displayName>
+ </currency>
+ <currency type="LRD">
+ <displayName>דולר ליברי</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName draft="provisional">לוטי</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName draft="provisional">ליט×ס</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>פרנק לוקסמבורגי</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName draft="provisional">לט</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>דינר לובי</displayName>
+ </currency>
+ <currency type="MAD">
+ <displayName draft="provisional">דירה×</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName draft="provisional">פרנק מ×לי</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>לי×ו מולדובני</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>פרנק מדגסק×רי</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName draft="provisional">קי×ט</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName draft="provisional">טוגרוג</displayName>
+ </currency>
+ <currency type="MOP">
+ <displayName draft="provisional">פטקה</displayName>
+ </currency>
+ <currency type="MTL">
+ <displayName>לירה מלטית</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>רופי מ×וריציני</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName draft="provisional">רופיה</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName draft="provisional">ק×ווצ'×”</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName>פזו מקסיקני</displayName>
+ </currency>
+ <currency type="MXP">
+ <displayName draft="provisional">פזו מקסיקני (1861 - 1992)</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName draft="provisional">מטיקל</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName>דולר נמיבי</displayName>
+ </currency>
+ <currency type="NGN">
+ <displayName draft="provisional">× ×ירה</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName draft="provisional">קורדובה</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName draft="provisional">גילדר</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>כתר נורבגי</displayName>
+ </currency>
+ <currency type="NPR">
+ <displayName>רופי נפ×לי</displayName>
+ </currency>
+ <currency type="NZD">
+ <displayName>דולר ניו זילנדי</displayName>
+ </currency>
+ <currency type="PAB">
+ <displayName draft="provisional">בלבו××”</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName draft="provisional">סול</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName draft="provisional">קינה</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>פזו פיליפיני</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>רופיה פקיסטנית</displayName>
+ </currency>
+ <currency type="PLN">
+ <displayName>זלוטי פולני</displayName>
+ </currency>
+ <currency type="PLZ">
+ <displayName draft="provisional">זלוטי (1950 - 1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName draft="provisional">×סקודו</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName draft="provisional">גוו×רני</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>רי×ל קט×רי</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName draft="provisional">ל×ו</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>רובל</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>רובל רוסי (1991 - 1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>פרנק רו×נדי</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>רי×ל סעודי</displayName>
+ </currency>
+ <currency type="SBD">
+ <displayName>דולר ××™×™ שלמה</displayName>
+ </currency>
+ <currency type="SCR">
+ <displayName>רופי סיישלי</displayName>
+ </currency>
+ <currency type="SDD">
+ <displayName>דינר סודני</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>לירה סודנית</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>כתר שוודי</displayName>
+ </currency>
+ <currency type="SGD">
+ <displayName>דולר סינגפורי</displayName>
+ </currency>
+ <currency type="SHP">
+ <displayName>פ×ונד סנט הלני</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName draft="provisional">טולר</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>קורונה סלובקית</displayName>
+ </currency>
+ <currency type="SLL">
+ <displayName draft="provisional">לי×ון</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>שילינג סומ×לי</displayName>
+ </currency>
+ <currency type="SRD">
+ <displayName>דולר סורינ×מי</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>גילדר סורינ×מי</displayName>
+ </currency>
+ <currency type="STD">
+ <displayName draft="provisional">דוברה</displayName>
+ </currency>
+ <currency type="SUR">
+ <displayName>רובל סובייטי</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>לירה סורית</displayName>
+ </currency>
+ <currency type="SZL">
+ <displayName draft="provisional">לילנגני</displayName>
+ </currency>
+ <currency type="THB">
+ <displayName draft="provisional">בהט</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>סומוני טג'קיסטני</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>מנ×ט טורקמ×× ×™</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>דינר טוניס××™</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName draft="provisional">פ×× ×’×”</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>×סקודו טימור××™</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>לירה טורקית</displayName>
+ </currency>
+ <currency type="TRY">
+ <displayName>לירה טורקית חדשה</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>דולר טרינידדי</displayName>
+ </currency>
+ <currency type="TWD">
+ <displayName>דולר ט×ייוני חדש</displayName>
+ </currency>
+ <currency type="TZS">
+ <displayName>שילינג טנזני</displayName>
+ </currency>
+ <currency type="UAH">
+ <displayName draft="provisional">הריבניה</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>שילינג ×וגנדי (1966 - 1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>שילינג ×וגנדי</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>דולר ×מריק××™</displayName>
+ </currency>
+ <currency type="USN">
+ <displayName>דולר ×מריק××™ (×”×™×•× ×”×‘×)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>דולר ×מריק××™ (×”×™×•× ×”×–×”)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>פזו ×ורוגוו××™</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName>×¡×•× ×וזבקי</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>בוליבר ונצו×לי</displayName>
+ </currency>
+ <currency type="VND">
+ <displayName draft="provisional">דונג</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName draft="provisional">ו×טו</displayName>
+ </currency>
+ <currency type="WST">
+ <displayName draft="provisional">טלה</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName draft="provisional">פרנק [XAF]</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName draft="provisional">×ונקיה של כסף</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName draft="provisional">×ונקיה של זהב</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>דולר מזרח קריבי</displayName>
+ </currency>
+ <currency type="XDR">
+ <displayName>זכויות משיכה מיוחדות</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName draft="provisional">פרנק זהב</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName draft="provisional">×ונקיה של פלדיו×</displayName>
+ </currency>
+ <currency type="XPT">
+ <displayName draft="provisional">×ונקיה של פלטיניו×</displayName>
+ </currency>
+ <currency type="XTS">
+ <displayName>סימון למטרות בדיקה</displayName>
+ </currency>
+ <currency type="XXX">
+ <displayName>סימון &quot;×œ×œ× ×ž×˜×‘×¢&quot;</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>דינר תימני</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>רי×ל תימני</displayName>
+ </currency>
+ <currency type="YUD">
+ <displayName draft="provisional">דינר יגוסלבי חדש</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName draft="provisional">דינר יגוסלבי</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>ר×נד ×“×¨×•× ×פריק××™ (כספי)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName draft="provisional">ר×נד</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName draft="provisional">קוו×צ'×”</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>×–×יר חדש</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>דולר זימבבו××™</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>כן:כ</yesstr>
+ <nostr>ל×:ל</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/he_IL.xml b/libs/Zend/Locale/Data/he_IL.xml
new file mode 100755
index 0000000000..340162520c
--- /dev/null
+++ b/libs/Zend/Locale/Data/he_IL.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.40 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="he"/>
+ <territory type="IL"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart>&quot;</alternateQuotationStart>
+ <alternateQuotationEnd>&quot;</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/hi.xml b/libs/Zend/Locale/Data/hi.xml
new file mode 100755
index 0000000000..c5ed17fbba
--- /dev/null
+++ b/libs/Zend/Locale/Data/hi.xml
@@ -0,0 +1,493 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.56 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="hi"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">अफ़ार</language>
+ <language type="ab">अबà¥à¤–ाज़ियनà¥</language>
+ <language type="af">अफà¥à¤°à¥€à¤•à¥€</language>
+ <language type="am">अमà¥à¤¹à¤¾à¤°à¤¿à¤•à¥</language>
+ <language type="ar">अरबी</language>
+ <language type="as">असामी</language>
+ <language type="ay">आयमारा</language>
+ <language type="az">अज़रबैंजानी</language>
+ <language type="ba">बशख़िर</language>
+ <language type="be">बैलोरूशियनà¥</language>
+ <language type="bg">बलà¥à¤—ेरियनà¥</language>
+ <language type="bh">बिहारी</language>
+ <language type="bi">बिसà¥à¤²à¤¾à¤®à¤¾</language>
+ <language type="bn">बà¤à¤—ाली</language>
+ <language type="bo">तिबà¥à¤¬à¤¤à¥€</language>
+ <language type="br">बà¥à¤°à¥‡à¤Ÿà¤¨</language>
+ <language type="ca">कातालान</language>
+ <language type="co">कोरà¥à¤¸à¥€à¤•à¤¨</language>
+ <language type="cs">चेक</language>
+ <language type="cy">वेलà¥à¤¶</language>
+ <language type="da">डैनीश</language>
+ <language type="de">ज़रà¥à¤®à¤¨</language>
+ <language type="dz">भà¥à¤Ÿà¤¾à¤¨à¥€</language>
+ <language type="el">गà¥à¤°à¥€à¤•</language>
+ <language type="en">अंगà¥à¤°à¥‡à¤œà¥€</language>
+ <language type="eo">à¤à¤¸à¥à¤ªà¥‡à¤°à¤¾à¤¨à¥à¤¤à¥‹</language>
+ <language type="es">सà¥à¤ªà¥‡à¤¨à¤¿à¤¶</language>
+ <language type="et">à¤à¤¸à¥à¤¤à¥‹à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="eu">बासà¥à¤•à¥</language>
+ <language type="fa">परà¥à¤¶à¤¿à¤¯à¤¨à¥</language>
+ <language type="fi">फिनिश</language>
+ <language type="fj">फ़ीजी</language>
+ <language type="fo">फिरोज़ी</language>
+ <language type="fr">फà¥à¤°à¥‡à¤‚च</language>
+ <language type="fy">फà¥à¤°à¥€à¤œà¤¼à¤¨à¥</language>
+ <language type="ga">आईरिश</language>
+ <language type="gd">सà¥à¤•à¤¾à¤Ÿà¥à¤¸à¥ गायेलिकà¥</language>
+ <language type="gl">गैलिशियनà¥</language>
+ <language type="gn">गà¥à¤†à¤°à¤¾à¤¨à¥€</language>
+ <language type="gu">गà¥à¤œà¤¼à¤°à¤¾à¤¤à¥€</language>
+ <language type="ha">होउसा</language>
+ <language type="he">हिबà¥à¤°à¥€à¤Š</language>
+ <language type="hi">हिंदी</language>
+ <language type="hr">कà¥à¤°à¥‹à¤à¤¶à¤¨à¥</language>
+ <language type="hu">हंगेरी</language>
+ <language type="hy">अरमेनियनà¥</language>
+ <language type="ia">ईनà¥à¤Ÿà¤°à¤²à¤¿à¤‚गà¥à¤†</language>
+ <language type="id">इनà¥à¤¡à¥‹à¤¨à¥‡à¤¶à¤¿à¤¯à¤¨à¥</language>
+ <language type="ie">ईनà¥à¤Ÿà¤°à¤²à¤¿à¤‚गà¥à¤‡</language>
+ <language type="ik">इनà¥à¤ªà¤¿à¤¯à¤¾à¤•à¥</language>
+ <language type="is">आईसà¥à¤²à¥ˆà¤‚डिकà¥</language>
+ <language type="it">ईटालियनà¥</language>
+ <language type="iu">इनूकीटूतà¥</language>
+ <language type="ja">जापानी</language>
+ <language type="jv">जावानीस</language>
+ <language type="ka">जॉरà¥à¤œà¥€à¤¯à¤¨à¥</language>
+ <language type="kk">कज़ाख</language>
+ <language type="kl">गà¥à¤°à¥€à¤¨à¤²à¥ˆà¤‚डिक</language>
+ <language type="km">कैमà¥à¤¬à¥‹à¤¡à¤¿à¤¯à¤¨à¥</language>
+ <language type="kn">कनà¥à¤¨à¤¡à¤¼</language>
+ <language type="ko">कोरीयनà¥</language>
+ <language type="kok">कोंकणी</language>
+ <language type="ks">काशà¥à¤®à¤¿à¤°à¥€</language>
+ <language type="ku">कà¥à¤°à¤¦à¥€à¤¶</language>
+ <language type="ky">किरघिज़</language>
+ <language type="la">लैटीन</language>
+ <language type="ln">लिंगाला</language>
+ <language type="lo">लाओथीयनà¥</language>
+ <language type="lt">लिथà¥à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="lv">लाटवियनॠ(लेटà¥à¤Ÿà¥€à¤¶)</language>
+ <language type="mg">मालागासी</language>
+ <language type="mi">मेओरी</language>
+ <language type="mk">मैसेडोनियनà¥</language>
+ <language type="ml">मलयालम</language>
+ <language type="mn">मोंगोलियन</language>
+ <language type="mo">मोलडावियनà¥</language>
+ <language type="mr">मराठी</language>
+ <language type="ms">मलय</language>
+ <language type="mt">मालटिसà¥</language>
+ <language type="my">बरà¥à¤²à¤¿à¤¸</language>
+ <language type="na">नायरू</language>
+ <language type="ne">नेपाली</language>
+ <language type="nl">डचà¥</language>
+ <language type="no">नारà¥à¤µà¥‡à¤œà¥€à¤¯à¤¨à¥</language>
+ <language type="oc">ओसीटान</language>
+ <language type="om">ओरोमो (अफ़ान)</language>
+ <language type="or">उड़िया</language>
+ <language type="pa">पंजाबी</language>
+ <language type="pl">पॉलिश</language>
+ <language type="ps">पॉशतो (पà¥à¤¶à¤¤à¥‹)</language>
+ <language type="pt">पà¥à¤°à¥à¤¤à¥à¤—ी</language>
+ <language type="qu">कà¥à¤µà¥‡à¤¶à¥à¤†</language>
+ <language type="raj">राजेसà¥à¤¥à¤¾à¤¨à¥€</language>
+ <language type="rm">रहेयà¥à¤Ÿà¥‹-रोमानà¥à¤¸</language>
+ <language type="rn">किरूनà¥à¤¦à¥€</language>
+ <language type="ro">रूमानीयनà¥</language>
+ <language type="root">शिखर</language>
+ <language type="ru">रà¥à¤¸à¥€</language>
+ <language type="rw">किनà¥à¤¯à¤¾à¤°à¤µà¤¾à¤£à¥à¤¡à¤¾</language>
+ <language type="sa">संसà¥à¤•à¥ƒà¤¤</language>
+ <language type="sd">सिनà¥à¤§à¥€</language>
+ <language type="sg">साà¤à¤—à¥à¤°à¥‹</language>
+ <language type="sh">सेरà¥à¤¬à¥‹-कà¥à¤°à¥‹à¤à¤¶à¤¨à¥</language>
+ <language type="si">शिंघालीसà¥</language>
+ <language type="sk">सà¥à¤²à¥‹à¤µà¤¾à¤•à¥</language>
+ <language type="sl">सà¥à¤²à¥‹à¤µà¥‡à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="sm">सामोन</language>
+ <language type="sn">सोणा</language>
+ <language type="so">सोमाली</language>
+ <language type="sq">अलà¥à¤¬à¥‡à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="sr">सरà¥à¤¬à¤¿à¤¯à¤¨à¥</language>
+ <language type="ss">सीसà¥à¤µà¤¾à¤Ÿà¤¿</language>
+ <language type="st">सेसोथो</language>
+ <language type="su">सà¥à¤¨à¥à¤¦à¤¾à¤¨à¥€à¤¸</language>
+ <language type="sv">सà¥à¤µà¤¿à¤¡à¤¿à¤¶</language>
+ <language type="sw">सà¥à¤µà¤¾à¤¹à¤¿à¤²à¥€</language>
+ <language type="ta">तमिल</language>
+ <language type="te">तेलेगà¥</language>
+ <language type="tg">ताजिकà¥</language>
+ <language type="th">थाई</language>
+ <language type="ti">तिगà¥à¤°à¥€à¤¨à¥à¤¯à¤¾</language>
+ <language type="tk">तà¥à¤•à¥à¤°à¤®à¥‡à¤¨</language>
+ <language type="tl">तागालोग</language>
+ <language type="tn">सेतà¥à¤¸à¥à¤µà¤¾à¤¨à¤¾</language>
+ <language type="to">टोंगा</language>
+ <language type="tr">तà¥à¤•à¥à¤°à¥€à¤¶</language>
+ <language type="ts">सोंगा</language>
+ <language type="tt">टाटर</language>
+ <language type="tw">टà¥à¤µà¥€</language>
+ <language type="ug">उईघà¥à¤°</language>
+ <language type="uk">यूकà¥à¤°à¥‡à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="ur">ऊरà¥à¤¦à¥</language>
+ <language type="uz">उज़बेकà¥</language>
+ <language type="vi">वियेतनामी</language>
+ <language type="vo">वोलापà¥à¤•</language>
+ <language type="wo">वोलोफ</language>
+ <language type="xh">षोसा</language>
+ <language type="yi">येहà¥à¤¦à¥€</language>
+ <language type="yo">योरूबा</language>
+ <language type="za">ज़à¥à¤†à¤‚ग</language>
+ <language type="zh">चीनी</language>
+ <language type="zu">ज़à¥à¤²à¥‚</language>
+ </languages>
+ <scripts>
+ <script type="Arab">अरबिक</script>
+ <script type="Cyrl">सिरिलिक</script>
+ <script type="Deva">देवनगरि</script>
+ <script type="Hans">चीनी सरल लिपि</script>
+ <script type="Hant">चीनी पà¥à¤°à¤¾à¤šà¥€à¤¨ लिपि</script>
+ <script type="Latn">लाटिन</script>
+ </scripts>
+ <territories>
+ <territory type="AD">अनà¥à¤¡à¥‹à¤°à¤¾</territory>
+ <territory type="AE">संयà¥à¤•à¥à¤¤ अरब अमीरात</territory>
+ <territory type="AF">अफगानिसà¥à¤¤à¤¾à¤¨</territory>
+ <territory type="AG">à¤à¤¨à¥à¤Ÿà¤¿à¤—à¥à¤µà¤¾ और बारबूडा</territory>
+ <territory type="AL">अलà¥à¤¬à¤¾à¤¨à¤¿à¤¯à¤¾</territory>
+ <territory type="AM">आरà¥à¤®à¥‡à¤¨à¤¿à¤¯à¤¾</territory>
+ <territory type="AO">अंगोला</territory>
+ <territory type="AR">अरà¥à¤œà¥‡à¤¨à¥à¤Ÿà¥€à¤¨à¤¾</territory>
+ <territory type="AT">ऑसà¥à¤Ÿà¥à¤°à¤¿à¤¯à¤¾</territory>
+ <territory type="AU">ऑसà¥à¤Ÿà¥à¤°à¥‡à¤²à¤¿à¤¯à¤¾</territory>
+ <territory type="AZ">अजरबैजान</territory>
+ <territory type="BA">बोसनिया हरà¥à¤œà¤¿à¤—ोविना</territory>
+ <territory type="BB">बारबाडोस</territory>
+ <territory type="BD">बंगलादेश</territory>
+ <territory type="BE">बेलà¥à¤œà¤¿à¤¯à¤®</territory>
+ <territory type="BF">बरà¥à¤•à¤¿à¤¨à¤¾ फासो</territory>
+ <territory type="BG">बà¥à¤²à¥à¤—ारिया</territory>
+ <territory type="BH">बहरैन</territory>
+ <territory type="BI">बà¥à¤°à¥à¤‚डी</territory>
+ <territory type="BJ">बेनिन</territory>
+ <territory type="BN">बà¥à¤°à¥‚नइ</territory>
+ <territory type="BO">बोलीविया</territory>
+ <territory type="BR">बà¥à¤°à¤¾à¤œà¥€à¤²</territory>
+ <territory type="BS">बहामा</territory>
+ <territory type="BT">भूटान</territory>
+ <territory type="BW">बोतà¥à¤¸à¥à¤µà¤¾à¤¨à¤¾</territory>
+ <territory type="BY">बेलारूस</territory>
+ <territory type="BZ">बेलिज</territory>
+ <territory type="CA">कनाडा</territory>
+ <territory type="CC">किंशासा</territory>
+ <territory type="CF">सेंटà¥à¤°à¤² अफà¥à¤°à¥€à¤•à¤¨ रिपबà¥à¤²à¤¿à¤•</territory>
+ <territory type="CG">कांगो</territory>
+ <territory type="CH">सà¥à¤µà¤¿à¤¸</territory>
+ <territory type="CI">आईवरी कोसà¥à¤Ÿ</territory>
+ <territory type="CL">चिली</territory>
+ <territory type="CM">कामेरान</territory>
+ <territory type="CN">चीन</territory>
+ <territory type="CO">कोलमà¥à¤¬à¤¿à¤¯à¤¾</territory>
+ <territory type="CR">कोसà¥à¤Ÿà¤¾à¤°à¥€à¤•à¤¾</territory>
+ <territory type="CU">कà¥à¤¯à¥‚बा</territory>
+ <territory type="CV">कैप वरà¥à¤¤</territory>
+ <territory type="CY">साइपà¥à¤°à¤¸</territory>
+ <territory type="CZ">चेक गणराजà¥à¤¯</territory>
+ <territory type="DE">जरà¥à¤®à¤¨à¥€</territory>
+ <territory type="DJ">जिबूती</territory>
+ <territory type="DK">डेनमारà¥à¤•</territory>
+ <territory type="DM">डोमिनिका</territory>
+ <territory type="DO">डोमिनिकन गणराजà¥à¤¯</territory>
+ <territory type="DZ">अलà¥à¤œà¥€à¤°à¤¿à¤¯à¤¾</territory>
+ <territory type="EC">इकà¥à¤µà¤¾à¤¡à¥‹à¤°</territory>
+ <territory type="EE">à¤à¤¸à¥à¤Ÿà¥‹à¤¨à¤¿à¤¯à¤¾</territory>
+ <territory type="EG">मिसà¥à¤°</territory>
+ <territory type="EH">पशà¥à¤šà¤¿à¤®à¥€ सहारा</territory>
+ <territory type="ER">इरिटà¥à¤°à¤¿à¤¯à¤¾</territory>
+ <territory type="ES">सà¥à¤ªà¥‡à¤¨</territory>
+ <territory type="ET">इथियोपिया</territory>
+ <territory type="FI">फिनलैंड</territory>
+ <territory type="FJ">फिजी</territory>
+ <territory type="FR">फà¥à¤°à¤¾à¤‚स</territory>
+ <territory type="GB">बà¥à¤°à¤¿à¤¤à¤¨</territory>
+ <territory type="GR">गà¥à¤°à¥€à¤¸</territory>
+ <territory type="GT">गोतेदाला</territory>
+ <territory type="GW">गीनी-बिसाउ</territory>
+ <territory type="GY">गà¥à¤¯à¤¾à¤¨à¤¾</territory>
+ <territory type="HN">हाणà¥à¤¡à¥‚रस</territory>
+ <territory type="HR">कà¥à¤°à¥‹à¤¶à¤¿à¤¯à¤¾</territory>
+ <territory type="HT">हाइती</territory>
+ <territory type="HU">हंगरी</territory>
+ <territory type="ID">इंडोनेशिया</territory>
+ <territory type="IE">आयरलैंड</territory>
+ <territory type="IL">इसराइल</territory>
+ <territory type="IN">भारत</territory>
+ <territory type="IQ">इराक</territory>
+ <territory type="IR">ईरान</territory>
+ <territory type="IS">आइसलैंड</territory>
+ <territory type="IT">इटली</territory>
+ <territory type="JM">जमाइका</territory>
+ <territory type="JO">जोरà¥à¤¡à¤¨</territory>
+ <territory type="JP">जापान</territory>
+ <territory type="KE">केनà¥à¤¯à¤¾</territory>
+ <territory type="KG">किरà¥à¤—िज</territory>
+ <territory type="KH">कमà¥à¤¬à¥‹à¤¡à¤¿à¤¯à¤¾</territory>
+ <territory type="KM">कोमोरस</territory>
+ <territory type="KN">सेंट किटà¥à¤¸ और नेविस</territory>
+ <territory type="KP">उतà¥à¤¤à¤° कोरिया</territory>
+ <territory type="KR">दकà¥à¤·à¤¿à¤£ कोरिया</territory>
+ <territory type="KW">कà¥à¤µà¥ˆà¤¤</territory>
+ <territory type="KZ">कजाखसà¥à¤¤à¤¾à¤¨</territory>
+ <territory type="LA">लाओस</territory>
+ <territory type="LB">लेबनान</territory>
+ <territory type="LC">सेंट लूसिया</territory>
+ <territory type="LI">लिकटेंसà¥à¤Ÿà¥€à¤¨</territory>
+ <territory type="LK">शà¥à¤°à¥€à¤²à¤‚का</territory>
+ <territory type="LR">लाइबेरिया</territory>
+ <territory type="LS">लेसोथो</territory>
+ <territory type="LT">लिथà¥à¤†à¤¨à¤¿à¤¯à¤¾</territory>
+ <territory type="LU">लकà¥à¤¸à¤®à¤¬à¤°à¥à¤—</territory>
+ <territory type="LV">लातà¥à¤µà¤¿à¤¯à¤¾</territory>
+ <territory type="LY">लीबिया</territory>
+ <territory type="MA">मोरकà¥à¤•à¥‹</territory>
+ <territory type="MC">मोनाको</territory>
+ <territory type="MD">मोलà¥à¤¡à¤¾à¤µà¤¿à¤¯à¤¾</territory>
+ <territory type="MG">मदागासà¥à¤•à¤°</territory>
+ <territory type="MK">मैसेडोनिया</territory>
+ <territory type="ML">माली</territory>
+ <territory type="MM">मà¥à¤¯à¤¾à¤¨à¤®à¤¾à¤°</territory>
+ <territory type="MN">मंगोलिया</territory>
+ <territory type="MR">मॉरिटानिया</territory>
+ <territory type="MT">मालà¥à¤Ÿà¤¾</territory>
+ <territory type="MU">मौरिस</territory>
+ <territory type="MV">मालदीव</territory>
+ <territory type="MW">मलावी</territory>
+ <territory type="MX">मेकà¥à¤¸à¤¿à¤•à¥‹</territory>
+ <territory type="MY">मलेशिया</territory>
+ <territory type="MZ">मोजामà¥à¤¬à¤¿à¤•</territory>
+ <territory type="PA">पनामा</territory>
+ <territory type="PE">पेरू</territory>
+ <territory type="PG">पापà¥à¤† नà¥à¤¯à¥‚ गिनी</territory>
+ <territory type="PH">फिलीपिंस</territory>
+ <territory type="PK">पाकिसà¥à¤¤à¤¾à¤¨</territory>
+ <territory type="PL">पोलैंड</territory>
+ <territory type="PT">पà¥à¤°à¥à¤¤à¤—ाल</territory>
+ <territory type="PY">पारागà¥à¤</territory>
+ <territory type="QA">कतर</territory>
+ <territory type="RO">रोमानिया</territory>
+ <territory type="RU">रूस</territory>
+ <territory type="RW">रूआणà¥à¤¡à¤¾</territory>
+ <territory type="SA">सऊदी अरब</territory>
+ <territory type="SD">सूडान</territory>
+ <territory type="SE">सà¥à¤µà¥€à¤¡à¤¨</territory>
+ <territory type="SG">सिंगापà¥à¤°</territory>
+ <territory type="SI">सà¥à¤²à¥‹à¤µà¥‡à¤¨à¤¿à¤¯à¤¾</territory>
+ <territory type="SK">सà¥à¤²à¥‹à¤µà¤¾à¤•à¤¿à¤¯à¤¾</territory>
+ <territory type="SL">सियरालेओन</territory>
+ <territory type="SM">सैन मेरीनो</territory>
+ <territory type="SN">सेनेगल</territory>
+ <territory type="SO">सोमालिया</territory>
+ <territory type="SR">सà¥à¤°à¤¿à¤¨à¤¾à¤®</territory>
+ <territory type="ST">साउ-तोम-पà¥à¤°à¤¿à¤‚सिप</territory>
+ <territory type="SV">अल सालà¥à¤µà¤¾à¤¡à¥‹à¤°</territory>
+ <territory type="SY">सीरिया</territory>
+ <territory type="SZ">सà¥à¤†à¤œà¥€à¤²à¥ˆà¤‚ड</territory>
+ <territory type="TD">चाड</territory>
+ <territory type="TG">टोगो</territory>
+ <territory type="TH">थाइलैंड</territory>
+ <territory type="TJ">ताजिकिसà¥à¤¤à¤¾à¤¨</territory>
+ <territory type="TM">तà¥à¤°à¥à¤•à¤®à¥‡à¤¨à¤¿à¤¸à¥à¤¤à¤¾à¤¨</territory>
+ <territory type="TN">तà¥à¤¨à¤¿à¤¶à¤¿à¤¯à¤¾</territory>
+ <territory type="TO">टोंगा</territory>
+ <territory type="TR">तà¥à¤°à¥à¤•à¥€</territory>
+ <territory type="TT">टà¥à¤°à¤¿à¤¨à¤¿à¤¡à¤¾à¤¡ और टोबैगो</territory>
+ <territory type="TV">तà¥à¤µà¤¾à¤²à¥</territory>
+ <territory type="TW">ताइवान</territory>
+ <territory type="TZ">तंजानिया</territory>
+ <territory type="UA">यूकà¥à¤°à¥‡à¤¨</territory>
+ <territory type="UG">यà¥à¤—ांडा</territory>
+ <territory type="US">संयà¥à¤•à¥à¤¤ राजà¥à¤¯ अमरिका</territory>
+ <territory type="UY">यà¥à¤°à¥‚गà¥à¤</territory>
+ <territory type="UZ">उजबेकिसà¥à¤¤à¤¾à¤¨</territory>
+ <territory type="VA">वैटिकन</territory>
+ <territory type="VE">वेनेजà¥à¤à¤²à¤¾</territory>
+ <territory type="VG">बà¥à¤°à¤¿à¤Ÿà¤¿à¤¶ वरà¥à¤œà¥€à¤¨ ऌईलैंडसà¥</territory>
+ <territory type="VI">ईउ, à¤à¤¸ वरà¥à¤œà¥€à¤¨ आईलैंडसà¥</territory>
+ <territory type="VN">वियतनाम</territory>
+ <territory type="VU">वानà¥à¤…तà¥</territory>
+ <territory type="YE">यमन</territory>
+ <territory type="ZA">दकà¥à¤·à¤¿à¤£ अफà¥à¤°à¥€à¤•à¤¾</territory>
+ <territory type="ZM">जामà¥à¤¬à¤¿à¤¯à¤¾</territory>
+ <territory type="ZW">जिमà¥à¤¬à¤¾à¤¬à¥à¤µà¥‡</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[ॠ०-९ अ-ठà¤-ऑ ओ-न प-र ल ळ व-ह ़ à¤-ः ऽ ॠा-ॅ े-ॉ ो ौ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">जनवरी</month>
+ <month type="2">फरवरी</month>
+ <month type="3">मारà¥à¤š</month>
+ <month type="4">अपà¥à¤°à¥ˆà¤²</month>
+ <month type="5">मई</month>
+ <month type="6">जून</month>
+ <month type="7">जà¥à¤²à¤¾à¤ˆ</month>
+ <month type="8">अगसà¥à¤¤</month>
+ <month type="9">सितमà¥à¤¬à¤°</month>
+ <month type="10">अकà¥à¤¤à¥‚बर</month>
+ <month type="11">नवमà¥à¤¬à¤°</month>
+ <month type="12">दिसमà¥à¤¬à¤°</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">जनवरी</month>
+ <month type="2">फरवरी</month>
+ <month type="3">मारà¥à¤š</month>
+ <month type="4">अपà¥à¤°à¥ˆà¤²</month>
+ <month type="5">मई</month>
+ <month type="6">जून</month>
+ <month type="7">जà¥à¤²à¤¾à¤ˆ</month>
+ <month type="8">अगसà¥à¤¤</month>
+ <month type="9">सितमà¥à¤¬à¤°</month>
+ <month type="10">अकà¥à¤¤à¥‚बर</month>
+ <month type="11">नवमà¥à¤¬à¤°</month>
+ <month type="12">दिसमà¥à¤¬à¤°</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">रवि</day>
+ <day type="mon">सोम</day>
+ <day type="tue">मंगल</day>
+ <day type="wed">बà¥à¤§</day>
+ <day type="thu">गà¥à¤°à¥</day>
+ <day type="fri">शà¥à¤•à¥à¤°</day>
+ <day type="sat">शनि</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">रविवार</day>
+ <day type="mon">सोमवार</day>
+ <day type="tue">मंगलवार</day>
+ <day type="wed">बà¥à¤§à¤µà¤¾à¤°</day>
+ <day type="thu">गà¥à¤°à¥à¤µà¤¾à¤°</day>
+ <day type="fri">शà¥à¤•à¥à¤°à¤µà¤¾à¤°</day>
+ <day type="sat">शनिवार</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">पॆहला हंत 1</quarter>
+ <quarter type="2" draft="unconfirmed">दूसरा हंत 2</quarter>
+ <quarter type="3" draft="unconfirmed">तीसरा हंत 3</quarter>
+ <quarter type="4" draft="unconfirmed">चौता हंत 4</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>पूरà¥à¤µà¤¾à¤¹à¥à¤¨</am>
+ <pm>अपराहà¥à¤¨</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">ईसापूरà¥à¤µ</era>
+ <era type="1">सन</era>
+ </eraAbbr>
+ </eras>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="GGGGyMMMMEEEEdd" draft="provisional">EEEE,dd MMMM GGGGy</dateFormatItem>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="MMMdd" draft="provisional">MMM dd</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="yyMMMEEEd" draft="provisional">EEE, MMM d, yy</dateFormatItem>
+ <dateFormatItem id="yyMMMd" draft="provisional">MMM d, yy</dateFormatItem>
+ <dateFormatItem id="yyMMdd" draft="provisional">dd-MM-yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Asia/Calcutta">
+ <long>
+ <standard>भारतीय समय</standard>
+ <daylight>भारतीय समय</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IST</daylight>
+ </short>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <nativeZeroDigit>०</nativeZeroDigit>
+ </symbols>
+ <currencies>
+ <currency type="BRL">
+ <displayName>रीयाल</displayName>
+ <symbol>रीयाल</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>यà¥à¤µà¤¾à¤¨</displayName>
+ <symbol>यà¥à¤µà¤¾à¤¨</symbol>
+ </currency>
+ <currency type="CSD">
+ <displayName>सरà¥à¤¬à¤¿à¤¯ का ढीनार</displayName>
+ <symbol>स. ढीनार</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>यà¥à¤°à¥‹</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>फ़िजी का डालर</displayName>
+ <symbol>फ़िजी का डालर</symbol>
+ </currency>
+ <currency type="GBP">
+ <displayName>बà¥à¤°à¤¿à¤¤à¤¨ का पौनà¥à¤¡ सà¥à¤Ÿà¤°à¥à¤²à¤¿à¤—</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>भारतीय रूपया</displayName>
+ <symbol>रà¥.</symbol>
+ </currency>
+ <currency type="ITL">
+ <displayName>इतली का लीरा</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>जापानी येन</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>रूसी रूबल</displayName>
+ <symbol>रूबल</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>अमरीकी डालर</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">हाà¤</yesstr>
+ <nostr draft="unconfirmed">नहीं</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/hi_IN.xml b/libs/Zend/Locale/Data/hi_IN.xml
new file mode 100755
index 0000000000..e583cfd468
--- /dev/null
+++ b/libs/Zend/Locale/Data/hi_IN.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.45 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="hi"/>
+ <territory type="IN"/>
+ </identity>
+ <delimiters>
+ <quotationStart>'</quotationStart>
+ <quotationEnd>'</quotationEnd>
+ <alternateQuotationStart>&quot;</alternateQuotationStart>
+ <alternateQuotationEnd>&quot;</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d-M-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/hr.xml b/libs/Zend/Locale/Data/hr.xml
new file mode 100755
index 0000000000..601f84a600
--- /dev/null
+++ b/libs/Zend/Locale/Data/hr.xml
@@ -0,0 +1,1235 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.68 $"/>
+ <generation date="$Date: 2006/10/26 22:46:08 $"/>
+ <language type="hr"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ang">engleski, stari (ca.450-1100)</language>
+ <language type="apa">apaški</language>
+ <language type="ar">arapski</language>
+ <language type="art">umjetni (ostali)</language>
+ <language type="av">avarski</language>
+ <language type="bat">baltiÄki (ostali)</language>
+ <language type="be">bjeloruski</language>
+ <language type="bg">bugarski</language>
+ <language type="cel">keltski (ostali)</language>
+ <language type="cs">ÄeÅ¡ki</language>
+ <language type="cu">crkvenoslavenski</language>
+ <language type="cy">velški</language>
+ <language type="da">danski</language>
+ <language type="de">njemaÄki</language>
+ <language type="dum">nizozemski, srednji (ca. 1050-1350)</language>
+ <language type="egy">egipatski (antiÄki)</language>
+ <language type="el">grÄki</language>
+ <language type="en">engleski</language>
+ <language type="enm">engleski, srednji (1100-1500)</language>
+ <language type="eo">esperanto</language>
+ <language type="es">Å¡panjolski</language>
+ <language type="et">estonijski</language>
+ <language type="fa">perzijski</language>
+ <language type="fi">finski</language>
+ <language type="fr">francuski</language>
+ <language type="frm">francuski, srednji (ca.1400-1600)</language>
+ <language type="fro">francuski, stari (842-ca.1400)</language>
+ <language type="fy">frizijski</language>
+ <language type="ga">irski</language>
+ <language type="gem">germanski (ostali)</language>
+ <language type="gmh">njemaÄki, srednji visoki (ca.1050-1500)</language>
+ <language type="goh">njemaÄki, stari visoki (ca.750-1050)</language>
+ <language type="grc">grÄki, antiÄki (do 1453)</language>
+ <language type="haw">havajski</language>
+ <language type="he">hebrejski</language>
+ <language type="hr">hrvatski</language>
+ <language type="hu">mađarski</language>
+ <language type="hy">armenski</language>
+ <language type="inc">indijski (drugi)</language>
+ <language type="ine">indoevropski (drugi)</language>
+ <language type="ira">iranski</language>
+ <language type="is">islandski</language>
+ <language type="it">talijanski</language>
+ <language type="ja">japanski</language>
+ <language type="km">kmerski</language>
+ <language type="ko">korejski</language>
+ <language type="la">latinski</language>
+ <language type="lt">litvanski</language>
+ <language type="lv">latvijski</language>
+ <language type="mga">irski, srednji (900-1200)</language>
+ <language type="mk">makedonski</language>
+ <language type="mn">mongolski</language>
+ <language type="mt">malteški</language>
+ <language type="ne">nepalski</language>
+ <language type="nl">nizozemski</language>
+ <language type="no">norveški</language>
+ <language type="pl">poljski</language>
+ <language type="pt">portugalski</language>
+ <language type="ro">rumunjski</language>
+ <language type="roa">romanski (ostali)</language>
+ <language type="ru">ruski</language>
+ <language type="sk">slovaÄki</language>
+ <language type="sl">slovenski</language>
+ <language type="sla">slavenski (drugi)</language>
+ <language type="sq">albanski</language>
+ <language type="sr">srpski</language>
+ <language type="sv">Å¡vedski</language>
+ <language type="tr">turski</language>
+ <language type="uk">ukrajinski</language>
+ <language type="vi">vijetnamski</language>
+ <language type="zh">kineski</language>
+ </languages>
+ <scripts>
+ <script type="Latn">Latinski</script>
+ </scripts>
+ <territories>
+ <territory type="001">Svijet</territory>
+ <territory type="002">Afrika</territory>
+ <territory type="005">Južna Amerika</territory>
+ <territory type="009">Oceanija</territory>
+ <territory type="011">Zapadna Afrika</territory>
+ <territory type="013">Centralna Amerika</territory>
+ <territory type="014">IstoÄna Afrika</territory>
+ <territory type="015">Sjeverna Afrika</territory>
+ <territory type="017">Središnja Afrika</territory>
+ <territory type="018">Južna Afrika</territory>
+ <territory type="019">Amerike</territory>
+ <territory type="021">Sjeverna Amerika</territory>
+ <territory type="029">Karibi</territory>
+ <territory type="030">IstoÄna Azija</territory>
+ <territory type="035">JugoistoÄna Azija</territory>
+ <territory type="039">Južna Europa</territory>
+ <territory type="053">Australija i Novi Zeland</territory>
+ <territory type="054">Melanezija</territory>
+ <territory type="057">Micronezija</territory>
+ <territory type="061">Polinezija</territory>
+ <territory type="062">Južna Azija</territory>
+ <territory type="142">Azija</territory>
+ <territory type="145">Zapadna Azija</territory>
+ <territory type="150">Europa</territory>
+ <territory type="151">IstoÄna Europa</territory>
+ <territory type="154">Sjeverna Europa</territory>
+ <territory type="155">Zapadna Europa</territory>
+ <territory type="830">Kanalski otoci</territory>
+ <territory type="IM">Otok Man</territory>
+ <territory type="AD">Andora</territory>
+ <territory type="AE">Ujedinjeni Arapski Emirati</territory>
+ <territory type="AF">Afganistan</territory>
+ <territory type="AG">Antigua i Barbuda</territory>
+ <territory type="AI">Anguila</territory>
+ <territory type="AL">Albanija</territory>
+ <territory type="AM">Armenija</territory>
+ <territory type="AN">Nizozemski Antili</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktik</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">AmeriÄka Samoa</territory>
+ <territory type="AT">Austrija</territory>
+ <territory type="AU">Australija</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Alandski otoci</territory>
+ <territory type="AZ">Azerbajdžan</territory>
+ <territory type="BA">Bosna i Hercegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladeš</territory>
+ <territory type="BE">Belgija</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bugarska</territory>
+ <territory type="BH">Bahrein</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei</territory>
+ <territory type="BO">Bolivija</territory>
+ <territory type="BR">Brazil</territory>
+ <territory type="BS">Bahami</territory>
+ <territory type="BT">Butan</territory>
+ <territory type="BV">Otok Bouvet</territory>
+ <territory type="BW">Bocvana</territory>
+ <territory type="BY">Bjelorusija</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Kokos (Keeling) Otoci</territory>
+ <territory type="CD">Kongo, Demokratska Republika</territory>
+ <territory type="CF">SrednjoafriÄka Republika</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Å vicarska</territory>
+ <territory type="CI">Obala Bjelokosti</territory>
+ <territory type="CK">Kukovi Otoci</territory>
+ <territory type="CL">ÄŒile</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Kina</territory>
+ <territory type="CO">Kolumbija</territory>
+ <territory type="CR">Kostarika</territory>
+ <territory type="CS">Srbija i Crna Gora</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Zeleni Rt</territory>
+ <territory type="CX">Božićni Otoci</territory>
+ <territory type="CY">Cipar</territory>
+ <territory type="CZ">Češka Republika</territory>
+ <territory type="DE">NjemaÄka</territory>
+ <territory type="DJ">Džibuti</territory>
+ <territory type="DK">Danska</territory>
+ <territory type="DM">Dominika</territory>
+ <territory type="DO">Dominikanska Republika</territory>
+ <territory type="DZ">Alžir</territory>
+ <territory type="EC">Ekvador</territory>
+ <territory type="EE">Estonija</territory>
+ <territory type="EG">Egipat</territory>
+ <territory type="EH">Zapadna Sahara</territory>
+ <territory type="ER">Eritreja</territory>
+ <territory type="ES">Å panjolska</territory>
+ <territory type="ET">Etiopija</territory>
+ <territory type="FI">Finska</territory>
+ <territory type="FJ">Fidži</territory>
+ <territory type="FK">Falklandski Otoci</territory>
+ <territory type="FM">Mikronezija, Federalne Države</territory>
+ <territory type="FO">Farski Otoci</territory>
+ <territory type="FR">Francuska</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Ujedinjena Kraljevina</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Gruzija</territory>
+ <territory type="GF">Francuska Gvajana</territory>
+ <territory type="GH">Gana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Greenland</territory>
+ <territory type="GM">Gambija</territory>
+ <territory type="GN">Gvineja</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Ekvatorska Gvineja</territory>
+ <territory type="GR">GrÄka</territory>
+ <territory type="GS">Južna Gruzija i Južni SendviÄ Otoci</territory>
+ <territory type="GT">Gvatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Gvineja Bisau</territory>
+ <territory type="GY">Gvajana</territory>
+ <territory type="HK">Hong Kong S.A.R. Kine</territory>
+ <territory type="HM">Heard Otok i McDonald Otoci</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Hrvatska</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Mađarska</territory>
+ <territory type="ID">Indonezija</territory>
+ <territory type="IE">Irska</territory>
+ <territory type="IL">Izrael</territory>
+ <territory type="IN">Indija</territory>
+ <territory type="IO">Britanski Teritorij Indijskog Oceana</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IR">Iran, Islamska Republika</territory>
+ <territory type="IS">Island</territory>
+ <territory type="IT">Italija</territory>
+ <territory type="JM">Jamajka</territory>
+ <territory type="JO">Jordan</territory>
+ <territory type="JP">Japan</territory>
+ <territory type="KE">Kenija</territory>
+ <territory type="KG">Kirgistan</territory>
+ <territory type="KH">Kambodža</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komori</territory>
+ <territory type="KN">Sveti Kristofor i Nevis</territory>
+ <territory type="KP">Koreja, Sjeverna</territory>
+ <territory type="KR">Koreja, Južna</territory>
+ <territory type="KW">Kuvajt</territory>
+ <territory type="KY">Kajmanski Otoci</territory>
+ <territory type="KZ">Kazakstan</territory>
+ <territory type="LA">Laoska Narodna Demokratska Republika</territory>
+ <territory type="LB">Libanon</territory>
+ <territory type="LC">Sveta Lucija</territory>
+ <territory type="LI">Lihtenštajn</territory>
+ <territory type="LK">Å ri Lanka</territory>
+ <territory type="LR">Liberija</territory>
+ <territory type="LS">Lesoto</territory>
+ <territory type="LT">Litva</territory>
+ <territory type="LU">Luksemburg</territory>
+ <territory type="LV">Latvija</territory>
+ <territory type="LY">Libijska Arapska Džamahirija</territory>
+ <territory type="MA">Maroko</territory>
+ <territory type="MC">Monako</territory>
+ <territory type="MD">Moldavija, Republika</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Maršalovi Otoci</territory>
+ <territory type="MK">Makedonija, Republika</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Mijanma</territory>
+ <territory type="MN">Mongolija</territory>
+ <territory type="MO">Makao S.A.R. Kine</territory>
+ <territory type="MP">Sjeverni Marianski Otoci</territory>
+ <territory type="MQ">Martinik</territory>
+ <territory type="MR">Mauritanija</territory>
+ <territory type="MS">Montserat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauricijus</territory>
+ <territory type="MV">Maldivi</territory>
+ <territory type="MW">Malavi</territory>
+ <territory type="MX">Meksiko</territory>
+ <territory type="MY">Malezija</territory>
+ <territory type="MZ">Mozambik</territory>
+ <territory type="NA">Namibija</territory>
+ <territory type="NC">Nova Kaledonija</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Norfolški Otoci</territory>
+ <territory type="NG">Nigerija</territory>
+ <territory type="NI">Nikaragva</territory>
+ <territory type="NL">Nizozemska</territory>
+ <territory type="NO">Norveška</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Novi Zeland</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Francuska Polinezija</territory>
+ <territory type="PG">Papua Nova Gvineja</territory>
+ <territory type="PH">Filipini</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Poljska</territory>
+ <territory type="PM">Sveti Petar i Miguel</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Portoriko</territory>
+ <territory type="PS">Palestinska Teritoija</territory>
+ <territory type="PT">Portugal</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paragvaj</territory>
+ <territory type="QA">Katar</territory>
+ <territory type="QO">Ostala oceanija</territory>
+ <territory type="RE">Reunion</territory>
+ <territory type="RO">Rumunjska</territory>
+ <territory type="RU">Ruska Federacija</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SA">Saudijska Arabija</territory>
+ <territory type="SB">Salamunovi Otoci</territory>
+ <territory type="SC">Sejšeli</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Å vedska</territory>
+ <territory type="SG">Singapur</territory>
+ <territory type="SH">Sveta Helena</territory>
+ <territory type="SI">Slovenija</territory>
+ <territory type="SJ">Svalbard i Jan Mayen</territory>
+ <territory type="SK">SlovaÄka</territory>
+ <territory type="SL">Sijera Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalija</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">Sveti Toma i Prinsipe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Sirija</territory>
+ <territory type="SZ">Svazi</territory>
+ <territory type="TC">Turkski i Kaikos Otoci</territory>
+ <territory type="TD">ÄŒad</territory>
+ <territory type="TF">Francuske Južne Teritorije</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Tajland</territory>
+ <territory type="TJ">Tadžikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">IstoÄni Timor</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunis</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turska</territory>
+ <territory type="TT">Trinidad i Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Tajvan</territory>
+ <territory type="TZ">Tanzanija</territory>
+ <territory type="UA">Ukrajina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">Sjedinjene Države Manji Vanjski Otoci</territory>
+ <territory type="US">Sjedinjene Države</territory>
+ <territory type="UY">Urugvaj</territory>
+ <territory type="UZ">Uzbekistan</territory>
+ <territory type="VA">Sveta Stolica (Država Vatikanskog Grada)</territory>
+ <territory type="VC">Sveti Vincent i Grenadini</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Britanski DjeviÄanski Otoci</territory>
+ <territory type="VI">U.S. DjeviÄanski Otoci</territory>
+ <territory type="VN">Vijetnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis i Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="YT">Majote</territory>
+ <territory type="ZA">JužnoafriÄka Republika</territory>
+ <territory type="ZM">Zambija</territory>
+ <territory type="ZW">Zimbabve</territory>
+ </territories>
+ <keys>
+ <key type="calendar">Kalendar</key>
+ <key type="collation">Poredavanje</key>
+ <key type="currency">Valuta</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">BudistiÄki kalendar</type>
+ <type type="chinese" key="calendar">Kineski kalendar</type>
+ <type type="direct" key="collation">Direktno poredavanje</type>
+ <type type="gregorian" key="calendar">Gregorijanski kalendar</type>
+ <type type="hebrew" key="calendar">Hebrejski kalendar</type>
+ <type type="islamic" key="calendar">Islamski kalendar</type>
+ <type type="islamic-civil" key="calendar">Islamski civilni kalendar</type>
+ <type type="japanese" key="calendar">Japanski kalendar</type>
+ <type type="phonebook" key="collation">Poredavanja po abecedi</type>
+ <type type="pinyin" key="collation">Pinyin poredavanje</type>
+ <type type="stroke" key="collation">Stroke order poredavanje</type>
+ <type type="traditional" key="collation">Tradicionano poredavanje</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-c Ä Ä‡ d Ä‘ {dž} e-l {lj} m n {nj} o p r s Å¡ t-v z ž]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">sij</month>
+ <month type="2">vel</month>
+ <month type="3">ožu</month>
+ <month type="4">tra</month>
+ <month type="5">svi</month>
+ <month type="6">lip</month>
+ <month type="7">srp</month>
+ <month type="8">kol</month>
+ <month type="9">ruj</month>
+ <month type="10">lis</month>
+ <month type="11">stu</month>
+ <month type="12">pro</month>
+ </monthWidth>
+ <monthWidth type="narrow">
+ <month type="1">s</month>
+ <month type="2">v</month>
+ <month type="3">o</month>
+ <month type="4">t</month>
+ <month type="5">s</month>
+ <month type="6">l</month>
+ <month type="7">s</month>
+ <month type="8">k</month>
+ <month type="9">r</month>
+ <month type="10">l</month>
+ <month type="11">s</month>
+ <month type="12">p</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">sijeÄnja</month>
+ <month type="2">veljaÄe</month>
+ <month type="3">ožujka</month>
+ <month type="4">travnja</month>
+ <month type="5">svibnja</month>
+ <month type="6">lipnja</month>
+ <month type="7">srpnja</month>
+ <month type="8">kolovoza</month>
+ <month type="9">rujna</month>
+ <month type="10">listopada</month>
+ <month type="11">studenoga</month>
+ <month type="12">prosinca</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="abbreviated">
+ <month type="1">sij</month>
+ <month type="2">vel</month>
+ <month type="3">ožu</month>
+ <month type="4">tra</month>
+ <month type="5">svi</month>
+ <month type="6">lip</month>
+ <month type="7">srp</month>
+ <month type="8">kol</month>
+ <month type="9">ruj</month>
+ <month type="10">lis</month>
+ <month type="11">stu</month>
+ <month type="12">pro</month>
+ </monthWidth>
+ <monthWidth type="narrow">
+ <month type="1">s</month>
+ <month type="2">v</month>
+ <month type="3">o</month>
+ <month type="4">t</month>
+ <month type="5">s</month>
+ <month type="6">l</month>
+ <month type="7">s</month>
+ <month type="8">k</month>
+ <month type="9">r</month>
+ <month type="10">l</month>
+ <month type="11">s</month>
+ <month type="12">p</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">sijeÄanj</month>
+ <month type="2">veljaÄa</month>
+ <month type="3">ožujak</month>
+ <month type="4">travanj</month>
+ <month type="5">svibanj</month>
+ <month type="6">lipanj</month>
+ <month type="7">srpanj</month>
+ <month type="8">kolovoz</month>
+ <month type="9">rujan</month>
+ <month type="10">listopad</month>
+ <month type="11">studeni</month>
+ <month type="12">prosinac</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">ned</day>
+ <day type="mon">pon</day>
+ <day type="tue">uto</day>
+ <day type="wed">sri</day>
+ <day type="thu">Äet</day>
+ <day type="fri">pet</day>
+ <day type="sat">sub</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">nedjelja</day>
+ <day type="mon">ponedjeljak</day>
+ <day type="tue">utorak</day>
+ <day type="wed">srijeda</day>
+ <day type="thu">Äetvrtak</day>
+ <day type="fri">petak</day>
+ <day type="sat">subota</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">n</day>
+ <day type="mon">p</day>
+ <day type="tue">u</day>
+ <day type="wed">s</day>
+ <day type="thu">Ä</day>
+ <day type="fri">p</day>
+ <day type="sat">s</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">1kv</quarter>
+ <quarter type="2">2kv</quarter>
+ <quarter type="3">3kv</quarter>
+ <quarter type="4">4kv</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1. kvartal</quarter>
+ <quarter type="2">2. kvartal</quarter>
+ <quarter type="3">3. kvartal</quarter>
+ <quarter type="4">4. kvartal</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraNames>
+ <era type="0">Prije Krista</era>
+ <era type="1">Poslije Krista</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">pr.n.e.</era>
+ <era type="1">AD</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>yyyy. MMMM dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>yyyy. MMMM dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy.MM.dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yyyy.MM.dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="MMMMdd" draft="provisional">MMMM dd</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">MM.dd</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="yyMMMEEEd" draft="provisional">EEE yy.MMM d</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="provisional">QQQQ yy</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">yyyy.MM</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">yyyy. MMMM</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HHmm;-HHmm</hourFormat>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Južni pol</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity>Kinšasa</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity>Lubumbaši</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity>Å angaj</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moskva</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>Krasnojarsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>KamÄatka</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity>Anadir</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>Uzgorod</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>Kijev</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>Zaporožje</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Taškent</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="ALL">
+ <displayName>Albanski lek</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>Armenian Dram</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>Angolska kvanza</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Angolska kvanza (1977-1990)</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Argentinski pezo (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Argentinski pezo</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>Austrijski Å¡iling</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>Australski dolar</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AZM">
+ <displayName>Azerbejdžanski manat</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>Konvertibilna marka</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>Barbadoski dolar</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>Taka</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEF">
+ <displayName>Belgijski franak</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>Bermudski dolar</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>Brunejski dolar</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Brazilski Real</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>Kanadski dolar</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CHF">
+ <displayName>Å vicarski franak</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CLF">
+ <displayName>Chilean Unidades de Fomento</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>ÄŒileanski pezo</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>Kineski Yuan Renminbi</displayName>
+ </currency>
+ <currency type="COP">
+ <displayName>Kolumbijski pezo</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="CRC">
+ <displayName>Kostarikanski kolon</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSK">
+ <displayName>Czechoslovak Hard Koruna</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Kubanski pezo</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Zelenortski eskudo</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>Ciparska funta</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>Češka kruna</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>East German Ostmark</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>NjemaÄka marka</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Djibouti Franc</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>Danska kruna</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>Dominikanski pezo</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>Alžirski dinar</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>Ecuador Sucre</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>Ecuador Unidad de Valor Constante (UVC)</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>Estonian Kroon</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>Egipatska funta</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Eritrean Nakfa</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Å panjolska pezeta</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>Etiopski bir</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>Finska marka</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Fidžijski dolar</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>Falklandska funta</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Francuski franak</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Britanska funta</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>Georgian Kupon Larit</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>Gruzijski lari</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GIP">
+ <displayName>Gibraltarska funta</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>Gambia Dalasi</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Gvinejski franak</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>Guinea Syli</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Equatorial Guinea Ekwele Guineana</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>GrÄka drahma</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Kvecal</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>Portuguese Guinea Escudo</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Gvinejskobisauski pezo</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>Guyana Dollar</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>Honkonški dolar</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>Hoduraška lempira</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>Hrvatski dinar</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Kuna</displayName>
+ <symbol>Kn</symbol>
+ </currency>
+ <currency type="HTG">
+ <displayName>Haitian Gourde</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Mađarska forinta</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>Indonezijska rupija</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>Irska funta</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>Israelska funta</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Novi izraelski Å¡ekel</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Indijska rupija</displayName>
+ <symbol>INR</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>IraÄki dinar</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>Iranski rijal</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>Islandska kruna</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>Talijanska lira</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>JamaiÄanski dolar</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>Jordanski dinar</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>Japanski jen</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>Kenijski Å¡iling</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>Kyrgystan Som</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>Cambodian Riel</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>Comoro Franc</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KWD">
+ <displayName>Kuvajtski dinar</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>Kajmanski dolar</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Kazakhstan Tenge</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>Laotian Kip</displayName>
+ </currency>
+ <currency type="LKR">
+ <displayName>Sri Lanka Rupee</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>Liberijski dolar</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Lesotho Loti</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LTL">
+ <displayName>Lithuanian Lita</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Lithuanian Talonas</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Luksemburški franak</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Latvian Lats</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>Latvian Ruble</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>Libijski dinar</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>Morokanski dirham</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>Morokanski franak</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>Moldovski lej</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>Makedonski denar</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>Mali Franc</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Myanmar Kyat</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>Mongolski tugrik</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Macao Pataca</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Mauritanska ouguja</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>Malteška lira</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>Malteška funta</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>Mauricijska rupija</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Malawi Kwacha</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>MeksiÄki pezo</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>MeksiÄki srebrni pezo (1861-1992)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Malaysian Ringgit</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>Mozambique Escudo</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Mozambique Metical</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>Namibijski dolar</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>Nigerijska naira</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Nizozemski gulden</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Norveška kruna</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>Nepalska rupija</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>Novozelandski dolar</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>Omanski rijal</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>Panamska balboa</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>Peruanski inti</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>Peruanski novi sol</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>Peruanski sol</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>Filipinski pezo</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>Pakistanska rupija</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>Poljska zlota</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Poljska zlota (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Portugalski eskudo</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>Paragvajski gvarani</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>Rumunjski lej</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>Ruska rublja</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Ruska rublja (1991-1998)</displayName>
+ </currency>
+ <currency type="SBD">
+ <displayName>SolomonskootoÄni dolar</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>Sejšelska rupija</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>Sudanski dinar</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>Sudanska funta</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>Å vedska kruna</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>Singapurski dolar</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SIT">
+ <displayName>Slovenski tolar</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>SlovaÄka kruna</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SOS">
+ <displayName>Somalijski Å¡iling</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRG">
+ <displayName>Surinamski gulden</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="SYP">
+ <displayName>Sirijska funta</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>Lilangeni</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="TJS">
+ <displayName>Tadžikistanski somoni</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Turkmenistanski manat</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>Tuniski dinar</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>Timorski eskudo</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Turska lira</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName>Nova Turska Lira</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Trinidadtobaški dolar</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>Novotajvanski dolar</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>Tanzanijski Å¡iling</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>Ukrajinska hrivnja</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Ugandski Å¡iling (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Ugandski Å¡iling</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>AmeriÄki dolar</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>AmeriÄki dolar (sljedeći dan)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>AmeriÄki dolar (isti dan)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>Urugvajski pezo (1975-1993)</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Venezuelski bolivar</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>Viejetnamski dong</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>Zlato</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>Europska složena jedinica</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>Europska monetarna jedinica</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>jemenski dinar</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Jemenski rial</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>Jugoslavenski Ävrsti dinar</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>Jugoslavenski novi dinar</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>Jugoslavenski konvertibilni dinar</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>JužnoafriÄki rand (financijski)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>JužnoafriÄki rand</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Zambijska kvaÄa</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Zairski novi zair</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Zairski zair</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Zimbabveanski dolar</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>da:d</yesstr>
+ <nostr>ne:n</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/hr_HR.xml b/libs/Zend/Locale/Data/hr_HR.xml
new file mode 100755
index 0000000000..4c2371f9f9
--- /dev/null
+++ b/libs/Zend/Locale/Data/hr_HR.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.40 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="hr"/>
+ <territory type="HR"/>
+ </identity>
+ <delimiters>
+ <quotationStart>‘</quotationStart>
+ <quotationEnd>’</quotationEnd>
+ <alternateQuotationStart>“</alternateQuotationStart>
+ <alternateQuotationEnd>â€</alternateQuotationEnd>
+ </delimiters>
+</ldml>
diff --git a/libs/Zend/Locale/Data/hu.xml b/libs/Zend/Locale/Data/hu.xml
new file mode 100755
index 0000000000..93d5cc603a
--- /dev/null
+++ b/libs/Zend/Locale/Data/hu.xml
@@ -0,0 +1,2394 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.70 $"/>
+ <generation date="$Date: 2006/10/26 22:46:08 $"/>
+ <language type="hu"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">afar</language>
+ <language type="ab">abház</language>
+ <language type="ae" draft="provisional">avesztán</language>
+ <language type="af">afrikai</language>
+ <language type="af" references="RP3" alt="proposed-u46-2" draft="provisional">afrikaans</language>
+ <language type="afa" draft="provisional">afro-ázsiai (egyéb)</language>
+ <language type="afh" draft="provisional">afrihili</language>
+ <language type="ain" draft="provisional">ainu</language>
+ <language type="ak" draft="provisional">akan</language>
+ <language type="ale" draft="provisional">aleut</language>
+ <language type="alt" references="RP1" draft="provisional">dél-altaji</language>
+ <language type="am">amhara</language>
+ <language type="an" draft="provisional">aragonéz</language>
+ <language type="ang" references="RP1" draft="provisional">óangol (kb. 450-1100)</language>
+ <language type="apa" references="RP1" draft="provisional">apacs nyelvek</language>
+ <language type="ar">arab</language>
+ <language type="arp" draft="provisional">arapaho</language>
+ <language type="art" draft="provisional">mesterséges (egyéb)</language>
+ <language type="as">asszámi</language>
+ <language type="ast" draft="provisional">asztúr</language>
+ <language type="ath" draft="provisional">atapaszkan nyelvek</language>
+ <language type="aus" draft="provisional">ausztrál nyelvek</language>
+ <language type="av" draft="provisional">avar</language>
+ <language type="ay">ajmara</language>
+ <language type="az">azerbajdzsáni</language>
+ <language type="ba">baskír</language>
+ <language type="bad" draft="provisional">banda</language>
+ <language type="bai" draft="provisional">bamileke nyelvek</language>
+ <language type="ban" draft="provisional">balinéz</language>
+ <language type="bat" draft="provisional">balti (egyéb)</language>
+ <language type="be">belorusz</language>
+ <language type="ber" references="RP1" draft="provisional">berber</language>
+ <language type="bg">bolgár</language>
+ <language type="bh">bihari</language>
+ <language type="bi">bislama</language>
+ <language type="bik" draft="provisional">bikol</language>
+ <language type="bin" draft="provisional">bini</language>
+ <language type="bm" draft="provisional">bambara</language>
+ <language type="bn">bengáli</language>
+ <language type="bnt" references="RP1" draft="provisional">bantu</language>
+ <language type="bo">tibeti</language>
+ <language type="br">breton</language>
+ <language type="bs" references="RP3" draft="provisional">bosnyák</language>
+ <language type="btk" draft="provisional">batak</language>
+ <language type="ca">katalán</language>
+ <language type="cai" draft="provisional">közép-amerikai indián (egyéb)</language>
+ <language type="car" draft="provisional">karib</language>
+ <language type="cau" draft="provisional">kaukázusi (egyéb)</language>
+ <language type="ce" references="RP1" draft="provisional">csecsen</language>
+ <language type="cel" references="RP1" draft="provisional">kelta (egyéb)</language>
+ <language type="chy" draft="provisional">csejen</language>
+ <language type="co">korzikai</language>
+ <language type="cop" references="RP1" draft="provisional">kopt</language>
+ <language type="crh" draft="provisional">krími török; krími tatár</language>
+ <language type="cs">cseh</language>
+ <language type="cu" draft="provisional">egyházi szláv</language>
+ <language type="cy">walesi</language>
+ <language type="da">dán</language>
+ <language type="dak" draft="provisional">dakota</language>
+ <language type="de">német</language>
+ <language type="del" draft="provisional">delavár</language>
+ <language type="dz">butáni</language>
+ <language type="egy" draft="provisional">egyiptomi (ókori)</language>
+ <language type="el">görög</language>
+ <language type="en">angol</language>
+ <language type="eo">eszperantó</language>
+ <language type="es">spanyol</language>
+ <language type="et">észt</language>
+ <language type="eu">baszk</language>
+ <language type="fa">perzsa</language>
+ <language type="fi">finn</language>
+ <language type="fil" references="RP3" draft="provisional">filippínó</language>
+ <language type="fiu" references="RP1" draft="provisional">finnugor (egyéb)</language>
+ <language type="fj">fidzsi</language>
+ <language type="fo">feröeri</language>
+ <language type="fr">francia</language>
+ <language type="fro" draft="provisional">ófrancia</language>
+ <language type="fy">fríz</language>
+ <language type="ga">ír</language>
+ <language type="gd">skót (gael)</language>
+ <language type="gd" references="RP3" alt="proposed-u46-1" draft="provisional">skót gael</language>
+ <language type="gem" draft="provisional">germán (egyéb)</language>
+ <language type="gil" draft="provisional">ikiribati</language>
+ <language type="gl">galíciai</language>
+ <language type="gn">guarani</language>
+ <language type="got" draft="provisional">gót</language>
+ <language type="grc" draft="provisional">ógörög</language>
+ <language type="gu">gudzsaráti</language>
+ <language type="gv" references="RP2" draft="provisional">Man-szigeti</language>
+ <language type="ha">hausza</language>
+ <language type="haw" draft="provisional">hawaii</language>
+ <language type="he">héber</language>
+ <language type="hi">hindi</language>
+ <language type="hr">horvát</language>
+ <language type="ht" draft="provisional">haiti</language>
+ <language type="hu">magyar</language>
+ <language type="hy">örmény</language>
+ <language type="ia">interlingua</language>
+ <language type="id">indonéz</language>
+ <language type="ie">interlingue</language>
+ <language type="ik">inupiak</language>
+ <language type="ine" draft="provisional">indo-európai (egyéb)</language>
+ <language type="ira" draft="provisional">iráni</language>
+ <language type="is">izlandi</language>
+ <language type="it">olasz</language>
+ <language type="iu">inuktitut</language>
+ <language type="ja">japán</language>
+ <language type="jpr" draft="provisional">zsidó-perzsa</language>
+ <language type="jrb" draft="provisional">zsidó-arab</language>
+ <language type="jv">jávai</language>
+ <language type="ka">grúz</language>
+ <language type="kk">kazah</language>
+ <language type="kl">grönlandi</language>
+ <language type="km">kambodzsai</language>
+ <language type="kn">kannada</language>
+ <language type="ko">koreai</language>
+ <language type="ks">kasmíri</language>
+ <language type="ks" references="RP3" alt="proposed-u46-1" draft="provisional">kásmíri</language>
+ <language type="ku">kurd</language>
+ <language type="ky">kirgiz</language>
+ <language type="la">latin</language>
+ <language type="lb" references="RP1" draft="provisional">luxemburgi</language>
+ <language type="ln">lingala</language>
+ <language type="lo">laoszi</language>
+ <language type="lt">litván</language>
+ <language type="lv">lett</language>
+ <language type="map" draft="provisional">ausztronéz</language>
+ <language type="mg">madagaszkári</language>
+ <language type="mg" references="RP3" alt="proposed-u46-1" draft="provisional">málgas</language>
+ <language type="mi">maori</language>
+ <language type="mk">macedón</language>
+ <language type="ml">malajalam</language>
+ <language type="ml" references="RP3" alt="proposed-u46-1" draft="provisional">malajálam</language>
+ <language type="mn">mongol</language>
+ <language type="mo">moldvai</language>
+ <language type="mr">marati</language>
+ <language type="ms">maláj</language>
+ <language type="mt">máltai</language>
+ <language type="my">burmai</language>
+ <language type="myn" draft="provisional">maja nyelvek</language>
+ <language type="na">naurui</language>
+ <language type="nai" draft="provisional">észak-amerikai indián (egyéb)</language>
+ <language type="nb" draft="provisional">norvég bokmál</language>
+ <language type="ne">nepáli</language>
+ <language type="nl">holland</language>
+ <language type="nn" draft="provisional">norvég nynorsk</language>
+ <language type="no">norvég</language>
+ <language type="nv" draft="provisional">navaho</language>
+ <language type="oc">okszitán</language>
+ <language type="om">oromói</language>
+ <language type="or">orija</language>
+ <language type="os" draft="provisional">oszét</language>
+ <language type="ota" draft="provisional">ottomán török</language>
+ <language type="pa">pandzsábi</language>
+ <language type="paa" draft="provisional">pápuai (egyéb)</language>
+ <language type="peo" draft="provisional">óperzsa</language>
+ <language type="phi" draft="provisional">filippínó (egyéb)</language>
+ <language type="phn" draft="provisional">főniciai</language>
+ <language type="pl">lengyel</language>
+ <language type="ps">pastu (afgán)</language>
+ <language type="ps" references="RP3" alt="proposed-u46-1" draft="provisional">pastu</language>
+ <language type="pt">portugál</language>
+ <language type="qu">kecsua</language>
+ <language type="rm">rétoromán</language>
+ <language type="rn">kirundi</language>
+ <language type="ro">román</language>
+ <language type="ru">orosz</language>
+ <language type="rw">kiruanda</language>
+ <language type="sa">szanszkrit</language>
+ <language type="sai" draft="provisional">dél-amerikai indián (egyéb)</language>
+ <language type="sc" draft="provisional">szardíniai</language>
+ <language type="scn" draft="provisional">szicíliai</language>
+ <language type="sd">szindi</language>
+ <language type="sg">sango</language>
+ <language type="sga" draft="provisional">óír</language>
+ <language type="sh">szerb-horvát</language>
+ <language type="sh" references="RP1" alt="proposed-u46-1" draft="provisional">szerbhorvát</language>
+ <language type="si">szingaléz</language>
+ <language type="sio" draft="provisional">sziú nyelvek</language>
+ <language type="sk">szlovák</language>
+ <language type="sl">szlovén</language>
+ <language type="sla" draft="provisional">szláv (egyéb)</language>
+ <language type="sm">szamoai</language>
+ <language type="sn">sona</language>
+ <language type="so">szomáli</language>
+ <language type="sq">albán</language>
+ <language type="sr">szerb</language>
+ <language type="ss">sziszuati</language>
+ <language type="st">szeszotó</language>
+ <language type="su">szundanéz</language>
+ <language type="sux" draft="provisional">sumér</language>
+ <language type="sv">svéd</language>
+ <language type="sw">szuahéli</language>
+ <language type="ta">tamil</language>
+ <language type="te">telugu</language>
+ <language type="tg">tadzsik</language>
+ <language type="th">thai</language>
+ <language type="ti">tigrinya</language>
+ <language type="tk">türkmén</language>
+ <language type="tl">tagalog</language>
+ <language type="tlh" draft="provisional">klingon</language>
+ <language type="tn">szecsuáni</language>
+ <language type="to">tonga</language>
+ <language type="tr">török</language>
+ <language type="ts">conga</language>
+ <language type="tt">tatár</language>
+ <language type="tvl" draft="provisional">tuvalu</language>
+ <language type="tw">tui</language>
+ <language type="ty" draft="provisional">tahiti</language>
+ <language type="ug">ujgur</language>
+ <language type="uk">ukrán</language>
+ <language type="ur">urdu</language>
+ <language type="uz">üzbég</language>
+ <language type="vi">vietnámi</language>
+ <language type="vo">volapük</language>
+ <language type="wo">volof</language>
+ <language type="xh">hosza</language>
+ <language type="yi">zsidó</language>
+ <language type="yo">joruba</language>
+ <language type="za">zsuang</language>
+ <language type="zh">kínai</language>
+ <language type="zu">zulu</language>
+ </languages>
+ <scripts>
+ <script type="Armn">Örmény</script>
+ <script type="Beng">Bengáli</script>
+ <script type="Bopo">Bopomofo</script>
+ <script type="Brai">Vakírás</script>
+ <script type="Cans">Egyesített kanadai őslakos jelek</script>
+ <script type="Copt" draft="provisional">Kopt</script>
+ <script type="Cprt">Ciprusi</script>
+ <script type="Cyrl">Cirill</script>
+ <script type="Cyrs" draft="provisional">Cirill (régi egyházi szláv variáns)</script>
+ <script type="Deva" draft="provisional">Devanagári</script>
+ <script type="Egyp" draft="provisional">Egyiptomi hieroglifák</script>
+ <script type="Ethi">Etióp</script>
+ <script type="Geor">Grúz</script>
+ <script type="Goth">Gótikus</script>
+ <script type="Goth" alt="proposed-u46-1" draft="provisional">Gót</script>
+ <script type="Grek">Görög</script>
+ <script type="Gujr" draft="provisional">Gudzsaráti</script>
+ <script type="Guru" draft="provisional">Gurmuki</script>
+ <script type="Hang" draft="provisional">Hangul</script>
+ <script type="Hani">Han</script>
+ <script type="Hano">Hanunoo</script>
+ <script type="Hans">Egyszerűsített Han</script>
+ <script type="Hant">Hagyományos Han</script>
+ <script type="Hebr">Héber</script>
+ <script type="Hira" draft="provisional">Hiragana</script>
+ <script type="Hrkt" draft="provisional">Katakana vagy hiragana</script>
+ <script type="Hung" draft="provisional">Ómagyar</script>
+ <script type="Ital">Régi olasz</script>
+ <script type="Java" draft="provisional">Jávai</script>
+ <script type="Kana" draft="provisional">Katakana</script>
+ <script type="Knda">Kannada</script>
+ <script type="Laoo">Lao</script>
+ <script type="Latg" draft="provisional">Latin (gael variáns)</script>
+ <script type="Latn" draft="provisional">Latin</script>
+ <script type="Limb">Limbu</script>
+ <script type="Lina" draft="provisional">Lineáris A</script>
+ <script type="Linb" draft="provisional">Lineáris B</script>
+ <script type="Maya" draft="provisional">Maja hieroglifák</script>
+ <script type="Mlym">Malayalam</script>
+ <script type="Mlym" references="RP3" alt="proposed-u46-1" draft="provisional">Malajálam</script>
+ <script type="Mong" draft="provisional">Mongol</script>
+ <script type="Mymr">Burmai</script>
+ <script type="Ogam">Ogham</script>
+ <script type="Orya">Oriya</script>
+ <script type="Osma">Oszmán</script>
+ <script type="Phnx" draft="provisional">FÅ‘niciai</script>
+ <script type="Sinh">Szingaléz</script>
+ <script type="Syrc">Szíriai</script>
+ <script type="Tagb">Tagbanwa</script>
+ <script type="Tale">Tai Le</script>
+ <script type="Taml" draft="provisional">Tamil</script>
+ <script type="Telu">Telugu</script>
+ <script type="Thaa">Thaana</script>
+ <script type="Thai" draft="provisional">Thai</script>
+ <script type="Tibt">Tibeti</script>
+ <script type="Ugar">Ugari</script>
+ <script type="Visp" draft="provisional">Látható beszéd</script>
+ <script type="Xpeo" draft="provisional">óperzsa</script>
+ <script type="Yiii" draft="provisional">Yi</script>
+ <script type="Zxxx" draft="provisional">Ãratlan nyelvek kódja</script>
+ <script type="Zyyy">Meghatározatlan</script>
+ <script type="Zyyy" alt="proposed-u46-1" draft="provisional">Közös</script>
+ <script type="Zzzz" draft="provisional">Kódolatlan írásrendszerek kódja</script>
+ </scripts>
+ <territories>
+ <territory type="001">Világ</territory>
+ <territory type="002">Afrika</territory>
+ <territory type="005">Dél-Amerika</territory>
+ <territory type="009">Óceánia</territory>
+ <territory type="011">Nyugat-Afrika</territory>
+ <territory type="013">Közép-Amerika</territory>
+ <territory type="014">Kelet-Afrika</territory>
+ <territory type="015">Észak-Afrika</territory>
+ <territory type="017">Közép-Afrika</territory>
+ <territory type="018" references="RP3" draft="provisional">Afrika déli része</territory>
+ <territory type="019">Amerika</territory>
+ <territory type="021">Észak-Amerika</territory>
+ <territory type="029" draft="provisional">Karib-térség</territory>
+ <territory type="030">Kelet-Ãzsia</territory>
+ <territory type="034" references="RP3" draft="provisional">Dél-Ãzsia</territory>
+ <territory type="035">Délkelet-Ãzsia</territory>
+ <territory type="039">Dél-Európa</territory>
+ <territory type="053">Ausztrália és Új-Zéland</territory>
+ <territory type="054">Melanézia</territory>
+ <territory type="057" draft="unconfirmed">Mikronézia</territory>
+ <territory type="061">Polinézia</territory>
+ <territory type="062" draft="unconfirmed">Délközép-Ãzsia</territory>
+ <territory type="142">Ãzsia</territory>
+ <territory type="143" references="RP3" draft="provisional">Közép-Ãzsia</territory>
+ <territory type="145">Nyugat-Ãzsia</territory>
+ <territory type="150">Európa</territory>
+ <territory type="151">Kelet-Európa</territory>
+ <territory type="154">Észak-Európa</territory>
+ <territory type="155">Nyugat-Európa</territory>
+ <territory type="172" draft="provisional">Független Ãllamok Közössége</territory>
+ <territory type="419" draft="provisional">Latin-Amerika és a Karib-térség</territory>
+ <territory type="830">Csatorna-szigetek</territory>
+ <territory type="IM">Man-sziget</territory>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Egyesült Arab Emirátus</territory>
+ <territory type="AE" references="RP3" alt="proposed-u46-1" draft="provisional">Egyesült Arab Emírségek</territory>
+ <territory type="AF">Afganisztán</territory>
+ <territory type="AG">Antigua és Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albánia</territory>
+ <territory type="AM">Örményország</territory>
+ <territory type="AN">Holland Antillák</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktisz</territory>
+ <territory type="AR">Argentína</territory>
+ <territory type="AS">Amerikai Szamoa</territory>
+ <territory type="AT">Ausztria</territory>
+ <territory type="AU">Ausztrália</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Aland-szigetek</territory>
+ <territory type="AZ">Azerbajdzsán</territory>
+ <territory type="BA">Bosznia-Hercegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Banglades</territory>
+ <territory type="BE">Belgium</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgária</territory>
+ <territory type="BH">Bahrain</territory>
+ <territory type="BH" references="RP3" alt="proposed-u46-1" draft="provisional">Bahrein</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei Darussalam</territory>
+ <territory type="BN" references="RP3" alt="proposed-u46-1" draft="provisional">Brunei</territory>
+ <territory type="BO">Bolívia</territory>
+ <territory type="BR">Brazília</territory>
+ <territory type="BS">Bahamák</territory>
+ <territory type="BT">Bhután</territory>
+ <territory type="BV">Bouvet-sziget</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Fehéroroszország</territory>
+ <territory type="BZ">Beliz</territory>
+ <territory type="BZ" references="RP3" alt="proposed-u46-1" draft="provisional">Belize</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Kókusz (Keeling)-szigetek</territory>
+ <territory type="CD">Kongó, Demokratikus köztársaság</territory>
+ <territory type="CD" references="RP3" alt="proposed-u46-1" draft="provisional">Kongói Demokratikus Köztársaság</territory>
+ <territory type="CF">Közép-afrikai Köztársaság</territory>
+ <territory type="CG">Kongó</territory>
+ <territory type="CH">Svájc</territory>
+ <territory type="CI">Elefántcsontpart</territory>
+ <territory type="CK">Cook-szigetek</territory>
+ <territory type="CL">Chile</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Kína</territory>
+ <territory type="CO">Kolumbia</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS" references="RP3" draft="provisional">Szerbia és Montenegró</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Zöld-foki Köztársaság</territory>
+ <territory type="CX">Karácsony-szigetek</territory>
+ <territory type="CY">Ciprus</territory>
+ <territory type="CZ">Cseh Köztársaság</territory>
+ <territory type="CZ" references="RP3" alt="proposed-u46-1" draft="provisional">Csehország</territory>
+ <territory type="DE">Németország</territory>
+ <territory type="DJ">Dzsibuti</territory>
+ <territory type="DK">Dánia</territory>
+ <territory type="DM">Dominika</territory>
+ <territory type="DO">Dominikai Köztársaság</territory>
+ <territory type="DZ">Algéria</territory>
+ <territory type="EC">Ecuador</territory>
+ <territory type="EE">Észtország</territory>
+ <territory type="EG">Egyiptom</territory>
+ <territory type="EH">Nyugat Szahara</territory>
+ <territory type="EH" references="RP1" alt="proposed-u46-1" draft="provisional">Nyugat-Szahara</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Spanyolország</territory>
+ <territory type="ET">Etiópia</territory>
+ <territory type="FI">Finnország</territory>
+ <territory type="FJ">Fidzsi</territory>
+ <territory type="FK">Falkland-szigetek</territory>
+ <territory type="FM">Mikronézia, Szövetségi Ãllamok</territory>
+ <territory type="FO">Feröer-szigetek</territory>
+ <territory type="FR">Franciaország</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Egyesült Királyság</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Grúzia</territory>
+ <territory type="GF">Francia Guyana</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GH" references="RP3" alt="proposed-u46-1" draft="provisional">Ghána</territory>
+ <territory type="GI">Gibraltár</territory>
+ <territory type="GL">Grönland</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">EgyenlítÄi Guinea</territory>
+ <territory type="GQ" references="RP3" alt="proposed-u46-1" draft="provisional">Egyenlítői-Guinea</territory>
+ <territory type="GR">Görögország</territory>
+ <territory type="GS">Dél-Georgia és Dél-Sandwich Szigetek</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinea-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Hong Kong S.A.R., China</territory>
+ <territory type="HM">Heard és McDonald Szigetek</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Horvátország</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Magyarország</territory>
+ <territory type="ID">Indonézia</territory>
+ <territory type="IE">Ãrország</territory>
+ <territory type="IL">Izrael</territory>
+ <territory type="IN">India</territory>
+ <territory type="IO">Brit Indiai Oceán</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IR">Irán</territory>
+ <territory type="IS">Izland</territory>
+ <territory type="IT">Olaszország</territory>
+ <territory type="JM">Jamaica</territory>
+ <territory type="JO">Jordánia</territory>
+ <territory type="JP">Japán</territory>
+ <territory type="KE">Kenya</territory>
+ <territory type="KG">Kirgizisztán</territory>
+ <territory type="KH">Kambodzsa</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Comore-szigetek</territory>
+ <territory type="KN">Saint Kitts és Nevis</territory>
+ <territory type="KP">Korea, Észak</territory>
+ <territory type="KP" alt="proposed-u46-1" draft="provisional">Észak-Korea</territory>
+ <territory type="KR">Korea, Dél</territory>
+ <territory type="KR" alt="proposed-u46-1" draft="provisional">Dél-Korea</territory>
+ <territory type="KW">Kuwait</territory>
+ <territory type="KW" references="RP3" alt="proposed-u46-1" draft="provisional">Kuvait</territory>
+ <territory type="KY">Kajmán-szigetek</territory>
+ <territory type="KZ">Kazahsztán</territory>
+ <territory type="LA">Laoszi Népi Demokratikus Köztársaság</territory>
+ <territory type="LA" references="RP3" alt="proposed-u46-1" draft="provisional">Laosz</territory>
+ <territory type="LB">Libanon</territory>
+ <territory type="LC">Saint Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LK" references="RP3" alt="proposed-u46-1" draft="provisional">Srí Lanka</territory>
+ <territory type="LR">Libéria</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Litvánia</territory>
+ <territory type="LU">Luxemburg</territory>
+ <territory type="LV">Lettország</territory>
+ <territory type="LY">Líbiai Arab Jamahiriya</territory>
+ <territory type="LY" references="RP3" alt="proposed-u46-1" draft="provisional">Líbia</territory>
+ <territory type="MA">Marokkó</territory>
+ <territory type="MC">Monaco</territory>
+ <territory type="MD">Moldáv Köztársaság</territory>
+ <territory type="MD" references="RP3" alt="proposed-u46-1" draft="provisional">Moldova</territory>
+ <territory type="MG">Madagaszkár</territory>
+ <territory type="MH">Marshall-szigetek</territory>
+ <territory type="MK">Macedónia, Köztársaság</territory>
+ <territory type="MK" references="RP3" alt="proposed-u46-1" draft="provisional">Macedónia</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Mianmar</territory>
+ <territory type="MN">Mongólia</territory>
+ <territory type="MO">Macao S.A.R., China</territory>
+ <territory type="MO" alt="proposed-u46-1" draft="provisional">Makaó S.A.R, Kína</territory>
+ <territory type="MP">Északi Mariana-szigetek</territory>
+ <territory type="MQ">Martinique (francia)</territory>
+ <territory type="MQ" references="RP3" alt="proposed-u46-1" draft="provisional">Martinique</territory>
+ <territory type="MR">Mauritánia</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Málta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Maldív-szigetek</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Mexikó</territory>
+ <territory type="MY">Malajzia</territory>
+ <territory type="MZ">Mozambik</territory>
+ <territory type="NA">Namíbia</territory>
+ <territory type="NC">Új Kaledónia (francia)</territory>
+ <territory type="NC" references="RP3" alt="proposed-u46-1" draft="provisional">Új-Kaledónia</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Norfolk-sziget</territory>
+ <territory type="NG">Nigéria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Hollandia</territory>
+ <territory type="NO">Norvégia</territory>
+ <territory type="NP">Nepál</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Új-Zéland</territory>
+ <territory type="OM">Omán</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Polinézia (francia)</territory>
+ <territory type="PF" references="RP3" alt="proposed-u46-1" draft="provisional">Francia Polinézia</territory>
+ <territory type="PG">Pápua Új-Guinea</territory>
+ <territory type="PH">Fülöp-szigetek</territory>
+ <territory type="PK">Pakisztán</territory>
+ <territory type="PL">Lengyelország</territory>
+ <territory type="PM">Saint Pierre és Miquelon</territory>
+ <territory type="PN">Pitcairn-sziget</territory>
+ <territory type="PR">Puerto Rico</territory>
+ <territory type="PS">Palesztín Terület</territory>
+ <territory type="PS" references="RP1" alt="proposed-u46-1" draft="provisional">Palesztin Terület</territory>
+ <territory type="PT">Portugália</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Katar</territory>
+ <territory type="QO">Külső-Óceánia</territory>
+ <territory type="RE">Reunion (francia)</territory>
+ <territory type="RE" references="RP3" alt="proposed-u46-1" draft="provisional">Réunion</territory>
+ <territory type="RO">Románia</territory>
+ <territory type="RU">Orosz Köztársaság</territory>
+ <territory type="RU" references="RP3" alt="proposed-u46-1" draft="provisional">Oroszország</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SA">Szaud-Arábia</territory>
+ <territory type="SA" references="RP3" alt="proposed-u46-1" draft="provisional">Szaúd-Arábia</territory>
+ <territory type="SB">Salamon-szigetek</territory>
+ <territory type="SC">Seychelles</territory>
+ <territory type="SC" references="RP3" alt="proposed-u46-1" draft="provisional">Seychelle-szigetek</territory>
+ <territory type="SD">Szudán</territory>
+ <territory type="SE">Svédország</territory>
+ <territory type="SG">Szingapúr</territory>
+ <territory type="SH">Saint Helena</territory>
+ <territory type="SI">Szlovénia</territory>
+ <territory type="SJ">Svalbard és Jan Mayen</territory>
+ <territory type="SK">Szlovákia</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Szenegál</territory>
+ <territory type="SO">Szomália</territory>
+ <territory type="SR">Suriname</territory>
+ <territory type="ST">Saint Tome és Principe</territory>
+ <territory type="ST" references="RP3" alt="proposed-u46-1" draft="provisional">São Tomé és Príncipe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SV" references="RP3" alt="proposed-u46-1" draft="provisional">Salvador</territory>
+ <territory type="SY">Szíriai Arab Köztársaság</territory>
+ <territory type="SY" references="RP3" alt="proposed-u46-1" draft="provisional">Szíria</territory>
+ <territory type="SZ">Szváziföld</territory>
+ <territory type="TC">Török és Caicos Szigetek</territory>
+ <territory type="TC" references="RP3" alt="proposed-u46-1" draft="provisional">Turks- és Caicos-szigetek</territory>
+ <territory type="TD">Csád</territory>
+ <territory type="TF">Francia Déli Területek</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Thaiföld</territory>
+ <territory type="TJ">Tadzsikisztán</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Kelet-Timor</territory>
+ <territory type="TM">Türkmenisztán</territory>
+ <territory type="TN">Tunézia</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Törökország</territory>
+ <territory type="TT">Trinidad és Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TW" references="RP3" alt="proposed-u46-1" draft="provisional">Tajvan</territory>
+ <territory type="TZ">Tanzánia</territory>
+ <territory type="UA">Ukrajna</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">United States Minor Outlying Islands</territory>
+ <territory type="UM" references="RP3" alt="proposed-u46-1" draft="provisional">Amerikai Csendes-óceáni Szigetek</territory>
+ <territory type="US">Egyesült Ãllamok</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Üzbegisztán</territory>
+ <territory type="VA">Vatikán</territory>
+ <territory type="VC">Saint Vincent és Grenadines</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Brit Virgin-szigetek</territory>
+ <territory type="VI">U.S. Virgin-szigetek</territory>
+ <territory type="VN">Vietnám</territory>
+ <territory type="VN" references="RP3" alt="proposed-u46-1" draft="provisional">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis és Futuna Szigetek</territory>
+ <territory type="WF" references="RP3" alt="proposed-u46-1" draft="provisional">Wallis és Futuna</territory>
+ <territory type="WS">Szamoa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Dél-Afrika</territory>
+ <territory type="ZM">Zambia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ <variants>
+ <variant type="1901" draft="provisional">Hagyományos német helyesírás</variant>
+ <variant type="1996" draft="provisional">1996-os német helyesírás</variant>
+ <variant type="POLYTONI" draft="provisional">Politonikus</variant>
+ <variant type="REVISED" draft="provisional">Ãtdolgozott helyesírás</variant>
+ </variants>
+ <keys>
+ <key type="calendar">Naptár</key>
+ <key type="collation">Rendezés</key>
+ <key type="collation" alt="proposed-u46-1" draft="provisional">Egybevetés</key>
+ <key type="currency">Pénznem</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation" draft="provisional">Hagyományos kínai (Big5)</type>
+ <type type="buddhist" key="calendar">buddhista naptár</type>
+ <type type="chinese" key="calendar">kínai naptár</type>
+ <type type="direct" key="collation">Közvetlen sorrend</type>
+ <type type="gb2312han" key="collation" draft="provisional">Egyszerűsített kínai (GB2312)</type>
+ <type type="gregorian" key="calendar">Gergely-naptár</type>
+ <type type="hebrew" key="calendar">héber naptár</type>
+ <type type="islamic" key="calendar">iszlám naptár</type>
+ <type type="islamic-civil" key="calendar">iszlám civil naptár</type>
+ <type type="japanese" key="calendar">japán naptár</type>
+ <type type="phonebook" key="collation">Telefonkönyv sorrend</type>
+ <type type="pinyin" key="collation" draft="provisional">Pinyin sorrend</type>
+ <type type="stroke" key="collation" references="RP4" draft="provisional">Vonássorrend</type>
+ <type type="traditional" key="collation">Hagyományos</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US" draft="provisional">USA</measurementSystemName>
+ <measurementSystemName type="metric" draft="provisional">Metrikus</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters references="RP5">[a á b c {cs} {ccs} d {dz} {ddz} {dzs} {ddzs} e é f g {gy} {ggy} h i í j-l {ly} {lly} m n {ny} {nny} o ó ö ő p r s {sz} {ssz} t {ty} {tty} u ú ü ű v z {zs} {zzs}]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[q w-y]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="buddhist">
+ <eras>
+ <eraAbbr>
+ <era type="0">BK</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">jan.</month>
+ <month type="2">febr.</month>
+ <month type="3">márc.</month>
+ <month type="4">ápr.</month>
+ <month type="5">máj.</month>
+ <month type="6">jún.</month>
+ <month type="7">júl.</month>
+ <month type="8">aug.</month>
+ <month type="9">szept.</month>
+ <month type="10">okt.</month>
+ <month type="11">nov.</month>
+ <month type="12">dec.</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">január</month>
+ <month type="2">február</month>
+ <month type="3">március</month>
+ <month type="4">április</month>
+ <month type="5">május</month>
+ <month type="6">június</month>
+ <month type="7">július</month>
+ <month type="8">augusztus</month>
+ <month type="9">szeptember</month>
+ <month type="10">október</month>
+ <month type="11">november</month>
+ <month type="12">december</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">J</month>
+ <month type="2">F</month>
+ <month type="3">M</month>
+ <month type="4">Ã</month>
+ <month type="5">M</month>
+ <month type="6">J</month>
+ <month type="7">J</month>
+ <month type="8">A</month>
+ <month type="9">S</month>
+ <month type="10">O</month>
+ <month type="11">N</month>
+ <month type="12">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">V</day>
+ <day type="mon">H</day>
+ <day type="tue">K</day>
+ <day type="wed">Sze</day>
+ <day type="thu">Cs</day>
+ <day type="fri">P</day>
+ <day type="sat">Szo</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">vasárnap</day>
+ <day type="mon">hétfő</day>
+ <day type="tue">kedd</day>
+ <day type="wed">szerda</day>
+ <day type="thu">csütörtök</day>
+ <day type="fri">péntek</day>
+ <day type="sat">szombat</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">V</day>
+ <day type="mon">H</day>
+ <day type="tue">K</day>
+ <day type="wed">S</day>
+ <day type="thu">C</day>
+ <day type="fri">P</day>
+ <day type="sat">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">N1</quarter>
+ <quarter type="2">N2</quarter>
+ <quarter type="3">N3</quarter>
+ <quarter type="4">N4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">I. negyedév</quarter>
+ <quarter type="2">II. negyedév</quarter>
+ <quarter type="3">III. negyedév</quarter>
+ <quarter type="4">IV. negyedév</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>DE</am>
+ <am references="RP1" alt="proposed-u46-1" draft="provisional">de.</am>
+ <pm>DU</pm>
+ <pm references="RP1" alt="proposed-u46-1" draft="provisional">du.</pm>
+ <eras>
+ <eraNames>
+ <era type="0" references="RP1" draft="provisional">időszámításunk előtt</era>
+ <era type="1" references="RP1" draft="provisional">időszámításunk szerint</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">i. e.</era>
+ <era type="1">i. sz.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>yyyy. MMMM d.</pattern>
+ <pattern references="RP5" alt="proposed-u46-1" draft="provisional">yyyy. MMMM d., EEEE</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>yyyy. MMMM d.</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy.MM.dd.</pattern>
+ <pattern references="RP5" alt="proposed-u46-1" draft="provisional">yyyy. MMM d.</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yyyy.MM.dd.</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ <pattern alt="proposed-u46-1" draft="provisional">H:mm:ss zzzz</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">MMMM d.</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">MM.dd.</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">yyyy.MM</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">yyyy. MMMM</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName references="RP1" draft="provisional">éra</displayName>
+ </field>
+ <field type="year">
+ <displayName references="RP1" draft="provisional">év</displayName>
+ </field>
+ <field type="month">
+ <displayName references="RP1" draft="provisional">hónap</displayName>
+ </field>
+ <field type="week">
+ <displayName references="RP1" draft="provisional">hét</displayName>
+ </field>
+ <field type="day">
+ <displayName references="RP1" draft="provisional">nap</displayName>
+ </field>
+ <field type="weekday">
+ <displayName references="RP1" draft="provisional">hét napja</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName references="RP1" draft="provisional">napszak</displayName>
+ </field>
+ <field type="hour">
+ <displayName references="RP1" draft="provisional">óra</displayName>
+ </field>
+ <field type="minute">
+ <displayName references="RP1" draft="provisional">perc</displayName>
+ </field>
+ <field type="second">
+ <displayName references="RP1" draft="provisional">másodperc</displayName>
+ </field>
+ <field type="zone">
+ <displayName references="RP1" draft="provisional">zóna</displayName>
+ </field>
+ </fields>
+ </calendar>
+ <calendar type="hebrew">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1">Tisri</month>
+ <month type="2">Hesván</month>
+ <month type="3">Kiszlév</month>
+ <month type="4">Tévész</month>
+ <month type="5">Svát</month>
+ <month type="6">Ãdár risón</month>
+ <month type="7">Ãdár séni</month>
+ <month type="8">Niszán</month>
+ <month type="9">Ijár</month>
+ <month type="10">Sziván</month>
+ <month type="12">Ãv</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <eras>
+ <eraAbbr>
+ <era type="0">TÉ</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ <calendar type="islamic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1">Moharrem</month>
+ <month type="3">Rébi el avvel</month>
+ <month type="4">Rébi el accher</month>
+ <month type="5">Dsemádi el avvel</month>
+ <month type="6">Dsemádi el accher</month>
+ <month type="7">Redseb</month>
+ <month type="8">Sabán</month>
+ <month type="9">Ramadán</month>
+ <month type="10">Sevvál</month>
+ <month type="11">Dsül kade</month>
+ <month type="12">Dsül hedse</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <eras>
+ <eraAbbr>
+ <era type="0">MF</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="America/Argentina/ComodRivadavia">
+ <exemplarCity>Comodoro Rivadavia</exemplarCity>
+ </zone>
+ <zone type="Pacific/Yap">
+ <exemplarCity>Yap-szigetek</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Déli-sark</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Vostok">
+ <exemplarCity>Vosztok</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity>Dumont d'Urville</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Rio_Gallegos">
+ <exemplarCity>Río Gallegos</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Tucuman">
+ <exemplarCity>Tucumán</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity>Córdoba</exemplarCity>
+ </zone>
+ <zone type="America/Eirunepe">
+ <exemplarCity>Eirunepé</exemplarCity>
+ </zone>
+ <zone type="America/Rio_Branco">
+ <exemplarCity>Río Branco</exemplarCity>
+ </zone>
+ <zone type="America/Porto_Velho">
+ <exemplarCity>Pôrto Velho</exemplarCity>
+ </zone>
+ <zone type="America/Cuiaba">
+ <exemplarCity>Cuiabá</exemplarCity>
+ </zone>
+ <zone type="America/Belem">
+ <exemplarCity>Belém</exemplarCity>
+ </zone>
+ <zone type="America/Araguaina">
+ <exemplarCity>Araguaína</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>São Paulo</exemplarCity>
+ </zone>
+ <zone type="America/Maceio">
+ <exemplarCity>Maceió</exemplarCity>
+ </zone>
+ <zone type="America/Montreal">
+ <exemplarCity>Montréal</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <exemplarCity>St. John's</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>Húsvét-szigetek</exemplarCity>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity>Kasgár</exemplarCity>
+ </zone>
+ <zone type="Asia/Urumqi">
+ <exemplarCity>Ürümqi</exemplarCity>
+ </zone>
+ <zone type="Asia/Chongqing">
+ <exemplarCity>Csungking</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity>Sanghaj</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity>Galapagos-szigetek</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>Kanári-szigetek</exemplarCity>
+ </zone>
+ <zone type="Pacific/Truk">
+ <exemplarCity>Truk-szigetek</exemplarCity>
+ </zone>
+ <zone type="Pacific/Ponape">
+ <exemplarCity>Ponape-szigetek</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kosrae">
+ <exemplarCity>Kosrae-szigetek</exemplarCity>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <standard>közép-európai idő</standard>
+ <daylight>közép-európai nyári idő</daylight>
+ </long>
+ <exemplarCity>Paris</exemplarCity>
+ <exemplarCity alt="proposed-u46-1" draft="provisional">Párizs</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity>Godthåb</exemplarCity>
+ </zone>
+ <zone type="America/Scoresbysund">
+ <exemplarCity>Scoresby Sound</exemplarCity>
+ </zone>
+ <zone type="America/Danmarkshavn">
+ <exemplarCity>Danmarks Havn</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity>Dzsakarta</exemplarCity>
+ </zone>
+ <zone type="Asia/Makassar">
+ <exemplarCity>Makasar</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kiritimati">
+ <exemplarCity>Kiritimati-sziget</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tarawa">
+ <exemplarCity draft="unconfirmed">Tarawa-sziget</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtau">
+ <exemplarCity>Aktau</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtobe">
+ <exemplarCity>Aktöbe</exemplarCity>
+ </zone>
+ <zone type="Asia/Qyzylorda">
+ <exemplarCity>Kizilorda</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity>Alma-Ata</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kwajalein">
+ <exemplarCity>Kwajalein-zátony</exemplarCity>
+ </zone>
+ <zone type="Pacific/Majuro">
+ <exemplarCity>Majuro-zátony</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity draft="unconfirmed">Ulan Bator</exemplarCity>
+ </zone>
+ <zone type="Asia/Choibalsan">
+ <exemplarCity>Csojbalszan</exemplarCity>
+ </zone>
+ <zone type="America/Mazatlan">
+ <exemplarCity>Mazatlán</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>Mexikóváros</exemplarCity>
+ </zone>
+ <zone type="America/Merida">
+ <exemplarCity>Mérida</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>Cancún</exemplarCity>
+ </zone>
+ <zone type="Pacific/Chatham">
+ <exemplarCity>Chatham-szigetek</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity draft="unconfirmed">Tahiti-sziget</exemplarCity>
+ </zone>
+ <zone type="Pacific/Marquesas">
+ <exemplarCity>Marquesas-szigetek</exemplarCity>
+ </zone>
+ <zone type="Pacific/Gambier">
+ <exemplarCity>Gambier-szigetek</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity draft="unconfirmed">Azóri-szigetek</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Madeira">
+ <exemplarCity draft="unconfirmed">Madeira-sziget</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lisszabon</exemplarCity>
+ </zone>
+ <zone type="Europe/Kaliningrad">
+ <exemplarCity>Kalinyingrád</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moszkva</exemplarCity>
+ </zone>
+ <zone type="Europe/Samara">
+ <exemplarCity>Szamara</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>Jekatyerinburg</exemplarCity>
+ </zone>
+ <zone type="Asia/Omsk">
+ <exemplarCity>Omszk</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity>Novoszibirszk</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>Krasznojarszk</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity>Irkutszk</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>Jakutszk</exemplarCity>
+ </zone>
+ <zone type="Asia/Vladivostok">
+ <exemplarCity>Vlagyivosztok</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>Szahalin</exemplarCity>
+ </zone>
+ <zone type="Asia/Magadan">
+ <exemplarCity>Magadán</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>Kamcsatka</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity>Anadir</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Jan_Mayen">
+ <exemplarCity draft="unconfirmed">Jan Mayen-szigetek</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>Ungvár</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>Kijev</exemplarCity>
+ </zone>
+ <zone type="Europe/Simferopol">
+ <exemplarCity>Szimferopol</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>Zaporozsje</exemplarCity>
+ </zone>
+ <zone type="Pacific/Midway">
+ <exemplarCity>Midway-szigetek</exemplarCity>
+ </zone>
+ <zone type="Pacific/Wake">
+ <exemplarCity>Wake-sziget</exemplarCity>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity>Szamarkand</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Taskent</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern references="RP5" draft="provisional">#,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern references="RP5" draft="provisional">#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Andorrai peseta</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">andorrai peseta</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>EAE dirham</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">emirátusi dirham</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>Afghani (1927-2002)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">afghani (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>Afghani</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">afghani</displayName>
+ <symbol>Af</symbol>
+ <symbol alt="proposed-u46-1" draft="provisional">AFN</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>Albán lek</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">lek</displayName>
+ <symbol>lek</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">ALL</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>Dram</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">dram</displayName>
+ <symbol>dram</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">AMD</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>Holland-antilla forint</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">holland antillai gulden</displayName>
+ <symbol>NA f.</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">ANG</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>Angolai kwanza</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">kwanza</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Angolai kwanza (1977-1990)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">kwanza (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>Angolai új kwanza (1990-2000)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">új kwanza (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>Angolai kwanza reajustado (1995-1999)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">kwanza reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>Argentín austral</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">argentin austral</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Argentín peso (1983-1985)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">argentin peso (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Peso</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">argentin peso</displayName>
+ <symbol>Arg$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">ARS</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>Osztrák schilling</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">osztrák schilling</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>Ausztrál dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">ausztrál dollár</displayName>
+ <symbol>$A</symbol>
+ <symbol alt="proposed-u46-1" draft="provisional">AUD</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>Arubai forint</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">arubai gulden</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>Azerbajdzsáni manat</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">azerbajdzsáni manat</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>Bosznia-hercegovinai dínár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">bosznia-hercegovinai dínár</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>Bozsnia-hercegovinai konvertibilis márka</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">márka</displayName>
+ <symbol>KM</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">BAM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>Barbadosi dollár</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">barbadosi dollár</displayName>
+ <symbol>BDS$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">BBD</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>Bangladesi taka</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">taka</displayName>
+ <symbol>Tk</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">BDT</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>Belga frank (konvertibilis)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">belga frank (konvertibilis)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Belga frank</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">belga frank</displayName>
+ <symbol>BF</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">BEF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>Belga frank (pénzügyi)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">belga frank (pénzügyi)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>Bolgár kemény leva</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">leva</displayName>
+ <symbol>lev</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">BGL</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>Bolgár új leva</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">új leva</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>Bahreini dinár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">bahreini dinár</displayName>
+ <symbol>BD</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">BHD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>Burundi frank</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">burundi frank</displayName>
+ <symbol>Fbu</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">BIF</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>Bermudai dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">bermudai dollár</displayName>
+ <symbol>Ber$</symbol>
+ <symbol alt="proposed-u46-1" draft="provisional">BMD</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>Brunei dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">brunei dollár</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>Boliviano</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">boliviano</displayName>
+ <symbol>Bs</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">BOB</symbol>
+ </currency>
+ <currency type="BOP">
+ <displayName>Bolíviai peso</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">bolíviai peso</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Bolíviai mvdol</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">bolíviai mvdol</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>Brazi cruzeiro novo (1967-1986)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">brazil cruzeiro novo (1967-1968)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>Brazi cruzado</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">brazil cruzado</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>Brazil cruzeiro (1990-1993)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">brazil cruzeiro (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Brazil real</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">real</displayName>
+ <symbol>R$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">BRL</symbol>
+ </currency>
+ <currency type="BRN">
+ <displayName>Brazil cruzado novo</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">brazil cruzado novo</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>Brazil cruzeiro</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">brazil cruzeiro</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>Bahamai dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">bahamai dollár</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>Bhutáni ngultrum</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">ngultrum</displayName>
+ <symbol>Nu</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">BTN</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>Burmai kyat</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>Botswanai pula</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">pula</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>Fehérorosz új rubel (1994-1999)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">belorusz új rubel (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>Fehérorosz rubel</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">belorusz rubel</displayName>
+ <symbol>Rbl</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">BYR</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>Belizei dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">belizei dollár</displayName>
+ <symbol>BZ$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">BZD</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>Kanadai dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">kanadai dollár</displayName>
+ <symbol>Can$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">CAD</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>Kongói frank</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">kongói frank</displayName>
+ </currency>
+ <currency type="CHE">
+ <displayName draft="provisional">WIR euro</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Svájci frank</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">svájci frank</displayName>
+ <symbol>SwF</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">CHF</symbol>
+ </currency>
+ <currency type="CHW">
+ <displayName draft="provisional">WIR frank</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>Chilei unidades de fomento</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">chilei unidades de fomento</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Chilei peso</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">chilei peso</displayName>
+ <symbol>Ch$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">CLP</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>Kínai jüan renminbi</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">jüan</displayName>
+ <symbol>Y</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">CNY</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>Kolumbiai peso</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">kolumbiai peso</displayName>
+ <symbol>Col$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">COP</symbol>
+ </currency>
+ <currency type="COU">
+ <displayName draft="provisional">unidad de valor real</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>Costa Ricai colon</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">costa ricai colón</displayName>
+ <symbol>C</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">CRC</symbol>
+ </currency>
+ <currency type="CSD">
+ <displayName draft="provisional">szerb dinár</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>Csehszlovák kemény korona</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">csehszlovák korona</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Kubai peso</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">kubai peso</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Cape Verdei escudo</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">cape verdei escudo</displayName>
+ <symbol>CVEsc</symbol>
+ <symbol alt="proposed-u46-1" draft="provisional">CVE</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>Ciprusi font</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">ciprusi font</displayName>
+ <symbol>£C</symbol>
+ <symbol alt="proposed-u46-1" draft="provisional">CYP</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>Cseh korona</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">cseh korona</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>Kelet-Német márka</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">kelet-német márka</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Német márka</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">német márka</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Dzsibuti frank</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">dzsibuti frank</displayName>
+ <symbol>DF</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">DJF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>Dán korona</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">dán korona</displayName>
+ <symbol>DKr</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">DKK</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>Dominikai peso</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">dominikai peso</displayName>
+ <symbol>RD$</symbol>
+ <symbol alt="proposed-u46-1" draft="provisional">DOP</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>Algériai dínár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">algériai dinár</displayName>
+ <symbol>DA</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">DZD</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>Ecuadori sucre</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">sucre</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>Ecuadori Unidad de Valor Constante (UVC)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">unidad de valor constante</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>Észt korona</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">észt korona</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>Egyiptomi font</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">egyiptomi font</displayName>
+ </currency>
+ <currency type="EQE">
+ <displayName draft="provisional">ekwele</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Eritreai nakfa</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">nakfa</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName draft="provisional">spanyol peseta (A-kontó)</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName draft="provisional">spanyol peseta (konvertibilis kontó)</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Spanyol peseta</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">spanyol peseta</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>Etiópiai birr</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">birr</displayName>
+ <symbol>Br</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">ETB</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euro</displayName>
+ <symbol draft="provisional">EUR</symbol>
+ </currency>
+ <currency type="FIM">
+ <displayName>Finn markka</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">markka</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Fidzsi dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">fidzsi dollár</displayName>
+ <symbol>F$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">FJD</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>Falkland-szigeteki font</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">falklandi pound</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Francia frank</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">francia frank</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Brit font sterling</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">brit font</displayName>
+ <symbol references="RP3" draft="provisional">GBP</symbol>
+ </currency>
+ <currency type="GEK">
+ <displayName>Grúz kupon larit</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">kupon larit</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>Grúz lari</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">lari</displayName>
+ <symbol>lari</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">GEL</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>Ghánai cedi</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">cedi</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>Gibraltári font</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">gibraltári font</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>Gambiai dalasi</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">dalasi</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Guineai frank</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">guineai frank</displayName>
+ <symbol>GF</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">GNF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>Guineai syli</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">guineai syli</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Egyenlítői-guineai ekwele guineana</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">egyenlítői-guineai ekwele guineana</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Görög drachma</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">görög drachma</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Guatemalai quetzal</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">quetzal</displayName>
+ <symbol>Q</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">GTQ</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>Portugál guinea escudo</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">portugál guinea escudo</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Guinea-Bissaui peso</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">guinea-bissaui peso</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>Guyanai dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">guyanai dollár</displayName>
+ <symbol>G$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">GYD</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>Hongkongi dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">hongkongi dollár</displayName>
+ <symbol>HK$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">HKD</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>Hodurasi lempira</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">lempira</displayName>
+ <symbol>L</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">HNL</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>Horvát dínár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">dinár</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Horvát kuna</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">kuna</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>Haiti gourde</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">gourde</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Magyar forint</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">forint</displayName>
+ <symbol>Ft</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">HUF</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>Indonéz rúpia</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">indonéz rúpia</displayName>
+ <symbol>Rp</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">IDR</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>Ãr font</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">ír font</displayName>
+ <symbol>IR£</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">IEP</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>Izraeli font</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">izraeli font</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Izraeli új sékel</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">új izraeli shekel</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="provisional">indiai rúpia</displayName>
+ <symbol draft="provisional">INR</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>Iraki dínár</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">iraki dinár</displayName>
+ <symbol>ID</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">IQD</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>Iráni rial</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">iráni rial</displayName>
+ <symbol>RI</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">IRR</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>Izlandi korona</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">izlandi korona</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>Olasz líra</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">olasz líra</displayName>
+ <symbol references="RP3" draft="provisional">LIT</symbol>
+ </currency>
+ <currency type="JMD">
+ <displayName>Jamaikai dollár</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">jamaicai dollár</displayName>
+ <symbol>J$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">JMD</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>Jordániai dínár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">jordániai dinár</displayName>
+ <symbol>JD</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">JOD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>Japán jen</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">jen</displayName>
+ <symbol references="RP3" draft="provisional">JPY</symbol>
+ </currency>
+ <currency type="KES">
+ <displayName>Kenyai shilling</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">kenyai shilling</displayName>
+ <symbol>K Sh</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">KES</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>Kirgizisztáni szom</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">kirgizisztáni szom</displayName>
+ <symbol>som</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">KGS</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>Kambodzsai riel</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">riel</displayName>
+ <symbol>CR</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">KHR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>Comorei frank</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">comorei frank</displayName>
+ <symbol>CF</symbol>
+ <symbol alt="proposed-u46-1" draft="provisional">KMF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>Észak-koreai won</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">észak-koreai won</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Dél-koreai won</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">dél-koreai won</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>Kuvaiti dínár</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">kuvaiti dinár</displayName>
+ <symbol>KD</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">KWD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>Kajmán-szigeteki dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">kajmán-szigeteki dollár</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Kazahsztáni tenge</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">tenge</displayName>
+ <symbol>T</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">KZT</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>Laoszi kip</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">kip</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>Libanoni font</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">libanoni font</displayName>
+ <symbol>LL</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">LBP</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>Sri Lankai rúpia</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">srí lankai rúpia</displayName>
+ <symbol>SL Re</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">LKR</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>Libériai dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">libériai dollár</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Lesothoi loti</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">loti</displayName>
+ <symbol>M</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">LSL</symbol>
+ </currency>
+ <currency type="LSM">
+ <displayName draft="provisional">maloti</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>Litvániai litas</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">litas</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Litvániai talonas</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">talonas</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName draft="provisional">luxemburgi konvertibilis frank</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Luxemburgi frank</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">luxemburgi frank</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName draft="provisional">luxemburgi pénzügyi frank</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Lett lats</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">lats</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>Lett rubel</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">rubel</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>Líbiai dínár</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">líbiai dinár</displayName>
+ <symbol>LD</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">LYD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>Marokkói dirham</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">marokkói dirham</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>Marokkói frank</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">marokkói frank</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>Moldován lei</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">moldován lei</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>Madagaszkári ariary</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">madagaszkári ariary</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Madagaszkári frank</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">madagaszkári frank</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>Macedon dínár</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">macedóniai dinár</displayName>
+ <symbol>MDen</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">MKD</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>Mali frank</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">mali frank</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Mianmari kyat</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>Mongóliai tugrik</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">tugrik</displayName>
+ <symbol>Tug</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">MNT</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Macaoi pataca</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">makaói pataca</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Mauritániai ouguiya</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">ouguiya</displayName>
+ <symbol>UM</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">MRO</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>Máltai líra</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">máltai líra</displayName>
+ <symbol>Lm</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">MTL</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>Máltai font</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">máltai font</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>Mauritiusi rúpia</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">mauritiusi rúpia</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>Maldív-szigeteki rufiyaa</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">rufiyaa</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Malawi kwacha</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">malawi kwacha</displayName>
+ <symbol>MK</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">MWK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>Mexikói peso</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">mexikói peso</displayName>
+ <symbol>MEX$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">MXN</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>Mexikói ezüst peso (1861-1992)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">mexikói ezüst peso (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>Mexikói Unidad de Inversion (UDI)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">mexikói unidad de inversion (UDI)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Malajziai ringgit</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">ringgit</displayName>
+ <symbol>RM</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">MYR</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>Mozambik escudo</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">escudo</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Mozambik metical</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">metical</displayName>
+ <symbol>Mt</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">MZM</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>Namíbiai dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">namíbiai dollár</displayName>
+ <symbol>N$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">NAD</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>Nigériai naira</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">naira</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>Nikaraguai cordoba</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>Nikaraguai cordoba oro</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">arany cordoba</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Holland forint</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">holland gulden</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Norvég korona</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">norvég korona</displayName>
+ <symbol>NKr</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">NOK</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>Nepáli rúpia</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">nepáli rúpia</displayName>
+ <symbol>Nrs</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">NPR</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>Új-zélandi dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">új-zélandi dollár</displayName>
+ <symbol>$NZ</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">NZD</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>Ománi rial</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">ománi rial</displayName>
+ <symbol>RO</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">OMR</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>Panamai balboa</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">balboa</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>Perui inti</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">inti</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>Perui sol nuevo</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">nuevo sol</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>Perui sol</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">sol</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Pápua új-guineai kina</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">kina</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>Fülöp-szigeteki peso</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">fülöp-szigeteki peso</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>Pakisztáni rúpia</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">pakisztáni rúpia</displayName>
+ <symbol>Pra</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">PKR</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>Lengyel zloty</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">złoty</displayName>
+ <symbol>Zl</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">PLN</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Lengyel zloty (1950-1995)</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">złoty (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Portugál escudo</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">portugál escudo</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>Paraguayi guarani</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">guarani</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>Katari rial</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">katari rial</displayName>
+ <symbol>QR</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">QAR</symbol>
+ </currency>
+ <currency type="RHD">
+ <displayName draft="provisional">rhodéziai dollár</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>Román lej</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">lej</displayName>
+ <symbol>leu</symbol>
+ <symbol alt="proposed-u46-1" draft="provisional">ROL</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>Orosz rubel</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">orosz rubel</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Orosz rubel (1991-1998)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">orosz rubel (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>Ruandai frank</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">ruandai frank</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>Szaúdi riyal</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">szaúdi riyal</displayName>
+ <symbol>SRl</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">SAR</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>Salamon-szigeteki dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">salamon-szigeteki dollár</displayName>
+ <symbol>SI$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">SBD</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>Seychelle-szigeteki rúpia</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">seychelle-i rúpia</displayName>
+ <symbol>SR</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">SCR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>Szudáni dínár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">szudáni dinár</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>Szudáni font</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">szudáni font</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>Svéd korona</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">svéd korona</displayName>
+ <symbol>SKr</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">SEK</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>Szingapúri dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">szingapúri dollár</displayName>
+ <symbol>S$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">SGD</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>Saint Helena font</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">saint helena font</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Szlovén tolar</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">tolar</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Szlovák korona</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">szlovák korona</displayName>
+ <symbol>Sk</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">SKK</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>Sierra Leonei leone</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">leone</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>Szomáli shilling</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">szomáli shilling</displayName>
+ <symbol>So. Sh.</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">SOS</symbol>
+ </currency>
+ <currency type="SRG">
+ <displayName>Suriname-i gulden</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">suriname-i guilder</displayName>
+ <symbol>Sf</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">SRG</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>Sao tome-i és principe-i dobra</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">dobra</displayName>
+ <symbol>Db</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">STD</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>Szovjet rubel</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">szovjet rubel</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>Salvadori colón</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">salvadori colon</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>Szíriai font</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">szíriai font</displayName>
+ <symbol>LS</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">SYP</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>Szváziföldi lilangeni</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">lilangeni</displayName>
+ <symbol>E</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">SZL</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>Thai baht</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">baht</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>Tádzsikisztáni rubel</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">tádzsik rubel</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Tádzsikisztáni somoni</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">somoni</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Türkmenisztáni manat</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">türkmén manat</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>Tunéziai dínár</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">tunéziai dinár</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName references="RP3" draft="provisional">pa'anga</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>Timori escudo</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">timori escudo</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Török líra</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">török líra</displayName>
+ <symbol>TL</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">TRL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName draft="provisional">új török líra</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Trinidad és tobagoi dollár</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">trinidad-tobagói dollár</displayName>
+ <symbol>TT$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">TTD</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>Tajvani új dollár</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">új tajvani dollár</displayName>
+ <symbol>NT$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">TWD</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>Tanzániai shilling</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">tanzániai shilling</displayName>
+ <symbol>T Sh</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">TZS</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>Ukrán hrivnya</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">hrivnya</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Ukrán karbovanec</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">karbovanec</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Ugandai shilling (1966-1987)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">ugandai shilling (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Ugandai shilling</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">ugandai shilling</displayName>
+ <symbol>U Sh</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">UGX</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>USA dollár</displayName>
+ <symbol>US$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">USD</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>USA dollár (következő napi)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>USA dollár (aznapi)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>Uruguay-i peso (1975-1993)</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">uruguayi peso (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>Uruguay-i peso uruguayo</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">uruguayi peso</displayName>
+ <symbol>Ur$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">UYU</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>Üzbegisztáni szum</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">üzbegisztáni szum</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Venezuelai bolívar</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">bolivar</displayName>
+ <symbol>Be</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">VEB</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>Vietnámi dong</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">dong</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>Vanuatui vatu</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">vatu</displayName>
+ <symbol>VT</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">VUV</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>Nyugat-szamoai tala</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">tala</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>CFA frank BEAC</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName draft="provisional">Ezüst</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>Arany</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>European Composite Unit</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>European Monetary Unit</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>European Unit of Account (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>European Unit of Account (XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>Kelet-karibi dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">kelet-karibi dollár</displayName>
+ <symbol>EC$</symbol>
+ <symbol alt="proposed-u46-1" draft="provisional">XCD</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>Special Drawing Rights</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>European Currency Unit</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">európai pénznemegység</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>Francia arany frank</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">francia aranyfrank</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>Francia UIC-frank</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">francia UIC-frank</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>CFA frank BCEAO</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName draft="provisional">palládium</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>CFP frank</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="XPT">
+ <displayName draft="provisional">platina</displayName>
+ </currency>
+ <currency type="XTS">
+ <displayName draft="provisional">tesztelési pénznemkód</displayName>
+ </currency>
+ <currency type="XXX">
+ <displayName draft="provisional">nincs pénznem</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>Jemeni dínár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">jemeni dinár</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Jemeni rial</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">jemeni rial</displayName>
+ <symbol>YRl</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">YER</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>Jugoszláv kemény dínár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">jugoszláv dinár</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>Jugoszláv új dínár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">új jugoszláv dinár</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>Jugoszláv konvertibilis dínár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">konvertibilis jugoszláv dinár</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>Dél-afrikai rand (pénzügyi)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Dél-afrikai rand</displayName>
+ <displayName references="RP3" alt="proposed-u46-1" draft="provisional">rand</displayName>
+ <symbol>R</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">ZAR</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Zambiai kwacha</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">zambiai kwacha</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Zairei új zaire</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">zairei új zaire</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Zairei zaire</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">zairei zaire</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Zimbabwei dollár</displayName>
+ <displayName alt="proposed-u46-1" draft="provisional">zimbabwei dollár</displayName>
+ <symbol>Z$</symbol>
+ <symbol references="RP3" alt="proposed-u46-1" draft="provisional">ZWD</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>igen:i</yesstr>
+ <nostr>nem:n</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1">Helyesírási kéziszótár, Második kiadás, Akadémiai Kiadó, Budapest, 1991, ISBN 963 05 6040 2</reference>
+ <reference type="RP2">Angol-magyar nagyszótár, Tizenegyedik kiadás (az ötödik, teljesen átdolgozott és bővített kiadás változatlan lenyomata), Akadémiai Kiadó, Budapest, 1992, ISBN 963 05 6349 5 (I-II. kötet)</reference>
+ <reference type="RP3" uri="http://www.cartographia.hu/">Földrajzi világatlasz, Cartographia Kft., Budapest, 2004, ISBN 963 352 570 5 CM</reference>
+ <reference type="RP4" uri="http://web.tvnetwork.hu/~aguti/shufa.htm">Kalligráfia</reference>
+ <reference type="RP5" uri="http://www.akademiaikiado.hu/">A magyar helyesírás szabályai, Tizenegyedik kiadás, Tizenkettedik (szótári anyagában bővített) lenyomat, Akadémiai Kiadó, Budapest, 2000, ISBN 963 05 7735 6</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/hu_HU.xml b/libs/Zend/Locale/Data/hu_HU.xml
new file mode 100755
index 0000000000..db32accd43
--- /dev/null
+++ b/libs/Zend/Locale/Data/hu_HU.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/24 23:27:00 $"/>
+ <language type="hu"/>
+ <territory type="HU"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">»</quotationStart>
+ <quotationEnd draft="unconfirmed">«</quotationEnd>
+ <alternateQuotationStart>„</alternateQuotationStart>
+ <alternateQuotationEnd>â€</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/hy.xml b/libs/Zend/Locale/Data/hy.xml
new file mode 100755
index 0000000000..1224f6d24b
--- /dev/null
+++ b/libs/Zend/Locale/Data/hy.xml
@@ -0,0 +1,356 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.49 $"/>
+ <generation date="$Date: 2006/06/28 21:46:02 $"/>
+ <language type="hy"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="de" draft="unconfirmed">Ô³Õ¥Ö€Õ´Õ¡Õ¶Õ¥Ö€Õ¥Õ¶</language>
+ <language type="en" draft="unconfirmed">Ô±Õ¶Õ£Õ¬Õ¥Ö€Õ¥Õ¶</language>
+ <language type="es" draft="unconfirmed">Ô»Õ½ÕºÕ¡Õ¶Õ¥Ö€Õ¥Õ¶</language>
+ <language type="fr" draft="unconfirmed">Õ–Ö€Õ¡Õ¶Õ½Õ¥Ö€Õ¥Õ¶</language>
+ <language type="hy">Õ€Õ¡ÕµÕ¥Ö€Õ§Õ¶</language>
+ <language type="hy" alt="proposed-u152-1" draft="unconfirmed">Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶</language>
+ <language type="it" draft="unconfirmed">Ô»Õ¿Õ¡Õ¬Õ¥Ö€Õ¥Õ¶</language>
+ <language type="ja" draft="unconfirmed">ÕƒÕ¡ÕºÕ¸Õ¶Õ¥Ö€Õ¥Õ¶</language>
+ <language type="pt" draft="unconfirmed">ÕŠÕ¸Ö€Õ¿Õ¸Ö‚Õ£Õ¡Õ¬Õ¥Ö€Õ¥Õ¶</language>
+ <language type="ru" draft="unconfirmed">Ռուսերեն</language>
+ <language type="zh" draft="unconfirmed">Õ‰Õ«Õ¶Õ¡Ö€Õ¥Õ¶</language>
+ </languages>
+ <territories>
+ <territory type="001" draft="unconfirmed">Ô±Õ·Õ­Õ¡Ö€Õ°</territory>
+ <territory type="002" draft="unconfirmed">Ô±Ö†Ö€Õ«Õ¯Õ¡</territory>
+ <territory type="005" draft="unconfirmed">Õ€Õ¡Ö€Õ¡Õ¾Õ¡ÕµÕ«Õ¶ Ô±Õ´Õ¥Ö€Õ«Õ¯Õ¡</territory>
+ <territory type="011" draft="unconfirmed">Ô±Ö€Ö‡Õ´Õ¿ÕµÕ¡Õ¶ Ô±Ö†Ö€Õ«Õ¯Õ¡</territory>
+ <territory type="014" draft="unconfirmed">Ô±Ö€Ö‡Õ¥Õ¬ÕµÕ¡Õ¶ Ô±Ö†Ö€Õ«Õ¯Õ¡</territory>
+ <territory type="015" draft="unconfirmed">Õ€ÕµÕ¸Ö‚Õ½Õ«Õ½Õ¡ÕµÕ«Õ¶ Ô±Ö†Ö€Õ«Õ¯Õ¡</territory>
+ <territory type="018" draft="unconfirmed">Õ€Õ¡Ö€Õ¡Õ¾Õ¡ÕµÕ«Õ¶ Ô±Ö†Ö€Õ«Õ¯Õ¡ [018]</territory>
+ <territory type="AD">Ô±Õ¶Õ¤Õ¸Ö€Õ¡</territory>
+ <territory type="AE">Õ„Õ«Õ¡ÖÕµÕ¡Õ¬ Ô±Ö€Õ¡Õ¢Õ¡Õ¯Õ¡Õ¶ Ô·Õ´Õ«Ö€Õ¡Õ©Õ¶Õ¥Ö€</territory>
+ <territory type="AF">Ô±Ö†Õ²Õ¡Õ¶Õ½Õ¿Õ¡Õ¶</territory>
+ <territory type="AG">Ô±Õ¶Õ¿Õ«Õ£Õ¸Ö‚Õ¡-Ô²Õ¡Ö€Õ¢Õ¸Ö‚Õ¤Õ¡</territory>
+ <territory type="AL">Ô±Õ¬Õ¢Õ¡Õ¶Õ«Õ¡</territory>
+ <territory type="AM">Õ€Õ¡ÕµÕ¡Õ½Õ¿Õ¡Õ¶Õ« Õ€Õ¡Õ¶Ö€Õ¡ÕºÕ¥Õ¿Õ¸Ö‚Õ©Õ«Ö‚Õ¶</territory>
+ <territory type="AM" alt="proposed-u152-1" draft="unconfirmed">Õ€Õ¡ÕµÕ¡Õ½Õ¿Õ¡Õ¶</territory>
+ <territory type="AO">Ô±Õ¶Õ£Õ¸Õ¬Õ¡</territory>
+ <territory type="AR">Ô±Ö€Õ£Õ¥Õ¶Õ¿Õ«Õ¶Õ¡</territory>
+ <territory type="AT">Ô±Õ¾Õ½Õ¿Ö€Õ«Õ¡</territory>
+ <territory type="AU">Ô±Õ¾Õ½Õ¿Ö€Õ¡Õ¬Õ«Õ¡</territory>
+ <territory type="AZ">Ô±Õ¤Ö€Õ¢Õ¥Õ»Õ¡Õ¶</territory>
+ <territory type="BA">Ô²Õ¸Õ½Õ¶Õ«Õ¡-Õ€Õ¥Ö€ÖÕ¥Õ£Õ¸Õ¾Õ«Õ¶Õ¡</territory>
+ <territory type="BB">Ô²Õ¡Ö€Õ¢Õ¡Õ¤Õ¸Õ½</territory>
+ <territory type="BD">Ô²Õ¡Õ¶Õ£Õ¬Õ¡Õ¤Õ¥Õ·</territory>
+ <territory type="BE">Ô²Õ¥Õ¬Õ£Õ«Õ¡</territory>
+ <territory type="BF">Ô²Õ¸Ö‚Ö€Õ¯Õ«Õ¶Õ¡ Õ–Õ¡Õ½Õ¸</territory>
+ <territory type="BG">Ô²Õ¸Ö‚Õ¬Õ²Õ¡Ö€Õ«Õ¡</territory>
+ <territory type="BH">Ô²Õ¡Õ°Ö€Õ¥ÕµÕ¶</territory>
+ <territory type="BI">Ô²Õ¸Ö‚Ö€Õ¸Ö‚Õ¶Õ¤Õ«</territory>
+ <territory type="BJ">Ô²Õ¥Õ¶Õ«Õ¶</territory>
+ <territory type="BN">Ô²Ö€Õ¸Ö‚Õ¶Õ¥Õµ</territory>
+ <territory type="BO">Ô²Õ¸Õ¬Õ«Õ¾Õ«Õ¡</territory>
+ <territory type="BR">Ô²Ö€Õ¡Õ¦Õ«Õ¬Õ«Õ¡</territory>
+ <territory type="BS">Ô²Õ¡Õ°Õ¡Õ´Õ¶Õ¥Ö€</territory>
+ <territory type="BT">Ô²Õ¸Ö‚Õ¿Õ¡Õ¶</territory>
+ <territory type="BW">Ô²Õ¸Õ¿Õ½Õ¾Õ¡Õ¶Õ¡</territory>
+ <territory type="BY">Ô²Õ¥Õ¬Õ¸Õ¼Õ¸Ö‚Õ½</territory>
+ <territory type="BY" alt="proposed-u152-1" draft="unconfirmed">Ô²Õ¥Õ¬Õ¡Õ¼Õ¸Ö‚Õ½</territory>
+ <territory type="BZ">Ô²Õ¥Õ¬Õ«Õ¦</territory>
+ <territory type="CA">Ô¿Õ¡Õ¶Õ¡Õ¤Õ¡</territory>
+ <territory type="CF">Ô¿Õ¥Õ¶Õ¿Ö€Õ¸Õ¶Õ¡Õ¯Õ¡Õ¶ Ô±Ö†Ö€Õ«Õ¯ÕµÕ¡Õ¶ Õ€Õ¡Õ¶Ö€Õ¡ÕºÕ¥Õ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶</territory>
+ <territory type="CG">Ô¿Õ¸Õ¶Õ£Õ¸</territory>
+ <territory type="CH">Õ‡Õ¾Õ¥ÕµÖÕ¡Ö€Õ«Õ¡</territory>
+ <territory type="CI">Õ“Õ²Õ¸Õ½Õ¯Ö€Õ« Ô±Öƒ</territory>
+ <territory type="CL">Õ‰Õ«Õ¬Õ«</territory>
+ <territory type="CM">Ô¿Õ¡Õ´Õ¥Ö€Õ¸Ö‚Õ¶</territory>
+ <territory type="CN">Õ‰Õ«Õ¶Õ¡Õ½Õ¿Õ¡Õ¶</territory>
+ <territory type="CO">Ô¿Õ¸Õ¬Õ¸Ö‚Õ´Õ¢Õ«Õ¡</territory>
+ <territory type="CR">Կոստա-Ռիկա</territory>
+ <territory type="CS" draft="unconfirmed">ÕÕ¥Ö€Õ¢Õ«Õ¡ Ö‡ Õ„Õ¸Õ¶Õ¿Õ¥Õ¶Õ¥Õ£Ö€Õ¸</territory>
+ <territory type="CU">Ô¿Õ¸Ö‚Õ¢Õ¡</territory>
+ <territory type="CV">Ô¿Õ¡Õ¢Õ¸-ÕŽÕ¥Ö€Õ¤Õ¥</territory>
+ <territory type="CY">Ô¿Õ«ÕºÖ€Õ¸Õ½</territory>
+ <territory type="CZ">Õ‰Õ¥Õ­Õ«Õ¡ÕµÕ« Õ€Õ¡Õ¶Ö€Õ¡ÕºÕ¥Õ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶</territory>
+ <territory type="DE">Ô³Õ¥Ö€Õ´Õ¡Õ¶Õ«Õ¡</territory>
+ <territory type="DJ">Õ‹Õ«Õ¢Õ¸Ö‚Õ¿Õ«</territory>
+ <territory type="DK">Ô´Õ¡Õ¶Õ«Õ¡</territory>
+ <territory type="DM">Ô´Õ¸Õ´Õ«Õ¶Õ«Õ¯Õ¡</territory>
+ <territory type="DO">Ô´Õ¸Õ´Õ«Õ¶Õ«Õ¯ÕµÕ¡Õ¶ Õ€Õ¡Õ¶Ö€Õ¡ÕºÕ¥Õ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶</territory>
+ <territory type="DZ">Ô±Õ¬ÕªÕ«Ö€</territory>
+ <territory type="EC">Ô·Õ¯Õ¾Õ¡Õ¤Õ¸Ö€</territory>
+ <territory type="EE">Ô·Õ½Õ¿Õ¸Õ¶Õ«Õ¡</territory>
+ <territory type="EG">ÔµÕ£Õ«ÕºÕ¿Õ¸Õ½</territory>
+ <territory type="EH">Ô±Ö€Õ¥Õ¾Õ´Õ¿ÕµÕ¡Õ¶ ÕÕ¡Õ°Õ¡Ö€Õ¡</territory>
+ <territory type="EH" alt="proposed-u152-1" draft="unconfirmed">Ô±Ö€Ö‡Õ´Õ¿ÕµÕ¡Õ¶ ÕÕ¡Õ°Õ¡Ö€Õ¡</territory>
+ <territory type="ER">Ô·Ö€Õ«Õ¿Ö€Õ¥Õ¡</territory>
+ <territory type="ES">Ô»Õ½ÕºÕ¡Õ¶Õ«Õ¡</territory>
+ <territory type="ET">ÔµÕ©Õ¸Õ¾ÕºÕ«Õ¡</territory>
+ <territory type="FI">Õ–Õ«Õ¶Õ¬Õ¡Õ¶Õ¤Õ«Õ¡</territory>
+ <territory type="FJ">Õ–Õ«Õ»Õ«</territory>
+ <territory type="FM">Õ„Õ«Õ¯Ö€Õ¸Õ¶Õ¥Õ¦Õ«Õ¡</territory>
+ <territory type="FR">Õ–Ö€Õ¡Õ¶Õ½Õ«Õ¡</territory>
+ <territory type="GA">Ô³Õ¡Õ¢Õ¸Õ¶</territory>
+ <territory type="GB">Õ„Õ¥Õ® Ô²Ö€Õ«Õ¿Õ¡Õ¶Õ«Õ¡</territory>
+ <territory type="GB" alt="proposed-u152-1" draft="unconfirmed">Õ„Õ«Õ¡ÖÕµÕ¡Õ¬ Ô¹Õ¡Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶</territory>
+ <territory type="GD">Ô³Ö€Õ¥Õ¶Õ¡Õ¤Õ¡</territory>
+ <territory type="GE">ÕŽÖ€Õ¡Õ½Õ¿Õ¡Õ¶</territory>
+ <territory type="GH">Ô³Õ¡Õ¶Õ¡</territory>
+ <territory type="GM">Ô³Õ¡Õ´Õ¢Õ«Õ¡</territory>
+ <territory type="GN">Ô³Õ¾Õ«Õ¶Õ¥Õ¡</territory>
+ <territory type="GQ">Õ€Õ¡Õ½Õ¡Ö€Õ¡Õ¯Õ¡Õ®Õ¡ÕµÕ«Õ¶ Ô³Õ¾Õ«Õ¶Õ¥Õ¡</territory>
+ <territory type="GR">Õ€Õ¸Ö‚Õ¶Õ¡Õ½Õ¿Õ¡Õ¶</territory>
+ <territory type="GT">Ô³Õ¾Õ¡Õ¿Õ¥Õ´Õ¡Õ¬Õ¡</territory>
+ <territory type="GW">Ô³Õ¾Õ«Õ¶Õ¥Õ¡-Ô²Õ«Õ½Õ¡Õ¸Ö‚</territory>
+ <territory type="GY">Ô³Õ¡ÕµÕ¡Õ¶Õ¡</territory>
+ <territory type="HN">Õ€Õ¸Õ¶Õ¤Õ¸Ö‚Ö€Õ¡Õ½</territory>
+ <territory type="HR">Õ€Õ¸Ö€Õ¾Õ¡Õ©Õ«Õ¡</territory>
+ <territory type="HT">Õ€Õ¡Õ«Õ©Õ«</territory>
+ <territory type="HU">Õ€Õ¸Ö‚Õ¶Õ£Õ¡Ö€Õ«Õ¡</territory>
+ <territory type="ID">Ô»Õ¶Õ¤Õ¸Õ¶Õ¥Õ¦Õ«Õ¡</territory>
+ <territory type="IE">Ô»Õ¼Õ¬Õ¡Õ¶Õ¤Õ«Õ¡</territory>
+ <territory type="IL">Ô»Õ½Ö€Õ¡ÕµÕ¥Õ¬</territory>
+ <territory type="IN">Õ€Õ¶Õ¤Õ¯Õ¡Õ½Õ¿Õ¡Õ¶</territory>
+ <territory type="IQ">Ô»Ö€Õ¡Ö„</territory>
+ <territory type="IR">Ô»Ö€Õ¡Õ¶</territory>
+ <territory type="IS">Ô»Õ½Õ¬Õ¡Õ¶Õ¤Õ«Õ¡</territory>
+ <territory type="IT">Ô»Õ¿Õ¡Õ¬Õ«Õ¡</territory>
+ <territory type="JM">Õ‹Õ¡Õ´Õ¡ÕµÕ¯Õ¡</territory>
+ <territory type="JO">Õ€Õ¸Ö€Õ¤Õ¡Õ¶Õ¡Õ¶</territory>
+ <territory type="JP">ÕƒÕ¡ÕºÕ¸Õ¶Õ«Õ¡</territory>
+ <territory type="KE">Õ”Õ¥Õ¶Õ«Õ¡</territory>
+ <territory type="KG">Ô¿Õ«Ö€Õ£Õ«Õ¦Õ½Õ¿Õ¡Õ¶</territory>
+ <territory type="KH">Ô¿Õ¡Õ´Õ¢Õ¸Õ»Õ¡</territory>
+ <territory type="KI">Ô¿Õ«Ö€Õ«Õ¢Õ¡Õ¿Õ«</territory>
+ <territory type="KM">Ô¿Õ¸Õ´Õ¸Ö€Õ¸Õ½</territory>
+ <territory type="KN">ÕÕ¥Õ¶Õ¿ Ô¿Õ«Õ¿Õ½-Õ†Õ¥Õ¾Õ«Õ½</territory>
+ <territory type="KP">Õ€ÕµÕ¸Ö‚Õ½Õ«Õ½Õ¡ÕµÕ«Õ¶ Ô¿Õ¸Ö€Õ¥Õ¡</territory>
+ <territory type="KR">Õ€Õ¡Ö€Õ¡Õ¾Õ¡ÕµÕ«Õ¶ Ô¿Õ¸Ö€Õ¥Õ¡</territory>
+ <territory type="KW">Õ”Õ¸Ö‚Õ¾Õ¥ÕµÕ©</territory>
+ <territory type="KZ">Õ‚Õ¡Õ¦Õ¡Õ­Õ½Õ¿Õ¡Õ¶</territory>
+ <territory type="LA">Ô¼Õ¡Õ¸Õ½</territory>
+ <territory type="LB">Ô¼Õ«Õ¢Õ¡Õ¶Õ¡Õ¶</territory>
+ <territory type="LC">ÕÕ¡Õ¶Õ¿Õ¡ Ô¼Õ¸Ö‚Õ¹Õ«Õ¡</territory>
+ <territory type="LI">Ô¼Õ«Õ­Õ¿Õ¥Õ¶Õ·Õ¿Õ¥ÕµÕ¶</territory>
+ <territory type="LK">Õ‡Ö€Õ« Ô¼Õ¡Õ¶Õ¯Õ¡</territory>
+ <territory type="LR">Ô¼Õ«Õ¢Õ¥Ö€Õ«Õ¡</territory>
+ <territory type="LS">Ô¼Õ¥Õ½Õ¸Õ¿Õ¸</territory>
+ <territory type="LT">Ô¼Õ«Õ¿Õ¾Õ¡</territory>
+ <territory type="LU">Ô¼ÕµÕ¸Ö‚Ö„Õ½Õ¥Õ´Õ¢Õ¸Ö‚Ö€Õ£</territory>
+ <territory type="LV">Ô¼Õ¡Õ¿Õ¾Õ«Õ¡</territory>
+ <territory type="LY">Ô¼Õ«Õ¢Õ«Õ¡</territory>
+ <territory type="MA">Õ„Õ¡Ö€Õ¸Õ¯Õ¸</territory>
+ <territory type="MC">Õ„Õ¸Õ¶Õ¡Õ¯Õ¸</territory>
+ <territory type="MD">Õ„Õ¸Õ¬Õ¤Õ¸Õ¾Õ¡</territory>
+ <territory type="MG">Õ„Õ¡Õ¤Õ¡Õ£Õ¡Õ½Õ¯Õ¡Ö€</territory>
+ <territory type="MH">Õ„Õ¡Ö€Õ·Õ¡Õ¬ÕµÕ¡Õ¶ Õ¯Õ²Õ¦Õ«Õ¶Õ¥Ö€</territory>
+ <territory type="MK">Õ„Õ¡Õ¯Õ¥Õ¤Õ¸Õ¶Õ«Õ¡</territory>
+ <territory type="ML">Õ„Õ¡Õ¬Õ«</territory>
+ <territory type="MM">Õ„ÕµÕ¡Õ¶Õ´Õ¡</territory>
+ <territory type="MN">Õ„Õ¸Õ¶Õ²Õ¸Õ¬Õ«Õ¡</territory>
+ <territory type="MR">Õ„Õ¡Õ¾Ö€Õ«Õ¿Õ¡Õ¶Õ«Õ¡</territory>
+ <territory type="MT">Õ„Õ¡Õ¬Õ©Õ¡</territory>
+ <territory type="MU">Õ„Õ¡Õ¾Ö€Õ«Õ¿Õ¸Õ½</territory>
+ <territory type="MV">Õ„Õ¡Õ¬Õ¤Õ«Õ¾Õ¶Õ¥Ö€</territory>
+ <territory type="MW">Õ„Õ¡Õ¬Õ¡Õ¾Õ«</territory>
+ <territory type="MX">Õ„Õ¥Ö„Õ½Õ«Õ¯Õ¡</territory>
+ <territory type="MY">Õ„Õ¡Õ¬Õ¡ÕµÕ¦Õ«Õ¡</territory>
+ <territory type="MZ">Õ„Õ¸Õ¦Õ¡Õ´Õ¢Õ«Õ¯</territory>
+ <territory type="NA">Õ†Õ¡Õ´Õ«Õ¢Õ«Õ¡</territory>
+ <territory type="NE">Õ†Õ«Õ£Õ¥Ö€</territory>
+ <territory type="NG">Õ†Õ«Õ£Õ¥Ö€Õ«Õ¡</territory>
+ <territory type="NI">Õ†Õ«Õ¯Õ¡Ö€Õ¡Õ£Õ¸Ö‚Õ¡</territory>
+ <territory type="NL">Õ†Õ«Õ¤Õ¥Ö€Õ¬Õ¡Õ¶Õ¤Õ¥Ö€</territory>
+ <territory type="NO">Õ†Õ¸Ö€Õ¾Õ¥Õ£Õ«Õ¡</territory>
+ <territory type="NP">Õ†Õ¥ÕºÕ¡Õ¬</territory>
+ <territory type="NR">Õ†Õ¡Õ¸Ö‚Ö€Õ¸Ö‚</territory>
+ <territory type="NZ">Õ†Õ¸Ö€ Ô¶Õ¥Õ¬Õ¡Õ¶Õ¤Õ«Õ¡</territory>
+ <territory type="OM">Õ•Õ´Õ¡Õ¶</territory>
+ <territory type="PA">ÕŠÕ¡Õ¶Õ¡Õ´Õ¡</territory>
+ <territory type="PE">ÕŠÕ¥Ö€Õ¸Ö‚</territory>
+ <territory type="PG">ÕŠÕ¡ÕºÕ¸Ö‚Õ¡ Õ†Õ¸Ö€ Ô³Õ¾Õ«Õ¶Õ¥Õ¡</territory>
+ <territory type="PH">Õ–Õ«Õ¬Õ«ÕºÕ«Õ¶Õ¶Õ¥Ö€</territory>
+ <territory type="PK">ÕŠÕ¡Õ¯Õ«Õ½Õ¿Õ¡Õ¶</territory>
+ <territory type="PL">Ô¼Õ¥Õ°Õ¡Õ½Õ¿Õ¡Õ¶</territory>
+ <territory type="PT">ÕŠÕ¸Ö€Õ¿Õ¸Ö‚Õ£Õ¡Õ¬Õ«Õ¡</territory>
+ <territory type="PW">ÕŠÕ¡Õ¬Õ¡Õ¸Ö‚</territory>
+ <territory type="PY">ÕŠÕ¡Ö€Õ¡Õ£Õ¾Õ¡Õµ</territory>
+ <territory type="QA">Ô¿Õ¡Õ¿Õ¡Ö€</territory>
+ <territory type="RO">Ռումինիա</territory>
+ <territory type="RU">Ռուսաստան</territory>
+ <territory type="RW">Ռուանդա</territory>
+ <territory type="SA">ÕÕ¡Õ¸Ö‚Õ¤Õ«Õ¡Õ¶ Ô±Ö€Õ¡Õ¢Õ«Õ¡</territory>
+ <territory type="SB">ÕÕ¸Õ¬Õ¸Õ´Õ¸Õ¶ÕµÕ¡Õ¶ Õ¯Õ²Õ¦Õ«Õ¶Õ¥Ö€</territory>
+ <territory type="SC">ÕÕ¥ÕµÕ·Õ¥Õ¬Õ¶Õ¥Ö€</territory>
+ <territory type="SD">ÕÕ¸Ö‚Õ¤Õ¡Õ¶</territory>
+ <territory type="SE">Õ‡Õ¾Õ¥Õ¤Õ«Õ¡</territory>
+ <territory type="SG">ÕÕ«Õ¶Õ£Õ¡ÕºÕ¸Ö‚Ö€</territory>
+ <territory type="SI">ÕÕ¬Õ¸Õ¾Õ¥Õ¶Õ«Õ¡</territory>
+ <territory type="SK">ÕÕ¬Õ¸Õ¾Õ¡Õ¯Õ«Õ¡</territory>
+ <territory type="SL">ÕÕµÕ¥Ö€Õ¡-Ô¼Õ¥Õ¸Õ¶Õ¥</territory>
+ <territory type="SM">ÕÕ¡Õ¶ Õ„Õ¡Ö€Õ«Õ¶Õ¸</territory>
+ <territory type="SN">ÕÕ¥Õ¶Õ¥Õ£Õ¡Õ¬</territory>
+ <territory type="SO">ÕÕ¸Õ´Õ¡Õ¬Õ«</territory>
+ <territory type="SR">ÕÕ¸Ö‚Ö€Õ«Õ¶Õ¡Õ´</territory>
+ <territory type="ST">ÕÕ¡Õ¶-Ô¹Õ¸Õ´Õ¥-Õ“Ö€Õ«Õ¶Õ½Õ«ÕºÕ«</territory>
+ <territory type="SV">ÕÕ¡Õ¬Õ¾Õ¡Õ¤Õ¸Ö€</territory>
+ <territory type="SY">ÕÕ«Ö€Õ«Õ¡</territory>
+ <territory type="SZ">ÕÕ¾Õ¡Õ¦Õ«Õ¬Õ¥Õ¶Õ¤</territory>
+ <territory type="TD">Õ‰Õ¡Õ¤</territory>
+ <territory type="TG">ÕÕ¸Õ£Õ¸</territory>
+ <territory type="TH">Ô¹Õ¡Õ«Õ¬Õ¡Õ¶Õ¤</territory>
+ <territory type="TJ">ÕÕ¡Õ³Õ«Õ¯Õ½Õ¿Õ¡Õ¶</territory>
+ <territory type="TM">Ô¹Õ¸Ö‚Ö€Ö„Õ´Õ¥Õ¶Õ½Õ¿Õ¡Õ¶</territory>
+ <territory type="TN">Ô¹Õ¸Ö‚Õ¶Õ«Õ½</territory>
+ <territory type="TO">ÕÕ¸Õ¶Õ£Õ¡</territory>
+ <territory type="TR">Ô¹Õ¸Ö‚Ö€Ö„Õ«Õ¡</territory>
+ <territory type="TT">ÕÖ€Õ«Õ¶Õ«Õ¤Õ¡Õ¤-ÕÕ¸Õ¢Õ¡Õ£Õ¸</territory>
+ <territory type="TV">ÕÕ¸Ö‚Õ¾Õ¡Õ¬Õ¸Ö‚</territory>
+ <territory type="TW">Ô¹Õ¡ÕµÕ¾Õ¡Õ¶</territory>
+ <territory type="TZ">ÕÕ¡Õ¶Õ¦Õ¡Õ¶Õ«Õ¡</territory>
+ <territory type="UA">ÕˆÖ‚Õ¯Ö€Õ¡Õ«Õ¶Õ¡</territory>
+ <territory type="UG">ÕˆÖ‚Õ£Õ¡Õ¶Õ¤Õ¡</territory>
+ <territory type="US">Ô±Õ´Õ§Ö€Õ«Õ¯Õ¡ÕµÕ« Õ„Õ«Õ¡ÖÕµÕ¡Õ¬ Õ†Õ¡Õ°Õ¡Õ¶Õ£Õ¶Õ§Ö€</territory>
+ <territory type="US" alt="proposed-u152-1" draft="unconfirmed">Õ„Õ«Õ¡ÖÕµÕ¡Õ¬ Õ†Õ¡Õ°Õ¡Õ¶Õ£Õ¶Õ¥Ö€</territory>
+ <territory type="UY">ÕˆÖ‚Ö€Õ¸Ö‚Õ£Õ¾Õ¡Õµ</territory>
+ <territory type="UZ">ÕˆÖ‚Õ¦Õ¢Õ¥Õ¯Õ½Õ¿Õ¡Õ¶</territory>
+ <territory type="VA">ÕŽÕ¡Õ¿Õ«Õ¯Õ¡Õ¶</territory>
+ <territory type="VC">ÕÕ¥Õ¶Õ¿ ÕŽÕ«Õ½Õ¥Õ¶Õ¿-Ô³Ö€Õ¥Õ¶Õ¡Õ¤Õ«Õ¶Õ¶Õ¥Ö€</territory>
+ <territory type="VE">ÕŽÕ¥Õ¶Õ¥Õ½Õ¸Ö‚Õ¥Õ¬Õ¡</territory>
+ <territory type="VN">ÕŽÕ«Õ¥Õ¿Õ¶Õ¡Õ´</territory>
+ <territory type="VU">ÕŽÕ¡Õ¶Õ¸Ö‚Õ¡Õ¿Õ¸Ö‚</territory>
+ <territory type="WS">ÕÕ¡Õ´Õ¸Õ¡</territory>
+ <territory type="YE">ÔµÕ´Õ¥Õ¶</territory>
+ <territory type="ZA">Õ€Õ¡Ö€Õ¡Õ¾Õ¡ÕµÕ«Õ¶ Ô±Ö†Ö€Õ«Õ¯Õ¡</territory>
+ <territory type="ZM">Ô¶Õ¡Õ´Õ¢Õ«Õ¡</territory>
+ <territory type="ZW">Ô¶Õ«Õ´Õ¢Õ¡Õ¢Õ¾Õ¥</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[ÖŠ Õ Õœ Õž Õš Õ› ÕŸ Õ¡-Õ¥ Ö‡ Õ¦-Ö†]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Õ…Õ¶Ö€</month>
+ <month type="2">Õ“Õ¿Ö€</month>
+ <month type="3">Õ„Ö€Õ¿</month>
+ <month type="4">Ô±ÕºÖ€</month>
+ <month type="5">Õ„ÕµÕ½</month>
+ <month type="6">Õ…Õ¶Õ½</month>
+ <month type="7">Õ…Õ¬Õ½</month>
+ <month type="8">Õ•Õ£Õ½</month>
+ <month type="9">ÕÕ¥Õº</month>
+ <month type="10">Õ€Õ¸Õ¯</month>
+ <month type="11">Õ†Õ¸Õµ</month>
+ <month type="12">Ô´Õ¥Õ¯</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Õ…Õ¸Ö‚Õ¶Õ¸Ö‚Õ¡Ö€</month>
+ <month type="2">Õ“Õ¥Õ¿Ö€Õ¸Ö‚Õ¡Ö€</month>
+ <month type="3">Õ„Õ¡Ö€Õ¿</month>
+ <month type="4">Ô±ÕºÖ€Õ«Õ¬</month>
+ <month type="5">Õ„Õ¡ÕµÕ«Õ½</month>
+ <month type="6">Õ…Õ¸Ö‚Õ¶Õ«Õ½</month>
+ <month type="7">Õ…Õ¸Ö‚Õ¬Õ«Õ½</month>
+ <month type="8">Õ•Õ£Õ¸Õ½Õ¿Õ¸Õ½</month>
+ <month type="9">ÕÕ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€</month>
+ <month type="10">Õ€Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€</month>
+ <month type="11">Õ†Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€</month>
+ <month type="12">Ô´Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Ô¿Õ«Ö€</day>
+ <day type="mon">ÔµÖ€Õ¯</day>
+ <day type="tue">ÔµÖ€Ö„</day>
+ <day type="wed">Õ‰Õ¸Ö€</day>
+ <day type="thu">Õ€Õ¶Õ£</day>
+ <day type="fri">ÕˆÖ‚Ö€</day>
+ <day type="sat">Õ‡Õ¡Õ¢</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Ô¿Õ«Ö€Õ¡Õ¯Õ«</day>
+ <day type="mon">ÔµÖ€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«</day>
+ <day type="tue">ÔµÖ€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«</day>
+ <day type="wed">Õ‰Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«</day>
+ <day type="thu">Õ€Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«</day>
+ <day type="fri">ÕˆÖ‚Ö€Õ¢Õ¡Õ©</day>
+ <day type="sat">Õ‡Õ¡Õ¢Õ¡Õ©</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am>Առ․</am>
+ <pm>Եր․</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">Յ․Õ․</era>
+ <era type="1">Ն․Ք․</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, MMMM d, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>MMMM dd, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>MMM d, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>MM/dd/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">MMMM dd</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">MM/dd</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/hy_AM.xml b/libs/Zend/Locale/Data/hy_AM.xml
new file mode 100755
index 0000000000..705a421310
--- /dev/null
+++ b/libs/Zend/Locale/Data/hy_AM.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/24 23:27:00 $"/>
+ <language type="hy"/>
+ <territory type="AM"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <eras>
+ <eraAbbr>
+ <era type="0">Ք․Ա․</era>
+ <era type="1">Ք․Ե․</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
diff --git a/libs/Zend/Locale/Data/hy_AM_REVISED.xml b/libs/Zend/Locale/Data/hy_AM_REVISED.xml
new file mode 100755
index 0000000000..3e3df6848d
--- /dev/null
+++ b/libs/Zend/Locale/Data/hy_AM_REVISED.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="hy"/>
+ <territory type="AM"/>
+ <variant type="REVISED"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar" draft="unconfirmed">Ô±Ö€Õ¡Õ¢Õ¥Ö€Õ¥Õ¶</language>
+ <language type="az" draft="unconfirmed">Ô±Õ¤Ö€Õ¢Õ¥Õ»Õ¡Õ¶Õ¥Ö€Õ¥Õ¶</language>
+ <language type="fa" draft="unconfirmed">ÕŠÕ¡Ö€Õ½Õ¯Õ¥Ö€Õ¥Õ¶</language>
+ <language type="ka" draft="unconfirmed">ÕŽÖ€Õ¡ÖÕ¥Ö€Õ¥Õ¶</language>
+ <language type="tr" draft="unconfirmed">Ô¹Õ¸Ö‚Ö€Ö„Õ¥Ö€Õ¥Õ¶</language>
+ </languages>
+ </localeDisplayNames>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Õ€Õ¶Õ¾</month>
+ <month type="2">Õ“Õ¿Õ¾</month>
+ <month type="6">Õ€Õ¶Õ½</month>
+ <month type="7">Õ€Õ¬Õ½</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Õ€Õ¸Ö‚Õ¶Õ¾Õ¡Ö€</month>
+ <month type="2">Õ“Õ¥Õ¿Ö€Õ¾Õ¡Ö€</month>
+ <month type="6">Õ€Õ¸Ö‚Õ¶Õ«Õ½</month>
+ <month type="7">Õ€Õ¸Ö‚Õ¬Õ«Õ½</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <pm>Կե․</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">Մ․Թ․Ա․</era>
+ <era type="1">Մ․Թ․</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ia.xml b/libs/Zend/Locale/Data/ia.xml
new file mode 100755
index 0000000000..0d537b8ef7
--- /dev/null
+++ b/libs/Zend/Locale/Data/ia.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.10 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="ia"/>
+ </identity>
+ <characters>
+ <exemplarCharacters>[a-c {ch} d-p {ph} q-z]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">jan</month>
+ <month type="2" draft="unconfirmed">feb</month>
+ <month type="3" draft="unconfirmed">mar</month>
+ <month type="4" draft="unconfirmed">apr</month>
+ <month type="5" draft="unconfirmed">mai</month>
+ <month type="6" draft="unconfirmed">jun</month>
+ <month type="7" draft="unconfirmed">jul</month>
+ <month type="8" draft="unconfirmed">aug</month>
+ <month type="9" draft="unconfirmed">sep</month>
+ <month type="10" draft="unconfirmed">oct</month>
+ <month type="11" draft="unconfirmed">nov</month>
+ <month type="12" draft="unconfirmed">dec</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">januario</month>
+ <month type="2" draft="unconfirmed">februario</month>
+ <month type="3" draft="unconfirmed">martio</month>
+ <month type="4" draft="unconfirmed">april</month>
+ <month type="5" draft="unconfirmed">maio</month>
+ <month type="6" draft="unconfirmed">junio</month>
+ <month type="7" draft="unconfirmed">julio</month>
+ <month type="8" draft="unconfirmed">augusto</month>
+ <month type="9" draft="unconfirmed">septembre</month>
+ <month type="10" draft="unconfirmed">octobre</month>
+ <month type="11" draft="unconfirmed">novembre</month>
+ <month type="12" draft="unconfirmed">decembre</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">dom</day>
+ <day type="mon" draft="unconfirmed">lun</day>
+ <day type="tue" draft="unconfirmed">mar</day>
+ <day type="wed" draft="unconfirmed">mer</day>
+ <day type="thu" draft="unconfirmed">jov</day>
+ <day type="fri" draft="unconfirmed">ven</day>
+ <day type="sat" draft="unconfirmed">sab</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">dominica</day>
+ <day type="mon" draft="unconfirmed">lunedi</day>
+ <day type="tue" draft="unconfirmed">martedi</day>
+ <day type="wed" draft="unconfirmed">mercuridi</day>
+ <day type="thu" draft="unconfirmed">jovedi</day>
+ <day type="fri" draft="unconfirmed">venerdi</day>
+ <day type="sat" draft="unconfirmed">sabbato</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">T1</quarter>
+ <quarter type="2" draft="unconfirmed">T2</quarter>
+ <quarter type="3" draft="unconfirmed">T3</quarter>
+ <quarter type="4" draft="unconfirmed">T4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">1-me trimestre</quarter>
+ <quarter type="2" draft="unconfirmed">2-nde trimestre</quarter>
+ <quarter type="3" draft="unconfirmed">3-tie trimestre</quarter>
+ <quarter type="4" draft="unconfirmed">4-te trimestre</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am draft="unconfirmed">a.m.</am>
+ <pm draft="unconfirmed">p.m.</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">ante Christo</era>
+ <era type="1" draft="unconfirmed">post Christo</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">a.Chr.</era>
+ <era type="1" draft="unconfirmed">p.Chr.</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal draft="unconfirmed">,</decimal>
+ <group draft="unconfirmed">.</group>
+ </symbols>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/id.xml b/libs/Zend/Locale/Data/id.xml
new file mode 100755
index 0000000000..5b0183e78d
--- /dev/null
+++ b/libs/Zend/Locale/Data/id.xml
@@ -0,0 +1,579 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.52 $"/>
+ <generation date="$Date: 2006/07/07 21:00:32 $"/>
+ <language type="id"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">Afar</language>
+ <language type="ab">Abkhaz</language>
+ <language type="ace">Aceh</language>
+ <language type="ae">Avestan</language>
+ <language type="af">Afrikaans</language>
+ <language type="afa">Afro-Asiatik (Lainnya)</language>
+ <language type="ak">Akan</language>
+ <language type="akk">Akkadien</language>
+ <language type="alg">Bahasa Algonquia</language>
+ <language type="am">Amharik</language>
+ <language type="ang">Inggris Kuno (kl.450-1100)</language>
+ <language type="apa">Bahasa-bahasa Apache</language>
+ <language type="ar">Arab</language>
+ <language type="arc">Aram</language>
+ <language type="arn">Araucan</language>
+ <language type="art">Buatan (Lainnya)</language>
+ <language type="as">Assam</language>
+ <language type="ast">Astur</language>
+ <language type="ath">Bahasa-bahasa Athapaska</language>
+ <language type="aus">Bahasa-bahasa Australia</language>
+ <language type="av">Avarik</language>
+ <language type="ay">Aymara</language>
+ <language type="az">Azerbaijan</language>
+ <language type="ba">Bashkir</language>
+ <language type="bai">Bahasa-bahasa Bamileke</language>
+ <language type="ban">Balin</language>
+ <language type="bat">Baltik (Lainnya)</language>
+ <language type="be">Belarusia</language>
+ <language type="bg">Bulgaria</language>
+ <language type="bh">Bihari</language>
+ <language type="bi">Bislama</language>
+ <language type="bm">Bambara</language>
+ <language type="bn">Bengal</language>
+ <language type="bo">Tibet</language>
+ <language type="br">Breton</language>
+ <language type="bs">Bosnia</language>
+ <language type="bug">Bugis</language>
+ <language type="ca">Catalan</language>
+ <language type="cai">India Amerika Tengah (Lainnnya)</language>
+ <language type="car">Karib</language>
+ <language type="cau">Kaukasia (Lainnya)</language>
+ <language type="ce">Chechen</language>
+ <language type="cel">Celtic (Lainnya)</language>
+ <language type="ch">Chamorro</language>
+ <language type="chk">Chuuke</language>
+ <language type="co">Korsika</language>
+ <language type="cop">Koptik</language>
+ <language type="cr">Cree</language>
+ <language type="cs">Ceko</language>
+ <language type="cv">Chuvash</language>
+ <language type="cy">Welsh</language>
+ <language type="da">Denmark</language>
+ <language type="de">Jerman</language>
+ <language type="dv">Divehi</language>
+ <language type="dz">Dzongkha</language>
+ <language type="ee">Ewe</language>
+ <language type="egy">Mesir Kuno</language>
+ <language type="el">Yunani</language>
+ <language type="en">Inggris</language>
+ <language type="enm">Inggris, Abad Pertengahan (1100-1500)</language>
+ <language type="eo">Esperanto</language>
+ <language type="es">Spanyol</language>
+ <language type="et">Estonian</language>
+ <language type="eu">Basque</language>
+ <language type="fa">Persia</language>
+ <language type="ff">Fulah</language>
+ <language type="fi">Finlandia</language>
+ <language type="fj">Fiji</language>
+ <language type="fo">Faro</language>
+ <language type="fr">Perancis</language>
+ <language type="frm">Perancis, Abad Pertengahan (kl.1400-1600)</language>
+ <language type="fro">Perancis Kuno (842-kl.1400)</language>
+ <language type="fur">Friuli</language>
+ <language type="fy">Frisi</language>
+ <language type="ga">Irlandia</language>
+ <language type="gd">Gaelik Skotlandia</language>
+ <language type="gem">Jermanik (Lainnya)</language>
+ <language type="gil">Gilbert</language>
+ <language type="gl">Gallegan</language>
+ <language type="gmh">Jerman, Abad Pertengahan (kl.1050-1500)</language>
+ <language type="gn">Guarani</language>
+ <language type="goh">Jerman Kuno (kl.750-1050)</language>
+ <language type="got">Gothik</language>
+ <language type="grc">Yunani Kuno (sd 1453)</language>
+ <language type="gu">Gujarati</language>
+ <language type="gv">Manx</language>
+ <language type="ha">Hausa</language>
+ <language type="haw">Hawaii</language>
+ <language type="he">Ibrani</language>
+ <language type="hi">Hindi</language>
+ <language type="ho">Hiri Motu</language>
+ <language type="hr">Kroasia</language>
+ <language type="hu">Hungaria</language>
+ <language type="hy">Armenia</language>
+ <language type="hz">Herero</language>
+ <language type="ia">Interlingua</language>
+ <language type="id">Bahasa Indonesia</language>
+ <language type="ie">Interlingue</language>
+ <language type="ig">Igbo</language>
+ <language type="ii">Sichuan Yi</language>
+ <language type="ik">Inupiaq</language>
+ <language type="io">Ido</language>
+ <language type="is">Icelandic</language>
+ <language type="it">Italian</language>
+ <language type="ja">Japanese</language>
+ <language type="jpr">Judeo-Persia</language>
+ <language type="jrb">Judeo-Arab</language>
+ <language type="jv">Jawa</language>
+ <language type="ka">Georgian</language>
+ <language type="kg">Kongo</language>
+ <language type="ki">Kikuyu</language>
+ <language type="kj">Kuanyama</language>
+ <language type="kk">Kazakh</language>
+ <language type="kl">Kalaallisut</language>
+ <language type="km">Khmer</language>
+ <language type="kn">Kannada</language>
+ <language type="ko">Korea</language>
+ <language type="kok">Konkani</language>
+ <language type="kos">Kosrae</language>
+ <language type="kr">Kanuri</language>
+ <language type="ks">Kashmir</language>
+ <language type="ku">Kurdi</language>
+ <language type="kv">Komi</language>
+ <language type="kw">Cornish</language>
+ <language type="ky">Kirghiz</language>
+ <language type="la">Latin</language>
+ <language type="lb">Luxembourg</language>
+ <language type="lez">Lezghia</language>
+ <language type="lg">Ganda</language>
+ <language type="li">Limburg</language>
+ <language type="ln">Lingala</language>
+ <language type="lo">Lao</language>
+ <language type="lt">Lithuania</language>
+ <language type="lu">Luba-Katanga</language>
+ <language type="lv">Latvian</language>
+ <language type="mad">Madura</language>
+ <language type="mak">Makassar</language>
+ <language type="map">Austronesia</language>
+ <language type="mg">Malagasi</language>
+ <language type="mga">Irlandia Abad Pertengahan (900-1200)</language>
+ <language type="mh">Marshall</language>
+ <language type="mi">Maori</language>
+ <language type="mis">Bahasa Lain-lain</language>
+ <language type="mk">Macedonian</language>
+ <language type="mkh">Mon-Khmer (Lainnya)</language>
+ <language type="ml">Malayalam</language>
+ <language type="mn">Mongolian</language>
+ <language type="mo">Moldavian</language>
+ <language type="mr">Marathi</language>
+ <language type="ms">Malay</language>
+ <language type="mt">Maltese</language>
+ <language type="my">Burma</language>
+ <language type="na">Nauru</language>
+ <language type="nb">Norwegian Bokmål</language>
+ <language type="ne">Nepal</language>
+ <language type="ng">Ndonga</language>
+ <language type="nl">Belanda</language>
+ <language type="nn">Norwegian Nynorsk</language>
+ <language type="no">Norwegian</language>
+ <language type="nv">Navajo</language>
+ <language type="ny">Nyanja; Chichewa; Chewa</language>
+ <language type="oj">Ojibwa</language>
+ <language type="om">Oromo</language>
+ <language type="or">Oriya</language>
+ <language type="os">Ossetic</language>
+ <language type="pa">Punjabi</language>
+ <language type="paa">Papuan (Lainnya)</language>
+ <language type="peo">Persia Kuno (kl.600-400 SM.)</language>
+ <language type="phi">Filipina (Lainnya)</language>
+ <language type="pi">Pali</language>
+ <language type="pl">Polish</language>
+ <language type="ps">Pashto (Pushto)</language>
+ <language type="pt">Portugis</language>
+ <language type="qu">Quechua</language>
+ <language type="rm">Rhaeto-Romance</language>
+ <language type="rn">Rundi</language>
+ <language type="ro">Romanian</language>
+ <language type="ru">Russian</language>
+ <language type="rw">Kinyarwanda</language>
+ <language type="sa">Sanskrit</language>
+ <language type="sc">Sardinian</language>
+ <language type="sd">Sindhi</language>
+ <language type="se">Northern Sami</language>
+ <language type="sg">Sango</language>
+ <language type="sh">Serbo-Croatian</language>
+ <language type="si">Sinhalese</language>
+ <language type="sk">Slovak</language>
+ <language type="sl">Slovenian</language>
+ <language type="sm">Samoan</language>
+ <language type="sn">Shona</language>
+ <language type="so">Somali</language>
+ <language type="sq">Albanian</language>
+ <language type="sr">Serbian</language>
+ <language type="ss">Swati</language>
+ <language type="su">Sundan</language>
+ <language type="sux">Sumeria</language>
+ <language type="sv">Swedia</language>
+ <language type="sw">Swahili</language>
+ <language type="syr">Syria</language>
+ <language type="ta">Tamil</language>
+ <language type="te">Telugu</language>
+ <language type="tg">Tajik</language>
+ <language type="th">Thai</language>
+ <language type="ti">Tigrinya</language>
+ <language type="tk">Turkmen</language>
+ <language type="tl">Tagalog</language>
+ <language type="tn">Tswana</language>
+ <language type="tr">Turkish</language>
+ <language type="ts">Tsonga</language>
+ <language type="tt">Tatar</language>
+ <language type="tw">Twi</language>
+ <language type="ty">Tahitian</language>
+ <language type="ug">Uighur</language>
+ <language type="uk">Ukrainian</language>
+ <language type="ur">Urdu</language>
+ <language type="uz">Uzbek</language>
+ <language type="ve">Venda</language>
+ <language type="vi">Vietnamese</language>
+ <language type="vo">Volapük</language>
+ <language type="wa">Walloon</language>
+ <language type="wo">Wolof</language>
+ <language type="xh">Xhosa</language>
+ <language type="yi">Yiddish</language>
+ <language type="yo">Yoruba</language>
+ <language type="za">Zhuang</language>
+ <language type="zh">Cina</language>
+ <language type="zu">Zulu</language>
+ </languages>
+ <territories>
+ <territory type="AD">Andora</territory>
+ <territory type="AE">Uni Emirat Arab</territory>
+ <territory type="AF">Afghanistan</territory>
+ <territory type="AG">Antigua dan Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albania</territory>
+ <territory type="AM">Armenia</territory>
+ <territory type="AN">Antilles Belanda</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktika</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">Samoa Amerika</territory>
+ <territory type="AT">Austria</territory>
+ <territory type="AU">Australia</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AZ">Azerbaijan</territory>
+ <territory type="BA">Bosnia dan Herzegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BE">Belgia</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgaria</territory>
+ <territory type="BH">Bahrain</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei</territory>
+ <territory type="BO">Bolivia</territory>
+ <territory type="BR">Brazil</territory>
+ <territory type="BS">Bahamas</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BV">Kepulauan Bouvet</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Belarusia</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Kepulauan Cocos</territory>
+ <territory type="CD">Republik Demokratik Kongo</territory>
+ <territory type="CF">Republik Afrika Tengah</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Swiss</territory>
+ <territory type="CI">Pantai Gading</territory>
+ <territory type="CK">Kepulauan Cook</territory>
+ <territory type="CL">Chili</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Cina</territory>
+ <territory type="CO">Kolombia</territory>
+ <territory type="CR">Kosta Rika</territory>
+ <territory type="CS" draft="unconfirmed">Serbia</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Tanjung Verde</territory>
+ <territory type="CX">Pulau Christmas</territory>
+ <territory type="CY">Siprus</territory>
+ <territory type="CZ">Republik Ceko</territory>
+ <territory type="DE">Jerman</territory>
+ <territory type="DJ">Jibouti</territory>
+ <territory type="DK">Denmark</territory>
+ <territory type="DM">Dominika</territory>
+ <territory type="DO">Republik Dominika</territory>
+ <territory type="DZ">Algeria</territory>
+ <territory type="EC">Ekuador</territory>
+ <territory type="EE">Estonia</territory>
+ <territory type="EG">Mesir</territory>
+ <territory type="EH">Sahara Barat</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Spanyol</territory>
+ <territory type="ET">Ethiopia</territory>
+ <territory type="FI">Finlandia</territory>
+ <territory type="FJ">Fiji</territory>
+ <territory type="FK">Kepulauan Falkland</territory>
+ <territory type="FM">Mikronesia</territory>
+ <territory type="FO">Kepulauan Faroe</territory>
+ <territory type="FR">Perancis</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Inggris Raya</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Georgia</territory>
+ <territory type="GF">Guyana Perancis</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Greenland</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Guinea Khatulistiwa</territory>
+ <territory type="GR">Yunani</territory>
+ <territory type="GS">Georgia Selatan dan Kepulauan Sandwich Selatan</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinea-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Hong Kong S.A.R., Cina</territory>
+ <territory type="HM">Pulau Heard dan Kepulauan McDonald</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Kroasia</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Hungaria</territory>
+ <territory type="ID">Indonesia</territory>
+ <territory type="IE">Irlandia</territory>
+ <territory type="IL">Israel</territory>
+ <territory type="IN">India</territory>
+ <territory type="IQ">Iraq</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Islandia</territory>
+ <territory type="IT">Itali</territory>
+ <territory type="JM">Jamaika</territory>
+ <territory type="JO">Yordania</territory>
+ <territory type="JP">Jepang</territory>
+ <territory type="KE">Kenya</territory>
+ <territory type="KG">Kyrgyzstan</territory>
+ <territory type="KH">Kamboja</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komoros</territory>
+ <territory type="KN">Saint Kitts dan Nevis</territory>
+ <territory type="KP">Korea Utara</territory>
+ <territory type="KR">Korea Selatan</territory>
+ <territory type="KW">Kuwait</territory>
+ <territory type="KY">Kepulauan Kayman</territory>
+ <territory type="KZ">Kazakhstan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Lebanon</territory>
+ <territory type="LC">Santa Lusia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberia</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Lithuania</territory>
+ <territory type="LU">Luxembourg</territory>
+ <territory type="LV">Latvia</territory>
+ <territory type="LY">Libya</territory>
+ <territory type="MA">Maroko</territory>
+ <territory type="MC">Monaco</territory>
+ <territory type="MD">Moldova</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Kepulauan Marshall</territory>
+ <territory type="MK">Macedonia</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongolia</territory>
+ <territory type="MO">Makao S.A.R. Cina</territory>
+ <territory type="MP">Kepualuan Mariana Utara</territory>
+ <territory type="MQ">Martinique</territory>
+ <territory type="MR">Mauritania</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Maldives</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Mexico</territory>
+ <territory type="MY">Malaysia</territory>
+ <territory type="MZ">Mozambique</territory>
+ <territory type="NA">Namibia</territory>
+ <territory type="NC">Kaledonia Baru</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Kepulauan Norfolk</territory>
+ <territory type="NG">Nigeria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Netherlands</territory>
+ <territory type="NO">Norwegia</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Selandia Baru</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Polynesia Perancis</territory>
+ <territory type="PG">Papua Nugini</territory>
+ <territory type="PH">Filipina</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Polandia</territory>
+ <territory type="PM">Saint Pierre dan Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Puerto Riko</territory>
+ <territory type="PS">Otoritas Palestina</territory>
+ <territory type="PT">Portugis</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Qatar</territory>
+ <territory type="RE">Réunion</territory>
+ <territory type="RO">Romania</territory>
+ <territory type="RU">Rusia</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Arab Saudi</territory>
+ <territory type="SB">Kepulauan Solomon</territory>
+ <territory type="SC">Seychelles</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Sweden</territory>
+ <territory type="SG">Singapura</territory>
+ <territory type="SH">Saint Helena</territory>
+ <territory type="SI">Slovenia</territory>
+ <territory type="SJ">Svalbard dan Jan Mayen</territory>
+ <territory type="SK">Slovakia</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalia</territory>
+ <territory type="SR">Suriname</territory>
+ <territory type="ST">Sao Tome dan Principe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Syria</territory>
+ <territory type="SZ">Swaziland</territory>
+ <territory type="TD">Chad</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Thailand</territory>
+ <territory type="TJ">Tajikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunisia</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turkey</territory>
+ <territory type="TT">Trinidad dan Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TZ">Tanzania</territory>
+ <territory type="UA">Ukraina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="US">Amerika Serikat</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Uzbekistan</territory>
+ <territory type="VA">Vatikan</territory>
+ <territory type="VC">Saint Vincent dan Grenadines</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Kepulauan British Virgin</territory>
+ <territory type="VI">Kepulauan U.S. Virgin</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis dan Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Yaman</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Afrika Selatan</territory>
+ <territory type="ZM">Zambia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-n {ng} {ny} o p r-w y]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Jan</month>
+ <month type="2">Feb</month>
+ <month type="3">Mar</month>
+ <month type="4">Apr</month>
+ <month type="5">Mei</month>
+ <month type="6">Jun</month>
+ <month type="7">Jul</month>
+ <month type="8">Agu</month>
+ <month type="9">Sep</month>
+ <month type="10">Okt</month>
+ <month type="11">Nov</month>
+ <month type="12">Des</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Januari</month>
+ <month type="2">Februari</month>
+ <month type="3">Maret</month>
+ <month type="4">April</month>
+ <month type="5">Mei</month>
+ <month type="6">Juni</month>
+ <month type="7">Juli</month>
+ <month type="8">Agustus</month>
+ <month type="9">September</month>
+ <month type="10">Oktober</month>
+ <month type="11">November</month>
+ <month type="12">Desember</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Min</day>
+ <day type="mon">Sen</day>
+ <day type="tue">Sel</day>
+ <day type="wed">Rab</day>
+ <day type="thu">Kam</day>
+ <day type="fri">Jum</day>
+ <day type="sat">Sab</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Minggu</day>
+ <day type="mon">Senin</day>
+ <day type="tue">Selasa</day>
+ <day type="wed">Rabu</day>
+ <day type="thu">Kamis</day>
+ <day type="fri">Jumat</day>
+ <day type="sat">Sabtu</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">K1</quarter>
+ <quarter type="2" draft="unconfirmed">K2</quarter>
+ <quarter type="3" draft="unconfirmed">K3</quarter>
+ <quarter type="4" draft="unconfirmed">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">kuartal pertama</quarter>
+ <quarter type="2" draft="unconfirmed">kuartal kedua</quarter>
+ <quarter type="3" draft="unconfirmed">kuartal ketiga</quarter>
+ <quarter type="4" draft="unconfirmed">kuartal keempat</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="IDR">
+ <symbol>Rp</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">ya:y</yesstr>
+ <nostr draft="unconfirmed">tidak:t</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/id_ID.xml b/libs/Zend/Locale/Data/id_ID.xml
new file mode 100755
index 0000000000..caf8e422ba
--- /dev/null
+++ b/libs/Zend/Locale/Data/id_ID.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.36 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="id"/>
+ <territory type="ID"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd MMM yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ig.xml b/libs/Zend/Locale/Data/ig.xml
new file mode 100755
index 0000000000..33e865c1e0
--- /dev/null
+++ b/libs/Zend/Locale/Data/ig.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.12 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="ig"/>
+ </identity>
+ <characters>
+ <exemplarCharacters>[a b {ch} d-g {gb} {gh} {gw} h i ị j k {kp} {kw} l-n ṅ {nw} {ny} o Ỡp r s {sh} t u ụ v w y z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Jen</month>
+ <month type="2" draft="unconfirmed">Feb</month>
+ <month type="3" draft="unconfirmed">Maa</month>
+ <month type="4" draft="unconfirmed">Epr</month>
+ <month type="5" draft="unconfirmed">Mee</month>
+ <month type="6" draft="unconfirmed">Juu</month>
+ <month type="7" draft="unconfirmed">Jul</month>
+ <month type="8" draft="unconfirmed">Ọgá»</month>
+ <month type="9" draft="unconfirmed">Sep</month>
+ <month type="10" draft="unconfirmed">Ọkt</month>
+ <month type="11" draft="unconfirmed">Nov</month>
+ <month type="12" draft="unconfirmed">Dis</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Jenụwarị</month>
+ <month type="2" draft="unconfirmed">Febrụwarị</month>
+ <month type="3" draft="unconfirmed">Maachị</month>
+ <month type="4" draft="unconfirmed">Eprel</month>
+ <month type="5" draft="unconfirmed">Mee</month>
+ <month type="6" draft="unconfirmed">Juun</month>
+ <month type="7" draft="unconfirmed">Julaị</month>
+ <month type="8" draft="unconfirmed">Ọgá»á»st</month>
+ <month type="9" draft="unconfirmed">Septemba</month>
+ <month type="10" draft="unconfirmed">Ọktoba</month>
+ <month type="11" draft="unconfirmed">Novemba</month>
+ <month type="12" draft="unconfirmed">Disemba</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Ụka</day>
+ <day type="mon" draft="unconfirmed">Má»n</day>
+ <day type="tue" draft="unconfirmed">Tiu</day>
+ <day type="wed" draft="unconfirmed">Wen</day>
+ <day type="thu" draft="unconfirmed">Tá»á»</day>
+ <day type="fri" draft="unconfirmed">Fraị</day>
+ <day type="sat" draft="unconfirmed">Sat</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Mbá»sị Ụka</day>
+ <day type="mon" draft="unconfirmed">Má»nde</day>
+ <day type="tue" draft="unconfirmed">Tiuzdee</day>
+ <day type="wed" draft="unconfirmed">Wenezdee</day>
+ <day type="thu" draft="unconfirmed">Tá»á»zdee</day>
+ <day type="fri" draft="unconfirmed">Fraịdee</day>
+ <day type="sat" draft="unconfirmed">Satá»dee</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">A.M.</am>
+ <pm draft="unconfirmed">P.M.</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">Tupu Kristi</era>
+ <era type="1" draft="unconfirmed">Afá» Kristi</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">T.K.</era>
+ <era type="1" draft="unconfirmed">A.K.</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="NGN">
+ <displayName draft="unconfirmed">Naịra</displayName>
+ <symbol draft="unconfirmed">₦</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1" uri="http://en.wikipedia.org/wiki/Igbo_language">Wikipedia on Igbo</reference>
+ <reference type="RP2" uri="http://www.omniglot.com/writing/igbo.htm">Omniglot on Igbo</reference>
+ <reference type="RP3" uri="http://developer.mimer.com/charts/igbo.htm">Mimer Igbo collation</reference>
+ <reference type="RP4" uri="http://ilc.igbonet.com/lesson01/">Learn Igbo - alphabet etc. (lesson 1)</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ig_NG.xml b/libs/Zend/Locale/Data/ig_NG.xml
new file mode 100755
index 0000000000..ed1ed054ce
--- /dev/null
+++ b/libs/Zend/Locale/Data/ig_NG.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:00 $"/>
+ <language type="ig"/>
+ <territory type="NG"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/is.xml b/libs/Zend/Locale/Data/is.xml
new file mode 100755
index 0000000000..1e51265902
--- /dev/null
+++ b/libs/Zend/Locale/Data/is.xml
@@ -0,0 +1,1538 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.62 $"/>
+ <generation date="$Date: 2006/10/26 22:46:08 $"/>
+ <language type="is"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa" draft="unconfirmed">afár</language>
+ <language type="ab">Abkasíska</language>
+ <language type="ace">Akkíska</language>
+ <language type="ach">Akólí</language>
+ <language type="ada">Adangme</language>
+ <language type="ady">Adýge</language>
+ <language type="ae">Avestíska</language>
+ <language type="af">Afríkanska</language>
+ <language type="afa">Afróasísk mál (önnur)</language>
+ <language type="afh">Afríhílí</language>
+ <language type="ain" draft="unconfirmed">aínu</language>
+ <language type="ak">Akan</language>
+ <language type="akk">Akkadíska</language>
+ <language type="ale">Aleúska</language>
+ <language type="alg">Algonkvínsk mál</language>
+ <language type="alt" draft="unconfirmed">suðuraltaíska</language>
+ <language type="am">Amharíska</language>
+ <language type="an">Aragonska</language>
+ <language type="ang">Fornenska (um 450-1100)</language>
+ <language type="apa">Apatsjamál</language>
+ <language type="ar">Arabíska</language>
+ <language type="arc">Arameíska</language>
+ <language type="arn">Arákaníska</language>
+ <language type="arp">Arapahó</language>
+ <language type="art">Alþjóðamál (önnur)</language>
+ <language type="arw">Aravakska</language>
+ <language type="as">Assamska</language>
+ <language type="ast">Astúríska</language>
+ <language type="ath">Atapaskísk mál</language>
+ <language type="aus">Ãströlsk mál</language>
+ <language type="av">Avaríska</language>
+ <language type="awa">Avadí</language>
+ <language type="ay">Aímara</language>
+ <language type="az">Aserska</language>
+ <language type="ba">Baskír</language>
+ <language type="bad">Banda</language>
+ <language type="bai">Bamílekemál</language>
+ <language type="bal">Balúkí</language>
+ <language type="ban">Balíska</language>
+ <language type="bas">Basa</language>
+ <language type="bat">Baltnesk mál (önnur)</language>
+ <language type="be">Hvítrússneska</language>
+ <language type="bej">Beja</language>
+ <language type="bem">Bemba</language>
+ <language type="ber">Berbamál</language>
+ <language type="bg">Búlgarska</language>
+ <language type="bh">Bíharí</language>
+ <language type="bho">Bojpúrí</language>
+ <language type="bi">Bíslama</language>
+ <language type="bik">Bíkol</language>
+ <language type="bin">Bíní</language>
+ <language type="bla">Siksika</language>
+ <language type="bm">Bambara</language>
+ <language type="bn">Bengalska</language>
+ <language type="bnt">Bantúmál</language>
+ <language type="bo">Tíbeska</language>
+ <language type="br">Bretónska</language>
+ <language type="bra">Braí</language>
+ <language type="bs">Bosníska</language>
+ <language type="btk">Batak</language>
+ <language type="bua">Búríat</language>
+ <language type="bug">Búgíska</language>
+ <language type="byn">Blín</language>
+ <language type="ca">Katalónska</language>
+ <language type="cad">Kaddó</language>
+ <language type="cai">Indíánamál Mið-Ameríku (önnur)</language>
+ <language type="car">Karíbamál</language>
+ <language type="cau">Kákasusmál (önnur)</language>
+ <language type="ce">Tsjetsjenska</language>
+ <language type="ceb">Kebúanó</language>
+ <language type="cel">Keltnesk (önnur)</language>
+ <language type="ch">Kamorró</language>
+ <language type="chb">Síbsja</language>
+ <language type="chg">Sjagataí</language>
+ <language type="chk">Sjúkíska</language>
+ <language type="chm">Marí</language>
+ <language type="chn">Sínúk</language>
+ <language type="cho">Sjoktá</language>
+ <language type="chp">Sípevíska</language>
+ <language type="chr">Sjerókí</language>
+ <language type="chy">Sjeyen</language>
+ <language type="cmc">Kamísk mál</language>
+ <language type="co">Korsíska</language>
+ <language type="cop">Koptíska</language>
+ <language type="cpe">Kreól- og pidginmál á enskum grunni</language>
+ <language type="cpf">Kreól- og pidginmál á frönskum grunni</language>
+ <language type="cpp">Kreól- og pidginmál á portúgölskum grunni</language>
+ <language type="cr">Krí</language>
+ <language type="crh">Krímtyrkneska</language>
+ <language type="crp">Kreól- og pidginmál (önnur)</language>
+ <language type="cs">Tékkneska</language>
+ <language type="csb">Kasúbíska</language>
+ <language type="cu">Kirkjuslavneska</language>
+ <language type="cus">Kúsitísk mál (önnur)</language>
+ <language type="cv">Sjúvas</language>
+ <language type="cy">Velska</language>
+ <language type="da">Danska</language>
+ <language type="dak">Dakóta</language>
+ <language type="dar">Dargva</language>
+ <language type="day">Dajak</language>
+ <language type="de">Þýska</language>
+ <language type="del">Delaver</language>
+ <language type="den">Slav</language>
+ <language type="dgr">Dogríb</language>
+ <language type="din">Dinka</language>
+ <language type="doi">Dogrí</language>
+ <language type="dra">Dravidísk mál (önnur)</language>
+ <language type="dsb">Lágsorbneska</language>
+ <language type="dua">Dúala</language>
+ <language type="dum">Miðhollenska (um 1050-1350)</language>
+ <language type="dv">Dívehí</language>
+ <language type="dyu">Djúla</language>
+ <language type="dz">Dsongka</language>
+ <language type="ee">Eve</language>
+ <language type="efi">Efík</language>
+ <language type="egy">Fornegypska</language>
+ <language type="eka">Ekajúk</language>
+ <language type="el">Nýgríska (1453-)</language>
+ <language type="elx">Elamít</language>
+ <language type="en">Enska</language>
+ <language type="enm">Miðenska (1100-1500)</language>
+ <language type="eo">Esperantó</language>
+ <language type="es">Spænska</language>
+ <language type="et">Eistneska</language>
+ <language type="eu">Baskneska</language>
+ <language type="ewo">Evondó</language>
+ <language type="fa">Persneska</language>
+ <language type="fan">Fang</language>
+ <language type="fat">Fantí</language>
+ <language type="ff">Fúla</language>
+ <language type="fi">Finnska</language>
+ <language type="fiu">Finnskúgrísk mál (önnur)</language>
+ <language type="fj">Fídjeyska</language>
+ <language type="fo">Færeyska</language>
+ <language type="fon">Fón</language>
+ <language type="fr">Franska</language>
+ <language type="frm">Miðfranska (um 1400-1600)</language>
+ <language type="fro">Fornfranska (842 - um 1400)</language>
+ <language type="fur">Fríúlska</language>
+ <language type="fy">Frísneska</language>
+ <language type="ga">Ãrska</language>
+ <language type="gaa">Ga</language>
+ <language type="gay">Gajó</language>
+ <language type="gba">Gbaja</language>
+ <language type="gd">Skosk gelíska</language>
+ <language type="gem">Germönsk mál (önnur)</language>
+ <language type="gez">Gís</language>
+ <language type="gil">Gilberska</language>
+ <language type="gl">Gallegska</language>
+ <language type="gmh">Miðháþýska (um 1050-1500</language>
+ <language type="gn">Gvaraní</language>
+ <language type="goh">Fornháþýska (um 750-1050)</language>
+ <language type="gon">Gondí</language>
+ <language type="gor">Gorontaló</language>
+ <language type="got">Gotneska</language>
+ <language type="grb">Gerbó</language>
+ <language type="grc">Forngríska (til 1453)</language>
+ <language type="gu">Gújaratí</language>
+ <language type="gv">Manx</language>
+ <language type="gwi">Gvísín</language>
+ <language type="ha">Hása</language>
+ <language type="hai">Haída</language>
+ <language type="haw">Havaíska</language>
+ <language type="he">Hebreska</language>
+ <language type="hi">Hindí</language>
+ <language type="hil">Híligaínon</language>
+ <language type="him">Hímasjalí</language>
+ <language type="hit">Hettitíska</language>
+ <language type="hmn">Hmong</language>
+ <language type="ho">Hírímótú</language>
+ <language type="hr">Króatíska</language>
+ <language type="hsb">Hásorbneska</language>
+ <language type="ht">Haítíska</language>
+ <language type="hu">Ungverska</language>
+ <language type="hup">Húpa</language>
+ <language type="hy">Armenska</language>
+ <language type="hz">Hereró</language>
+ <language type="ia">Interlingva</language>
+ <language type="ia" alt="proposed-u219-1" draft="unconfirmed">interlingva</language>
+ <language type="iba">Ãban</language>
+ <language type="id">Indónesíska</language>
+ <language type="ie">Interlingve</language>
+ <language type="ig">Ãgbó</language>
+ <language type="ii">Sísúanjí</language>
+ <language type="ijo">Ãjó</language>
+ <language type="ik">Ãnúpíak</language>
+ <language type="ilo">Ãlokó</language>
+ <language type="inc">Indversk mál (önnur)</language>
+ <language type="ine">Indóevrópsk mál (önnur)</language>
+ <language type="inh">Ingús</language>
+ <language type="io">Ãdó</language>
+ <language type="ira">Ãranska</language>
+ <language type="iro">Ãrókesk mál</language>
+ <language type="is">Ãslenska</language>
+ <language type="it">Ãtalska</language>
+ <language type="iu">Inúktitút</language>
+ <language type="ja">Japanska</language>
+ <language type="jbo">Lojban</language>
+ <language type="jpr">Gyðingapersneska</language>
+ <language type="jrb">Gyðingaarabíska</language>
+ <language type="jv">Javanska</language>
+ <language type="ka">Georgíska</language>
+ <language type="kaa">Karakalpak</language>
+ <language type="kab">Kabíle</language>
+ <language type="kac">Kasín</language>
+ <language type="kam">Kamba</language>
+ <language type="kar">Karen</language>
+ <language type="kaw">Kaví</language>
+ <language type="kbd">Kabardíska</language>
+ <language type="kg">Kongó</language>
+ <language type="kha">Kasí</language>
+ <language type="khi">Koímál (önnur)</language>
+ <language type="kho">Kotaska</language>
+ <language type="ki">Kíkújú</language>
+ <language type="kj">Kúanjama</language>
+ <language type="kk">Kasakska</language>
+ <language type="kl">Grænlenska</language>
+ <language type="km">Kmer</language>
+ <language type="kmb">Kimbúndú</language>
+ <language type="kn">Kannada</language>
+ <language type="ko">Kóreska</language>
+ <language type="kok">Konkaní</language>
+ <language type="kos">Kosraska</language>
+ <language type="kpe">Kpelle</language>
+ <language type="kr">Kanúrí</language>
+ <language type="krc">Karasaíbalkar</language>
+ <language type="kro">Krú</language>
+ <language type="kru">Kúrúk</language>
+ <language type="ks">Kasmírska</language>
+ <language type="ku">Kúrdneska</language>
+ <language type="kum">Kúmík</language>
+ <language type="kut">Kútenaí</language>
+ <language type="kv">Komíska</language>
+ <language type="kw">Korníska</language>
+ <language type="ky">Kirgiska</language>
+ <language type="la">Latína</language>
+ <language type="lad">Ladínska</language>
+ <language type="lah">Landa</language>
+ <language type="lam">Lamba</language>
+ <language type="lb">Lúxemborgíska</language>
+ <language type="lez">Lesgíska</language>
+ <language type="lg">Ganda</language>
+ <language type="li">Limbúrgíska</language>
+ <language type="ln">Lingala</language>
+ <language type="lo">Laó</language>
+ <language type="lol">Mongó</language>
+ <language type="loz">Losí</language>
+ <language type="lt">Litháíska</language>
+ <language type="lu">Lúbakatanga</language>
+ <language type="lua">Lúbalúlúa</language>
+ <language type="lui">Lúisenó</language>
+ <language type="lun">Lúnda</language>
+ <language type="luo">Lúó</language>
+ <language type="lus">Lúsaí</language>
+ <language type="lv">Lettneska</language>
+ <language type="mad">Madúrska</language>
+ <language type="mag">Magahí</language>
+ <language type="mai">Maítílí</language>
+ <language type="mak">Makasar</language>
+ <language type="man">Mandingó</language>
+ <language type="map">Ãstrónesíska</language>
+ <language type="mas">Masaí</language>
+ <language type="mdf">Moksa</language>
+ <language type="mdr">Mandar</language>
+ <language type="men">Mende</language>
+ <language type="mg">Malagasíska</language>
+ <language type="mga">Miðírska (900-1200)</language>
+ <language type="mh">Marshallska</language>
+ <language type="mi">Maórí</language>
+ <language type="mic">Mikmak</language>
+ <language type="min">Mínangkabá</language>
+ <language type="mis">Ãmis mál</language>
+ <language type="mk">Makedónska</language>
+ <language type="mkh">Monkmermál (önnur)</language>
+ <language type="ml">Malajalam</language>
+ <language type="mn">Mongólska</language>
+ <language type="mnc">Mansjú</language>
+ <language type="mni">Manípúrí</language>
+ <language type="mno">Manóbómál</language>
+ <language type="mo">Moldóvska</language>
+ <language type="moh">Móhíska</language>
+ <language type="mos">Mossí</language>
+ <language type="mr">Maratí</language>
+ <language type="ms">Malaíska</language>
+ <language type="mt">Maltneska</language>
+ <language type="mul">Margvísleg mál</language>
+ <language type="mun">Múndamál</language>
+ <language type="mus">Krík</language>
+ <language type="mwl" draft="unconfirmed">mirandesíska</language>
+ <language type="mwr">Marvarí</language>
+ <language type="my">Burmneska</language>
+ <language type="myn">Majamál</language>
+ <language type="myv">Ersja</language>
+ <language type="na">Nárúska</language>
+ <language type="nah">Nahúatl</language>
+ <language type="nai">Indíánamál Norður-Ameríku (önnur)</language>
+ <language type="nap">Napólíska</language>
+ <language type="nb">Norskt bókmál</language>
+ <language type="nd">Norðurndebele</language>
+ <language type="nds">Lágþýska; Lágsaxneska</language>
+ <language type="ne">Nepalska</language>
+ <language type="new">Nevarí</language>
+ <language type="ng">Ndonga</language>
+ <language type="nia">Nías</language>
+ <language type="nic">Nígerkordófanmál (önnur)</language>
+ <language type="niu">Níveska</language>
+ <language type="nl">Hollenska</language>
+ <language type="nn">Nýnorska</language>
+ <language type="no">Norska</language>
+ <language type="nog">Nógaí</language>
+ <language type="non">Norræna</language>
+ <language type="nr">Suðurndebele</language>
+ <language type="nso">Norðursótó</language>
+ <language type="nub">Núbísk mál</language>
+ <language type="nv">Navahó</language>
+ <language type="ny">Njanja; Sísjeva; Sjeva</language>
+ <language type="nym">Njamvesí</language>
+ <language type="nyn">Njankóle</language>
+ <language type="nyo">Njóró</language>
+ <language type="nzi">Nsíma</language>
+ <language type="oc">Okkitíska (eftir 1500); Próvensalska</language>
+ <language type="oj">Ojibva</language>
+ <language type="om">Órómó</language>
+ <language type="or">Óría</language>
+ <language type="os">Ossetíska</language>
+ <language type="osa">Ósage</language>
+ <language type="ota">Tyrkneska, ottóman (1500-1928)</language>
+ <language type="oto">Ótommál</language>
+ <language type="pa">Púnjabí</language>
+ <language type="paa">Papúsk mál (önnur)</language>
+ <language type="pag">Pangasínmál</language>
+ <language type="pal">Palaví</language>
+ <language type="pam">Pampanga</language>
+ <language type="pap">Papíamentó</language>
+ <language type="pau">Paláska</language>
+ <language type="peo">Fornpersneska</language>
+ <language type="phi">Filippseysk mál (önnur)</language>
+ <language type="phn">Fönikíska</language>
+ <language type="pi">Palí</language>
+ <language type="pl">Pólska</language>
+ <language type="pon">Ponpeiska</language>
+ <language type="pra">Prakrítmál</language>
+ <language type="pro">Fornpróvensalska (til 1500)</language>
+ <language type="ps">Pastú</language>
+ <language type="pt">Portúgalska</language>
+ <language type="qu">Kvesjúa</language>
+ <language type="raj">Rajastaní</language>
+ <language type="rap">Rapanúí</language>
+ <language type="rar">Rarótongska</language>
+ <language type="rm">Retórómanska</language>
+ <language type="rn">Rúndí</language>
+ <language type="ro">Rúmenska</language>
+ <language type="roa">Rómönsk mál (önnur)</language>
+ <language type="rom">Romaní</language>
+ <language type="ru">Rússneska</language>
+ <language type="rw">Kínjarvanda</language>
+ <language type="sa">Sanskrít</language>
+ <language type="sad">Sandave</language>
+ <language type="sah">Jakút</language>
+ <language type="sai">Indíánamál Suður-Ameríku (önnur)</language>
+ <language type="sal">Salísmál</language>
+ <language type="sam">Samversk arameíska</language>
+ <language type="sas">Sasak</language>
+ <language type="sat">Santalí</language>
+ <language type="sc">Sardínska</language>
+ <language type="sco">Skoska</language>
+ <language type="sd">Sindí</language>
+ <language type="se">Norðursamíska</language>
+ <language type="sel">Selkúp</language>
+ <language type="sem">Semísk mál (önnur)</language>
+ <language type="sg">Sangó</language>
+ <language type="sga">Fornírska (til 900)</language>
+ <language type="sgn">Táknmál</language>
+ <language type="sh">Serbókróatíska</language>
+ <language type="sh" alt="proposed-u219-1" draft="unconfirmed">serbókróatíska</language>
+ <language type="shn">Sjan</language>
+ <language type="si">Singalesíska</language>
+ <language type="sid">Sídamó</language>
+ <language type="sio">Síúmál</language>
+ <language type="sit">Sínótíbesk mál (önnur)</language>
+ <language type="sit" alt="proposed-u219-1" draft="unconfirmed">sínótíbesk mál (önnur)</language>
+ <language type="sk">Slóvakíska</language>
+ <language type="sl">Slóvenska</language>
+ <language type="sla">Slavnesk mál (önnur)</language>
+ <language type="sm">Samóska</language>
+ <language type="sma">Suðursamíska</language>
+ <language type="smi">Samísk mál (önnur)</language>
+ <language type="smj">Lúlesamíska</language>
+ <language type="smn">Enaresamíska</language>
+ <language type="sms">Skoltesamíska</language>
+ <language type="sn">Shona</language>
+ <language type="snk">Sóninke</language>
+ <language type="so">Sómalska</language>
+ <language type="sog">Sogdíen</language>
+ <language type="son">Songhaí</language>
+ <language type="sq">Albanska</language>
+ <language type="sr">Serbneska</language>
+ <language type="srn" draft="unconfirmed">sranan tongo</language>
+ <language type="srr">Serer</language>
+ <language type="ss">Svatí</language>
+ <language type="ssa">Nílósaharamál (önnur)</language>
+ <language type="st">Suðursótó</language>
+ <language type="su">Súndanska</language>
+ <language type="suk">Súkúma</language>
+ <language type="sus">Súsú</language>
+ <language type="sux">Súmerska</language>
+ <language type="sv">Sænska</language>
+ <language type="sw">Svahílí</language>
+ <language type="syr">Sýrlenska</language>
+ <language type="ta">Tamílska</language>
+ <language type="tai">Taímál (önnur)</language>
+ <language type="te">Telúgú</language>
+ <language type="tem">Tímne</language>
+ <language type="ter">Terenó</language>
+ <language type="tet">Tetúm</language>
+ <language type="tg">Tadsjikska</language>
+ <language type="th">Taílenska</language>
+ <language type="ti">Tígrinja</language>
+ <language type="tig">Tígre</language>
+ <language type="tiv">Tív</language>
+ <language type="tk">Túrkmenska</language>
+ <language type="tkl">Tókeláska</language>
+ <language type="tl">Tagalog</language>
+ <language type="tlh" draft="unconfirmed">klingónska</language>
+ <language type="tli">Tlingit</language>
+ <language type="tmh">Tamasjek</language>
+ <language type="tn">Tsúana</language>
+ <language type="to">Tongverska (Tongaeyjar)</language>
+ <language type="tog">Tongverska (Nyasa)</language>
+ <language type="tpi">Tokpisin</language>
+ <language type="tr">Tyrkneska</language>
+ <language type="ts">Tsonga</language>
+ <language type="tsi">Tsimsíska</language>
+ <language type="tt">Tatarska</language>
+ <language type="tum">Túmbúka</language>
+ <language type="tup">Túpímál</language>
+ <language type="tut">Altaísk mál (önnur)</language>
+ <language type="tvl">Túvalúska</language>
+ <language type="tw">Tví</language>
+ <language type="ty">Tahítíska</language>
+ <language type="tyv">Túvínska</language>
+ <language type="udm">Údmúrt</language>
+ <language type="ug">Úígúr</language>
+ <language type="uga">Úgarítíska</language>
+ <language type="uk">Úkraínska</language>
+ <language type="umb">Úmbúndú</language>
+ <language type="und">Óljóst</language>
+ <language type="ur">Úrdú</language>
+ <language type="uz">Úsbekska</language>
+ <language type="vai">Vaí</language>
+ <language type="ve">Venda</language>
+ <language type="vi">Víetnamska</language>
+ <language type="vo">Volapük</language>
+ <language type="vo" alt="proposed-u219-1" draft="unconfirmed">volapyk</language>
+ <language type="vot">Votíska</language>
+ <language type="wa">Vallónska</language>
+ <language type="wak">Vakasmál</language>
+ <language type="wal">Valamó</language>
+ <language type="war">Varaí</language>
+ <language type="was">Vasjó</language>
+ <language type="wen">Sorbnesk mál</language>
+ <language type="wo">Volof</language>
+ <language type="xal">Kalmúkska</language>
+ <language type="xh">Sósa</language>
+ <language type="yao">Jaó</language>
+ <language type="yap">Japíska</language>
+ <language type="yi">Jiddíska</language>
+ <language type="yo">Jórúba</language>
+ <language type="ypk">Júpísk mál</language>
+ <language type="za">Súang</language>
+ <language type="zap">Sapótek</language>
+ <language type="zen">Senaga</language>
+ <language type="zh">Kínverska</language>
+ <language type="znd">Sande</language>
+ <language type="zu">Súlú</language>
+ <language type="zun">Súní</language>
+ </languages>
+ <scripts>
+ <script type="Latn" draft="unconfirmed">Latneskt</script>
+ </scripts>
+ <territories>
+ <territory type="001" draft="unconfirmed">Heimur</territory>
+ <territory type="002" draft="unconfirmed">Afríka</territory>
+ <territory type="005" draft="unconfirmed">suður-Ameríka</territory>
+ <territory type="009" draft="unconfirmed">Eyjaálfa</territory>
+ <territory type="011" draft="unconfirmed">vestur-Afríka</territory>
+ <territory type="013" draft="unconfirmed">mið-Ameríka</territory>
+ <territory type="014" draft="unconfirmed">austur-Afríka</territory>
+ <territory type="015" draft="unconfirmed">norður-Afríka</territory>
+ <territory type="017" draft="unconfirmed">mið-Afríka</territory>
+ <territory type="018" draft="unconfirmed">suður-Afríka</territory>
+ <territory type="019" draft="unconfirmed">Ameríka</territory>
+ <territory type="021" draft="unconfirmed">norður-Ameríka</territory>
+ <territory type="029" draft="unconfirmed">Karíbahaf</territory>
+ <territory type="030" draft="unconfirmed">austur-Asía</territory>
+ <territory type="035" draft="unconfirmed">suðaustur-Asía</territory>
+ <territory type="039" draft="unconfirmed">suður-Evrópa</territory>
+ <territory type="053" draft="unconfirmed">Ãstralía og Nýja-Sjáland</territory>
+ <territory type="054" draft="unconfirmed">Melanesía</territory>
+ <territory type="057" draft="unconfirmed">Míkrónesía</territory>
+ <territory type="061" draft="unconfirmed">Pólýnesía</territory>
+ <territory type="062" draft="unconfirmed">syðri mið-Asía</territory>
+ <territory type="142" draft="unconfirmed">Asía</territory>
+ <territory type="145" draft="unconfirmed">vestur-Asía</territory>
+ <territory type="150" draft="unconfirmed">Evrópa</territory>
+ <territory type="151" draft="unconfirmed">austur-Evrópa</territory>
+ <territory type="154" draft="unconfirmed">norður-Evrópa</territory>
+ <territory type="155" draft="unconfirmed">vestur-Evrópa</territory>
+ <territory type="830" draft="unconfirmed">Ermasundseyjar</territory>
+ <territory type="IM" draft="unconfirmed">Mön</territory>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Sameinuðu arabísku furstadæmin</territory>
+ <territory type="AF">Afganistan</territory>
+ <territory type="AG">Antígva og Barbúda</territory>
+ <territory type="AI">Angvilla</territory>
+ <territory type="AL">Albanía</territory>
+ <territory type="AM">Armenía</territory>
+ <territory type="AN">Hollensku Antillur</territory>
+ <territory type="AO">Angóla</territory>
+ <territory type="AQ">Suðurskautslandið</territory>
+ <territory type="AR">Argentína</territory>
+ <territory type="AS">Bandaríska Samóa</territory>
+ <territory type="AT">Austurríki</territory>
+ <territory type="AU">Ãstralía</territory>
+ <territory type="AW">Arúba</territory>
+ <territory type="AX" draft="unconfirmed">Ãland</territory>
+ <territory type="AZ">Aserbaídsjan</territory>
+ <territory type="BA">Bosnía og Hersegóvína</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladess</territory>
+ <territory type="BE">Belgía</territory>
+ <territory type="BF">Búrkína Fasó</territory>
+ <territory type="BG">Búlgaría</territory>
+ <territory type="BH">Barein</territory>
+ <territory type="BI">Búrúndí</territory>
+ <territory type="BJ">Benín</territory>
+ <territory type="BM">Bermúdaeyjar</territory>
+ <territory type="BN">Brúnei</territory>
+ <territory type="BO">Bólivía</territory>
+ <territory type="BR">Brasilía</territory>
+ <territory type="BS">Bahamaeyjar</territory>
+ <territory type="BT">Bútan</territory>
+ <territory type="BV">Bouveteyja</territory>
+ <territory type="BW">Botsvana</territory>
+ <territory type="BY">Hvíta-Rússland</territory>
+ <territory type="BZ">Belís</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Kókoseyjar</territory>
+ <territory type="CD">Austur-Kongó</territory>
+ <territory type="CF">Mið-Afríkulýðveldið</territory>
+ <territory type="CG">Vestur-Kongó</territory>
+ <territory type="CH">Sviss</territory>
+ <territory type="CI">Fílabeinsströndin</territory>
+ <territory type="CK">Cookseyjar</territory>
+ <territory type="CL" draft="unconfirmed">Chile</territory>
+ <territory type="CM">Kamerún</territory>
+ <territory type="CN">Kína</territory>
+ <territory type="CO">Kólumbía</territory>
+ <territory type="CR">Kostaríka</territory>
+ <territory type="CS" draft="unconfirmed">Serbía</territory>
+ <territory type="CU">Kúba</territory>
+ <territory type="CV">Grænhöfðaeyjar</territory>
+ <territory type="CX">Jólaey</territory>
+ <territory type="CY">Kýpur</territory>
+ <territory type="CZ">Tékkland</territory>
+ <territory type="DE">Þýskaland</territory>
+ <territory type="DJ">Djíbútí</territory>
+ <territory type="DK">Danmörk</territory>
+ <territory type="DM">Dóminíka</territory>
+ <territory type="DO">Dóminíska lýðveldið</territory>
+ <territory type="DZ">Alsír</territory>
+ <territory type="EC">Ekvador</territory>
+ <territory type="EE">Eistland</territory>
+ <territory type="EG">Egyptaland</territory>
+ <territory type="EH">Vestur-Sahara</territory>
+ <territory type="ER">Erítrea</territory>
+ <territory type="ES">Spánn</territory>
+ <territory type="ET">Eþíópía</territory>
+ <territory type="FI">Finnland</territory>
+ <territory type="FJ">Fídjieyjar</territory>
+ <territory type="FK">Falklandseyjar</territory>
+ <territory type="FM">Mikrónesía</territory>
+ <territory type="FO">Færeyjar</territory>
+ <territory type="FR">Frakkland</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Bretland</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Georgía</territory>
+ <territory type="GF">Franska Gvæjana</territory>
+ <territory type="GH">Gana</territory>
+ <territory type="GI">Gíbraltar</territory>
+ <territory type="GL">Grænland</territory>
+ <territory type="GM">Gambía</territory>
+ <territory type="GN">Gínea</territory>
+ <territory type="GP">Gvadelúpeyjar</territory>
+ <territory type="GQ">Miðbaugs-Gínea</territory>
+ <territory type="GR">Grikkland</territory>
+ <territory type="GS">Suður-Georgía og Suður-Sandvíkureyjar</territory>
+ <territory type="GT">Gvatemala</territory>
+ <territory type="GU">Gvam</territory>
+ <territory type="GW">Gínea-Bissá</territory>
+ <territory type="GY">Gvæjana</territory>
+ <territory type="HK">Hong Kong</territory>
+ <territory type="HM">Heard og McDonaldseyjar</territory>
+ <territory type="HN">Hondúras</territory>
+ <territory type="HR">Króatía</territory>
+ <territory type="HT">Haítí</territory>
+ <territory type="HU">Ungverjaland</territory>
+ <territory type="ID">Indónesía</territory>
+ <territory type="IE">Ãrland</territory>
+ <territory type="IL">Ãsrael</territory>
+ <territory type="IN">Indland</territory>
+ <territory type="IO">Bresku Indlandshafseyjar</territory>
+ <territory type="IQ">Ãrak</territory>
+ <territory type="IR">Ãran</territory>
+ <territory type="IS">Ãsland</territory>
+ <territory type="IT">Ãtalía</territory>
+ <territory type="JM">Jamaíka</territory>
+ <territory type="JO">Jórdanía</territory>
+ <territory type="JP">Japan</territory>
+ <territory type="KE">Kenía</territory>
+ <territory type="KG">Kirgisistan</territory>
+ <territory type="KH">Kambódía</territory>
+ <territory type="KI">Kíribatí</territory>
+ <territory type="KM">Kómoreyjar</territory>
+ <territory type="KN">Sankti Kristófer og Nevis</territory>
+ <territory type="KP">Norður-Kórea</territory>
+ <territory type="KR">Suður-Kórea</territory>
+ <territory type="KW">Kúveit</territory>
+ <territory type="KY">Caymaneyjar</territory>
+ <territory type="KZ">Kasakstan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Líbanon</territory>
+ <territory type="LC">Sankti Lúsía</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Srí Lanka</territory>
+ <territory type="LR">Líbería</territory>
+ <territory type="LS">Lesótó</territory>
+ <territory type="LT">Litháen</territory>
+ <territory type="LU">Lúxemborg</territory>
+ <territory type="LV">Lettland</territory>
+ <territory type="LY">Líbía</territory>
+ <territory type="MA">Marokkó</territory>
+ <territory type="MC">Mónakó</territory>
+ <territory type="MD">Moldóva</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshalleyjar</territory>
+ <territory type="MK">Makedónía</territory>
+ <territory type="ML">Malí</territory>
+ <territory type="MM">Mjanmar</territory>
+ <territory type="MN">Mongólía</territory>
+ <territory type="MO">Makaó</territory>
+ <territory type="MP">Norður-Maríanaeyjar</territory>
+ <territory type="MQ">Martiník</territory>
+ <territory type="MR">Máritanía</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Máritíus</territory>
+ <territory type="MV">Maldíveyjar</territory>
+ <territory type="MW">Malaví</territory>
+ <territory type="MX">Mexíkó</territory>
+ <territory type="MY">Malasía</territory>
+ <territory type="MZ">Mósambík</territory>
+ <territory type="NA">Namibía</territory>
+ <territory type="NC">Nýja-Kaledónía</territory>
+ <territory type="NE">Níger</territory>
+ <territory type="NF">Norfolkeyja</territory>
+ <territory type="NG">Nígería</territory>
+ <territory type="NI">Níkaragva</territory>
+ <territory type="NL">Niðurlönd</territory>
+ <territory type="NO">Noregur</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nárú</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Nýja-Sjáland</territory>
+ <territory type="OM">Óman</territory>
+ <territory type="PA" draft="unconfirmed">Panama</territory>
+ <territory type="PE">Perú</territory>
+ <territory type="PF">Franska Pólýnesía</territory>
+ <territory type="PG">Papúa Nýja-Gínea</territory>
+ <territory type="PH">Filippseyjar</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Pólland</territory>
+ <territory type="PM">Sankti Pierre og Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Púertó Ríkó</territory>
+ <territory type="PS">Palestína</territory>
+ <territory type="PT">Portúgal</territory>
+ <territory type="PW">Palá</territory>
+ <territory type="PY">Paragvæ</territory>
+ <territory type="QA">Katar</territory>
+ <territory type="QO" draft="unconfirmed">ytri Eyjaálfa</territory>
+ <territory type="RE">Réunion</territory>
+ <territory type="RO">Rúmenía</territory>
+ <territory type="RU">Rússland</territory>
+ <territory type="RW">Rúanda</territory>
+ <territory type="SA">Sádi-Arabía</territory>
+ <territory type="SB">Salómonseyjar</territory>
+ <territory type="SC">Seychelleseyjar</territory>
+ <territory type="SD">Súdan</territory>
+ <territory type="SE">Svíþjóð</territory>
+ <territory type="SG">Singapúr</territory>
+ <territory type="SH">Sankti Helena</territory>
+ <territory type="SI">Slóvenía</territory>
+ <territory type="SJ">Svalbarði og Jan Mayen</territory>
+ <territory type="SK">Slóvakía</territory>
+ <territory type="SL">Síerra Leóne</territory>
+ <territory type="SM">San Marínó</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Sómalía</territory>
+ <territory type="SR">Súrínam</territory>
+ <territory type="ST">Saó Tóme og Prinsípe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Sýrland</territory>
+ <territory type="SZ">Svasíland</territory>
+ <territory type="TC">Turks- og Caicoseyjar</territory>
+ <territory type="TD">Tsjad</territory>
+ <territory type="TF">Frönsku suðlægu landsvæðin</territory>
+ <territory type="TG">Tógó</territory>
+ <territory type="TH">Taíland</territory>
+ <territory type="TJ">Tadsjikistan</territory>
+ <territory type="TK">Tókelá</territory>
+ <territory type="TL">Austur-Tímor</territory>
+ <territory type="TM">Túrkmenistan</territory>
+ <territory type="TN">Túnis</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Tyrkland</territory>
+ <territory type="TT">Trínidad og Tóbagó</territory>
+ <territory type="TV">Túvalú</territory>
+ <territory type="TW">Taívan</territory>
+ <territory type="TZ">Tansanía</territory>
+ <territory type="UA">Úkraína</territory>
+ <territory type="UG">Úganda</territory>
+ <territory type="UM">Smáeyjar Bandaríkjanna</territory>
+ <territory type="US">Bandaríkin</territory>
+ <territory type="UY">Úrúgvæ</territory>
+ <territory type="UZ">Úsbekistan</territory>
+ <territory type="VA">Páfagarður</territory>
+ <territory type="VC">Sankti Vinsent og Grenadíneyjar</territory>
+ <territory type="VE">Venesúela</territory>
+ <territory type="VG">Jómfrúaeyjar (bresku)</territory>
+ <territory type="VI">Jómfrúaeyjar (bandarísku)</territory>
+ <territory type="VN">Víetnam</territory>
+ <territory type="VU">Vanúatú</territory>
+ <territory type="WF">Wallis- og Fútúnaeyjar</territory>
+ <territory type="WS">Samóa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Suður-Afríka</territory>
+ <territory type="ZM">Sambía</territory>
+ <territory type="ZW" draft="unconfirmed">Simbabve</territory>
+ </territories>
+ <keys>
+ <key type="calendar">Dagatal</key>
+ <key type="collation">Röðun</key>
+ <key type="currency">Gjaldmiðill</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">Búddískt dagatal</type>
+ <type type="chinese" key="calendar">Kínverskt dagatal</type>
+ <type type="direct" key="collation">Bein röðun</type>
+ <type type="gregorian" key="calendar">Gregorískt dagatal</type>
+ <type type="hebrew" key="calendar">Hebreskt dagatal</type>
+ <type type="islamic" key="calendar">Ãslamskt dagatal</type>
+ <type type="islamic-civil" key="calendar">Ãslamskt borgaradagatal</type>
+ <type type="japanese" key="calendar">Japanskt dagatal</type>
+ <type type="phonebook" key="collation">Símaskráarröðun</type>
+ <type type="pinyin" key="collation">Pinyin-röðun</type>
+ <type type="stroke" key="collation">Strikaröðun</type>
+ <type type="traditional" key="collation">Hefðbundin</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a á b d ð e é f-i í j-o ó p r-u ú v y ý þ æ ö]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[c q w z]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">â€</quotationStart>
+ <alternateQuotationStart draft="unconfirmed">’</alternateQuotationStart>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">jan</month>
+ <month type="2">feb</month>
+ <month type="3">mar</month>
+ <month type="4">apr</month>
+ <month type="5">maí</month>
+ <month type="6">jún</month>
+ <month type="7">júl</month>
+ <month type="8">ágú</month>
+ <month type="9">sep</month>
+ <month type="10">okt</month>
+ <month type="11">nóv</month>
+ <month type="12">des</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">janúar</month>
+ <month type="2">febrúar</month>
+ <month type="3">mars</month>
+ <month type="4">apríl</month>
+ <month type="5">maí</month>
+ <month type="6">júní</month>
+ <month type="7">júlí</month>
+ <month type="8">ágúst</month>
+ <month type="9">september</month>
+ <month type="10">október</month>
+ <month type="11">nóvember</month>
+ <month type="12">desember</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">j</month>
+ <month type="2">f</month>
+ <month type="3">m</month>
+ <month type="4">a</month>
+ <month type="5">m</month>
+ <month type="6">j</month>
+ <month type="7">j</month>
+ <month type="8">á</month>
+ <month type="9">s</month>
+ <month type="10">o</month>
+ <month type="11">n</month>
+ <month type="12">d</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">sun</day>
+ <day type="mon">mán</day>
+ <day type="tue">þri</day>
+ <day type="wed">mið</day>
+ <day type="thu">fim</day>
+ <day type="fri">fös</day>
+ <day type="sat">lau</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">sunnudagur</day>
+ <day type="mon">mánudagur</day>
+ <day type="tue">þriðjudagur</day>
+ <day type="wed">miðvikudagur</day>
+ <day type="thu">fimmtudagur</day>
+ <day type="fri">föstudagur</day>
+ <day type="sat">laugardagur</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">s</day>
+ <day type="mon">m</day>
+ <day type="tue">þ</day>
+ <day type="wed">m</day>
+ <day type="thu">f</day>
+ <day type="fri">f</day>
+ <day type="sat">l</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">F1</quarter>
+ <quarter type="2">F2</quarter>
+ <quarter type="3">F3</quarter>
+ <quarter type="4">F4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1st fjórðungur</quarter>
+ <quarter type="2" draft="unconfirmed">2nd fjórðungur</quarter>
+ <quarter type="3" draft="unconfirmed">3rd fjórðungur</quarter>
+ <quarter type="4" draft="unconfirmed">4th fjórðungur</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d.M.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d.M.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="unconfirmed">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="unconfirmed">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="MMMMd" draft="provisional">d. MMMM</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">d.M</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">M.yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity draft="unconfirmed">Suðurpóll</exemplarCity>
+ </zone>
+ <zone type="America/Buenos_Aires">
+ <exemplarCity draft="unconfirmed">Búenos Aíres</exemplarCity>
+ </zone>
+ <zone type="America/Regina">
+ <exemplarCity draft="unconfirmed">Regína</exemplarCity>
+ </zone>
+ <zone type="America/Santiago">
+ <exemplarCity draft="unconfirmed">Santíagó</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity draft="unconfirmed">Kanarí</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity draft="unconfirmed">Madríd</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity draft="unconfirmed">Mexíkóborg</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity draft="unconfirmed">Kankún</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuala_Lumpur">
+ <exemplarCity draft="unconfirmed">Kúala Lúmpúr</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity draft="unconfirmed">Tahítí</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity draft="unconfirmed">Asoreyjar</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity draft="unconfirmed">Lissabon</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity draft="unconfirmed">Moskva</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Andorrskur peseti</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>Arabískt dírham</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName>Lek</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>Dramm</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>Hollenskt Antillugyllini</displayName>
+ <symbol>NA f.</symbol>
+ </currency>
+ <currency type="ARA">
+ <displayName>Argentine Austral</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Argentískur pesi (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Argentískur pesi</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>Austurrískur skildingur</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>Ãstralskur dalur</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>Barbadoskur dalur</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BEF">
+ <displayName>Belgískur franki</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BGL">
+ <displayName>Lef</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>Lef, nýtt</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName>Bermúdeyskur dalur</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>Brúneiskur dalur</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>Bólivískur pesi</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Bolivian Mvdol</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Brasilískt ríal</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BSD">
+ <displayName>Bahameyskur dalur</displayName>
+ </currency>
+ <currency type="BUK">
+ <displayName>Búrmverskt kjat</displayName>
+ </currency>
+ <currency type="BZD">
+ <displayName>Belískur dalur</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>Kanadískur dalur</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CHF">
+ <displayName>Svissneskur franki</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CLF">
+ <displayName>Chilean Unidades de Fomento</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Chileskur pesi</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>Júan</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>Kólumbískur pesi</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="CSK">
+ <displayName>Tékknesk króna, eldri</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Kúbverskur pesi</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Grænhöfðeyskur skúti</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>Kýpverskt pund</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>Tékknesk króna</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>Austurþýskt mark</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Þýskt mark</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Djibouti Franc</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>Dönsk króna</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>Dóminískur pesi</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>Ecuador Sucre</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>Eistnesk króna</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>Egypskt pund</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Spænskur peseti</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>Finnskt mark</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Fídjeyskur dalur</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>Falklenskt pund</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Franskur franki</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Sterlingspund</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>Gíbraltarspund</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Gíneufranki</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GRD">
+ <displayName>Drakma</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Guatemala Quetzal</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>Portúgalskur, gíneskur skúti</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>Gvæjanskur dalur</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>Hong Kong-dalur</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>Hoduras Lempira</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRK">
+ <displayName>Kúna</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Fórinta</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>Indónesísk rúpía</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>Ãrskt pund</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>Ãsraelskt pund</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Sikill</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Indversk rúpía</displayName>
+ <symbol>INR</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>Ãrakskur denari</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>Ãranskt ríal</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>Ãslensk króna</displayName>
+ <symbol>kr.</symbol>
+ </currency>
+ <currency type="ITL">
+ <displayName>Ãtölsk líra</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>Jamaískur dalur</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>Jen</displayName>
+ </currency>
+ <currency type="KMF">
+ <displayName>Kómoreyskur franki</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>Norðurkóreskt vonn</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Suðurkóreskt vonn</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>Kúveiskur denari</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>Caymaneyskur dalur</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Kazakhstan Tenge</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LBP">
+ <displayName>Líbanskt pund</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>Srílönsk rúpía</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>Líberískur dalur</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Lesotho Loti</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LTL">
+ <displayName>Lít</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Lithuanian Talonas</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Lúxemborgarfranki</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Lat</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>Lettnesk rúbla</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>Líbískur denari</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>Marokkóskt dírham</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>Marokkóskur franki</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>Madagascar Ariary</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Madagaskur franki</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>Makedónskur denari</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>Malískur franki</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Mjanmarskt kjat</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>Túríkur</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Macao Pataca</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Mauritania Ouguiya</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>Meltnesk líra</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>Maltneskt pund</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName>Mexíkóskur pesi</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>Mexíkóskur silfurpesi (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>Mexíkóskur pesi, UDI</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Malaysian Ringgit</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>Mósambískur skúti</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName>Namibískur dalur</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>Nigerian Naira</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Hollenskt gyllini</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Norsk króna</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>Nýsjálenskur dalur</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>Ómanskt ríal</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>Balbói</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>Pakistönsk rúpía</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Slot</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Portúgalskur skúti</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>Rúmenskt lei</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">Rússnesk rúbla</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Rússnesk rúbla (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>Rwandan Franc</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>Sádiarabískt ríal</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>Salómonseyskur dalur</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>Seychelles rúpía</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>Súdanskur denari</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>Súdanskt pund</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>Sænsk króna</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>Singapúrskur dalur</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>Helenskt pund</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Slóvenskur dalur</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Slóvakísk króna</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SRG">
+ <displayName>Suriname Guilder</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>Sao Tome and Principe Dobra</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>Soviet Rouble</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>El Salvador Colon</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>Sýrlenskt pund</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>Bat</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>Tadsjiksk rúbla</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Tajikistan Somoni</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Túrkmenskt manat</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>Tímorskur skúti</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Tyrknesk líra</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName draft="unconfirmed">Ný, tyrknesk líra</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Trínidad og Tóbagó-dalur</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>Taívanskur dalur</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>Tanzanian Shilling</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>Hrinja</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Ukrainian Karbovanetz</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>Bandaríkjadalur</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>Bandaríkjadalur (næsta dag)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>Bandaríkjadalur (sama dag)</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Venezuelan Bolivar</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VUV">
+ <displayName>Vanuatu Vatu</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="XAF">
+ <displayName>Miðafrískur franki, BEAC</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>Austur-Karíbahafsdalur</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>Sérstök dráttarréttindi</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>Franskur gullfranki</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>Franskur franki, UIC</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>Miðafrískur franki, BCEAO</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>Pólinesískur franki</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="YDD">
+ <displayName>Jemenskur denari</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Jemenskt ríal</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUM">
+ <displayName>Júgóslavneskur denari</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>Rand (viðskipta)</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Zambian Kwacha</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Simbabveskur dalur</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">já:ja:j</yesstr>
+ <nostr draft="unconfirmed">nei:n</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/is_IS.xml b/libs/Zend/Locale/Data/is_IS.xml
new file mode 100755
index 0000000000..4c4a100929
--- /dev/null
+++ b/libs/Zend/Locale/Data/is_IS.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/29 16:00:25 $"/>
+ <language type="is"/>
+ <territory type="IS"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa" draft="provisional">Afar</language>
+ <language type="ain" draft="provisional">Ainú</language>
+ <language type="alt" draft="provisional">Altaí</language>
+ <language type="sit" draft="provisional">Sínótíbeska (önnur)</language>
+ <language type="sn" draft="provisional">Shóna</language>
+ <language type="vo" draft="provisional">Volapuk</language>
+ </languages>
+ <scripts>
+ <script type="Arab" draft="provisional">Arabískt</script>
+ <script type="Cyrl" draft="provisional">Kyrillískt</script>
+ <script type="Ethi" draft="provisional">Eþíópískt</script>
+ <script type="Hans" draft="provisional">Einföldað Han</script>
+ <script type="Hant" draft="provisional">Hefðbundið Han</script>
+ </scripts>
+ <territories>
+ <territory type="018" draft="provisional">Syðri-Afríka</territory>
+ </territories>
+ <measurementSystemNames>
+ <measurementSystemName type="US" draft="provisional">Bandarískt</measurementSystemName>
+ <measurementSystemName type="metric" draft="provisional">Metrakerfi</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <delimiters>
+ <quotationStart draft="provisional">„</quotationStart>
+ <quotationEnd draft="provisional">“</quotationEnd>
+ <alternateQuotationStart draft="provisional">‚</alternateQuotationStart>
+ <alternateQuotationEnd draft="provisional">‘</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="provisional">já:j</yesstr>
+ </messages>
+ </posix>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/it.xml b/libs/Zend/Locale/Data/it.xml
new file mode 100755
index 0000000000..2b390e48c8
--- /dev/null
+++ b/libs/Zend/Locale/Data/it.xml
@@ -0,0 +1,2008 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.70 $"/>
+ <generation date="$Date: 2006/06/28 10:58:36 $"/>
+ <language type="it"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">afar</language>
+ <language type="ab">abkhazian</language>
+ <language type="ace">accinese</language>
+ <language type="ach">acioli</language>
+ <language type="ada">adangme</language>
+ <language type="ady">adyghe</language>
+ <language type="ae">avestan</language>
+ <language type="af">afrikaans</language>
+ <language type="afa">afro-asiatica (altra lingua)</language>
+ <language type="afh">afrihili</language>
+ <language type="ain" references="RP2">ainu</language>
+ <language type="ak">akan</language>
+ <language type="akk">accado</language>
+ <language type="ale">aleuto</language>
+ <language type="alg">lingue algonchine</language>
+ <language type="am">amarico</language>
+ <language type="an">aragonese</language>
+ <language type="ang">inglese, antico (ca.450-1100)</language>
+ <language type="apa">lingue apache</language>
+ <language type="ar">arabo</language>
+ <language type="arc">aramaico</language>
+ <language type="arn">araucano</language>
+ <language type="arp">arapaho</language>
+ <language type="art">artificiale (altra lingua)</language>
+ <language type="arw">aruaco</language>
+ <language type="as">assamese</language>
+ <language type="ast">asturiano</language>
+ <language type="ath">lingue athabaska</language>
+ <language type="aus">lingue australiane</language>
+ <language type="av">avaro</language>
+ <language type="awa">awadhi</language>
+ <language type="ay">aymara</language>
+ <language type="az">azerbaigiano</language>
+ <language type="ba">baschiro</language>
+ <language type="bad">banda</language>
+ <language type="bai">lingue bamileke</language>
+ <language type="bal">beluci</language>
+ <language type="ban">balinese</language>
+ <language type="bas">basa</language>
+ <language type="bat">baltica (altra lingua)</language>
+ <language type="be">bielorusso</language>
+ <language type="bej">begia</language>
+ <language type="bem">wemba</language>
+ <language type="ber">berbero</language>
+ <language type="bg">bulgaro</language>
+ <language type="bh">bihari</language>
+ <language type="bho">bhojpuri</language>
+ <language type="bi">bislama</language>
+ <language type="bik">bicol</language>
+ <language type="bin">bini</language>
+ <language type="bla">siksika</language>
+ <language type="bm">bambara</language>
+ <language type="bn">bengalese</language>
+ <language type="bnt">bantu</language>
+ <language type="bo">tibetano</language>
+ <language type="br">bretone</language>
+ <language type="bra">braj</language>
+ <language type="bs">bosniaco</language>
+ <language type="btk">batak</language>
+ <language type="bua">buriat</language>
+ <language type="bug">bugi</language>
+ <language type="byn">blin</language>
+ <language type="ca">catalano</language>
+ <language type="cad">caddo</language>
+ <language type="cai">indiana dell’America Centrale (altra lingua)</language>
+ <language type="car">caribico</language>
+ <language type="cau">caucasica (altra lingua)</language>
+ <language type="ce">ceceno</language>
+ <language type="ceb">cebuano</language>
+ <language type="cel">celtica altra lingua</language>
+ <language type="ch">chamorro</language>
+ <language type="chb">chibcha</language>
+ <language type="chg">ciagataico</language>
+ <language type="chk">chuukese</language>
+ <language type="chm">mari</language>
+ <language type="chn">gergo chinook</language>
+ <language type="cho">choctaw</language>
+ <language type="chp">chipewyan</language>
+ <language type="chr">cherokee</language>
+ <language type="chy">cheyenne</language>
+ <language type="cmc">lingue chamic</language>
+ <language type="co">corso</language>
+ <language type="cop">copto</language>
+ <language type="cpe">creolo e pidgins, basato sull’inglese (altra lingua)</language>
+ <language type="cpf">creolo e pidgins, basato sul francese (altra lingua)</language>
+ <language type="cpp">creolo e pidgins, basato sul portoghese (altra lingua)</language>
+ <language type="cr">cree</language>
+ <language type="crh">turco crimeo; tatar crimeo</language>
+ <language type="crp">creola e Pidgins (altra lingua)</language>
+ <language type="cs">ceco</language>
+ <language type="csb">kashubian</language>
+ <language type="cu">slavo della Chiesa</language>
+ <language type="cus">cuscitica (altra lingua)</language>
+ <language type="cv">chuvash</language>
+ <language type="cy">gallese</language>
+ <language type="da">danese</language>
+ <language type="dak">dakota</language>
+ <language type="dar">dargwa</language>
+ <language type="day">dayak</language>
+ <language type="de">tedesco</language>
+ <language type="del">delaware</language>
+ <language type="den">slave</language>
+ <language type="dgr">dogrib</language>
+ <language type="din">dinca</language>
+ <language type="doi">dogri</language>
+ <language type="dra">dravidica (altra lingua)</language>
+ <language type="dsb">basso sorabo</language>
+ <language type="dua">duala</language>
+ <language type="dum">olandese, medio (ca. 1050-1350)</language>
+ <language type="dv">divehi</language>
+ <language type="dyu">diula</language>
+ <language type="dz">dzongkha</language>
+ <language type="ee">ewe</language>
+ <language type="efi">efik</language>
+ <language type="egy">egiziano (antico)</language>
+ <language type="eka">ekajuka</language>
+ <language type="el">greco</language>
+ <language type="elx">elamitico</language>
+ <language type="en">inglese</language>
+ <language type="enm">inglese, medio (1100-1500)</language>
+ <language type="eo">esperanto</language>
+ <language type="es">spagnolo</language>
+ <language type="et">estone</language>
+ <language type="eu">basco</language>
+ <language type="ewo">ewondo</language>
+ <language type="fa">persiano</language>
+ <language type="fan" references="RP2">fang</language>
+ <language type="fat">fanti</language>
+ <language type="ff">fulah</language>
+ <language type="fi">finlandese</language>
+ <language type="fil">filippino</language>
+ <language type="fiu">ugrofinnica (altra lingua)</language>
+ <language type="fj">figiano</language>
+ <language type="fo">faroese</language>
+ <language type="fr">francese</language>
+ <language type="frm">francese, medio (ca.1400-1600)</language>
+ <language type="fro">francese, antico (842-ca.1400)</language>
+ <language type="fur">friulano</language>
+ <language type="fy">frisone</language>
+ <language type="ga">irlandese</language>
+ <language type="gaa">ga</language>
+ <language type="gay">gayo</language>
+ <language type="gba">gbaya</language>
+ <language type="gd">gaelico scozzese</language>
+ <language type="gem">germanica (altra lingua)</language>
+ <language type="gez">geez</language>
+ <language type="gil">gilbertese</language>
+ <language type="gl">galiziano</language>
+ <language type="gmh">tedesco, medio alto (ca.1050-1500)</language>
+ <language type="gn">guarana</language>
+ <language type="goh">tedesco, antico alto (ca.750-1050)</language>
+ <language type="gon">gondi</language>
+ <language type="gor">gorontalo</language>
+ <language type="got">gotico</language>
+ <language type="grb">gerbo</language>
+ <language type="grc">greco, antico (fino al 1453)</language>
+ <language type="gu">gujarati</language>
+ <language type="gv">manx</language>
+ <language type="gwi">gwichʼin</language>
+ <language type="ha">haussa</language>
+ <language type="hai">haida</language>
+ <language type="haw">hawaiano</language>
+ <language type="he">ebraico</language>
+ <language type="hi">hindi</language>
+ <language type="hil">hiligayna</language>
+ <language type="him">himachali</language>
+ <language type="hit">hittite</language>
+ <language type="hmn">hmong</language>
+ <language type="ho">hiri motu</language>
+ <language type="hr">croato</language>
+ <language type="hsb">alto sorabo</language>
+ <language type="ht">haitiano</language>
+ <language type="hu">ungherese</language>
+ <language type="hup">hupa</language>
+ <language type="hy">armeno</language>
+ <language type="hz">herero</language>
+ <language type="ia">interlingua</language>
+ <language type="iba">iban</language>
+ <language type="id">indonesiano</language>
+ <language type="ie">interlingue</language>
+ <language type="ig">igbo</language>
+ <language type="ii">sichuan yi</language>
+ <language type="ik">inupiak</language>
+ <language type="ilo">ilocano</language>
+ <language type="inc">indiana (altra lingua)</language>
+ <language type="ine">indoeuropea (altra lingua)</language>
+ <language type="inh">ingush</language>
+ <language type="io">ido</language>
+ <language type="ira">iraniana</language>
+ <language type="iro">lingue irochesi</language>
+ <language type="is">islandese</language>
+ <language type="it">italiano</language>
+ <language type="iu">inuktitut</language>
+ <language type="ja">giapponese</language>
+ <language type="jbo">lojban</language>
+ <language type="jpr">giudeo persiano</language>
+ <language type="jrb">giudeo arabo</language>
+ <language type="jv">giavanese</language>
+ <language type="ka">georgiano</language>
+ <language type="kaa">kara-kalpak</language>
+ <language type="kab">kabyle</language>
+ <language type="kac">kachin</language>
+ <language type="kam">kamba</language>
+ <language type="kar">karen</language>
+ <language type="kaw">kawi</language>
+ <language type="kbd">kabardia</language>
+ <language type="kg">kongo</language>
+ <language type="kha">khasi</language>
+ <language type="khi">khoisan (altra lingua)</language>
+ <language type="kho">khotanese</language>
+ <language type="ki">kikuyu</language>
+ <language type="kj">kuanyama</language>
+ <language type="kk">kazako</language>
+ <language type="kl">kalaallisut</language>
+ <language type="km">khmer</language>
+ <language type="kmb">kimbundu</language>
+ <language type="kn">kannada</language>
+ <language type="ko">coreano</language>
+ <language type="kok">konkani</language>
+ <language type="kos">kosraean</language>
+ <language type="kpe">kpelle</language>
+ <language type="kr">kanuri</language>
+ <language type="krc">karachay-Balkar</language>
+ <language type="kro">kru</language>
+ <language type="kru">kurukh</language>
+ <language type="ks">kashmiri</language>
+ <language type="ku">curdo</language>
+ <language type="kum">kumyk</language>
+ <language type="kut">kutenai</language>
+ <language type="kv">komi</language>
+ <language type="kw">cornico</language>
+ <language type="ky">kirghiso</language>
+ <language type="la">latino</language>
+ <language type="lad">ladino</language>
+ <language type="lah">lahnda</language>
+ <language type="lam">lamba</language>
+ <language type="lb">lussemburghese</language>
+ <language type="lez">lezghian</language>
+ <language type="lg">ganda</language>
+ <language type="li">limburgese</language>
+ <language type="ln">lingala</language>
+ <language type="lo">lao</language>
+ <language type="lol">lolo (bantu)</language>
+ <language type="loz">lozi</language>
+ <language type="lt">lituano</language>
+ <language type="lu">luba-katanga</language>
+ <language type="lua">luba-lulua</language>
+ <language type="lui">luiseno</language>
+ <language type="lun">lunda</language>
+ <language type="luo">luo (Kenia e Tanzania)</language>
+ <language type="lus">lushai</language>
+ <language type="lv">lettone</language>
+ <language type="mad">madurese</language>
+ <language type="mag">magahi</language>
+ <language type="mai">maithili</language>
+ <language type="mak">makasar</language>
+ <language type="man">mandingo</language>
+ <language type="map">austronesiano</language>
+ <language type="mas">masai</language>
+ <language type="mdf">moksha</language>
+ <language type="mdr">mandar</language>
+ <language type="men">mende</language>
+ <language type="mg">malgascio</language>
+ <language type="mga">irlandese medio (900-1200)</language>
+ <language type="mh">marshallese</language>
+ <language type="mi">maori</language>
+ <language type="mic">micmac</language>
+ <language type="min">menangkabau</language>
+ <language type="mis">lingue diverse</language>
+ <language type="mk">macedone</language>
+ <language type="mkh">mon-khmer (altra lingua)</language>
+ <language type="ml">malayalam</language>
+ <language type="mn">mongolo</language>
+ <language type="mnc">manchu</language>
+ <language type="mni">manipuri</language>
+ <language type="mno">manobo</language>
+ <language type="mo">moldavo</language>
+ <language type="moh">mohawk</language>
+ <language type="mos">mossi</language>
+ <language type="mr">marathi</language>
+ <language type="ms">malese</language>
+ <language type="mt">maltese</language>
+ <language type="mul">multilingua</language>
+ <language type="mun">munda (altra lingua)</language>
+ <language type="mus">creek</language>
+ <language type="mwl" references="RP2">mirandese</language>
+ <language type="mwr">marwari</language>
+ <language type="my">birmano</language>
+ <language type="myn">lingue maya</language>
+ <language type="myv">erzya</language>
+ <language type="na">nauru</language>
+ <language type="nah">nahuatl</language>
+ <language type="nai">indiano del Nord America (altra lingua)</language>
+ <language type="nap">napoletano</language>
+ <language type="nb" references="RP1" draft="provisional">norvegese bokmal</language>
+ <language type="nd">ndebele del nord</language>
+ <language type="nds">basso tedesco; basso sassone</language>
+ <language type="ne">nepalese</language>
+ <language type="new">newari</language>
+ <language type="ng">ndonga</language>
+ <language type="nic">niger - cordofan (altra lingua)</language>
+ <language type="niu">niue</language>
+ <language type="nl">olandese</language>
+ <language type="nn">norvegese nynorsk</language>
+ <language type="no">norvegese</language>
+ <language type="nog">nogai</language>
+ <language type="non">norse antico</language>
+ <language type="nr">ndebele del sud</language>
+ <language type="nso">sotho del nord</language>
+ <language type="nub">nubiano</language>
+ <language type="nv">navajo</language>
+ <language type="ny">nyanja; chichewa; chewa</language>
+ <language type="nym">nyamwezi</language>
+ <language type="nyn">nyankole</language>
+ <language type="nyo">nyoro</language>
+ <language type="nzi">nzima</language>
+ <language type="oc">occitano (post 1500); provenzale</language>
+ <language type="oj">ojibwa</language>
+ <language type="om">oromo</language>
+ <language type="or">oriya</language>
+ <language type="os">ossetico</language>
+ <language type="osa">osage</language>
+ <language type="ota">turco ottomano (1500-1928)</language>
+ <language type="oto">lingue otomi</language>
+ <language type="pa">punjabi</language>
+ <language type="paa">papuano-australiano (altra lingua)</language>
+ <language type="pag">pangasinan</language>
+ <language type="pal">pahlavi</language>
+ <language type="pam">pampanga</language>
+ <language type="pap">papiamento</language>
+ <language type="pau">palau</language>
+ <language type="peo">antico persiano (600-400 A.C.)</language>
+ <language type="phi">filippino (altra lingua)</language>
+ <language type="phn">fenicio</language>
+ <language type="pi">pali</language>
+ <language type="pl">polacco</language>
+ <language type="pon">ponape</language>
+ <language type="pra">pracrito</language>
+ <language type="pro">provenzale, antico (fino al 1500)</language>
+ <language type="ps">pashto</language>
+ <language type="pt">portoghese</language>
+ <language type="qu">quechua</language>
+ <language type="raj">rajasthani</language>
+ <language type="rap">rapanui</language>
+ <language type="rar">rarotonga</language>
+ <language type="rm">lingua rhaeto-romance</language>
+ <language type="rn">rundi</language>
+ <language type="ro">rumeno</language>
+ <language type="roa">lingua romanza (altra lingua)</language>
+ <language type="rom">romani</language>
+ <language type="ru">russo</language>
+ <language type="rup" references="RP3">arumeno</language>
+ <language type="rw">kinyarwanda</language>
+ <language type="sa">sanscrito</language>
+ <language type="sad">sandawe</language>
+ <language type="sah">yakut</language>
+ <language type="sai">indiano del Sud America (altra lingua)</language>
+ <language type="sal">lingue salish</language>
+ <language type="sam">aramaico samaritano</language>
+ <language type="sas">sasak</language>
+ <language type="sat">santali</language>
+ <language type="sc">sardo</language>
+ <language type="scn">siciliano</language>
+ <language type="sco">scozzese</language>
+ <language type="sd">sindhi</language>
+ <language type="se">sami del nord</language>
+ <language type="sel">selkup</language>
+ <language type="sem">semitico (altra lingua)</language>
+ <language type="sg">sango</language>
+ <language type="sga">irlandese, antico (fino al ’900)</language>
+ <language type="sgn">lingue sign</language>
+ <language type="sh">serbo-croato</language>
+ <language type="shn">shan</language>
+ <language type="si">singalese</language>
+ <language type="sid">sidamo</language>
+ <language type="sio">lingue sioux</language>
+ <language type="sit">sino-tibetano (altra lingua)</language>
+ <language type="sk">slovacco</language>
+ <language type="sl">sloveno</language>
+ <language type="sla">slavo (altra lingua)</language>
+ <language type="sm">samoano</language>
+ <language type="sma">sami del sud</language>
+ <language type="smi">lingue sami (altra lingua)</language>
+ <language type="smj">sami lule</language>
+ <language type="smn">sami inari</language>
+ <language type="sms">sami skolt</language>
+ <language type="sn">shona</language>
+ <language type="snk">soninke</language>
+ <language type="so">somalo</language>
+ <language type="sog">sogdiano</language>
+ <language type="son">songhai</language>
+ <language type="sq">albanese</language>
+ <language type="sr">serbo</language>
+ <language type="srr">serer</language>
+ <language type="ss">swati</language>
+ <language type="ssa">nilo-sahariana (altra lingua)</language>
+ <language type="st">sotho del sud</language>
+ <language type="su">sundanese</language>
+ <language type="suk">sukuma</language>
+ <language type="sus">susu</language>
+ <language type="sux">sumero</language>
+ <language type="sv">svedese</language>
+ <language type="sw">swahili</language>
+ <language type="syr">siriaco</language>
+ <language type="ta">tamil</language>
+ <language type="tai">tailandese (altra lingua)</language>
+ <language type="te">telugu</language>
+ <language type="tem">temne</language>
+ <language type="ter">tereno</language>
+ <language type="tet">tetum</language>
+ <language type="tg">tagicco</language>
+ <language type="th">thai</language>
+ <language type="ti">tigrinya</language>
+ <language type="tig">tigre</language>
+ <language type="tk">turcomanno</language>
+ <language type="tkl">tokelau</language>
+ <language type="tl">tagalog</language>
+ <language type="tlh" references="RP2">klingon</language>
+ <language type="tli">tlingit</language>
+ <language type="tmh">tamashek</language>
+ <language type="tn">tswana</language>
+ <language type="to">tonga (Isole Tonga)</language>
+ <language type="tog">tonga (nyasa)</language>
+ <language type="tpi">tok pisin</language>
+ <language type="tr">turco</language>
+ <language type="ts">tsonga</language>
+ <language type="tsi">tsimshian</language>
+ <language type="tt">tatarico</language>
+ <language type="tum">tumbuka</language>
+ <language type="tup">lingue tupi</language>
+ <language type="tut" references="RP2">altaica (altra lingua)</language>
+ <language type="tvl">tuvalu</language>
+ <language type="tw">ci</language>
+ <language type="ty">taitiano</language>
+ <language type="tyv">tuvinian</language>
+ <language type="udm">udmurt</language>
+ <language type="ug">uigurico</language>
+ <language type="uga">ugaritico</language>
+ <language type="uk">ucraino</language>
+ <language type="umb">mbundu</language>
+ <language type="und">lingua imprecisata</language>
+ <language type="ur">urdu</language>
+ <language type="uz">usbeco</language>
+ <language type="ve">venda</language>
+ <language type="vi">vietnamita</language>
+ <language type="vo" references="RP2">volapük</language>
+ <language type="vot">voto</language>
+ <language type="wa">vallone</language>
+ <language type="wak">lingue wakash</language>
+ <language type="wal">walamo</language>
+ <language type="war">waray</language>
+ <language type="was">washo</language>
+ <language type="wen">sorabo</language>
+ <language type="wo">volof</language>
+ <language type="xal">kalmyk</language>
+ <language type="xh">xosa</language>
+ <language type="yao">yao (bantu)</language>
+ <language type="yap">yapese</language>
+ <language type="yi">yiddish</language>
+ <language type="yo">yoruba</language>
+ <language type="ypk">lingue yupik</language>
+ <language type="za">zhuang</language>
+ <language type="zap">zapotec</language>
+ <language type="zen">zenaga</language>
+ <language type="zh">cinese</language>
+ <language type="znd">zande</language>
+ <language type="zu">zulu</language>
+ <language type="zun">zuni</language>
+ </languages>
+ <scripts>
+ <script type="Arab">arabo</script>
+ <script type="Armn">armeno</script>
+ <script type="Bali">balinese</script>
+ <script type="Batk">batak</script>
+ <script type="Beng">bengali</script>
+ <script type="Blis">simboli bliss</script>
+ <script type="Bopo">bopomofo</script>
+ <script type="Brah">brahmi</script>
+ <script type="Brai">braille</script>
+ <script type="Bugi">buginese</script>
+ <script type="Buhd">buhid</script>
+ <script type="Cans">simboli aborigeni canadesi unificati</script>
+ <script type="Cham">cham</script>
+ <script type="Cher">cherokee</script>
+ <script type="Cirt">cirth</script>
+ <script type="Copt">copto</script>
+ <script type="Cprt">cipriota</script>
+ <script type="Cyrl">cirillico</script>
+ <script type="Cyrs" references="RP4">cirillico (variante antica chiesa slavonica)</script>
+ <script type="Deva">devanagari</script>
+ <script type="Dsrt">deseret</script>
+ <script type="Egyd">egiziano demotico</script>
+ <script type="Egyh">ieratico egiziano</script>
+ <script type="Egyp">geroglifici egiziani</script>
+ <script type="Ethi">etiope</script>
+ <script type="Geok">kutsuri</script>
+ <script type="Geor">georgiano</script>
+ <script type="Glag" references="RP2">glagolitico</script>
+ <script type="Goth">gotico</script>
+ <script type="Grek">greco</script>
+ <script type="Gujr">gujarati</script>
+ <script type="Guru">gurmukhi</script>
+ <script type="Hang">hangul</script>
+ <script type="Hani">han</script>
+ <script type="Hano">hanunoo</script>
+ <script type="Hans">han semplificato</script>
+ <script type="Hant">han tradizionale</script>
+ <script type="Hebr">ebraico</script>
+ <script type="Hira">hiragana</script>
+ <script type="Hmng">pahawn hmong</script>
+ <script type="Hrkt">katanaka o hiragana</script>
+ <script type="Hung">antico ungherese</script>
+ <script type="Inds">indu</script>
+ <script type="Ital">italico antico</script>
+ <script type="Java">javanese</script>
+ <script type="Kana">katakana</script>
+ <script type="Khmr">khmer</script>
+ <script type="Knda">kannada</script>
+ <script type="Laoo">lao</script>
+ <script type="Latf">latino (variante fraktur)</script>
+ <script type="Latg">latino (variante gaelica)</script>
+ <script type="Latn">latino</script>
+ <script type="Limb">limbu</script>
+ <script type="Lina">lineare A</script>
+ <script type="Linb">lineare B</script>
+ <script type="Mlym">malayalam</script>
+ <script type="Mong">mongolo</script>
+ <script type="Mymr">myanmar</script>
+ <script type="Ogam">ogham</script>
+ <script type="Orya">oriya</script>
+ <script type="Osma">osmanya</script>
+ <script type="Qaai">ereditato</script>
+ <script type="Runr">runico</script>
+ <script type="Shaw">shaviano</script>
+ <script type="Sinh">singalese</script>
+ <script type="Syrc">siriano</script>
+ <script type="Tagb">tagbanwa</script>
+ <script type="Tale">tai le</script>
+ <script type="Taml">tamil</script>
+ <script type="Telu">telugu</script>
+ <script type="Tglg">tagalog</script>
+ <script type="Thaa">thaana</script>
+ <script type="Thai">tailandese</script>
+ <script type="Tibt">tibetano</script>
+ <script type="Ugar">ugarita</script>
+ <script type="Yiii">yi</script>
+ <script type="Zyyy">comune</script>
+ </scripts>
+ <territories>
+ <territory type="001" references="RP4">Mondo</territory>
+ <territory type="002" references="RP4">Africa</territory>
+ <territory type="005" references="RP4">America del Sud</territory>
+ <territory type="009" references="RP4">Oceania</territory>
+ <territory type="011" references="RP4">Africa occidentale</territory>
+ <territory type="013" references="RP4">America centrale</territory>
+ <territory type="014" references="RP4">Africa orientale</territory>
+ <territory type="015" references="RP4">Africa del Nord</territory>
+ <territory type="017" references="RP4">Africa centrale</territory>
+ <territory type="018" references="RP4">Africa del Sud</territory>
+ <territory type="019" references="RP4">Americhe</territory>
+ <territory type="021" references="RP4">America del Nord</territory>
+ <territory type="029" references="RP4">Caraibi</territory>
+ <territory type="030">Asia orientale</territory>
+ <territory type="034" references="RP4">Asia del Sud</territory>
+ <territory type="035" references="RP4">Asia sudorientale</territory>
+ <territory type="039" references="RP4">Europa del Sud</territory>
+ <territory type="053" references="RP4">Australia e Nuova Zelanda</territory>
+ <territory type="054" references="RP4">Melanesia</territory>
+ <territory type="057" references="RP4">Regione Micronesiana</territory>
+ <territory type="061" references="RP4">Polinesia</territory>
+ <territory type="142" references="RP4">Asia</territory>
+ <territory type="143" references="RP4">Asia centrale</territory>
+ <territory type="145" references="RP4">Asia occidentale</territory>
+ <territory type="150" references="RP4">Europa</territory>
+ <territory type="151" references="RP4">Europa orientale</territory>
+ <territory type="154" references="RP4">Europa del Nord</territory>
+ <territory type="155" references="RP4">Europa occidentale</territory>
+ <territory type="172" references="RP4">Comunità di Stati Indipendenti</territory>
+ <territory type="419" references="RP4">America Latina e Caraibi</territory>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Emirati Arabi Uniti</territory>
+ <territory type="AF">Afghanistan</territory>
+ <territory type="AG">Antigua e Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albania</territory>
+ <territory type="AM">Armenia</territory>
+ <territory type="AN">Antille Olandesi</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antartide</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">Samoa Americane</territory>
+ <territory type="AT">Austria</territory>
+ <territory type="AU">Australia</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AZ">Azerbaigian</territory>
+ <territory type="BA">Bosnia Erzegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BE">Belgio</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgaria</territory>
+ <territory type="BH">Bahrein</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei</territory>
+ <territory type="BO">Bolivia</territory>
+ <territory type="BR">Brasile</territory>
+ <territory type="BS">Bahamas</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BV">Isola Bouvet</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Bielorussia</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Canada</territory>
+ <territory type="CC">Isole Cocos (Keeling)</territory>
+ <territory type="CD">Repubblica Democratica del Congo</territory>
+ <territory type="CF">Repubblica Centrafricana</territory>
+ <territory type="CG">Congo</territory>
+ <territory type="CH">Svizzera</territory>
+ <territory type="CI">Costa d’Avorio</territory>
+ <territory type="CK">Isole Cook</territory>
+ <territory type="CL">Cile</territory>
+ <territory type="CM">Camerun</territory>
+ <territory type="CN">Cina</territory>
+ <territory type="CO">Colombia</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS">Serbia e Montenegro</territory>
+ <territory type="CU">Cuba</territory>
+ <territory type="CV">Capo Verde</territory>
+ <territory type="CX">Isola di Christmas</territory>
+ <territory type="CY">Cipro</territory>
+ <territory type="CZ">Repubblica Ceca</territory>
+ <territory type="DE">Germania</territory>
+ <territory type="DJ">Gibuti</territory>
+ <territory type="DK">Danimarca</territory>
+ <territory type="DM">Dominica</territory>
+ <territory type="DO">Repubblica Dominicana</territory>
+ <territory type="DZ">Algeria</territory>
+ <territory type="EC">Ecuador</territory>
+ <territory type="EE">Estonia</territory>
+ <territory type="EG">Egitto</territory>
+ <territory type="EH">Sahara Occidentale</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Spagna</territory>
+ <territory type="ET">Etiopia</territory>
+ <territory type="FI">Finlandia</territory>
+ <territory type="FJ">Figi</territory>
+ <territory type="FK">Isole Falkland</territory>
+ <territory type="FM">Micronesia</territory>
+ <territory type="FO">Isole Faroe</territory>
+ <territory type="FR">Francia</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Regno Unito</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Georgia</territory>
+ <territory type="GF">Guiana Francese</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibilterra</territory>
+ <territory type="GL">Groenlandia</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadalupa</territory>
+ <territory type="GQ">Guinea Equatoriale</territory>
+ <territory type="GR">Grecia</territory>
+ <territory type="GS">Georgia del Sud e Isole Sandwich del Sud</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinea-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Regione Amministrativa Speciale di Hong Kong, Cina</territory>
+ <territory type="HM">Isole Heard ed Isole McDonald</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Croazia</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Ungheria</territory>
+ <territory type="ID">Indonesia</territory>
+ <territory type="IE">Irlanda</territory>
+ <territory type="IL">Israele</territory>
+ <territory type="IN">India</territory>
+ <territory type="IO">Territorio Britannico dell’Oceano Indiano</territory>
+ <territory type="IQ">Iraq</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Islanda</territory>
+ <territory type="IT">Italia</territory>
+ <territory type="JM">Giamaica</territory>
+ <territory type="JO">Giordania</territory>
+ <territory type="JP">Giappone</territory>
+ <territory type="KE">Kenya</territory>
+ <territory type="KG">Kirghizistan</territory>
+ <territory type="KH">Cambogia</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Comore</territory>
+ <territory type="KN">Saint Kitts e Nevis</territory>
+ <territory type="KP">Corea del Nord</territory>
+ <territory type="KR">Corea del Sud</territory>
+ <territory type="KW">Kuwait</territory>
+ <territory type="KY">Isole Cayman</territory>
+ <territory type="KZ">Kazakistan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Libano</territory>
+ <territory type="LC">Saint Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberia</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Lituania</territory>
+ <territory type="LU">Lussemburgo</territory>
+ <territory type="LV">Lettonia</territory>
+ <territory type="LY">Libia</territory>
+ <territory type="MA">Marocco</territory>
+ <territory type="MC">Monaco</territory>
+ <territory type="MD">Moldavia</territory>
+ <territory type="MG">Madagascar</territory>
+ <territory type="MH">Isole Marshall</territory>
+ <territory type="MK">Macedonia, Repubblica</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongolia</territory>
+ <territory type="MO">Regione Amministrativa Speciale di Macao, Cina</territory>
+ <territory type="MP">Isole Marianne Settentrionali</territory>
+ <territory type="MQ">Martinica</territory>
+ <territory type="MR">Mauritania</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Maldive</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Messico</territory>
+ <territory type="MY">Malesia</territory>
+ <territory type="MZ">Mozambico</territory>
+ <territory type="NA">Namibia</territory>
+ <territory type="NC">Nuova Caledonia</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Isola Norfolk</territory>
+ <territory type="NG">Nigeria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Paesi Bassi</territory>
+ <territory type="NO">Norvegia</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Nuova Zelanda</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Perù</territory>
+ <territory type="PF">Polinesia Francese</territory>
+ <territory type="PG">Papua Nuova Guinea</territory>
+ <territory type="PH">Filippine</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Polonia</territory>
+ <territory type="PM">Saint Pierre e Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Portorico</territory>
+ <territory type="PS">Palestina</territory>
+ <territory type="PT">Portogallo</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Qatar</territory>
+ <territory type="QO" references="RP2">Oceania lontana</territory>
+ <territory type="RE">Réunion</territory>
+ <territory type="RO">Romania</territory>
+ <territory type="RU">Federazione Russa</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SA">Arabia Saudita</territory>
+ <territory type="SB">Isole Solomon</territory>
+ <territory type="SC">Seychelles</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Svezia</territory>
+ <territory type="SG">Singapore</territory>
+ <territory type="SH">Sant’Elena</territory>
+ <territory type="SI">Slovenia</territory>
+ <territory type="SJ">Svalbard e Jan Mayen</territory>
+ <territory type="SK">Slovacchia</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalia</territory>
+ <territory type="SR">Suriname</territory>
+ <territory type="ST">Sao Tomé e Príncipe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Siria</territory>
+ <territory type="SZ">Swaziland</territory>
+ <territory type="TC">Isole Turks e Caicos</territory>
+ <territory type="TD">Ciad</territory>
+ <territory type="TF">Territori australi francesi</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Tailandia</territory>
+ <territory type="TJ">Tagikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Timor Est</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunisia</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turchia</territory>
+ <territory type="TT">Trinidad e Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TZ">Tanzania</territory>
+ <territory type="UA">Ucraina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">Isole Minori lontane dagli Stati Uniti</territory>
+ <territory type="US">Stati Uniti</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Uzbekistan</territory>
+ <territory type="VA">Vaticano</territory>
+ <territory type="VC">Saint Vincent e Grenadines</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Isole Vergini Britanniche</territory>
+ <territory type="VI">Isole Vergini Americane</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis e Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Yemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Sudafrica</territory>
+ <territory type="ZM">Zambia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ <variants>
+ <variant type="1901">ortografia tradizionale tedesca</variant>
+ <variant type="1996">ortografia tedesca del 1996</variant>
+ <variant type="NEDIS">dialetto del Natisone</variant>
+ <variant type="POLYTONI">politonico</variant>
+ <variant type="REVISED">ortografia revisionata</variant>
+ <variant type="ROZAJ">resiano</variant>
+ <variant type="SAAHO">saho</variant>
+ </variants>
+ <keys>
+ <key type="calendar">Calendario</key>
+ <key type="collation">Collazione</key>
+ <key type="currency">Valuta</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">Cinese Tradizionale</type>
+ <type type="buddhist" key="calendar">Calendario Buddista</type>
+ <type type="chinese" key="calendar">Calendario Cinese</type>
+ <type type="direct" key="collation">Ordine Diretto</type>
+ <type type="gb2312han" key="collation">Cinese Semplificato</type>
+ <type type="gregorian" key="calendar">Calendario Gregoriano</type>
+ <type type="hebrew" key="calendar">Calendario Ebraico</type>
+ <type type="islamic" key="calendar">Calendario Islamico</type>
+ <type type="islamic-civil" key="calendar">Calendario Civile Islamico</type>
+ <type type="japanese" key="calendar">Calendario Giapponese</type>
+ <type type="phonebook" key="collation">Ordine Elenco Telefonico</type>
+ <type type="pinyin" key="collation">Ordine Pinyin</type>
+ <type type="stroke" key="collation">Ordine Segni</type>
+ <type type="traditional" key="collation">Ordine Tradizionale</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US">USA</measurementSystemName>
+ <measurementSystemName type="metric">Metrico</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a à b-e é è f-i ì j-o ó ò p-u ù v-z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[í ï ú]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>‘</quotationStart>
+ <quotationEnd>’</quotationEnd>
+ <alternateQuotationStart>“</alternateQuotationStart>
+ <alternateQuotationEnd>â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">gen</month>
+ <month type="2">feb</month>
+ <month type="3">mar</month>
+ <month type="4">apr</month>
+ <month type="5">mag</month>
+ <month type="6">giu</month>
+ <month type="7">lug</month>
+ <month type="8">ago</month>
+ <month type="9">set</month>
+ <month type="10">ott</month>
+ <month type="11">nov</month>
+ <month type="12">dic</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">gennaio</month>
+ <month type="2">febbraio</month>
+ <month type="3">marzo</month>
+ <month type="4">aprile</month>
+ <month type="5">maggio</month>
+ <month type="6">giugno</month>
+ <month type="7">luglio</month>
+ <month type="8">agosto</month>
+ <month type="9">settembre</month>
+ <month type="10">ottobre</month>
+ <month type="11">novembre</month>
+ <month type="12">dicembre</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">G</month>
+ <month type="2">F</month>
+ <month type="3">M</month>
+ <month type="4">A</month>
+ <month type="5">M</month>
+ <month type="6">G</month>
+ <month type="7">L</month>
+ <month type="8">A</month>
+ <month type="9">S</month>
+ <month type="10">O</month>
+ <month type="11">N</month>
+ <month type="12">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">dom</day>
+ <day type="mon">lun</day>
+ <day type="tue">mar</day>
+ <day type="wed">mer</day>
+ <day type="thu">gio</day>
+ <day type="fri">ven</day>
+ <day type="sat">sab</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">domenica</day>
+ <day type="mon">lunedì</day>
+ <day type="tue">martedì</day>
+ <day type="wed">mercoledì</day>
+ <day type="thu">giovedì</day>
+ <day type="fri">venerdì</day>
+ <day type="sat">sabato</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">D</day>
+ <day type="mon">L</day>
+ <day type="tue">M</day>
+ <day type="wed">M</day>
+ <day type="thu">G</day>
+ <day type="fri">V</day>
+ <day type="sat">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">T1</quarter>
+ <quarter type="2">T2</quarter>
+ <quarter type="3">T3</quarter>
+ <quarter type="4">T4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1o trimestre</quarter>
+ <quarter type="2">2o trimestre</quarter>
+ <quarter type="3">3o trimestre</quarter>
+ <quarter type="4">4o trimestre</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>m.</am>
+ <pm>p.</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">aC</era>
+ <era type="1">dC</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MMM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH.mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH.mm.ss</dateFormatItem>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh.mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh.mm.ss a</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="provisional">QQQQ yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName>era</displayName>
+ </field>
+ <field type="year">
+ <displayName>anno</displayName>
+ </field>
+ <field type="month">
+ <displayName>mese</displayName>
+ </field>
+ <field type="week">
+ <displayName>settimana</displayName>
+ </field>
+ <field type="day">
+ <displayName>giorno</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>giorno della settimana</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName>periodo del giorno</displayName>
+ </field>
+ <field type="hour">
+ <displayName>ora</displayName>
+ </field>
+ <field type="minute">
+ <displayName>minuto</displayName>
+ </field>
+ <field type="second">
+ <displayName>secondo</displayName>
+ </field>
+ <field type="zone">
+ <displayName>zona</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Africa/Timbuktu">
+ <exemplarCity>Timbuctu</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Polo Sud</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity>Cordova</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>San Paolo</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <exemplarCity>St. Johns</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>Pasqua</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <standard>Ora Standard Cina</standard>
+ <daylight>Ora Standard Cina</daylight>
+ </long>
+ <short>
+ <standard>CTT</standard>
+ <daylight>CDT</daylight>
+ </short>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>Canarie</exemplarCity>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <standard>Ora Standard Europa Centrale</standard>
+ <daylight>Ora Legale Europa Centrale</daylight>
+ </long>
+ <short>
+ <standard>CET</standard>
+ <daylight>CEDT</daylight>
+ </short>
+ <exemplarCity>Parigi</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>Londra</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity>Giacarta</exemplarCity>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <standard>Ora Standard Israele</standard>
+ <daylight>Ora Legale Israele</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IDT</daylight>
+ </short>
+ <exemplarCity>Gerusalemme</exemplarCity>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <standard>Ora Standard Giappone</standard>
+ <daylight>Ora Standard Giappone</daylight>
+ </long>
+ <short>
+ <standard>JST</standard>
+ <daylight>JST</daylight>
+ </short>
+ <exemplarCity>Tokyo</exemplarCity>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <exemplarCity>Casablanca</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>Città del Messico</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>Azzorre</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lisbona</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>Ora Standard Europa Orientale</standard>
+ <daylight>Ora Legale Europa Orientale</daylight>
+ </long>
+ <short>
+ <standard>EET</standard>
+ <daylight>EEDT</daylight>
+ </short>
+ <exemplarCity>Bucarest</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Mosca</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <standard>Ora Standard Hawaii</standard>
+ <daylight>Ora Standard Hawaii</daylight>
+ </long>
+ <short>
+ <standard>HST</standard>
+ <daylight>HST</daylight>
+ </short>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <standard>Ora Standard Alaska</standard>
+ <daylight>Ora Legale Alaska</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity>Samarcanda</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Peseta Andorrana</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>Dirham degli Emirati Arabi Uniti</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>Afgani (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>Afgani</displayName>
+ <symbol>Af</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>Lek Albanese</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>Dram Armeno</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>Fiorino delle Antille Olandesi</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName>Kwanza Angolano</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Kwanza Angolano (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>Nuovo Kwanza Angolano (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>Kwanza Reajustado Angolano (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>Austral Argentino</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Peso Argentino (vecchio Cod.)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Peso Argentino</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName>Scellino Austriaco</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>Dollaro Australiano</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName>Fiorino di Aruba</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>Manat Azero</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>Dinar Bosnia-Herzegovina</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>Marco Conv. Bosnia-Erzegovina</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>Dollaro di Barbados</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>Taka Bangladese</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>Franco Belga (convertibile)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Franco Belga</displayName>
+ </currency>
+ <currency type="BEL">
+ <displayName>Franco Belga (finanziario)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>Lev Bulgaro</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName>Nuovo Lev Bulgaro</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BHD">
+ <displayName>Dinaro del Bahraini</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>Franco del Burundi</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>Dollaro delle Bermuda</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>Dollaro del Brunei</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>Boliviano</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>Peso Boliviano</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Mvdol Boliviano</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>Cruzeiro Novo Brasiliano (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>Cruzado Brasiliano</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>Cruzeiro Brasiliano (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Real Brasiliano</displayName>
+ </currency>
+ <currency type="BRN">
+ <displayName>Cruzado Novo Brasiliano</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>Cruzeiro Brasiliano</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>Dollaro delle Bahamas</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>Ngultrum Butanese</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>Kyat Birmano</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>Pula del Botswana</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>Nuovo Rublo Bielorussia (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>Rublo Bielorussia</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>Dollaro Belize</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>Dollaro Canadese</displayName>
+ </currency>
+ <currency type="CDF">
+ <displayName>Franco Congolese</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Franco Svizzero</displayName>
+ <symbol>SFr.</symbol>
+ </currency>
+ <currency type="CLF">
+ <displayName>Unidades de Fomento Chilene</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Peso Cileno</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>Renmimbi Cinese</displayName>
+ </currency>
+ <currency type="COP">
+ <displayName>Peso Colombiano</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="CRC">
+ <displayName>Colón Costaricano</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSD">
+ <displayName>Dinaro serbo</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>Corona forte cecoslovacca</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Peso Cubano</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Escudo del Capo Verde</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>Sterlina Cipriota</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName>Corona Ceca</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>Ostmark della Germania Orientale</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Marco Tedesco</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Franco Gibutiano</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>Corona Danese</displayName>
+ </currency>
+ <currency type="DOP">
+ <displayName>Peso Dominicano</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>Dinaro Algerino</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>Sucre dell’Ecuador</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>Unidad de Valor Constante (UVC) dell’Ecuador</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>Corona dell’Estonia</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>Sterlina Egiziana</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Nakfa Eritreo</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Peseta Spagnola</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>Birr Etiopico</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>Markka Finlandese</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Dollaro delle Figi</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>Sterlina delle Falkland</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Franco Francese</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Sterlina Inglese</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>Kupon Larit Georgiano</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>Lari Georgiano</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>Cedi del Ghana</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>Sterlina di Gibilterra</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>Dalasi del Gambia</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Franco della Guinea</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>Syli della Guinea</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Ekwele della Guinea Equatoriale</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Dracma Greca</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Quetzal Guatemalteco</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>Escudo della Guinea portoghese</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Peso della Guinea-Bissau</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>Dollaro della Guyana</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>Dollaro di Hong Kong</displayName>
+ </currency>
+ <currency type="HNL">
+ <displayName>Lempira Hoduregno</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>Dinaro Croato</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Kuna Croata</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>Gourde Haitiano</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Fiorino Ungherese</displayName>
+ </currency>
+ <currency type="IDR">
+ <displayName>Rupia Indonesiana</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>Lira Irlandese</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>Sterlina Israeliana</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Nuovo sheqel israeliano</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Rupia Indiana</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>Dinaro Iracheno</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>Rial Iraniano</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>Corona Islandese</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>Lira Italiana</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>Dollaro Giamaicano</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>Dinaro Giordano</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>Yen Giapponese</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>Scellino Keniota</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>Som Kirghiso</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>Riel Cambogiano</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>Franco Comoriano</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>Won Nordcoreano</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Won Sudcoreano</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>Dinaro Kuwaitiano</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>Dollaro delle Isole Cayman</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Tenge Kazaco</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>Kip Laotiano</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>Sterlina Libanese</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>Rupia di Sri Lanka</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>Dollaro Liberiano</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Loti del Lesotho</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LTL">
+ <displayName>Lita Lituana</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Talonas Lituani</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Franco del Lussemburgo</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Lat Lettone</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>Rublo Lettone</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>Dinaro Libico</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>Dirham Marocchino</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>Franco Marocchino</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>Leu Moldavo</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>Ariary Malgascio</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Franco Malgascio</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>Dinaro Macedone</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>Franco di Mali</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Kyat di Myanmar</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>Tugrik Mongolo</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Pataca di Macao</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Ouguiya della Mauritania</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>Lira Maltese</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>Sterlina Maltese</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>Rupia Mauriziana</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>Rufiyaa delle Maldive</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Kwacha Malawiano</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>Peso Messicano</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>Peso messicano d’argento (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>Unidad de Inversion (UDI) Messicana</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Ringgit della Malesia</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>Escudo del Mozambico</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Metical del Mozambico</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>Dollaro Namibiano</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>Naira Nigeriana</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>Cordoba Nicaraguense</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>Córdoba oro nicaraguense</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Fiorino Olandese</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Corona Norvegese</displayName>
+ </currency>
+ <currency type="NPR">
+ <displayName>Rupia Nepalese</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>Dollaro Neozelandese</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>Rial Omanita</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>Balboa di Panama</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>Inti Peruviano</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>Sol Nuevo Peruviano</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>Sol Peruviano</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Kina della Papua Nuova Guinea</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>Peso delle Filippine</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>Rupia del Pakistan</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>Zloty Polacco</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Zloty Polacco (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Escudo Portoghese</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>Guarani del Paraguay</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>Rial del Qatar</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="ROL">
+ <displayName>Leu della Romania</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>Rublo Russo</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Rublo della CSI</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>Franco Ruandese</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>Ryal Saudita</displayName>
+ </currency>
+ <currency type="SBD">
+ <displayName>Dollaro delle Isole Solomon</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>Rupia delle Seychelles</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>Dinaro Sudanese</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>Sterlina Sudanese</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>Corona Svedese</displayName>
+ </currency>
+ <currency type="SGD">
+ <displayName>Dollaro di Singapore</displayName>
+ </currency>
+ <currency type="SHP">
+ <displayName>Sterlina di Sant’Elena</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Tallero Sloveno</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Corona Slovacca</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>Leone della Sierra Leone</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>Scellino Somalo</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRG">
+ <displayName>Fiorino del Suriname</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>Dobra di Sao Tomé e Principe</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>Rublo Sovietico</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>Colón Salvadoregno</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>Sterlina Siriana</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>Lilangeni dello Swaziland</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>Baht Tailandese</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>Rublo del Tajikistan</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Somoni del Tajikistan</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Manat Turkmeno</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>Dinaro Tunisino</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>Paʻanga di Tonga</displayName>
+ <symbol>T$</symbol>
+ </currency>
+ <currency type="TPE">
+ <displayName>Escudo di Timor</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Lira Turca</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Dollaro di Trinidad e Tobago</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>Nuovo dollaro taiwanese</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>Scellino della Tanzania</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>Hrivna Ucraina</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Karbovanetz Ucraino</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Scellino Ugandese (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Scellino Ugandese</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>Dollaro Statunitense</displayName>
+ </currency>
+ <currency type="USN">
+ <displayName>Dollaro Statunitense (Next day)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>Dollaro Statunitense (Same day)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>Peso Uruguaiano (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>Peso Uruguayo uruguaiano</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>Sum dell’Uzbekistan</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Bolivar Venezuelano</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>Dong Vietnamita</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>Vatu di Vanuatu</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>Tala della Samoa Occidentale</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>Franco CFA BEAC</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>Oro</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>Unità composita europea</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>Unità monetaria europea</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>Unità di acconto europea (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>Unità di acconto europea (XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>Dollaro dei Caraibi Orientali</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>Diritti Speciali di Incasso</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>Unità Monetaria Europea</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>Franco Oro Francese</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>Franco UIC Francese</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>Franco CFA BCEAO</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>Franco CFP</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="XXX">
+ <displayName>Nessuna valuta</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>Dinaro dello Yemen</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Rial dello Yemen</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>Dinaro Forte Yugoslavo</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>Dinaro Noviy Yugoslavo</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>Dinaro Convertibile Yugoslavo</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>Rand Sudafricano (finanziario)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Rand Sudafricano</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Kwacha dello Zambia</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Nuovo Zaire dello Zaire</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Zaire dello Zaire</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Dollaro dello Zimbabwe</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>sì:si:s</yesstr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1" uri="http://www.intercultura.it/">RF1</reference>
+ <reference type="RP2" uri="http://it.wikipedia.org/wiki/Pagina_principale">Wikipedia</reference>
+ <reference type="RP3" uri="http://www.portalingua.info/it/recherche/recherche_avancee/1/index.php">Portalingua</reference>
+ <reference type="RP4" uri="WWW.google.com">Google results</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/it_CH.xml b/libs/Zend/Locale/Data/it_CH.xml
new file mode 100755
index 0000000000..c6cf3a6d38
--- /dev/null
+++ b/libs/Zend/Locale/Data/it_CH.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="it"/>
+ <territory type="CH"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd.MM.yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH.mm:ss' h' z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd.MM</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM.yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>.</decimal>
+ <group>'</group>
+ </symbols>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##0.00;¤-#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/it_IT.xml b/libs/Zend/Locale/Data/it_IT.xml
new file mode 100755
index 0000000000..1db1f7b365
--- /dev/null
+++ b/libs/Zend/Locale/Data/it_IT.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="it"/>
+ <territory type="IT"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <timeFormats>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ITL">
+ <pattern>¤ #,##0;-¤ #,##0</pattern>
+ <decimal>,</decimal>
+ <group>.</group>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/iu.xml b/libs/Zend/Locale/Data/iu.xml
new file mode 100755
index 0000000000..899b422a23
--- /dev/null
+++ b/libs/Zend/Locale/Data/iu.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.25 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="iu"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="iu" draft="unconfirmed">áƒá“„ᒃᑎá‘ᑦ á‘Žá‘Žá•‹á…ᓯᖅ</language>
+ </languages>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[áƒ-ᆠአዠá±-ᴠḠṠᑉ á‘Ž-á‘‘ á‘• á‘– ᑦ á‘­-á‘° ᑲ ᑳ á’ƒ á’‹-á’Ž á’ á’‘ á’¡ á’¥-á’¨ á’ª á’« á’» á“‚-á“… ᓇ ᓈ á“ á“•-ᓘ á“š á“› ᓪ ᓯ-ᓲ á“´ ᓵ á”… ᔨ-ᔫ á”­ á”® ᔾ ᕆ-ᕉ á•‹ á•Œ á• á••-á•š á• á•¿-á–ƒ á–… á– á–‘-á–• á™±-ᙶ á–– á– -á–¦]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">á”­á“á“„áŠá“•</month>
+ <month type="2" draft="unconfirmed">á••á•á•—áŠá“•</month>
+ <month type="3" draft="unconfirmed">ᒫᑦᓯ</month>
+ <month type="4" draft="unconfirmed">áŠáƒá‘‰á³á“—</month>
+ <month type="5" draft="unconfirmed">á’ªáƒ</month>
+ <month type="6" draft="unconfirmed">ᔫᓂ</month>
+ <month type="7" draft="unconfirmed">ᔪᓚáƒ</month>
+ <month type="8" draft="unconfirmed">áŠá…á’¡á’ᓯ</month>
+ <month type="9" draft="unconfirmed">ᓰᑦá‘á•á•™</month>
+ <month type="10" draft="unconfirmed">á†á‘¦á‘‘á•á•™</month>
+ <month type="11" draft="unconfirmed">á“…á•™áƒá•á•™</month>
+ <month type="12" draft="unconfirmed">á‘á“°á•á•™</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">á”­á“á“„áŠá“•</month>
+ <month type="2" draft="unconfirmed">á••á•á•—áŠá“•</month>
+ <month type="3" draft="unconfirmed">ᒫᑦᓯ</month>
+ <month type="4" draft="unconfirmed">áŠáƒá‘‰á³á“—</month>
+ <month type="5" draft="unconfirmed">á’ªáƒ</month>
+ <month type="6" draft="unconfirmed">ᔫᓂ</month>
+ <month type="7" draft="unconfirmed">ᔪᓚáƒ</month>
+ <month type="8" draft="unconfirmed">áŠá…á’¡á’ᓯ</month>
+ <month type="9" draft="unconfirmed">ᓰᑦá‘á•á•™</month>
+ <month type="10" draft="unconfirmed">á†á‘¦á‘‘á•á•™</month>
+ <month type="11" draft="unconfirmed">á“…á•™áƒá•á•™</month>
+ <month type="12" draft="unconfirmed">á‘á“°á•á•™</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">ᓈᑦᓰᖑᔭ</day>
+ <day type="mon" draft="unconfirmed">ᓇᒡá’ᔾᔭá…</day>
+ <day type="tue" draft="unconfirmed">ᓇᒡá’ᔾᔭá…á“•á–…á‘­</day>
+ <day type="wed" draft="unconfirmed">á±á–“ᑦᓯᖅ</day>
+ <day type="thu" draft="unconfirmed">ᓯᑕᒻᒥᖅ</day>
+ <day type="fri" draft="unconfirmed">ᑕᓪᓕá•á’¥á–…</day>
+ <day type="sat" draft="unconfirmed">ᓈᑦᓰᖑᔭᓕᖅᕿ</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">ᓈᑦᓰᖑᔭ</day>
+ <day type="mon" draft="unconfirmed">ᓇᒡá’ᔾᔭá…</day>
+ <day type="tue" draft="unconfirmed">ᓇᒡá’ᔾᔭá…á“•á–…á‘­</day>
+ <day type="wed" draft="unconfirmed">á±á–“ᑦᓯᖅ</day>
+ <day type="thu" draft="unconfirmed">ᓯᑕᒻᒥᖅ</day>
+ <day type="fri" draft="unconfirmed">ᑕᓪᓕá•á’¥á–…</day>
+ <day type="sat" draft="unconfirmed">ᓈᑦᓰᖑᔭᓕᖅᕿ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ja.xml b/libs/Zend/Locale/Data/ja.xml
new file mode 100755
index 0000000000..ae700fec2f
--- /dev/null
+++ b/libs/Zend/Locale/Data/ja.xml
@@ -0,0 +1,2803 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.90 $"/>
+ <generation date="$Date: 2006/10/26 22:46:08 $"/>
+ <language type="ja"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">アファル語</language>
+ <language type="ab">アブãƒã‚ºèªž</language>
+ <language type="ace">ã‚¢ãƒã‚§ãƒ¼èªž</language>
+ <language type="ach">ã‚¢ãƒãƒ§ãƒªèªž</language>
+ <language type="ada">アダングメ語</language>
+ <language type="ady">アディゲ語</language>
+ <language type="ae">アヴェスタ語</language>
+ <language type="af">アフリカーンス語</language>
+ <language type="afa">セム・ãƒãƒ è«¸èªž</language>
+ <language type="afh">アフリヒリ語</language>
+ <language type="ain">アイヌ語</language>
+ <language type="ak">アカン語</language>
+ <language type="akk">アッカド語</language>
+ <language type="ale">アレウト語</language>
+ <language type="alg">アルゴンキアン語æ—</language>
+ <language type="alt">å—アルタイ語</language>
+ <language type="am">アムãƒãƒ©èªž</language>
+ <language type="an">アラゴン語</language>
+ <language type="ang">å¤ä»£è‹±èªž</language>
+ <language type="apa">アパッãƒèªžæ—</language>
+ <language type="ar">アラビア語</language>
+ <language type="arc">アラム語</language>
+ <language type="arn">アラウカン語</language>
+ <language type="arp">アラパホー語</language>
+ <language type="art">人工諸語</language>
+ <language type="arw">アラワク語</language>
+ <language type="as">アッサム語</language>
+ <language type="ast">アストゥリアス語</language>
+ <language type="ath">アサパスカン語æ—</language>
+ <language type="aus">オーストラリア語æ—</language>
+ <language type="av">アヴァル語</language>
+ <language type="awa">アワディー語</language>
+ <language type="ay">アイマラ語</language>
+ <language type="az">アゼルãƒã‚¤ã‚¸ãƒ£ãƒ³èªž</language>
+ <language type="ba">ãƒã‚·ã‚­ãƒ¼ãƒ«èªž</language>
+ <language type="bad">ãƒãƒ³ãƒ€èªž</language>
+ <language type="bai">ãƒãƒŸãƒ¬ã‚±èªžæ—</language>
+ <language type="bal">ãƒãƒ«ãƒ¼ãƒãƒ¼èªž</language>
+ <language type="ban">ãƒãƒªèªž</language>
+ <language type="bas">ãƒã‚µèªž</language>
+ <language type="bat">ãƒãƒ«ãƒˆè«¸èªž</language>
+ <language type="be">ベラルーシ語</language>
+ <language type="bej">ベジャ語</language>
+ <language type="bem">ベンãƒèªž</language>
+ <language type="ber">ベルベル諸語</language>
+ <language type="bg">ブルガリア語</language>
+ <language type="bh">ビãƒãƒ¼ãƒ«èªž</language>
+ <language type="bho">ボージプリー語</language>
+ <language type="bi">ビスラマ語</language>
+ <language type="bik">ビコル語</language>
+ <language type="bin">ビニ語</language>
+ <language type="bla">シクシカ語</language>
+ <language type="bm">ãƒãƒ³ãƒãƒ©èªž</language>
+ <language type="bn">ベンガル語</language>
+ <language type="bnt">ãƒãƒ³ãƒˆã‚¥è«¸èªž</language>
+ <language type="bo">ãƒãƒ™ãƒƒãƒˆèªž</language>
+ <language type="br">ブルトン語</language>
+ <language type="bra">ブラジ語</language>
+ <language type="bs">ボスニア語</language>
+ <language type="btk">ãƒã‚¿ã‚¯èªž</language>
+ <language type="bua">ブリヤート語</language>
+ <language type="bug">ブギ語</language>
+ <language type="byn">ビリン語</language>
+ <language type="ca">カタロニア語</language>
+ <language type="cad">カドー語</language>
+ <language type="cai">中米インディアン諸語</language>
+ <language type="car">カリブ語</language>
+ <language type="cau">コーカサス諸語</language>
+ <language type="ce">ãƒã‚§ãƒã‚§ãƒ³èªž</language>
+ <language type="ceb">セブアノ語</language>
+ <language type="cel">ケルト諸語</language>
+ <language type="ch">ãƒãƒ£ãƒ¢ãƒ­èªž</language>
+ <language type="chb">ãƒãƒ–ãƒãƒ£èªž</language>
+ <language type="chg">ãƒãƒ£ã‚¬ã‚¿ã‚¤èªž</language>
+ <language type="chk">ãƒãƒ¥ãƒ¼ã‚¯èªž</language>
+ <language type="chm">マリ語</language>
+ <language type="chn">ビーãƒãƒ»ãƒ©ãƒ»ãƒžãƒ¼ ç­‰</language>
+ <language type="cho">ãƒãƒ§ã‚¯ãƒˆãƒ¼èªž</language>
+ <language type="chp">ãƒãƒšãƒ¯ã‚¤ã‚¢ãƒ³èªž</language>
+ <language type="chr">ãƒã‚§ãƒ­ã‚­ãƒ¼èªž</language>
+ <language type="chy">シャイアン語</language>
+ <language type="cmc">ãƒãƒ£ãƒ èªžæ—</language>
+ <language type="co">コルシカ語</language>
+ <language type="cop">コプト語</language>
+ <language type="cpe">英語ãŒåŸºç›¤ã®æ··æˆèªžãƒ»æ··åˆèªž</language>
+ <language type="cpf">フランス語ãŒåŸºç›¤ã®æ··æˆèªžãƒ»æ··åˆèªž</language>
+ <language type="cpp">ãƒãƒ«ãƒˆã‚¬ãƒ«èªžãŒåŸºç›¤ã®æ··æˆèªžãƒ»æ··åˆèªž</language>
+ <language type="cr">クリー語</language>
+ <language type="crh">クリミア・タタール語</language>
+ <language type="crp">ãã®ä»–ã®æ··æˆèªžãƒ»æ··åˆèªž</language>
+ <language type="cs">ãƒã‚§ã‚³èªž</language>
+ <language type="csb">カシューブ語</language>
+ <language type="cu">教会スラブ語</language>
+ <language type="cus">クシュ諸語</language>
+ <language type="cv">ãƒãƒ¥ãƒ´ã‚¡ã‚·ãƒ¥èªž</language>
+ <language type="cy">ウェールズ語</language>
+ <language type="da">デンマーク語</language>
+ <language type="dak">ダコタ語</language>
+ <language type="dar">ダルガン語</language>
+ <language type="day">ダヤク語</language>
+ <language type="de">ドイツ語</language>
+ <language type="del">デラウェア語</language>
+ <language type="den">スレイビー語</language>
+ <language type="dgr">ドグリブ語</language>
+ <language type="din">ディンカ語</language>
+ <language type="doi">ドグリ語</language>
+ <language type="dra">ドラヴィダ諸語</language>
+ <language type="dsb">低ソルビア語</language>
+ <language type="dua">ドゥアラ語</language>
+ <language type="dum">中世オランダ語</language>
+ <language type="dv">ディベヒ語</language>
+ <language type="dyu">デゥウラ語</language>
+ <language type="dz">ゾンカ語</language>
+ <language type="ee">エウェ語</language>
+ <language type="efi">エフィック語</language>
+ <language type="egy">å¤ä»£ã‚¨ã‚¸ãƒ—ト語</language>
+ <language type="eka">エカジュク語</language>
+ <language type="el">ギリシャ語</language>
+ <language type="elx">エラム語</language>
+ <language type="en">英語</language>
+ <language type="enm">中世英語</language>
+ <language type="eo">エスペラント語</language>
+ <language type="es">スペイン語</language>
+ <language type="et">エストニア語</language>
+ <language type="eu">ãƒã‚¹ã‚¯èªž</language>
+ <language type="ewo">エウォンド語</language>
+ <language type="fa">ペルシア語</language>
+ <language type="fan">ファング語</language>
+ <language type="fat">ファンティー語</language>
+ <language type="ff">フラニ語</language>
+ <language type="fi">フィンランド語</language>
+ <language type="fil">フィリピノ語</language>
+ <language type="fiu">フィン・ウゴル諸語</language>
+ <language type="fj">フィジー語</language>
+ <language type="fo">フェロー語</language>
+ <language type="fon">フォン語</language>
+ <language type="fr">フランス語</language>
+ <language type="frm">中期フランス語</language>
+ <language type="fro">å¤ãƒ•ãƒ©ãƒ³ã‚¹èªž</language>
+ <language type="fur">フリウリ語</language>
+ <language type="fy">フリジア語</language>
+ <language type="ga">アイルランド語</language>
+ <language type="gaa">ガ語</language>
+ <language type="gay">ガヨ語</language>
+ <language type="gba">ãƒãƒ¤èªž</language>
+ <language type="gd">スコットランド・ゲール語</language>
+ <language type="gem">ゲルマン諸語</language>
+ <language type="gez">ゲエズ語</language>
+ <language type="gil">キリãƒã‚¹èªž</language>
+ <language type="gl">ガリシア語</language>
+ <language type="gmh">中高ドイツ語</language>
+ <language type="gn">グアラニー語</language>
+ <language type="goh">å¤é«˜ãƒ‰ã‚¤ãƒ„語</language>
+ <language type="gon">ゴーンディー語</language>
+ <language type="gor">ゴロンタロ語</language>
+ <language type="got">ゴート語</language>
+ <language type="grb">グレボ語</language>
+ <language type="grc">å¤ä»£ã‚®ãƒªã‚·ãƒ£èªž</language>
+ <language type="gu">グジャラート語</language>
+ <language type="gv">マン島語</language>
+ <language type="gwi">グウィッãƒãƒ³èªž</language>
+ <language type="ha">ãƒã‚¦ã‚µèªž</language>
+ <language type="hai">ãƒã‚¤ãƒ€èªž</language>
+ <language type="haw">ãƒãƒ¯ã‚¤èªž</language>
+ <language type="he">ヘブライ語</language>
+ <language type="hi">ヒンディー語</language>
+ <language type="hil">ヒリガイノン語</language>
+ <language type="him">ヒマãƒãƒ£ãƒ«èªž</language>
+ <language type="hit">ヒッタイト語</language>
+ <language type="hmn">フモン語</language>
+ <language type="ho">ヒリモトゥ語</language>
+ <language type="hr">クロアãƒã‚¢èªž</language>
+ <language type="hsb">上ソルビア語</language>
+ <language type="ht">ãƒã‚¤ãƒèªž</language>
+ <language type="hu">ãƒãƒ³ã‚¬ãƒªãƒ¼èªž</language>
+ <language type="hup">アタパスカ語</language>
+ <language type="hy">アルメニア語</language>
+ <language type="hz">ヘレロ語</language>
+ <language type="ia">インターリングア語</language>
+ <language type="iba">イãƒãƒ³èªž</language>
+ <language type="id">インドãƒã‚·ã‚¢èªž</language>
+ <language type="ie">インターリング語</language>
+ <language type="ig">イボ語</language>
+ <language type="ii">å››å·ã‚¤èªž</language>
+ <language type="ijo">イジョー語</language>
+ <language type="ik">イヌピアック語</language>
+ <language type="ilo">イロカノ語</language>
+ <language type="inc">インド諸語</language>
+ <language type="ine">å°æ¬§è«¸èªž</language>
+ <language type="inh">イングシ語</language>
+ <language type="io">イド語</language>
+ <language type="ira">イラン語</language>
+ <language type="iro">イロコイ語æ—</language>
+ <language type="is">アイスランド語</language>
+ <language type="it">イタリア語</language>
+ <language type="iu">イヌクウティトット語</language>
+ <language type="ja">日本語</language>
+ <language type="jbo" draft="provisional">ロジãƒãƒ³èªž</language>
+ <language type="jpr">ユダヤ・ペルシア語</language>
+ <language type="jrb">ユダヤ・アラビア語</language>
+ <language type="jv">ジャワ語</language>
+ <language type="ka">グルジア語</language>
+ <language type="kaa">カラ・カルパク語</language>
+ <language type="kab">カビル語</language>
+ <language type="kac">ã‚«ãƒãƒ³èªž</language>
+ <language type="kam">カンãƒèªž</language>
+ <language type="kar">カレン語</language>
+ <language type="kaw">カウィ語</language>
+ <language type="kbd">ã‚«ãƒãƒ«ãƒ‰èªž</language>
+ <language type="kg">コンゴ語</language>
+ <language type="kha">カシ語</language>
+ <language type="khi">コイサン諸語</language>
+ <language type="kho">コータン語</language>
+ <language type="ki">キクユ語</language>
+ <language type="kj">クアニャマ語</language>
+ <language type="kk">カザフ語</language>
+ <language type="kl">グリーンランド語</language>
+ <language type="km">クメール語</language>
+ <language type="kmb">キンブンドゥ語</language>
+ <language type="kn">カンナダ語</language>
+ <language type="ko">韓国語</language>
+ <language type="kok">コンカニ語</language>
+ <language type="kos">コシャエ語</language>
+ <language type="kpe">クペレ語</language>
+ <language type="kr">カヌリ語</language>
+ <language type="krc">カラãƒãƒ£ã‚¤èªž</language>
+ <language type="kro">クルー語</language>
+ <language type="kru">クルク語</language>
+ <language type="ks">カシミール語</language>
+ <language type="ku">クルド語</language>
+ <language type="kum">クムク語</language>
+ <language type="kut">クテナイ語</language>
+ <language type="kv">コミ語</language>
+ <language type="kw">コーンウォール語</language>
+ <language type="ky">キルギス語</language>
+ <language type="la">ラテン語</language>
+ <language type="lad">ラジノ語</language>
+ <language type="lah">ラフンダー語</language>
+ <language type="lam">ランãƒèªž</language>
+ <language type="lb">ルクセンブルク語</language>
+ <language type="lez">レズギ語</language>
+ <language type="lg">ガンダ語</language>
+ <language type="li">リンブルフ語</language>
+ <language type="ln">リンガラ語</language>
+ <language type="lo">ラオ語</language>
+ <language type="lol">モンゴ語</language>
+ <language type="loz">ロズィ語</language>
+ <language type="lt">リトアニア語</language>
+ <language type="lu">ルãƒãƒ»ã‚«ã‚¿ãƒ³ã‚¬èªž</language>
+ <language type="lua">ルãƒãƒ»ãƒ«ãƒ«ã‚¢èªž</language>
+ <language type="lui">ルイセーニョ語</language>
+ <language type="lun">ルンダ語</language>
+ <language type="luo">ルオ語</language>
+ <language type="lus">ルシャイ語</language>
+ <language type="lv">ラトビア語</language>
+ <language type="mad">マドゥラ語</language>
+ <language type="mag">マガヒー語</language>
+ <language type="mai">マイティリー語</language>
+ <language type="mak">マカッサル語</language>
+ <language type="man">マンディンゴ語</language>
+ <language type="map">オーストロãƒã‚·ã‚¢è«¸èªž</language>
+ <language type="mas">マサイ語</language>
+ <language type="mdf">モクシャ語</language>
+ <language type="mdr">マンダル語</language>
+ <language type="men">メンデ語</language>
+ <language type="mg">マダガスカル語</language>
+ <language type="mga">中期アイルランド語</language>
+ <language type="mh">マーシャル語</language>
+ <language type="mi">マオリ語</language>
+ <language type="mic">ミクマク語</language>
+ <language type="min">ミナンカãƒã‚¦èªž</language>
+ <language type="mis">ãã®ä»–ã®è¨€èªž</language>
+ <language type="mk">マケドニア語</language>
+ <language type="mkh">モン・クメール諸語</language>
+ <language type="ml">マラヤーラム語</language>
+ <language type="mn">モンゴル語</language>
+ <language type="mnc">満州語</language>
+ <language type="mni">マニプル語</language>
+ <language type="mno">マノボ語æ—</language>
+ <language type="mo">モルダビア語</language>
+ <language type="moh">モーホーク語</language>
+ <language type="mos">モシ語</language>
+ <language type="mr">マラーティー語</language>
+ <language type="ms">マレー語</language>
+ <language type="mt">マルタ語</language>
+ <language type="mul" draft="unconfirmed">複数言語</language>
+ <language type="mun">ムンダ語æ—</language>
+ <language type="mus">クリーク語</language>
+ <language type="mwl">ミランダ語</language>
+ <language type="mwr">マールワーリー語</language>
+ <language type="my">ビルマ語</language>
+ <language type="myn">マヤ語æ—</language>
+ <language type="myv">エルジャ語</language>
+ <language type="na">ナウル語</language>
+ <language type="nah">ナワトル語</language>
+ <language type="nai">北米インディアン諸語</language>
+ <language type="nap">ナãƒãƒªèªž</language>
+ <language type="nb">ノルウェー語 (ブークモール)</language>
+ <language type="nd">北ンデベレ語</language>
+ <language type="nds">低地ドイツ語ã€ä½Žåœ°ã‚µã‚¯ã‚½ãƒ³èªž</language>
+ <language type="ne">ãƒãƒ‘ール語</language>
+ <language type="new">ãƒãƒ¯ãƒ¼ãƒ«èªž</language>
+ <language type="ng">ンドンガ語</language>
+ <language type="nia">ニアス語</language>
+ <language type="nic">ニジェール・コルドファン諸語</language>
+ <language type="niu">ニウーエイ語</language>
+ <language type="nl">オランダ語</language>
+ <language type="nn">ノルウェー語 (ニーノシュク)</language>
+ <language type="no">ノルウェー語</language>
+ <language type="nog">ノガイ語</language>
+ <language type="non">å¤ãƒŽãƒ«ãƒ‰èªž</language>
+ <language type="nr">å—ンデベレ語</language>
+ <language type="nso">北部ソト語</language>
+ <language type="nub">ヌビア語æ—</language>
+ <language type="nv">ナãƒãƒ›èªž</language>
+ <language type="nwc">å¤å…¸ãƒãƒ¯ãƒ¼ãƒ«èªž</language>
+ <language type="ny">ニャンジャ語ã€ãƒãƒã‚§ãƒ¯èªžã€ãƒã‚§ãƒ¯èªž</language>
+ <language type="nym">ニャムウェジ語</language>
+ <language type="nyn">ニャンコレ語</language>
+ <language type="nyo">ニョロ語</language>
+ <language type="nzi">ンゼマ語</language>
+ <language type="oc">オック語 (1500以é™)ã€ãƒ—ロãƒãƒ³ã‚¹èªž</language>
+ <language type="oj">オブジワ語</language>
+ <language type="om">オロモ語</language>
+ <language type="or">オリヤー語</language>
+ <language type="os">オセト語</language>
+ <language type="osa">オセージ語</language>
+ <language type="ota">オスマントルコ語</language>
+ <language type="oto">オトミ語æ—</language>
+ <language type="pa">パンジャブ語</language>
+ <language type="paa">パプア諸語</language>
+ <language type="pag">パンガシナン語</language>
+ <language type="pal">パフラヴィ語</language>
+ <language type="pam">パンパンガ語</language>
+ <language type="pap">パピアメント語</language>
+ <language type="pau">パラオ語</language>
+ <language type="peo">å¤ä»£ãƒšãƒ«ã‚·ã‚¢èªž</language>
+ <language type="phi">フィリピン諸語</language>
+ <language type="phn">フェニキア語</language>
+ <language type="pi">パーリ語</language>
+ <language type="pl">ãƒãƒ¼ãƒ©ãƒ³ãƒ‰èªž</language>
+ <language type="pon">ãƒãƒ³ãƒšã‚¤èªž</language>
+ <language type="pra">プラークリット語æ—</language>
+ <language type="pro">å¤æœŸãƒ—ロãƒãƒ³ã‚¹èªž</language>
+ <language type="ps">パシュトゥー語</language>
+ <language type="pt">ãƒãƒ«ãƒˆã‚¬ãƒ«èªž</language>
+ <language type="qu">ケãƒãƒ¥ã‚¢èªž</language>
+ <language type="raj">ラージャスターン語</language>
+ <language type="rap">ラパヌイ語</language>
+ <language type="rar">ラロトガ語</language>
+ <language type="rm">レトï¼ãƒ­ãƒžãƒ³èªž</language>
+ <language type="rm" alt="proposed" draft="provisional">レト・ロマン語</language>
+ <language type="rn">ルンディ語</language>
+ <language type="ro">ルーマニア語</language>
+ <language type="roa">ロマンス諸語</language>
+ <language type="rom">ロマーニー語</language>
+ <language type="root" draft="provisional">ルート語</language>
+ <language type="ru">ロシア語</language>
+ <language type="rup">アルーマニア語</language>
+ <language type="rw">ルワンダ語</language>
+ <language type="sa">サンスクリット語</language>
+ <language type="sad">サンダウェ語</language>
+ <language type="sah">ヤクート語</language>
+ <language type="sai">å—米インディアン諸語</language>
+ <language type="sal">セイリッシュ語æ—</language>
+ <language type="sam">サマリア・アラム語</language>
+ <language type="sas">ササク語</language>
+ <language type="sat">サンターリー語</language>
+ <language type="sc">サルデーニャ語</language>
+ <language type="scn">ã‚·ãƒãƒªã‚¢èªž</language>
+ <language type="sco">スコットランド語</language>
+ <language type="sd">シンド語</language>
+ <language type="se">北サーミ語</language>
+ <language type="sel">セリクプ語</language>
+ <language type="sem">セム諸語</language>
+ <language type="sg">サンゴ語</language>
+ <language type="sga">å¤æœŸã‚¢ã‚¤ãƒ«ãƒ©ãƒ³ãƒ‰èªž</language>
+ <language type="sgn">手ã¾ã­è¨€èªž</language>
+ <language type="sh">セルボï¼ã‚¯ãƒ­ã‚¢ãƒã‚¢èªž</language>
+ <language type="sh" alt="proposed" draft="provisional">セルボ・クロアãƒã‚¢èªž</language>
+ <language type="shn">シャン語</language>
+ <language type="si">シンãƒãƒ©èªž</language>
+ <language type="sid">シダモ語</language>
+ <language type="sio">スー語æ—</language>
+ <language type="sit">シナ・ãƒãƒ™ãƒƒãƒˆè«¸èªž</language>
+ <language type="sk">スロãƒã‚­ã‚¢èªž</language>
+ <language type="sl">スロベニア語</language>
+ <language type="sla">スラブ諸語</language>
+ <language type="sm">サモア語</language>
+ <language type="sma">å—サーミ語</language>
+ <language type="smi">サーミ諸語</language>
+ <language type="smj">ルレ・サーミ語</language>
+ <language type="smn">イナリ・サーミ語</language>
+ <language type="sms">スコルト・サーミ語</language>
+ <language type="sn">ショナ語</language>
+ <language type="snk">ソニンケ語</language>
+ <language type="so">ソマリ語</language>
+ <language type="sog">ソグド語</language>
+ <language type="son">ソンガイ語</language>
+ <language type="sq">アルãƒãƒ‹ã‚¢èªž</language>
+ <language type="sr">セルビア語</language>
+ <language type="srn">スリナム語</language>
+ <language type="srr">セレル語</language>
+ <language type="ss">シスワティ語</language>
+ <language type="ssa">ナイル・サãƒãƒ©è«¸èªž</language>
+ <language type="st">å—部ソト語</language>
+ <language type="su">スンダ語</language>
+ <language type="suk">スクマ語</language>
+ <language type="sus">スス語</language>
+ <language type="sux">シュメール語</language>
+ <language type="sv">スウェーデン語</language>
+ <language type="sw">スワヒリ語</language>
+ <language type="syr">シリア語</language>
+ <language type="ta">タミール語</language>
+ <language type="tai">タイ諸語</language>
+ <language type="te">テルグ語</language>
+ <language type="tem">テムãƒèªž</language>
+ <language type="ter">テレーノ語</language>
+ <language type="tet">テトゥン語</language>
+ <language type="tg">タジク語</language>
+ <language type="th">タイ語</language>
+ <language type="ti">ティグリニア語</language>
+ <language type="tig">ティグレ語</language>
+ <language type="tiv" draft="unconfirmed">ティブ語</language>
+ <language type="tk">トルクメン語</language>
+ <language type="tkl">トケラウ語</language>
+ <language type="tl">タガログ語</language>
+ <language type="tlh">クリンゴン語</language>
+ <language type="tli">トリンギット語</language>
+ <language type="tmh">タマシェク語</language>
+ <language type="tn">ツワナ語</language>
+ <language type="to">トンガ語</language>
+ <language type="tog">トンガ語 (ニアサ)</language>
+ <language type="tpi">トク・ピシン語</language>
+ <language type="tr">トルコ語</language>
+ <language type="ts">ツォンガ語</language>
+ <language type="tsi">ãƒãƒ ã‚·ãƒ¥èªž</language>
+ <language type="tt">タタール語</language>
+ <language type="tum">トゥンブカ語</language>
+ <language type="tup">トゥピ語æ—</language>
+ <language type="tut">アルタイ諸語</language>
+ <language type="tvl">ツãƒãƒ«èªž</language>
+ <language type="tw">トウィ語</language>
+ <language type="ty">タヒãƒèªž</language>
+ <language type="tyv">トゥヴァ語</language>
+ <language type="udm">ウドムルト語</language>
+ <language type="ug">ウイグル語</language>
+ <language type="uga">ウガリト語</language>
+ <language type="uk">ウクライナ語</language>
+ <language type="umb">ウンブンドゥ語</language>
+ <language type="und" draft="unconfirmed">éžç¢ºå®š</language>
+ <language type="ur">ウルドゥー語</language>
+ <language type="uz">ウズベク語</language>
+ <language type="vai">ヴァイ語</language>
+ <language type="ve">ベンダ語</language>
+ <language type="vi">ベトナム語</language>
+ <language type="vo">ボラピュク語</language>
+ <language type="vot">ボート語</language>
+ <language type="wa">ワロン語</language>
+ <language type="wak">ワカシ語æ—</language>
+ <language type="wal">ワッラモ語</language>
+ <language type="war">ワライ語</language>
+ <language type="was">ワショ語</language>
+ <language type="wen">ソルビア語æ—</language>
+ <language type="wo">ウォロフ語</language>
+ <language type="xal">カルムイク語</language>
+ <language type="xh">コサ語</language>
+ <language type="yao">ヤオ語</language>
+ <language type="yap">ヤップ語</language>
+ <language type="yi">イディッシュ語</language>
+ <language type="yo">ヨルãƒèªž</language>
+ <language type="ypk">ユピック語æ—</language>
+ <language type="za">ãƒãƒ¯ãƒ³èªž</language>
+ <language type="zap">ザãƒãƒ†ãƒƒã‚¯èªž</language>
+ <language type="zen">ゼナガ語</language>
+ <language type="zh">中国語</language>
+ <language type="znd">ザンデ語</language>
+ <language type="zu">ズールー語</language>
+ <language type="zun">ズニ語</language>
+ </languages>
+ <scripts>
+ <script type="Arab">アラビア文字</script>
+ <script type="Armn">アルメニア文字</script>
+ <script type="Bali">ãƒãƒªæ–‡å­—</script>
+ <script type="Batk">ãƒã‚¿ã‚¯æ–‡å­—</script>
+ <script type="Beng">ベンガル文字</script>
+ <script type="Blis">ブリスシンボル</script>
+ <script type="Bopo">注音字æ¯</script>
+ <script type="Brah">ブラーフミー文字</script>
+ <script type="Brai">ブライユ点字</script>
+ <script type="Bugi">ブギス文字</script>
+ <script type="Buhd">ブヒッド文字</script>
+ <script type="Cans">çµ±åˆã‚«ãƒŠãƒ€å…ˆä½æ°‘記å·</script>
+ <script type="Cham">ãƒãƒ£ãƒ æ–‡å­—</script>
+ <script type="Cher">ãƒã‚§ãƒ­ã‚­ãƒ¼æ–‡å­—</script>
+ <script type="Cirt">キアス文字</script>
+ <script type="Copt">コプト文字</script>
+ <script type="Cprt">キプロス文字</script>
+ <script type="Cyrl">キリル文字</script>
+ <script type="Cyrs">キリル文字 (å¤ä»£æ•™ä¼šã‚¹ãƒ©ãƒ–語ã®æ–‡å­—)</script>
+ <script type="Deva">デーãƒãƒŠãƒ¼ã‚¬ãƒªãƒ¼æ–‡å­—</script>
+ <script type="Dsrt">デセレット文字</script>
+ <script type="Egyd">エジプト民衆文字</script>
+ <script type="Egyh">エジプト神官文字</script>
+ <script type="Egyp">エジプトè–刻文字</script>
+ <script type="Ethi">エãƒã‚ªãƒ”ア文字</script>
+ <script type="Geok" draft="provisional">クツリ文字 (アソンタブルリã¨ãƒŒã‚¹ãƒ•ãƒª)</script>
+ <script type="Geor">グルジア文字</script>
+ <script type="Glag">グラゴール文字</script>
+ <script type="Goth">ゴート文字</script>
+ <script type="Grek">ギリシャ文字</script>
+ <script type="Gujr">グジャラート文字</script>
+ <script type="Guru">グルムキー文字</script>
+ <script type="Hang">ãƒãƒ³ã‚°ãƒ«</script>
+ <script type="Hani">漢字</script>
+ <script type="Hano">ãƒãƒŒãƒŽã‚ªæ–‡å­—</script>
+ <script type="Hans">簡体字</script>
+ <script type="Hant">ç¹ä½“å­—</script>
+ <script type="Hebr">ヘブライ文字</script>
+ <script type="Hira">ã²ã‚‰ãŒãª</script>
+ <script type="Hmng">パãƒã‚¦ãƒ»ãƒ•ãƒ¢ãƒ³æ–‡å­—</script>
+ <script type="Hrkt">カタカナã¨ã²ã‚‰ãŒãª</script>
+ <script type="Hung">å¤ä»£ãƒãƒ³ã‚¬ãƒªãƒ¼æ–‡å­—</script>
+ <script type="Inds">インダス文字 (ãƒãƒ©ãƒƒãƒ‘文字)</script>
+ <script type="Ital" draft="provisional">å¤ä»£ã‚¤ã‚¿ãƒªã‚¢ã®æ–‡å­—</script>
+ <script type="Java">ジャワ文字</script>
+ <script type="Kali" draft="provisional">カヤー文字</script>
+ <script type="Kana">カタカナ</script>
+ <script type="Khar">カローシュティー文字</script>
+ <script type="Khmr">クメール文字</script>
+ <script type="Knda">カンナダ文字</script>
+ <script type="Laoo">ラオ文字</script>
+ <script type="Latf" draft="provisional">ラテン文字 (ドイツ文字)</script>
+ <script type="Latg" draft="provisional">ラテン文字 (ゲール語ã®æ–‡å­—)</script>
+ <script type="Latn">ラテン文字</script>
+ <script type="Lepc">レプãƒãƒ£æ–‡å­— (ロン文字)</script>
+ <script type="Limb">リンブ文字</script>
+ <script type="Lina" draft="provisional">線文字A</script>
+ <script type="Linb">線文字B</script>
+ <script type="Mand">マンダ文字</script>
+ <script type="Maya">マヤ象形文字</script>
+ <script type="Mero">メロエ文字</script>
+ <script type="Mlym">マラヤーラム文字</script>
+ <script type="Mong">モンゴル文字</script>
+ <script type="Mymr">ミャンマー文字</script>
+ <script type="Nkoo" draft="provisional">インコ文字</script>
+ <script type="Ogam">オガム文字</script>
+ <script type="Orkh">オルホン文字</script>
+ <script type="Orya">オリヤー文字</script>
+ <script type="Osma">オスマニア文字</script>
+ <script type="Osma" alt="proposed-u82-1" draft="provisional">ソマリ文字</script>
+ <script type="Perm" draft="provisional">å¤ãƒšãƒ«ãƒŸãƒƒã‚¯æ–‡å­—</script>
+ <script type="Phag">パスパ文字</script>
+ <script type="Phnx">フェニキア文字</script>
+ <script type="Plrd" draft="provisional">ãƒãƒ©ãƒ¼ãƒ‰éŸ³å£°è¨˜å·</script>
+ <script type="Qaai" draft="provisional">系統</script>
+ <script type="Roro">ロンゴロンゴ文字</script>
+ <script type="Runr">ルーン文字</script>
+ <script type="Sara">サラティ文字</script>
+ <script type="Shaw">ショー文字</script>
+ <script type="Shaw" alt="proposed-u82-1" draft="provisional">ãƒãƒ¼ãƒŠãƒ¼ãƒ‰ãƒ»ã‚·ãƒ§ãƒ¼ã®æ–‡å­—</script>
+ <script type="Sinh">シンãƒãƒ©æ–‡å­—</script>
+ <script type="Sylo">シロティ・ナグリ文字</script>
+ <script type="Syrc">シリア文字</script>
+ <script type="Syre">シリア文字 (エストランゲロ文字)</script>
+ <script type="Syrj">シリア文字 (æ±æ–¹ã‚·ãƒªã‚¢æ–‡å­—)</script>
+ <script type="Syrn">シリア文字 (西方シリア文字)</script>
+ <script type="Tagb">ã‚¿ã‚°ãƒãƒ³ãƒ¯æ–‡å­—</script>
+ <script type="Tale">タイレ文字</script>
+ <script type="Tale" alt="proposed-u82-1" draft="provisional">タイ・ナ文字</script>
+ <script type="Talu">新タイ・ルー文字</script>
+ <script type="Taml">タミール文字</script>
+ <script type="Telu">テルグ文字</script>
+ <script type="Teng">テングワール文字</script>
+ <script type="Tfng">ティフナグ文字 (ベルベル文字)</script>
+ <script type="Tglg">タガログ文字</script>
+ <script type="Thaa">ターナ文字</script>
+ <script type="Thai">タイ文字</script>
+ <script type="Tibt">ãƒãƒ™ãƒƒãƒˆæ–‡å­—</script>
+ <script type="Ugar">ウガリト文字</script>
+ <script type="Vaii">ヴァイ文字</script>
+ <script type="Visp" draft="provisional">視話法</script>
+ <script type="Xpeo">å¤ä»£ãƒšãƒ«ã‚·ã‚¢æ–‡å­—</script>
+ <script type="Xsux" draft="provisional">シュメールï¼ã‚¢ãƒƒã‚«ãƒ‰èªžæ¥”形文字</script>
+ <script type="Yiii">イ文字</script>
+ <script type="Yiii" alt="proposed-u82-1" draft="provisional">å½ (イ) 文字</script>
+ <script type="Zxxx">å£æ‰¿è¨€èªžã®ã‚³ãƒ¼ãƒ‰</script>
+ <script type="Zyyy">共通コード</script>
+ <script type="Zzzz" draft="provisional">コード化ã•ã‚Œã¦ã„ãªã„文字ã®ã‚³ãƒ¼ãƒ‰</script>
+ </scripts>
+ <territories>
+ <territory type="001">世界</territory>
+ <territory type="002">アフリカ</territory>
+ <territory type="005">å—アメリカ</territory>
+ <territory type="009">オセアニア</territory>
+ <territory type="011">西アフリカ</territory>
+ <territory type="013">中央アメリカ</territory>
+ <territory type="014">æ±ã‚¢ãƒ•ãƒªã‚«</territory>
+ <territory type="015">北アフリカ</territory>
+ <territory type="017">中部アフリカ</territory>
+ <territory type="018">å—部アフリカ</territory>
+ <territory type="019">アメリカ大陸</territory>
+ <territory type="021">北アメリカ</territory>
+ <territory type="029">カリブ海</territory>
+ <territory type="030">æ±ã‚¢ã‚¸ã‚¢</territory>
+ <territory type="034">å—アジア</territory>
+ <territory type="035">æ±å—アジア</territory>
+ <territory type="039">å—ヨーロッパ</territory>
+ <territory type="053">オーストラリア・ニュージーランド</territory>
+ <territory type="054">メラãƒã‚·ã‚¢</territory>
+ <territory type="057">ミクロãƒã‚·ã‚¢åœ°åŸŸ</territory>
+ <territory type="061">ãƒãƒªãƒã‚·ã‚¢</territory>
+ <territory type="062">å—中央アジア</territory>
+ <territory type="142">アジア</territory>
+ <territory type="143">中央アジア</territory>
+ <territory type="145">西アジア</territory>
+ <territory type="150">ヨーロッパ</territory>
+ <territory type="151">æ±ãƒ¨ãƒ¼ãƒ­ãƒƒãƒ‘</territory>
+ <territory type="154">北ヨーロッパ</territory>
+ <territory type="155">西ヨーロッパ</territory>
+ <territory type="172">独立国家共åŒä½“</territory>
+ <territory type="419">ラテンアメリカ・カリブ地域</territory>
+ <territory type="830">ãƒãƒ£ãƒãƒ«è«¸å³¶</territory>
+ <territory type="IM">マン島</territory>
+ <territory type="AD">アンドラ</territory>
+ <territory type="AE">アラブ首長国連邦</territory>
+ <territory type="AF">アフガニスタン</territory>
+ <territory type="AG">アンティグア・ãƒãƒ¼ãƒ–ーダ</territory>
+ <territory type="AI">アンギラ</territory>
+ <territory type="AL">アルãƒãƒ‹ã‚¢</territory>
+ <territory type="AM">アルメニア</territory>
+ <territory type="AN">オランダ領アンティル諸島</territory>
+ <territory type="AO">アンゴラ</territory>
+ <territory type="AQ">å—極大陸</territory>
+ <territory type="AR">アルゼンãƒãƒ³</territory>
+ <territory type="AS">米領サモア</territory>
+ <territory type="AT">オーストリア</territory>
+ <territory type="AU">オーストラリア</territory>
+ <territory type="AW">アルãƒå³¶</territory>
+ <territory type="AX">オーランド諸島</territory>
+ <territory type="AZ">アゼルãƒã‚¤ã‚¸ãƒ£ãƒ³</territory>
+ <territory type="BA">ボスニア・ヘルツェゴビナ</territory>
+ <territory type="BB">ãƒãƒ«ãƒãƒ‰ã‚¹</territory>
+ <territory type="BD">ãƒãƒ³ã‚°ãƒ©ãƒ‡ã‚·ãƒ¥</territory>
+ <territory type="BE">ベルギー</territory>
+ <territory type="BF">ブルキナファソ</territory>
+ <territory type="BG">ブルガリア</territory>
+ <territory type="BH">ãƒãƒ¼ãƒ¬ãƒ¼ãƒ³</territory>
+ <territory type="BI">ブルンジ</territory>
+ <territory type="BJ">ベニン</territory>
+ <territory type="BM">ãƒãƒŸãƒ¥ãƒ¼ãƒ€</territory>
+ <territory type="BN">ブルãƒã‚¤</territory>
+ <territory type="BO">ボリビア</territory>
+ <territory type="BR">ブラジル</territory>
+ <territory type="BS">ãƒãƒãƒž</territory>
+ <territory type="BT">ブータン</territory>
+ <territory type="BV">ブーベ島</territory>
+ <territory type="BW">ボツワナ</territory>
+ <territory type="BY">ベラルーシ</territory>
+ <territory type="BZ">ベリーズ</territory>
+ <territory type="CA">カナダ</territory>
+ <territory type="CC">ココス (キーリング) 諸島</territory>
+ <territory type="CD">コンゴ民主共和国 (キンシャサ)</territory>
+ <territory type="CF">中央アフリカ共和国</territory>
+ <territory type="CG">コンゴ共和国 (ブラザビル)</territory>
+ <territory type="CH">スイス</territory>
+ <territory type="CI">コートジボワール</territory>
+ <territory type="CK">クック諸島</territory>
+ <territory type="CL">ãƒãƒª</territory>
+ <territory type="CM">カメルーン</territory>
+ <territory type="CN">中国</territory>
+ <territory type="CO">コロンビア</territory>
+ <territory type="CR">コスタリカ</territory>
+ <territory type="CS">セルビア・モンテãƒã‚°ãƒ­</territory>
+ <territory type="CU">キューãƒ</territory>
+ <territory type="CV">カーボベルデ</territory>
+ <territory type="CX">クリスマス島</territory>
+ <territory type="CY">キプロス</territory>
+ <territory type="CZ">ãƒã‚§ã‚³å…±å’Œå›½</territory>
+ <territory type="DE">ドイツ</territory>
+ <territory type="DJ">ジブãƒ</territory>
+ <territory type="DK">デンマーク</territory>
+ <territory type="DM">ドミニカ国</territory>
+ <territory type="DO">ドミニカ共和国</territory>
+ <territory type="DZ">アルジェリア</territory>
+ <territory type="EC">エクアドル</territory>
+ <territory type="EE">エストニア</territory>
+ <territory type="EG">エジプト</territory>
+ <territory type="EH">西サãƒãƒ©</territory>
+ <territory type="ER">エリトリア</territory>
+ <territory type="ES">スペイン</territory>
+ <territory type="ET">エãƒã‚ªãƒ”ã‚¢</territory>
+ <territory type="FI">フィンランド</territory>
+ <territory type="FJ">フィジー</territory>
+ <territory type="FK">フォークランド諸島</territory>
+ <territory type="FM">ミクロãƒã‚·ã‚¢</territory>
+ <territory type="FO">フェロー諸島</territory>
+ <territory type="FR">フランス</territory>
+ <territory type="GA">ガボン</territory>
+ <territory type="GB">イギリス</territory>
+ <territory type="GD">グレナダ</territory>
+ <territory type="GE">グルジア</territory>
+ <territory type="GF">ä»é ˜ã‚®ã‚¢ãƒŠ</territory>
+ <territory type="GH">ガーナ</territory>
+ <territory type="GI">ジブラルタル</territory>
+ <territory type="GL">グリーンランド</territory>
+ <territory type="GM">ガンビア</territory>
+ <territory type="GN">ギニア</territory>
+ <territory type="GP">グアドループ</territory>
+ <territory type="GQ">赤é“ギニア</territory>
+ <territory type="GR">ギリシャ</territory>
+ <territory type="GS">å—ジョージア島・å—サンドイッãƒè«¸å³¶</territory>
+ <territory type="GT">グアテマラ</territory>
+ <territory type="GU">グアム</territory>
+ <territory type="GW">ギニアビサウ</territory>
+ <territory type="GY">ガイアナ</territory>
+ <territory type="HK">中è¯äººæ°‘共和国香港特別行政区</territory>
+ <territory type="HM">ãƒãƒ¼ãƒ‰å³¶ãƒ»ãƒžã‚¯ãƒ‰ãƒŠãƒ«ãƒ‰è«¸å³¶</territory>
+ <territory type="HN">ホンジュラス</territory>
+ <territory type="HR">クロアãƒã‚¢</territory>
+ <territory type="HT">ãƒã‚¤ãƒ</territory>
+ <territory type="HU">ãƒãƒ³ã‚¬ãƒªãƒ¼</territory>
+ <territory type="ID">インドãƒã‚·ã‚¢</territory>
+ <territory type="IE">アイルランド</territory>
+ <territory type="IL">イスラエル</territory>
+ <territory type="IN">インド</territory>
+ <territory type="IO">英領インド洋æ¤æ°‘地</territory>
+ <territory type="IQ">イラク</territory>
+ <territory type="IR">イラン</territory>
+ <territory type="IS">アイスランド</territory>
+ <territory type="IT">イタリア</territory>
+ <territory type="JM">ジャマイカ</territory>
+ <territory type="JO">ヨルダン</territory>
+ <territory type="JP">日本</territory>
+ <territory type="KE">ケニア</territory>
+ <territory type="KG">キルギスタン</territory>
+ <territory type="KH">カンボジア</territory>
+ <territory type="KI">キリãƒã‚¹</territory>
+ <territory type="KM">コモロ</territory>
+ <territory type="KN">セントクリストファー・ãƒã‚¤ãƒ“ス</territory>
+ <territory type="KP">æœé®®æ°‘主主義人民共和国</territory>
+ <territory type="KR">大韓民国</territory>
+ <territory type="KW">クウェート</territory>
+ <territory type="KY">ケイマン諸島</territory>
+ <territory type="KZ">カザフスタン</territory>
+ <territory type="LA">ラオス</territory>
+ <territory type="LB">レãƒãƒŽãƒ³</territory>
+ <territory type="LC">セントルシア</territory>
+ <territory type="LI">リヒテンシュタイン</territory>
+ <territory type="LK">スリランカ</territory>
+ <territory type="LR">リベリア</territory>
+ <territory type="LS">レソト</territory>
+ <territory type="LT">リトアニア</territory>
+ <territory type="LU">ルクセンブルグ</territory>
+ <territory type="LV">ラトビア</territory>
+ <territory type="LY">リビア</territory>
+ <territory type="MA">モロッコ</territory>
+ <territory type="MC">モナコ</territory>
+ <territory type="MD">モルドãƒ</territory>
+ <territory type="MG">マダガスカル</territory>
+ <territory type="MH">マーシャル諸島共和国</territory>
+ <territory type="MK">マケドニア</territory>
+ <territory type="ML">マリ</territory>
+ <territory type="MM">ミャンマー</territory>
+ <territory type="MN">モンゴル</territory>
+ <territory type="MO">中è¯äººæ°‘共和国マカオ特別行政区</territory>
+ <territory type="MP">北マリアナ諸島</territory>
+ <territory type="MQ">マルティニーク島</territory>
+ <territory type="MR">モーリタニア</territory>
+ <territory type="MS">モントセラト島</territory>
+ <territory type="MT">マルタ</territory>
+ <territory type="MU">モーリシャス</territory>
+ <territory type="MV">モルジブ</territory>
+ <territory type="MW">マラウィ</territory>
+ <territory type="MX">メキシコ</territory>
+ <territory type="MY">マレーシア</territory>
+ <territory type="MZ">モザンビーク</territory>
+ <territory type="NA">ナミビア</territory>
+ <territory type="NC">ニューカレドニア</territory>
+ <territory type="NE">ニジェール</territory>
+ <territory type="NF">ノーフォーク島</territory>
+ <territory type="NG">ナイジェリア</territory>
+ <territory type="NI">ニカラグア</territory>
+ <territory type="NL">オランダ</territory>
+ <territory type="NO">ノルウェー</territory>
+ <territory type="NP">ãƒãƒ‘ール</territory>
+ <territory type="NR">ナウル</territory>
+ <territory type="NU">ニウエ島</territory>
+ <territory type="NZ">ニュージーランド</territory>
+ <territory type="OM">オマーン</territory>
+ <territory type="PA">パナマ</territory>
+ <territory type="PE">ペルー</territory>
+ <territory type="PF">ä»é ˜ãƒãƒªãƒã‚·ã‚¢</territory>
+ <territory type="PG">パプアニューギニア</territory>
+ <territory type="PH">フィリピン</territory>
+ <territory type="PK">パキスタン</territory>
+ <territory type="PL">ãƒãƒ¼ãƒ©ãƒ³ãƒ‰</territory>
+ <territory type="PM">サンピエール島・ミクロン島</territory>
+ <territory type="PN">ピトケアン島</territory>
+ <territory type="PR">プエルトリコ</territory>
+ <territory type="PS">パレスãƒãƒŠé ˜åœŸ</territory>
+ <territory type="PT">ãƒãƒ«ãƒˆã‚¬ãƒ«</territory>
+ <territory type="PW">パラオ</territory>
+ <territory type="PY">パラグアイ</territory>
+ <territory type="QA">カタール</territory>
+ <territory type="QO">ãã®ä»–ã®ã‚ªã‚»ã‚¢ãƒ‹ã‚¢</territory>
+ <territory type="RE">レユニオン島</territory>
+ <territory type="RO">ルーマニア</territory>
+ <territory type="RU">ロシア</territory>
+ <territory type="RW">ルワンダ</territory>
+ <territory type="SA">サウジアラビア</territory>
+ <territory type="SB">ソロモン諸島</territory>
+ <territory type="SC">セーシェル</territory>
+ <territory type="SD">スーダン</territory>
+ <territory type="SE">スウェーデン</territory>
+ <territory type="SG">シンガãƒãƒ¼ãƒ«</territory>
+ <territory type="SH">セントヘレナ</territory>
+ <territory type="SI">スロベニア</territory>
+ <territory type="SJ">スãƒãƒ¼ãƒ«ãƒãƒ«è«¸å³¶ãƒ»ãƒ¤ãƒ³ãƒžã‚¤ã‚¨ãƒ³å³¶</territory>
+ <territory type="SK">スロãƒã‚­ã‚¢</territory>
+ <territory type="SL">シエラレオãƒ</territory>
+ <territory type="SM">サンマリノ</territory>
+ <territory type="SN">ã‚»ãƒã‚¬ãƒ«</territory>
+ <territory type="SO">ソマリア</territory>
+ <territory type="SR">スリナム</territory>
+ <territory type="ST">サントメ・プリンシペ</territory>
+ <territory type="SV">エルサルãƒãƒ‰ãƒ«</territory>
+ <territory type="SY">シリア</territory>
+ <territory type="SZ">スワジランド</territory>
+ <territory type="TC">タークス諸島・カイコス諸島</territory>
+ <territory type="TD">ãƒãƒ£ãƒ‰</territory>
+ <territory type="TF">フランス領極å—諸島</territory>
+ <territory type="TG">トーゴ</territory>
+ <territory type="TH">タイ</territory>
+ <territory type="TJ">タジキスタン</territory>
+ <territory type="TK">トケラウ諸島</territory>
+ <territory type="TL">æ±ãƒ†ã‚£ãƒ¢ãƒ¼ãƒ«</territory>
+ <territory type="TM">トルクメニスタン</territory>
+ <territory type="TN">ãƒãƒ¥ãƒ‹ã‚¸ã‚¢</territory>
+ <territory type="TO">トンガ</territory>
+ <territory type="TR">トルコ</territory>
+ <territory type="TT">トリニダード・トãƒã‚´</territory>
+ <territory type="TV">ツãƒãƒ«</territory>
+ <territory type="TW">å°æ¹¾</territory>
+ <territory type="TZ">タンザニア</territory>
+ <territory type="UA">ウクライナ</territory>
+ <territory type="UG">ウガンダ</territory>
+ <territory type="UM">米領太平洋諸島</territory>
+ <territory type="US">アメリカåˆè¡†å›½</territory>
+ <territory type="UY">ウルグアイ</territory>
+ <territory type="UZ">ウズベキスタン</territory>
+ <territory type="VA">ãƒãƒã‚«ãƒ³å¸‚国</territory>
+ <territory type="VC">セントビンセント・グレナディーン諸島</territory>
+ <territory type="VE">ベãƒã‚ºã‚¨ãƒ©</territory>
+ <territory type="VG">イギリス領ヴァージン諸島</territory>
+ <territory type="VI">アメリカ領ヴァージン諸島</territory>
+ <territory type="VN">ベトナム</territory>
+ <territory type="VU">ãƒãƒŒã‚¢ãƒ„</territory>
+ <territory type="WF">ウォリス・フツナ</territory>
+ <territory type="WS">サモア</territory>
+ <territory type="YE">イエメン</territory>
+ <territory type="YT">マヨット島</territory>
+ <territory type="ZA">å—アフリカ</territory>
+ <territory type="ZM">ザンビア</territory>
+ <territory type="ZW">ジンãƒãƒ–エ</territory>
+ </territories>
+ <variants>
+ <variant type="1901" draft="provisional">ä¼çµ±çš„ドイツ語正字法</variant>
+ <variant type="1996" draft="provisional">1996 年ドイツ語正字法</variant>
+ <variant type="NEDIS">ナティゾーãƒæ–¹è¨€</variant>
+ <variant type="POLYTONI">ãƒãƒªãƒˆãƒ‹ãƒƒã‚¯</variant>
+ <variant type="POSIX">コンピュータ</variant>
+ <variant type="REVISED">改訂版</variant>
+ <variant type="ROZAJ" draft="provisional">レシアン</variant>
+ <variant type="SAAHO" draft="provisional">サホ語</variant>
+ </variants>
+ <keys>
+ <key type="calendar">暦法</key>
+ <key type="collation">ç…§åˆ</key>
+ <key type="currency">通貨</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">ç¹ä½“字中国語 (Big5)</type>
+ <type type="buddhist" key="calendar">タイä»æ•™æš¦</type>
+ <type type="chinese" key="calendar">中国暦</type>
+ <type type="direct" key="collation" draft="unconfirmed">直接著錄</type>
+ <type type="gb2312han" key="collation">簡体字中国語 (GB2312)</type>
+ <type type="gregorian" key="calendar">西暦 (グレゴリオ暦)</type>
+ <type type="hebrew" key="calendar">ユダヤ暦</type>
+ <type type="islamic" key="calendar">イスラム暦</type>
+ <type type="islamic-civil" key="calendar">太陽イスラム暦</type>
+ <type type="islamic-civil" key="calendar" alt="proposed-u82-1" draft="provisional">常用イスラム暦</type>
+ <type type="japanese" key="calendar">和暦</type>
+ <type type="phonebook" key="collation">電話帳方å¼</type>
+ <type type="pinyin" key="collation" draft="unconfirmed">拼音順</type>
+ <type type="stroke" key="collation">画数順</type>
+ <type type="traditional" key="collation">æ—§å¼</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[ã‚ ã‚ž ヽ ヾ ãã‚¡ ã‚ã‚¢ ãƒã‚£ ã„イ ã…ã‚¥ ã†ã‚¦ ヴ ã‡ã‚§ ãˆã‚¨ ã‰ã‚© ãŠã‚ª ヵ ã‹ã‚« ãŒã‚¬ ãã‚­ ãŽã‚® ãク ãã‚° ヶ ã‘ケ ã’ゲ ã“コ ã”ã‚´ ã•ã‚µ ã–ザ ã—ã‚· ã˜ã‚¸ ã™ã‚¹ ãšã‚º ã›ã‚» ãœã‚¼ ãソ ãžã‚¾ ãŸã‚¿ ã ãƒ€ ã¡ãƒ ã¢ãƒ‚ ã£ãƒƒ ã¤ãƒ„ ã¥ãƒ… ã¦ãƒ† ã§ãƒ‡ ã¨ãƒˆ ã©ãƒ‰ ãªãƒŠ ã«ãƒ‹ ã¬ãƒŒ ã­ãƒ ã®ãƒŽ ã¯ãƒ ã°ãƒ ã±ãƒ‘ ã²ãƒ’ ã³ãƒ“ ã´ãƒ” ãµãƒ• ã¶ãƒ– ã·ãƒ— ã¸ãƒ˜ ã¹ãƒ™ ãºãƒš ã»ãƒ› ã¼ãƒœ ã½ãƒ ã¾ãƒž ã¿ãƒŸ むム ã‚メ もモ ゃャ やヤ ゅュ ゆユ ょョ よヨ らラ りリ るル れレ ã‚ロ ゎヮ ã‚ワ ã‚ヰ ゑヱ をヲ んン 亜 å“€ æ„› 悪 æ¡ åœ§ 扱 安 æš— 案 以 ä½ ä¾ å‰ å›² 委 å¨ å°‰ æ„ æ…° 易 為 ç•° 移 維 ç·¯ 胃 è¡£ é• éº åŒ» 井 域 育 一 壱 逸 稲 芋 å° å“¡ å›  姻 引 飲 院 é™° éš  韻 å³ å®‡ ç¾½ 雨 渦 浦 é‹ é›² å–¶ å½± 映 æ „ æ°¸ æ³³ 英 è¡› è©  é‹­ 液 ç–« 益 駅 悦 è¬ è¶Š é–² 円 園 å®´ 延 æ´ æ²¿ æ¼” ç‚Ž ç…™ 猿 ç¸ é  é‰› å¡© 汚 凹 央 奥 å¾€ å¿œ 押 横 欧 æ®´ 王 ç¿ é»„ æ²– å„„ 屋 憶 ä¹™ å¸ æ© æ¸© ç© éŸ³ 下 化 ä»® 何 価 ä½³ 加 å¯ å˜‰ å¤ å« å®¶ 寡 科 暇 æžœ 架 æ­Œ æ²³ ç« ç¦ ç¨¼ 箇 花 è· è¯ è“ èª² 貨 éŽ èšŠ 我 ç”» 芽 è³€ é›… 餓 介 会 解 回 å¡Š 壊 å¿« 怪 æ‚” æ‡ æˆ’ æ‹ æ”¹ 械 æµ· ç° ç•Œ 皆 çµµ é–‹ 階 è² åŠ¾ 外 害 æ…¨ 概 涯 è¡— 該 垣 嚇 å„ æ‹¡ æ ¼ æ ¸ æ®» ç² ç¢º ç©« 覚 角 較 郭 é–£ éš” é© å­¦ å²³ 楽 é¡ æŽ› 潟 割 å– æ‹¬ æ´» 渇 滑 è¤ è½„ 且 æ ª 刈 ä¹¾ 冠 寒 刊 勘 勧 å·» å–š å ª 完 官 寛 å¹² å¹¹ æ‚£ æ„Ÿ æ…£ 憾 æ› æ•¢ 棺 款 æ­“ æ±— æ¼¢ ç’° 甘 監 看 管 ç°¡ ç·© 缶 è‚ è‰¦ 観 貫 é‚„ é‘‘ é–“ é–‘ é–¢ 陥 韓 館 丸 å« å²¸ 眼 岩 é ‘ é¡” 願 ä¼ å± å–œ 器 基 奇 寄 å² å¸Œ å¹¾ å¿Œ æ® æœº æ—— æ—¢ 期 棋 棄 æ©Ÿ 帰 æ°— æ±½ 祈 å­£ ç´€ è¦ è¨˜ è²´ èµ· 軌 è¼ é£¢ 騎 鬼 亀 å½ å„€ 宜 戯 技 擬 欺 犠 ç–‘ 義 è­° èŠ å‰ å–« è©° å´ å®¢ è„š è™ é€† 丘 ä¹… 休 åŠ å¸ å®® 弓 急 æ•‘ 朽 求 æ³£ çƒ ç©¶ 窮 ç´š ç³¾ 給 æ—§ 牛 去 å±… å·¨ æ‹’ æ‹  挙 虚 許 è· æ¼ é­š 亨 享 京 ä¾› 競 å…± 凶 å” å« å¢ƒ 峡 å¼· æ æ­ æŒŸ æ•™ æ©‹ æ³ ç‹‚ ç‹­ 矯 胸 è„… 興 郷 é¡ éŸ¿ é©š ä»° å‡ æš æ¥­ å±€ 曲 極 玉 勤 å‡ æ–¤ ç´ ç¦ ç­‹ ç·Š èŒ è¥Ÿ 謹 è¿‘ 金 åŸ éŠ€ ä¹ å¥ åŒº 苦 駆 å…· æ„š 虞 空 å¶ é‡ éš… 屈 掘 é´ ç¹° æ¡‘ 勲 å› è–« 訓 群 è» éƒ¡ ä¿‚ 傾 刑 å…„ å•“ åž‹ 契 å½¢ 径 æµ æ…¶ 憩 掲 æº æ•¬ 景 渓 ç³» 経 継 茎 è› è¨ˆ è­¦ 軽 é¶ èŠ¸ è¿Ž 鯨 劇 æ’ƒ æ¿€ å‚‘ 欠 決 æ½” ç©´ çµ è¡€ 月 件 倹 å¥ å…¼ 券 剣 åœ å … å«Œ 建 憲 懸 検 権 犬 献 ç ” çµ¹ 県 è‚© 見 謙 è³¢ è»’ é£ é™º é¡• 験 å…ƒ 原 厳 å¹» 弦 減 æº çŽ„ ç¾ è¨€ é™ å€‹ å¤ å‘¼ 固 å­¤ å·± 庫 弧 戸 æ•… 枯 æ¹– 誇 雇 顧 鼓 五 互 åˆ å‘‰ 娯 後 御 æ‚Ÿ ç¢ èªž 誤 è­· 交 侯 候 å…‰ å…¬ 功 効 厚 å£ å‘ åŽ å‘ å¥½ å­” å­ å·¥ å·§ 幸 広 康 弘 æ’ æ…Œ 抗 拘 控 æ”» æ›´ æ ¡ 構 江 æ´ª 港 æº ç”² 皇 硬 稿 ç´… 絞 綱 耕 考 肯 航 è’ è¡Œ è¡¡ 講 è²¢ è³¼ 郊 é…µ 鉱 鋼 é™ é … 香 高 剛 å· åˆ æ‹· 豪 å…‹ 刻 å‘Š 国 ç©€ é…· é»’ ç„ è…° 骨 è¾¼ 今 å›° 墾 å©š æ¨ æ‡‡ 昆 æ ¹ æ·· ç´º é­‚ ä½ å”† å·¦ å·® 査 ç ‚ è© éŽ– 座 債 催 å† æœ€ 妻 å®° 彩 æ‰ æŽ¡ æ ½ æ­³ 済 ç½ ç • 祭 æ–Ž ç´° èœ è£ è¼‰ éš› 剤 在 æ 罪 財 å‚ å’² å´Ž 作 削 æ¾ æ˜¨ ç­– ç´¢ 錯 æ¡œ 冊 刷 察 æ’® 擦 札 殺 雑 çš¿ 三 傘 å‚ å±± 惨 æ•£ æ¡Ÿ 産 ç®— èš• è³› é…¸ æš« 残 仕 伺 使 刺 å¸ å² å—£ å›› 士 始 姉 姿 å­ å¸‚ 師 å¿— æ€ æŒ‡ 支 æ–½ æ—¨ æž æ­¢ æ­» æ° ç¥‰ ç§ ç³¸ ç´™ ç´« è‚¢ è„‚ 至 視 è©ž è©© 試 誌 è«® 資 賜 雌 飼 æ­¯ 事 ä¼¼ ä¾ å… å­— 寺 æ…ˆ æŒ æ™‚ 次 滋 æ²» ç’½ ç£ ç¤º 耳 自 辞 å¼ è­˜ 軸 七 執 失 室 湿 漆 ç–¾ 質 実 èŠ èˆŽ 写 å°„ æ¨ èµ¦ æ–œ ç…® 社 者 è¬ è»Š é® è›‡ 邪 借 勺 å°º 爵 é…Œ 釈 è‹¥ 寂 å¼± 主 å– å®ˆ 手 朱 殊 ç‹© ç  ç¨® 趣 é…’ 首 å„’ å— å¯¿ 授 樹 需 囚 åŽ å‘¨ å®— å°± å·ž ä¿® æ„ æ‹¾ 秀 秋 終 ç¿’ 臭 舟 衆 襲 週 é…¬ 集 醜 ä½ å…… å 従 柔 æ± æ¸‹ ç£ ç¸¦ é‡ éŠƒ å” å®¿ æ·‘ ç¥ ç¸® ç²› 塾 熟 出 è¡“ è¿° ä¿Š 春 瞬 准 循 æ—¬ 殉 準 潤 盾 ç´” å·¡ éµ é † 処 åˆ æ‰€ æš‘ 庶 ç·’ ç½² 書 諸 助 å™ å¥³ åº å¾ é™¤ å‚· å„Ÿ å‹ åŒ  å‡ å¬ å•† å”± 奨 宵 å°† å° å°‘ å°š 床 å½° 承 抄 æ‹› 掌 昇 昌 昭 晶 æ¾ æ²¼ 消 渉 焼 焦 ç…§ ç—‡ çœ ç¡ ç¤ ç¥¥ 称 ç«  笑 粧 ç´¹ è‚– è¡ è¨Ÿ 証 è©” 詳 象 賞 é˜ éšœ 上 丈 ä¹— 冗 剰 城 å ´ 壌 嬢 常 情 æ¡ æµ„ 状 畳 è’¸ è­² 醸 錠 嘱 飾 æ¤ æ®– ç¹” è· è‰² 触 食 è¾± 伸 ä¿¡ ä¾µ 唇 娠 å¯ å¯© 心 æ…Ž 振 æ–° 森 浸 æ·± 申 真 神 ç´³ 臣 è–ª 親 診 身 è¾› 進 é‡ éœ‡ 人 ä» åˆƒ å°‹ 甚 å°½ è¿… 陣 é…¢ 図 å¹ åž‚ 帥 推 æ°´ ç‚Š ç¡ ç²‹ è¡° é‚ é…” 錘 éš é«„ å´‡ æ•° 枢 æ® æ‰ æ¾„ 寸 世 瀬 ç• æ˜¯ 制 å‹¢ 姓 å¾ æ€§ æˆ æ”¿ æ•´ 星 æ™´ æ­£ 清 牲 生 ç›› ç²¾ è– å£° 製 西 誠 誓 è«‹ é€ é’ é™ æ–‰ 税 éš» 席 惜 æ–¥ 昔 æž çŸ³ ç© ç± ç¸¾ 責 赤 è·¡ 切 æ‹™ 接 æ‘‚ 折 設 窃 節 説 雪 絶 舌 ä»™ å…ˆ åƒ å  å®£ å°‚ å· æˆ¦ 扇 æ “ 泉 æµ… æ´— 染 潜 æ—‹ ç·š 繊 船 è–¦ è·µ é¸ é· éŠ­ 銑 é®® å‰ å–„ 漸 然 å…¨ 禅 繕 å¡‘ 措 ç–Ž 礎 祖 租 ç²— ç´  組 訴 阻 僧 創 åŒ å€‰ å–ª 壮 å¥ å±¤ 想 æœ æŽƒ 挿 æ“ æ—© 曹 å·£ 槽 燥 争 相 窓 ç· è‰ è˜ è‘¬ è—» 装 èµ° é€ é­ éœœ 騒 åƒ å¢— 憎 臓 蔵 è´ˆ 造 促 å´ å‰‡ å³ æ¯ æŸ æ¸¬ 足 速 ä¿— 属 賊 æ— ç¶š å’ å­˜ å­« å°Š æ æ‘ ä»– 多 太 å • 妥 惰 打 駄 体 対 è€ å¸¯ å¾… 怠 æ…‹ 替 æ³° 滞 胎 袋 貸 退 逮 隊 代 å° å¤§ 第 é¡Œ æ» å“ å®… 択 æ‹“ æ²¢ 濯 託 æ¿ è«¾ 但 é” å¥ª 脱 棚 è°· 丹 å˜ å˜† æ‹… 探 æ·¡ ç‚­ 短 端 胆 誕 é› å›£ 壇 å¼¾ æ–­ æš– 段 ç”· 談 値 知 地 æ¥ æ±  ç—´ 稚 ç½® 致 é… ç¯‰ ç•œ 竹 è“„ é€ ç§© 窒 茶 å«¡ ç€ ä¸­ 仲 å®™ å¿  抽 昼 柱 注 虫 è¡· 鋳 é§ è‘— 貯 ä¸ å…† 帳 åº å¼” å¼µ 彫 å¾´ 懲 挑 æœ æ½® 町 眺 è´ è„¹ è…¸ 調 超 è·³ é•· é ‚ é³¥ å‹… ç›´ 朕 沈 ç 賃 鎮 陳 æ´¥ 墜 追 ç—› 通 å¡š 漬 åª é‡£ 亭 低 åœ åµ è²ž 呈 å ¤ 定 å¸ åº• 庭 å»· 弟 抵 æ 禎 程 ç·  艇 訂 逓 邸 æ³¥ 摘 敵 æ»´ çš„ 笛 é© å“² å¾¹ æ’¤ è¿­ 鉄 å…¸ 天 展 店 æ·» 転 点 ä¼ æ®¿ ç”° é›» å å¡— å¾’ æ–— 渡 ç™» 途 都 努 度 土 奴 怒 倒 å…š 冬 å‡ åˆ€ å” å¡” 島 悼 投 æ­ æ± æ¡ƒ 棟 ç›— 湯 ç¯ å½“ ç—˜ ç­‰ ç­” ç­’ ç³– çµ± 到 討 謄 豆 è¸ é€ƒ é€ é™¶ é ­ 騰 é—˜ åƒ å‹• åŒ å ‚ å°Ž æ´ž ç«¥ 胴 é“ éŠ… å³  匿 å¾— å¾³ 特 ç£ ç¯¤ 毒 独 読 凸 çª å±Š 屯 豚 曇 éˆ å†… 縄 å— è»Ÿ 難 二 å°¼ å¼ è‚‰ æ—¥ ä¹³ å…¥ 如 å°¿ ä»» 妊 å¿ èª å¯§ 猫 熱 å¹´ 念 燃 粘 æ‚© 濃 ç´ èƒ½ 脳 è¾² 把 覇 æ³¢ æ´¾ ç ´ 婆 馬 俳 廃 æ‹ æŽ’ æ•— æ¯ èƒŒ 肺 輩 é… å€ åŸ¹ 媒 梅 è²· 売 è³  陪 伯 åš æ‹ æ³Š 白 舶 è–„ è¿« æ¼  爆 縛 麦 ç®± è‚Œ ç•‘ å…« 鉢 発 髪 ä¼ ç½° 抜 é–¥ ä¼´ 判 åŠ å 帆 æ¬ æ¿ ç‰ˆ 犯 ç­ ç•” ç¹ èˆ¬ è—© 販 範 ç…© é ’ 飯 晩 番 盤 è›® å‘ å¦ å¦ƒ å½¼ 悲 扉 批 披 比 泌 ç–² çš® 碑 秘 ç½· è‚¥ 被 è²» é¿ éž é£› å‚™ å°¾ å¾® 美 é¼» 匹 å¿… ç­† 姫 百 俵 標 æ°· 漂 票 表 è©• æ ç—… 秒 è‹— å“ æµœ 貧 賓 é » æ• ç“¶ ä¸ ä»˜ 夫 婦 富 布 府 怖 扶 æ•· æ™® æµ® 父 符 è… è†š è­œ è²  賦 èµ´ 附 ä¾® æ­¦ 舞 部 å° é¢¨ ä¼ å‰¯ 復 å¹… æœ ç¦ è…¹ 複 覆 払 沸 ä» ç‰© 分 å™´ 墳 憤 奮 粉 ç´› é›° æ–‡ èž ä¸™ ä½µ å…µ å¡€ å¹£ å¹³ 弊 柄 並 é–‰ é™› ç±³ å£ ç™– 別 å 変 片 ç·¨ 辺 è¿” é 便 勉 å¼ ä¿ èˆ— æ• æ­© 補 ç©‚ å‹Ÿ 墓 æ…• æš® æ¯ ç°¿ 倣 俸 包 å ± 奉 å® å³° å´© 抱 放 æ–¹ 法 泡 ç ² 縫 胞 芳 褒 訪 豊 邦 飽 ä¹ äº¡ å‚ å‰– åŠ å¦¨ 帽 忘 å¿™ 房 æš´ 望 æŸ æ£’ 冒 ç´¡ 肪 膨 謀 貿 防 北 僕 墨 æ’² 朴 牧 没 å € 奔 本 ç¿» 凡 盆 æ‘© 磨 é­” 麻 埋 妹 æžš 毎 幕 膜 åˆ æŠ¹ 末 ç¹­ 万 æ…¢ 満 漫 味 未 é­… 岬 密 脈 妙 æ°‘ 眠 å‹™ 夢 ç„¡ 矛 霧 å©¿ 娘 å 命 明 盟 è¿· 銘 é³´ æ»… å… ç¶¿ é¢ æ¨¡ 茂 妄 毛 猛 盲 網 耗 木 é»™ ç›® 戻 å• ç´‹ é–€ åŒ å¤œ 野 矢 厄 å½¹ ç´„ è–¬ 訳 èº æŸ³ 愉 æ²¹ ç™’ è«­ 輸 唯 優 勇 å‹ å¹½ æ‚  憂 有 猶 ç”± 裕 誘 éŠ éƒµ 雄 èž å¤• 予 ä½™ 与 誉 é  å¹¼ 容 庸 æš æº æ“ æ›œ 様 æ´‹ 溶 用 窯 羊 葉 è¦ è¬¡ 踊 陽 養 抑 欲 æµ´ ç¿Œ 翼 ç¾… 裸 æ¥ é ¼ é›· 絡 è½ é…ª ä¹± åµ æ¬„ æ¿« 覧 利 å å±¥ ç† ç—¢ è£ é‡Œ 離 陸 律 率 ç«‹ ç•¥ æµ ç•™ ç¡« ç²’ 隆 ç«œ æ…® æ—… 虜 了 僚 両 寮 æ–™ 涼 猟 療 糧 良 é‡ é™µ é ˜ 力 ç·‘ 倫 厘 æž— 臨 輪 隣 å¡ æ¶™ ç´¯ é¡ž 令 例 冷 励 礼 鈴 éš· 零 霊 麗 é½¢ 暦 æ­´ 列 劣 烈 裂 廉 æ‹ ç·´ 連 錬 炉 è·¯ 露 労 廊 朗 楼 浪 æ¼ è€ éƒŽ å…­ 禄 録 è«– å’Œ 話 賄 惑 æž  æ¹¾ è…• 祚 雉 拼 錄 鳯]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">1 月</month>
+ <month type="2">2 月</month>
+ <month type="3">3 月</month>
+ <month type="4">4 月</month>
+ <month type="5">5 月</month>
+ <month type="6">6 月</month>
+ <month type="7">7 月</month>
+ <month type="8">8 月</month>
+ <month type="9">9 月</month>
+ <month type="10">10 月</month>
+ <month type="11">11 月</month>
+ <month type="12">12 月</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">1 月</month>
+ <month type="2">2 月</month>
+ <month type="3">3 月</month>
+ <month type="4">4 月</month>
+ <month type="5">5 月</month>
+ <month type="6">6 月</month>
+ <month type="7">7 月</month>
+ <month type="8">8 月</month>
+ <month type="9">9 月</month>
+ <month type="10">10 月</month>
+ <month type="11">11 月</month>
+ <month type="12">12 月</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">æ—¥</day>
+ <day type="mon">月</day>
+ <day type="tue">ç«</day>
+ <day type="wed">æ°´</day>
+ <day type="thu">木</day>
+ <day type="fri">金</day>
+ <day type="sat">土</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">日曜日</day>
+ <day type="mon">月曜日</day>
+ <day type="tue">ç«æ›œæ—¥</day>
+ <day type="wed">水曜日</day>
+ <day type="thu">木曜日</day>
+ <day type="fri">金曜日</day>
+ <day type="sat">土曜日</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">æ—¥</day>
+ <day type="mon">月</day>
+ <day type="tue">ç«</day>
+ <day type="wed">æ°´</day>
+ <day type="thu">木</day>
+ <day type="fri">金</day>
+ <day type="sat">土</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1">第 1 å››åŠæœŸ</quarter>
+ <quarter type="2">第 2 å››åŠæœŸ</quarter>
+ <quarter type="3">第 3 å››åŠæœŸ</quarter>
+ <quarter type="4">第 4 å››åŠæœŸ</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>åˆå‰</am>
+ <pm>åˆå¾Œ</pm>
+ <eras>
+ <eraNames>
+ <era type="0">紀元å‰</era>
+ <era type="1">西暦</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">紀元å‰</era>
+ <era type="1">西暦</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>yyyy'年'M'月'd'日'EEEE</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>yyyy'年'M'月'd'日'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy/MM/dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H'時'mm'分'ss'秒'z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss:z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="GGGGyMd" draft="provisional">GGGGy'年'M'月'd'日'</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">MM/dd</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">yyyy/MM</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ <calendar type="japanese">
+ <eras>
+ <eraAbbr>
+ <era type="0">大化</era>
+ <era type="1">白雉</era>
+ <era type="2">白鳯</era>
+ <era type="3">朱鳥</era>
+ <era type="4">大å®</era>
+ <era type="5">慶雲</era>
+ <era type="6">和銅</era>
+ <era type="7">霊亀</era>
+ <era type="8">養è€</era>
+ <era type="9">神亀</era>
+ <era type="10">天平</era>
+ <era type="11">天平感å®</era>
+ <era type="12">天平å‹å®</era>
+ <era type="13">天平å®å­—</era>
+ <era type="14">天平神護</era>
+ <era type="15">神護景雲</era>
+ <era type="16">å®äº€</era>
+ <era type="17">天応</era>
+ <era type="18">延暦</era>
+ <era type="19">大åŒ</era>
+ <era type="20">弘ä»</era>
+ <era type="21">天長</era>
+ <era type="22">承和</era>
+ <era type="23">嘉祥</era>
+ <era type="24">ä»å¯¿</era>
+ <era type="25">斉衡</era>
+ <era type="26">天安</era>
+ <era type="27">貞観</era>
+ <era type="28">元慶</era>
+ <era type="29">ä»å’Œ</era>
+ <era type="30">寛平</era>
+ <era type="31">昌泰</era>
+ <era type="32">延喜</era>
+ <era type="33">延長</era>
+ <era type="34">承平</era>
+ <era type="35">天慶</era>
+ <era type="36">天暦</era>
+ <era type="37">天徳</era>
+ <era type="38">応和</era>
+ <era type="39">康ä¿</era>
+ <era type="40">安和</era>
+ <era type="41">天禄</era>
+ <era type="42">天延</era>
+ <era type="43">貞元</era>
+ <era type="44">天元</era>
+ <era type="45">永観</era>
+ <era type="46">寛和</era>
+ <era type="47">永延</era>
+ <era type="48">永祚</era>
+ <era type="49">正暦</era>
+ <era type="50">é•·å¾³</era>
+ <era type="51">é•·ä¿</era>
+ <era type="52">寛弘</era>
+ <era type="53">長和</era>
+ <era type="54">寛ä»</era>
+ <era type="55">治安</era>
+ <era type="56">万寿</era>
+ <era type="57">é•·å…ƒ</era>
+ <era type="58">長暦</era>
+ <era type="59">é•·ä¹…</era>
+ <era type="60">寛徳</era>
+ <era type="61">永承</era>
+ <era type="62">天喜</era>
+ <era type="63">康平</era>
+ <era type="64">治暦</era>
+ <era type="65">延久</era>
+ <era type="66">承ä¿</era>
+ <era type="67">承暦</era>
+ <era type="68">æ°¸ä¿</era>
+ <era type="69">応徳</era>
+ <era type="70">寛治</era>
+ <era type="71">嘉ä¿</era>
+ <era type="72">永長</era>
+ <era type="73">承徳</era>
+ <era type="74">康和</era>
+ <era type="75">é•·æ²»</era>
+ <era type="76">嘉承</era>
+ <era type="77">天ä»</era>
+ <era type="78">天永</era>
+ <era type="79">永久</era>
+ <era type="80">元永</era>
+ <era type="81">ä¿å®‰</era>
+ <era type="82">天治</era>
+ <era type="83">大治</era>
+ <era type="84">天承</era>
+ <era type="85">長承</era>
+ <era type="86">ä¿å»¶</era>
+ <era type="87">永治</era>
+ <era type="88">康治</era>
+ <era type="89">天養</era>
+ <era type="90">久安</era>
+ <era type="91">ä»å¹³</era>
+ <era type="92">久寿</era>
+ <era type="93">ä¿å…ƒ</era>
+ <era type="94">平治</era>
+ <era type="95">永暦</era>
+ <era type="96">å¿œä¿</era>
+ <era type="97">長寛</era>
+ <era type="98">永万</era>
+ <era type="99">ä»å®‰</era>
+ <era type="100">嘉応</era>
+ <era type="101">承安</era>
+ <era type="102">安元</era>
+ <era type="103">治承</era>
+ <era type="104">養和</era>
+ <era type="105">寿永</era>
+ <era type="106">元暦</era>
+ <era type="107">文治</era>
+ <era type="108">建久</era>
+ <era type="109">正治</era>
+ <era type="110">建ä»</era>
+ <era type="111">元久</era>
+ <era type="112">建永</era>
+ <era type="113">承元</era>
+ <era type="114">建暦</era>
+ <era type="115">建ä¿</era>
+ <era type="116">承久</era>
+ <era type="117">貞応</era>
+ <era type="118">å…ƒä»</era>
+ <era type="119">嘉禄</era>
+ <era type="120">安貞</era>
+ <era type="121">寛喜</era>
+ <era type="122">貞永</era>
+ <era type="123">天ç¦</era>
+ <era type="124">文暦</era>
+ <era type="125">嘉禎</era>
+ <era type="126">暦ä»</era>
+ <era type="127">延応</era>
+ <era type="128">ä»æ²»</era>
+ <era type="129">寛元</era>
+ <era type="130">å®æ²»</era>
+ <era type="131">建長</era>
+ <era type="132">康元</era>
+ <era type="133">正嘉</era>
+ <era type="134">正元</era>
+ <era type="135">文応</era>
+ <era type="136">弘長</era>
+ <era type="137">文永</era>
+ <era type="138">建治</era>
+ <era type="139">弘安</era>
+ <era type="140">正応</era>
+ <era type="141">æ°¸ä»</era>
+ <era type="142">正安</era>
+ <era type="143">乾元</era>
+ <era type="144">嘉元</era>
+ <era type="145">徳治</era>
+ <era type="146">延慶</era>
+ <era type="147">応長</era>
+ <era type="148">正和</era>
+ <era type="149">æ–‡ä¿</era>
+ <era type="150">元応</era>
+ <era type="151">元亨</era>
+ <era type="152">正中</era>
+ <era type="153">嘉暦</era>
+ <era type="154">元徳</era>
+ <era type="155">元弘</era>
+ <era type="156">建武</era>
+ <era type="157">延元</era>
+ <era type="158">興国</era>
+ <era type="159">正平</era>
+ <era type="160">建徳</era>
+ <era type="161">文中</era>
+ <era type="162">天授</era>
+ <era type="163">康暦</era>
+ <era type="164">弘和</era>
+ <era type="165">元中</era>
+ <era type="166">至徳</era>
+ <era type="167">嘉慶</era>
+ <era type="168">康応</era>
+ <era type="169">明徳</era>
+ <era type="170">応永</era>
+ <era type="171">正長</era>
+ <era type="172">永享</era>
+ <era type="173">嘉å‰</era>
+ <era type="174">文安</era>
+ <era type="175">å®å¾³</era>
+ <era type="176">享徳</era>
+ <era type="177">康正</era>
+ <era type="178">長禄</era>
+ <era type="179">寛正</era>
+ <era type="180">文正</era>
+ <era type="181">å¿œä»</era>
+ <era type="182">文明</era>
+ <era type="183">長享</era>
+ <era type="184">延徳</era>
+ <era type="185">明応</era>
+ <era type="186">文亀</era>
+ <era type="187">永正</era>
+ <era type="188">大永</era>
+ <era type="189">享禄</era>
+ <era type="190">天文</era>
+ <era type="191">弘治</era>
+ <era type="192">永禄</era>
+ <era type="193">元亀</era>
+ <era type="194">天正</era>
+ <era type="195">文禄</era>
+ <era type="196">慶長</era>
+ <era type="197">元和</era>
+ <era type="198">寛永</era>
+ <era type="199">æ­£ä¿</era>
+ <era type="200">慶安</era>
+ <era type="201">承応</era>
+ <era type="202">明暦</era>
+ <era type="203">万治</era>
+ <era type="204">寛文</era>
+ <era type="205">延å®</era>
+ <era type="206">天和</era>
+ <era type="207">貞享</era>
+ <era type="208">元禄</era>
+ <era type="209">å®æ°¸</era>
+ <era type="210">正徳</era>
+ <era type="211">享ä¿</era>
+ <era type="212">元文</era>
+ <era type="213">寛ä¿</era>
+ <era type="214">延享</era>
+ <era type="215">寛延</era>
+ <era type="216">å®æš¦</era>
+ <era type="217">明和</era>
+ <era type="218">安永</era>
+ <era type="219">天明</era>
+ <era type="220">寛政</era>
+ <era type="221">享和</era>
+ <era type="222">文化</era>
+ <era type="223">文政</era>
+ <era type="224">天ä¿</era>
+ <era type="225">弘化</era>
+ <era type="226">嘉永</era>
+ <era type="227">安政</era>
+ <era type="228">万延</era>
+ <era type="229">文久</era>
+ <era type="230">元治</era>
+ <era type="231">慶応</era>
+ <era type="232">明治</era>
+ <era type="233">大正</era>
+ <era type="234">昭和</era>
+ <era type="235">å¹³æˆ</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>Gy'年'M'月'd'日'EEEE</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>Gy'年'M'月'd'日'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>G yy/MM/dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>G yy/MM/dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H'時'mm'分'ss'秒'z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss:z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HHmm;-HHmm</hourFormat>
+ <regionFormat>{0}時間</regionFormat>
+ <fallbackFormat>{0} ({1})時間</fallbackFormat>
+ <zone type="Africa/Timbuktu">
+ <exemplarCity>アフリカ/ティンブクトゥ</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/ComodRivadavia">
+ <exemplarCity>アメリカ/アルゼンãƒãƒ³/コモドロリãƒãƒ€ãƒ“ã‚¢</exemplarCity>
+ </zone>
+ <zone type="Europe/Belfast">
+ <exemplarCity>ヨーロッパ/ベルファスト</exemplarCity>
+ </zone>
+ <zone type="Pacific/Yap">
+ <exemplarCity>太平洋/ヤップ</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Rothera">
+ <exemplarCity>å—極/ロデラ</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Palmer">
+ <exemplarCity>å—極/パーマー</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>å—極/å—極点</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Syowa">
+ <exemplarCity>å—極/昭和基地</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Mawson">
+ <exemplarCity>å—極/モーソン</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Davis">
+ <exemplarCity>å—極/デービス</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Vostok">
+ <exemplarCity>å—極/ボストーク</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Casey">
+ <exemplarCity>å—極/ケーシー</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity>å—極/デュモンデュルビル</exemplarCity>
+ </zone>
+ <zone type="Antarctica/McMurdo">
+ <exemplarCity>å—極/マクムード</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Rio_Gallegos">
+ <exemplarCity>アメリカ/アルゼンãƒãƒ³/リオガイェゴス</exemplarCity>
+ </zone>
+ <zone type="America/Mendoza">
+ <exemplarCity>アメリカ/メンドーサ</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/San_Juan">
+ <exemplarCity>アメリカ/アルゼンãƒãƒ³/サンファン</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Ushuaia">
+ <exemplarCity>アメリカ/アルゼンãƒãƒ³/ウスアイア</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/La_Rioja">
+ <exemplarCity>アメリカ/アルゼンãƒãƒ³/ラリオãƒ</exemplarCity>
+ </zone>
+ <zone type="America/Catamarca">
+ <exemplarCity>アメリカ/カタマルカ</exemplarCity>
+ </zone>
+ <zone type="America/Jujuy">
+ <exemplarCity>アメリカ/フフイ</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Tucuman">
+ <exemplarCity>アメリカ/アルゼンãƒãƒ³/トゥクマン</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity>アメリカ/コルドãƒ</exemplarCity>
+ </zone>
+ <zone type="America/Buenos_Aires">
+ <exemplarCity>アメリカ/ブエノスアイレス</exemplarCity>
+ </zone>
+ <zone type="Australia/Perth">
+ <exemplarCity>オーストラリア/パース</exemplarCity>
+ </zone>
+ <zone type="Australia/Darwin">
+ <exemplarCity>オーストラリア/ダーウィン</exemplarCity>
+ </zone>
+ <zone type="Australia/Adelaide">
+ <exemplarCity>オーストラリア/アデレード</exemplarCity>
+ </zone>
+ <zone type="Australia/Broken_Hill">
+ <exemplarCity>オーストラリア/ブロークンヒル</exemplarCity>
+ </zone>
+ <zone type="Australia/Currie">
+ <exemplarCity>カリー</exemplarCity>
+ </zone>
+ <zone type="Australia/Melbourne">
+ <exemplarCity>オーストラリア/メルボルン</exemplarCity>
+ </zone>
+ <zone type="Australia/Hobart">
+ <exemplarCity>オーストラリア/ホãƒãƒ¼ãƒˆ</exemplarCity>
+ </zone>
+ <zone type="Australia/Lindeman">
+ <exemplarCity>オーストラリア/リンデマン</exemplarCity>
+ </zone>
+ <zone type="Australia/Sydney">
+ <exemplarCity>オーストラリア/シドニー</exemplarCity>
+ </zone>
+ <zone type="Australia/Brisbane">
+ <exemplarCity>オーストラリア/ブリスベン</exemplarCity>
+ </zone>
+ <zone type="Australia/Lord_Howe">
+ <exemplarCity>オーストラリア/ロードãƒã‚¦</exemplarCity>
+ </zone>
+ <zone type="America/Eirunepe">
+ <exemplarCity>アメリカ/エイルãƒãƒš</exemplarCity>
+ </zone>
+ <zone type="America/Rio_Branco">
+ <exemplarCity>アメリカ/リオブランコ</exemplarCity>
+ </zone>
+ <zone type="America/Porto_Velho">
+ <exemplarCity>アメリカ/ãƒãƒ«ãƒˆãƒ™ãƒªãƒ§</exemplarCity>
+ </zone>
+ <zone type="America/Boa_Vista">
+ <exemplarCity>アメリカ/ボアビスタ</exemplarCity>
+ </zone>
+ <zone type="America/Manaus">
+ <exemplarCity>アメリカ/マナウス</exemplarCity>
+ </zone>
+ <zone type="America/Cuiaba">
+ <exemplarCity>アメリカ/クイアãƒ</exemplarCity>
+ </zone>
+ <zone type="America/Campo_Grande">
+ <exemplarCity>アメリカ/カンãƒã‚°ãƒ©ãƒ³ãƒ‡</exemplarCity>
+ </zone>
+ <zone type="America/Belem">
+ <exemplarCity>アメリカ/ベレム</exemplarCity>
+ </zone>
+ <zone type="America/Araguaina">
+ <exemplarCity>アメリカ/アラグァイナ</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>アメリカ/サンパウロ</exemplarCity>
+ </zone>
+ <zone type="America/Bahia">
+ <exemplarCity>アメリカ/ãƒã‚¤ã‚¢</exemplarCity>
+ </zone>
+ <zone type="America/Fortaleza">
+ <exemplarCity>アメリカ/フォルタレザ</exemplarCity>
+ </zone>
+ <zone type="America/Maceio">
+ <exemplarCity>アメリカ/マセイオ</exemplarCity>
+ </zone>
+ <zone type="America/Recife">
+ <exemplarCity>アメリカ/レシフェ</exemplarCity>
+ </zone>
+ <zone type="America/Noronha">
+ <exemplarCity>アメリカ/ノロニャ</exemplarCity>
+ </zone>
+ <zone type="America/Dawson">
+ <exemplarCity>アメリカ/ドーソン</exemplarCity>
+ </zone>
+ <zone type="America/Whitehorse">
+ <exemplarCity>アメリカ/ホワイトホース</exemplarCity>
+ </zone>
+ <zone type="America/Vancouver">
+ <exemplarCity>アメリカ/ãƒãƒ³ã‚¯ãƒ¼ãƒãƒ¼</exemplarCity>
+ </zone>
+ <zone type="America/Dawson_Creek">
+ <exemplarCity>アメリカ/ドーソンクリーク</exemplarCity>
+ </zone>
+ <zone type="America/Yellowknife">
+ <exemplarCity>アメリカ/イエローナイフ</exemplarCity>
+ </zone>
+ <zone type="America/Inuvik">
+ <exemplarCity>アメリカ/イヌヴィク</exemplarCity>
+ </zone>
+ <zone type="America/Edmonton">
+ <exemplarCity>アメリカ/エドモントン</exemplarCity>
+ </zone>
+ <zone type="America/Swift_Current">
+ <exemplarCity>アメリカ/スウィフトカレント</exemplarCity>
+ </zone>
+ <zone type="America/Cambridge_Bay">
+ <exemplarCity>アメリカ/ケンブリッジベイ</exemplarCity>
+ </zone>
+ <zone type="America/Regina">
+ <exemplarCity>アメリカ/レジャイナ</exemplarCity>
+ </zone>
+ <zone type="America/Winnipeg">
+ <exemplarCity>アメリカ/ウィニペグ</exemplarCity>
+ </zone>
+ <zone type="America/Rainy_River">
+ <exemplarCity>アメリカ/レイニーリãƒãƒ¼</exemplarCity>
+ </zone>
+ <zone type="America/Rankin_Inlet">
+ <exemplarCity>アメリカ/ランキン湾</exemplarCity>
+ </zone>
+ <zone type="America/Thunder_Bay">
+ <exemplarCity>アメリカ/サンダーベイ</exemplarCity>
+ </zone>
+ <zone type="America/Nipigon">
+ <exemplarCity>アメリカ/ニピゴン</exemplarCity>
+ </zone>
+ <zone type="America/Coral_Harbour">
+ <exemplarCity>コーラルãƒãƒ¼ãƒãƒ¼</exemplarCity>
+ </zone>
+ <zone type="America/Toronto">
+ <exemplarCity>アメリカ/トロント</exemplarCity>
+ </zone>
+ <zone type="America/Montreal">
+ <exemplarCity>アメリカ/モントリオール</exemplarCity>
+ </zone>
+ <zone type="America/Iqaluit">
+ <exemplarCity>アメリカ/イカルイット</exemplarCity>
+ </zone>
+ <zone type="America/Pangnirtung">
+ <exemplarCity>アメリカ/パンナータング</exemplarCity>
+ </zone>
+ <zone type="America/Moncton">
+ <exemplarCity>モンクトン</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <standard>大西洋標準時</standard>
+ <daylight>大西洋å¤æ™‚é–“</daylight>
+ </long>
+ <short>
+ <standard>AST</standard>
+ <daylight>ADT</daylight>
+ </short>
+ <exemplarCity>ãƒãƒªãƒ•ã‚¡ã‚¯ã‚¹</exemplarCity>
+ </zone>
+ <zone type="America/Goose_Bay">
+ <exemplarCity>アメリカ/グースベイ</exemplarCity>
+ </zone>
+ <zone type="America/Glace_Bay">
+ <exemplarCity>アメリカ/グレースベイ</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <standard>ニューファンドランド島標準時</standard>
+ <daylight>ニューファンドランド島å¤æ™‚é–“</daylight>
+ </long>
+ <short>
+ <standard>NST</standard>
+ <daylight>NDT</daylight>
+ </short>
+ <exemplarCity>セントジョンズ</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity>アフリカ/キンシャサ</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity>アフリカ/ルブンãƒã‚·</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>太平洋/イースター</exemplarCity>
+ </zone>
+ <zone type="America/Santiago">
+ <exemplarCity>アメリカ/サンãƒã‚¢ã‚´</exemplarCity>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity>アジア/カシガル</exemplarCity>
+ </zone>
+ <zone type="Asia/Urumqi">
+ <exemplarCity>アジア/ウルムãƒ</exemplarCity>
+ </zone>
+ <zone type="Asia/Chongqing">
+ <exemplarCity>アジア/é‡æ…¶</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <standard>中国標準時</standard>
+ <daylight>中国å¤æ™‚é–“</daylight>
+ </long>
+ <short>
+ <standard>CTT</standard>
+ </short>
+ <exemplarCity>上海</exemplarCity>
+ </zone>
+ <zone type="Asia/Harbin">
+ <exemplarCity>アジア/ãƒãƒ«ãƒ“ン</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity>太平洋/ガラパゴス</exemplarCity>
+ </zone>
+ <zone type="America/Guayaquil">
+ <exemplarCity>アメリカ/グアヤキル</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>大西洋/カナリー</exemplarCity>
+ </zone>
+ <zone type="Africa/Ceuta">
+ <exemplarCity>アフリカ/セウタ</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity>ヨーロッパ/マドリード</exemplarCity>
+ </zone>
+ <zone type="Pacific/Truk">
+ <exemplarCity>太平洋/トラック</exemplarCity>
+ </zone>
+ <zone type="Pacific/Ponape">
+ <exemplarCity>太平洋/ãƒãƒŠãƒš</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kosrae">
+ <exemplarCity>太平洋/コシャエ</exemplarCity>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <standard>中欧標準時</standard>
+ <daylight>中欧å¤æ™‚é–“</daylight>
+ </long>
+ <short>
+ <standard>CET</standard>
+ <daylight>CEST</daylight>
+ </short>
+ <exemplarCity>パリ</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>ヨーロッパ/ロンドン</exemplarCity>
+ </zone>
+ <zone type="America/Thule">
+ <exemplarCity>アメリカ/ãƒãƒ¥ãƒ¼ãƒ¬</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity>アメリカ/ゴッドホープ</exemplarCity>
+ </zone>
+ <zone type="America/Scoresbysund">
+ <exemplarCity>アメリカ/スコレスビスン</exemplarCity>
+ </zone>
+ <zone type="America/Danmarkshavn">
+ <exemplarCity>アメリカ/デンマークシャウン</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity>アジア/ジャカルタ</exemplarCity>
+ </zone>
+ <zone type="Asia/Pontianak">
+ <exemplarCity>アジア/ãƒãƒ³ãƒ†ã‚£ã‚¢ãƒŠã‚¯</exemplarCity>
+ </zone>
+ <zone type="Asia/Makassar">
+ <exemplarCity>アジア/マカッサル</exemplarCity>
+ </zone>
+ <zone type="Asia/Jayapura">
+ <exemplarCity>アジア/ジャヤプラ</exemplarCity>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <standard>イスラエル標準時</standard>
+ <daylight>イスラエルå¤æ™‚é–“</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IDT</daylight>
+ </short>
+ <exemplarCity>エルサレム</exemplarCity>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <standard>日本標準時</standard>
+ <daylight>日本å¤æ™‚é–“</daylight>
+ </long>
+ <short>
+ <standard>JST</standard>
+ <daylight>JDT</daylight>
+ </short>
+ <exemplarCity>æ±äº¬</exemplarCity>
+ </zone>
+ <zone type="Pacific/Enderbury">
+ <exemplarCity>太平洋/エンダベリー</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kiritimati">
+ <exemplarCity>太平洋/キリティマティ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tarawa">
+ <exemplarCity>太平洋/タラワ</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtau">
+ <exemplarCity>アジア/アクタウ</exemplarCity>
+ </zone>
+ <zone type="Asia/Oral">
+ <exemplarCity>アジア/オラル</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtobe">
+ <exemplarCity>アジア/アクトベ</exemplarCity>
+ </zone>
+ <zone type="Asia/Qyzylorda">
+ <exemplarCity>アジア/キジルオルダ</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity>アジア/アルマトイ</exemplarCity>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <standard>グリニッジ標準時</standard>
+ <daylight>グリニッジ標準時</daylight>
+ </long>
+ <short>
+ <standard>GMT</standard>
+ <daylight>GMT</daylight>
+ </short>
+ <exemplarCity>カサブランカ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kwajalein">
+ <exemplarCity>太平洋/クワゼリン</exemplarCity>
+ </zone>
+ <zone type="Pacific/Majuro">
+ <exemplarCity>太平洋/マジュロ</exemplarCity>
+ </zone>
+ <zone type="Africa/Bamako">
+ <exemplarCity>アフリカ/ãƒãƒžã‚³</exemplarCity>
+ </zone>
+ <zone type="Asia/Hovd">
+ <exemplarCity>アジア/ホブド</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>アジア/ウランãƒãƒ¼ãƒˆãƒ«</exemplarCity>
+ </zone>
+ <zone type="Asia/Choibalsan">
+ <exemplarCity>アジア/ãƒãƒ§ã‚¤ãƒãƒ«ã‚µãƒ³</exemplarCity>
+ </zone>
+ <zone type="America/Tijuana">
+ <exemplarCity>アメリカ/ティフアナ</exemplarCity>
+ </zone>
+ <zone type="America/Hermosillo">
+ <exemplarCity>アメリカ/エルモシヨ</exemplarCity>
+ </zone>
+ <zone type="America/Mazatlan">
+ <exemplarCity>アメリカ/マサトラン</exemplarCity>
+ </zone>
+ <zone type="America/Chihuahua">
+ <exemplarCity>アメリカ/ãƒãƒ¯ãƒ¯</exemplarCity>
+ </zone>
+ <zone type="America/Monterrey">
+ <exemplarCity>アメリカ/モンテレイ</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>アメリカ/メキシコシティー</exemplarCity>
+ </zone>
+ <zone type="America/Merida">
+ <exemplarCity>アメリカ/メリダ</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>アメリカ/カンクン</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuala_Lumpur">
+ <exemplarCity>アジア/クアラルンプール</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuching">
+ <exemplarCity>アジア/クãƒãƒ³</exemplarCity>
+ </zone>
+ <zone type="Pacific/Chatham">
+ <exemplarCity>太平洋/ãƒãƒ£ã‚¿ãƒ </exemplarCity>
+ </zone>
+ <zone type="Pacific/Auckland">
+ <exemplarCity>太平洋/オークランド</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity>太平洋/タヒãƒ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Marquesas">
+ <exemplarCity>太平洋/マルケサス</exemplarCity>
+ </zone>
+ <zone type="Pacific/Gambier">
+ <exemplarCity>太平洋/ガンビア</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>大西洋/アゾレス</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Madeira">
+ <exemplarCity>大西洋/マデイラ</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>ヨーロッパ/リスボン</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>æ±æ¬§æ¨™æº–時</standard>
+ <daylight>æ±æ¬§å¤æ™‚é–“</daylight>
+ </long>
+ <short>
+ <standard>EET</standard>
+ <daylight>EEST</daylight>
+ </short>
+ <exemplarCity>ブカレスト</exemplarCity>
+ </zone>
+ <zone type="Europe/Kaliningrad">
+ <exemplarCity>ヨーロッパ/カリーニングラード</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>ヨーロッパ/モスクワ</exemplarCity>
+ </zone>
+ <zone type="Europe/Samara">
+ <exemplarCity>ヨーロッパ/サマラ</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>アジア/エカテリンブルグ</exemplarCity>
+ </zone>
+ <zone type="Asia/Omsk">
+ <exemplarCity>アジア/オムスク</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity>アジア/ノボシビルスク</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>アジア/クラスノヤルスク</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity>アジア/イルクーツク</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>アジア/ヤクーツク</exemplarCity>
+ </zone>
+ <zone type="Asia/Vladivostok">
+ <exemplarCity>アジア/ウラジオストク</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>アジア/サãƒãƒªãƒ³</exemplarCity>
+ </zone>
+ <zone type="Asia/Magadan">
+ <exemplarCity>アジア/マガダン</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>アジア/カムãƒãƒ£ãƒƒã‚«</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity>アジア/アナジル</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Jan_Mayen">
+ <exemplarCity>大西洋/ヤンマイエン</exemplarCity>
+ </zone>
+ <zone type="Arctic/Longyearbyen">
+ <exemplarCity>北極/ロングイヤービーエン</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>ヨーロッパ/ウジゴロド</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>ヨーロッパ/キエフ</exemplarCity>
+ </zone>
+ <zone type="Europe/Simferopol">
+ <exemplarCity>ヨーロッパ/シンフェローãƒãƒª</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>ヨーロッパ/ザãƒãƒ­ãƒ¼ã‚¸ã‚§</exemplarCity>
+ </zone>
+ <zone type="Pacific/Midway">
+ <exemplarCity>太平洋/ミッドウェー</exemplarCity>
+ </zone>
+ <zone type="Pacific/Johnston">
+ <exemplarCity>太平洋/ジョンストン</exemplarCity>
+ </zone>
+ <zone type="Pacific/Wake">
+ <exemplarCity>太平洋/ウェイク</exemplarCity>
+ </zone>
+ <zone type="America/Adak">
+ <exemplarCity>アメリカ/アダック</exemplarCity>
+ </zone>
+ <zone type="America/Nome">
+ <exemplarCity>アメリカ/ノーメ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <standard>ãƒãƒ¯ã‚¤æ¨™æº–時</standard>
+ <daylight>ãƒãƒ¯ã‚¤å¤æ™‚é–“</daylight>
+ </long>
+ <short>
+ <standard>HST</standard>
+ <daylight>HDT</daylight>
+ </short>
+ <exemplarCity>ホノルル</exemplarCity>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <standard>アラスカ標準時</standard>
+ <daylight>アラスカå¤æ™‚é–“</daylight>
+ </long>
+ <short>
+ <standard>AKST</standard>
+ <daylight>AKDT</daylight>
+ </short>
+ <exemplarCity>アンカレッジ</exemplarCity>
+ </zone>
+ <zone type="America/Yakutat">
+ <exemplarCity>アメリカ/ヤクタット</exemplarCity>
+ </zone>
+ <zone type="America/Juneau">
+ <exemplarCity>アメリカ/ジュノー</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <standard>太平洋標準時</standard>
+ <daylight>太平洋å¤æ™‚é–“</daylight>
+ </long>
+ <short>
+ <standard>PST</standard>
+ <daylight>PDT</daylight>
+ </short>
+ <exemplarCity>ロサンゼルス</exemplarCity>
+ </zone>
+ <zone type="America/Boise">
+ <exemplarCity>アメリカ/ボイシ</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <exemplarCity>フェニックス</exemplarCity>
+ </zone>
+ <zone type="America/Shiprock">
+ <exemplarCity>アメリカ/シップロック</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <standard>山地標準時</standard>
+ <daylight>山地å¤æ™‚é–“</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MDT</daylight>
+ </short>
+ <exemplarCity>デンãƒãƒ¼</exemplarCity>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity>アメリカ/ノースダコタ/センター</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <standard>中部標準時</standard>
+ <daylight>中部å¤æ™‚é–“</daylight>
+ </long>
+ <short>
+ <standard>CST</standard>
+ <daylight>CDT</daylight>
+ </short>
+ <exemplarCity>ã‚·ã‚«ã‚´</exemplarCity>
+ </zone>
+ <zone type="America/Menominee">
+ <exemplarCity>アメリカ/メノミニー</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vincennes">
+ <exemplarCity>ビンセンス</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Petersburg">
+ <exemplarCity>ピーターズãƒãƒ¼ã‚°</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Knox">
+ <exemplarCity>アメリカ/ノクス</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Marengo">
+ <exemplarCity>アメリカ/インディアナ/マレンゴ</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <exemplarCity>インディアナãƒãƒªã‚¹</exemplarCity>
+ </zone>
+ <zone type="America/Louisville">
+ <exemplarCity>アメリカ/ルイスビル</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vevay">
+ <exemplarCity>アメリカ/インディアナ/ビベー</exemplarCity>
+ </zone>
+ <zone type="America/Kentucky/Monticello">
+ <exemplarCity>アメリカ/モンティãƒã‚§ãƒ­</exemplarCity>
+ </zone>
+ <zone type="America/Detroit">
+ <exemplarCity>アメリカ/デトロイト</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <standard>æ±éƒ¨æ¨™æº–時</standard>
+ <daylight>æ±éƒ¨å¤æ™‚é–“</daylight>
+ </long>
+ <short>
+ <standard>EST</standard>
+ <daylight>EDT</daylight>
+ </short>
+ <exemplarCity>ニューヨーク</exemplarCity>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity draft="unconfirmed">サマルカンド</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>アジア/タシケント</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ADP">
+ <displayName>アンドラ ペセタ</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>UAE ディルãƒãƒ </displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>アフガニー (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>アフガニー</displayName>
+ <symbol>Af</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>アルãƒãƒ‹ã‚¢ レク</displayName>
+ </currency>
+ <currency type="AMD">
+ <displayName>アルメニア ドラム</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName>オランダ領アンティル ギルダー</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName>クワンザ</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>クワンザ (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>アンゴラ 新クワンザ (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>アンゴラ 旧クワンザ (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>アルゼンãƒãƒ³ アゥストラール</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>アルゼンãƒãƒ³ ペソ (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>アルゼンãƒãƒ³ ペソ</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName>オーストリア シリング</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>オーストラリア ドル</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName>アルムギルダー</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>アゼルãƒã‚¤ã‚¸ãƒ£ãƒ³ マナト</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>ボスニア ディナール</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>ボスニア マルク (BAM)</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName>ãƒãƒ«ãƒãƒ‰ã‚¹ ドル</displayName>
+ </currency>
+ <currency type="BDT">
+ <displayName>ãƒãƒ³ã‚°ãƒ©ãƒ‡ã‚·ãƒ¥ ã‚¿ã‚«</displayName>
+ </currency>
+ <currency type="BEC">
+ <displayName>ベルギー フラン (BEC)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>ベルギー フラン</displayName>
+ </currency>
+ <currency type="BEL">
+ <displayName>ベルギー フラン (BEL)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>ブルガリア レフ</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName>ブルガリア 新レフ</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>ãƒãƒ¼ãƒ¬ãƒ¼ãƒ³ ディナール</displayName>
+ </currency>
+ <currency type="BIF">
+ <displayName>ブルンジ フラン</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName>ãƒãƒŸãƒ¥ãƒ¼ãƒ€ ドル</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName>ブルãƒã‚¤ ドル</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>ボリビアーノ</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>ボリビア ペソ</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>ボリビア Mvdol</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>ブラジル 新クルゼイロ (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>ブラジル クルゼイロ</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>ブラジル クルゼイロ (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>ブラジル レアル</displayName>
+ </currency>
+ <currency type="BRN">
+ <displayName>ブラジル 新クルゼイロ</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>ブラジル クルゼイロ レアル</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>ãƒãƒãƒž ドル</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>ブータン ニュルタム</displayName>
+ </currency>
+ <currency type="BUK">
+ <displayName>ビルマ ãƒãƒ£ãƒƒãƒˆ</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>ボツワナ プラ</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>ベラルーシ ルーブル (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>ベラルーシ ルーブル</displayName>
+ </currency>
+ <currency type="BZD">
+ <displayName>ベリーズ ドル</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>カナダ ドル</displayName>
+ </currency>
+ <currency type="CDF">
+ <displayName>コンゴ フラン</displayName>
+ </currency>
+ <currency type="CHE">
+ <displayName>WIR ユーロ</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>スイス フラン</displayName>
+ </currency>
+ <currency type="CHW">
+ <displayName>WIR フラン</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>ãƒãƒª ウニダ デ フォメント</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>ãƒãƒª ペソ</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>中国人民元</displayName>
+ <symbol>å…ƒ</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>コロンビア ペソ</displayName>
+ </currency>
+ <currency type="COU">
+ <displayName>レアル (UVR)</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>コスタリカ コロン</displayName>
+ </currency>
+ <currency type="CSD">
+ <displayName>セルビアン ディナール</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>ãƒã‚§ã‚³ã‚¹ãƒ­ãƒã‚­ã‚¢ コルナ</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>キュームペソ</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>カーボベルデ エスクード</displayName>
+ </currency>
+ <currency type="CYP">
+ <displayName>キプロス ãƒãƒ³ãƒ‰</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName>ãƒã‚§ã‚³ コルナ</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>æ±ãƒ‰ã‚¤ãƒ„ マルク</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>ドイツ マルク</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>ジブムフラン</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName>デンマーク クローãƒ</displayName>
+ </currency>
+ <currency type="DOP">
+ <displayName>ドミニカ ペソ</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName>アルジェリア ディナール</displayName>
+ </currency>
+ <currency type="ECS">
+ <displayName>エクアドル スクレ</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>エクアドル UVC</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>エストニア クルーン</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>エジプト ãƒãƒ³ãƒ‰</displayName>
+ </currency>
+ <currency type="EQE">
+ <displayName>エクウェレ</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>エリトリア ナクファ</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName draft="provisional">スペインペセタ</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName draft="provisional">スペインペセタ (特別é é‡‘勘定)</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>スペイン ペセタ</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>エãƒã‚ªãƒ”ã‚¢ ブル</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>ユーロ</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>フィンランド マルカ</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>フィジー諸島 ドル</displayName>
+ </currency>
+ <currency type="FKP">
+ <displayName>フォークランド(マルビナス)諸島 ãƒãƒ³ãƒ‰</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>フランス フラン</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>英国ãƒãƒ³ãƒ‰</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>グルジア クーãƒãƒ³ ラリ</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>グルジア ラリ</displayName>
+ </currency>
+ <currency type="GHC">
+ <displayName>ガーナ セディ</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>ジブラルタル ãƒãƒ³ãƒ‰</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>ガンビア ダラシ</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>ギニア フラン</displayName>
+ </currency>
+ <currency type="GNS">
+ <displayName>ギニア シリー</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>赤é“ギニア ギニー</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>ギリシャ ドラクマ</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>グアテマラ ケツァル</displayName>
+ </currency>
+ <currency type="GWE">
+ <displayName>ãƒãƒ«ãƒˆã‚¬ãƒ«é ˜ã‚®ãƒ‹ã‚¢ エスクード</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>ギニアビサウ ペソ</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>ガイアナ ドル</displayName>
+ </currency>
+ <currency type="HKD">
+ <displayName>香港ドル</displayName>
+ </currency>
+ <currency type="HNL">
+ <displayName>ホンジュラス レンピラ</displayName>
+ </currency>
+ <currency type="HRD">
+ <displayName>クロアãƒã‚¢ ディナール</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>クロアãƒã‚¢ クーナ</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>ãƒã‚¤ãƒ グールド</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>ãƒãƒ³ã‚¬ãƒªãƒ¼ フォリント</displayName>
+ </currency>
+ <currency type="IDR">
+ <displayName>インドãƒã‚·ã‚¢ ルピア</displayName>
+ </currency>
+ <currency type="IEP">
+ <displayName>アイリッシュ ãƒãƒ³ãƒ‰</displayName>
+ </currency>
+ <currency type="ILP">
+ <displayName>イスラエル ãƒãƒ³ãƒ‰</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>イスラエル新シェケル</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>インド ルピー</displayName>
+ <symbol>INR</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>イラク ディナール</displayName>
+ </currency>
+ <currency type="IRR">
+ <displayName>イラン リアル</displayName>
+ </currency>
+ <currency type="ISK">
+ <displayName>アイスランド クローナ</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>イタリア リラ</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>ジャマイカ ドル</displayName>
+ </currency>
+ <currency type="JOD">
+ <displayName>ヨルダン ディナール</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>日本円</displayName>
+ <symbol>ï¿¥</symbol>
+ </currency>
+ <currency type="KES">
+ <displayName>ケニア シリング</displayName>
+ </currency>
+ <currency type="KGS">
+ <displayName>キルギスタン ソム</displayName>
+ </currency>
+ <currency type="KHR">
+ <displayName>カンボジア リエル</displayName>
+ </currency>
+ <currency type="KMF">
+ <displayName>コモロ フラン</displayName>
+ </currency>
+ <currency type="KPW">
+ <displayName>北æœé®® ウォン</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>韓国 ウォン</displayName>
+ <symbol>₩</symbol>
+ </currency>
+ <currency type="KWD">
+ <displayName>クウェート ディナール</displayName>
+ </currency>
+ <currency type="KYD">
+ <displayName>ケイマン諸島 ドル</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>カザフスタン テンゲ</displayName>
+ </currency>
+ <currency type="LAK">
+ <displayName>ラオス キープ</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>レãƒãƒŽãƒ³ ãƒãƒ³ãƒ‰</displayName>
+ </currency>
+ <currency type="LKR">
+ <displayName>スリランカ ルピー</displayName>
+ </currency>
+ <currency type="LRD">
+ <displayName>リベリア ドル</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>レソト ロティ</displayName>
+ </currency>
+ <currency type="LSM">
+ <displayName>マロティ</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>リトアニア リタス</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>リトアニア タロナ</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName draft="provisional">ルクセンブルク å…Œæ›ãƒ•ãƒ©ãƒ³</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>ルクセンブルグ フラン</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName draft="provisional">ルクセンブルク 金èžãƒ•ãƒ©ãƒ³</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>ラトビア ラッツ</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>ラトビア ルーブル</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>リビア ディナール</displayName>
+ </currency>
+ <currency type="MAD">
+ <displayName>モロッコ ディルãƒãƒ </displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>モロッコ フラン</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>モルドムレイ</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>マダガスカル アリアリ</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>マダガスカル フラン</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>マケドニア デナル</displayName>
+ </currency>
+ <currency type="MLF">
+ <displayName>マリ フラン</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>ミャンマー ãƒãƒ£ãƒƒãƒˆ</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>モンゴル トグログ</displayName>
+ </currency>
+ <currency type="MOP">
+ <displayName>マカオ パタカ</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>モーリタニア ウギア</displayName>
+ </currency>
+ <currency type="MTL">
+ <displayName>マルタ リラ</displayName>
+ </currency>
+ <currency type="MTP">
+ <displayName>マルタ ãƒãƒ³ãƒ‰</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>モーリシャス ルピー</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>モルディブ諸島 ルフィア</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>マラウィ クワãƒãƒ£</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName>メキシコ ペソ</displayName>
+ </currency>
+ <currency type="MXP">
+ <displayName>メキシコ ペソ (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>メキシコ UDI</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>マレーシア リンギット</displayName>
+ </currency>
+ <currency type="MZE">
+ <displayName>モザンピーク エスクード</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>モザンピーク メティカル</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName>ナミビア ドル</displayName>
+ </currency>
+ <currency type="NGN">
+ <displayName>ナイジェリア ナイラ</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>ニカラグア コルドãƒ</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>ニカラグア コルドムオロ</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>オランダ ギルダー</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>ノルウェー クローãƒ</displayName>
+ </currency>
+ <currency type="NPR">
+ <displayName>ãƒãƒ‘ール ルピー</displayName>
+ </currency>
+ <currency type="NZD">
+ <displayName>ニュージーランド ドル</displayName>
+ </currency>
+ <currency type="OMR">
+ <displayName>オマーン リアル</displayName>
+ </currency>
+ <currency type="PAB">
+ <displayName>パナマ ãƒãƒ«ãƒœã‚¢</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>ペルー インティ</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>ペルー 新ソル</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>ペルー ソル</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>パプアニューギニア キナ</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>フィリピン ペソ</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>パキスタン ルピー</displayName>
+ </currency>
+ <currency type="PLN">
+ <displayName>ãƒãƒ¼ãƒ©ãƒ³ãƒ‰ ズウォティ</displayName>
+ </currency>
+ <currency type="PLZ">
+ <displayName>ãƒãƒ¼ãƒ©ãƒ³ãƒ‰ ズウォティ (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>ãƒãƒ«ãƒˆã‚¬ãƒ« エスクード</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>パラグアイ グアラニ</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>カタール リアル</displayName>
+ </currency>
+ <currency type="RHD">
+ <displayName>ローデシア ドル</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>ルーマニア レイ</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>ロシア ルーブル</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>ロシア ルーブル (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>ルワンダ フラン</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>サウジ リヤル</displayName>
+ </currency>
+ <currency type="SBD">
+ <displayName>ソロモン諸島 ドル</displayName>
+ </currency>
+ <currency type="SCR">
+ <displayName>セイシェル ルピー</displayName>
+ </currency>
+ <currency type="SDD">
+ <displayName>スーダン ディナール</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>スーダン ãƒãƒ³ãƒ‰</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>スウェーデン クローナ</displayName>
+ </currency>
+ <currency type="SGD">
+ <displayName>シンガãƒãƒ¼ãƒ« ドル</displayName>
+ </currency>
+ <currency type="SHP">
+ <displayName>セントヘレナ島 ãƒãƒ³ãƒ‰</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>スロベニア トラール</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>スロãƒã‚­ã‚¢ コルナ</displayName>
+ </currency>
+ <currency type="SLL">
+ <displayName>シエラレオムレオン</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>ソマリア シリング</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>スリナム ギルダー</displayName>
+ </currency>
+ <currency type="STD">
+ <displayName>サントメ・プリンシペ ドブラ</displayName>
+ </currency>
+ <currency type="SUR">
+ <displayName>ソ連 ルーブル</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>エルサルãƒãƒ‰ãƒ« コロン</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>シリア ãƒãƒ³ãƒ‰</displayName>
+ </currency>
+ <currency type="SZL">
+ <displayName>スワジランド リランゲニ</displayName>
+ </currency>
+ <currency type="THB">
+ <displayName>タイ ãƒãƒ¼ãƒ„</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>タジキスタン ルーブル</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>タジキスタン ソモニ</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>トルクメニスタン マナト</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>ãƒãƒ¥ãƒ‹ã‚¸ã‚¢ ディナール</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>トンガ パ・アンガ</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>ティモール エスクード</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>トルコ リラ</displayName>
+ </currency>
+ <currency type="TRY">
+ <displayName>新トルコリラ</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>トリニダードトãƒã‚´ ドル</displayName>
+ </currency>
+ <currency type="TWD">
+ <displayName>æ–°å°æ¹¾ãƒ‰ãƒ«</displayName>
+ </currency>
+ <currency type="TZS">
+ <displayName>タンザニア シリング</displayName>
+ </currency>
+ <currency type="UAH">
+ <displayName>ウクライナ グリブナ</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>ウクライナ カルボãƒãƒãƒ„</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>ウガンダ シリング (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>ウガンダ シリング</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>米ドル</displayName>
+ </currency>
+ <currency type="USN">
+ <displayName>米ドル (翌日)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>米ドル (当日)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>ウルグアイ ペソ (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>ウルグアイ ペソ</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName>ウズベキスタン スム</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>ベãƒã‚ºã‚¨ãƒ© ボリãƒãƒ«</displayName>
+ </currency>
+ <currency type="VND">
+ <displayName>ベトナム ドン</displayName>
+ <symbol>Ä‘</symbol>
+ </currency>
+ <currency type="VUV">
+ <displayName>ãƒãƒŒã‚¢ãƒ„ ãƒãƒ„</displayName>
+ </currency>
+ <currency type="WST">
+ <displayName>西サモア タラ</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>CFA フラン BEAC</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>金</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>ヨーロッパ混åˆå˜ä½ (EURCO)</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>ヨーロッパ通貨å˜ä½ (EMU-6)</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>ヨーロッパ勘定å˜ä½ (EUA-9)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>ヨーロッパ勘定å˜ä½ (EUA-17)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>æ±ã‚«ãƒªãƒ– ドル</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>特別引ã出ã—権</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>ヨーロッパ通貨å˜ä½</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>フランス金フラン</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>フランス UIC フラン</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>CFA フラン BCEAO</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>CFP フラン</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>イエメン ディナール</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>イエメン リアル</displayName>
+ </currency>
+ <currency type="YUD">
+ <displayName>ユーゴスラビア ディナール</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>ユーゴスラビア スーパー ディナール</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>ユーゴスラビア 新ディナール (YUN)</displayName>
+ <displayName alt="proposed-u82-1" draft="provisional">ユーゴスラビア 新ディナール</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>å—アフリカ ランド (ZAL)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>å—アフリカ ランド</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>ザイール 新ザイール</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>ザイール ザイール</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>ジンãƒãƒ–エ ドル</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">ã¯ã„:ãƒã‚¤</yesstr>
+ <nostr draft="unconfirmed">ã„ã„ãˆ:イイエ</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1" uri="http://www.ndl.go.jp/jp/library/data/k.pdf" draft="unconfirmed">National Diet Library publication</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ja_JP.xml b/libs/Zend/Locale/Data/ja_JP.xml
new file mode 100755
index 0000000000..68919762a1
--- /dev/null
+++ b/libs/Zend/Locale/Data/ja_JP.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ja"/>
+ <territory type="JP"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ka.xml b/libs/Zend/Locale/Data/ka.xml
new file mode 100755
index 0000000000..04d8076ebe
--- /dev/null
+++ b/libs/Zend/Locale/Data/ka.xml
@@ -0,0 +1,734 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/07/11 19:26:44 $"/>
+ <language type="ka"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ab" draft="provisional">áƒáƒ¤áƒ®áƒáƒ–ური</language>
+ <language type="ady" draft="provisional">áƒáƒ“იღეური</language>
+ <language type="ae" draft="provisional">áƒáƒ•áƒ”სტáƒ</language>
+ <language type="ain" draft="provisional">áƒáƒ˜áƒœáƒ£</language>
+ <language type="ar" draft="provisional">áƒáƒ áƒáƒ‘ული</language>
+ <language type="arc" draft="provisional">áƒáƒ áƒáƒ›áƒ”ული</language>
+ <language type="art" draft="provisional">ხელáƒáƒ•áƒœáƒ£áƒ áƒ˜ (სხვáƒ)</language>
+ <language type="ast" draft="provisional">áƒáƒ•áƒ¡áƒ¢áƒ áƒ˜áƒ£áƒšáƒ˜</language>
+ <language type="az" draft="provisional">áƒáƒ–ერბáƒáƒ˜áƒ¯áƒáƒœáƒ£áƒšáƒ˜</language>
+ <language type="be" draft="provisional">ბელáƒáƒ áƒ£áƒ¡áƒ£áƒšáƒ˜</language>
+ <language type="bg" draft="provisional">ბულგáƒáƒ áƒ£áƒšáƒ˜</language>
+ <language type="bo" draft="provisional">ტიბეტური</language>
+ <language type="br" draft="provisional">ბრეტáƒáƒœáƒ£áƒšáƒ˜</language>
+ <language type="bs" draft="provisional">ბáƒáƒ¡áƒœáƒ˜áƒ£áƒ áƒ˜</language>
+ <language type="bua" draft="provisional">ბურიáƒáƒ¢áƒ£áƒšáƒ˜</language>
+ <language type="ca" draft="provisional">კáƒáƒ¢áƒáƒšáƒáƒœáƒ˜áƒ£áƒ áƒ˜</language>
+ <language type="cau" draft="provisional">კáƒáƒ•áƒ™áƒáƒ¡áƒ˜áƒ£áƒ áƒ˜ (სხვáƒ)</language>
+ <language type="ce" draft="provisional">ჩეჩნური</language>
+ <language type="cel" draft="provisional">კელტური (სხვáƒ)</language>
+ <language type="cs" draft="provisional">ჩეხური</language>
+ <language type="cu" draft="provisional">სáƒáƒ”კლესირსლáƒáƒ•áƒ£áƒ áƒ˜</language>
+ <language type="da" draft="provisional">დáƒáƒœáƒ˜áƒ£áƒ áƒ˜</language>
+ <language type="de">გერმáƒáƒœáƒ£áƒšáƒ˜</language>
+ <language type="egy" draft="provisional">ეგვიპტური</language>
+ <language type="el" draft="provisional">ბერძნული</language>
+ <language type="en">ინგლისური</language>
+ <language type="eo" draft="provisional">ესპერáƒáƒœáƒ¢áƒ</language>
+ <language type="es">ესპáƒáƒœáƒ£áƒ áƒ˜</language>
+ <language type="et" draft="provisional">ესტáƒáƒœáƒ£áƒ áƒ˜</language>
+ <language type="eu" draft="provisional">ბáƒáƒ¡áƒ™áƒ£áƒ áƒ˜</language>
+ <language type="fi" draft="provisional">ფინური</language>
+ <language type="fil" draft="provisional">ფილიპინური</language>
+ <language type="fr">ფრáƒáƒœáƒ’ული</language>
+ <language type="he" draft="provisional">ებრáƒáƒ£áƒšáƒ˜</language>
+ <language type="hi" draft="provisional">ჰინდი</language>
+ <language type="hu" draft="provisional">უნგრული</language>
+ <language type="hy" draft="provisional">სáƒáƒ›áƒ®áƒ£áƒ áƒ˜</language>
+ <language type="ine" draft="provisional">ინდáƒ-ევრáƒáƒžáƒ£áƒšáƒ˜ (სხვáƒ)</language>
+ <language type="it">იტáƒáƒšáƒ˜áƒ£áƒ áƒ˜</language>
+ <language type="ja">იáƒáƒžáƒáƒœáƒ£áƒ áƒ˜</language>
+ <language type="ka">ქáƒáƒ áƒ—ული</language>
+ <language type="ko" draft="provisional">კáƒáƒ áƒ”ული</language>
+ <language type="la" draft="provisional">ლáƒáƒ—ინური</language>
+ <language type="lt" draft="provisional">ლიტვური</language>
+ <language type="mk" draft="provisional">მáƒáƒ™áƒ”დáƒáƒœáƒ˜áƒ£áƒ áƒ˜</language>
+ <language type="mn" draft="provisional">მáƒáƒœáƒ¦áƒáƒšáƒ£áƒ áƒ˜</language>
+ <language type="mo" draft="provisional">მáƒáƒšáƒ“áƒáƒ•áƒ£áƒ áƒ˜</language>
+ <language type="nap" draft="provisional">ნეáƒáƒžáƒáƒšáƒ˜áƒ¢áƒáƒœáƒ£áƒ áƒ˜</language>
+ <language type="ne" draft="provisional">ნეპáƒáƒšáƒ£áƒ áƒ˜</language>
+ <language type="no" draft="provisional">ნáƒáƒ áƒ•áƒ”გიული</language>
+ <language type="pl" draft="provisional">პáƒáƒšáƒáƒœáƒ£áƒ áƒ˜</language>
+ <language type="pt">პáƒáƒ áƒ¢áƒ£áƒ’áƒáƒšáƒ˜áƒ£áƒ áƒ˜</language>
+ <language type="ro" draft="provisional">რუმინული</language>
+ <language type="ru">რუსული</language>
+ <language type="sa" draft="provisional">სáƒáƒœáƒ¡áƒ™áƒ áƒ˜áƒ¢áƒ˜</language>
+ <language type="sk" draft="provisional">სლáƒáƒ•áƒáƒ™áƒ£áƒ áƒ˜</language>
+ <language type="sl" draft="provisional">სლáƒáƒ•áƒ”ნიური</language>
+ <language type="sla" draft="provisional">სლáƒáƒ•áƒ£áƒ áƒ˜ (სხვáƒ)</language>
+ <language type="sq" draft="provisional">áƒáƒšáƒ‘áƒáƒœáƒ£áƒ áƒ˜</language>
+ <language type="sr" draft="provisional">სერბული</language>
+ <language type="sux" draft="provisional">შუმერული</language>
+ <language type="sv" draft="provisional">შვედური</language>
+ <language type="tr" draft="provisional">თურქული</language>
+ <language type="uk" draft="provisional">უკრáƒáƒ˜áƒœáƒ£áƒšáƒ˜</language>
+ <language type="ur" draft="provisional">ურდუ</language>
+ <language type="uz" draft="provisional">უზბეკური</language>
+ <language type="vi" draft="provisional">ვიეტნáƒáƒ›áƒ£áƒ áƒ˜</language>
+ <language type="zh">ჩინური</language>
+ <language type="zu" draft="provisional">ზულუ</language>
+ </languages>
+ <scripts>
+ <script type="Arab" draft="provisional">áƒáƒ áƒáƒ‘ული</script>
+ <script type="Armn" draft="provisional">სáƒáƒ›áƒ®áƒ£áƒ áƒ˜</script>
+ <script type="Bali" draft="provisional">ბáƒáƒšáƒ˜</script>
+ <script type="Batk" draft="provisional">ბáƒáƒ¢áƒáƒ™áƒ˜</script>
+ <script type="Beng" draft="provisional">ბენგáƒáƒšáƒ£áƒ áƒ˜</script>
+ <script type="Copt" draft="provisional">კáƒáƒžáƒ¢áƒ£áƒ áƒ˜</script>
+ <script type="Cprt" draft="provisional">კვიპრáƒáƒ¡áƒ£áƒšáƒ˜</script>
+ <script type="Cyrl" draft="provisional">კირილიცáƒ</script>
+ <script type="Cyrs" draft="provisional">კირილიცრ(ძველი სáƒáƒ”კლესირსáƒáƒ®áƒ”áƒáƒ‘áƒ)</script>
+ <script type="Deva" draft="provisional">დევáƒáƒœáƒáƒ’áƒáƒ áƒ˜</script>
+ <script type="Egyd" draft="provisional">ეგვიპტური დემáƒáƒ¢áƒ˜áƒ™áƒ£áƒ áƒ˜</script>
+ <script type="Egyh" draft="provisional">ეგვიპტური ჰიერáƒáƒ¢áƒ˜áƒ™áƒ£áƒšáƒ˜</script>
+ <script type="Egyp" draft="provisional">ეგვიპტური იერáƒáƒ’ლიფური</script>
+ <script type="Ethi" draft="provisional">ეთიáƒáƒžáƒ£áƒ áƒ˜</script>
+ <script type="Geok" draft="provisional">ხუცური (მრგლáƒáƒ•áƒáƒœáƒ˜ დრნუსხური)</script>
+ <script type="Geor" draft="provisional">ქáƒáƒ áƒ—ული</script>
+ <script type="Glag" draft="provisional">გლáƒáƒ’áƒáƒšáƒ˜áƒªáƒ</script>
+ <script type="Goth" draft="provisional">გáƒáƒ—ური</script>
+ <script type="Grek" draft="provisional">ბერძნული</script>
+ <script type="Gujr" draft="provisional">გუჯáƒáƒ áƒáƒ—ული</script>
+ <script type="Guru" draft="provisional">გურმუხული</script>
+ <script type="Hani" draft="provisional">ჰáƒáƒœáƒ˜</script>
+ <script type="Hans" draft="provisional">გáƒáƒ›áƒáƒ áƒ¢áƒ˜áƒ•áƒ”ბული ჰáƒáƒœáƒ˜</script>
+ <script type="Hant" draft="provisional">ტრáƒáƒ“იციული ჰáƒáƒœáƒ˜</script>
+ <script type="Hebr" draft="provisional">ებრáƒáƒ£áƒšáƒ˜</script>
+ <script type="Hira" draft="provisional">ჰირáƒáƒ’áƒáƒœáƒ</script>
+ <script type="Hrkt" draft="provisional">კáƒáƒ¢áƒáƒ™áƒáƒœáƒ áƒáƒœ ჰირáƒáƒ’áƒáƒœáƒ</script>
+ <script type="Hung" draft="provisional">ძველი უნგრული</script>
+ <script type="Kana" draft="provisional">კáƒáƒ¢áƒáƒ™áƒáƒœáƒ</script>
+ <script type="Khmr" draft="provisional">ქჰმერული</script>
+ <script type="Laoo" draft="provisional">ლáƒáƒáƒ¡áƒ£áƒ áƒ˜</script>
+ <script type="Latn" draft="provisional">ლáƒáƒ—ინური</script>
+ <script type="Mong" draft="provisional">მáƒáƒœáƒ¦áƒáƒšáƒ£áƒ áƒ˜</script>
+ <script type="Phnx" draft="provisional">ფინიკიური</script>
+ <script type="Runr" draft="provisional">რუნული</script>
+ <script type="Syrc" draft="provisional">სირიული</script>
+ <script type="Syre" draft="provisional">ესტრáƒáƒœáƒ¯áƒ”ლáƒáƒ¡áƒ”ული სირიული</script>
+ <script type="Syrj" draft="provisional">დáƒáƒ¡áƒáƒ•áƒšáƒ”თი სირიული</script>
+ <script type="Syrn" draft="provisional">áƒáƒ¦áƒ›áƒáƒ¡áƒáƒ•áƒšáƒ”თი სირიული</script>
+ <script type="Taml" draft="provisional">ტáƒáƒ›áƒ˜áƒšáƒ£áƒ áƒ˜</script>
+ <script type="Thai" draft="provisional">ტáƒáƒ˜áƒšáƒáƒœáƒ“ური</script>
+ <script type="Tibt" draft="provisional">ტიბეტური</script>
+ <script type="Xpeo" draft="provisional">ძველი სპáƒáƒ áƒ¡áƒ£áƒšáƒ˜</script>
+ <script type="Xsux" draft="provisional">შუმერულ-áƒáƒ¥áƒáƒ“ური ლურსმნული</script>
+ </scripts>
+ <territories>
+ <territory type="001" draft="provisional">მსáƒáƒ¤áƒšáƒ˜áƒ</territory>
+ <territory type="002" draft="provisional">áƒáƒ¤áƒ áƒ˜áƒ™áƒ</territory>
+ <territory type="005" draft="provisional">სáƒáƒ›áƒ®áƒ áƒ”თი áƒáƒ›áƒ”რიკáƒ</territory>
+ <territory type="009" draft="provisional">áƒáƒ™áƒ”áƒáƒœáƒ”თი</territory>
+ <territory type="011" draft="provisional">დáƒáƒ¡áƒáƒ•áƒšáƒ”თი áƒáƒ¤áƒ áƒ˜áƒ™áƒ</territory>
+ <territory type="013" draft="provisional">ცენტრáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ›áƒ”რიკáƒ</territory>
+ <territory type="014" draft="provisional">áƒáƒ¦áƒ›áƒáƒ¡áƒáƒ•áƒšáƒ”თი áƒáƒ¤áƒ áƒ˜áƒ™áƒ</territory>
+ <territory type="015" draft="provisional">ჩრდილáƒáƒ”თი áƒáƒ¤áƒ áƒ˜áƒ™áƒ</territory>
+ <territory type="017" draft="provisional">შურáƒáƒ¤áƒ áƒ˜áƒ™áƒ</territory>
+ <territory type="018" draft="provisional">სáƒáƒ›áƒ®áƒ áƒ”თი áƒáƒ¤áƒ áƒ˜áƒ™áƒ</territory>
+ <territory type="019" draft="provisional">áƒáƒ›áƒ”რიკები</territory>
+ <territory type="021" draft="provisional">ჩრდილáƒáƒ”თი áƒáƒ›áƒ”რიკáƒ</territory>
+ <territory type="029" draft="provisional">კáƒáƒ áƒ˜áƒ‘ი</territory>
+ <territory type="030" draft="provisional">áƒáƒ¦áƒ›áƒáƒ¡áƒáƒ•áƒšáƒ”თი áƒáƒ–იáƒ</territory>
+ <territory type="034" draft="provisional">სáƒáƒ›áƒ®áƒ áƒ”თი áƒáƒ–იáƒ</territory>
+ <territory type="035" draft="provisional">სáƒáƒ›áƒ®áƒ áƒ”თ-áƒáƒ¦áƒ›áƒáƒ¡áƒáƒ•áƒšáƒ”თი áƒáƒ–იáƒ</territory>
+ <territory type="039" draft="provisional">სáƒáƒ›áƒ®áƒ áƒ”თი ევრáƒáƒžáƒ</territory>
+ <territory type="053" draft="provisional">áƒáƒ•áƒ¡áƒ¢áƒ áƒáƒšáƒ˜áƒ დრáƒáƒ®áƒáƒšáƒ˜ ზელáƒáƒœáƒ“იáƒ</territory>
+ <territory type="054" draft="provisional">მელáƒáƒœáƒ”ზიáƒ</territory>
+ <territory type="057" draft="provisional">მირáƒáƒœáƒ”ზიáƒ</territory>
+ <territory type="061" draft="provisional">პáƒáƒšáƒ˜áƒœáƒ”ზიáƒ</territory>
+ <territory type="142" draft="provisional">áƒáƒ–იáƒ</territory>
+ <territory type="143" draft="provisional">ცენტრáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ–იáƒ</territory>
+ <territory type="145" draft="provisional">დáƒáƒ¡áƒáƒ•áƒšáƒ”თი áƒáƒ–იáƒ</territory>
+ <territory type="150" draft="provisional">ევრáƒáƒžáƒ</territory>
+ <territory type="151" draft="provisional">áƒáƒ¦áƒ›áƒáƒ¡áƒáƒ•áƒšáƒ”თი ევრáƒáƒžáƒ</territory>
+ <territory type="154" draft="provisional">ჩრდილáƒáƒ”თი ევრáƒáƒžáƒ</territory>
+ <territory type="155" draft="provisional">დáƒáƒ¡áƒáƒ•áƒšáƒ”თი ევრáƒáƒžáƒ</territory>
+ <territory type="172" draft="provisional">დáƒáƒ›áƒáƒ£áƒ™áƒ˜áƒ“ებელ სáƒáƒ®áƒ”ლმწიფáƒáƒ—რთáƒáƒœáƒáƒ›áƒ”გáƒáƒ‘რáƒáƒ‘áƒ</territory>
+ <territory type="419" draft="provisional">ლáƒáƒ—ინური áƒáƒ›áƒ”რიკრდრკáƒáƒ áƒ˜áƒ‘ი</territory>
+ <territory type="AD">áƒáƒœáƒ“áƒáƒ áƒ</territory>
+ <territory type="AE">áƒáƒ áƒáƒ‘ეთის გáƒáƒ”რთიáƒáƒœáƒ”ბული ემირáƒáƒ¢áƒ”ბი</territory>
+ <territory type="AF">áƒáƒ•áƒ¦áƒáƒœáƒ”თი</territory>
+ <territory type="AG">áƒáƒœáƒ¢áƒ˜áƒ’ურდრბáƒáƒ áƒ‘უდáƒ</territory>
+ <territory type="AL">áƒáƒšáƒ‘áƒáƒœáƒ”თი</territory>
+ <territory type="AM" draft="unconfirmed">სáƒáƒ¡áƒáƒ›áƒ®áƒ”თი</territory>
+ <territory type="AN" draft="provisional">ნიდერლáƒáƒœáƒ“ების áƒáƒœáƒ¢áƒ˜áƒšáƒ”ბი</territory>
+ <territory type="AO">áƒáƒœáƒ’áƒáƒšáƒ</territory>
+ <territory type="AQ" draft="provisional">áƒáƒœáƒ¢áƒáƒ áƒ¥áƒ¢áƒ˜áƒ™áƒ</territory>
+ <territory type="AR">áƒáƒ áƒ’ენტინáƒ</territory>
+ <territory type="AS" draft="provisional">áƒáƒ›áƒ”რიკული სáƒáƒ›áƒáƒ</territory>
+ <territory type="AT">áƒáƒ•áƒ¡áƒ¢áƒ áƒ˜áƒ</territory>
+ <territory type="AU">áƒáƒ•áƒ¡áƒ¢áƒ áƒáƒšáƒ˜áƒ</territory>
+ <territory type="AZ">áƒáƒ–ერბáƒáƒ˜áƒ¯áƒáƒœáƒ˜</territory>
+ <territory type="BA">ბáƒáƒ¡áƒœáƒ˜áƒ დრჰერცეგáƒáƒ•áƒ˜áƒœáƒ</territory>
+ <territory type="BB">ბáƒáƒ áƒ‘áƒáƒ“áƒáƒ¡áƒ˜</territory>
+ <territory type="BD">ბáƒáƒœáƒ’ლáƒáƒ“ეში</territory>
+ <territory type="BE">ბელგიáƒ</territory>
+ <territory type="BF">ბურკინáƒ-ფáƒáƒ¡áƒ</territory>
+ <territory type="BG">ბულგáƒáƒ áƒ”თი</territory>
+ <territory type="BH">ბáƒáƒ°áƒ áƒ”ინი</territory>
+ <territory type="BI">ბურუნდი</territory>
+ <territory type="BJ">ბენინი</territory>
+ <territory type="BM" draft="provisional">ბერმუდáƒ</territory>
+ <territory type="BN">ბრუნეი</territory>
+ <territory type="BO">ბáƒáƒšáƒ˜áƒ•áƒ˜áƒ</territory>
+ <territory type="BR">ბრáƒáƒ–ილიáƒ</territory>
+ <territory type="BS">ბáƒáƒ°áƒáƒ›áƒ˜áƒ¡ კუნძულები</territory>
+ <territory type="BT">ბუტáƒáƒœáƒ˜</territory>
+ <territory type="BW">ბáƒáƒ¢áƒ¡áƒ•áƒáƒœáƒ</territory>
+ <territory type="BY">ბელáƒáƒ áƒ£áƒ¡áƒ˜áƒ</territory>
+ <territory type="BZ">ბელიზი</territory>
+ <territory type="CA">კáƒáƒœáƒáƒ“áƒ</territory>
+ <territory type="CF">ცენტრáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ¤áƒ áƒ˜áƒ™áƒ˜áƒ¡ რესპუბლიკáƒ</territory>
+ <territory type="CG">კáƒáƒœáƒ’áƒ</territory>
+ <territory type="CH">შვეიცáƒáƒ áƒ˜áƒ</territory>
+ <territory type="CI">სპილáƒáƒ¡ ძვლის სáƒáƒœáƒáƒžáƒ˜áƒ áƒ</territory>
+ <territory type="CL" draft="provisional">ჩილე</territory>
+ <territory type="CM">კáƒáƒ›áƒ”რუნი</territory>
+ <territory type="CN">ჩინეთი</territory>
+ <territory type="CO">კáƒáƒšáƒ£áƒ›áƒ‘იáƒ</territory>
+ <territory type="CR">კáƒáƒ¡áƒ¢áƒ-რიკáƒ</territory>
+ <territory type="CS" draft="provisional">სერბირდრმáƒáƒœáƒ¢áƒ”ნეგრáƒ</territory>
+ <territory type="CU">კუბáƒ</territory>
+ <territory type="CV">კáƒáƒ‘áƒ-ვერდე</territory>
+ <territory type="CY">კვიპრáƒáƒ¡áƒ˜</territory>
+ <territory type="CZ">ჩეხეთის რესპუბლიკáƒ</territory>
+ <territory type="DE">გერმáƒáƒœáƒ˜áƒ</territory>
+ <territory type="DJ">ჯიბუტი</territory>
+ <territory type="DK">დáƒáƒœáƒ˜áƒ</territory>
+ <territory type="DM">დáƒáƒ›áƒ˜áƒœáƒ˜áƒ™áƒ</territory>
+ <territory type="DO">დáƒáƒ›áƒ˜áƒœáƒ˜áƒ™áƒáƒœáƒ˜áƒ¡ რესპუბლიკáƒ</territory>
+ <territory type="DZ">áƒáƒšáƒŸáƒ˜áƒ áƒ˜</territory>
+ <territory type="EC">ეკვáƒáƒ“áƒáƒ áƒ˜</territory>
+ <territory type="EE">ესტáƒáƒœáƒ”თი</territory>
+ <territory type="EG">ეგვიპტე</territory>
+ <territory type="EH">დáƒáƒ¡áƒáƒ•áƒšáƒ”თი სáƒáƒ°áƒáƒ áƒ</territory>
+ <territory type="ER">ერიტრეáƒ</territory>
+ <territory type="ES">ესპáƒáƒœáƒ”თი</territory>
+ <territory type="ET">ეთიáƒáƒžáƒ˜áƒ</territory>
+ <territory type="FI">ფინეთი</territory>
+ <territory type="FJ">ფიჯი</territory>
+ <territory type="FM">მიკრáƒáƒœáƒ”ზიáƒ</territory>
+ <territory type="FR">სáƒáƒ¤áƒ áƒáƒœáƒ’ეთი</territory>
+ <territory type="GA">გáƒáƒ‘áƒáƒœáƒ˜</territory>
+ <territory type="GB" draft="provisional">დიდი ბრიტáƒáƒœáƒ”თი</territory>
+ <territory type="GD">გრენáƒáƒ“áƒ</territory>
+ <territory type="GE">სáƒáƒ¥áƒáƒ áƒ—ველáƒ</territory>
+ <territory type="GH">გáƒáƒœáƒ</territory>
+ <territory type="GI" draft="provisional">ჰიბრáƒáƒšáƒ¢áƒáƒ áƒ˜</territory>
+ <territory type="GL" draft="provisional">გრენლáƒáƒœáƒ“იáƒ</territory>
+ <territory type="GM">გáƒáƒ›áƒ‘იáƒ</territory>
+ <territory type="GN">გვინეáƒ</territory>
+ <territory type="GP" draft="provisional">გვáƒáƒ“ელუპე</territory>
+ <territory type="GQ">ეკვáƒáƒ¢áƒáƒ áƒ£áƒšáƒ˜ გვინეáƒ</territory>
+ <territory type="GR">სáƒáƒ‘ერძნეთი</territory>
+ <territory type="GT">გვáƒáƒ¢áƒ”მáƒáƒšáƒ</territory>
+ <territory type="GU" draft="provisional">გუáƒáƒ›áƒ˜</territory>
+ <territory type="GW">გვინეáƒ-ბისáƒáƒ£</territory>
+ <territory type="GY">გáƒáƒ˜áƒáƒœáƒ</territory>
+ <territory type="HN">ჰáƒáƒœáƒ“ურáƒáƒ¡áƒ˜</territory>
+ <territory type="HR">ჰáƒáƒ áƒ•áƒáƒ¢áƒ˜áƒ</territory>
+ <territory type="HT">ჰáƒáƒ˜áƒ¢áƒ˜</territory>
+ <territory type="HU">უნგრეთი</territory>
+ <territory type="ID">ინდáƒáƒœáƒ”ზიáƒ</territory>
+ <territory type="IE">ირლáƒáƒœáƒ“იáƒ</territory>
+ <territory type="IL">ისრáƒáƒ”ლი</territory>
+ <territory type="IN">ინდáƒáƒ”თი</territory>
+ <territory type="IO" draft="provisional">ბრიტáƒáƒœáƒ£áƒšáƒ˜ ტერიტáƒáƒ áƒ˜áƒ ინდáƒáƒ”თის áƒáƒ™áƒ”áƒáƒœáƒ”ში</territory>
+ <territory type="IQ">ერáƒáƒ§áƒ˜</territory>
+ <territory type="IR">ირáƒáƒœáƒ˜</territory>
+ <territory type="IS">ისლáƒáƒœáƒ“იáƒ</territory>
+ <territory type="IT">იტáƒáƒšáƒ˜áƒ</territory>
+ <territory type="JM">იáƒáƒ›áƒáƒ˜áƒ™áƒ</territory>
+ <territory type="JO">იáƒáƒ áƒ“áƒáƒœáƒ˜áƒ</territory>
+ <territory type="JP">იáƒáƒžáƒáƒœáƒ˜áƒ</territory>
+ <territory type="KE">კენიáƒ</territory>
+ <territory type="KG">ყირგიზეთი</territory>
+ <territory type="KH">კáƒáƒ›áƒ‘áƒáƒ¯áƒ</territory>
+ <territory type="KI">კირიბáƒáƒ¢áƒ˜</territory>
+ <territory type="KM">კáƒáƒ›áƒáƒ áƒ˜áƒ¡ კუნძულები</territory>
+ <territory type="KN">სენტ-კიტსი დრნევისი</territory>
+ <territory type="KP" draft="provisional">ჩრდილáƒáƒ”თი კáƒáƒ áƒ”áƒ</territory>
+ <territory type="KR" draft="provisional">სáƒáƒ›áƒ®áƒ áƒ”თი კáƒáƒ áƒ”áƒ</territory>
+ <territory type="KW">კუვეიტი</territory>
+ <territory type="KZ">ყáƒáƒ–áƒáƒ®áƒ”თი</territory>
+ <territory type="LA">ლáƒáƒáƒ¡áƒ˜</territory>
+ <territory type="LB">ლიბáƒáƒœáƒ˜</territory>
+ <territory type="LC">სენტ-ლუსიáƒ</territory>
+ <territory type="LI" draft="provisional">ლიხტენშტáƒáƒ˜áƒœáƒ˜</territory>
+ <territory type="LK">შრი-ლáƒáƒœáƒ™áƒ</territory>
+ <territory type="LR">ლიბერიáƒ</territory>
+ <territory type="LS" draft="provisional">ლესáƒáƒ—áƒ</territory>
+ <territory type="LT">ლიტვáƒ</territory>
+ <territory type="LU">ლუქსემბურგი</territory>
+ <territory type="LV">ლáƒáƒ¢áƒ•áƒ˜áƒ</territory>
+ <territory type="LY">ლიბიáƒ</territory>
+ <territory type="MA">მáƒáƒ áƒáƒ™áƒ</territory>
+ <territory type="MC">მáƒáƒœáƒáƒ™áƒ</territory>
+ <territory type="MD">მáƒáƒšáƒ“áƒáƒ•áƒ</territory>
+ <territory type="MG">მáƒáƒ“áƒáƒ’áƒáƒ¡áƒ™áƒáƒ áƒ˜</territory>
+ <territory type="MH">მáƒáƒ áƒ¨áƒáƒšáƒ˜áƒ¡ კუნძულები</territory>
+ <territory type="MK">მáƒáƒ™áƒ”დáƒáƒœáƒ˜áƒ</territory>
+ <territory type="ML">მáƒáƒšáƒ˜</territory>
+ <territory type="MM">მიáƒáƒœáƒ›áƒáƒ áƒ˜</territory>
+ <territory type="MN">მáƒáƒœáƒ¦áƒáƒšáƒ”თი</territory>
+ <territory type="MQ" draft="provisional">მáƒáƒ áƒ¢áƒ˜áƒœáƒ˜áƒ™áƒ˜</territory>
+ <territory type="MR">მáƒáƒ•áƒ áƒ˜áƒ¢áƒáƒœáƒ˜áƒ</territory>
+ <territory type="MS" draft="provisional">მáƒáƒœáƒ¡áƒ”რáƒáƒ¢áƒ˜</territory>
+ <territory type="MT">მáƒáƒšáƒ¢áƒ</territory>
+ <territory type="MU">მáƒáƒ•áƒ áƒ˜áƒ™áƒ˜áƒ</territory>
+ <territory type="MV">მáƒáƒšáƒ“ივის კუნძულები</territory>
+ <territory type="MW">მáƒáƒšáƒáƒ•áƒ˜</territory>
+ <territory type="MX">მექსიკáƒ</territory>
+ <territory type="MY">მáƒáƒšáƒáƒ˜áƒ–იáƒ</territory>
+ <territory type="MZ">მáƒáƒ–áƒáƒ›áƒ‘იკი</territory>
+ <territory type="NA">ნáƒáƒ›áƒ˜áƒ‘იáƒ</territory>
+ <territory type="NC" draft="provisional">áƒáƒ®áƒáƒšáƒ˜ კáƒáƒšáƒ”დáƒáƒœáƒ˜áƒ</territory>
+ <territory type="NE">ნიგერი</territory>
+ <territory type="NF" draft="provisional">ნáƒáƒ áƒ¤áƒáƒšáƒ™áƒ˜áƒ¡ კუნძული</territory>
+ <territory type="NG">ნიგერიáƒ</territory>
+ <territory type="NI">ნიკáƒáƒ áƒáƒ’უáƒ</territory>
+ <territory type="NL">ნიდერლáƒáƒœáƒ“ები</territory>
+ <territory type="NO">ნáƒáƒ áƒ•áƒ”გიáƒ</territory>
+ <territory type="NP">ნეპáƒáƒšáƒ˜</territory>
+ <territory type="NR">ნáƒáƒ£áƒ áƒ£</territory>
+ <territory type="NZ">áƒáƒ®áƒáƒšáƒ˜ ზელáƒáƒœáƒ“იáƒ</territory>
+ <territory type="OM">áƒáƒ›áƒáƒœáƒ˜</territory>
+ <territory type="PA">პáƒáƒœáƒáƒ›áƒ</territory>
+ <territory type="PE">პერუ</territory>
+ <territory type="PF" draft="provisional">ფრáƒáƒœáƒ’ული პáƒáƒšáƒ˜áƒœáƒ”ზიáƒ</territory>
+ <territory type="PG">პáƒáƒžáƒ£áƒ-áƒáƒ®áƒáƒšáƒ˜ გვინეáƒ</territory>
+ <territory type="PH">ფილიპინები</territory>
+ <territory type="PK">პáƒáƒ™áƒ˜áƒ¡áƒ¢áƒáƒœáƒ˜</territory>
+ <territory type="PL">პáƒáƒšáƒáƒœáƒ”თი</territory>
+ <territory type="PR" draft="provisional">პუერტრრიკáƒ</territory>
+ <territory type="PS" draft="provisional">პáƒáƒšáƒ”სტინის ტერიტáƒáƒ áƒ˜áƒ</territory>
+ <territory type="PT">პáƒáƒ áƒ¢áƒ£áƒ’áƒáƒšáƒ˜áƒ</territory>
+ <territory type="PW">პáƒáƒšáƒáƒ£</territory>
+ <territory type="PY">პáƒáƒ áƒáƒ’ვáƒáƒ˜</territory>
+ <territory type="QA">კáƒáƒ¢áƒáƒ áƒ˜</territory>
+ <territory type="RO">რუმინეთი</territory>
+ <territory type="RU">რუსეთი</territory>
+ <territory type="RW">რუáƒáƒœáƒ“áƒ</territory>
+ <territory type="SA">სáƒáƒ£áƒ“ის áƒáƒ áƒáƒ‘ეთი</territory>
+ <territory type="SB">სáƒáƒšáƒáƒ›áƒáƒœáƒ˜áƒ¡ კუნძულები</territory>
+ <territory type="SC">სეიშელის კუნძულები</territory>
+ <territory type="SD">სუდáƒáƒœáƒ˜</territory>
+ <territory type="SE">შვეციáƒ</territory>
+ <territory type="SG">სინგáƒáƒžáƒ£áƒ áƒ˜</territory>
+ <territory type="SI">სლáƒáƒ•áƒ”ნიáƒ</territory>
+ <territory type="SK">სლáƒáƒ•áƒáƒ™áƒ”თი</territory>
+ <territory type="SL">სიერáƒ-ლეáƒáƒœáƒ”</territory>
+ <territory type="SM">სáƒáƒœ-მáƒáƒ áƒ˜áƒœáƒ</territory>
+ <territory type="SN">სენეგáƒáƒšáƒ˜</territory>
+ <territory type="SO">სáƒáƒ›áƒáƒšáƒ˜</territory>
+ <territory type="SR">სურინáƒáƒ›áƒ˜</territory>
+ <territory type="ST">სáƒáƒ-ტáƒáƒ›áƒ” დრპრინსიპი</territory>
+ <territory type="SV">სáƒáƒšáƒ•áƒáƒ“áƒáƒ áƒ˜</territory>
+ <territory type="SY">სირიáƒ</territory>
+ <territory type="SZ">სვáƒáƒ–ილენდი</territory>
+ <territory type="TD">ჩáƒáƒ“ი</territory>
+ <territory type="TG">ტáƒáƒ’áƒ</territory>
+ <territory type="TH">ტáƒáƒ˜áƒšáƒáƒœáƒ“ი</territory>
+ <territory type="TJ">ტáƒáƒ¯áƒ˜áƒ™áƒ”თი</territory>
+ <territory type="TL" draft="provisional">áƒáƒ¦áƒ›áƒáƒ¡áƒáƒ•áƒšáƒ”თი ტიმáƒáƒ áƒ˜</territory>
+ <territory type="TM">თურქმენეთი</territory>
+ <territory type="TN">ტუნისი</territory>
+ <territory type="TO">ტáƒáƒœáƒ’áƒ</territory>
+ <territory type="TR">თურქეთი</territory>
+ <territory type="TT">ტრინიდáƒáƒ“ი დრტáƒáƒ‘áƒáƒ’áƒ</territory>
+ <territory type="TV">ტუვáƒáƒšáƒ£</territory>
+ <territory type="TW">ტáƒáƒ˜áƒ•áƒáƒœáƒ˜</territory>
+ <territory type="TZ">ტáƒáƒœáƒ–áƒáƒœáƒ˜áƒ</territory>
+ <territory type="UA">უკრáƒáƒ˜áƒœáƒ</territory>
+ <territory type="UG">უგáƒáƒœáƒ“áƒ</territory>
+ <territory type="US">áƒáƒ›áƒ”რიკის შეერთებული შტáƒáƒ¢áƒ”ბი</territory>
+ <territory type="UY">ურუგვáƒáƒ˜</territory>
+ <territory type="UZ" draft="provisional">უზბეკეთი</territory>
+ <territory type="VA">ვáƒáƒ¢áƒ˜áƒ™áƒáƒœáƒ˜</territory>
+ <territory type="VC">სენტ-ვინსენტი დრგრენáƒáƒ“ინები</territory>
+ <territory type="VE">ვენესუელáƒ</territory>
+ <territory type="VN">ვიეტნáƒáƒ›áƒ˜</territory>
+ <territory type="VU">ვáƒáƒœáƒ£áƒáƒ¢áƒ£</territory>
+ <territory type="WS">სáƒáƒ›áƒáƒ</territory>
+ <territory type="YE">იემენი</territory>
+ <territory type="ZA">სáƒáƒ›áƒ®áƒ áƒ”თ áƒáƒ¤áƒ áƒ˜áƒ™áƒ</territory>
+ <territory type="ZM">ზáƒáƒ›áƒ‘იáƒ</territory>
+ <territory type="ZW">ზიმბáƒáƒ‘ვე</territory>
+ </territories>
+ <keys>
+ <key type="calendar" draft="provisional">კáƒáƒšáƒ”ნდáƒáƒ áƒ˜</key>
+ <key type="currency" draft="provisional">ვáƒáƒšáƒ£áƒ¢áƒ</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation" draft="provisional">ტრáƒáƒ“იციული ჩინური</type>
+ <type type="buddhist" key="calendar" draft="provisional">ბუდისტური კáƒáƒšáƒ”ნდáƒáƒ áƒ˜</type>
+ <type type="chinese" key="calendar" draft="provisional">ჩინური კáƒáƒšáƒ”ნდáƒáƒ áƒ˜</type>
+ <type type="gb2312han" key="collation" draft="provisional">გáƒáƒ›áƒáƒ áƒ¢áƒ˜áƒ•áƒ”ბული ჩინური</type>
+ <type type="gregorian" key="calendar" draft="provisional">გრიგáƒáƒ áƒ˜áƒáƒœáƒ£áƒšáƒ˜ კáƒáƒšáƒ”ნდáƒáƒ áƒ˜</type>
+ <type type="hebrew" key="calendar" draft="provisional">ებრáƒáƒ£áƒšáƒ˜ კáƒáƒšáƒ”ნდáƒáƒ áƒ˜</type>
+ <type type="islamic" key="calendar" draft="provisional">ისლáƒáƒ›áƒ£áƒ áƒ˜ კáƒáƒšáƒ”ნდáƒáƒ áƒ˜</type>
+ <type type="islamic-civil" key="calendar" draft="provisional">ისლáƒáƒ›áƒ£áƒ áƒ˜ სáƒáƒ›áƒáƒ¥áƒáƒšáƒáƒ¥áƒ კáƒáƒšáƒ”ნდáƒáƒ áƒ˜</type>
+ <type type="japanese" key="calendar" draft="provisional">იáƒáƒžáƒáƒœáƒ£áƒ áƒ˜ კáƒáƒšáƒ”ნდáƒáƒ áƒ˜</type>
+ <type type="traditional" key="collation" draft="provisional">ტრáƒáƒ“იციული</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[რⴀ ბ ⴠგ ⴂ დ ⴃ ე ⴄ ვ ⴅ ზ ⴆ ჱ ⴡ თ ⴇ ი ⴈ კ ⴉ ლ ⴊ მ ⴋ ნ ⴌ ჲ ⴢ რⴠპ ⴎ ჟ ⴠრ ⴠს ⴑ ტ ⴒ ჳ ⴣ უ ⴓ ფ ⴔ ქ ⴕ ღ ⴖ ყ ⴗ შ ⴘ ჩ ⴙ ც ⴚ ძ ⴛ წ ⴜ ჭ ⴠხ ⴞ ჴ ⴤ ჯ ⴟ ჰ ⴠ ჵ ⴥ ჶ-ჺ]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="provisional">იáƒáƒœ</month>
+ <month type="2" draft="provisional">თებ</month>
+ <month type="3" draft="provisional">მáƒáƒ </month>
+ <month type="4" draft="provisional">áƒáƒžáƒ </month>
+ <month type="5" draft="provisional">მáƒáƒ˜</month>
+ <month type="6" draft="provisional">ივნ</month>
+ <month type="7" draft="provisional">ივლ</month>
+ <month type="8" draft="provisional">áƒáƒ’ვ</month>
+ <month type="9" draft="provisional">სექ</month>
+ <month type="10" draft="provisional">áƒáƒ¥áƒ¢</month>
+ <month type="11" draft="provisional">ნáƒáƒ”</month>
+ <month type="12" draft="provisional">დეკ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="provisional">იáƒáƒœáƒ•áƒáƒ áƒ˜</month>
+ <month type="2" draft="provisional">თებერვáƒáƒšáƒ˜</month>
+ <month type="3" draft="provisional">მáƒáƒ áƒ¢áƒ˜</month>
+ <month type="4" draft="provisional">áƒáƒžáƒ áƒ˜áƒšáƒ˜</month>
+ <month type="5" draft="provisional">მáƒáƒ˜áƒ¡áƒ˜</month>
+ <month type="6" draft="provisional">ივნისი</month>
+ <month type="7" draft="provisional">ივლისი</month>
+ <month type="8" draft="provisional">áƒáƒ’ვისტáƒ</month>
+ <month type="9" draft="provisional">სექტემბერი</month>
+ <month type="10" draft="provisional">áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი</month>
+ <month type="11" draft="provisional">ნáƒáƒ”მბერი</month>
+ <month type="12" draft="provisional">დეკემბერი</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="provisional">ი</month>
+ <month type="2" draft="provisional">თ</month>
+ <month type="3" draft="provisional">მ</month>
+ <month type="4" draft="provisional">áƒ</month>
+ <month type="5" draft="provisional">მ</month>
+ <month type="6" draft="provisional">ი</month>
+ <month type="7" draft="provisional">ი</month>
+ <month type="8" draft="provisional">áƒ</month>
+ <month type="9" draft="provisional">ს</month>
+ <month type="10" draft="provisional">áƒ</month>
+ <month type="11" draft="provisional">ნ</month>
+ <month type="12" draft="provisional">დ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="provisional">კვი</day>
+ <day type="mon" draft="provisional">áƒáƒ áƒ¨</day>
+ <day type="tue" draft="provisional">სáƒáƒ›</day>
+ <day type="wed" draft="provisional">áƒáƒ—ხ</day>
+ <day type="thu" draft="provisional">ხუთ</day>
+ <day type="fri" draft="provisional">პáƒáƒ </day>
+ <day type="sat" draft="provisional">შáƒáƒ‘</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="provisional">კვირáƒ</day>
+ <day type="mon" draft="provisional">áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი</day>
+ <day type="tue" draft="provisional">სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი</day>
+ <day type="wed" draft="provisional">áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი</day>
+ <day type="thu" draft="provisional">ხუთშáƒáƒ‘áƒáƒ—ი</day>
+ <day type="fri" draft="provisional">პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი</day>
+ <day type="sat" draft="provisional">შáƒáƒ‘áƒáƒ—ი</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="provisional">კ</day>
+ <day type="mon" draft="provisional">áƒ</day>
+ <day type="tue" draft="provisional">ს</day>
+ <day type="wed" draft="provisional">áƒ</day>
+ <day type="thu" draft="provisional">ხ</day>
+ <day type="fri" draft="provisional">პ</day>
+ <day type="sat" draft="provisional">შ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">I კვ.</quarter>
+ <quarter type="2">II კვ.</quarter>
+ <quarter type="3">III კვ.</quarter>
+ <quarter type="4">IV კვ.</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1-ლი კვáƒáƒ áƒ¢áƒáƒšáƒ˜</quarter>
+ <quarter type="2">მე-2 კვáƒáƒ áƒ¢áƒáƒšáƒ˜</quarter>
+ <quarter type="3">მე-3 კვáƒáƒ áƒ¢áƒáƒšáƒ˜</quarter>
+ <quarter type="4">მე-4 კვáƒáƒ áƒ¢áƒáƒšáƒ˜</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="provisional">სთ:წთ:წმ</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="provisional">სთ:წთ:წმ</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="provisional">სთ:წთ:წმ</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="provisional">სთ:წთ</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="MMMdd" draft="provisional">dd MMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">MM-dd</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyMMMEEEd" draft="provisional">EEE, d MMM, yy</dateFormatItem>
+ <dateFormatItem id="yyMMMd" draft="provisional">d MMM, yy</dateFormatItem>
+ <dateFormatItem id="yyMMdd" draft="provisional">dd/MM/yy</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="provisional">QQQQ yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName draft="provisional">ხáƒáƒœáƒ</displayName>
+ </field>
+ <field type="year">
+ <displayName draft="provisional">წელი</displayName>
+ </field>
+ <field type="month">
+ <displayName draft="provisional">თვე</displayName>
+ </field>
+ <field type="week">
+ <displayName draft="provisional">კვირáƒ</displayName>
+ </field>
+ <field type="day">
+ <displayName draft="provisional">დღე</displayName>
+ </field>
+ <field type="weekday">
+ <displayName draft="provisional">კვირის დღე</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName draft="provisional">დღის პერიáƒáƒ“ი</displayName>
+ </field>
+ <field type="hour">
+ <displayName draft="provisional">სáƒáƒáƒ—ი</displayName>
+ </field>
+ <field type="minute">
+ <displayName draft="provisional">წუთი</displayName>
+ </field>
+ <field type="second">
+ <displayName draft="provisional">წáƒáƒ›áƒ˜</displayName>
+ </field>
+ <field type="zone">
+ <displayName draft="provisional">ზáƒáƒœáƒ</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal draft="unconfirmed">,</decimal>
+ <group draft="unconfirmed"> </group>
+ </symbols>
+ <currencies>
+ <currency type="ADP">
+ <displayName draft="provisional">áƒáƒœáƒ“áƒáƒ áƒ£áƒšáƒ˜ პესეტáƒ</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName draft="provisional">გáƒáƒ”რთიáƒáƒœáƒ”ბული áƒáƒ áƒáƒ‘ული სáƒáƒ”მირáƒáƒ”ბის დირჰემი</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName draft="provisional">áƒáƒ•áƒ¦áƒáƒœáƒ˜ (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName draft="provisional">áƒáƒ•áƒ¦áƒáƒœáƒ˜</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName draft="provisional">áƒáƒšáƒ‘áƒáƒœáƒ£áƒ áƒ˜ ლეკი</displayName>
+ </currency>
+ <currency type="AMD">
+ <displayName draft="provisional">სáƒáƒ›áƒ®áƒ£áƒ áƒ˜ დრáƒáƒ›áƒ˜</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName draft="provisional">ნიდრელáƒáƒœáƒ“ების áƒáƒœáƒ¢áƒ˜áƒšáƒ˜áƒ˜áƒ¡ გულდენი</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName draft="provisional">áƒáƒœáƒ’áƒáƒšáƒ£áƒ áƒ˜ კვáƒáƒœáƒ–áƒ</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName draft="provisional">áƒáƒœáƒ’áƒáƒšáƒ£áƒ áƒ˜ კვáƒáƒœáƒ–რ(1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName draft="provisional">áƒáƒœáƒ’áƒáƒšáƒ£áƒ áƒ˜ áƒáƒ®áƒáƒšáƒ˜ კვáƒáƒœáƒ–რ(1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName draft="provisional">áƒáƒœáƒ’áƒáƒšáƒ£áƒ áƒ˜ მიტáƒáƒšáƒ”ბული კვáƒáƒœáƒ–რ(1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName draft="provisional">áƒáƒ áƒ’ენტინული áƒáƒ£áƒ¡áƒ¢áƒ áƒáƒšáƒ˜</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName draft="provisional">áƒáƒ áƒ’ენტინული პესრ(1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName draft="provisional">áƒáƒ áƒ’ენტინული პესáƒ</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName draft="provisional">áƒáƒ•áƒ¡áƒ¢áƒ áƒ˜áƒ£áƒšáƒ˜ შილინგი</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName draft="provisional">áƒáƒ•áƒ¡áƒ¢áƒ áƒáƒšáƒ˜áƒ£áƒ áƒ˜ დáƒáƒšáƒáƒ áƒ˜</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName draft="provisional">áƒáƒ áƒ£áƒ‘áƒáƒœáƒ£áƒšáƒ˜ გულდენი</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName draft="provisional">áƒáƒ–ერბáƒáƒ˜áƒ¯áƒáƒœáƒ£áƒšáƒ˜ მáƒáƒœáƒáƒ—ი</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName draft="provisional">ბáƒáƒ¡áƒœáƒ˜áƒ-ჰერცáƒáƒ’áƒáƒ•áƒ˜áƒœáƒáƒ¡ დინáƒáƒ áƒ˜</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName draft="provisional">ბáƒáƒ¡áƒœáƒ˜áƒ-ჰერცáƒáƒ’áƒáƒ•áƒ˜áƒœáƒáƒ¡ კáƒáƒœáƒ•áƒ”რტირებáƒáƒ“ი მáƒáƒ áƒ™áƒ</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName draft="provisional">ბáƒáƒ áƒ‘áƒáƒ“áƒáƒ¡áƒ£áƒšáƒ˜ დáƒáƒšáƒáƒ áƒ˜</displayName>
+ </currency>
+ <currency type="BDT">
+ <displayName draft="provisional">ბáƒáƒœáƒ’ლáƒáƒ“ეშური ტáƒáƒ™áƒ</displayName>
+ </currency>
+ <currency type="BEC">
+ <displayName draft="provisional">ბელგიური ფრáƒáƒœáƒ™áƒ˜ (კáƒáƒ•áƒ”რტირებáƒáƒ“ი)</displayName>
+ </currency>
+ <currency type="BEL">
+ <displayName draft="provisional">ბელგიური ფრáƒáƒœáƒ™áƒ˜ (ფინáƒáƒœáƒ¡áƒ£áƒ áƒ˜)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName draft="provisional">ბულგáƒáƒ áƒ£áƒšáƒ˜ მყáƒáƒ áƒ˜ ლევი</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName draft="provisional">ბულგáƒáƒ áƒ£áƒšáƒ˜ áƒáƒ®áƒáƒšáƒ˜ ლევი</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName draft="provisional">ბáƒáƒ°áƒ áƒ”ინული დინáƒáƒ áƒ˜</displayName>
+ </currency>
+ <currency type="BIF">
+ <displayName draft="provisional">ბურუნდიული ფრáƒáƒœáƒ™áƒ˜</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName draft="provisional">ბერმუდული დინáƒáƒ áƒ˜</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName draft="provisional">ბრუნეული დáƒáƒšáƒáƒ áƒ˜</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName draft="provisional">ბáƒáƒšáƒ˜áƒ•áƒ˜áƒáƒœáƒ</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName draft="provisional">ბáƒáƒšáƒ˜áƒ•áƒ˜áƒ£áƒ áƒ˜ პესáƒ</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName draft="provisional">ბრáƒáƒ–ილიური რეáƒáƒšáƒ˜</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="provisional">ჩინური უáƒáƒœáƒ˜</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName draft="provisional">ჩეხური კრáƒáƒœáƒ</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName draft="provisional">გერმáƒáƒœáƒ£áƒšáƒ˜ მáƒáƒ áƒ™áƒ</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName draft="provisional">ჯიბუტის ფრáƒáƒœáƒ™áƒ˜</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName draft="provisional">დáƒáƒœáƒ˜áƒ£áƒ áƒ˜ კრáƒáƒœáƒ</displayName>
+ </currency>
+ <currency type="DOP">
+ <displayName draft="provisional">დáƒáƒ›áƒ˜áƒœáƒ˜áƒ™áƒ£áƒ áƒ˜ პესáƒ</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName draft="provisional">áƒáƒšáƒŸáƒ˜áƒ áƒ˜áƒ£áƒšáƒ˜ დინáƒáƒ áƒ˜</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName draft="provisional">ეგვიპტური გირვáƒáƒœáƒ¥áƒ</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName draft="provisional">ესპáƒáƒœáƒ£áƒ áƒ˜ პესეტáƒ</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="provisional">ევრáƒ</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName draft="provisional">ფინური მáƒáƒ áƒ™áƒ</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName draft="provisional">ფიჯი დáƒáƒšáƒáƒ áƒ˜</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName draft="provisional">ფრáƒáƒœáƒ’ული ფრáƒáƒœáƒ™áƒ˜</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="provisional">ინგლისური გირვáƒáƒœáƒ¥áƒ სტერლინგი</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName draft="provisional">ქáƒáƒ áƒ—ული ლáƒáƒ áƒ˜</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="provisional">ინდური რუპიáƒ</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName draft="provisional">იტáƒáƒšáƒ˜áƒ£áƒ áƒ˜ ლირáƒ</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="provisional">იáƒáƒžáƒáƒœáƒ£áƒ áƒ˜ იენი</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName draft="provisional">მáƒáƒšáƒ“ივური რუფიáƒ</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="provisional">რუსული რუბლი</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="provisional">áƒáƒ¨áƒ¨ დáƒáƒšáƒáƒ áƒ˜</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ka_GE.xml b/libs/Zend/Locale/Data/ka_GE.xml
new file mode 100755
index 0000000000..94650adde2
--- /dev/null
+++ b/libs/Zend/Locale/Data/ka_GE.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.28 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ka"/>
+ <territory type="GE"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/kaj.xml b/libs/Zend/Locale/Data/kaj.xml
new file mode 100755
index 0000000000..03144421dc
--- /dev/null
+++ b/libs/Zend/Locale/Data/kaj.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.10 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="kaj"/>
+ </identity>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[a-z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">A̱yr</month>
+ <month type="2" draft="unconfirmed">A̱hw</month>
+ <month type="3" draft="unconfirmed">A̱ta</month>
+ <month type="4" draft="unconfirmed">A̱na</month>
+ <month type="5" draft="unconfirmed">A̱pf</month>
+ <month type="6" draft="unconfirmed">A̱ki</month>
+ <month type="7" draft="unconfirmed">A̱ty</month>
+ <month type="8" draft="unconfirmed">A̱ni</month>
+ <month type="9" draft="unconfirmed">A̱ku</month>
+ <month type="10" draft="unconfirmed">Swa</month>
+ <month type="11" draft="unconfirmed">Sby</month>
+ <month type="12" draft="unconfirmed">Sbh</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Hywan A̱yrnig</month>
+ <month type="2" draft="unconfirmed">Hywan A̱hwa</month>
+ <month type="3" draft="unconfirmed">Hywan A̱tat</month>
+ <month type="4" draft="unconfirmed">Hywan A̱naai</month>
+ <month type="5" draft="unconfirmed">Hywan A̱pfwon</month>
+ <month type="6" draft="unconfirmed">Hywan A̱kitat</month>
+ <month type="7" draft="unconfirmed">Hywan A̱tyirin</month>
+ <month type="8" draft="unconfirmed">Hywan A̱ninai</month>
+ <month type="9" draft="unconfirmed">Hywan A̱kumviriyin</month>
+ <month type="10" draft="unconfirmed">Hywan Swak</month>
+ <month type="11" draft="unconfirmed">Hywan Swak B'a̱yrnig</month>
+ <month type="12" draft="unconfirmed">Hywan Swak B'a̱hwa</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Lad</day>
+ <day type="mon" draft="unconfirmed">Lin</day>
+ <day type="tue" draft="unconfirmed">Tal</day>
+ <day type="wed" draft="unconfirmed">Lar</day>
+ <day type="thu" draft="unconfirmed">Lam</day>
+ <day type="fri" draft="unconfirmed">Jum</day>
+ <day type="sat" draft="unconfirmed">Asa</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Ladi</day>
+ <day type="mon" draft="unconfirmed">Lintani</day>
+ <day type="tue" draft="unconfirmed">Talata</day>
+ <day type="wed" draft="unconfirmed">Larba</day>
+ <day type="thu" draft="unconfirmed">Lamit</day>
+ <day type="fri" draft="unconfirmed">Juma</day>
+ <day type="sat" draft="unconfirmed">Asabar</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">A.M.</am>
+ <pm draft="unconfirmed">P.M.</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">Gabanin Miladi</era>
+ <era type="1" draft="unconfirmed">Miladi</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">G.M.</era>
+ <era type="1" draft="unconfirmed">M.</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="NGN">
+ <displayName draft="unconfirmed">A̱naira</displayName>
+ <symbol draft="unconfirmed">₦</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/kaj_NG.xml b/libs/Zend/Locale/Data/kaj_NG.xml
new file mode 100755
index 0000000000..4a43b0de95
--- /dev/null
+++ b/libs/Zend/Locale/Data/kaj_NG.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.6 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="kaj"/>
+ <territory type="NG"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/kam.xml b/libs/Zend/Locale/Data/kam.xml
new file mode 100755
index 0000000000..3ef6aa6f3b
--- /dev/null
+++ b/libs/Zend/Locale/Data/kam.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.13 $"/>
+ <generation date="$Date: 2006/07/11 19:26:44 $"/>
+ <language type="kam"/>
+ </identity>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[a-e g-o r-w y z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Mwei wa mbee</month>
+ <month type="2" draft="unconfirmed">Mwei wa keli</month>
+ <month type="3" draft="unconfirmed">Mwei wa katatu</month>
+ <month type="4" draft="unconfirmed">Mwei wa kanne</month>
+ <month type="5" draft="unconfirmed">Mwei wa katano</month>
+ <month type="6" draft="unconfirmed">Mwei wa thanthatu</month>
+ <month type="7" draft="unconfirmed">Mwei wa muonza</month>
+ <month type="8" draft="unconfirmed">Mwei wa nyanya</month>
+ <month type="9" draft="unconfirmed">Mwei wa kenda</month>
+ <month type="10" draft="unconfirmed">Mwei wa ikumi</month>
+ <month type="11" draft="unconfirmed">Mwei wa ikumi na imwe</month>
+ <month type="12" draft="unconfirmed">Mwei wa ikumi na ili</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Mwei wa mbee</month>
+ <month type="2" draft="unconfirmed">Mwei wa keli</month>
+ <month type="3" draft="unconfirmed">Mwei wa katatu</month>
+ <month type="4" draft="unconfirmed">Mwei wa kanne</month>
+ <month type="5" draft="unconfirmed">Mwei wa katano</month>
+ <month type="6" draft="unconfirmed">Mwei wa thanthatu</month>
+ <month type="7" draft="unconfirmed">Mwei wa muonza</month>
+ <month type="8" draft="unconfirmed">Mwei wa nyanya</month>
+ <month type="9" draft="unconfirmed">Mwei wa kenda</month>
+ <month type="10" draft="unconfirmed">Mwei wa ikumi</month>
+ <month type="11" draft="unconfirmed">Mwei wa ikumi na imwe</month>
+ <month type="12" draft="unconfirmed">Mwei wa ikumi na ili</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Jpl</day>
+ <day type="mon" draft="unconfirmed">Jtt</day>
+ <day type="tue" draft="unconfirmed">Jnn</day>
+ <day type="wed" draft="unconfirmed">Jtn</day>
+ <day type="thu" draft="unconfirmed">Alh</day>
+ <day type="fri" draft="unconfirmed">Ijm</day>
+ <day type="sat" draft="unconfirmed">Jms</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Jumapili</day>
+ <day type="mon" draft="unconfirmed">Jumatatu</day>
+ <day type="tue" draft="unconfirmed">Jumanne</day>
+ <day type="wed" draft="unconfirmed">Jumatano</day>
+ <day type="thu" draft="unconfirmed">Alamisi</day>
+ <day type="fri" draft="unconfirmed">Ijumaa</day>
+ <day type="sat" draft="unconfirmed">Jumamosi</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">mbee wa yesu</era>
+ <era type="1" draft="unconfirmed">IY</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">MY</era>
+ <era type="1" draft="unconfirmed">IY</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="KES">
+ <displayName draft="unconfirmed">Silingi ya Kenya</displayName>
+ <symbol draft="unconfirmed">KSh</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/kam_KE.xml b/libs/Zend/Locale/Data/kam_KE.xml
new file mode 100755
index 0000000000..2c86032fd8
--- /dev/null
+++ b/libs/Zend/Locale/Data/kam_KE.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="kam"/>
+ <territory type="KE"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/kcg.xml b/libs/Zend/Locale/Data/kcg.xml
new file mode 100755
index 0000000000..cb65cded15
--- /dev/null
+++ b/libs/Zend/Locale/Data/kcg.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.11 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="kcg"/>
+ </identity>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[a {a̱} b {ch} {chy} d-g {gb} {gh} {ghw} {ghy} i {i̱} j {jhy} k {kh} {kp} l-n {ng} {ny} o p r s {sh} {shy} t {ts} u-w y z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Juw</month>
+ <month type="2" draft="unconfirmed">Swi</month>
+ <month type="3" draft="unconfirmed">Tsa</month>
+ <month type="4" draft="unconfirmed">Nya</month>
+ <month type="5" draft="unconfirmed">Tsw</month>
+ <month type="6" draft="unconfirmed">Ata</month>
+ <month type="7" draft="unconfirmed">Ana</month>
+ <month type="8" draft="unconfirmed">Ari</month>
+ <month type="9" draft="unconfirmed">Aku</month>
+ <month type="10" draft="unconfirmed">Swa</month>
+ <month type="11" draft="unconfirmed">Man</month>
+ <month type="12" draft="unconfirmed">Mas</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Zwat Juwung</month>
+ <month type="2" draft="unconfirmed">Zwat Swiyang</month>
+ <month type="3" draft="unconfirmed">Zwat Tsat</month>
+ <month type="4" draft="unconfirmed">Zwat Nyai</month>
+ <month type="5" draft="unconfirmed">Zwat Tswon</month>
+ <month type="6" draft="unconfirmed">Zwat Ataah</month>
+ <month type="7" draft="unconfirmed">Zwat Anatat</month>
+ <month type="8" draft="unconfirmed">Zwat Arinai</month>
+ <month type="9" draft="unconfirmed">Zwat Akubunyung</month>
+ <month type="10" draft="unconfirmed">Zwat Swag</month>
+ <month type="11" draft="unconfirmed">Zwat Mangjuwang</month>
+ <month type="12" draft="unconfirmed">Zwat Swag-Ma-Suyang</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Lad</day>
+ <day type="mon" draft="unconfirmed">Tan</day>
+ <day type="tue" draft="unconfirmed">Tal</day>
+ <day type="wed" draft="unconfirmed">Lar</day>
+ <day type="thu" draft="unconfirmed">Lam</day>
+ <day type="fri" draft="unconfirmed">Jum</day>
+ <day type="sat" draft="unconfirmed">Asa</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Ladi</day>
+ <day type="mon" draft="unconfirmed">Tanii</day>
+ <day type="tue" draft="unconfirmed">Talata</day>
+ <day type="wed" draft="unconfirmed">Larba</day>
+ <day type="thu" draft="unconfirmed">Lamit</day>
+ <day type="fri" draft="unconfirmed">Juma</day>
+ <day type="sat" draft="unconfirmed">Asabat</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">Gabanin Miladi</era>
+ <era type="1" draft="unconfirmed">Miladi</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">GM</era>
+ <era type="1" draft="unconfirmed">M</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="NGN">
+ <displayName draft="unconfirmed">Nera</displayName>
+ <symbol draft="unconfirmed">₦</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/kcg_NG.xml b/libs/Zend/Locale/Data/kcg_NG.xml
new file mode 100755
index 0000000000..12735cdbba
--- /dev/null
+++ b/libs/Zend/Locale/Data/kcg_NG.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="kcg"/>
+ <territory type="NG"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/kfo.xml b/libs/Zend/Locale/Data/kfo.xml
new file mode 100755
index 0000000000..9043e92447
--- /dev/null
+++ b/libs/Zend/Locale/Data/kfo.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.12 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="kfo"/>
+ </identity>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[a Ä b-e Ä“ f g {gb} h-k {kh} l-p {pk} r-u w y z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Wey</month>
+ <month type="2" draft="unconfirmed">Fan</month>
+ <month type="3" draft="unconfirmed">Tat</month>
+ <month type="4" draft="unconfirmed">Nan</month>
+ <month type="5" draft="unconfirmed">Tuy</month>
+ <month type="6" draft="unconfirmed">Tso</month>
+ <month type="7" draft="unconfirmed">Taf</month>
+ <month type="8" draft="unconfirmed">War</month>
+ <month type="9" draft="unconfirmed">Kun</month>
+ <month type="10" draft="unconfirmed">Ban</month>
+ <month type="11" draft="unconfirmed">Kom</month>
+ <month type="12" draft="unconfirmed">Sau</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Fai Weyene</month>
+ <month type="2" draft="unconfirmed">Fai Fani</month>
+ <month type="3" draft="unconfirmed">Fai Tataka</month>
+ <month type="4" draft="unconfirmed">Fai Nangra</month>
+ <month type="5" draft="unconfirmed">Fai Tuyo</month>
+ <month type="6" draft="unconfirmed">Fai Tsoyi</month>
+ <month type="7" draft="unconfirmed">Fai Tafaka</month>
+ <month type="8" draft="unconfirmed">Fai Warachi</month>
+ <month type="9" draft="unconfirmed">Fai Kunobok</month>
+ <month type="10" draft="unconfirmed">Fai Bansok</month>
+ <month type="11" draft="unconfirmed">Fai Kom</month>
+ <month type="12" draft="unconfirmed">Fai Sauk</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Lah</day>
+ <day type="mon" draft="unconfirmed">Kub</day>
+ <day type="tue" draft="unconfirmed">Gba</day>
+ <day type="wed" draft="unconfirmed">Tan</day>
+ <day type="thu" draft="unconfirmed">Yei</day>
+ <day type="fri" draft="unconfirmed">Koy</day>
+ <day type="sat" draft="unconfirmed">Sat</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Lahadi</day>
+ <day type="mon" draft="unconfirmed">Je-Kubacha</day>
+ <day type="tue" draft="unconfirmed">Je-Gbai</day>
+ <day type="wed" draft="unconfirmed">Tansati</day>
+ <day type="thu" draft="unconfirmed">Je-Yei</day>
+ <day type="fri" draft="unconfirmed">Je-Koye</day>
+ <day type="sat" draft="unconfirmed">Sati</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">Kafi Mar Wenom</era>
+ <era type="1" draft="unconfirmed">Bayan Chi Wenom</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">KMW</era>
+ <era type="1" draft="unconfirmed">BCW</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="NGN">
+ <displayName draft="unconfirmed">Neira</displayName>
+ <symbol draft="unconfirmed">₦</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/kfo_NG.xml b/libs/Zend/Locale/Data/kfo_NG.xml
new file mode 100755
index 0000000000..4ed14473d5
--- /dev/null
+++ b/libs/Zend/Locale/Data/kfo_NG.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="kfo"/>
+ <territory type="NG"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/kk.xml b/libs/Zend/Locale/Data/kk.xml
new file mode 100755
index 0000000000..cb63ab006f
--- /dev/null
+++ b/libs/Zend/Locale/Data/kk.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="kk"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="kk">Қазақ</language>
+ </languages>
+ <territories>
+ <territory type="KZ">ҚазақÑтан</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[а Ó™ б-е Ñ‘ ж-й Ñ– к Ò› л-н Ò£ о-у Ò± Ò¯ Ñ„-Ñ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[Ò»]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">қаң.</month>
+ <month type="2">ақп.</month>
+ <month type="3">нау.</month>
+ <month type="4">Ñәу.</month>
+ <month type="5">мам.</month>
+ <month type="6">мау.</month>
+ <month type="7">шіл.</month>
+ <month type="8">там.</month>
+ <month type="9">қыр.</month>
+ <month type="10">қаз.</month>
+ <month type="11">қар.</month>
+ <month type="12">желт.</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">қаңтар</month>
+ <month type="2">ақпан</month>
+ <month type="3">наурыз</month>
+ <month type="4">Ñәуір</month>
+ <month type="5">мамыр</month>
+ <month type="6">мауÑым</month>
+ <month type="7">шілде</month>
+ <month type="8">тамыз</month>
+ <month type="9">қыркүйек</month>
+ <month type="10">қазан</month>
+ <month type="11">қараша</month>
+ <month type="12">желтоқÑан</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">жÑ.</day>
+ <day type="mon">дÑ.</day>
+ <day type="tue">ÑÑ.</day>
+ <day type="wed">ÑÑ€.</day>
+ <day type="thu">бÑ.</day>
+ <day type="fri">жм.</day>
+ <day type="sat">ÑÒ».</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">жекÑені</day>
+ <day type="mon">дуйÑенбі</day>
+ <day type="tue">ÑейÑенбі</day>
+ <day type="wed">Ñәренбі</day>
+ <day type="thu">бейÑенбі</day>
+ <day type="fri">жұма</day>
+ <day type="sat">Ñенбі</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d MMMM yyyy 'ж.'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy 'ж.'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd.MM.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd.MM.yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMdd" draft="provisional">dd.MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM.yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy 'ж.'</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <currencies>
+ <currency type="KZT">
+ <symbol>тңг.</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>иә:и</yesstr>
+ <nostr>жоқ:ж</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/kk_KZ.xml b/libs/Zend/Locale/Data/kk_KZ.xml
new file mode 100755
index 0000000000..86728653f3
--- /dev/null
+++ b/libs/Zend/Locale/Data/kk_KZ.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.31 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="kk"/>
+ <territory type="KZ"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤;-¤ #,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/kl.xml b/libs/Zend/Locale/Data/kl.xml
new file mode 100755
index 0000000000..7e3f3a6532
--- /dev/null
+++ b/libs/Zend/Locale/Data/kl.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.33 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="kl"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="kl">kalaallisut</language>
+ </languages>
+ <territories>
+ <territory type="GL">Kalaallit Nunaat</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a á-ã b-e é ê f-i í î ĩ j-o ô p q ĸ r-u ú û ũ v-z æ ø å]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">jan</month>
+ <month type="2">feb</month>
+ <month type="3">mar</month>
+ <month type="4">apr</month>
+ <month type="5">maj</month>
+ <month type="6">jun</month>
+ <month type="7">jul</month>
+ <month type="8">aug</month>
+ <month type="9">sep</month>
+ <month type="10">okt</month>
+ <month type="11">nov</month>
+ <month type="12">dec</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">januari</month>
+ <month type="2">februari</month>
+ <month type="3">martsi</month>
+ <month type="4">aprili</month>
+ <month type="5">maji</month>
+ <month type="6">juni</month>
+ <month type="7">juli</month>
+ <month type="8">augustusi</month>
+ <month type="9">septemberi</month>
+ <month type="10">oktoberi</month>
+ <month type="11">novemberi</month>
+ <month type="12">decemberi</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">sab</day>
+ <day type="mon">ata</day>
+ <day type="tue">mar</day>
+ <day type="wed">pin</day>
+ <day type="thu">sis</day>
+ <day type="fri">tal</day>
+ <day type="sat">arf</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">sabaat</day>
+ <day type="mon">ataasinngorneq</day>
+ <day type="tue">marlunngorneq</day>
+ <day type="wed">pingasunngorneq</day>
+ <day type="thu">sisamanngorneq</day>
+ <day type="fri">tallimanngorneq</day>
+ <day type="sat">arfininngorneq</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="DKK">
+ <symbol>kr</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/kl_GL.xml b/libs/Zend/Locale/Data/kl_GL.xml
new file mode 100755
index 0000000000..55dd483550
--- /dev/null
+++ b/libs/Zend/Locale/Data/kl_GL.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.34 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="kl"/>
+ <territory type="GL"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>MMM dd,yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;¤ -#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/km.xml b/libs/Zend/Locale/Data/km.xml
new file mode 100755
index 0000000000..7de51010b0
--- /dev/null
+++ b/libs/Zend/Locale/Data/km.xml
@@ -0,0 +1,520 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.45 $"/>
+ <generation date="$Date: 2006/06/28 04:18:18 $"/>
+ <language type="km"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">ភាសាអាហ្វារ</language>
+ <language type="ae">ភាសាអាវែស្ážáž„់</language>
+ <language type="af">ភាសាអាហ្វ្រីកាអាន</language>
+ <language type="an">ភាសាអារ៉ាហ្គោន</language>
+ <language type="ar">ភាសាអារ៉ាប់</language>
+ <language type="ay">ភាសាអីម៉ារ៉ា</language>
+ <language type="az">ភាសាអាហ៊្សែរបែហ្សង់</language>
+ <language type="be">ភាសាបáŸáž¡áž¶ážšáž»ážŸáŸ’ស</language>
+ <language type="bg">ភាសាប៊ុលហ្ការី</language>
+ <language type="bh">ភាសាបិហារ</language>
+ <language type="bm">ភាសាបាម្បារា</language>
+ <language type="bn">ភាសាបáŸáž“្កាលី</language>
+ <language type="bo">ភាសាទីបáŸ</language>
+ <language type="ca">ភាសាកាážáž¶áž¡áž¶áž“</language>
+ <language type="cs">ភាសាឆáŸáž€</language>
+ <language type="da">ភាសាដាណឺម៉ាក</language>
+ <language type="de">ភាសាអាល្លឺម៉ង់</language>
+ <language type="dz">ភាសាប៊ូážáž¶áž“</language>
+ <language type="el">ភាសាក្រិច</language>
+ <language type="en">ភាសាអង់គ្លáŸážŸ</language>
+ <language type="eo">ភាសាអáŸážŸáŸ’áž–áŸážšáŸ‰áž¶áž“្ទោ</language>
+ <language type="es">ភាសាអáŸážŸáŸ’ប៉ាញ</language>
+ <language type="et">ភាសាអáŸážŸáŸ’ážáž¼áž“ី</language>
+ <language type="eu">ភាសាបាស្កáŸ</language>
+ <language type="fi">ភាសាហ្វាំងឡង់</language>
+ <language type="fj">ហ្វ៉ីហ្ស៉ី</language>
+ <language type="fr">ភាសាបារាំង</language>
+ <language type="ga">ភាសាហ្កែលិគ</language>
+ <language type="gd">ភាសាហ្កែលិគ [gd]</language>
+ <language type="gl">ភាសាហ្កាលីស៉ី</language>
+ <language type="gn">ភាសាហ្កួរ៉ានី</language>
+ <language type="gu">ភាសាហ្កុយ៉ារាទី</language>
+ <language type="he">ភាសាហáŸáž”្រិ</language>
+ <language type="hi">ភាសាហ៉ិនឌី</language>
+ <language type="hu">ភាសាហុងគ្រី</language>
+ <language type="hy">ភាសាអារមáŸáž“ី</language>
+ <language type="id">ភាសាឥណ្ឌូនáŸážŸáŸŠáž¸</language>
+ <language type="is">ភាសាអ៉ីស្លង់</language>
+ <language type="it">ភាសាអ៊ីážáž¶áž›áž¸</language>
+ <language type="ja">ភាសាជប៉ុន</language>
+ <language type="jv">ភាសាយ៉ាវា</language>
+ <language type="ka">ភាសាហ្សកហ្ស៉ី</language>
+ <language type="kk">ភាសាកាហ្សាក់ស្ážáž„់់</language>
+ <language type="km">ភាសាážáŸ’មែរ</language>
+ <language type="kn">ភាសាកិណាដា</language>
+ <language type="ko">ភាសាកូរ៉áŸ</language>
+ <language type="ku">ភាសាឃឺដ</language>
+ <language type="ky">ភាសាគៀរហ្គីស្ážáž„់</language>
+ <language type="la">ភាសាឡាážáŸ†áž¶áž„</language>
+ <language type="lo">ភាសាឡាវ</language>
+ <language type="lt">ភាសាលីទុយអានី</language>
+ <language type="lv">ភាសាឡាážážœáž¸áž™áŸ‰áž¶</language>
+ <language type="mg">ភាសាម៉ាដាហ្កាសការ</language>
+ <language type="mi">ភាសាម៉ោរី</language>
+ <language type="mk">ភាសាម៉ាសáŸážŠáž¼áž“ី</language>
+ <language type="ml">ភាសាម៉ាឡាឡាយ៉ាន</language>
+ <language type="mn">ភាសាម៉ុងហ្គោលី</language>
+ <language type="mo">ភាសាម៉ុលដាវី</language>
+ <language type="mr">ភាសាម៉ារាធី</language>
+ <language type="ms">ភាសាម៉ាលáŸážŸáŸ‰áž¸</language>
+ <language type="mt">ភាសាម៉ាល់ážáž¶</language>
+ <language type="ne">ភាសានáŸáž”៉ាល់</language>
+ <language type="nl">ភាសាហុល្លង់</language>
+ <language type="no">ភាសានáŸážšážœáŸ‚ស</language>
+ <language type="or">ភាសាអូរីយ៉ា</language>
+ <language type="pa">ភាសាពូនយ៉ាប៊ី</language>
+ <language type="pl">ភាសាប៉ូឡូញ</language>
+ <language type="pt">ភាសាពáŸážšáž‘ុយហ្កាល់</language>
+ <language type="qu">ភាសាកáŸáž‘្ជូអា</language>
+ <language type="rn">ភាសារូន្ឌី</language>
+ <language type="ro">ភាសារូម៉ានី</language>
+ <language type="ru">ភាសាรัរូស្ស៉ី</language>
+ <language type="sa">ភាសាសំស្ក្រឹáž</language>
+ <language type="sd">ភាសាស៉ីន្ដី</language>
+ <language type="sk">ភាសាស្លូវ៉ាគី</language>
+ <language type="sl">ភាសាស្លូវ៉ានី</language>
+ <language type="sm">ភាសាសាមូអា</language>
+ <language type="so">ភាសាសូម៉ាលី</language>
+ <language type="sq">ភាសាអាល់បានី</language>
+ <language type="su">ភាំសាស៊ូដង់</language>
+ <language type="sv">ភាសាស៊ុយអែដ</language>
+ <language type="sw">ភាសាស្វាហ៉ីលី</language>
+ <language type="ta">ភាសាážáž¶áž˜áž¸áž›</language>
+ <language type="te">ភាសាážáŸáž›áž¼áž áŸ’áž‚áž¼</language>
+ <language type="tg">ភាសាážáž¶ážŠáž áŸ’ស៉ីគីស្ážáž„់</language>
+ <language type="th">ភាសាážáŸƒ</language>
+ <language type="tk">ភាសាទួគមáŸáž“ីស្ážáž„់</language>
+ <language type="to">ភាសាážáž»áž„ហ្គោ</language>
+ <language type="tr">ភាសាទួរគី</language>
+ <language type="tt">ភាសាážáž¶ážáž¶ážš</language>
+ <language type="uk">ភាសាអ៊ុយក្រែន</language>
+ <language type="ur">ភាសាអ៊ូរ្ឌូ</language>
+ <language type="uz">ភាសាអ៊ូហ្សបáŸáž‚ីស្ážáž„់</language>
+ <language type="vi">ភាសាវៀážážŽáž¶áž˜</language>
+ <language type="xh">ភាសាឃសា</language>
+ <language type="yi">ភាសាយីឌីហ្ស</language>
+ <language type="yo">ភាសាយរូបា</language>
+ <language type="za">ភាសាចួង</language>
+ <language type="zh">ភាសាចិន</language>
+ <language type="zu">ភាសាហ្ស៉ូលូ</language>
+ </languages>
+ <territories>
+ <territory type="AD">អានដូរ៉ា</territory>
+ <territory type="AE">អáŸáž˜áž¸ážšáŸ‰áŸ‚ទអារ៉ាប់រួម</territory>
+ <territory type="AF">អាហ្វហ្គានីស្ážáž¶áž“</territory>
+ <territory type="AL">អាល់បានី</territory>
+ <territory type="AM">អារមáŸáž“ី</territory>
+ <territory type="AO">អង់ហ្គោឡា</territory>
+ <territory type="AR">អាហ្សង់ទីន</territory>
+ <territory type="AT">អូទ្រីស</territory>
+ <territory type="AU">អូស្ážáŸ’រាលី</territory>
+ <territory type="AZ">អាហ៊្សែរបែហ្សង់</territory>
+ <territory type="BA">បូស្ន៉ី</territory>
+ <territory type="BB">បារបាដូស</territory>
+ <territory type="BD">បង់ក្លាដáŸážŸáŸ’áž </territory>
+ <territory type="BE">បែលហ្ស៉ិក</territory>
+ <territory type="BF">ប៊ូរគីណាហ្វាសូ</territory>
+ <territory type="BG">ប៊ុលហ្គារី</territory>
+ <territory type="BH">បារ៉ែន</territory>
+ <territory type="BI">ប៊ូរុនឌី</territory>
+ <territory type="BJ">áž”áŸážŽáž¶áŸ†áž„</territory>
+ <territory type="BN">ប៊្រុយណáŸ</territory>
+ <territory type="BO">បូលីវី</territory>
+ <territory type="BR">ប្រáŸážŸáŸŠáž¸áž›</territory>
+ <territory type="BS">បាហាម៉ា</territory>
+ <territory type="BT">ប៊ូážáž¶áž“</territory>
+ <territory type="BW">បុážážŸáŸ’វាណា</territory>
+ <territory type="BY">áž”áŸáž¡áž¶ážšáž»ážŸáŸ’ស</territory>
+ <territory type="BZ">áž”áŸáž›áž¸áž áŸ’ស</territory>
+ <territory type="CA">កាណាដា</territory>
+ <territory type="CF">សាធារណរដ្ឋអាហ្វ្រិកកណ្ដាល</territory>
+ <territory type="CG">កុងហ្គោ</territory>
+ <territory type="CH">ស្វីស</territory>
+ <territory type="CI">កូដឌីវáŸážš</territory>
+ <territory type="CL">ឈីលី</territory>
+ <territory type="CM">កាមáŸážšáž¼áž“</territory>
+ <territory type="CN">áž…áž·áž“</territory>
+ <territory type="CO">កូឡុំប៊ី</territory>
+ <territory type="CR">កូស្ážáž¶ážšáž¸áž€áž¶</territory>
+ <territory type="CU">គុយបា</territory>
+ <territory type="CV">កាបវែរ</territory>
+ <territory type="CY">ស៉ីពរáŸ</territory>
+ <territory type="CZ">សាធារណរដ្ឋឆáŸáž€</territory>
+ <territory type="DE">អាល្លឺម៉ង់</territory>
+ <territory type="DJ">ហ្ស៉ីបូទី</territory>
+ <territory type="DK">ដាណឺម៉ាក</territory>
+ <territory type="DM">ដូមីនីកា</territory>
+ <territory type="DO">សាធារណរដ្ឋដូមីនីកែន</territory>
+ <territory type="DZ">អាល់ហ្សáŸážšáž¸</territory>
+ <territory type="EC">អáŸáž€áŸ’វាឌáŸážš</territory>
+ <territory type="EE">អáŸážŸáŸ’ážáž¼áž“ី</territory>
+ <territory type="EG">អáŸáž áŸ’ស៉ីប</territory>
+ <territory type="EH">សាហារ៉ាážáž¶áž„លិច</territory>
+ <territory type="ER">អáŸážšáž¸áž‘្រា</territory>
+ <territory type="ES">អáŸážŸáŸ’ប៉ាញ</territory>
+ <territory type="ET">អáŸážáŸ’យូពី</territory>
+ <territory type="FI">ហ្វាំងឡង់</territory>
+ <territory type="FJ">ហ្វ៉ីហ្ស៉ី</territory>
+ <territory type="FM">មិក្រូនáŸážŸáŸŠáž¸</territory>
+ <territory type="FR">បារាំង</territory>
+ <territory type="GA">ហ្គាបុង</territory>
+ <territory type="GE">ហ្សកហ្ស៉ី</territory>
+ <territory type="GH">ហ្កាណា</territory>
+ <territory type="GM">ហ្គាំប៊ី</territory>
+ <territory type="GN">ហ្គីណáŸ</territory>
+ <territory type="GQ">ហ្គីណáŸáž¢áŸáž€áŸ’វាទáŸážš</territory>
+ <territory type="GR">ក្រិច</territory>
+ <territory type="GT">ហ្គាážáŸáž˜áŸ‰áž¶áž¡áž¶</territory>
+ <territory type="GW">ហ្គីណáŸáž”៊ីសូ</territory>
+ <territory type="GY">ហ្គីយ៉ាណា</territory>
+ <territory type="HK">ហុងកុង</territory>
+ <territory type="HN">ហុងឌួរ៉ាស់</territory>
+ <territory type="HR">ក្រូអាស៊ី</territory>
+ <territory type="HT">ហៃទី</territory>
+ <territory type="HU">ហុងគ្រី</territory>
+ <territory type="ID">ឥណ្ឌូនáŸážŸáŸŠáž¸</territory>
+ <territory type="IE">អៀរឡង់</territory>
+ <territory type="IL">អ៊ីស្រាអែល</territory>
+ <territory type="IN">ឥណ្ឌា</territory>
+ <territory type="IQ">អ៊ីរ៉ាក់</territory>
+ <territory type="IR">អ៊ីរ៉ង់</territory>
+ <territory type="IS">អ៉ីស្លង់</territory>
+ <territory type="IT">អ៊ីážáž¶áž›áž¸</territory>
+ <territory type="JM">ហ្សាម៉ាអ៉ិគ</territory>
+ <territory type="JO">ហ៊្សកដានី</territory>
+ <territory type="JP">ជប៉ុន</territory>
+ <territory type="KE">កáŸáž“យ៉ា</territory>
+ <territory type="KG">គៀរហ្គីស្ážáž„់</territory>
+ <territory type="KH">កម្ពុជា</territory>
+ <territory type="KI">គិរិបាទី</territory>
+ <territory type="KM">កុំម៉ូរ៉ូស</territory>
+ <territory type="KP">សាធារណរដ្ឋប្រជាធិបážáŸáž™áŸ’យប្រជាមានិážáž€áž¼ážšáŸ‰áŸ</territory>
+ <territory type="KR">សាធារណរដ្ឋកូរ៉áŸ</territory>
+ <territory type="KW">គុយវ៉ែáž</territory>
+ <territory type="KZ">កាហ្សាក់ស្ážáž¶áž„់់</territory>
+ <territory type="LA">ឡាវ</territory>
+ <territory type="LB">លីបង់</territory>
+ <territory type="LI">លិចទáŸáž“ស្ážáŸ‚áž“</territory>
+ <territory type="LK">ស្រីលង្កា</territory>
+ <territory type="LR">លីបáŸážšáž¸áž™áŸ‰áž¶</territory>
+ <territory type="LS">លើសូážáž¼</territory>
+ <territory type="LT">លីទុយអានី</territory>
+ <territory type="LU">លុចហ្សំបួរ</territory>
+ <territory type="LV">ឡាážážœáž¸áž™áŸ‰áž¶</territory>
+ <territory type="LY">លីប៊ី</territory>
+ <territory type="MA">ម៉ារ៉ុក</territory>
+ <territory type="MC">ម៉ូណាកូ</territory>
+ <territory type="MD">សាធារណរដ្ឋម៉ុលដាវី</territory>
+ <territory type="MG">ម៉ាដាហ្កាស្ការ</territory>
+ <territory type="MK">ម៉ាសáŸážŠáž“</territory>
+ <territory type="ML">ម៉ាលី</territory>
+ <territory type="MM">មីយ៉ាន់ម៉ា</territory>
+ <territory type="MN">ម៉ុងហ្គោលី</territory>
+ <territory type="MR">ម៉ូរីážáž¶áž“ី</territory>
+ <territory type="MT">ម៉ាល់ážáž¶</territory>
+ <territory type="MU">ម៉ូរីទុស</territory>
+ <territory type="MX">ម៉ិចសិក</territory>
+ <territory type="MY">ម៉ាលáŸážŸáŸ‰áž¸</territory>
+ <territory type="MZ">ម៉ូហ្សាំប៊ិក</territory>
+ <territory type="NA">ណាមីប៊ី</territory>
+ <territory type="NE">នីហ្សáŸážš</territory>
+ <territory type="NG">នីហ្សáŸážšáž¸áž™áŸ‰áž¶</territory>
+ <territory type="NI">នីការ៉ាហ្គáŸážš</territory>
+ <territory type="NL">ហូល្លង់</territory>
+ <territory type="NO">áž“áŸážšážœáŸ‚ស</territory>
+ <territory type="NP">áž“áŸáž”៉ាល់</territory>
+ <territory type="NZ">នូវែលហ្សáŸáž¡áž„់</territory>
+ <territory type="OM">អូម៉ង់</territory>
+ <territory type="PA">ប៉ាណាម៉ា</territory>
+ <territory type="PE">ប៉áŸážšáž¼</territory>
+ <territory type="PG">ប៉ាពូអានូវែលហ្គីណáŸ</territory>
+ <territory type="PH">ហ្វ៉ីលីពីន</territory>
+ <territory type="PK">ប៉ាគីស្ážáž¶áž“</territory>
+ <territory type="PL">ប៉ូលូញ</territory>
+ <territory type="PR">áž–áŸážšážáž¼ážšáž¸áž€áž¼</territory>
+ <territory type="PS">ប៉ាលáŸážŸáŸ’ទីន</territory>
+ <territory type="PT">áž–áŸážšáž‘ុយហ្កាល់</territory>
+ <territory type="PY">ប៉ារ៉ាហ្គាយ</territory>
+ <territory type="QA">កាážáž¶ážš</territory>
+ <territory type="RO">រូម៉ានី</territory>
+ <territory type="RU">រូស្ស៊ី</territory>
+ <territory type="RW">រវ៉ាន់ដា</territory>
+ <territory type="SA">អារ៉ាប៊ីសាអ៊ូឌីáž</territory>
+ <territory type="SC">សីសែល</territory>
+ <territory type="SD">ស៊ូដង់</territory>
+ <territory type="SE">ស៊ុយអែដ</territory>
+ <territory type="SG">សិង្ហបុរី</territory>
+ <territory type="SI">ស្លូវáŸáž“ី</territory>
+ <territory type="SK">ស្លូវ៉ាគី</territory>
+ <territory type="SL">សáŸážšáŸ‰áž¶áž¡áŸáž¢áž¼áž“</territory>
+ <territory type="SN">សáŸáž“áŸáž áŸ’កាល់</territory>
+ <territory type="SO">សូម៉ាលី</territory>
+ <territory type="SR">សូរីណាម</territory>
+ <territory type="SV">អែលសាល់វ៉ាឌáŸážš</territory>
+ <territory type="SY">ស៊ីរី</territory>
+ <territory type="SZ">សូហ្ស៉ីឡង់</territory>
+ <territory type="TD">ឆាដ</territory>
+ <territory type="TG">ážáž¼áž áŸ’áž‚áž¼</territory>
+ <territory type="TH">ážáŸƒ</territory>
+ <territory type="TJ">ážáž¶ážŠáž áŸ’ស៉ីគីស្ážáž„់</territory>
+ <territory type="TL">ទីមáŸážšážáž¶áž„កើáž</territory>
+ <territory type="TM">ទួគមáŸáž“ីស្ážáž„់</territory>
+ <territory type="TN">ទុយនáŸážŸáŸŠáž¸</territory>
+ <territory type="TO">ážáž»áž„ហ្គា</territory>
+ <territory type="TR">ទួរគី</territory>
+ <territory type="TT">ទ្រីនីដាដនឹងážáž¼áž”ាហ្គោ</territory>
+ <territory type="TW">ážáŸƒážœáŸ‰áž¶áž“់</territory>
+ <territory type="TZ">ážáž„់ហ្សានី</territory>
+ <territory type="UA">អ៊ុយក្រែន</territory>
+ <territory type="UG">អ៊ូហ្កង់ដា</territory>
+ <territory type="US">សហរដ្ឋអាមáŸážšáž·áž€</territory>
+ <territory type="UY">អ៊ុយរុយហ្គាយ</territory>
+ <territory type="UZ">អ៊ូហ្សបáŸáž‚ីស្ážáž„់</territory>
+ <territory type="VA">វ៉ាទីកង់</territory>
+ <territory type="VE">ážœáŸáž“áŸáž áŸ’ស៊ុយឡា</territory>
+ <territory type="VN">វៀážážŽáž¶áž˜</territory>
+ <territory type="WS">សាមូអា</territory>
+ <territory type="YE">áž™áŸáž˜áŸ‚áž“</territory>
+ <territory type="ZA">អាហ្វ្រិកážáž¶áž„ážáŸ’បូង</territory>
+ <territory type="ZM">ហ្សាំប៊ី</territory>
+ <territory type="ZW">ហ្ស៊ីមបាបវ៉áŸ</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[ំ-៑ ក-វ ស-អ {អា} ឥ-ឧ {ឧក} ឩ-ឳ ា-ៅ ្]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200B áž ážž \u17B4 \u17B5]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GyMdkHmsSEDFwWahKzYeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="buddhist">
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">ព.ស.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <default choice="long" draft="unconfirmed"/>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEE' ážáŸ’ងៃ 'd' ážáŸ‚ 'MMMM' ឆ្នាំ ' yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEE' ážáŸ’ងៃ 'd' ážáŸ‚ 'MMMM' ឆ្នាំ ' yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">d/M/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">H' ម៉ោង 'm' នាទី 'ss' វិនាទី​'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">H' ម៉ោង 'm' នាទី'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <dateTimeFormatLength>
+ <dateTimeFormat>
+ <pattern draft="unconfirmed">{1}, {0}</pattern>
+ </dateTimeFormat>
+ </dateTimeFormatLength>
+ </dateTimeFormats>
+ </calendar>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">១</month>
+ <month type="2">២</month>
+ <month type="3">៣</month>
+ <month type="4">៤</month>
+ <month type="5" draft="unconfirmed">៥</month>
+ <month type="6">៦</month>
+ <month type="7">៧</month>
+ <month type="8">៨</month>
+ <month type="9">៩</month>
+ <month type="10">១០</month>
+ <month type="11">១១</month>
+ <month type="12">១២</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">មករា</month>
+ <month type="2">កុម្ភៈ</month>
+ <month type="3">មិនា</month>
+ <month type="4">មáŸážŸáž¶</month>
+ <month type="5">ឧសភា</month>
+ <month type="6">មិážáž»áž“ា</month>
+ <month type="7">កក្កដា</month>
+ <month type="8">សីហា</month>
+ <month type="9">កញ្ញា</month>
+ <month type="10">ážáž»áž›áž¶</month>
+ <month type="11">វិច្ឆិកា</month>
+ <month type="12">ធ្នូ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">អា</day>
+ <day type="mon">áž…</day>
+ <day type="tue">អ</day>
+ <day type="wed">áž–áž»</day>
+ <day type="thu">ព្រ</day>
+ <day type="fri">សុ</day>
+ <day type="sat">ស</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="provisional">ážáŸ’ងៃអាទិážáŸ’áž™</day>
+ <day type="mon" draft="provisional">​ážáŸ’ងៃចáŸáž“្ទ</day>
+ <day type="tue" draft="provisional">ážáŸ’ងៃអង្គារ</day>
+ <day type="wed" draft="provisional">ážáŸ’ងៃពុធ</day>
+ <day type="thu" draft="provisional">ážáŸ’ងៃព្រហស្បážáž·áŸ</day>
+ <day type="fri" draft="provisional">ážáŸ’ងៃសុក្រ</day>
+ <day type="sat" draft="provisional">ážáŸ’ងៃសៅរáŸ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">ážáŸ’រី១</quarter>
+ <quarter type="2">ážáŸ’រី២</quarter>
+ <quarter type="3">ážáŸ’រី៣</quarter>
+ <quarter type="4">ážáŸ’រី៤</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">ážáŸ’រីមាសទី១</quarter>
+ <quarter type="2">ážáŸ’រីមាសទី២</quarter>
+ <quarter type="3">ážáŸ’រីមាសទី៣</quarter>
+ <quarter type="4">ážáŸ’រីមាសទី៤</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>ព្រឹក</am>
+ <pm>ល្ងាច</pm>
+ <eras>
+ <eraNames>
+ <era type="0">មុន​គ្រិស្ážážŸáž€ážšáž¶áž‡</era>
+ <era type="1">គ្រិស្ážážŸáž€ážšáž¶áž‡</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">មុន​គ.ស.</era>
+ <era type="1">គ.ស.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEE' ážáŸ’ងៃ 'd' ážáŸ‚ 'MMMM' ឆ្នាំ ' yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEE' ážáŸ’ងៃ 'd' ážáŸ‚ 'MMMM' ឆ្នាំ ' yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d/M/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H' ម៉ោង 'm' នាទី 'ss' វិនាទី​' z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H' ម៉ោង 'm' នាទី 'ss' វិនាទី​'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <dateTimeFormatLength>
+ <dateTimeFormat>
+ <pattern>{1}, {0}</pattern>
+ </dateTimeFormat>
+ </dateTimeFormatLength>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">d/M</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="provisional">QQQQ yy</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">M/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="KHR">
+ <displayName>Riel</displayName>
+ <symbol>៛</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/km_KH.xml b/libs/Zend/Locale/Data/km_KH.xml
new file mode 100755
index 0000000000..839205e3c8
--- /dev/null
+++ b/libs/Zend/Locale/Data/km_KH.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.26 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="km"/>
+ <territory type="KH"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">'</quotationStart>
+ <quotationEnd draft="unconfirmed">'</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">&quot;</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">&quot;</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/kn.xml b/libs/Zend/Locale/Data/kn.xml
new file mode 100755
index 0000000000..b5ed78cd67
--- /dev/null
+++ b/libs/Zend/Locale/Data/kn.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.46 $"/>
+ <generation date="$Date: 2006/06/25 00:18:38 $"/>
+ <language type="kn"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="kn">ಕನà³à²¨à²¡</language>
+ </languages>
+ <territories>
+ <territory type="AU">ಆಸà³à²Ÿà³à²°à³†à²²à²¿à²¯</territory>
+ <territory type="CN">ಚೀನ</territory>
+ <territory type="EE">ಎಸà³à²¤à³Šà²¨à²¿à²¯</territory>
+ <territory type="IN">ಭಾರತ</territory>
+ <territory type="MV">ಮಾಲà³à²¡à²¿à²µ ದà³à²µà³€à²ªà²—ಳà³</territory>
+ <territory type="NP">ನೆಪಾಳ</territory>
+ <territory type="SG">ಸಿಂಗಪà³à²°</territory>
+ <territory type="TR">ತà³à²°à³à²•à²¿</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[಼ ಂ ಃ ೦-೯ ಅ-ಋ ೠ ಌ ೡ ಎ-ಠಒ-ನ ಪ-ಲ ವ-ಹ ಳ ೞ ಽ-ೄ ೆ-ೈ ೊ-ೠೕ ೖ]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">ಜನವರೀ</month>
+ <month type="2">ಫೆಬà³à²°à²µà²°à³€</month>
+ <month type="3">ಮಾರà³à²šà³</month>
+ <month type="4">ಎಪà³à²°à²¿à²²à³</month>
+ <month type="5">ಮೆ</month>
+ <month type="6">ಜೂನà³</month>
+ <month type="7">ಜà³à²²à³ˆ</month>
+ <month type="8">ಆಗಸà³à²Ÿà³</month>
+ <month type="9">ಸಪà³à²Ÿà³†à²‚ಬರà³</month>
+ <month type="10">ಅಕà³à²Ÿà³‹à²¬à²°à³</month>
+ <month type="11">ನವೆಂಬರà³</month>
+ <month type="12">ಡಿಸೆಂಬರà³</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">ಜನವರೀ</month>
+ <month type="2">ಫೆಬà³à²°à²µà²°à³€</month>
+ <month type="3">ಮಾರà³à²šà³</month>
+ <month type="4">ಎಪà³à²°à²¿à²²à³</month>
+ <month type="5">ಮೆ</month>
+ <month type="6">ಜೂನà³</month>
+ <month type="7">ಜà³à²²à³ˆ</month>
+ <month type="8">ಆಗಸà³à²Ÿà³</month>
+ <month type="9">ಸಪà³à²Ÿà³†à²‚ಬರà³</month>
+ <month type="10">ಅಕà³à²Ÿà³‹à²¬à²°à³</month>
+ <month type="11">ನವೆಂಬರà³</month>
+ <month type="12">ಡಿಸೆಂಬರà³</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">ರ.</day>
+ <day type="mon">ಸೋ.</day>
+ <day type="tue">ಮಂ.</day>
+ <day type="wed">ಬà³.</day>
+ <day type="thu">ಗà³.</day>
+ <day type="fri">ಶà³.</day>
+ <day type="sat">ಶನಿ.</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">ರವಿವಾರ</day>
+ <day type="mon">ಸೋಮವಾರ</day>
+ <day type="tue">ಮಂಗಳವಾರ</day>
+ <day type="wed">ಬà³à²§à²µà²¾à²°</day>
+ <day type="thu">ಗà³à²°à³à²µà²¾à²°</day>
+ <day type="fri">ಶà³à²•à³à²°à²µà²¾à²°</day>
+ <day type="sat">ಶನಿವಾರ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">ಒಂದೠ1</quarter>
+ <quarter type="2" draft="unconfirmed">ಎರಡೠ2</quarter>
+ <quarter type="3" draft="unconfirmed">ಮೂರೠ3</quarter>
+ <quarter type="4" draft="unconfirmed">ನಾಲೃಕ 4</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>ಪೂರà³à²µà²¾à²¹à³à²¨</am>
+ <pm>ಅಪರಾಹà³à²¨</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">ಈಸಪೂವ೯.</era>
+ <era type="1" draft="unconfirmed">ಸನà³.</era>
+ </eraNames>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="INR">
+ <symbol draft="unconfirmed">रà¥</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">ಹೌದà³</yesstr>
+ <nostr draft="unconfirmed">ಇಲà³à²²:ಅಲà³à²²</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1" uri="http://tdil.mit.gov.in/newsIndexOct02.htm">TDIL Vishwabharat Magazine, Oct 2002</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/kn_IN.xml b/libs/Zend/Locale/Data/kn_IN.xml
new file mode 100755
index 0000000000..534ec23439
--- /dev/null
+++ b/libs/Zend/Locale/Data/kn_IN.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.47 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="kn"/>
+ <territory type="IN"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">'</quotationStart>
+ <quotationEnd draft="unconfirmed">'</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">&quot;</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">&quot;</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d-M-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ko.xml b/libs/Zend/Locale/Data/ko.xml
new file mode 100755
index 0000000000..4b32cdcbdb
--- /dev/null
+++ b/libs/Zend/Locale/Data/ko.xml
@@ -0,0 +1,1959 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.71 $"/>
+ <generation date="$Date: 2006/07/11 19:26:44 $"/>
+ <language type="ko"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">아파르어</language>
+ <language type="ab">압카즈어</language>
+ <language type="ace">ì•„ì²´ì–´</language>
+ <language type="ach">아콜리어</language>
+ <language type="ada">아당메어</language>
+ <language type="ady">아닥헤어</language>
+ <language type="af">남아공 공용어</language>
+ <language type="afa">아시아-아프리카어 (기타)</language>
+ <language type="afh">아프리히리어</language>
+ <language type="ak">아칸어</language>
+ <language type="akk">아카드어</language>
+ <language type="ale">알류트어</language>
+ <language type="alg">알콘킨어</language>
+ <language type="am">암하ë¼ì–´</language>
+ <language type="an">ì•„ë¼ê³¤ì–´</language>
+ <language type="ang">ì´ì „ ì˜ì–´ (ca.450-1100)</language>
+ <language type="apa">아파치어</language>
+ <language type="ar">ì•„ëžì–´</language>
+ <language type="arc">아람어</language>
+ <language type="arn">ì•„ë¼ìš°ì¹¸ì–´</language>
+ <language type="arp">ì•„ë¼íŒŒí˜¸ì–´</language>
+ <language type="art">기계어 (기타)</language>
+ <language type="arw">ì•„ë¼ì™€í¬ì–´</language>
+ <language type="as">아샘어</language>
+ <language type="ast">아스투리아어</language>
+ <language type="ath">아타바스카어</language>
+ <language type="aus">오스트레ì¼ë¦¬ì•„ì–´</language>
+ <language type="av">아바릭어</language>
+ <language type="awa">아와히어</language>
+ <language type="ay">ì•„ì´ë§ˆë¼ì–´</language>
+ <language type="az">아제르바ì´ìž”ì–´</language>
+ <language type="ba">바슈키르어</language>
+ <language type="bad">반다어</language>
+ <language type="bai">바미레케어</language>
+ <language type="bal">발루치어</language>
+ <language type="ban">발리어</language>
+ <language type="bas">바사어</language>
+ <language type="bat">발트어 (기타)</language>
+ <language type="be">벨로루시어</language>
+ <language type="bej">ë² ìžì–´</language>
+ <language type="bem">벰바어</language>
+ <language type="ber">베르베르어</language>
+ <language type="bg">불가리아어</language>
+ <language type="bh">비하르어</language>
+ <language type="bho">호즈푸리어</language>
+ <language type="bi">비슬ë¼ë§ˆì–´</language>
+ <language type="bik">비콜어</language>
+ <language type="bin">비니어</language>
+ <language type="bla">ì‹ì‹œì¹´ì–´</language>
+ <language type="bm">밤바ë¼ì–´</language>
+ <language type="bn">벵골어</language>
+ <language type="bnt">반투어</language>
+ <language type="bo">티베트어</language>
+ <language type="br">브르타뉴어</language>
+ <language type="bra">브ë¼ì–´</language>
+ <language type="bs">보스니아어</language>
+ <language type="btk">바타í¬ì–´</language>
+ <language type="bua">부리아타</language>
+ <language type="bug">부기어</language>
+ <language type="byn">브린어</language>
+ <language type="ca">카탈로니아어</language>
+ <language type="cad">ì¹´ë„ì–´</language>
+ <language type="cai">중앙 아메리카 ì¸ë””안어 (기타)</language>
+ <language type="car">카리브어</language>
+ <language type="cau">카프카스어 (기타)</language>
+ <language type="ceb">세부아노어</language>
+ <language type="cel">켈트어 (기타)</language>
+ <language type="ch">차모로어</language>
+ <language type="chb">치브차어</language>
+ <language type="chg">차가타ì´ì–´</language>
+ <language type="chk">츄케스어</language>
+ <language type="chm">마리어</language>
+ <language type="chn">치누í¬ì–´ì™€ ì˜ì–´ í”„ëž‘ìŠ¤ì–´ì˜ í˜¼ì„±ì–´</language>
+ <language type="cho">촉토어</language>
+ <language type="chp">치페우얀</language>
+ <language type="chr">체로키어</language>
+ <language type="chy">샤ì´ì—”ì–´</language>
+ <language type="cmc">카믹어</language>
+ <language type="co">코르시카어</language>
+ <language type="cop">콥트어</language>
+ <language type="cpe">í¬ë ˆì˜¤ë¦¬ìŠ¤ì™€ 피긴스어, ì˜ì–´-기반 (기타)</language>
+ <language type="cpf">í¬ë ˆì˜¤ë¦¬ìŠ¤ì™€ 피긴스어, 프랑스어-기반 (기타)</language>
+ <language type="cpp">í¬ë ˆì˜¤ë¦¬ìŠ¤ì™€ 피긴스어, í¬ë¥´íˆ¬ê°ˆì–´-기반 (기타)</language>
+ <language type="cr">í¬ë¦¬ì–´</language>
+ <language type="crh">í¬ë¦¬ë¯¼ 터키어; í¬ë¦¬ë¯¼ 타타르어</language>
+ <language type="crp">í¬ë ˆì˜¤ìŠ¤ì™€ 피긴스어 (기타)</language>
+ <language type="cs">체코어</language>
+ <language type="csb">카슈비아어</language>
+ <language type="cu">êµíšŒìŠ¬ë¼ë¸Œì–´</language>
+ <language type="cus">쿠시트제족어 (기타)</language>
+ <language type="cv">추바시어</language>
+ <language type="cy">웨ì¼ìŠ¤ì–´</language>
+ <language type="da">ë´ë§ˆí¬ì–´</language>
+ <language type="dak">다코타어</language>
+ <language type="dar">다르그와어</language>
+ <language type="day">다야í¬ì–´</language>
+ <language type="de">ë…ì¼ì–´</language>
+ <language type="del">ë¸ë¼ì›¨ì–´ì–´</language>
+ <language type="den">슬ë¼ë¸Œì–´</language>
+ <language type="dgr">ë„그리브어</language>
+ <language type="din">딩카어</language>
+ <language type="doi">ë„그리어</language>
+ <language type="dra">ë“œë¼ë¹„다어 (기타)</language>
+ <language type="dsb">저급 소르비안어</language>
+ <language type="dua">드와ë¼ì–´</language>
+ <language type="dum">네ëœëž€ë“œ, 중세 (ca. 1050-1350)</language>
+ <language type="dv">디베히어</language>
+ <language type="dyu">드율ë¼ì–´</language>
+ <language type="dz">부탄어</language>
+ <language type="ee">ì—웨어</language>
+ <language type="efi">ì´í”½ì–´</language>
+ <language type="egy">ì´ì§‘트어 (고대)</language>
+ <language type="eka">ì´ì¹´ì£½ì–´</language>
+ <language type="el">그리스어</language>
+ <language type="elx">엘람어</language>
+ <language type="en">ì˜ì–´</language>
+ <language type="enm">ì˜ì–´, 중세 (1100-1500)</language>
+ <language type="eo">ì—스페란토어</language>
+ <language type="es">스페ì¸ì–´</language>
+ <language type="et">ì—스토니아어</language>
+ <language type="eu">바스í¬ì–´</language>
+ <language type="ewo">ì´ì›ë„ì–´</language>
+ <language type="fa">ì´ëž€ì–´</language>
+ <language type="fan">팡그어</language>
+ <language type="fat">íŒí‹°ì–´</language>
+ <language type="ff">í’€ë¼ì–´</language>
+ <language type="fi">핀란드어</language>
+ <language type="fil">필리핀어</language>
+ <language type="fiu">피노우그리아어 (기타)</language>
+ <language type="fj">피지어</language>
+ <language type="fo">페로스어</language>
+ <language type="fon">í°ì–´</language>
+ <language type="fr">프랑스어</language>
+ <language type="frm">프랑스어, 중세 (ca.1400-1600)</language>
+ <language type="fro">프랑스어, 고대 (842-ca.1400)</language>
+ <language type="fur">프리우리안어</language>
+ <language type="fy">프리지아어</language>
+ <language type="ga">ì•„ì¼ëžœë“œì–´</language>
+ <language type="gaa">가어</language>
+ <language type="gay">가요어</language>
+ <language type="gba">그바야어</language>
+ <language type="gd">스코갤릭어</language>
+ <language type="gem">ë…ì¼ì–´ (기타)</language>
+ <language type="gez">게ì´ì¦ˆì–´</language>
+ <language type="gil">키리바시어</language>
+ <language type="gl">갈리시아어</language>
+ <language type="gmh">ë…ì¼ì–´, 중세 고급 (ca.1050-1500)</language>
+ <language type="gn">구아ë¼ë‹ˆì–´</language>
+ <language type="goh">ë…ì¼ì–´, 고대 저급 (ca.750-1050)</language>
+ <language type="gon">곤디어</language>
+ <language type="gor">고론탈로어</language>
+ <language type="got">고트어</language>
+ <language type="grb">게르보어</language>
+ <language type="grc">그리스어, 고대 (1453년 까지)</language>
+ <language type="gu">구ìžë¼íŠ¸ì–´</language>
+ <language type="gv">맹í¬ìŠ¤ì–´</language>
+ <language type="gwi">그위친어</language>
+ <language type="ha">하우ìžì–´</language>
+ <language type="hai">하ì´ë‹¤ì–´</language>
+ <language type="haw">하와ì´ì–´</language>
+ <language type="he">히브리어</language>
+ <language type="hi">힌디어</language>
+ <language type="hil">헤리가뇬어</language>
+ <language type="him">히마차리어</language>
+ <language type="hit">하타ì´íŠ¸ì–´</language>
+ <language type="hmn">히몸어</language>
+ <language type="ho">히리 모투어</language>
+ <language type="hr">í¬ë¡œì•„í‹°ì•„ì–´</language>
+ <language type="hsb">위 소르비안어</language>
+ <language type="ht">ì•„ì´í‹°ì–´</language>
+ <language type="hu">í—가리어</language>
+ <language type="hup">후파어</language>
+ <language type="hy">아르메니아어</language>
+ <language type="ia">ì¸í„°ë§ê±°</language>
+ <language type="iba">ì´ë°˜ì–´</language>
+ <language type="id">ì¸ë„네시아어</language>
+ <language type="ie">ì¸í„°ë§ê²Œì–´</language>
+ <language type="ig">ì´ê·¸ë³´ì–´</language>
+ <language type="ii">시츄안 ì´ì–´</language>
+ <language type="ijo">ì´ì¡°ì–´</language>
+ <language type="ik">ì´ëˆ„피아í¬ì–´</language>
+ <language type="ilo">ì´ë¡œì½”ì–´</language>
+ <language type="inc">ì¸ë„ì–´ (기타)</language>
+ <language type="ine">ì¸ë„유럽어 (기타)</language>
+ <language type="inh">ì¸ê·€ì‹œì–´</language>
+ <language type="io">ì´ë„ì–´</language>
+ <language type="ira">ì´ëž€ì–´ [ira]</language>
+ <language type="iro">ì´ëŸ¬ì¿¼ì´ì–´</language>
+ <language type="is">ì•„ì´ìŠ¬ëž€ë“œì–´</language>
+ <language type="it">ì´íƒˆë¦¬ì•„ì–´</language>
+ <language type="iu">ì´ëˆ…티투트어</language>
+ <language type="ja">ì¼ë³¸ì–´</language>
+ <language type="jbo">로반어</language>
+ <language type="jpr">유대-페르시아어</language>
+ <language type="jrb">유대-ì•„ë¼ë¹„ì•„ì–´</language>
+ <language type="jv">ìžë°”ì–´</language>
+ <language type="ka">그루지야어</language>
+ <language type="kaa">ì¹´ë¼ì¹¼íŒŒí¬ì–´</language>
+ <language type="kab">커바ì¼ì–´</language>
+ <language type="kac">카친어</language>
+ <language type="kam">캄바어</language>
+ <language type="kar">카렌어</language>
+ <language type="kaw">카위어</language>
+ <language type="kbd">카바르디어</language>
+ <language type="kg">콩고어</language>
+ <language type="kha">카시어</language>
+ <language type="khi">ì½”ì´ì‚°ì–´ (기타)</language>
+ <language type="kho">코탄스어</language>
+ <language type="ki">키쿠유어</language>
+ <language type="kj">쿠안야마어</language>
+ <language type="kk">ì¹´ìžíì–´</language>
+ <language type="kl">그린랜드어</language>
+ <language type="km">캄보디아어</language>
+ <language type="kmb">킴분누어</language>
+ <language type="kn">카나다어</language>
+ <language type="ko">한국어</language>
+ <language type="kok">코카니어</language>
+ <language type="kos">코스ë¼ì´ì—”ì–´</language>
+ <language type="kpe">코펠레</language>
+ <language type="kr">칸누리어</language>
+ <language type="krc">ì¹´ë¼ì± ì´-발카르어</language>
+ <language type="kro">í¬ë£¨ì–´</language>
+ <language type="kru">쿠르í¬ì–´</language>
+ <language type="ks">카슈미르어</language>
+ <language type="ku">í¬ë¥´ë“œì–´</language>
+ <language type="kum">쿠믹어</language>
+ <language type="kut">쿠테네어</language>
+ <language type="kv">코미어</language>
+ <language type="kw">콘월어</language>
+ <language type="ky">키르기스어</language>
+ <language type="la">ë¼í‹´ì–´</language>
+ <language type="lad">ë¼ë””노어</language>
+ <language type="lah">ë¼í•œë‹¤ì–´</language>
+ <language type="lam">람바어</language>
+ <language type="lb">룩셈부르í¬ì–´</language>
+ <language type="lez">레즈기안어</language>
+ <language type="lg">간다어</language>
+ <language type="li">림버거어</language>
+ <language type="ln">ë§ê°ˆë¼ì–´</language>
+ <language type="lo">ë¼ì˜¤ì–´</language>
+ <language type="lol">몽구어</language>
+ <language type="loz">로지어</language>
+ <language type="lt">리투아니아어</language>
+ <language type="lu">루바-카탄가어</language>
+ <language type="lua">루바-룰루아어</language>
+ <language type="lui">루ì´ì„¸ë…¸ì–´</language>
+ <language type="lun">룬다어</language>
+ <language type="luo">루오어</language>
+ <language type="lus">루샤ì´ì–´</language>
+ <language type="lv">ë¼íŠ¸ë¹„ì•„ì–´</language>
+ <language type="mad">마ë‘레세</language>
+ <language type="mag">마가히</language>
+ <language type="mai">마ì´í‹¸ë¦¬</language>
+ <language type="mak">마카사어</language>
+ <language type="man">만딩고어</language>
+ <language type="map">남ë„ì–´</language>
+ <language type="mas">마사ì´ì–´</language>
+ <language type="mdf">모í¬ìƒ¤ì–´</language>
+ <language type="mdr">만다르어</language>
+ <language type="men">멘ë°ì–´</language>
+ <language type="mg">마다가스카르어</language>
+ <language type="mga">ì•„ì¼ëžœë“œì–´, 중세 (900-1200)</language>
+ <language type="mh">마셜제ë„ì–´</language>
+ <language type="mi">마오리어</language>
+ <language type="mic">미í¬ë§¥ì–´</language>
+ <language type="min">미낭카바우</language>
+ <language type="mis">기타 언어</language>
+ <language type="mk">마케ë„니아어</language>
+ <language type="mkh">몬í¬ë©”르어 (기타)</language>
+ <language type="ml">ë§ë¼ì–„람어</language>
+ <language type="mn">몽골어</language>
+ <language type="mnc">만주어</language>
+ <language type="mni">마니푸리어</language>
+ <language type="mno">마노보어</language>
+ <language type="mo">몰다비아어</language>
+ <language type="moh">모호í¬ì–´</language>
+ <language type="mos">모시어</language>
+ <language type="mr">마ë¼í‹°ì–´</language>
+ <language type="ms">ë§ë ˆì´ì–´</language>
+ <language type="mt">몰타어</language>
+ <language type="mul">다중 언어</language>
+ <language type="mun">문다어</language>
+ <language type="mus">í¬ë¦¬í¬ì–´</language>
+ <language type="mwr">마르와리어</language>
+ <language type="my">버마어</language>
+ <language type="myn">마야어</language>
+ <language type="myv">엘즈야어</language>
+ <language type="na">나우루어</language>
+ <language type="nah">나우아틀어</language>
+ <language type="nai">ë¶ ì•„ë©”ë¦¬ì¹¸ ì¸ë””언어 (기타)</language>
+ <language type="nap">나í´ë¦¬ì–´</language>
+ <language type="nb">ë³´í¬ë§ 노르웨ì´ì–´</language>
+ <language type="nd">ì€ë°ë²¨ë ˆì–´, ë¶ë¶€</language>
+ <language type="nds">저급 ë…ì¼ì–´; 저급 색슨어</language>
+ <language type="ne">네팔어</language>
+ <language type="new">네와리어</language>
+ <language type="ng">ëŠë™ê°€ì–´</language>
+ <language type="nia">니아스어</language>
+ <language type="nic">니제르 - 코르ë„파니아어 (기타)</language>
+ <language type="niu">니웨언어</language>
+ <language type="nl">네ëœëž€ë“œì–´</language>
+ <language type="nn">ë‰˜ë…¸ë¥´ìŠ¤í¬ ë…¸ë¥´ì›¨ì´ì–´</language>
+ <language type="no">노르웨ì´ì–´</language>
+ <language type="nog">노가ì´ì–´</language>
+ <language type="non">노르웨ì´, 고대</language>
+ <language type="nr">ì€ë°ë²¨ë ˆì–´, 남부</language>
+ <language type="nso">소토어, ë¶ë¶€</language>
+ <language type="nub">누비안어</language>
+ <language type="nv">나바호어</language>
+ <language type="ny">니안ìžì–´; 치츄어; 츄어</language>
+ <language type="nym">니암웨지어</language>
+ <language type="nyn">니안콜어</language>
+ <language type="nyo">뉴로어</language>
+ <language type="nzi">ëŠì§€ë§ˆì–´</language>
+ <language type="oc">옥시트어</language>
+ <language type="oj">오지브웨ì´ì–´</language>
+ <language type="om">오로모어 (ì•„íŒ)</language>
+ <language type="or">오리야어</language>
+ <language type="os">오세트어</language>
+ <language type="osa">오세ì´ì§€ì–´</language>
+ <language type="ota">터키어, 오스만 (1500-1928)</language>
+ <language type="oto">오토미안어</language>
+ <language type="pa">펀잡어</language>
+ <language type="paa">파푸아어 (기타)</language>
+ <language type="pag">íŒê°€ì‹œë‚œì–´</language>
+ <language type="pal">팔빌레어</language>
+ <language type="pam">팜팡가어</language>
+ <language type="pap">파피아먼토어</language>
+ <language type="pau">파ë¼ìš°ì•ˆì–´</language>
+ <language type="peo">페르시안 고대어 (ca.600-400 B.C.)</language>
+ <language type="phi">필리핀어 (기타)</language>
+ <language type="phn">페니키아어</language>
+ <language type="pi">팔리어</language>
+ <language type="pl">í´ëž€ë“œì–´</language>
+ <language type="pon">í¼íŽ˜ì´ì–´</language>
+ <language type="pra">프ë¼í¬ë¦¬íŠ¸ì–´</language>
+ <language type="pro">프로벤칼어, 고대 (1500년 까지)</language>
+ <language type="ps">파시토어 (푸시토)</language>
+ <language type="pt">í¬ë¥´íˆ¬ì¹¼ì–´</language>
+ <language type="qu">케추아어</language>
+ <language type="raj">ë¼ìžìŠ¤íƒ„ì–´</language>
+ <language type="rap">ë¼íŒŒë‰´ì´</language>
+ <language type="rar">파로톤간어</language>
+ <language type="rm">레토로만어</language>
+ <language type="rn">반투어(부룬디)</language>
+ <language type="ro">루마니아어</language>
+ <language type="roa">ë¡œë§ìŠ¤ì–´ (기타)</language>
+ <language type="rom">집시어</language>
+ <language type="ru">러시아어</language>
+ <language type="rw">반투어(루완다)</language>
+ <language type="sa">산스í¬ë¦¬íŠ¸ì–´</language>
+ <language type="sad">산다웨어</language>
+ <language type="sah">야í트어</language>
+ <language type="sai">남아메리카 ì¸ë””언어 (기타)</language>
+ <language type="sal">ìƒë¦¬ì‹œì–´ì–´</language>
+ <language type="sam">사마리아 ì•„ëžì–´</language>
+ <language type="sas">사사í¬ì–´</language>
+ <language type="sat">산탈리어</language>
+ <language type="sc">사르디니아어</language>
+ <language type="sco">스코틀랜드어</language>
+ <language type="sd">신디어</language>
+ <language type="se">ë¶ë¶€ 사미어</language>
+ <language type="sel">셀쿠프어</language>
+ <language type="sem">셈어 (기타)</language>
+ <language type="sg">ì‚°ê³ ì–´</language>
+ <language type="sga">ì•„ì¼ëžœë“œ, 고대 (900ë…„ 까지)</language>
+ <language type="sgn">수화</language>
+ <language type="sh">세르보í¬ë¡œì•„í‹°ì•„ì–´</language>
+ <language type="shn">샨어</language>
+ <language type="si">스리랑카어</language>
+ <language type="sid">시다모어</language>
+ <language type="sio">수족어</language>
+ <language type="sit">ì¸ë„제언어 (기타)</language>
+ <language type="sk">슬로바키아어</language>
+ <language type="sl">슬로베니아어</language>
+ <language type="sla">슬ë¼ë¸Œì–´ (기타)</language>
+ <language type="sm">사모아어</language>
+ <language type="sma">남부 사미어</language>
+ <language type="smi">사미어 (기타)</language>
+ <language type="smj">룰레 사미어</language>
+ <language type="smn">ì´ë‚˜ë¦¬ 사미어</language>
+ <language type="sms">스콜트 사미어</language>
+ <language type="sn">쇼나어</language>
+ <language type="snk">소닌케어</language>
+ <language type="so">소ë§ë¦¬ì•„ì–´</language>
+ <language type="sog">소그디엔어</language>
+ <language type="son">송가ì´ì¡±ì–´</language>
+ <language type="sq">알바니아어</language>
+ <language type="sr">세르비아어</language>
+ <language type="srr">세셀어</language>
+ <language type="ss">시스와티어</language>
+ <language type="ssa">니로-사하람어 (기타)</language>
+ <language type="st">세소토어</language>
+ <language type="su">순단어</language>
+ <language type="suk">수쿠마족어</language>
+ <language type="sus">수수어</language>
+ <language type="sux">수메르어</language>
+ <language type="sv">스웨ë´ì–´</language>
+ <language type="sw">스와ížë¦¬ì–´</language>
+ <language type="syr">시리아어</language>
+ <language type="ta">타밀어</language>
+ <language type="tai">태국어 (기타)</language>
+ <language type="te">텔루구어</language>
+ <language type="tem">팀니어</language>
+ <language type="ter">테레노어</language>
+ <language type="tet">테툼어</language>
+ <language type="tg">타지키스탄어</language>
+ <language type="th">태국어</language>
+ <language type="ti">티그리ëƒì–´</language>
+ <language type="tig">티그레어</language>
+ <language type="tiv">티비어</language>
+ <language type="tk">투르í¬ë©˜ì–´</language>
+ <language type="tkl">토켈ë¼ìš°ì œë„ì–´</language>
+ <language type="tl">타갈로그어</language>
+ <language type="tli">í‹€ë§ê¹ƒì¡±ì–´</language>
+ <language type="tmh">타마섹어</language>
+ <language type="tn">세츠와나어</language>
+ <language type="to">통가어</language>
+ <language type="tog">통가어 (니아살랜드)</language>
+ <language type="tpi">í† í¬ í”¼ì‹ ì–´</language>
+ <language type="tr">터키어</language>
+ <language type="ts">ì´ê°€ì–´</language>
+ <language type="tsi">트심시안어</language>
+ <language type="tt">타타르어</language>
+ <language type="tum">툼부카어</language>
+ <language type="tup">투피어</language>
+ <language type="tut">알타ì´ì–´ (기타)</language>
+ <language type="tvl">투발루어</language>
+ <language type="tw">트위어</language>
+ <language type="ty">타히티어</language>
+ <language type="tyv">투비니안어</language>
+ <language type="udm">ìš°ë“œë§íŠ¸ì–´</language>
+ <language type="ug">위구르어</language>
+ <language type="uga">유가리틱어</language>
+ <language type="uk">ìš°í¬ë¼ì´ë‚˜ì–´</language>
+ <language type="umb">윤번ë‘ì–´</language>
+ <language type="und">ê²°ì •ë˜ì§€ì•ŠìŒ</language>
+ <language type="ur">우르ë‘ì–´</language>
+ <language type="uz">우즈베í¬ì–´</language>
+ <language type="vai">ë°”ì´ì–´</language>
+ <language type="ve">벤다어</language>
+ <language type="vi">베트남어</language>
+ <language type="vo">ë³¼ë¼í“Œí¬ì–´</language>
+ <language type="vot">보틱어</language>
+ <language type="wa">왈론어</language>
+ <language type="wak">와카샨어</language>
+ <language type="wal">와ë¼ëª¨ì–´</language>
+ <language type="war">와ë¼ì´ì–´</language>
+ <language type="was">와쇼어</language>
+ <language type="wen">소르브어</language>
+ <language type="wo">올로프어</language>
+ <language type="xal">칼미í¬ì–´</language>
+ <language type="xh">반투어(남아프리카)</language>
+ <language type="yao">야오족어</language>
+ <language type="yap">ì–페세어</language>
+ <language type="yi">ì´ë””시어</language>
+ <language type="yo">요루바어</language>
+ <language type="ypk">야픽어</language>
+ <language type="za">주앙어</language>
+ <language type="zap">사í¬í…Œí¬ì–´</language>
+ <language type="zen">제나가어</language>
+ <language type="zh">중국어</language>
+ <language type="znd">ì•„ìž”ë°ì¡±ì–´</language>
+ <language type="zu">줄루어</language>
+ <language type="zun">주니어</language>
+ </languages>
+ <scripts>
+ <script type="Arab">ì•„ëžì–´</script>
+ <script type="Armn">아르메니아어</script>
+ <script type="Beng">벵골어</script>
+ <script type="Bopo">주ìŒë¶€í˜¸</script>
+ <script type="Brai">브ë¼ìœ </script>
+ <script type="Buhd">부히드어</script>
+ <script type="Cans">통합 ìºë‚˜ë‹¤ 토착어</script>
+ <script type="Cher">체로키어</script>
+ <script type="Copt">콥트어</script>
+ <script type="Cprt">키프로스어</script>
+ <script type="Cyrl">키릴어</script>
+ <script type="Deva">ë°ë°”니가리어</script>
+ <script type="Dsrt">디저렛어</script>
+ <script type="Ethi">ì—티오피아어</script>
+ <script type="Geor">그루지아어</script>
+ <script type="Goth">고트어</script>
+ <script type="Grek">그리스어</script>
+ <script type="Gujr">구쟈ë¼í‹°ì–´</script>
+ <script type="Guru">구루묵히</script>
+ <script type="Hang">한국어</script>
+ <script type="Hani">한족어</script>
+ <script type="Hano">하누누어</script>
+ <script type="Hans">중국어 간체</script>
+ <script type="Hant">중국어 번체</script>
+ <script type="Hebr">히브리어</script>
+ <script type="Hira">히ë¼ì¹´ë‚˜</script>
+ <script type="Ital">ê³ ì´íƒˆë¦¬ì•„ì–´</script>
+ <script type="Kana">가타카나</script>
+ <script type="Khmr">í¬ë©”르어</script>
+ <script type="Knda">칸나다</script>
+ <script type="Laoo">ë¼ì˜¤ì–´</script>
+ <script type="Latn">ë¼í‹´ì–´</script>
+ <script type="Limb">림부어</script>
+ <script type="Linb">선형 ë¬¸ìž B</script>
+ <script type="Mlym">ë§ë¼ì–„람어</script>
+ <script type="Mong">몽골어</script>
+ <script type="Mymr">미얀마어</script>
+ <script type="Ogam">오그함어</script>
+ <script type="Orya">오리야어</script>
+ <script type="Osma">오스만야어</script>
+ <script type="Runr">룬 문ìž</script>
+ <script type="Shaw">샤비안어</script>
+ <script type="Sinh">ì‹ í• ë¼ì–´</script>
+ <script type="Syrc">시리아어</script>
+ <script type="Tagb">타반와어</script>
+ <script type="Tale">íƒ€ì´ ë ˆì–´</script>
+ <script type="Taml">타밀어</script>
+ <script type="Telu">탤루그어</script>
+ <script type="Tglg">타갈로그어</script>
+ <script type="Thaa">타나어</script>
+ <script type="Thai">태국어</script>
+ <script type="Tibt">티벳어</script>
+ <script type="Ugar">우가릿어</script>
+ <script type="Yiii">ì´ì–´</script>
+ </scripts>
+ <territories>
+ <territory type="AD">안ë„ë¼</territory>
+ <territory type="AE">ì•„ëžì—미리트</territory>
+ <territory type="AF">아프가니스탄</territory>
+ <territory type="AG">앤티가 바부다</territory>
+ <territory type="AI">안길ë¼</territory>
+ <territory type="AL">알바니아</territory>
+ <territory type="AM">아르메니아</territory>
+ <territory type="AN">네ëœëž€ë“œë ¹ 안틸레스</territory>
+ <territory type="AO">앙골ë¼</territory>
+ <territory type="AQ">남극 대륙</territory>
+ <territory type="AR">아르헨티나</territory>
+ <territory type="AS">아메리칸 사모아</territory>
+ <territory type="AT">오스트리아</territory>
+ <territory type="AU">오스트레ì¼ë¦¬ì•„</territory>
+ <territory type="AW">아루바</territory>
+ <territory type="AX">올란드 ì œë„</territory>
+ <territory type="AZ">아제르바ì´ìž”</territory>
+ <territory type="BA">보스니아 헤르체고비나</territory>
+ <territory type="BB">바베ì´ë„스</territory>
+ <territory type="BD">방글ë¼ë°ì‹œ</territory>
+ <territory type="BE">벨기ì—</territory>
+ <territory type="BF">부르키나파소</territory>
+ <territory type="BG">불가리아</territory>
+ <territory type="BH">바레ì¸</territory>
+ <territory type="BI">부룬디</territory>
+ <territory type="BJ">베넹</territory>
+ <territory type="BM">버뮤다</territory>
+ <territory type="BN">브루나ì´</territory>
+ <territory type="BO">볼리비아</territory>
+ <territory type="BR">브ë¼ì§ˆ</territory>
+ <territory type="BS">바하마</territory>
+ <territory type="BT">부탄</territory>
+ <territory type="BV">부베</territory>
+ <territory type="BW">보츠와나</territory>
+ <territory type="BY">벨ë¼ë£¨ìŠ¤</territory>
+ <territory type="BZ">벨리즈</territory>
+ <territory type="CA">ìºë‚˜ë‹¤</territory>
+ <territory type="CC">코코스제ë„</territory>
+ <territory type="CD">콩고민주공화국</territory>
+ <territory type="CF">중앙 아프리카</territory>
+ <territory type="CG">콩고</territory>
+ <territory type="CH">스위스</territory>
+ <territory type="CI">코트디부와르</territory>
+ <territory type="CK">ì¿¡ì œë„</territory>
+ <territory type="CL">ì¹ ë ˆ</territory>
+ <territory type="CM">카메룬</territory>
+ <territory type="CN">중국</territory>
+ <territory type="CO">콜롬비아</territory>
+ <territory type="CR">코스타리카</territory>
+ <territory type="CS">세르비아 ë° ëª¬í…Œë„¤ê·¸ë¡œ</territory>
+ <territory type="CU">ì¿ ë°”</territory>
+ <territory type="CV">까뽀베르ë°</territory>
+ <territory type="CX">í¬ë¦¬ìŠ¤ë§ˆìŠ¤ì„¬</territory>
+ <territory type="CY">사ì´í”„러스</territory>
+ <territory type="CZ">ì²´ì½”</territory>
+ <territory type="DE">ë…ì¼</territory>
+ <territory type="DJ">지부티</territory>
+ <territory type="DK">ë´ë§ˆí¬</territory>
+ <territory type="DM">ë„미니카</territory>
+ <territory type="DO">ë„미니카 공화국</territory>
+ <territory type="DZ">알제리</territory>
+ <territory type="EC">ì—ì¿ ì•„ë„르</territory>
+ <territory type="EE">ì—스토니아</territory>
+ <territory type="EG">ì´ì§‘트</territory>
+ <territory type="EH">서사하ë¼</territory>
+ <territory type="ER">ì—리트리아</territory>
+ <territory type="ES">스페ì¸</territory>
+ <territory type="ET">ì´ë””오피아</territory>
+ <territory type="FI">핀란드</territory>
+ <territory type="FJ">피지</territory>
+ <territory type="FK">í¬í´ëžœë“œì œë„</territory>
+ <territory type="FM">마ì´í¬ë¡œë„¤ì‹œì•„</territory>
+ <territory type="FO">페로제ë„</territory>
+ <territory type="FR">프랑스</territory>
+ <territory type="GA">가봉</territory>
+ <territory type="GB">ì˜êµ­</territory>
+ <territory type="GD">그레나다</territory>
+ <territory type="GE">그루지야</territory>
+ <territory type="GF">프랑스령 기아나</territory>
+ <territory type="GH">가나</territory>
+ <territory type="GI">지브롤터</territory>
+ <territory type="GL">그린란드</territory>
+ <territory type="GM">ê°ë¹„ì•„</territory>
+ <territory type="GN">기니</territory>
+ <territory type="GP">과달로프</territory>
+ <territory type="GQ">ì ë„ 기니</territory>
+ <territory type="GR">그리스</territory>
+ <territory type="GS">사우스조지아-사우스샌드위치제ë„</territory>
+ <territory type="GT">과테ë§ë¼</territory>
+ <territory type="GU">괌</territory>
+ <territory type="GW">기네비ì˜</territory>
+ <territory type="GY">ê°€ì´ì•„나</territory>
+ <territory type="HK">í™ì½©, 중국 특별행정구</territory>
+ <territory type="HM">허드섬-맥ë„ë„드제ë„</territory>
+ <territory type="HN">온ë‘ë¼ìŠ¤</territory>
+ <territory type="HR">í¬ë¡œì•„í‹°ì•„</territory>
+ <territory type="HT">하ì´í‹°</territory>
+ <territory type="HU">í—가리</territory>
+ <territory type="ID">ì¸ë„네시아</territory>
+ <territory type="IE">ì•„ì¼ëžœë“œ</territory>
+ <territory type="IL">ì´ìŠ¤ë¼ì—˜</territory>
+ <territory type="IN">ì¸ë„</territory>
+ <territory type="IO">ì˜êµ­ë ¹ì¸ë„ì–‘ì‹ë¯¼ì§€</territory>
+ <territory type="IQ">ì´ë¼í¬</territory>
+ <territory type="IR">ì´ëž€</territory>
+ <territory type="IS">ì•„ì´ìŠ¬ëž€ë“œ</territory>
+ <territory type="IT">ì´íƒˆë¦¬ì•„</territory>
+ <territory type="JM">ìžë©”ì´ì¹´</territory>
+ <territory type="JO">요르단</territory>
+ <territory type="JP">ì¼ë³¸</territory>
+ <territory type="KE">ì¼€ëƒ</territory>
+ <territory type="KG">키르기스스탄</territory>
+ <territory type="KH">캄보디아</territory>
+ <territory type="KI">키리바시</territory>
+ <territory type="KM">코모르</territory>
+ <territory type="KN">세ì¸íŠ¸í¬ë¦¬ìŠ¤í† í¼ 네비스</territory>
+ <territory type="KP">ì¡°ì„  ë¯¼ì£¼ì£¼ì˜ ì¸ë¯¼ 공화국</territory>
+ <territory type="KR">대한민국</territory>
+ <territory type="KW">쿠웨ì´íŠ¸</territory>
+ <territory type="KY">ì¼€ì´ë§¨ì œë„</territory>
+ <territory type="KZ">ì¹´ìží스탄</territory>
+ <territory type="LA">ë¼ì˜¤ìŠ¤</territory>
+ <territory type="LB">레바논</territory>
+ <territory type="LC">세ì¸íŠ¸ë£¨ì‹œì•„</territory>
+ <territory type="LI">리히í…슈타ì¸</territory>
+ <territory type="LK">스리랑카</territory>
+ <territory type="LR">ë¼ì´ë² ë¦¬ì•„</territory>
+ <territory type="LS">레소토</territory>
+ <territory type="LT">리투아니아</territory>
+ <territory type="LU">룩셈부르í¬</territory>
+ <territory type="LV">ë¼íŠ¸ë¹„ì•„</territory>
+ <territory type="LY">리비아</territory>
+ <territory type="MA">모로코</territory>
+ <territory type="MC">모나코</territory>
+ <territory type="MD">몰ë„ë°”</territory>
+ <territory type="MG">마다가스카르</territory>
+ <territory type="MH">마샬 êµ°ë„</territory>
+ <territory type="MK">마케ë„니아어</territory>
+ <territory type="ML">ë§ë¦¬</territory>
+ <territory type="MM">미얀마</territory>
+ <territory type="MN">몽골</territory>
+ <territory type="MO">마카오, 중국 특별행정구</territory>
+ <territory type="MP">ë¶ë§ˆë¦¬ì•„나제ë„</territory>
+ <territory type="MQ">ë§í‹°ë‹ˆí¬</territory>
+ <territory type="MR">모리타니</territory>
+ <territory type="MS">몬트세ë¼íŠ¸</territory>
+ <territory type="MT">몰타</territory>
+ <territory type="MU">모리셔스</territory>
+ <territory type="MV">몰디브</territory>
+ <territory type="MW">ë§ë¼ìœ„</territory>
+ <territory type="MX">멕시코</territory>
+ <territory type="MY">ë§ë ˆì´ì§€ì•„</territory>
+ <territory type="MZ">모잠비í¬</territory>
+ <territory type="NA">나미비아</territory>
+ <territory type="NC">뉴 칼레ë„니아</territory>
+ <territory type="NE">니제르</territory>
+ <territory type="NF">ë…¸í½ì„¬</territory>
+ <territory type="NG">나ì´ì§€ë¦¬ì•„</territory>
+ <territory type="NI">니카ë¼ê³¼</territory>
+ <territory type="NL">네ëœëž€ë“œ</territory>
+ <territory type="NO">노르웨ì´</territory>
+ <territory type="NP">네팔</territory>
+ <territory type="NR">나우루</territory>
+ <territory type="NU">니우ì—</territory>
+ <territory type="NZ">뉴질랜드</territory>
+ <territory type="OM">오만</territory>
+ <territory type="PA">파나마</territory>
+ <territory type="PE">페루</territory>
+ <territory type="PF">프랑스령 í´ë¦¬ë„¤ì‹œì•„</territory>
+ <territory type="PG">파푸아뉴기니</territory>
+ <territory type="PH">필리핀</territory>
+ <territory type="PK">파키스탄</territory>
+ <territory type="PL">í´ëž€ë“œ</territory>
+ <territory type="PM">세ì¸íŠ¸í”¼ì—르-미케롱</territory>
+ <territory type="PN">í•ì¼€ì–¸ì„¬</territory>
+ <territory type="PR">푸ì—르토리코</territory>
+ <territory type="PS">íŒ”ë ˆìŠ¤íƒ€ì¸ ì§€êµ¬</territory>
+ <territory type="PT">í¬ë¥´íŠ¸ì¹¼</territory>
+ <territory type="PW">팔ë¼ìš°</territory>
+ <territory type="PY">파ë¼ê³¼ì´</territory>
+ <territory type="QA">카타르</territory>
+ <territory type="RE">리유니온</territory>
+ <territory type="RO">루마니아</territory>
+ <territory type="RU">러시아</territory>
+ <territory type="RW">르완다</territory>
+ <territory type="SA">사우디아ë¼ë¹„ì•„</territory>
+ <territory type="SB">솔로몬</territory>
+ <territory type="SC">ì‰ì´ì‰˜</territory>
+ <territory type="SD">수단</territory>
+ <territory type="SE">스웨ë´</territory>
+ <territory type="SG">싱가í¬ë¥´</territory>
+ <territory type="SH">세ì¸íŠ¸í—¬ë ˆë‚˜</territory>
+ <territory type="SI">슬로베니아</territory>
+ <territory type="SJ">스발바르제ë„-얀마웬섬</territory>
+ <territory type="SK">슬로바키아</territory>
+ <territory type="SL">ì‹œì—ë¼ë¦¬ì˜¨</territory>
+ <territory type="SM">산마리노</territory>
+ <territory type="SN">세네갈</territory>
+ <territory type="SO">소ë§ë¦¬ì•„</territory>
+ <territory type="SR">수리남</territory>
+ <territory type="ST">ìƒíˆ¬ë©” 프린시페</territory>
+ <territory type="SV">엘살바ë„르</territory>
+ <territory type="SY">시리아</territory>
+ <territory type="SZ">스와질랜드</territory>
+ <territory type="TC">í„°í¬ìŠ¤ì¼€ì´ì»¤ìŠ¤ì œë„</territory>
+ <territory type="TD">차드</territory>
+ <territory type="TF">프랑스 남부 지방</territory>
+ <territory type="TG">토고</territory>
+ <territory type="TH">태국</territory>
+ <territory type="TJ">타지키스탄</territory>
+ <territory type="TK">토켈ë¼ìš°</territory>
+ <territory type="TL">ë™í‹°ëª¨ë¥´</territory>
+ <territory type="TM">투르í¬ë©”니스탄</territory>
+ <territory type="TN">튀니지</territory>
+ <territory type="TO">통가</territory>
+ <territory type="TR">터키</territory>
+ <territory type="TT">트리니다드 토바고</territory>
+ <territory type="TV">투발루</territory>
+ <territory type="TW">대만</territory>
+ <territory type="TZ">탄ìžë‹ˆì•„</territory>
+ <territory type="UA">ìš°í¬ë¼ì´ë‚˜</territory>
+ <territory type="UG">우간다</territory>
+ <territory type="UM">미국령 해외 ì œë„</territory>
+ <territory type="US">미국</territory>
+ <territory type="UY">우루과ì´</territory>
+ <territory type="UZ">우즈베키스탄</territory>
+ <territory type="VA">바티칸</territory>
+ <territory type="VC">세ì¸íŠ¸ë¹ˆì„¼íŠ¸ê·¸ë ˆë‚˜ë”˜</territory>
+ <territory type="VE">베네수엘ë¼</territory>
+ <territory type="VG">ì˜êµ­ë ¹ 버진 ì•„ì¼ëžœë“œ</territory>
+ <territory type="VI">미국령 버진 ì•„ì¼ëžœë“œ</territory>
+ <territory type="VN">베트남</territory>
+ <territory type="VU">바누아투</territory>
+ <territory type="WF">왈리스-푸투나 ì œë„</territory>
+ <territory type="WS">사모아</territory>
+ <territory type="YE">예멘</territory>
+ <territory type="YT">마요티</territory>
+ <territory type="ZA">남아프리카</territory>
+ <territory type="ZM">잠비아</territory>
+ <territory type="ZW">ì§ë°”브웨</territory>
+ </territories>
+ <variants>
+ <variant type="REVISED">개정</variant>
+ </variants>
+ <keys>
+ <key type="calendar">달력</key>
+ <key type="collation">ì¡°í•©</key>
+ <key type="currency">통화</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">불êµë ¥</type>
+ <type type="chinese" key="calendar">중국력</type>
+ <type type="direct" key="collation">순서</type>
+ <type type="gregorian" key="calendar">태양력</type>
+ <type type="hebrew" key="calendar">히브리력</type>
+ <type type="islamic" key="calendar">ì´ìŠ¬ëžŒë ¥</type>
+ <type type="islamic-civil" key="calendar">ì´ìŠ¬ëžŒ ìƒìš©ë ¥</type>
+ <type type="japanese" key="calendar">ì¼ë³¸ë ¥</type>
+ <type type="phonebook" key="collation">전화번호부순</type>
+ <type type="pinyin" key="collation">병ìŒìˆœ</type>
+ <type type="stroke" key="collation">ìžíšìˆœ</type>
+ <type type="traditional" key="collation">전통 역법</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[ê°€ ê° ê°„ ê°‡-ê°Š ê°-ê°— ê°™-ê° ê°  ê°¤ ê°¬ ê°­ ê°¯-ê°± ê°¸ ê°¹ ê°¼ ê±€ 걋 ê± ê±” 걘 걜 ê±° ê±± ê±´ ê±· 걸 걺 ê²€ ê² ê²ƒ-겆 겉-게 ê² ê²” 겜 ê² ê²Ÿ-겡 겨-겪 견 겯 ê²° 겸 ê²¹ ê²»-ê²½ ê³ ê³„ 곈 곌 곕 ê³— ê³  곡 곤 곧 골 곪 곬 곯-ê³± ê³³ ê³µ 곶 ê³¼ ê³½ ê´€ ê´„ ê´† ê´Œ ê´ ê´ ê´‘ ê´˜ ê´œ ê´  ê´© ê´¬ ê´­ ê´´ ê´µ ê´¸ ê´¼ 굄 êµ… 굇 굉 êµ êµ” 굘 굡 êµ£ 구 êµ­ êµ° êµ³-굶 êµ»-êµ½ 굿 ê¶ ê¶‚ 궈 궉 권 ê¶ ê¶œ ê¶ ê¶¤ 궷 ê·€ ê· ê·„ ê·ˆ ê· ê·‘ ê·“ ê·œ ê·  ê·¤ ê·¸ ê·¹ ê·¼ ê·¿-ê¸ ê¸ˆ 급 긋 ê¸ ê¸” 기 긱 긴 긷 길 긺 ê¹€ ê¹ ê¹ƒ ê¹… 깆 깊 까-깎 ê¹ ê¹” ê¹– 깜 ê¹ ê¹Ÿ-깡 ê¹¥ 깨 깩 깬 ê¹° 깸 ê¹¹ ê¹»-ê¹½ 꺄 꺅 꺌 꺼-꺾 껀 껄 껌 ê» ê»-껑 께 ê»™ 껜 껨 껫 ê»­ ê»´ 껸 껼 꼇 꼈 ê¼ ê¼ ê¼¬ ê¼­ ê¼° ê¼² ê¼´ ê¼¼ ê¼½ 꼿 ê½-꽃 꽈 꽉 ê½ ê½œ ê½ ê½¤ ê½¥ ê½¹ ê¾€ 꾄 꾈 ê¾ ê¾‘ 꾕 꾜 꾸 ê¾¹ ê¾¼ ê¿€ 꿇-꿉 ê¿‹ ê¿ ê¿Ž ê¿” ê¿œ 꿨 ê¿© ê¿° 꿱 ê¿´ 꿸 뀀 ë€ ë€„ 뀌 ë€ ë€” 뀜 ë€ ë€¨ ë„ ë… ëˆ ëŠ ëŒ ëŽ ë“-ë• ë— ë™ ë ë¼ ë½ ë‚€ ë‚„ ë‚Œ ë‚ ë‚ ë‚‘ 나-ë‚š ë‚œ ë‚Ÿ-ë‚¢ 남 ë‚© ë‚«-낯 낱 낳-낵 낸 낼 냄 냅 냇-냉 ëƒ ëƒ‘ 냔 냘 냠 냥 너 넉 ë„‹ ë„Œ ë„ ë„’ ë„“ 넘 ë„™ ë„›-ë„ ë„£-ë„¥ 넨 넬 ë„´ 넵 ë„·-넹 ë…€ ë… ë…„ ë…ˆ ë… ë…‘ ë…” ë…• ë…˜ ë…œ ë…  ë…¸ ë…¹ ë…¼ 놀 놂 놈 놉 놋 ë† ë†’-놔 놘 놜 놨 뇌 ë‡ ë‡” 뇜 ë‡ ë‡Ÿ 뇨 뇩 뇬 뇰 뇹 뇻 뇽 누 눅 눈 눋 눌 눔 눕 눗 눙 눠 눴 눼 뉘 뉜 뉠 뉨 뉩 뉴 뉵 뉼 늄 늅 늉 ëŠ ëŠ‘ 는 늘-늚 늠 늡 늣 능 늦 늪 늬 늰 늴 니 닉 ë‹Œ ë‹ ë‹’ 님 ë‹™ ë‹› ë‹ ë‹¢ 다-닦 단 ë‹«-닯 닳-답 ë‹·-ë‹» ë‹¿-ëŒ ëŒ„ 댈 ëŒ ëŒ‘ 댓-댕 댜 ë”-ë– ë˜ ë› ëœ ëž ëŸ ë¤ ë¥ ë§ ë© ë« ë® ë° ë± ë´ ë¸ ëŽ€ ëŽ ëŽƒ-뎅 뎌 ëŽ ëŽ” 뎠 뎡 뎨 뎬 ë„ ë… ëˆ ë‹ ëŒ ëŽ ë ë” ë• ë— ë™ ë› ë ë  ë¤ ë¨ ë¼ ë ë˜ ëœ ë  ë¨ ë© ë« ë´ ë‘ ë‘‘ ë‘” 둘 ë‘  ë‘¡ ë‘£ ë‘¥ 둬 ë’€ ë’ˆ ë’ ë’¤ ë’¨ ë’¬ ë’µ ë’· ë’¹ ë“€ ë“„ 듈 ë“ ë“• ë“œ ë“ ë“  ë“£ 들 듦 듬 ë“­ 듯 등 듸 ë”” 딕 딘 ë”› 딜 딤 딥 딧-딪 ë”° ë”± ë”´ 딸 ë•€ ë• ë•ƒ-ë•… ë•‹-ë• ë• ë•” ë•œ ë• ë•Ÿ-ë•¡ ë–  ë–¡ ë–¤ ë–¨ ë–ª ë–« ë–° ë–± ë–³-ë–µ ë–»-ë–½ ë—€ ë—„ ë—Œ ë— ë—-ë—‘ ë—˜ ë—¬ ë˜ ë˜‘ 똔 똘 똥 똬 똴 뙈 뙤 뙨 ëšœ ëš ëš  뚤 ëš« 뚬 ëš± ë›” ë›° ë›´ 뛸 뜀 ëœ ëœ… 뜨 뜩 뜬 뜯 뜰 뜸 뜹 뜻 ë„ ëˆ ëŒ ë” ë• ë  ë¤ ë¨ ë° ë± ë³ ëµ ë¼ ë½ ëž€ ëž„ 람 ëž ëž-ëž’ ëž–-ëž™ ëžœ ëž  램 ëž© ëž«-ëž­ ëž´ ëžµ 랸 럇 량 러 럭 런 럴 럼 럽 럿-ë  ë ‡-ë ‰ ë Œ ë  ë ˜ ë ™ ë › ë  ë ¤ ë ¥ ë ¨ ë ¬ ë ´ ë µ ë ·-ë ¹ ë¡€ ë¡„ ë¡‘ ë¡“ ë¡œ ë¡ ë¡  롤 롬 ë¡­ 롯 롱 롸 롼 ë¢ ë¢¨ 뢰 뢴 뢸 룀 ë£ ë£ƒ 룅 료 ë£ ë£” ë£ ë£Ÿ 룡 루 룩 룬 룰 룸 룹 룻 룽 뤄 뤘 뤠 뤼 뤽 륀 륄 륌 ë¥ ë¥‘ 류 륙 륜 률 륨 륩 륫 륭 르 륵 른 를 름 릅 릇 릉 릊 ë¦ ë¦Ž 리 릭 린 릴 림 립 릿 ë§ ë§ˆ 막 만 많-맒 맘 맙 맛 ë§ ë§ž 맡 맣-맥 맨 맬 맴 맵 맷-맺 먀 ë¨ ë¨ˆ 먕 머 먹 먼 ë©€ ë©‚ 멈 멉 ë©‹ ë© ë©Ž ë©“-ë©• 멘 ë©œ 멤 ë©¥ 멧-ë©© ë©° 멱 ë©´ 멸 몃-명 몇 몌 모 목 몫 몬 몰 몲 몸 몹 못 몽 ë«„ 뫈 뫘 ë«™ 뫼 묀 묄 ë¬ ë¬ ë¬‘ 묘 묜 묠 묩 묫 무-묶 문 묻-묾 ë­„ ë­… ë­‡ ë­‰ ë­ ë­ ë­ ë­” ë­˜ ë­¡ ë­£ ë­¬ 뮈 뮌 ë® ë®¤ 뮨 뮬 ë®´ ë®· 므 믄 믈 ë¯ ë¯“ 미 믹 민 믿 ë°€ ë°‚ ë°ˆ ë°‰ ë°‹-ë° ë° ë°‘ ë°”-ë°˜ ë°›-ë°Ÿ ë°¤ ë°¥ ë°§ ë°© ë°­ ë°° ë°± ë°´ ë°¸ ë±€ ë± ë±ƒ-ë±… 뱉 뱌 ë± ë± ë± ë²„ ë²… 번 벋 벌 벎 ë²” 법 ë²— ë²™ 벚 ë²  벡 벤 벧 벨 ë²° ë²± ë²³-ë²µ ë²¼ ë²½ ë³€ 별 ë³ ë³-병 볕 볘 볜 ë³´-볶 본 ë³¼ ë´„ ë´… ë´‡ ë´‰ ë´ ë´” ë´¤ ë´¬ ëµ€ 뵈 뵉 뵌 ëµ ëµ˜ ëµ™ 뵤 뵨 부 ë¶ ë¶„ 붇-붊 ë¶ ë¶‘ 붓 붕 붙 붚 붜 붤 붰 붸 ë·” ë·• ë·˜ ë·œ ë·© ë·° ë·´ ë·¸ 븀 븃 븅 브 ë¸ ë¸ ë¸” 븜 ë¸ ë¸Ÿ 비 ë¹… 빈 빌 빎 ë¹” 빕 ë¹— ë¹™-ë¹› ë¹  빡 빤 빨 빪 ë¹° ë¹± ë¹³-ë¹µ ë¹»-ë¹½ 뺀 뺄 뺌 ëº ëº-뺑 뺘 뺙 뺨 ë» ë»‘ ë»” ë»— 뻘 ë»  뻣-뻥 뻬 ë¼ ë¼ˆ 뼉 뼘 ë¼™ ë¼›-ë¼ ë½€ ë½ ë½„ 뽈 ë½ ë½‘ 뽕 ë¾” ë¾° ë¿… ë¿Œ ë¿ ë¿ ë¿” ë¿œ ë¿Ÿ ë¿¡ 쀼 ì‘ ì˜ ìœ ì  ì¨ ì© ì‚ ì‚‘ ì‚” 삘 ì‚  ì‚¡ ì‚£ ì‚¥ 사 ì‚­ 삯 ì‚° 삳-삶 삼 삽 ì‚¿-ìƒ ìƒ… 새 색 샌 ìƒ ìƒ˜ 샙 샛-ìƒ ìƒ¤ 샥 샨 샬 샴 샵 샷 샹 ì„€ ì„„ 섈 ì„ ì„• ì„œ-ì„  ì„£ 설 섦 섧 섬 ì„­ 섯-성 섶 세 섹 센 ì…€ ì…ˆ ì…‰ ì…‹-ì… ì…” ì…• ì…˜ ì…œ ì…¤ ì…¥ ì…§-ì…© ì…° ì…´ ì…¸ 솅 소-솎 ì† ì†” 솖 솜 ì† ì†Ÿ 송 솥 솨 솩 솬 솰 솽 쇄 쇈 쇌 쇔 쇗 쇘 쇠 쇤 쇨 쇰 쇱 쇳 쇼 쇽 숀 숄 숌 ìˆ ìˆ ìˆ‘ 수 숙 순 숟 술 숨 숩 숫 숭 숯 숱 숲 숴 쉈 ì‰ ì‰‘ 쉔 쉘 쉠 쉥 쉬 쉭 쉰 쉴 쉼 쉽 쉿 ìŠ ìŠˆ 슉 ìŠ ìŠ˜ 슛 ìŠ ìŠ¤ 슥 슨 슬 슭 슴 습 슷 승 ì‹œ ì‹ ì‹  ì‹£ 실 ì‹«-ì‹­ 싯 싱 싶 싸 싹 ì‹» 싼 쌀 쌈 쌉 쌌 ìŒ ìŒ“-쌕 쌘 쌜 쌤 쌥 쌨 쌩 ì… ì¨ ì© ì¬ ì° ì² ì¸ ì¹ ì¼ ì½ ìŽ„ 쎈 쎌 ì€ ì˜ ì™ ìœ ìŸ ì  ì¢ ì¨ ì© ì­ ì´ ìµ ì¸ ìˆ ì ì¤ ì¬ ì° ì´ ì¼ ì½ ì‘ˆ 쑤 ì‘¥ 쑨 쑬 ì‘´ 쑵 쑹 ì’€ ì’” ì’œ ì’¸ ì’¼ ì“© ì“° 쓱 ì“´ 쓸 쓺 ì“¿-ì” ì”Œ ì” ì”” 씜 씨 씩 씬 ì”° 씸 씹 ì”» 씽 ì•„ ì•… 안-ì•Š ì•Œ-ì•Ž ì•“-ì•• ì•—-ì•™ ì• ì•ž ì•  ì•¡ 앤 앨 ì•° 앱 앳-앵 야 약 ì–€ ì–„ ì–‡ ì–Œ ì– ì– ì–‘ ì–• ì–— ì–˜ ì–œ ì–  ì–© ì–´ ì–µ ì–¸ ì–¹ ì–»-ì–¾ ì—„-ì—Š ì—Œ ì—Ž ì— ì—‘ ì—” ì—˜ ì—  ì—¡ ì—£ ì—¥ ì—¬-ì—® ì—° ì—´ ì—¶ ì—· ì—¼-ì˜ ì˜…-예 옌 ì˜ ì˜˜ 옙 옛 옜 오 옥 온 올-옮 옰 옳-옵 옷 옹 옻 와 ì™ ì™„ 왈 ì™ ì™‘ 왓-왕 왜 ì™ ì™  왬 왯 ì™± 외 왹 왼 욀 욈 욉 ìš‹ ìš ìš” ìš• 욘 ìšœ 욤 욥 욧 ìš© ìš° ìš± ìš´ 울-욺 움 ì› ì›ƒ ì›… 워 ì› ì› ì›” 웜 ì› ì›  웡 웨 웩 웬 ì›° 웸 웹 웽 위 윅 윈 윌 윔 윕 윗 윙 유 육 윤 율 윰 윱 윳 융 윷 으 윽 ì€ ì„ ìŠ ìŒ ì ì ì‘-ì˜ ìœ ì  ì¨ ì« ì´ ìµ ì¸ ì¼-ì¾ ìžƒ-ìž… 잇-잊 잎 ìž ìž‘ ìž” ìž–-잘 ìžš ìž  ìž¡ 잣-잦 재 ìž­ ìž° ìž´ ìž¼ ìž½ ìž¿-ìŸ ìŸˆ 쟉 쟌 쟎 ìŸ ìŸ˜ ìŸ ìŸ¤ 쟨 쟬 ì € ì  ì „ ì ˆ ì Š ì  ì ‘ ì “ ì • ì – ì œ ì  ì   ì ¤ ì ¬ ì ­ ì ¯ ì ± ì ¸ ì ¼ ì¡€ 졈 졉 ì¡Œ ì¡ ì¡” ì¡° 족 ì¡´ 졸 졺 좀 ì¢ ì¢ƒ 종-좇 좋-ì¢ ì¢” ì¢ ì¢Ÿ 좡 좨 좼 좽 죄 죈 죌 죔 죕 죗 죙 죠 죡 죤 죵 주 죽 준 줄-줆 줌 ì¤ ì¤ ì¤‘ 줘 줬 줴 ì¥ ì¥‘ 쥔 쥘 쥠 쥡 쥣 쥬 쥰 쥴 쥼 즈 즉 즌 ì¦ ì¦˜ 즙 즛 ì¦ ì§€ ì§ ì§„ 짇 질 짊 ì§ ì§‘ 짓 징 짖 짙 짚 짜 ì§ ì§  짢 짤 짧 짬 짭 짯-짱 째 짹 짼 쨀 쨈 쨉 쨋-ì¨ ì¨” 쨘 쨩 ì©Œ ì© ì© ì©” ì©œ ì© ì©Ÿ-ì©¡ 쩨 쩽 쪄 쪘 쪼 쪽 ì«€ ì«„ ì«Œ ì« ì« ì«‘ ì«“ 쫘 ì«™ ì«  쫬 ì«´ 쬈 ì¬ ì¬” 쬘 쬠 쬡 ì­ ì­ˆ ì­‰ ì­Œ ì­ ì­˜ ì­™ ì­ ì­¤ ì­¸ ì­¹ 쮜 쮸 쯔 쯤 쯧 쯩 ì°Œ ì° ì° ì°” ì°œ ì° ì°¡ ì°¢ ì°§-ì°© ì°¬ ì°® ì°° ì°¸ ì°¹ ì°»-ì°¾ 채 ì±… 챈 챌 ì±” 챕 ì±—-ì±™ ì±  챤 챦 챨 ì±° ì±µ 처 ì²™ 천 ì²  첨 첩 첫-ì²­ ì²´ ì²µ 첸 ì²¼ 쳄 ì³… 쳇 쳉 ì³ ì³” 쳤 쳬 ì³° ì´ ì´ˆ ì´‰ ì´Œ ì´ ì´˜ ì´™ ì´› ì´ ì´¤ ì´¨ ì´¬ ì´¹ 최 ìµ  쵤 쵬 ìµ­ 쵯 ìµ± 쵸 춈 추 축 춘 출 춤 춥 춧 충 춰 ì·„ ì·Œ ì· ì·¨ ì·¬ ì·° ì·¸ ì·¹ ì·» ì·½ 츄 츈 츌 츔 츙 츠 측 츤 츨 츰 츱 츳 층 치 ì¹™ 친 칟-칡 침 칩 칫 ì¹­ ì¹´ ì¹µ 칸 ì¹¼ 캄 캅 캇 캉 ìº ìº‘ 캔 캘 캠 캡 캣-캥 캬 캭 ì» ì»¤ 컥 컨 컫 컬 ì»´ 컵 ì»·-컹 ì¼€ ì¼ ì¼„ 켈 ì¼ ì¼‘ 켓 켕 켜 ì¼  켤 켬 ì¼­ 켯-ì¼± 켸 ì½” 콕 콘 콜 콤 ì½¥ 콧 콩 ì½° ì½± ì½´ 콸 ì¾€ ì¾… 쾌 쾡 쾨 ì¾° ì¿„ ì¿  ì¿¡ 쿤 쿨 ì¿° 쿱 쿳 쿵 쿼 퀀 퀄 퀑 퀘 퀭 퀴 퀵 퀸 퀼 í„ í… í‡ í‰ í í” í˜ í  í¬ í­ í° í´ í¼ í½ í‚ í‚¤ í‚¥ 킨 킬 í‚´ 킵 í‚· 킹 타 íƒ íƒ„ 탈 탉 íƒ íƒ‘ 탓-탕 태 íƒ íƒ  탤 탬 탭 탯-탱 탸 í„ í„° 턱 í„´ 털 턺 í…€ í… í…ƒ-í…… í…Œ í… í… í…” í…œ í… í…Ÿ í…¡ í…¨ í…¬ í…¼ 톄 톈 토 톡 톤 톨 톰 톱 톳 통 톺 톼 퇀 퇘 퇴 퇸 툇 툉 íˆ íˆ¬ 툭 툰 툴 툼 툽 툿 í‰ í‰ˆ 퉜 퉤 튀 íŠ íŠ„ 튈 íŠ íŠ‘ 튕 튜 튠 튤 튬 튱 트 특 튼 튿 í‹€ í‹‚ 틈 틉 í‹‹ í‹” 틘 í‹œ 틤 í‹¥ í‹° 틱 í‹´ 틸 팀 íŒ íŒƒ 팅 파-팎 íŒ íŒ” 팖 팜 íŒ íŒŸ-팡 팥 패 팩 팬 팰 팸 팹 팻-팽 í„ í… í¼ í½ íŽ€ 펄 펌 íŽ íŽ-펑 페 펙 펜 펠 펨 펩 펫 펭 펴 편 펼 í„ í… íˆ í‰ í í˜ í¡ í£ í¬ í­ í° í´ í¼ í½ í¿ í íˆ í í‘€ í‘„ í‘œ í‘  푤 í‘­ 푯 푸 푹 푼 í‘¿ í’€ í’‚ í’ˆ í’‰ í’‹ í’ í’” í’© í“Œ í“ í“” í“œ í“Ÿ 퓨 퓬 í“° 퓸 í“» 퓽 프 픈 플 í”” 픕 í”— 피 픽 í•€ í•„ í•Œ í• í• í•‘ 하 í•™ í•œ í•  í•¥ 함 í•© í•« í•­ í•´ 핵 핸 핼 í–„ í–… í–‡-í–‰ í– í–¥ í—ˆ í—‰ í—Œ í— í—’ í—˜ í—™ í—› í— í—¤ í—¥ í—¨ í—¬ í—´ í—µ í—· í—¹ 혀 í˜ í˜„ 혈 í˜ í˜‘ 혓-형 혜 혠 혤 혭 호 혹 혼 홀 í™… 홈 홉 홋 í™ í™‘ í™” 확 환 활 홧 황 í™° í™± í™´ 횃 íš… 회 íš íš íš” íš íšŸ íš¡ 효 횬 íš° íš¹ íš» 후 í›… 훈 훌 훑 í›” í›— í›™ í›  훤 훨 í›° 훵 훼 훽 휀 휄 휑 휘 휙 휜 휠 휨 휩 휫 휭 휴 휵 휸 휼 í„ í‡ í‰ í í‘ í” í–-í™ í  í¡ í£ í¥ í© í¬ í° í´ í¼ í½ íž ížˆ 힉 힌 íž íž˜ íž™ íž› íž]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">1ì›”</month>
+ <month type="2">2ì›”</month>
+ <month type="3">3ì›”</month>
+ <month type="4">4ì›”</month>
+ <month type="5">5ì›”</month>
+ <month type="6">6ì›”</month>
+ <month type="7">7ì›”</month>
+ <month type="8">8ì›”</month>
+ <month type="9">9ì›”</month>
+ <month type="10">10ì›”</month>
+ <month type="11">11ì›”</month>
+ <month type="12">12ì›”</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">1ì›”</month>
+ <month type="2">2ì›”</month>
+ <month type="3">3ì›”</month>
+ <month type="4">4ì›”</month>
+ <month type="5">5ì›”</month>
+ <month type="6">6ì›”</month>
+ <month type="7">7ì›”</month>
+ <month type="8">8ì›”</month>
+ <month type="9">9ì›”</month>
+ <month type="10">10ì›”</month>
+ <month type="11">11ì›”</month>
+ <month type="12">12ì›”</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">1ì›”</month>
+ <month type="2">2ì›”</month>
+ <month type="3">3ì›”</month>
+ <month type="4">4ì›”</month>
+ <month type="5">5ì›”</month>
+ <month type="6">6ì›”</month>
+ <month type="7">7ì›”</month>
+ <month type="8">8ì›”</month>
+ <month type="9">9ì›”</month>
+ <month type="10">10ì›”</month>
+ <month type="11">11ì›”</month>
+ <month type="12">12ì›”</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">ì¼</day>
+ <day type="mon">ì›”</day>
+ <day type="tue">í™”</day>
+ <day type="wed">수</day>
+ <day type="thu">목</day>
+ <day type="fri">금</day>
+ <day type="sat">토</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">ì¼ìš”ì¼</day>
+ <day type="mon">월요ì¼</day>
+ <day type="tue">화요ì¼</day>
+ <day type="wed">수요ì¼</day>
+ <day type="thu">목요ì¼</day>
+ <day type="fri">금요ì¼</day>
+ <day type="sat">토요ì¼</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">ì¼</day>
+ <day type="mon">ì›”</day>
+ <day type="tue">í™”</day>
+ <day type="wed">수</day>
+ <day type="thu">목</day>
+ <day type="fri">금</day>
+ <day type="sat">토</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">ì¼</quarter>
+ <quarter type="2" draft="unconfirmed">ì´</quarter>
+ <quarter type="3" draft="unconfirmed">삼</quarter>
+ <quarter type="4" draft="unconfirmed">사</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">1</quarter>
+ <quarter type="2" draft="unconfirmed">2</quarter>
+ <quarter type="3" draft="unconfirmed">3</quarter>
+ <quarter type="4" draft="unconfirmed">4</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>오전</am>
+ <pm>오후</pm>
+ <eras>
+ <eraNames>
+ <era type="0">서력기ì›ì „</era>
+ <era type="1">서력기ì›</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">기ì›ì „</era>
+ <era type="1">서기</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>yyyy'ë…„' M'ì›”' d'ì¼' EEEE</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>yyyy'ë…„' M'ì›”' d'ì¼'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy. MM. dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yy. MM. dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>a hh'시' mm'분' ss'초' z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>a hh'시' mm'분' ss'초'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>a hh'시' mm'분'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>a hh'시' mm'분'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="Hms" draft="provisional">H'시' m'분' s'초'</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">MM. dd</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">yyyy. MM</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="America/Halifax">
+ <long>
+ <standard>대서양 표준시</standard>
+ <daylight>대서양 기준시</daylight>
+ </long>
+ <short>
+ <standard>AST</standard>
+ <daylight>ADT</daylight>
+ </short>
+ <exemplarCity>핼리팩스</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <standard>뉴펀들랜드 표준시</standard>
+ <daylight>뉴펀들랜드 기준시</daylight>
+ </long>
+ <short>
+ <standard>NST</standard>
+ <daylight>NDT</daylight>
+ </short>
+ <exemplarCity>St. Johns</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <standard>중국 표준시</standard>
+ <daylight>중국 표준시</daylight>
+ </long>
+ <short>
+ <standard>CTT</standard>
+ </short>
+ <exemplarCity>ìƒí•˜ì´</exemplarCity>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <standard>중부유럽 표준시</standard>
+ <daylight>중부유럽 기준시</daylight>
+ </long>
+ <short>
+ <standard>CET</standard>
+ <daylight>CEST</daylight>
+ </short>
+ <exemplarCity>파리</exemplarCity>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <standard>ì´ìŠ¤ë¼ì—˜ 표준시</standard>
+ <daylight>ì´ìŠ¤ë¼ì—˜ 기준시</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IDT</daylight>
+ </short>
+ <exemplarCity>예루살렘</exemplarCity>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <standard>ì¼ë³¸ 표준시</standard>
+ <daylight>ì¼ë³¸ 표준시</daylight>
+ </long>
+ <short>
+ <standard>JST</standard>
+ <daylight>JST</daylight>
+ </short>
+ <exemplarCity>ë„ì¿„</exemplarCity>
+ </zone>
+ <zone type="Asia/Seoul">
+ <long>
+ <standard>한국표준시</standard>
+ <daylight>한국표준시</daylight>
+ </long>
+ <short>
+ <standard>KST</standard>
+ <daylight>KST</daylight>
+ </short>
+ <exemplarCity>서울</exemplarCity>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <standard>그리니치 표준시</standard>
+ <daylight>그리니치 표준시</daylight>
+ </long>
+ <short>
+ <standard>GMT</standard>
+ <daylight>GMT</daylight>
+ </short>
+ <exemplarCity>카사블랑카</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>ë™ë¶€ìœ ëŸ½ 표준시</standard>
+ <daylight>ë™ë¶€ìœ ëŸ½ 기준시</daylight>
+ </long>
+ <short>
+ <standard>EET</standard>
+ <daylight>EEST</daylight>
+ </short>
+ <exemplarCity>부쿠레슈티</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <standard>í•˜ì™€ì´ í‘œì¤€ì‹œ</standard>
+ <daylight>í•˜ì™€ì´ í‘œì¤€ì‹œ</daylight>
+ </long>
+ <short>
+ <standard>HST</standard>
+ <daylight>HST</daylight>
+ </short>
+ <exemplarCity>호놀룰루</exemplarCity>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <standard>알래스카 표준시</standard>
+ <daylight>알래스카 기준시</daylight>
+ </long>
+ <short>
+ <standard>AKST</standard>
+ <daylight>AKDT</daylight>
+ </short>
+ <exemplarCity>앵커리지</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <standard>태í‰ì–‘ 표준시</standard>
+ <daylight>태í‰ì–‘ 기준시</daylight>
+ </long>
+ <short>
+ <standard>PST</standard>
+ <daylight>PDT</daylight>
+ </short>
+ <exemplarCity>로스앤젤레스</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <long>
+ <standard>산악 표준시</standard>
+ <daylight>산악 표준시</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MST</daylight>
+ </short>
+ <exemplarCity>피닉스</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <standard>산악 표준시</standard>
+ <daylight>산악 기준시</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MDT</daylight>
+ </short>
+ <exemplarCity>ë´ë²„</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <standard>중부 표준시</standard>
+ <daylight>중부 기준시</daylight>
+ </long>
+ <short>
+ <standard>CST</standard>
+ <daylight>CDT</daylight>
+ </short>
+ <exemplarCity>시카고</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <long>
+ <standard>ë™ë¶€ 표준시 (ì¸ë””애나í´ë¦¬ìŠ¤)</standard>
+ <daylight>ë™ë¶€ 기준시 (ì¸ë””애나í´ë¦¬ìŠ¤)</daylight>
+ </long>
+ <short>
+ <standard>EST (IN)</standard>
+ <daylight>EDT (IN)</daylight>
+ </short>
+ <exemplarCity>ì¸ë””애나í´ë¦¬ìŠ¤</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <standard>ë™ë¶€ 표준시</standard>
+ <daylight>ë™ë¶€ 기준시</daylight>
+ </long>
+ <short>
+ <standard>EST</standard>
+ <daylight>EDT</daylight>
+ </short>
+ <exemplarCity>뉴욕</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ADP">
+ <displayName>안ë„ë¼ íŽ˜ì„¸íƒ€</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>ì•„ëžì—미레ì´íŠ¸ 디나르</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>아프가니 (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>아프가니</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName>알바니아 ë ˆí¬</displayName>
+ </currency>
+ <currency type="AMD">
+ <displayName>아르메니아 드람</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName>네ë¸ëž€ë“œ 안틸레스 êµ´ë´</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName>ì•™ê³¨ë¼ ì½´ìž</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>ì•™ê³¨ë¼ ì½´ìž (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>ì•™ê³¨ë¼ ì‹ ê·„ ì½´ìž (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>ì•™ê³¨ë¼ ì½´ìž Reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>아르헨티나 오스트랄</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>아르헨티나 페소 (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>아르헨티나 페소</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName>호주 실ë§</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>호주 달러</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName>아루바 길ë”</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>아제르바ì´ì   마나트</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>보스니아-헤르체고비나 디나르</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>보스니아-헤르체고비나 태환 마르í¬</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName>바베ì´ë„스 달러</displayName>
+ </currency>
+ <currency type="BDT">
+ <displayName>방글ë¼ë°ì‹œ 타카</displayName>
+ </currency>
+ <currency type="BEC">
+ <displayName>ë²¨ê¸°ì— í”„ëž‘ (태환)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>ë²¨ê¸°ì— í”„ëž‘</displayName>
+ </currency>
+ <currency type="BEL">
+ <displayName>ë²¨ê¸°ì— í”„ëž‘ (금융)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>불가리아 ë™ì „ ë ›</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName>불가리아 신권 렛</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>ë°”ë ˆì¸ ë””ë‚˜ë¥´</displayName>
+ </currency>
+ <currency type="BIF">
+ <displayName>부룬디 프랑</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName>버뮤다 달러</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName>ë¶€ë£¨ë‚˜ì´ ë‹¬ëŸ¬</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>볼리비아노</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>볼리비아노 페소</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>볼리비아노 í¬ë£¨ì œì´ë£¨ 노보 (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>브ë¼ì§ˆ í¬ë£¨ìžë‘</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>브ë¼ì§ˆ í¬ë£¨ì œì´ë£¨ (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>브ë¼ì§ˆ 레알</displayName>
+ </currency>
+ <currency type="BRN">
+ <displayName>브ë¼ì§ˆ í¬ë£¨ìžë‘ 노보</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>브ë¼ì§ˆ í¬ë£¨ì œì´ë£¨</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>바하마 달러</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>부탄 눌투눔</displayName>
+ </currency>
+ <currency type="BUK">
+ <displayName>버마 차트</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>보츠와나 í´ë¼</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>벨ë¼ë£¨ìŠ¤ 신권 루블 (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>벨ë¼ë£¨ìŠ¤ 루블</displayName>
+ </currency>
+ <currency type="BZD">
+ <displayName>벨리즈 달러</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>ìºë‚˜ë‹¤ 달러</displayName>
+ </currency>
+ <currency type="CDF">
+ <displayName>콩고 프랑 콩골ë¼ìŠ¤</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>스위스 프랑달러</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>칠레 페소</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>중국 위안 ì¸ë¯¼í</displayName>
+ </currency>
+ <currency type="COP">
+ <displayName>콜롬비아 페소</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>코스타리카 콜론</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>체코슬로바키아 ë™ì „ 코루나</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>쿠바 페소</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>ì¹´ë³´ë² ë¥´ë° ì—스쿠ë„</displayName>
+ </currency>
+ <currency type="CYP">
+ <displayName>싸ì´í”„러스 파운드</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName>체코 공화국 코루나</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>ë™ë… 오스트마르í¬</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>ë…ì¼ ë§ˆë¥´í¬</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>지부티 프랑</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName>ë´ë§ˆí¬ í¬ë¡œë„¤</displayName>
+ </currency>
+ <currency type="DOP">
+ <displayName>ë„미니카 페소</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName>알제리 디나르</displayName>
+ </currency>
+ <currency type="ECS">
+ <displayName>ì—ì¿ ì•„ë„르 수í¬ë ˆ</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>ì—스토니아 í¬ë£¬</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>ì´ì§‘트 파운드</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>ì—리트리아 나í¬íŒŒ</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>ìŠ¤íŽ˜ì¸ íŽ˜ì„¸íƒ€</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>ì´ë””오피아 비르</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>유로화</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>핀란드 마르카</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>피지 달러</displayName>
+ </currency>
+ <currency type="FKP">
+ <displayName>í¬í´ëžœë“œì œë„ 파운드</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>프랑스 프랑</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>ì˜êµ­ë ¹ 파운드 스털ë§</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>그루지야 지í ë¼ë¦¬íŠ¸</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>그루지야 ë¼ë¦¬</displayName>
+ </currency>
+ <currency type="GHC">
+ <displayName>가나 시디</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>지브롤터 파운드</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>ê°ë¹„ì•„ 달ë¼ì‹œ</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>기니 프랑</displayName>
+ </currency>
+ <currency type="GNS">
+ <displayName>기니 시리</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>그리스 ë“œë¼í¬ë§ˆ</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>과테ë§ë¼ 케트살</displayName>
+ </currency>
+ <currency type="GWE">
+ <displayName>í¬ë¥´íˆ¬ê°ˆë ¹ 기니 ì—스쿠ë„</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>ê¸°ë„¤ë¹„ì˜ íŽ˜ì†Œ</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>ê°€ì´ì•„나 달러</displayName>
+ </currency>
+ <currency type="HKD">
+ <displayName>í™ì½© 달러</displayName>
+ </currency>
+ <currency type="HNL">
+ <displayName>온ë‘ë¼ìŠ¤ 렘피ë¼</displayName>
+ </currency>
+ <currency type="HRD">
+ <displayName>í¬ë¡œì•„í‹°ì•„ 디나르</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>í¬ë¡œì•„í‹°ì•„ 쿠나</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>하ì´í‹° 구르드</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>í—가리 í¬ë¦°íŠ¸</displayName>
+ </currency>
+ <currency type="IDR">
+ <displayName>ì¸ë„네시아 루피아</displayName>
+ </currency>
+ <currency type="IEP">
+ <displayName>ì•„ì¼ëžœë“œ 파운드</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>ì´ìŠ¤ë¼ì—˜ 파운드</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>ì´ìŠ¤ë¼ì—˜ 신권 세켈</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>ì¸ë„ 루피</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>ì´ë¼í¬ 디나르</displayName>
+ </currency>
+ <currency type="IRR">
+ <displayName>ì´ëž€ 리얄</displayName>
+ </currency>
+ <currency type="ISK">
+ <displayName>ì•„ì´ìŠ¬ëž€ë“œ í¬ë¡œë‚˜</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>ì´íƒˆë¦¬ì•„ 리ë¼</displayName>
+ <symbol>ITL</symbol>
+ </currency>
+ <currency type="JMD">
+ <displayName>ìžë©”ì´ì¹´ 달러</displayName>
+ </currency>
+ <currency type="JOD">
+ <displayName>요르단 디나르</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>ì¼ë³¸ 엔화</displayName>
+ <symbol>ï¿¥</symbol>
+ </currency>
+ <currency type="KES">
+ <displayName>ì¼€ëƒ ì‹¤ë§</displayName>
+ </currency>
+ <currency type="KGS">
+ <displayName>키르기스스탄 솜</displayName>
+ </currency>
+ <currency type="KHR">
+ <displayName>캄보디아 리얄</displayName>
+ </currency>
+ <currency type="KMF">
+ <displayName>코모르 프랑</displayName>
+ </currency>
+ <currency type="KPW">
+ <displayName>ì¡°ì„  ë¯¼ì£¼ì£¼ì˜ ì¸ë¯¼ 공화국 ì›</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>대한민국 ì›</displayName>
+ <symbol>₩</symbol>
+ </currency>
+ <currency type="KWD">
+ <displayName>쿠웨ì´íŠ¸ 디나르</displayName>
+ </currency>
+ <currency type="KYD">
+ <displayName>ì¼€ì´ë§¨ ì œë„ ë‹¬ëŸ¬</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>ì¹´ìží스탄 í…게</displayName>
+ </currency>
+ <currency type="LAK">
+ <displayName>ë¼ì˜¤ìŠ¤ 키프</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>레바논 파운드</displayName>
+ </currency>
+ <currency type="LKR">
+ <displayName>스리랑카 루피</displayName>
+ </currency>
+ <currency type="LRD">
+ <displayName>ë¼ì´ë² ë¦¬ì•„ 달러</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>레소토 로티</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>리투아니아 리타</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>ë£©ì…ˆë¶€ë¥´í¬ íƒ€ë¡œë‚˜</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>ë£©ì…ˆë¶€ë¥´í¬ í”„ëž‘</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>ë¼íŠ¸ë¹„ì•„ ë¼íŠ¸</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>ë¼íŠ¸ë¹„ì•„ 루블</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>리비아 디나르</displayName>
+ </currency>
+ <currency type="MAD">
+ <displayName>모로코 디렘</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>모로코 프랑</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>몰ë„ë°” ë ˆì´</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>마다가스카르 아리아리</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>마다가스카르 프랑</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>마케ë„니아 디나르</displayName>
+ </currency>
+ <currency type="MLF">
+ <displayName>ë§ë¦¬ 프랑</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>미얀마 키ì–</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>몽골 투그릭</displayName>
+ </currency>
+ <currency type="MOP">
+ <displayName>마카오 파타카</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>모리타니 우기야</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>몰타 리ë¼</displayName>
+ </currency>
+ <currency type="MTP">
+ <displayName>몰타 파운드</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>모리셔스 루피</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>몰디브 ì œë„ ë£¨í”¼ì•„</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>ë§ë¼ìœ„ ì½°ì³</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName>멕시코 페소</displayName>
+ </currency>
+ <currency type="MXP">
+ <displayName>멕시코 실버 페소 (1861-1992)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>ë§ë ˆì´ì§€ì•„ ë§ê¸°íŠ¸</displayName>
+ </currency>
+ <currency type="MZE">
+ <displayName>ëª¨ìž ë¹„í¬ ì—스쿠ë„</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>ëª¨ìž ë¹„í¬ ë©”í‹°ì¹¼</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName>나미비아 달러</displayName>
+ </currency>
+ <currency type="NGN">
+ <displayName>니제르 나ì´ë¼</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>니카ë¼ê³¼ 코르ë„ë°”</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>니카ë¼ê³¼ 코르ë„ë°” 오로</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>네ë¸ëž€ë“œ 길ë”</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>ë…¸ë¥´ì›¨ì´ í¬ë¡œë„¤</displayName>
+ </currency>
+ <currency type="NPR">
+ <displayName>네팔 루피</displayName>
+ </currency>
+ <currency type="NZD">
+ <displayName>뉴질랜드 달러</displayName>
+ </currency>
+ <currency type="OMR">
+ <displayName>오만 리얄</displayName>
+ </currency>
+ <currency type="PAB">
+ <displayName>파나마 발보아</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>페루 ì¸í‹°</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>페루 솔 누ì—ë³´</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>페루 솔</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>파푸아뉴기니 키나</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>필리핀 페소</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>파키스탄 루피</displayName>
+ </currency>
+ <currency type="PLN">
+ <displayName>í´ëž€ë“œ ì¦ë¡œí‹°</displayName>
+ </currency>
+ <currency type="PLZ">
+ <displayName>í´ëž€ë“œ ì¦ë¡œí‹° (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>í¬ë¥´íˆ¬ê°ˆ ì—스쿠ë„</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>파ë¼ê³¼ì´ ê³¼ë¼ë‹ˆ</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>카타르 리얄</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>루마니아 ë ˆì´</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>러시아 루블</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>러시아 루블 (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>르완다 프랑</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>사우디아ë¼ë¹„ì•„ 리얄</displayName>
+ </currency>
+ <currency type="SBD">
+ <displayName>솔로몬 ì œë„ ë‹¬ëŸ¬</displayName>
+ </currency>
+ <currency type="SCR">
+ <displayName>세ì´ì‰´ 루피</displayName>
+ </currency>
+ <currency type="SDD">
+ <displayName>수단 디나르</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>수단 파운드</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>ìŠ¤ì›¨ë´ í¬ë¡œë‚˜</displayName>
+ </currency>
+ <currency type="SGD">
+ <displayName>ì‹±ê°€í´ ë‹¬ëŸ¬</displayName>
+ </currency>
+ <currency type="SHP">
+ <displayName>세ì¸íŠ¸í—¬ë ˆë‚˜ 파운드</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>슬로베니아 톨ë¼ë¥´</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>슬로바키아 코루나</displayName>
+ </currency>
+ <currency type="SLL">
+ <displayName>ì‹œì—ë¼ë¦¬ì˜¨ 리온</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>소ë§ë¦¬ì•„ 실ë§</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>수리남 길ë”</displayName>
+ </currency>
+ <currency type="STD">
+ <displayName>ìƒíˆ¬ë©” 프린시페 ë„브ë¼</displayName>
+ </currency>
+ <currency type="SUR">
+ <displayName>소련 루블</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>엘살바ë„르 콜론</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>시리아 파운드</displayName>
+ </currency>
+ <currency type="SZL">
+ <displayName>스와질란드 릴랑게니</displayName>
+ </currency>
+ <currency type="THB">
+ <displayName>태국 바트</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>타지키스탄 루블</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>타지키스탄 소모니</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>투르í¬ë©”니스탄 마나트</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>튀니지 디나르</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>티모르 ì—스쿠ë„</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>터기 리ë¼</displayName>
+ </currency>
+ <currency type="TRY">
+ <displayName>새로운 터키 리ë¼</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>트리니다드 토바고 달러</displayName>
+ </currency>
+ <currency type="TWD">
+ <displayName>대만 신권 달러</displayName>
+ </currency>
+ <currency type="TZS">
+ <displayName>탄ìžë‹ˆì•„ 실ë§</displayName>
+ </currency>
+ <currency type="UAH">
+ <displayName>ìš°í¬ë¼ì´ë‚˜ 그리브나</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>우간다 ì‹¤ë§ (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>우간다 실ë§</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>미국 달러</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="UYP">
+ <displayName>ìš°ë£¨ê³¼ì´ íŽ˜ì†Œ (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>ìš°ë£¨ê³¼ì´ íŽ˜ì†Œ 우루과요</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName>우즈베키스탄 숨</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>ë² ë„¤ì£¼ì—˜ë¼ ë³¼ë¦¬ë°”ë¥´</displayName>
+ </currency>
+ <currency type="VND">
+ <displayName>베트남 ë™</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>바누아투 바투</displayName>
+ </currency>
+ <currency type="WST">
+ <displayName>ì„œ 사모아 탈ë¼</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>금</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>ë™ì¹´ë¦¬ë¸Œ 달러</displayName>
+ </currency>
+ <currency type="XDR">
+ <displayName>특별ì¸ì¶œê¶Œ</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>유럽 환율 단위</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>프랑스 Gold 프랑</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>프랑스 UIC-프랑</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>예멘 디나르</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>예멘 리알</displayName>
+ </currency>
+ <currency type="YUD">
+ <displayName>유고슬ë¼ë¹„ì•„ ë™ì „ 디나르</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>유고슬ë¼ë¹„ì•„ 노비 디나르</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>유고슬ë¼ë¹„ì•„ 전환 디나르</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>남아프리카 랜드 (금융)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>남아프리카 랜드</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName>쟘비아 ì½°ì³</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>ìžì´ë¥´ 신권 ìžì´ë¥´</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>ìžì´ë¥´ ìžì´ë¥´</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>ì§ë¹„브웨 달러</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>예</yesstr>
+ <nostr>아니오</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Old English ( Change from &quot;ì´ì „ ì˜ì–´ (ca.450-1100)&quot; to &quot;ì˜ì–´ (고대) (450ë…„-1100ë…„ê²½)&quot; )</reference>
+ <reference type="RP10" uri="http://endic.naver.com/endic.naver?docid=25760&amp;rd=s">Language: Ainu ( Change from &quot;ain&quot; to &quot;ì•„ì´ëˆ„ì–´&quot; )</reference>
+ <reference type="RP11" uri="http://100.empas.com/dicsearch/pentry.html?i=166595&amp;v=47">Language: Algonquian Languages ( Change from &quot;알콘킨어&quot; to &quot;알공킨어족&quot; )</reference>
+ <reference type="RP12" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Southern Altai ( Change from &quot;alt&quot; to &quot;남부 알타ì´ì–´&quot; )</reference>
+ <reference type="RP13" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Athapascan Languages ( Change from &quot;아타바스카어&quot; to &quot;아타파스카어군&quot; )</reference>
+ <reference type="RP14" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Australian Languages ( Change from &quot;오스트레ì¼ë¦¬ì•„ì–´&quot; to &quot;오스트레ì¼ë¦¬ì•„어족&quot; )</reference>
+ <reference type="RP16" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Braj ( Change from &quot;브ë¼ì–´&quot; to &quot;브ë¼ì§€ì–´&quot; )</reference>
+ <reference type="RP17" uri="http://endic.naver.com/endic.naver?docid=198910&amp;rd=s">Language: Chechen ( Change from &quot;ce&quot; to &quot;체첸어&quot; )</reference>
+ <reference type="RP18" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Chuukese ( Change from &quot;츄케스어&quot; to &quot;추í¬ì–´&quot; )</reference>
+ <reference type="RP19" uri="http://100.empas.com/dicsearch/pentry.html?i=187759&amp;v=43">Language: Chamic languages ( Change from &quot;카믹어&quot; to &quot;참어군&quot; )</reference>
+ <reference type="RP2" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Middle Dutch ( Change from &quot;네ëœëž€ë“œ, 중세 (ca.1050-1350)&quot; to &quot;네ëœëž€ë“œ (중세) (1050ë…„-1350ë…„ê²½)&quot; )</reference>
+ <reference type="RP20" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Other English-based Creoles and Pidgins ( Change from &quot;í¬ë ˆì˜¤ë¦¬ìŠ¤ì™€ 피긴스어, ì˜ì–´-기반 (기타)&quot; to &quot;í¬ë¦¬ì˜¬ì–´ ë° í”¼ì§„ì–´ (ì˜ì–´ë¥¼ 기반으로 í•œ 기타)&quot; )</reference>
+ <reference type="RP21" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Other French-based Creoles and Pidgins ( Change from &quot;í¬ë ˆì˜¤ë¦¬ìŠ¤ì™€ 피긴스어, 프랑스어-기반 (기타)&quot; to &quot;í¬ë¦¬ì˜¬ì–´ ë° í”¼ì§„ì–´ (프랑스어를 기반으로 í•œ 기타)&quot; )</reference>
+ <reference type="RP22" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Other Portuguese-based Creoles and Pidgins ( Change from &quot;í¬ë ˆì˜¤ë¦¬ìŠ¤ì™€ 피긴스어, í¬ë¥´íˆ¬ê°ˆì–´-기반 (기타)&quot; to &quot;í¬ë¦¬ì˜¬ì–´ ë° í”¼ì§„ì–´ (í¬ë¥´íˆ¬ê°ˆì–´ë¥¼ 기반으로 í•œ 기타)&quot; )</reference>
+ <reference type="RP23" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Creoles and Pidgins (Other) ( Change from &quot;í¬ë ˆì˜¤ìŠ¤ì™€ 피긴스어 (기타)&quot; to &quot;í¬ë¦¬ì˜¬ì–´ ë° í”¼ì§„ì–´ (기타)&quot; )</reference>
+ <reference type="RP24" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Church Slavic ( Change from &quot;êµíšŒìŠ¬ë¼ë¸Œì–´&quot; to &quot;êµíšŒ 슬ë¼ë¸Œì–´&quot; )</reference>
+ <reference type="RP25" uri="http://endic.naver.com/endic.naver?docid=285640">Language: Cushitic (Other) ( Change from &quot;쿠시트제족어(기타)&quot; to &quot;쿠시어파 (기타)&quot; )</reference>
+ <reference type="RP26" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Lower Sorbian ( Change from &quot;저급 소르비안어&quot; to &quot;소르비아어 (저지)&quot; )</reference>
+ <reference type="RP27" uri="http://100.naver.com/100.php?id=714678">Language: Dzongkha ( Change from &quot;부탄어&quot; to &quot;종카어&quot; )</reference>
+ <reference type="RP28" uri="http://100.naver.com/100.php?id=99022">Language: Scottish Gaelic ( Change from &quot;스코갤릭어&quot; to &quot;스코틀랜드 게ì¼ì–´&quot; )</reference>
+ <reference type="RP29" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Upper Sorbian ( Change from &quot;위 소르비안어&quot; to &quot;소르비아어 (고지)&quot; )</reference>
+ <reference type="RP3" uri="http://endic.naver.com/endic.naver?docid=851860&amp;rd=s">Language: Persian ( Change from &quot;ì´ëž€ì–´&quot; to &quot;페르시아어&quot; )</reference>
+ <reference type="RP30" uri="http://endic.naver.com/endic.naver?docid=539580&amp;rd=s">Language: Herero ( Change from &quot;hz&quot; to &quot;헤레로어&quot; )</reference>
+ <reference type="RP31" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Sichuan Yi ( Change from &quot;시츄안 ì´ì–´&quot; to &quot;ì“°ì´¨ ì´ì–´&quot; )</reference>
+ <reference type="RP32" uri="http://100.empas.com/dicsearch/pentry.html?i=152427&amp;v=47">Language: Khotanese ( Change from &quot;코탄스어&quot; to &quot;호탄어&quot; )</reference>
+ <reference type="RP33" uri="http://100.empas.com/dicsearch/pentry.html?i=196896&amp;v=44">Language: Kimbundu ( Change from &quot;킴분누어&quot; to &quot;킴분ë‘ì–´&quot; )</reference>
+ <reference type="RP34" uri="http://100.empas.com/dicsearch/pentry.html?i=192788&amp;v=42">Language: Kannada ( Change from &quot;카나다어&quot; to &quot;칸나다어&quot; )</reference>
+ <reference type="RP35" uri="http://100.empas.com/dicsearch/pentry.html?i=196202&amp;v=45">Language: Kpelle ( Change from &quot;코펠레&quot; to &quot;í¬íŽ ë ˆì–´&quot; )</reference>
+ <reference type="RP36" uri="http://100.empas.com/dicsearch/pentry.html?i=130907&amp;v=46">Language: Madurese ( Change from &quot;마ë‘레세&quot; to &quot;마ë‘ë¼ì–´&quot; )</reference>
+ <reference type="RP37" uri="http://ko.wikipedia.org/wiki/ISO_639">Language : Mirandese ( Change from &quot;mwl&quot; to &quot;미란ë°ì–´&quot;)</reference>
+ <reference type="RP38" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Low German; Low Saxon ( Change from &quot;저급 ë…ì¼ì–´; 저급 색슨어&quot; to &quot;저지 ë…ì¼ì–´; 저지 색슨어&quot; )</reference>
+ <reference type="RP39" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Newari ( Change from &quot;네와리어&quot; to &quot;네와르어&quot; )</reference>
+ <reference type="RP4" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Middle French ( Change from &quot;프랑스어, 중세 (ca.1400-1600)&quot; to &quot;프랑스어 (중세) (1400년-1600년경&quot; )</reference>
+ <reference type="RP40" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Classical Newari ( Change from &quot;nwc&quot; to &quot;네와르어(고전)&quot; )</reference>
+ <reference type="RP41" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Occitan (post 1500); Provençal ( Change from &quot;옥시트어&quot; to &quot;오í¬ì–´ (1500ë…„ ì´í›„); 프로방스어&quot; )</reference>
+ <reference type="RP42" uri="http://100.empas.com/dicsearch/pentry.html?i=200765&amp;v=45">Language: Pahlavi ( Change from &quot;팔빌레어&quot; to &quot;팔레비어&quot; )</reference>
+ <reference type="RP43" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Old Provençal ( Change from &quot;프로벤칼어, 고대 (1500ë…„ 까지)&quot; to &quot;프로방스어 (고대) (1500ë…„ ì´ì „)&quot; )</reference>
+ <reference type="RP44" uri="http://100.empas.com/dicsearch/pentry.html?i=202305&amp;v=44">Language: Portuguese ( Change from &quot;í¬ë¥´íˆ¬ì¹¼ì–´&quot; to &quot;í¬ë¥´íˆ¬ê°ˆì–´&quot; )</reference>
+ <reference type="RP45" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Rarotongan ( Change from &quot;파로톤간어&quot; to &quot;ë¼ë¡œí†µê°€ì–´&quot; )</reference>
+ <reference type="RP46" uri="http://endic.naver.com/endic.naver?docid=992780&amp;rd=s">Language: Rundi ( Change from &quot;반투어(부룬디)&quot; to &quot;룬디어&quot; )</reference>
+ <reference type="RP47" uri="http://endic.naver.com/endic.naver?docid=984990">Language: Root ( Change from &quot;root&quot; to &quot;ì–´ê·¼&quot; )</reference>
+ <reference type="RP48" uri="http://endic.naver.com/endic.naver?docid=1048270&amp;rd=s">Language: Sicilian ( Change from &quot;scn&quot; to &quot;시칠리아어&quot; )</reference>
+ <reference type="RP49" uri="http://100.empas.com/dicsearch/pentry.html?i=160218&amp;v=42">Language: Sranan Tongo ( Change from &quot;srn&quot; to &quot;스ë¼ë‚œ 통가어&quot; )</reference>
+ <reference type="RP5" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Old French ( Change from &quot;프랑스어, 고대 (842-ca.1400)&quot; to &quot;프랑스어 (고대) (842년-1400년경)&quot; )</reference>
+ <reference type="RP50" uri="http://100.empas.com/dicsearch/pentry.html?i=156732&amp;v=46">Language: Serer ( Change from &quot;세셀어&quot; to &quot;세레르어&quot; )</reference>
+ <reference type="RP51" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Southern Sotho ( Change from &quot;소토어&quot; to &quot;소토어 (남부)&quot; )</reference>
+ <reference type="RP52" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Klingon ( Change from &quot;tlh&quot; to &quot;í´ë§ì˜¨ì–´&quot; )</reference>
+ <reference type="RP53" uri="http://100.empas.com/dicsearch/pentry.html?i=167061&amp;v=44">Language: Altaic (Other) ( Change from &quot;알타ì´ì–´ (기타)&quot; to &quot;알타ì´ì–´ì¡± (기타)&quot; )</reference>
+ <reference type="RP54" uri="http://endic.naver.com/endic.naver?docid=88880&amp;rd=s">script: Balinese ( Change from &quot;Bali&quot; to &quot;발리어&quot; )</reference>
+ <reference type="RP55" uri="http://endic.naver.com/endic.naver?docid=97750&amp;rd=s">script: Batak ( Change from &quot;Batk&quot; to &quot;바타í¬ì–´&quot; )</reference>
+ <reference type="RP56" uri="http://janghammo.com/board/kimsboard.php3?table=news&amp;action=re&amp;l=125&amp;de=123&amp;p=9">script: Blissymbols ( Change from &quot;Blis&quot; to &quot;블리스 ìƒì§•&quot; )&quot; ) </reference>
+ <reference type="RP57" uri="http://100.empas.com/dicsearch/pentry.html?i=149189&amp;v=44">script: Brahmi ( Change from &quot;Brah&quot; to &quot; 브ë¼ë¯¸&quot; )</reference>
+ <reference type="RP58" uri="http://100.empas.com/dicsearch/pentry.html?i=184421&amp;v=43">script: Braille ( Change from &quot;브ë¼ìœ &quot; to &quot;브ë¼ìœ  ì ìž&quot; )</reference>
+ <reference type="RP59" uri="http://endic.naver.com/endic.naver?docid=155060&amp;rd=s">script: Buginese ( Change from &quot;Bugi&quot; to &quot;부기어&quot; )</reference>
+ <reference type="RP6" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Middle High German ( Change from &quot;ë…ì¼ì–´, 중세 고급 (ca.1050-1500)&quot; to &quot;ë…ì¼ì–´ (중세 고지) (1050ë…„-1500ë…„ê²½)&quot; )</reference>
+ <reference type="RP60" uri="http://endic.naver.com/endic.naver?docid=194580">script: Cham ( Change from &quot;Cham&quot; to &quot;칸 고어&quot; )</reference>
+ <reference type="RP61" uri="http://fan.theonering.net/lotrlab/lab/pron.html">script: Cirth ( Change from &quot;Cirt&quot; to &quot;키르쓰&quot; )</reference>
+ <reference type="RP62" uri="http://100.empas.com/dicsearch/pentry.html?i=112962&amp;v=43">script: Cyrillic (Old Church Slavonic variant) ( Change from &quot;cyrs&quot; to &quot;키릴어 (고대 êµíšŒ 슬ë¼ë¸Œì–´ 변형)&quot; )</reference>
+ <reference type="RP63" uri="http://100.empas.com/dicsearch/pentry.html?i=124761&amp;v=43">script: Devanagari ( Change from &quot;ë°ë°”니가리어&quot; to &quot;ë°ë°”나가리&quot; )</reference>
+ <reference type="RP64" uri="http://endic.naver.com/endic.naver?docid=308300&amp;rd=s">script: Egyptian demotic ( Change from &quot;Egyd&quot; to &quot;고대 ì´ì§‘트 민간 문ìž&quot; )</reference>
+ <reference type="RP65" uri="http://endic.naver.com/endic.naver?docid=543060">script: Egyptian hieratic ( Change from &quot;Egyh&quot; to &quot;고대 ì´ì§‘트 ì‹ ê´€ 문ìž&quot; )</reference>
+ <reference type="RP66" uri="http://endic.naver.com/endic.naver?docid=543110&amp;rd=s">script: Egyptian hieroglyphs ( Change from &quot;Egyp&quot; to &quot;고대 ì´ì§‘트 ìƒí˜• 문ìž&quot; )</reference>
+ <reference type="RP67" uri="http://endic.naver.com/endic.naver?docid=483050">script: Georgian ( Change from &quot;그루지아어&quot; to &quot;그루지야어&quot; )</reference>
+ <reference type="RP68" uri="http://100.empas.com/dicsearch/pentry.html?i=117844&amp;v=46">script: Glagolitic ( Change from &quot;Glag&quot; to &quot;글ë¼ê³¨ 문ìž&quot; )</reference>
+ <reference type="RP69" uri="http://endic.naver.com/endic.naver?docid=523870&amp;rd=s">script: Hangul ( Change from &quot;한국어&quot; to &quot;한글&quot; ) </reference>
+ <reference type="RP7" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Old High German ( Change from &quot;ë…ì¼ì–´, 고대 저급 (ca.750-1050)&quot; to &quot;ë…ì¼ì–´ (고대 고지) (750ë…„-1050ë…„ê²½)&quot; )</reference>
+ <reference type="RP70" uri="http://endic.naver.com/endic.naver?docid=563300">script: Old Hungarian ( Change from &quot;Hung&quot; to &quot;고대 í—가리어&quot; )</reference>
+ <reference type="RP71" uri="http://100.empas.com/dicsearch/pentry.html?i=180989&amp;v=47">script: Indus (Harappan) ( Change from &quot;Inds&quot; to &quot;ì¸ë”스 (하ë¼íŒŒì–´)&quot; )</reference>
+ <reference type="RP72" uri="http://endic.naver.com/endic.naver?docid=617800&amp;rd=s">script: Javanese ( Change from &quot;Java&quot; to &quot;ìžë°”ì–´&quot; )</reference>
+ <reference type="RP73" uri="http://endic.naver.com/endic.naver?docid=456700">script: Latin (Fraktur variant) ( Change from &quot;Latf&quot; to &quot;ë¼í‹´ì–´ (ë…ì¼ì–´ 변형)&quot; )</reference>
+ <reference type="RP74" uri="http://endic.naver.com/endic.naver?docid=470210&amp;rd=s">script: Latin (Gaelic variant) ( Change from &quot;Latg&quot; to &quot;ë¼í‹´ì–´ (게ì¼ì–´ 변형)&quot; )</reference>
+ <reference type="RP75" uri="http://100.empas.com/dicsearch/pentry.html?i=131928&amp;v=47">script: Lepcha (Rong) ( Change from &quot;Lepc&quot; to &quot;렙차어 (롱어)&quot; )</reference>
+ <reference type="RP76" uri="http://endic.naver.com/endic.naver?docid=664860&amp;rd=s">script: Linear A ( Change from &quot;Lina&quot; to &quot;선형 ë¬¸ìž A&quot; )</reference>
+ <reference type="RP77" uri="http://endic.naver.com/endic.naver?docid=543110&amp;rd=s">script: Mayan hieroglyphs ( Change from &quot;Maya&quot; to &quot;마야 ìƒí˜• 문ìž&quot; )</reference>
+ <reference type="RP78" uri="http://100.naver.com/100.php?id=61395">script: Meroitic ( Change from &quot;Mero&quot; to &quot;ë©”ë¡œì— ë¬¸ìž&quot; )</reference>
+ <reference type="RP79" uri="http://100.empas.com/dicsearch/pentry.html?i=172213&amp;v=42">script: Ogham ( Change from &quot; 오그함어&quot; to &quot;오검 문ìž&quot; )</reference>
+ <reference type="RP8" uri="http://ko.wikipedia.org/wiki/ISO_639">Language: Tonga (Tonga Islands) ( Change from &quot;통가어&quot; to &quot;통아어 (통아 ì œë„) &quot; )</reference>
+ <reference type="RP80" uri="http://100.naver.com/100.php?id=115106 ">script: Orkhon ( Change from &quot;Orkh&quot; to &quot;오르콘&quot; )</reference>
+ <reference type="RP81" uri="http://preview.britannica.co.kr/bol/topic.asp?article_id=b23p2162a">script: Old Permic ( Change from &quot;Perm&quot; to &quot;고대 페름어&quot; )</reference>
+ <reference type="RP82" uri="http://www.encyber.com/search_w/ctdetail.php?gs=ws&amp;gd=&amp;cd=&amp;d=&amp;k=&amp;inqr=&amp;indme=&amp;p=1&amp;q=phags-pa&amp;masterno=180091&amp;contentno=180091">script: Phags-pa ( Change from &quot;Phag&quot; to &quot;파스파 문ìž&quot; )</reference>
+ <reference type="RP83" uri="http://www.encyber.com/search_w/ctdetail.php?gs=ws&amp;gd=&amp;cd=&amp;d=&amp;k=&amp;inqr=&amp;indme=&amp;p=1&amp;q=phoenician&amp;masterno=181056&amp;contentno=181056">script: Phoenician ( Change from &quot;Phnx&quot; to &quot;페니키아 문ìž&quot; )</reference>
+ <reference type="RP84" uri="http://endic.naver.com/endic.naver?docid=858180&amp;rd=s">script: Pollard Phonetic ( Change from &quot;Plrd&quot; to &quot;í´ë¼ë“œ í‘œìŒë¬¸ìž&quot; )</reference>
+ <reference type="RP85" uri="http://san.chosun.com/wdata/html/news/200410/20041003000003.html">script: Rongorongo ( Change from &quot;Roro&quot; to &quot;롱고롱고&quot; )</reference>
+ <reference type="RP86" uri="http://ko.wikipedia.org/wiki/ê¿°ëƒ">script: Sarati ( Change from &quot;Sara&quot; to &quot;사ë¼í‹°&quot; )</reference>
+ <reference type="RP87" uri="http://preview.britannica.co.kr/bol/topic.asp?article_id=b13s1747a">script: Syriac (Estrangelo variant) ( Change from &quot;Syre&quot; to &quot;시리아어 (ì—ìŠ¤íŠ¸ëž‘ê²”ë¼ ë³€í˜•)&quot; )</reference>
+ <reference type="RP88" uri="http://preview.britannica.co.kr/bol/topic.asp?article_id=b13s1747a">script: Syriac (Western variant) ( Change from &quot;Syrj&quot; to &quot;시리아어 (서부어 변형)&quot; )</reference>
+ <reference type="RP89" uri="http://preview.britannica.co.kr/bol/topic.asp?article_id=b13s1747a">script: Syriac (Estern variant) ( Change from &quot;Syrn&quot; to &quot;시리아어 (ë™ë¶€ì–´ 변형)&quot; )</reference>
+ <reference type="RP9" uri="http://endic.naver.com/endic.naver?docid=81090">Language: Avestan ( Change from &quot;ae&quot; to &quot;아베스타어&quot; )</reference>
+ <reference type="RP90" uri="http://ko.wikipedia.org/wiki/ê¿°ëƒ">script: Tengwar ( Change from &quot;Teng&quot; to &quot;탱과르&quot; )</reference>
+ <reference type="RP91" uri="http://preview.britannica.co.kr/bol/topic.asp?article_id=k96s0366">script: Tifinagh (Berber) ( Change from &quot;Tfng&quot; to &quot;티피나그 (베르베르어)&quot; )</reference>
+ <reference type="RP92" uri="http://www.encyber.com/search_w/ctdetail.php?gs=ws&amp;gd=&amp;cd=&amp;d=&amp;k=&amp;inqr=&amp;indme=&amp;p=1&amp;q=vai&amp;masterno=68962&amp;contentno=68962">script: Vai ( Change from &quot;Vaii&quot; to &quot;ë°”ì´ì–´&quot; )</reference>
+ <reference type="RP93" uri="http://endic.naver.com/endic.naver?docid=1251940&amp;rd=s">script: Visible Speech ( Change from &quot;Visp&quot; to &quot;시화법&quot; )</reference>
+ <reference type="RP94" uri="http://endic.naver.com/endic.naver?docid=797430&amp;rd=s">script: Old Persian ( Change from &quot;Xpeo&quot; to &quot;고대 페르시아어&quot; )</reference>
+ <reference type="RP95" uri="http://100.empas.com/dicsearch/pentry.html?i=156093">script: Sumero-Akkadian Cuneiform ( Change from &quot;Xsux&quot; to &quot;수메르-아카드어 설형문ìž&quot; )</reference>
+ <reference type="RP96" uri="http://en.wikipedia.org/wiki/Brazilian_Reals">Currency : Brazilian Real (symbol) ( Change from &quot;BRL&quot; to &quot;R$&quot; )</reference>
+ <reference type="RP97" uri="http://en.wikipedia.org/wiki/Renminbi">Currency : Chinese Yuan Renminbi (symbol) ( Change from &quot;CNY&quot; to &quot;Â¥&quot; )</reference>
+ <reference type="RP98" uri="http://en.wikipedia.org/wiki/Italian_Lira">Currency : Italian Lira (symbol) ( Change from &quot;ITL&quot; to &quot;₤&quot; )</reference>
+ <reference type="RP99" uri="http://en.wikipedia.org/wiki/North_Korean_Won">Currency : North Korean Won (symbol) ( Change from &quot;KPW&quot; to &quot;â‚©&quot; )</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ko_KR.xml b/libs/Zend/Locale/Data/ko_KR.xml
new file mode 100755
index 0000000000..a28916f9ae
--- /dev/null
+++ b/libs/Zend/Locale/Data/ko_KR.xml
@@ -0,0 +1,415 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.45 $"/>
+ <generation date="$Date: 2006/07/11 19:26:44 $"/>
+ <language type="ko"/>
+ <territory type="KR"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ae" draft="provisional">아베스타어</language>
+ <language type="ain" draft="provisional">ì•„ì´ëˆ„ì–´</language>
+ <language type="alg" draft="provisional">알공킨어족</language>
+ <language type="alt" draft="provisional">남부 알타ì´ì–´</language>
+ <language type="ang" draft="provisional">ì˜ì–´ (고대) (450ë…„-1100ë…„ê²½)</language>
+ <language type="ath" draft="provisional">아타파스카어군</language>
+ <language type="aus" draft="provisional">오스트레ì¼ë¦¬ì•„어족</language>
+ <language type="bai" draft="provisional">바밀레케어족</language>
+ <language type="bra" draft="provisional">브ë¼ì§€ì–´</language>
+ <language type="ce" draft="provisional">체첸어</language>
+ <language type="chk" draft="provisional">추í¬ì–´</language>
+ <language type="cmc" draft="provisional">참어군</language>
+ <language type="cpe" draft="provisional">í¬ë¦¬ì˜¬ì–´ ë° í”¼ì§„ì–´ (ì˜ì–´ë¥¼ 기반으로 í•œ 기타)</language>
+ <language type="cpf" draft="provisional">í¬ë¦¬ì˜¬ì–´ ë° í”¼ì§„ì–´ (프랑스어를 기반으로 í•œ 기타)</language>
+ <language type="cpp" draft="provisional">í¬ë¦¬ì˜¬ì–´ ë° í”¼ì§„ì–´ (í¬ë¥´íˆ¬ê°ˆì–´ë¥¼ 기반으로 í•œ 기타)</language>
+ <language type="crp" draft="provisional">í¬ë¦¬ì˜¬ì–´ ë° í”¼ì§„ì–´ (기타)</language>
+ <language type="cu" draft="provisional">êµíšŒ 슬ë¼ë¸Œì–´</language>
+ <language type="cus" draft="provisional">쿠시어파 (기타)</language>
+ <language type="dsb" draft="provisional">소르비아어 (저지)</language>
+ <language type="dum" draft="provisional">네ëœëž€ë“œ (중세) (1050ë…„-1350ë…„ê²½)</language>
+ <language type="dz" draft="provisional">종카어</language>
+ <language type="fa" draft="provisional">페르시아어</language>
+ <language type="frm" draft="provisional">프랑스어 (중세) (1400년-1600년경)</language>
+ <language type="fro" draft="provisional">프랑스어 (고대) (842년-1400년경)</language>
+ <language type="gd" draft="provisional">스코틀랜드 게ì¼ì–´</language>
+ <language type="gmh" draft="provisional">ë…ì¼ì–´ (중세 고지) (1050ë…„-1500ë…„ê²½)</language>
+ <language type="goh" draft="provisional">ë…ì¼ì–´ (고대 고지) (750ë…„-1050ë…„ê²½)</language>
+ <language type="hsb" draft="provisional">소르비아어 (고지)</language>
+ <language type="hz" draft="provisional">헤레로어</language>
+ <language type="ii" draft="provisional">ì“°ì´¨ ì´ì–´</language>
+ <language type="kho" draft="provisional">호탄어</language>
+ <language type="kmb" draft="provisional">킴분ë‘ì–´</language>
+ <language type="kn" draft="provisional">칸나다어</language>
+ <language type="kpe" draft="provisional">í¬íŽ ë ˆì–´</language>
+ <language type="mad" draft="provisional">마ë‘ë¼ì–´</language>
+ <language type="mwl" draft="provisional">미란ë°ì–´</language>
+ <language type="nds" draft="provisional">저지 ë…ì¼ì–´; 저지 색슨어</language>
+ <language type="new" draft="provisional">네와르어</language>
+ <language type="nwc" draft="provisional">네와르어 (고전)</language>
+ <language type="oc" draft="provisional">오í¬ì–´ (1500ë…„ ì´í›„); 프로방스어</language>
+ <language type="pal" draft="provisional">팔레비어</language>
+ <language type="peo" draft="provisional">페르시아 (고대) (BC 600년-BC 400년경)</language>
+ <language type="pro" draft="provisional">프로방스어 (고대) (1500ë…„ ì´ì „)</language>
+ <language type="pt" draft="provisional">í¬ë¥´íˆ¬ê°ˆì–´</language>
+ <language type="rar" draft="provisional">ë¼ë¡œí†µê°€ì–´</language>
+ <language type="rn" draft="provisional">룬디어</language>
+ <language type="root" draft="provisional">ì–´ê·¼</language>
+ <language type="scn" draft="provisional">시칠리아어</language>
+ <language type="srn" draft="provisional">스ë¼ë‚œ 통가어</language>
+ <language type="srr" draft="provisional">세레르어</language>
+ <language type="st" draft="provisional">소토어 (남부)</language>
+ <language type="tlh" draft="provisional">í´ë§ì˜¨ì–´</language>
+ <language type="to" draft="provisional">통아어 (통아 ì œë„)</language>
+ <language type="tut" draft="provisional">알타ì´ì–´ì¡± (기타)</language>
+ </languages>
+ <scripts>
+ <script type="Bali" draft="provisional">발리어</script>
+ <script type="Batk" draft="provisional">바타í¬ì–´</script>
+ <script type="Blis" draft="provisional">블리스 ìƒì§•</script>
+ <script type="Brah" draft="provisional">브ë¼ë¯¸</script>
+ <script type="Brai" draft="provisional">브ë¼ìœ  ì ìž</script>
+ <script type="Bugi" draft="provisional">부기어</script>
+ <script type="Cham" draft="provisional">칸 고어</script>
+ <script type="Cirt" draft="provisional">키르쓰</script>
+ <script type="Cyrs" draft="provisional">키릴어 (고대 êµíšŒ 슬ë¼ë¸Œì–´ 변형)</script>
+ <script type="Deva" draft="provisional">ë°ë°”나가리</script>
+ <script type="Egyd" draft="provisional">고대 ì´ì§‘트 민간 문ìž</script>
+ <script type="Egyh" draft="provisional">고대 ì´ì§‘트 ì‹ ê´€ 문ìž</script>
+ <script type="Egyp" draft="provisional">고대 ì´ì§‘트 ìƒí˜• 문ìž</script>
+ <script type="Geor" draft="provisional">그루지야어</script>
+ <script type="Glag" draft="provisional">글ë¼ê³¨ 문ìž</script>
+ <script type="Hang" draft="provisional">한글</script>
+ <script type="Hrkt" draft="provisional">가타카나 ë˜ëŠ” 히ë¼ì¹´ë‚˜</script>
+ <script type="Hung" draft="provisional">고대 í—가리어</script>
+ <script type="Inds" draft="provisional">ì¸ë”스 (하ë¼íŒŒì–´)</script>
+ <script type="Java" draft="provisional">ìžë°”ì–´</script>
+ <script type="Latf" draft="provisional">ë¼í‹´ì–´ (ë…ì¼ì–´ 변형)</script>
+ <script type="Latg" draft="provisional">ë¼í‹´ì–´ (게ì¼ì–´ 변형)</script>
+ <script type="Lepc" draft="provisional">렙차어 (롱어)</script>
+ <script type="Lina" draft="provisional">선형 ë¬¸ìž A</script>
+ <script type="Maya" draft="provisional">마야 ìƒí˜• 문ìž</script>
+ <script type="Mero" draft="provisional">ë©”ë¡œì— ë¬¸ìž</script>
+ <script type="Ogam" draft="provisional">오검 문ìž</script>
+ <script type="Orkh" draft="provisional">오르콘</script>
+ <script type="Perm" draft="provisional">고대 페름어</script>
+ <script type="Phag" draft="provisional">파스파 문ìž</script>
+ <script type="Phnx" draft="provisional">페니키아 문ìž</script>
+ <script type="Plrd" draft="provisional">í´ë¼ë“œ í‘œìŒ ë¬¸ìž</script>
+ <script type="Roro" draft="provisional">롱고롱고</script>
+ <script type="Sara" draft="provisional">사ë¼í‹°</script>
+ <script type="Syre" draft="provisional">시리아어 (ì—ìŠ¤íŠ¸ëž‘ê²”ë¼ ë³€í˜•)</script>
+ <script type="Syrj" draft="provisional">시리아어 (서부어 변형)</script>
+ <script type="Syrn" draft="provisional">시리아어 (ë™ë¶€ì–´ 변형)</script>
+ <script type="Teng" draft="provisional">탱과르</script>
+ <script type="Tfng" draft="provisional">티피나르 (베르베르어)</script>
+ <script type="Vaii" draft="provisional">ë°”ì´ì–´</script>
+ <script type="Visp" draft="provisional">시화법</script>
+ <script type="Xpeo" draft="provisional">고대 페르시아어</script>
+ <script type="Xsux" draft="provisional">수메르-아카드어 설형문ìž</script>
+ </scripts>
+ <territories>
+ <territory type="001">세계</territory>
+ <territory type="002">아프리카</territory>
+ <territory type="005">남아메리카[남미]</territory>
+ <territory type="009">오세아니아, 대양주</territory>
+ <territory type="011" draft="provisional">서부 아프리카</territory>
+ <territory type="013" draft="provisional">중앙 아메리카</territory>
+ <territory type="014" draft="provisional">ë™ë¶€ 아프리카</territory>
+ <territory type="015" draft="provisional">ë¶ë¶€ 아프리카</territory>
+ <territory type="017" draft="provisional">중부 아프리카</territory>
+ <territory type="018" draft="provisional">남부 아프리카</territory>
+ <territory type="019" draft="provisional">아메리카 대륙</territory>
+ <territory type="021" draft="provisional">ë¶ì•„메리카</territory>
+ <territory type="029" draft="provisional">카리브 í•´ ì œë„</territory>
+ <territory type="030" draft="provisional">ë™ì•„시아</territory>
+ <territory type="034" draft="provisional">남아시아</territory>
+ <territory type="035" draft="provisional">ë™ë‚¨ 아시아</territory>
+ <territory type="039" draft="provisional">남유럽</territory>
+ <territory type="053" draft="provisional">오스트레ì¼ë¦¬ì•„와 뉴질랜드</territory>
+ <territory type="054" draft="provisional">ë©œë¼ë„¤ì‹œì•„</territory>
+ <territory type="057" draft="provisional">미í¬ë¡œë„¤ì‹œì•„ 지역</territory>
+ <territory type="061" draft="provisional">í´ë¦¬ë„¤ì‹œì•„</territory>
+ <territory type="142">아시아</territory>
+ <territory type="143" draft="provisional">중앙 아시아</territory>
+ <territory type="145" draft="provisional">서아시아</territory>
+ <territory type="150">유럽</territory>
+ <territory type="151" draft="provisional">ë™ìœ ëŸ½</territory>
+ <territory type="154" draft="provisional">ë¶ìœ ëŸ½</territory>
+ <territory type="155" draft="provisional">서유럽</territory>
+ <territory type="172" draft="provisional">ë…립 êµ­ê°€ ì—°í•©</territory>
+ <territory type="419" draft="provisional">ë¼í‹´ 아메리카 ë° ì¹´ë¦¬ë¸Œ í•´ ì œë„</territory>
+ <territory type="CF" draft="provisional">중앙 아프리카 공화국</territory>
+ <territory type="MK" draft="provisional">마케ë„니아</territory>
+ <territory type="PT" draft="provisional">í¬ë¥´íˆ¬ê°ˆ</territory>
+ <territory type="QO" draft="provisional">오세아니아 외곽</territory>
+ <territory type="SB" draft="provisional">솔로몬 ì œë„</territory>
+ <territory type="ZA" draft="provisional">남아프리카 공화국</territory>
+ </territories>
+ </localeDisplayNames>
+ <delimiters>
+ <quotationStart>‘</quotationStart>
+ <quotationEnd>’</quotationEnd>
+ <alternateQuotationStart>“</alternateQuotationStart>
+ <alternateQuotationEnd>â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <timeFormats>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>a h:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>a h:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyQ" draft="provisional">yy'ë…„ë„ ì œ'Q'사분기'</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="America/Halifax">
+ <long>
+ <daylight draft="provisional">대서양 서머타임</daylight>
+ </long>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <daylight draft="provisional">뉴펀들랜드 서머타임</daylight>
+ </long>
+ <short>
+ <standard draft="provisional">NST</standard>
+ <daylight draft="provisional">NDT</daylight>
+ </short>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <daylight draft="provisional">중국 서머타임</daylight>
+ </long>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <daylight draft="provisional">중부유럽 서머타임</daylight>
+ </long>
+ <short>
+ <daylight draft="provisional">CEDT</daylight>
+ </short>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <daylight draft="provisional">ì´ìŠ¤ë¼ì—˜ 서머타임</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <daylight draft="provisional">ì¼ë³¸ 서머타임</daylight>
+ </long>
+ <short>
+ <daylight draft="provisional">JDT</daylight>
+ </short>
+ </zone>
+ <zone type="Asia/Seoul">
+ <long>
+ <standard draft="provisional">한국 표준시</standard>
+ <daylight draft="provisional">한국 서머타임</daylight>
+ </long>
+ <short>
+ <daylight draft="provisional">KDT</daylight>
+ </short>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <daylight draft="provisional">그리니치 서머타임</daylight>
+ </long>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <daylight draft="provisional">ë™ë¶€ìœ ëŸ½ 서머타임</daylight>
+ </long>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <daylight draft="provisional">í•˜ì™€ì´ ì„œë¨¸íƒ€ìž„</daylight>
+ </long>
+ <short>
+ <daylight draft="provisional">HDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <daylight draft="provisional">알래스카 서머타임</daylight>
+ </long>
+ <short>
+ <standard draft="provisional">AKST</standard>
+ <daylight draft="provisional">AKDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <daylight draft="provisional">태í‰ì–‘ 서머타임</daylight>
+ </long>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <daylight draft="provisional">산악 서머타임</daylight>
+ </long>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <daylight draft="provisional">중부 서머타임</daylight>
+ </long>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <daylight draft="provisional">ë™ë¶€ 서머타임</daylight>
+ </long>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="AED">
+ <displayName draft="provisional">ì•„ëžì—미레ì´íŠ¸ 디르함</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName draft="provisional">네ëœëž€ë“œ 앤티리언 길ë”</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName draft="provisional">ì•™ê³¨ë¼ ì‹ ì½´ìž (1990-2000)</displayName>
+ </currency>
+ <currency type="AUD">
+ <symbol draft="provisional">A$</symbol>
+ </currency>
+ <currency type="BBD">
+ <symbol draft="provisional">Bds$</symbol>
+ </currency>
+ <currency type="BMD">
+ <symbol draft="provisional">BM$</symbol>
+ </currency>
+ <currency type="BND">
+ <symbol draft="provisional">B$</symbol>
+ </currency>
+ <currency type="BRL">
+ <symbol draft="provisional">R$</symbol>
+ </currency>
+ <currency type="BSD">
+ <symbol draft="provisional">BSD</symbol>
+ </currency>
+ <currency type="BZD">
+ <symbol draft="provisional">BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <symbol draft="provisional">Can$</symbol>
+ </currency>
+ <currency type="CHF">
+ <displayName draft="provisional">스위스 프랑</displayName>
+ </currency>
+ <currency type="CLP">
+ <symbol draft="provisional">Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <symbol draft="provisional">Â¥</symbol>
+ </currency>
+ <currency type="COP">
+ <symbol draft="provisional">Col$</symbol>
+ </currency>
+ <currency type="CSD">
+ <displayName draft="provisional">세르비아 디나르</displayName>
+ </currency>
+ <currency type="CYP">
+ <symbol draft="provisional">ï¿¡C</symbol>
+ </currency>
+ <currency type="DOP">
+ <symbol draft="provisional">RD$</symbol>
+ </currency>
+ <currency type="FJD">
+ <symbol draft="provisional">FJ$</symbol>
+ </currency>
+ <currency type="FRF">
+ <symbol draft="provisional">â‚£</symbol>
+ </currency>
+ <currency type="GHC">
+ <symbol draft="provisional">ï¿ </symbol>
+ </currency>
+ <currency type="GYD">
+ <symbol draft="provisional">G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <symbol draft="provisional">HK$</symbol>
+ </currency>
+ <currency type="ITL">
+ <symbol draft="provisional">₤</symbol>
+ </currency>
+ <currency type="KPW">
+ <symbol draft="provisional">â‚©</symbol>
+ </currency>
+ <currency type="LSM">
+ <displayName draft="provisional">로티</displayName>
+ </currency>
+ <currency type="SGD">
+ <symbol draft="provisional">S$</symbol>
+ </currency>
+ <currency type="SRD">
+ <displayName draft="provisional">수리남 달러</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName draft="provisional">통가 파앙가</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName draft="provisional">터키 리ë¼</displayName>
+ </currency>
+ <currency type="TWD">
+ <symbol draft="provisional">NT$</symbol>
+ </currency>
+ <currency type="XAF">
+ <displayName draft="provisional">CFA 프랑 BEAC</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName draft="provisional">ì€í™”</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName draft="provisional">유르코 (유럽 회계 단위)</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName draft="provisional">유럽 통화 ë™ë§¹</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName draft="provisional">유럽 계산 단위 (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName draft="provisional">유럽 계산 단위 (XBD)</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName draft="provisional">CFA 프랑 BCEAO</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName draft="provisional">팔ë¼ë“</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName draft="provisional">CFP 프랑</displayName>
+ </currency>
+ <currency type="XPT">
+ <displayName draft="provisional">백금</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP15" draft="provisional">Language: Bamileke Languages ( Change from &quot;바미레케어&quot; to &quot;바밀레케어족&quot; )</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/kok.xml b/libs/Zend/Locale/Data/kok.xml
new file mode 100755
index 0000000000..a708bc58f6
--- /dev/null
+++ b/libs/Zend/Locale/Data/kok.xml
@@ -0,0 +1,247 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.42 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="kok"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">अफार</language>
+ <language type="ab">अबखेज़ियन</language>
+ <language type="af">अफà¥à¤°à¤¿à¤•à¤¾à¤¨à¥à¤¸</language>
+ <language type="am">अमहारिकà¥</language>
+ <language type="ar">अरेबिकà¥</language>
+ <language type="as">असामी</language>
+ <language type="ay">à¤à¤®à¤°à¤¾</language>
+ <language type="az">अज़रबैजानी</language>
+ <language type="ba">बषà¥à¤•à¤¿à¤°</language>
+ <language type="be">बैलोरà¥à¤¸à¤¿à¤¯à¤¨à¥</language>
+ <language type="bg">बलà¥à¤—ेरियन</language>
+ <language type="bh">बीहारी</language>
+ <language type="bi">बिसलमा</language>
+ <language type="bn">बंगाली</language>
+ <language type="bo">तिबेतियन</language>
+ <language type="br">बà¥à¤°à¥‡à¤Ÿà¤¨</language>
+ <language type="ca">कटलान</language>
+ <language type="co">कोरà¥à¤¶à¤¿à¤¯à¤¨</language>
+ <language type="cs">ज़ेकà¥</language>
+ <language type="cy">वेळà¥à¤·à¥</language>
+ <language type="da">डानिष</language>
+ <language type="de">जरà¥à¤®à¤¨</language>
+ <language type="dz">भूटानी</language>
+ <language type="el">गà¥à¤°à¥€à¤•à¥</language>
+ <language type="en">आंगà¥à¤²</language>
+ <language type="eo">इसà¥à¤ªà¤°à¤¾à¤¨à¥à¤Ÿà¥‹</language>
+ <language type="es">सà¥à¤ªà¤¾à¤¨à¤¿à¤·</language>
+ <language type="et">इसà¥à¤Ÿà¥‹à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="eu">बासà¥à¤•</language>
+ <language type="fa">परà¥à¤·à¤¿à¤¯à¤¨à¥</language>
+ <language type="fi">फिनà¥à¤¨à¤¿à¤·à¥</language>
+ <language type="fj">फिजी</language>
+ <language type="fo">फेरोसà¥</language>
+ <language type="fr">फà¥à¤°à¥‡à¤¨à¥à¤š</language>
+ <language type="fy">फà¥à¤°à¤¿à¤¶à¤¿à¤¯à¤¨à¥</language>
+ <language type="ga">à¤à¤°à¤¿à¤·</language>
+ <language type="gd">सà¥à¤•à¤¾à¤Ÿà¤¸à¥ गेलिकà¥</language>
+ <language type="gl">गेलीशियन</language>
+ <language type="gn">गौरानी</language>
+ <language type="gu">गà¥à¤œà¤°à¤¾à¤¤à¥€</language>
+ <language type="ha">हौसा</language>
+ <language type="he">हेबà¥à¤°à¥</language>
+ <language type="hi">हिनà¥à¤¦à¥€</language>
+ <language type="hr">कà¥à¤°à¥‹à¤¯à¥‡à¤·à¤¿à¤¯à¤¨à¥</language>
+ <language type="hu">हंगेरियनà¥</language>
+ <language type="hy">आरà¥à¤®à¥€à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="ia">इनà¥à¤Ÿà¤°à¤²à¤¿à¤‚गà¥à¤µà¤¾</language>
+ <language type="id">इनà¥à¤¡à¥‹à¤¨à¥‡à¤·à¤¿à¤¯à¤¨</language>
+ <language type="ie">इनà¥à¤Ÿà¤°à¤²à¤¿à¤‚गà¥</language>
+ <language type="ik">इनूपेयाकà¥</language>
+ <language type="is">आईसà¥à¤²à¤¾à¤¨à¥à¤¡à¤¿à¤•</language>
+ <language type="it">इटालियन</language>
+ <language type="iu">इनà¥à¤¯à¥à¤•à¤Ÿà¥à¤Ÿ</language>
+ <language type="ja">जापनीसà¥</language>
+ <language type="jv">जावनीसà¥</language>
+ <language type="ka">जारà¥à¤œà¤¿à¤¯à¤¨à¥</language>
+ <language type="kk">कज़खà¥</language>
+ <language type="kl">गà¥à¤°à¥€à¤¨à¤²à¤¾à¤¨à¥à¤¡à¤¿à¤•</language>
+ <language type="km">कंबोडियन</language>
+ <language type="kn">कनà¥à¤¨à¤¡à¤¾</language>
+ <language type="ko">कोरियनà¥</language>
+ <language type="kok">कोंकणी</language>
+ <language type="ks">कशà¥à¤®à¥€à¤°à¥€</language>
+ <language type="ku">कà¥à¤°à¥à¤¦à¤¿à¤·</language>
+ <language type="ky">किरà¥à¤—िज़</language>
+ <language type="la">लाटिन</language>
+ <language type="ln">लिंगाला</language>
+ <language type="lo">लाओतियनà¥</language>
+ <language type="lt">लिथà¥à¤†à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="lv">लाटà¥à¤µà¤¿à¤¯à¤¨à¥ (लेटà¥à¤Ÿà¤¿à¤·à¥)</language>
+ <language type="mg">मलागसी</language>
+ <language type="mi">माओरी</language>
+ <language type="mk">मसीडोनियनà¥</language>
+ <language type="ml">मळियाळम</language>
+ <language type="mn">मंगोलियनà¥</language>
+ <language type="mo">मोलà¥à¤¡à¤¾à¤µà¤¿à¤¯à¤¨à¥</language>
+ <language type="mr">मराठी</language>
+ <language type="ms">मलय</language>
+ <language type="mt">मालतीसà¥</language>
+ <language type="my">बरà¥à¤®à¥€à¤œà¤¼à¥</language>
+ <language type="na">नौरो</language>
+ <language type="ne">नेपाळी</language>
+ <language type="nl">डचà¥</language>
+ <language type="no">नोरà¥à¤µà¥‡à¤œà¤¿à¤¯à¤¨</language>
+ <language type="oc">ओसिटानà¥</language>
+ <language type="om">ओरोमो (अफान)</language>
+ <language type="or">ओरिया</language>
+ <language type="pa">पंजाबी</language>
+ <language type="pl">पोलिष</language>
+ <language type="ps">पाषà¥à¤Ÿà¥‹ (पà¥à¤·à¥à¤Ÿà¥‹)</language>
+ <language type="pt">पोरà¥à¤šà¥à¤—ीज़à¥</language>
+ <language type="qu">कà¥à¤µà¥‡à¤šà¥à¤µà¤¾</language>
+ <language type="rm">रहटो-रोमानà¥à¤¸à¥</language>
+ <language type="rn">किरà¥à¤¨à¥à¤¦à¥€</language>
+ <language type="ro">रोमानियनà¥</language>
+ <language type="ru">रषà¥à¤¯à¤¨à¥</language>
+ <language type="rw">किनà¥à¤¯à¤¾à¤°à¥à¤µà¤¾à¤¨à¥à¤¡à¤¾</language>
+ <language type="sa">संसà¥à¤•à¥ƒà¤¤</language>
+ <language type="sd">सिंधी</language>
+ <language type="sg">सांगà¥à¤°à¥‹</language>
+ <language type="sh">सेरà¥à¤¬à¥‹-कà¥à¤°à¥‹à¤¯à¥‡à¤·à¤¿à¤¯à¤¨à¥</language>
+ <language type="si">सिनà¥à¤¹à¤²à¥€à¤¸à¥</language>
+ <language type="sk">सà¥à¤²à¥‹à¤µà¤¾à¤•</language>
+ <language type="sl">सà¥à¤²à¥‹à¤µà¥‡à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="sm">समोन</language>
+ <language type="sn">शोना</language>
+ <language type="so">सोमाळी</language>
+ <language type="sq">आलà¥à¤¬à¥‡à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="sr">सेरà¥à¤¬à¤¿à¤¯à¤¨à¥</language>
+ <language type="ss">सिसà¥à¤µà¤¾à¤¤à¥€</language>
+ <language type="st">सेसोथो</language>
+ <language type="su">सà¥à¤‚दनीस</language>
+ <language type="sv">सà¥à¤µà¥€à¤¦à¥€à¤·</language>
+ <language type="sw">सà¥à¤µà¤¾à¤¹à¤¿à¤²à¥€</language>
+ <language type="ta">तमिळ</language>
+ <language type="te">तेलà¥à¤—ू</language>
+ <language type="tg">तजिक</language>
+ <language type="th">थाई</language>
+ <language type="ti">तिगà¥à¤°à¤¿à¤¨à¥à¤¯à¤¾</language>
+ <language type="tk">तà¥à¤°à¥à¤•à¤®à¤¨</language>
+ <language type="tl">तगालोग</language>
+ <language type="tn">सेतà¥à¤¸à¥à¤µà¤¾à¤¨à¤¾</language>
+ <language type="to">तोंगा</language>
+ <language type="tr">तà¥à¤°à¥à¤•à¤¿à¤·</language>
+ <language type="ts">तà¥à¤¸à¥‹à¤—ा</language>
+ <language type="tt">तटार</language>
+ <language type="tw">तà¥à¤µà¤¿</language>
+ <language type="ug">उधूर</language>
+ <language type="uk">यà¥à¤•à¥à¤°à¥‡à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="ur">उरà¥à¤¦à¥‚</language>
+ <language type="uz">उज़बेक</language>
+ <language type="vi">वियतà¥à¤¨à¤¾à¤®à¥€à¤œà¤¼</language>
+ <language type="vo">ओलापà¥à¤•</language>
+ <language type="wo">उलोफ़</language>
+ <language type="xh">à¤à¤¼à¥Œà¤¸à¤¾</language>
+ <language type="yi">इदà¥à¤¦à¤¿à¤·à¥</language>
+ <language type="yo">यूरà¥à¤¬à¤¾</language>
+ <language type="za">à¤à¥à¤¹à¥à¤¨à¥à¤—</language>
+ <language type="zh">चीनीसà¥</language>
+ <language type="zu">जà¥à¤²à¥‚</language>
+ </languages>
+ <territories>
+ <territory type="IN">भारत</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[़ à¤-ः ०-९ ॠअ-ठà¤-ऑ ओ-क {क़} ख {ख़} ग {ग़} घ-ज {ज़} à¤-ड {ड़} ढ {ढ़} ण-न प फ {फ़} ब-य {य़} र ल ळ व-ह ऽ-ॅ े-ॉ ो-à¥]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">जानेवारी</month>
+ <month type="2">फेबृवारी</month>
+ <month type="3">मारà¥à¤š</month>
+ <month type="4">à¤à¤ªà¥à¤°à¤¿à¤²</month>
+ <month type="5">मे</month>
+ <month type="6">जून</month>
+ <month type="7">जà¥à¤²à¥ˆ</month>
+ <month type="8">ओगसà¥à¤Ÿ</month>
+ <month type="9">सेपà¥à¤Ÿà¥‡à¤‚बर</month>
+ <month type="10">ओकà¥à¤Ÿà¥‹à¤¬à¤°</month>
+ <month type="11">नोवà¥à¤¹à¥‡à¤‚बर</month>
+ <month type="12">डिसेंबर</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">जानेवारी</month>
+ <month type="2">फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€</month>
+ <month type="3">मारà¥à¤š</month>
+ <month type="4">à¤à¤ªà¥à¤°à¤¿à¤²</month>
+ <month type="5">मे</month>
+ <month type="6">जून</month>
+ <month type="7">जà¥à¤²à¥ˆ</month>
+ <month type="8">ओगसà¥à¤Ÿ</month>
+ <month type="9">सेपà¥à¤Ÿà¥‡à¤‚बर</month>
+ <month type="10">ओकà¥à¤Ÿà¥‹à¤¬à¤°</month>
+ <month type="11">नोवà¥à¤¹à¥‡à¤‚बर</month>
+ <month type="12">डिसेंबर</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">रवि</day>
+ <day type="mon">सोम</day>
+ <day type="tue">मंगळ</day>
+ <day type="wed">बà¥à¤§</day>
+ <day type="thu">गà¥à¤°à¥</day>
+ <day type="fri">शà¥à¤•à¥à¤°</day>
+ <day type="sat">शनि</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">आदितà¥à¤¯à¤µà¤¾à¤°</day>
+ <day type="mon">सोमवार</day>
+ <day type="tue">मंगळार</day>
+ <day type="wed">बà¥à¤§à¤µà¤¾à¤°</day>
+ <day type="thu">गà¥à¤°à¥à¤µà¤¾à¤°</day>
+ <day type="fri">शà¥à¤•à¥à¤°à¤µà¤¾à¤°</day>
+ <day type="sat">शनिवार</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am>म.पू.</am>
+ <pm>म.नं.</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">कà¥à¤°à¤¿à¤¸à¥à¤¤à¤ªà¥‚रà¥à¤µ</era>
+ <era type="1">कà¥à¤°à¤¿à¤¸à¥à¤¤à¤¶à¤–ा</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Asia/Calcutta">
+ <long>
+ <standard>भारतीय समय</standard>
+ <daylight>भारतीय समय</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IST</daylight>
+ </short>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="INR">
+ <symbol>रà¥</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/kok_IN.xml b/libs/Zend/Locale/Data/kok_IN.xml
new file mode 100755
index 0000000000..75f8e93bdb
--- /dev/null
+++ b/libs/Zend/Locale/Data/kok_IN.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.43 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="kok"/>
+ <territory type="IN"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d-M-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ku.xml b/libs/Zend/Locale/Data/ku.xml
new file mode 100755
index 0000000000..69aa891cb8
--- /dev/null
+++ b/libs/Zend/Locale/Data/ku.xml
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.9 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ku"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar" draft="unconfirmed">erebî</language>
+ <language type="en" draft="unconfirmed">îngilîzî</language>
+ <language type="ja" draft="unconfirmed">japonî</language>
+ <language type="ku" draft="unconfirmed">kurdî</language>
+ </languages>
+ <scripts>
+ <script type="Arab" draft="unconfirmed">erebî</script>
+ </scripts>
+ <territories>
+ <territory type="001" draft="unconfirmed">Cîhan</territory>
+ <territory type="TR" draft="unconfirmed">Tirkiye</territory>
+ </territories>
+ <keys>
+ <key type="calendar" draft="unconfirmed">salname</key>
+ <key type="collation" draft="unconfirmed">rêzkirin</key>
+ </keys>
+ <types>
+ <type type="gregorian" key="calendar" draft="unconfirmed">mîladî</type>
+ <type type="islamic" key="calendar" draft="unconfirmed">hîcrî</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-c ç d e ê f-i î j-s ş t u û v-z]</exemplarCharacters>
+ <exemplarCharacters alt="proposed-u142-1" draft="unconfirmed">[a-c ç d e ê f-i î j-s ş t u û v-z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">çil</month>
+ <month type="2" draft="unconfirmed">sib</month>
+ <month type="3" draft="unconfirmed">adr</month>
+ <month type="4" draft="unconfirmed">nîs</month>
+ <month type="5" draft="unconfirmed">gul</month>
+ <month type="6" draft="unconfirmed">hez</month>
+ <month type="7" draft="unconfirmed">tîr</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">çile</month>
+ <month type="2" draft="unconfirmed">sibat</month>
+ <month type="3" draft="unconfirmed">adar</month>
+ <month type="4" draft="unconfirmed">nîsan</month>
+ <month type="5" draft="unconfirmed">gulan</month>
+ <month type="6" draft="unconfirmed">hezîran</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">ç</month>
+ <month type="2" draft="unconfirmed">s</month>
+ <month type="3" draft="unconfirmed">a</month>
+ <month type="4" draft="unconfirmed">n</month>
+ <month type="5" draft="unconfirmed">g</month>
+ <month type="6" draft="unconfirmed">h</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">yÅŸ</day>
+ <day type="mon" draft="unconfirmed">dÅŸ</day>
+ <day type="tue" draft="unconfirmed">sÅŸ</day>
+ <day type="wed" draft="unconfirmed">çş</day>
+ <day type="thu" draft="unconfirmed">pÅŸ</day>
+ <day type="fri" draft="unconfirmed">în</day>
+ <day type="sat" draft="unconfirmed">ÅŸ</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">yekÅŸem</day>
+ <day type="mon" draft="unconfirmed">duÅŸem</day>
+ <day type="tue" draft="unconfirmed">şê</day>
+ <day type="wed" draft="unconfirmed">çarşem</day>
+ <day type="thu" draft="unconfirmed">pêncşem</day>
+ <day type="fri" draft="unconfirmed">în</day>
+ <day type="sat" draft="unconfirmed">şemî</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">y</day>
+ <day type="mon" draft="unconfirmed">d</day>
+ <day type="tue" draft="unconfirmed">s</day>
+ <day type="wed" draft="unconfirmed">ç</day>
+ <day type="thu" draft="unconfirmed">p</day>
+ <day type="fri" draft="unconfirmed">în</day>
+ <day type="sat" draft="unconfirmed">ÅŸ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">Ç1</quarter>
+ <quarter type="2" draft="unconfirmed">Ç2</quarter>
+ <quarter type="3" draft="unconfirmed">Ç3</quarter>
+ <quarter type="4" draft="unconfirmed">Ç4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">Ç1</quarter>
+ <quarter type="2" draft="unconfirmed">Ç2</quarter>
+ <quarter type="3" draft="unconfirmed">Ç3</quarter>
+ <quarter type="4" draft="unconfirmed">Ç4</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am draft="unconfirmed">BN</am>
+ <pm draft="unconfirmed">PN</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">BZ</era>
+ <era type="1" draft="unconfirmed">PZ</era>
+ </eraAbbr>
+ </eras>
+ <fields>
+ <field type="year">
+ <displayName draft="unconfirmed">sal</displayName>
+ </field>
+ <field type="month">
+ <displayName draft="unconfirmed">meh</displayName>
+ </field>
+ <field type="week">
+ <displayName draft="unconfirmed">hefte</displayName>
+ </field>
+ <field type="day">
+ <displayName draft="unconfirmed">roj</displayName>
+ </field>
+ <field type="hour">
+ <displayName draft="unconfirmed">demjimêr</displayName>
+ </field>
+ <field type="minute">
+ <displayName draft="unconfirmed">xulek</displayName>
+ </field>
+ <field type="second">
+ <displayName draft="unconfirmed">çirke</displayName>
+ </field>
+ </fields>
+ </calendar>
+ <calendar type="islamic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">muẖerem</month>
+ <month type="2" draft="unconfirmed">sefer</month>
+ <month type="3" draft="unconfirmed">rebîʿulewel</month>
+ <month type="4" draft="unconfirmed">rebîʿulaxer</month>
+ <month type="5" draft="unconfirmed">cemazîyelewel</month>
+ <month type="6" draft="unconfirmed">cemazîyelaxer</month>
+ <month type="7" draft="unconfirmed">receb </month>
+ <month type="8" draft="unconfirmed">şeʿban </month>
+ <month type="9" draft="unconfirmed">remezan</month>
+ <month type="10" draft="unconfirmed">ÅŸewal </month>
+ <month type="11" draft="unconfirmed">zîlqeʿde </month>
+ <month type="12" draft="unconfirmed">zîlẖece</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ </calendars>
+ </dates>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">erê:e</yesstr>
+ <nostr draft="unconfirmed">na:n</nostr>
+ </messages>
+ </posix>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ku_Arab.xml b/libs/Zend/Locale/Data/ku_Arab.xml
new file mode 100755
index 0000000000..ec650ab359
--- /dev/null
+++ b/libs/Zend/Locale/Data/ku_Arab.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ku"/>
+ <script type="Arab"/>
+ </identity>
+ <characters>
+ <exemplarCharacters>[ئ-ب پ ت ج چ ح-د ر ز ڕ ژ س ش ع غ ٠ڤ ق ک گ ل ڵ م-ه ھ و ۆ ی ێ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[ً-ْ ء-ة ث ذ ص-ظ ك ى ي]</exemplarCharacters>
+ </characters>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ku_IQ.xml b/libs/Zend/Locale/Data/ku_IQ.xml
new file mode 100755
index 0000000000..84750fafd1
--- /dev/null
+++ b/libs/Zend/Locale/Data/ku_IQ.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ku"/>
+ <territory type="IQ"/>
+ </identity>
+ <alias source="ku_Latn_IQ" path="//ldml"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ku_IR.xml b/libs/Zend/Locale/Data/ku_IR.xml
new file mode 100755
index 0000000000..0f09095ffd
--- /dev/null
+++ b/libs/Zend/Locale/Data/ku_IR.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ku"/>
+ <territory type="IR"/>
+ </identity>
+ <alias source="ku_Latn_IR" path="//ldml"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ku_Latn.xml b/libs/Zend/Locale/Data/ku_Latn.xml
new file mode 100755
index 0000000000..3aadc5b47c
--- /dev/null
+++ b/libs/Zend/Locale/Data/ku_Latn.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ku"/>
+ <script type="Latn"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ku_Latn_IQ.xml b/libs/Zend/Locale/Data/ku_Latn_IQ.xml
new file mode 100755
index 0000000000..70d6101698
--- /dev/null
+++ b/libs/Zend/Locale/Data/ku_Latn_IQ.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.3 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ku"/>
+ <script type="Latn"/>
+ <territory type="IQ"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ku_Latn_IR.xml b/libs/Zend/Locale/Data/ku_Latn_IR.xml
new file mode 100755
index 0000000000..d0f6bb5f61
--- /dev/null
+++ b/libs/Zend/Locale/Data/ku_Latn_IR.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.3 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ku"/>
+ <script type="Latn"/>
+ <territory type="IR"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ku_Latn_SY.xml b/libs/Zend/Locale/Data/ku_Latn_SY.xml
new file mode 100755
index 0000000000..6f1a27bfd5
--- /dev/null
+++ b/libs/Zend/Locale/Data/ku_Latn_SY.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.3 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ku"/>
+ <script type="Latn"/>
+ <territory type="SY"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ku_Latn_TR.xml b/libs/Zend/Locale/Data/ku_Latn_TR.xml
new file mode 100755
index 0000000000..059b623e2c
--- /dev/null
+++ b/libs/Zend/Locale/Data/ku_Latn_TR.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.3 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ku"/>
+ <script type="Latn"/>
+ <territory type="TR"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ku_SY.xml b/libs/Zend/Locale/Data/ku_SY.xml
new file mode 100755
index 0000000000..9ef4facb03
--- /dev/null
+++ b/libs/Zend/Locale/Data/ku_SY.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ku"/>
+ <territory type="SY"/>
+ </identity>
+ <alias source="ku_Latn_SY" path="//ldml"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ku_TR.xml b/libs/Zend/Locale/Data/ku_TR.xml
new file mode 100755
index 0000000000..ac374c911a
--- /dev/null
+++ b/libs/Zend/Locale/Data/ku_TR.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ku"/>
+ <territory type="TR"/>
+ </identity>
+ <alias source="ku_Latn_TR" path="//ldml"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/kw.xml b/libs/Zend/Locale/Data/kw.xml
new file mode 100755
index 0000000000..62852b9030
--- /dev/null
+++ b/libs/Zend/Locale/Data/kw.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="kw"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="kw">kernewek</language>
+ </languages>
+ <territories>
+ <territory type="GB">Rywvaneth Unys</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Gen</month>
+ <month type="2">Whe</month>
+ <month type="3">Mer</month>
+ <month type="4">Ebr</month>
+ <month type="5">Me</month>
+ <month type="6">Efn</month>
+ <month type="7">Gor</month>
+ <month type="8">Est</month>
+ <month type="9">Gwn</month>
+ <month type="10">Hed</month>
+ <month type="11">Du</month>
+ <month type="12">Kev</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Mys Genver</month>
+ <month type="2">Mys Whevrel</month>
+ <month type="3">Mys Merth</month>
+ <month type="4">Mys Ebrel</month>
+ <month type="5">Mys Me</month>
+ <month type="6">Mys Efan</month>
+ <month type="7">Mys Gortheren</month>
+ <month type="8">Mye Est</month>
+ <month type="9">Mys Gwyngala</month>
+ <month type="10">Mys Hedra</month>
+ <month type="11">Mys Du</month>
+ <month type="12">Mys Kevardhu</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Sul</day>
+ <day type="mon">Lun</day>
+ <day type="tue">Mth</day>
+ <day type="wed">Mhr</day>
+ <day type="thu">Yow</day>
+ <day type="fri">Gwe</day>
+ <day type="sat">Sad</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">De Sul</day>
+ <day type="mon">De Lun</day>
+ <day type="tue">De Merth</day>
+ <day type="wed">De Merher</day>
+ <day type="thu">De Yow</day>
+ <day type="fri">De Gwener</day>
+ <day type="sat">De Sadorn</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am>a.m.</am>
+ <pm>p.m.</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">RC</era>
+ <era type="1">AD</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
diff --git a/libs/Zend/Locale/Data/kw_GB.xml b/libs/Zend/Locale/Data/kw_GB.xml
new file mode 100755
index 0000000000..7e98937d3c
--- /dev/null
+++ b/libs/Zend/Locale/Data/kw_GB.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="kw"/>
+ <territory type="GB"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>HH:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ky.xml b/libs/Zend/Locale/Data/ky.xml
new file mode 100755
index 0000000000..c2affd8790
--- /dev/null
+++ b/libs/Zend/Locale/Data/ky.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.26 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ky"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="de">немиÑче</language>
+ <language type="en">англиÑче</language>
+ <language type="es">иÑпанча</language>
+ <language type="fr">французча</language>
+ <language type="it">италиÑнча</language>
+ <language type="ja">Ñпончо</language>
+ <language type="ky" draft="unconfirmed">Кыргыз</language>
+ <language type="pt">португалча</language>
+ <language type="ru">оруÑча</language>
+ <language type="zh">кытайча</language>
+ </languages>
+ <territories>
+ <territory type="KG" draft="unconfirmed">КыргызÑтан</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[а б г-е Ñ‘ ж-н ÓŠ о Ó© п-у Ò¯ Ñ… ч ш ÑŠ Ñ‹ Ñ-Ñ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[в ф ц щ ь]</exemplarCharacters>
+ </characters>
+ <numbers>
+ <symbols>
+ <decimal draft="unconfirmed">,</decimal>
+ <group draft="unconfirmed"> </group>
+ </symbols>
+ <currencies>
+ <currency type="KGS">
+ <symbol draft="unconfirmed">Ñом</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ky_KG.xml b/libs/Zend/Locale/Data/ky_KG.xml
new file mode 100755
index 0000000000..241d5935a0
--- /dev/null
+++ b/libs/Zend/Locale/Data/ky_KG.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.28 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ky"/>
+ <territory type="KG"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ln.xml b/libs/Zend/Locale/Data/ln.xml
new file mode 100755
index 0000000000..6302186325
--- /dev/null
+++ b/libs/Zend/Locale/Data/ln.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.18 $"/>
+ <generation date="$Date: 2006/07/11 19:26:44 $"/>
+ <language type="ln"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="en" draft="unconfirmed">ngÉ›lÉ›Ìsa</language>
+ <language type="fr" draft="unconfirmed">falansé</language>
+ <language type="kg" references="RP1" draft="unconfirmed">kikÉ”ÌngÉ”</language>
+ <language type="ln" draft="unconfirmed">lingála</language>
+ <language type="lua" draft="unconfirmed">ciluba</language>
+ <language type="sw" draft="unconfirmed">swahili</language>
+ </languages>
+ <territories>
+ <territory type="002" draft="unconfirmed">Afríka</territory>
+ <territory type="005" draft="unconfirmed">Amérika ya nsé</territory>
+ <territory type="011" draft="unconfirmed">Afríka ya límbe</territory>
+ <territory type="015" draft="unconfirmed">Afríka ya likoló</territory>
+ <territory type="018" draft="unconfirmed">Nsé ya Afríka</territory>
+ <territory type="142" draft="unconfirmed">Azia</territory>
+ <territory type="150" draft="unconfirmed">Eropa</territory>
+ <territory type="155" draft="unconfirmed">Eropa ya límbe</territory>
+ <territory type="BE" draft="unconfirmed">BÉ›Ìljika</territory>
+ <territory type="BF" draft="unconfirmed">Burkina Faso</territory>
+ <territory type="BI" draft="unconfirmed">Burundi</territory>
+ <territory type="BW" draft="unconfirmed">Botswana</territory>
+ <territory type="CD" draft="unconfirmed">KÉ”ngÉ”Ì (Kinshasa)</territory>
+ <territory type="CF" draft="unconfirmed">Bê Afríka</territory>
+ <territory type="CG" draft="unconfirmed">KÉ”ngÉ”Ì (Brazzaville)</territory>
+ <territory type="CH" draft="unconfirmed">Swisi</territory>
+ <territory type="CM" draft="unconfirmed">Kamerun</territory>
+ <territory type="DE" draft="unconfirmed">Alémanyi</territory>
+ <territory type="DJ" draft="unconfirmed">Djibuti</territory>
+ <territory type="EG" draft="unconfirmed">Ejipti</territory>
+ <territory type="EH" draft="unconfirmed">Sahara ya límbe</territory>
+ <territory type="ET" draft="unconfirmed">Etiopya</territory>
+ <territory type="FR" draft="unconfirmed">Falansia</territory>
+ <territory type="GH" draft="unconfirmed">Ghana</territory>
+ <territory type="GM" draft="unconfirmed">Gambia</territory>
+ <territory type="GN" draft="unconfirmed">Gine</territory>
+ <territory type="GW" draft="unconfirmed">Gine-Bisau</territory>
+ <territory type="IT" draft="unconfirmed">Italia</territory>
+ <territory type="KE" draft="unconfirmed">Kenya</territory>
+ <territory type="LR" draft="unconfirmed">Liberia</territory>
+ <territory type="LY" draft="unconfirmed">Libîya</territory>
+ <territory type="ML" draft="unconfirmed">Mali</territory>
+ <territory type="MZ" draft="unconfirmed">Mozambiki</territory>
+ <territory type="NA" draft="unconfirmed">Namibia</territory>
+ <territory type="NE" draft="unconfirmed">Nijé</territory>
+ <territory type="NG" draft="unconfirmed">Nijeria</territory>
+ <territory type="RW" draft="unconfirmed">Rwanda</territory>
+ <territory type="SD" draft="unconfirmed">Sudani</territory>
+ <territory type="SO" draft="unconfirmed">Somalia</territory>
+ <territory type="ST" draft="unconfirmed">Sǎo Tomé na Principe</territory>
+ <territory type="TG" draft="unconfirmed">Togo</territory>
+ <territory type="TN" draft="unconfirmed">Tunizia</territory>
+ <territory type="ZA" draft="unconfirmed">Afríka ya Nsé</territory>
+ <territory type="ZM" draft="unconfirmed">Zambia</territory>
+ <territory type="ZW" draft="unconfirmed">Zimbabwe</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a á â ÇŽ b-e é ê Ä› É› {É›Ì} {ɛ̂} {ɛ̌} f g {gb} h i í î Ç k-m {mb} {mp} n {nd} {ng} {nk} {ns} {nt} {nz} o ó ô Ç’ É” {É”Ì} {ɔ̂} {ɔ̌} p r-u ú û Ç” v w y z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[j q x]</exemplarCharacters>
+ <exemplarCharacters alt="proposed-u149-1" draft="unconfirmed">[a á â ÇŽ b-e é ê Ä› É› {É›Ì} {ɛ̂} {ɛ̌} f g {gb} h i í î Ç j-m {mb} {mp} n {nd} {ng} {ngb} {nk} {ns} {nt} {nz} o ó ô Ç’ É” {É”Ì} {ɔ̂} {ɔ̌} p-u ú û Ç” v-z]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">«</quotationStart>
+ <quotationEnd draft="unconfirmed">»</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">s1</month>
+ <month type="2" draft="unconfirmed">s2</month>
+ <month type="3" draft="unconfirmed">s3</month>
+ <month type="4" draft="unconfirmed">s4</month>
+ <month type="5" draft="unconfirmed">s5</month>
+ <month type="6" draft="unconfirmed">s6</month>
+ <month type="7" draft="unconfirmed">s7</month>
+ <month type="8" draft="unconfirmed">s8</month>
+ <month type="9" draft="unconfirmed">s9</month>
+ <month type="10" draft="unconfirmed">s10</month>
+ <month type="11" draft="unconfirmed">s11</month>
+ <month type="12" draft="unconfirmed">s12</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">sánzá ya yambo</month>
+ <month type="2" draft="unconfirmed">sánzá ya míbalé</month>
+ <month type="3" draft="unconfirmed">sánzá ya mísáto</month>
+ <month type="4" draft="unconfirmed">sánzá ya mínéi</month>
+ <month type="5" draft="unconfirmed">sánzá ya mítáno</month>
+ <month type="6" draft="unconfirmed">sánzá ya motóbá</month>
+ <month type="7" draft="unconfirmed">sánzá ya nsambo</month>
+ <month type="8" draft="unconfirmed">sánzá ya mwambe</month>
+ <month type="9" draft="unconfirmed">sánzá ya libwa</month>
+ <month type="10" draft="unconfirmed">sánzá ya zómí</month>
+ <month type="11" draft="unconfirmed">sánzá ya zómí na mɔ̌kÉ”Ì</month>
+ <month type="12" draft="unconfirmed">sánzá ya zómí na míbalé</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">eye</day>
+ <day type="mon" draft="unconfirmed">m1</day>
+ <day type="tue" draft="unconfirmed">m2</day>
+ <day type="wed" draft="unconfirmed">m3</day>
+ <day type="thu" draft="unconfirmed">m4</day>
+ <day type="fri" draft="unconfirmed">m5</day>
+ <day type="sat" draft="unconfirmed">mps</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">eyenga</day>
+ <day type="mon" draft="unconfirmed">mokɔlɔ ya libosó</day>
+ <day type="tue" draft="unconfirmed">mokɔlɔ ya míbalé</day>
+ <day type="wed" draft="unconfirmed">mokɔlɔ ya mísáto</day>
+ <day type="thu" draft="unconfirmed">mokɔlɔ ya mínéi</day>
+ <day type="fri" draft="unconfirmed">mokɔlɔ ya mítáno</day>
+ <day type="sat" draft="unconfirmed">mpÉ”ÌsÉ”</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">SM1</quarter>
+ <quarter type="2" draft="unconfirmed">SM2</quarter>
+ <quarter type="3" draft="unconfirmed">SM3</quarter>
+ <quarter type="4" draft="unconfirmed">SM4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">sánzá mísáto ya yambo</quarter>
+ <quarter type="2" draft="unconfirmed">sánzá mísáto ya míbalé</quarter>
+ <quarter type="3" draft="unconfirmed">sánzá mísáto ya mísáto</quarter>
+ <quarter type="4" draft="unconfirmed">sánzá mísáto ya mínéi</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">libosó ya Y.-K.</era>
+ <era type="1" draft="unconfirmed">nsima ya Y.-K.</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">libosó ya Y.-K.</era>
+ <era type="1" draft="unconfirmed">nsima ya Y.-K.</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal draft="unconfirmed">,</decimal>
+ <list draft="unconfirmed">;</list>
+ </symbols>
+ <currencies>
+ <currency type="CDF">
+ <displayName draft="unconfirmed">falánga</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1" uri="http://www.amazon.ca/exec/obidos/ASIN/2845865686/qid%3D1140216973/702-7033870-9370469">Kawata Ashem Tem, Bago ya lingala mambi ma lokota (dictionnaire lingala) ISBN 2-84586-494-9</reference>
+ <reference type="RP2" uri="http://www.amazon.ca/exec/obidos/ASIN/0967958776/qid=1140217014/sr=1-7/ref=sr_1_0_7/702-7033870-9370469">Bokamba, Eyamba G. &amp; Bokamba, Molingo Virginie, Tosolola Na Lingala: Let's Speak Lingala ISBN: 0967958776</reference>
+ <reference type="RP3" uri="http://www.rifal.org/3_information.html">Edema Atibakwa-Baboya, L’orthographe des langues de la République démocratique du Congo: entre usages et norme, Les cahiers du Rifal, N° 23, novembre 2003</reference>
+ <reference type="RP4" uri="http://en.wikipedia.org/wiki/Lingala_language">Wikipedia on Lingala</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ln_CD.xml b/libs/Zend/Locale/Data/ln_CD.xml
new file mode 100755
index 0000000000..475f9d18b1
--- /dev/null
+++ b/libs/Zend/Locale/Data/ln_CD.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ln"/>
+ <territory type="CD"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ln_CG.xml b/libs/Zend/Locale/Data/ln_CG.xml
new file mode 100755
index 0000000000..3760dd75bf
--- /dev/null
+++ b/libs/Zend/Locale/Data/ln_CG.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ln"/>
+ <territory type="CG"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/lo.xml b/libs/Zend/Locale/Data/lo.xml
new file mode 100755
index 0000000000..f2d4e84b25
--- /dev/null
+++ b/libs/Zend/Locale/Data/lo.xml
@@ -0,0 +1,552 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.45 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="lo"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa" draft="unconfirmed">ອາຟາ</language>
+ <language type="ab" draft="unconfirmed">à»àº­àºšàº„າເຊàº</language>
+ <language type="af" draft="unconfirmed">ອາຟິຼàºàºàº²</language>
+ <language type="am" draft="unconfirmed">ອຳຮາລິດ</language>
+ <language type="ar" draft="unconfirmed">ອາລາເບàº</language>
+ <language type="as" draft="unconfirmed">ອັດສຳມິດ</language>
+ <language type="ay" draft="unconfirmed">ໄອມາລາ</language>
+ <language type="az" draft="unconfirmed">ອາເຊີໄບຈານີ</language>
+ <language type="ba" draft="unconfirmed">ບາສສີ</language>
+ <language type="be" draft="unconfirmed">ບາàºà»‚ລລັດເຊàº</language>
+ <language type="bg" draft="unconfirmed">ບັງàºàº²à»€àº¥àº</language>
+ <language type="bh" draft="unconfirmed">ບິຮາລິ</language>
+ <language type="bi" draft="unconfirmed">ບິສລາມາ</language>
+ <language type="bn" draft="unconfirmed">ບຸນàºàº²àº¥àºµ</language>
+ <language type="bo" draft="unconfirmed">ທິເບດ</language>
+ <language type="br" draft="unconfirmed">ບີທັນ</language>
+ <language type="ca" draft="unconfirmed">à»àº„ຕາà»àº¥àº™</language>
+ <language type="co" draft="unconfirmed">ຄà»àºŠàº´àºà»‰àº²</language>
+ <language type="cs" draft="unconfirmed">ເຊັàº</language>
+ <language type="cy" draft="unconfirmed">ເວວ</language>
+ <language type="da" draft="unconfirmed">ເດນà»àº²àº</language>
+ <language type="de" draft="unconfirmed">ເຢàºàº¥àº°àº¡àº±àº™</language>
+ <language type="dz" draft="unconfirmed">ພູຖານີ</language>
+ <language type="el" draft="unconfirmed">àºàºµàº</language>
+ <language type="en" draft="unconfirmed">ອັງàºàº´àº”</language>
+ <language type="eo" draft="unconfirmed">ເອສເປີລັນໂຕ</language>
+ <language type="es" draft="unconfirmed">ສະເປນ</language>
+ <language type="et" draft="unconfirmed">ເອສໂຕເນàº</language>
+ <language type="eu" draft="unconfirmed">à»àºšàºª</language>
+ <language type="fa" draft="unconfirmed">ເປີເຊàº</language>
+ <language type="fi" draft="unconfirmed">ຟິນ</language>
+ <language type="fj" draft="unconfirmed">ຟິຈິ</language>
+ <language type="fo" draft="unconfirmed">ຟາໂລດ</language>
+ <language type="fr" draft="unconfirmed">àºàº±à»ˆàº¥àº‡à»€àºªàº”</language>
+ <language type="fy" draft="unconfirmed">ຟິນà»àº¥àº™</language>
+ <language type="ga" draft="unconfirmed">ໄອລິດ</language>
+ <language type="gd" draft="unconfirmed">ສະàºàº±àº­àº”ເຄີດ</language>
+ <language type="gl" draft="unconfirmed">àºàº°àºªàº´à»€àºŠàº</language>
+ <language type="gn" draft="unconfirmed">àºàº»àº§àº¥àº²àº™àºµ</language>
+ <language type="gu" draft="unconfirmed">àºàº¹àºˆàº²àº¥àº²àº•àºµ</language>
+ <language type="ha" draft="unconfirmed">ໂອຊາ</language>
+ <language type="he" draft="unconfirmed">ຢິວ</language>
+ <language type="hi" draft="unconfirmed">ຮິນດິ</language>
+ <language type="hr" draft="unconfirmed">ໂຄເອເຊàº</language>
+ <language type="hu" draft="unconfirmed">ຮົງàºàº²àº¥àºµ</language>
+ <language type="hy" draft="unconfirmed">ອາມິເນàº</language>
+ <language type="ia" draft="unconfirmed">ອິນເຕີລິງàºàº§àº²</language>
+ <language type="id" draft="unconfirmed">ອິນໂດເນເຊàº</language>
+ <language type="ie" draft="unconfirmed">ອິນເຕີລິງ</language>
+ <language type="ik" draft="unconfirmed">ໄອນູປຽàº</language>
+ <language type="is" draft="unconfirmed">ໄອà»àº¥àº™àº”ິດ</language>
+ <language type="it" draft="unconfirmed">ອິຕາສິ</language>
+ <language type="iu" draft="unconfirmed">ໄອນຸàºàº•àº´àº•àº±àº</language>
+ <language type="ja" draft="unconfirmed">àºàºµà»ˆàº›àº¸à»ˆàº™</language>
+ <language type="jv" draft="unconfirmed">ຊະວາ</language>
+ <language type="ka" draft="unconfirmed">ຈà»à»€àºˆàº</language>
+ <language type="kk" draft="unconfirmed">ຄາຊັàº</language>
+ <language type="kl" draft="unconfirmed">àºàº¼àºµàº™à»àº¥àº™àº”ິດ</language>
+ <language type="km" draft="unconfirmed">ຂະເà»àº™</language>
+ <language type="kn" draft="unconfirmed">àºàº²àº™àº²àº”າ</language>
+ <language type="ko" draft="unconfirmed">ເàºàº»àº²àº«àº¥àºµ</language>
+ <language type="ks" draft="unconfirmed">ຄັດຊະມີລີ</language>
+ <language type="ku" draft="unconfirmed">ເຄີດ</language>
+ <language type="ky" draft="unconfirmed">ເຄວàºàº´àº”</language>
+ <language type="la" draft="unconfirmed">ລາຕິນ</language>
+ <language type="ln" draft="unconfirmed">ລິງàºàº²àº¥àº²</language>
+ <language type="lo" draft="unconfirmed">ລາວ</language>
+ <language type="lt" draft="unconfirmed">ລິທົວເນàº</language>
+ <language type="lv" draft="unconfirmed">à»àº¥àº•àº°à»€àº§àº(ເລດທະວິດ)</language>
+ <language type="mg" draft="unconfirmed">ມາລາàºàº²àºŠàº´</language>
+ <language type="mi" draft="unconfirmed">ເມົາລີ</language>
+ <language type="mk" draft="unconfirmed">à»àº¡àº±àºàºŠàº´à»‚ດເນàº</language>
+ <language type="ml" draft="unconfirmed">à»àº¡àº¥àº°àº¢àº²àº¥àº³</language>
+ <language type="mn" draft="unconfirmed">ມອງໂàºàº¼</language>
+ <language type="mo" draft="unconfirmed">ໂມຄາເວàº</language>
+ <language type="mr" draft="unconfirmed">ມາລາທິ</language>
+ <language type="ms" draft="unconfirmed">ມາລາຢູ</language>
+ <language type="mt" draft="unconfirmed">ມອນຕາ</language>
+ <language type="my" draft="unconfirmed">ພະມ່າ</language>
+ <language type="na" draft="unconfirmed">ນà»àº¥àº¹</language>
+ <language type="ne" draft="unconfirmed">ເນປານ</language>
+ <language type="nl" draft="unconfirmed">ອà»àº¥àº±àº™àº”າ</language>
+ <language type="no" draft="unconfirmed">ນà»à»€àº§àº§</language>
+ <language type="oc" draft="unconfirmed">ອອັàºàºŠàº´àº—ັນ</language>
+ <language type="om" draft="unconfirmed">ໂອໂລໂມ(ອາຟານ)</language>
+ <language type="or" draft="unconfirmed">ໂອລິàºàº²</language>
+ <language type="pa" draft="unconfirmed">ປັນຈາ</language>
+ <language type="pl" draft="unconfirmed">ໂປà»àº¥àº™</language>
+ <language type="ps" draft="unconfirmed">ພາສໂຕ(ພຸດໂຕ)</language>
+ <language type="pt" draft="unconfirmed">ໂປຕຸເàºàº”</language>
+ <language type="qu" draft="unconfirmed">ຄິວຊົວ</language>
+ <language type="rm" draft="unconfirmed">ເລໂຕ-ໂລà»àº¡àº™</language>
+ <language type="rn" draft="unconfirmed">ຄິລັນສີ</language>
+ <language type="ro" draft="unconfirmed">ໂລມັນ</language>
+ <language type="ru" draft="unconfirmed">ລັດເຊàº</language>
+ <language type="rw" draft="unconfirmed">ຄິນàºàº²àº§àº±àº™àº”າ</language>
+ <language type="sa" draft="unconfirmed">ສັນສະàºàº´àº”</language>
+ <language type="sd" draft="unconfirmed">ຊິນດິ</language>
+ <language type="sg" draft="unconfirmed">ສັນໂຄ</language>
+ <language type="sh" draft="unconfirmed">ເຊີໂບ-ໂຄເອທຽນ</language>
+ <language type="si" draft="unconfirmed">ສິງຫລà»</language>
+ <language type="sk" draft="unconfirmed">ສະໂລວັàº</language>
+ <language type="sl" draft="unconfirmed">ສະໂລວາເນàº</language>
+ <language type="sm" draft="unconfirmed">ຊາມົວ</language>
+ <language type="sn" draft="unconfirmed">ໂຊນາ</language>
+ <language type="so" draft="unconfirmed">ໂຊມາສິ</language>
+ <language type="sq" draft="unconfirmed">à»àº­àº¥à»€àºšà»€àº™àº</language>
+ <language type="sr" draft="unconfirmed">ເຊີເບàº</language>
+ <language type="ss" draft="unconfirmed">ຊິສວາຕິ</language>
+ <language type="st" draft="unconfirmed">ເຊໂສໂທ</language>
+ <language type="su" draft="unconfirmed">ຊັນດານິສ</language>
+ <language type="sv" draft="unconfirmed">ສະວີເດນ</language>
+ <language type="sw" draft="unconfirmed">ຊະວາຮິລີ</language>
+ <language type="ta" draft="unconfirmed">ທະມິບ</language>
+ <language type="te" draft="unconfirmed">ທິລູàºàº¹</language>
+ <language type="tg" draft="unconfirmed">ທາຈິດ</language>
+ <language type="th" draft="unconfirmed">ໄທ</language>
+ <language type="ti" draft="unconfirmed">ທິàºàº´àº™àº¢àº²</language>
+ <language type="tk" draft="unconfirmed">ເຕີàºà»€àº¡àº™</language>
+ <language type="tl" draft="unconfirmed">ຕາàºàº²àº¥àº±àº­àº</language>
+ <language type="tn" draft="unconfirmed">ເຊຕະສະວານາ</language>
+ <language type="to" draft="unconfirmed">ທອງàºà»‰àº²</language>
+ <language type="tr" draft="unconfirmed">ຕຸລາàºàºµ</language>
+ <language type="ts" draft="unconfirmed">ຊອງàºàº²</language>
+ <language type="tt" draft="unconfirmed">ຕາດ</language>
+ <language type="tw" draft="unconfirmed">ທະວີ</language>
+ <language type="ug" draft="unconfirmed">ອຸàºàºàº»àº§</language>
+ <language type="uk" draft="unconfirmed">ຢູເຄຼນ</language>
+ <language type="ur" draft="unconfirmed">ອິນດູ</language>
+ <language type="uz" draft="unconfirmed">ອຸດສະເບດ</language>
+ <language type="vi" draft="unconfirmed">ວຽດນາມ</language>
+ <language type="vo" draft="unconfirmed">ໂວລາພຸàº</language>
+ <language type="wo" draft="unconfirmed">ວູບ</language>
+ <language type="xh" draft="unconfirmed">ໂຊສາ</language>
+ <language type="yi" draft="unconfirmed">ຢີຄິດ</language>
+ <language type="yo" draft="unconfirmed">ໂຢລູບາ</language>
+ <language type="za" draft="unconfirmed">ຈວງ</language>
+ <language type="zh" draft="unconfirmed">ຈີນ</language>
+ <language type="zu" draft="unconfirmed">ຊູລູ</language>
+ </languages>
+ <territories>
+ <territory type="AD" draft="unconfirmed">ອັນດà»àº¥àº²</territory>
+ <territory type="AE" draft="unconfirmed">ສະຫະລັດອາຫລັບເອມິເລດ</territory>
+ <territory type="AF" draft="unconfirmed">ອັຟàºàº²àº™àº´àº”ສະຖານ</territory>
+ <territory type="AI" draft="unconfirmed">ອັນàºàº´àº¥àº²</territory>
+ <territory type="AL" draft="unconfirmed">à»àº­àº¥à»€àºšà»€àº™àº</territory>
+ <territory type="AM" draft="unconfirmed">ອາມິເນàº</territory>
+ <territory type="AN" draft="unconfirmed">ເນເທີà»àº¥àº™à»àº­àº™à»€àº—ິນ</territory>
+ <territory type="AO" draft="unconfirmed">ອັນໂàºàº¥àº²</territory>
+ <territory type="AR" draft="unconfirmed">ອາເຈນຕິນາ່</territory>
+ <territory type="AT" draft="unconfirmed">ອົອດສະເຕຼàº</territory>
+ <territory type="AU" draft="unconfirmed">ອົອດສະຕາລີ</territory>
+ <territory type="AW" draft="unconfirmed">ອາລູບາ</territory>
+ <territory type="AZ" draft="unconfirmed">ອາເຊີໄບຈັນ</territory>
+ <territory type="BA" draft="unconfirmed">ບັອດສເນຠà»àº¥àº° ເຮີດໂàºàº§àº´à»€àº™àº</territory>
+ <territory type="BB" draft="unconfirmed">ບາບາຄັອດ</territory>
+ <territory type="BD" draft="unconfirmed">ບັງàºàº°àº¥àº²à»€àº—ດ</territory>
+ <territory type="BE" draft="unconfirmed">ເບວຢຽມ</territory>
+ <territory type="BF" draft="unconfirmed">ເບີàºàº´àº™àº²àºŸàº²à»‚ຊ</territory>
+ <territory type="BG" draft="unconfirmed">ບັງàºàº²à»€àº¥àº</territory>
+ <territory type="BH" draft="unconfirmed">ບາເລນ</territory>
+ <territory type="BI" draft="unconfirmed">ບູລັນຕິ</territory>
+ <territory type="BJ" draft="unconfirmed">ເບນິນ</territory>
+ <territory type="BM" draft="unconfirmed">ເບີມິວດາ</territory>
+ <territory type="BN" draft="unconfirmed">ບູຮໄນ</territory>
+ <territory type="BO" draft="unconfirmed">ໂບລິເວàº</territory>
+ <territory type="BR" draft="unconfirmed">ບຼາຊິວ</territory>
+ <territory type="BS" draft="unconfirmed">ບາຮາມາສ</territory>
+ <territory type="BT" draft="unconfirmed">ພູຖານ</territory>
+ <territory type="BW" draft="unconfirmed">ບອັດສະວານາ</territory>
+ <territory type="BY" draft="unconfirmed">ເບນລາຮັສ</territory>
+ <territory type="BZ" draft="unconfirmed">ເບລິຊ</territory>
+ <territory type="CA" draft="unconfirmed">àºàº²àº™àº²àº”າ</territory>
+ <territory type="CF" draft="unconfirmed">ສາທາລະນະລັດອັບຟຼິàºàºàº²àºàº²àº‡</territory>
+ <territory type="CG" draft="unconfirmed">ຄອງໂàº</territory>
+ <territory type="CH" draft="unconfirmed">ສະວິດເຊີà»àº¥àº™</territory>
+ <territory type="CI" draft="unconfirmed">àºàº±à»ˆàº‡àº—ະເລໄອວà»àº¥àº´</territory>
+ <territory type="CL" draft="unconfirmed">ຊິສິ</territory>
+ <territory type="CM" draft="unconfirmed">ຄາເມລູນ</territory>
+ <territory type="CN" draft="unconfirmed">ຈີນ</territory>
+ <territory type="CO" draft="unconfirmed">ໂຄລຳເບàº</territory>
+ <territory type="CR" draft="unconfirmed">ຄອສຕາລິàºàº²</territory>
+ <territory type="CS" draft="unconfirmed">ເຊີເບàº</territory>
+ <territory type="CU" draft="unconfirmed">ຄິວບາ</territory>
+ <territory type="CV" draft="unconfirmed">ເຄບວອດ</territory>
+ <territory type="CY" draft="unconfirmed">ໄຊປັຼດ</territory>
+ <territory type="CZ" draft="unconfirmed">ສາທາລະນະລັດເຊັàº</territory>
+ <territory type="DE" draft="unconfirmed">ເຢàºàº¥àº°àº¡àº±àº™</territory>
+ <territory type="DJ" draft="unconfirmed">ຄິໂບຕິ</territory>
+ <territory type="DK" draft="unconfirmed">ເດນມາàº</territory>
+ <territory type="DM" draft="unconfirmed">ໂດເມນິàºàº²</territory>
+ <territory type="DO" draft="unconfirmed">ສາທາລະນະລັດໂດມິນິàºàº±àº™</territory>
+ <territory type="DZ" draft="unconfirmed">à»àº­àº¥àºˆàº´à»€àº¥àº</territory>
+ <territory type="EC" draft="unconfirmed">ເອàºàº§àº²àº”à»</territory>
+ <territory type="EE" draft="unconfirmed">ເອສໂຕເນàº</territory>
+ <territory type="EG" draft="unconfirmed">ອີຢິບ</territory>
+ <territory type="EH" draft="unconfirmed">ຊາຮາລາຕະເວັນຕົàº</territory>
+ <territory type="ER" draft="unconfirmed">ອິນຊີ</territory>
+ <territory type="ES" draft="unconfirmed">ສະເປນ</territory>
+ <territory type="ET" draft="unconfirmed">ເອທິໂອເປàº</territory>
+ <territory type="FI" draft="unconfirmed">ຟິນà»àº¥àº™</territory>
+ <territory type="FJ" draft="unconfirmed">ຟິຈິ</territory>
+ <territory type="FM" draft="unconfirmed">ໄມໂຄນິເຊàº</territory>
+ <territory type="FR" draft="unconfirmed">àºàº¥àº±à»ˆàº‡</territory>
+ <territory type="GA" draft="unconfirmed">àºàº²àºšàº­àº™</territory>
+ <territory type="GB" draft="unconfirmed">ສະຫະລາດຊະອານາຈັàº</territory>
+ <territory type="GE" draft="unconfirmed">ຈà»à»€àºˆàº</territory>
+ <territory type="GF" draft="unconfirmed">ເຟັນສàºàº´àº§àº™àº²</territory>
+ <territory type="GH" draft="unconfirmed">àºàº²àº™à»ˆàº²</territory>
+ <territory type="GM" draft="unconfirmed">à»àºàº¡à»€àºšàº</territory>
+ <territory type="GN" draft="unconfirmed">àºàº´àº§àº™àºµ</territory>
+ <territory type="GP" draft="unconfirmed">àºàº»àº§à»€àº”ີລູບ</territory>
+ <territory type="GQ" draft="unconfirmed">ເອຄົວໂທເລàºàº¥àº°àºàº´àº™àºµ</territory>
+ <territory type="GR" draft="unconfirmed">àºàº´àº¼àº</territory>
+ <territory type="GT" draft="unconfirmed">àºàº»àº§à»€àº•àº¡àº²àº¥àº²</territory>
+ <territory type="GW" draft="unconfirmed">àºàº´àº§àº™àºµ-ບິສໂຊ</territory>
+ <territory type="GY" draft="unconfirmed">àºàº¹àº¢àº²àº™àº²</territory>
+ <territory type="HK" draft="unconfirmed">ຮ່ອງàºàº»àº‡</territory>
+ <territory type="HN" draft="unconfirmed">ອວນຄູຣັສ</territory>
+ <territory type="HR" draft="unconfirmed">ໂຄເອເຊàº</territory>
+ <territory type="HT" draft="unconfirmed">ໄອທີ</territory>
+ <territory type="HU" draft="unconfirmed">ຮົງàºàº²àº£àºµ</territory>
+ <territory type="ID" draft="unconfirmed">ອິນໂດເນເຊàº</territory>
+ <territory type="IE" draft="unconfirmed">ໄອà»àº¥àº™</territory>
+ <territory type="IL" draft="unconfirmed">ອິສລະເອວ</territory>
+ <territory type="IN" draft="unconfirmed">ອິນເດàº</territory>
+ <territory type="IQ" draft="unconfirmed">ອີລັàº</territory>
+ <territory type="IR" draft="unconfirmed">ອີລ່ານ</territory>
+ <territory type="IS" draft="unconfirmed">ໄອສà»àº¥àº™</territory>
+ <territory type="IT" draft="unconfirmed">ອິຕາລີ</territory>
+ <territory type="JM" draft="unconfirmed">ຈາໄມàºàº²</territory>
+ <territory type="JO" draft="unconfirmed">ຈà»à»àº”ນ</territory>
+ <territory type="JP" draft="unconfirmed">àºàºµà»ˆàº›àº¸à»ˆàº™</territory>
+ <territory type="KE" draft="unconfirmed">ເຄນຢ່າ</territory>
+ <territory type="KG" draft="unconfirmed">ເດີàºàº´àº”ສະຖານ</territory>
+ <territory type="KH" draft="unconfirmed">àºàº³àº›àº¹à»€àºˆàº</territory>
+ <territory type="KI" draft="unconfirmed">ຄີລິບາດ</territory>
+ <territory type="KM" draft="unconfirmed">ໂຄໂມຣອດ</territory>
+ <territory type="KP" draft="unconfirmed">ເàºàº»àº²àº«àº¥àºµà»€à»œàº·àº­</territory>
+ <territory type="KR" draft="unconfirmed">ເàºàº»àº²àº«àº¥àºµà»ƒàº•à»‰</territory>
+ <territory type="KW" draft="unconfirmed">ຄູເວດ</territory>
+ <territory type="KZ" draft="unconfirmed">ຄາຊັດສະຖານ</territory>
+ <territory type="LA" draft="unconfirmed">ລາວ</territory>
+ <territory type="LB" draft="unconfirmed">ເລບານອນ</territory>
+ <territory type="LI" draft="unconfirmed">ໄລເທນສະໄຕ</territory>
+ <territory type="LK" draft="unconfirmed">ສີລັງàºàº²</territory>
+ <territory type="LR" draft="unconfirmed">ລິເບີເລàº</territory>
+ <territory type="LS" draft="unconfirmed">ເລໂຊໂທ</territory>
+ <territory type="LT" draft="unconfirmed">ລິເທີເນàº</territory>
+ <territory type="LU" draft="unconfirmed">ລຸàºà»àºŠàº¡à»€àºšàºµàº</territory>
+ <territory type="LV" draft="unconfirmed">ລຼາດເວàº</territory>
+ <territory type="LY" draft="unconfirmed">ລິເບàº</territory>
+ <territory type="MA" draft="unconfirmed">ໂມລັອàºà»‚ຄ</territory>
+ <territory type="MC" draft="unconfirmed">ໂມນາໂàº</territory>
+ <territory type="MD" draft="unconfirmed">ໂມນໂຄວາ</territory>
+ <territory type="MG" draft="unconfirmed">ມາຄາàºàº±àºªàºàº²</territory>
+ <territory type="MK" draft="unconfirmed">à»àº¡àºŠàº´à»‚ຄເນàº</territory>
+ <territory type="ML" draft="unconfirmed">ມາລິ</territory>
+ <territory type="MM" draft="unconfirmed">ສະຫະພາບພະມ້າ</territory>
+ <territory type="MN" draft="unconfirmed">ມົງໂàºàº¥àºµ</territory>
+ <territory type="MO" draft="unconfirmed">ມາເàºàº»à»‰àº²</territory>
+ <territory type="MQ" draft="unconfirmed">ມາຕິນິàº</territory>
+ <territory type="MR" draft="unconfirmed">ມà»àº¥àº´àºàº—າເນàº</territory>
+ <territory type="MS" draft="unconfirmed">ມອນເຊີລາດ</territory>
+ <territory type="MT" draft="unconfirmed">ມັນຕາ</territory>
+ <territory type="MU" draft="unconfirmed">ມà»àº£àº´àº•àº½àº”</territory>
+ <territory type="MX" draft="unconfirmed">à»àº¡àº±àºàºŠàº´à»‚àº</territory>
+ <territory type="MY" draft="unconfirmed">ມາເລເຊàº</territory>
+ <territory type="MZ" draft="unconfirmed">ໂມà»àºŠàº¡àºšàº´àº</territory>
+ <territory type="NA" draft="unconfirmed">ນາມິເບàº</territory>
+ <territory type="NC" draft="unconfirmed">ນິວຄາລິໂຄເນàº</territory>
+ <territory type="NE" draft="unconfirmed">ໄນເຈີ</territory>
+ <territory type="NG" draft="unconfirmed">ໄນຈີເລàº</territory>
+ <territory type="NI" draft="unconfirmed">ນິຄາລາàºàº»àº§</territory>
+ <territory type="NL" draft="unconfirmed">ເນເທີà»àº¥àº™</territory>
+ <territory type="NO" draft="unconfirmed">ນà»à»€àº§</territory>
+ <territory type="NP" draft="unconfirmed">ເນປານ</territory>
+ <territory type="NU" draft="unconfirmed">ນີຢູ</territory>
+ <territory type="NZ" draft="unconfirmed">ນິວຊີà»àº¥àº™</territory>
+ <territory type="OM" draft="unconfirmed">ໂອມານ</territory>
+ <territory type="PA" draft="unconfirmed">ປານາມາ</territory>
+ <territory type="PE" draft="unconfirmed">ເປລູ</territory>
+ <territory type="PF" draft="unconfirmed">ເຟັນຣໂພລິນີເຊàº</territory>
+ <territory type="PG" draft="unconfirmed">ປາປົວນິວàºàºµàº™àºµ</territory>
+ <territory type="PH" draft="unconfirmed">ຟິລິປິນ</territory>
+ <territory type="PK" draft="unconfirmed">ປາàºàº´àºªàº–ານ</territory>
+ <territory type="PL" draft="unconfirmed">ໂປà»àº¥àº™</territory>
+ <territory type="PR" draft="unconfirmed">ເປີໂຕລິໂàº</territory>
+ <territory type="PT" draft="unconfirmed">ໂປຕຸàºàºàº±àº™</territory>
+ <territory type="PY" draft="unconfirmed">ປາລາàºàº§àº</territory>
+ <territory type="QA" draft="unconfirmed">àºàº²àº•àº²</territory>
+ <territory type="RO" draft="unconfirmed">ລູເມເນàº</territory>
+ <territory type="RU" draft="unconfirmed">ລັດເຊàº</territory>
+ <territory type="RW" draft="unconfirmed">ລາວັນດາ</territory>
+ <territory type="SA" draft="unconfirmed">ຊາອຸດິອາລະເບàº</territory>
+ <territory type="SC" draft="unconfirmed">ເຊà»àºŠàº§</territory>
+ <territory type="SD" draft="unconfirmed">ຊູດານ</territory>
+ <territory type="SE" draft="unconfirmed">ສະວິເດັນ</territory>
+ <territory type="SG" draft="unconfirmed">ສິງàºàº°à»‚ປ</territory>
+ <territory type="SI" draft="unconfirmed">ສະໂລເວເນàº</territory>
+ <territory type="SK" draft="unconfirmed">ສະໂລວາເàºàº</territory>
+ <territory type="SL" draft="unconfirmed">ເຊàºàº¥àº²àºªàº´àº­àº­àº™</territory>
+ <territory type="SN" draft="unconfirmed">ຊິນີàºàº±àº™</territory>
+ <territory type="SO" draft="unconfirmed">ໂຊມາເລàº</territory>
+ <territory type="SR" draft="unconfirmed">ຊູລິນາມິ</territory>
+ <territory type="SV" draft="unconfirmed">ເອຊາວາດà»</territory>
+ <territory type="SY" draft="unconfirmed">ຊິເລàº</territory>
+ <territory type="SZ" draft="unconfirmed">ສະວາຊິà»àº¥àº™</territory>
+ <territory type="TD" draft="unconfirmed">ຊາດ</territory>
+ <territory type="TF" draft="unconfirmed">ອານາເຂດທາງໃຕ້ຂອງàºàº¥àº±à»ˆàº‡à»€àºªàº”</territory>
+ <territory type="TG" draft="unconfirmed">ໂຕໂàº</territory>
+ <territory type="TH" draft="unconfirmed">ປະເທດໄທ</territory>
+ <territory type="TJ" draft="unconfirmed">ທາຈິàºàº´àºªàº°àº–ານ</territory>
+ <territory type="TK" draft="unconfirmed">ໂທàºàº´à»‚ລ</territory>
+ <territory type="TL" draft="unconfirmed">ຕິມà»àº•àº²à»€àº§àº±àº™àº­àº­àº</territory>
+ <territory type="TM" draft="unconfirmed">ເຕຣີàºà»€àº¡àº™àº´àºªàº°àº–ານ</territory>
+ <territory type="TN" draft="unconfirmed">ຕູນິເຊàº</territory>
+ <territory type="TO" draft="unconfirmed">ທອງàºà»‰àº²</territory>
+ <territory type="TR" draft="unconfirmed">ຕຸນàºàºµ</territory>
+ <territory type="TT" draft="unconfirmed">ທິນິà»àº”ດ</territory>
+ <territory type="TW" draft="unconfirmed">ໄຕ້ຫວັນ</territory>
+ <territory type="TZ" draft="unconfirmed">ທານຊາເນàº</territory>
+ <territory type="UA" draft="unconfirmed">ຢູເຄຼນ</territory>
+ <territory type="UG" draft="unconfirmed">ອູàºàº²àº™àº”າ</territory>
+ <territory type="US" draft="unconfirmed">ສະຫະລັດອາເມລິàºàº²</territory>
+ <territory type="UY" draft="unconfirmed">ລູàºàº§àºàº­àº¸àº£</territory>
+ <territory type="UZ" draft="unconfirmed">ອຸດເບàºàº´àºªàº°àº–ານ</territory>
+ <territory type="VA" draft="unconfirmed">ວາຕິàºàº±àº™</territory>
+ <territory type="VE" draft="unconfirmed">ເວເນຊູເອລາ</territory>
+ <territory type="VG" draft="unconfirmed">ບຣິທິດເວີຈິນໄອà»àº¥àº™</territory>
+ <territory type="VI" draft="unconfirmed">ຢູເອສເວີຈິນໄອà»àº¥àº™</territory>
+ <territory type="VN" draft="unconfirmed">ຫວຽດນາມ</territory>
+ <territory type="VU" draft="unconfirmed">ວານົວຕູ</territory>
+ <territory type="YE" draft="unconfirmed">ເຢເມນ</territory>
+ <territory type="YT" draft="unconfirmed">ມາຢອດ</territory>
+ <territory type="ZA" draft="unconfirmed">ອາຟະລິàºàº²à»ƒàº•à»‰</territory>
+ <territory type="ZM" draft="unconfirmed">à»àºŠàº¡à»€àºšàº</territory>
+ <territory type="ZW" draft="unconfirmed">ຊິມບັບເວ</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[່-໠ໆ ຠຂ ຄ ງ ຈ ຊ ຠດ-ທ ນ-ຟ ມ-ຣ ລ ວ ສ ຫ ໜ ໠ອ-ູ ົ-ຽ ເ-ໄ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200B à»-à»™]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars draft="unconfirmed">GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="buddhist">
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">ພ.ສ.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEE'ທີ່ 'd MMMM G yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">d/M/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">H' ໂມງ 'm'ນາທີ 'ss' ວິນາທີ'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">H' ໂມງ 'm'ນາທີ'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <dateTimeFormatLength>
+ <dateTimeFormat>
+ <pattern draft="unconfirmed">{1}, {0}</pattern>
+ </dateTimeFormat>
+ </dateTimeFormatLength>
+ </dateTimeFormats>
+ </calendar>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">ມ.àº.</month>
+ <month type="2" draft="unconfirmed">àº.ພ.</month>
+ <month type="3" draft="unconfirmed">ມີ.ນ.</month>
+ <month type="4" draft="unconfirmed">ມ.ສ..</month>
+ <month type="5" draft="unconfirmed">ພ.ພ.</month>
+ <month type="6" draft="unconfirmed">ມິ.ຖ.</month>
+ <month type="7" draft="unconfirmed">àº.ລ.</month>
+ <month type="8" draft="unconfirmed">ສ.ຫ.</month>
+ <month type="9" draft="unconfirmed">àº.àº.</month>
+ <month type="10" draft="unconfirmed">ຕ.ລ.</month>
+ <month type="11" draft="unconfirmed">ພ.ຈ.</month>
+ <month type="12" draft="unconfirmed">ທ.ວ.</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">ມັງàºàº­àº™</month>
+ <month type="2" draft="unconfirmed">àºàº¸àº¡àºžàº²</month>
+ <month type="3" draft="unconfirmed">ມີນາ</month>
+ <month type="4" draft="unconfirmed">ເມສາ</month>
+ <month type="5" draft="unconfirmed">ພຶດສະພາ</month>
+ <month type="6" draft="unconfirmed">ມິຖຸນາ</month>
+ <month type="7" draft="unconfirmed">àºà»àº¥àº°àºàº»àº”</month>
+ <month type="8" draft="unconfirmed">ສິງຫາ</month>
+ <month type="9" draft="unconfirmed">àºàº±àº™àºàº²</month>
+ <month type="10" draft="unconfirmed">ຕຸລາ</month>
+ <month type="11" draft="unconfirmed">ພະຈິàº</month>
+ <month type="12" draft="unconfirmed">ທັນວາ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">ອາ.</day>
+ <day type="mon" draft="unconfirmed">ຈ.</day>
+ <day type="tue" draft="unconfirmed">ອ.</day>
+ <day type="wed" draft="unconfirmed">ພ.</day>
+ <day type="thu" draft="unconfirmed">ພຫ.</day>
+ <day type="fri" draft="unconfirmed">ສàº.</day>
+ <day type="sat" draft="unconfirmed">ສ.</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">ວັນອາທິດ</day>
+ <day type="mon" draft="unconfirmed">ວັນຈັນ</day>
+ <day type="tue" draft="unconfirmed">ວັນອັງຄານ</day>
+ <day type="wed" draft="unconfirmed">ວັນພຸດ</day>
+ <day type="thu" draft="unconfirmed">ວັນພະຫັດ</day>
+ <day type="fri" draft="unconfirmed">ວັນສຸàº</day>
+ <day type="sat" draft="unconfirmed">ວັນເສົາ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">àºà»ˆàº­àº™àº—່ຽງ</am>
+ <pm draft="unconfirmed">ຫລັງທ່ຽງ</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">ປີàºà»ˆàº­àº™àº„ິດສະàºàº²àº™àº—ີ່</era>
+ <era type="1" draft="unconfirmed">ຄິດສະàºàº²àº™àº—ີ່</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">ປີàºà»ˆàº­àº™àº„ິດສະàºàº²àº™àº—ີ່</era>
+ <era type="1" draft="unconfirmed">ຄ.ສ.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEE'ທີ 'd MMMM G yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">d/M/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">H'ໂມງ 'm'ນາທີ 'ss' ວິນາທີ</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">H' ໂມງ 'm'ນາທີ'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <dateTimeFormatLength>
+ <dateTimeFormat>
+ <pattern draft="unconfirmed">{1}, {0}</pattern>
+ </dateTimeFormat>
+ </dateTimeFormatLength>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">d/M</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">M/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="LAK">
+ <displayName draft="unconfirmed">àºàºµàºš</displayName>
+ <symbol draft="unconfirmed">â‚­</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/lo_LA.xml b/libs/Zend/Locale/Data/lo_LA.xml
new file mode 100755
index 0000000000..3d77abc947
--- /dev/null
+++ b/libs/Zend/Locale/Data/lo_LA.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.29 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="lo"/>
+ <territory type="LA"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">'</quotationStart>
+ <quotationEnd draft="unconfirmed">'</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">&quot;</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">&quot;</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##0.00;¤-#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/lt.xml b/libs/Zend/Locale/Data/lt.xml
new file mode 100755
index 0000000000..b6cb5c6a93
--- /dev/null
+++ b/libs/Zend/Locale/Data/lt.xml
@@ -0,0 +1,608 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.71 $"/>
+ <generation date="$Date: 2006/06/28 04:18:18 $"/>
+ <language type="lt"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar">Arabų</language>
+ <language type="bg">Bulgarų</language>
+ <language type="bn">Bengalų</language>
+ <language type="cs">Čekų</language>
+ <language type="da">Danų</language>
+ <language type="de">VokieÄių</language>
+ <language type="el">Graikų</language>
+ <language type="en">Anglų</language>
+ <language type="es">Ispanų</language>
+ <language type="et">Estų</language>
+ <language type="fi">Suomių</language>
+ <language type="fr">Prancūzų</language>
+ <language type="he">Hebrajų</language>
+ <language type="hi">Hindi</language>
+ <language type="hr">Kroatų</language>
+ <language type="hu">Vengrų</language>
+ <language type="it">Italų</language>
+ <language type="ja">Japonų</language>
+ <language type="ko">KorÄ—jieÄių</language>
+ <language type="lt">Lietuvių</language>
+ <language type="lv">Latvių</language>
+ <language type="nl">Olandų</language>
+ <language type="no">Norvegų</language>
+ <language type="pl">Lenkų</language>
+ <language type="pt">Portugalų</language>
+ <language type="ro">Rumunų</language>
+ <language type="ru">Rusų</language>
+ <language type="sk">Slovakų</language>
+ <language type="sl">Slovėnų</language>
+ <language type="sv">Švedų</language>
+ <language type="th">Tajų</language>
+ <language type="tr">Turkų</language>
+ <language type="zh">Kinų</language>
+ </languages>
+ <scripts>
+ <script type="Latn">Latin</script>
+ </scripts>
+ <territories>
+ <territory type="001">Pasaulis</territory>
+ <territory type="002">Afrika</territory>
+ <territory type="005">Pietų Amerika</territory>
+ <territory type="009" draft="provisional">Okeanija</territory>
+ <territory type="011">Vakarų Afrika</territory>
+ <territory type="013">CentrinÄ— Amerika</territory>
+ <territory type="014">Rytų Afrika</territory>
+ <territory type="015">Å iaurÄ—s Afrika</territory>
+ <territory type="017">Vidurio Afrika</territory>
+ <territory type="018">Pietų Afrika [018]</territory>
+ <territory type="019">Amerika</territory>
+ <territory type="021" draft="provisional">Å iaurÄ—s Amerika</territory>
+ <territory type="029">Karibai</territory>
+ <territory type="030">Rytų Azija</territory>
+ <territory type="034">Pietų Azija</territory>
+ <territory type="035">PietryÄių Azija</territory>
+ <territory type="039">Pietų Europa</territory>
+ <territory type="053">Australija ir Naujoji Zelandija</territory>
+ <territory type="054">Melanezija</territory>
+ <territory type="057">Mikronezija [057]</territory>
+ <territory type="061">Polinezija</territory>
+ <territory type="142">Azija</territory>
+ <territory type="143">CentrinÄ— Azija</territory>
+ <territory type="145">Vakarų Azija</territory>
+ <territory type="150">Europa</territory>
+ <territory type="151">Rytų Europa</territory>
+ <territory type="154">Å iaurÄ—s Europa</territory>
+ <territory type="155">Vakarų Europa</territory>
+ <territory type="200">ÄŒekoslovakija</territory>
+ <territory type="419">Lotynų Amerika ir Karibai</territory>
+ <territory type="AD">Andora</territory>
+ <territory type="AE">Jungtiniai Arabų Emyratai</territory>
+ <territory type="AF">Afganistanas</territory>
+ <territory type="AG">Antigva ir Barbuda</territory>
+ <territory type="AI">Angilija</territory>
+ <territory type="AL">Albanija</territory>
+ <territory type="AM">ArmÄ—nija</territory>
+ <territory type="AN">Olandijos Antilai</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktis</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">Amerikos Samoa</territory>
+ <territory type="AT">Austrija</territory>
+ <territory type="AU">Australija</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AZ">Azerbaidžanas</territory>
+ <territory type="BA">Bosnija ir Hercegovina</territory>
+ <territory type="BB">Barbadosas</territory>
+ <territory type="BD">Bangladešas</territory>
+ <territory type="BE">Belgija</territory>
+ <territory type="BF">Burkina Fasas</territory>
+ <territory type="BG">Bulgarija</territory>
+ <territory type="BH">Bahreinas</territory>
+ <territory type="BI">Burundis</territory>
+ <territory type="BJ">Beninas</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">BrunÄ—jus</territory>
+ <territory type="BO">Bolivija</territory>
+ <territory type="BR">Brazilija</territory>
+ <territory type="BS">Bahamos</territory>
+ <territory type="BT">Butanas</territory>
+ <territory type="BV">Bouvet sala</territory>
+ <territory type="BW">Botsvana</territory>
+ <territory type="BY">Baltarusija</territory>
+ <territory type="BZ">Belizas</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Kokosų salos</territory>
+ <territory type="CC" alt="proposed" draft="provisional">Kokosų (Keelingo) salos</territory>
+ <territory type="CD">Kongo DemokratinÄ— Respublika</territory>
+ <territory type="CF">CentrinÄ—s Afrikos Respublika</territory>
+ <territory type="CG">Kongas</territory>
+ <territory type="CH">Å veicarija</territory>
+ <territory type="CI">Dramblio Kaulo Krantas</territory>
+ <territory type="CK">Kuko salos</territory>
+ <territory type="CL">ÄŒilÄ—</territory>
+ <territory type="CM">Kamerūnas</territory>
+ <territory type="CN">Kinija</territory>
+ <territory type="CO">Kolumbija</territory>
+ <territory type="CR">Kosta Rika</territory>
+ <territory type="CS">Serbija ir Juodkalnija</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Žaliasis Kyšulys</territory>
+ <territory type="CX">Kalėdų sala</territory>
+ <territory type="CY">Kipras</territory>
+ <territory type="CZ">ÄŒekija</territory>
+ <territory type="DE">Vokietija</territory>
+ <territory type="DJ">Džibutis</territory>
+ <territory type="DK">Danija</territory>
+ <territory type="DM">Dominika</territory>
+ <territory type="DO">Dominikos Respublika</territory>
+ <territory type="DZ">Alžyras</territory>
+ <territory type="EC">Ekvadoras</territory>
+ <territory type="EE">Estija</territory>
+ <territory type="EG">Egiptas</territory>
+ <territory type="EH">Vakarų Sachara</territory>
+ <territory type="ER">EritrÄ—ja</territory>
+ <territory type="ES">Ispanija</territory>
+ <territory type="ET">Etiopija</territory>
+ <territory type="FI">Suomija</territory>
+ <territory type="FJ">Fidžis</territory>
+ <territory type="FK">Falklando salos</territory>
+ <territory type="FM">Mikronezija</territory>
+ <territory type="FO">Farerų salos</territory>
+ <territory type="FR">Prancūzija</territory>
+ <territory type="GA">Gabonas</territory>
+ <territory type="GB">Didžioji Britanija</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Gruzija</territory>
+ <territory type="GF">Prancūzijos Gviana</territory>
+ <territory type="GH">Gana</territory>
+ <territory type="GI">Gibraltaras</territory>
+ <territory type="GL">Grenlandija</territory>
+ <territory type="GM">Gambija</territory>
+ <territory type="GN">GvinÄ—ja</territory>
+ <territory type="GP">GvadelupÄ—</territory>
+ <territory type="GQ">Pusiaujo GvinÄ—ja</territory>
+ <territory type="GR">Graikija</territory>
+ <territory type="GS">Rytų Džordžija ir Rytų Sandwich salos</territory>
+ <territory type="GS" alt="proposed" draft="provisional">Pietų Georgijos ir Pietų Sandwicho Salos</territory>
+ <territory type="GT">Gvatemala</territory>
+ <territory type="GU">Guamas</territory>
+ <territory type="GW">Bisau GvinÄ—ja</territory>
+ <territory type="GY">Gajana</territory>
+ <territory type="HK">Kinijos S.A.R.Honkongas</territory>
+ <territory type="HK" alt="proposed" draft="provisional">Honkongas</territory>
+ <territory type="HM">Heardo ir McDonaldo Salų Sritis</territory>
+ <territory type="HN">Hondūras</territory>
+ <territory type="HR">Kroatija</territory>
+ <territory type="HT">Haitis</territory>
+ <territory type="HU">Vengrija</territory>
+ <territory type="ID">Indonezija</territory>
+ <territory type="IE">Airija</territory>
+ <territory type="IL">Izraelis</territory>
+ <territory type="IN">Indija</territory>
+ <territory type="IO">Indijos vandenyno britų sritis</territory>
+ <territory type="IQ">Irakas</territory>
+ <territory type="IR">Iranas</territory>
+ <territory type="IS">Islandija</territory>
+ <territory type="IT">Italija</territory>
+ <territory type="JM">Jamaika</territory>
+ <territory type="JO">Jordanija</territory>
+ <territory type="JP">Japonija</territory>
+ <territory type="KE">Kenija</territory>
+ <territory type="KG">Kirgiztanas</territory>
+ <territory type="KH">Kambodža</territory>
+ <territory type="KI">Kiribatis</territory>
+ <territory type="KM">Komorai</territory>
+ <territory type="KN">Sent Kitsas ir Nevis</territory>
+ <territory type="KP">Å iaurÄ—s KorÄ—ja</territory>
+ <territory type="KR">Pietų Korėja</territory>
+ <territory type="KW">Kuveitas</territory>
+ <territory type="KY">Kaimanų salos</territory>
+ <territory type="KZ">Kazachstanas</territory>
+ <territory type="LA">Laosas</territory>
+ <territory type="LB">Libanas</territory>
+ <territory type="LC">Å ventoji Liucija</territory>
+ <territory type="LC" alt="proposed" draft="provisional">Sent Lusija</territory>
+ <territory type="LI">Lichtenšteinas</territory>
+ <territory type="LK">Å ri Lanka</territory>
+ <territory type="LR">Liberija</territory>
+ <territory type="LS">Lesotas</territory>
+ <territory type="LT">Lietuva</territory>
+ <territory type="LU">Liuksemburgas</territory>
+ <territory type="LV">Latvija</territory>
+ <territory type="LY">Libija</territory>
+ <territory type="MA">Marokas</territory>
+ <territory type="MC">Monakas</territory>
+ <territory type="MD">Moldova</territory>
+ <territory type="MG">Madagaskaras</territory>
+ <territory type="MH">Maršalo Salos</territory>
+ <territory type="MK">Makedonija</territory>
+ <territory type="ML">Malis</territory>
+ <territory type="MM">Mianmaras</territory>
+ <territory type="MN">Mongolija</territory>
+ <territory type="MO">Macao</territory>
+ <territory type="MP">Marianos Å¡iaurinÄ—s salos</territory>
+ <territory type="MQ">Martinika</territory>
+ <territory type="MR">Mauritanija</territory>
+ <territory type="MS">Montserratas</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauricijus</territory>
+ <territory type="MV">Maldivai</territory>
+ <territory type="MW">Malavis</territory>
+ <territory type="MX">Meksika</territory>
+ <territory type="MY">Malaizija</territory>
+ <territory type="MZ">Mozambikas</territory>
+ <territory type="NA">Namibija</territory>
+ <territory type="NC">Naujoji Kaledonija</territory>
+ <territory type="NE">Nigeris</territory>
+ <territory type="NF">Norfolko sala</territory>
+ <territory type="NG">Nigerija</territory>
+ <territory type="NI">Nikaragva</territory>
+ <territory type="NL">Nyderlandai</territory>
+ <territory type="NO">Norvegija</territory>
+ <territory type="NP">Nepalas</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Naujoji Zelandija</territory>
+ <territory type="OM">Omanas</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Prancūzų Polinezija</territory>
+ <territory type="PG">Papua Naujoji GvinÄ—ja</territory>
+ <territory type="PH">Filipinai</territory>
+ <territory type="PK">Pakistanas</territory>
+ <territory type="PL">Lenkija</territory>
+ <territory type="PM">Sen Pjeras ir Mikelonas</territory>
+ <territory type="PN">Pitkernas</territory>
+ <territory type="PR">Puerto Rikas</territory>
+ <territory type="PS">Palestinos teritorija</territory>
+ <territory type="PT">Portugalija</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paragvajus</territory>
+ <territory type="QA">Kataras</territory>
+ <territory type="RE" draft="provisional">Reunionas</territory>
+ <territory type="RO">Rumunija</territory>
+ <territory type="RU">Rusijos Federacija</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SA">Saudo Arabija</territory>
+ <territory type="SB">Saliamono salos</territory>
+ <territory type="SC">Seišeliai</territory>
+ <territory type="SD">Sudanas</territory>
+ <territory type="SE">Å vedija</territory>
+ <territory type="SG">Singapūras</territory>
+ <territory type="SH">Å ventoji Elena</territory>
+ <territory type="SH" alt="proposed" draft="provisional">Å v. Elenos sala</territory>
+ <territory type="SI">SlovÄ—nija</territory>
+ <territory type="SJ">Svalbardo ir Jan Majen salos</territory>
+ <territory type="SK">Slovakia</territory>
+ <territory type="SL">Siera LeonÄ—</territory>
+ <territory type="SM">San Marinas</territory>
+ <territory type="SN">Senegalas</territory>
+ <territory type="SO">Somalis</territory>
+ <territory type="SR">Surinamas</territory>
+ <territory type="ST">San TomÄ— ir PrincipÄ—</territory>
+ <territory type="SV">Salvadoras</territory>
+ <territory type="SY">Sirija</territory>
+ <territory type="SZ">Svazilendas</territory>
+ <territory type="TC">Turkso ir Caicoso salos</territory>
+ <territory type="TD">ÄŒadas</territory>
+ <territory type="TF">Prancūzijos Pietų sritys</territory>
+ <territory type="TG">Togas</territory>
+ <territory type="TH">Tailandas</territory>
+ <territory type="TJ">Tadžikistanas</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Rytų Timoras</territory>
+ <territory type="TM">TurkmÄ—nistanas</territory>
+ <territory type="TN">Tunisas</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turkija</territory>
+ <territory type="TT">Trinidadas ir Tobagas</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taivanas</territory>
+ <territory type="TZ">Tanzanija</territory>
+ <territory type="UA">Ukraina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">Jungtinių Valstijų mažosios aplinkinės salos</territory>
+ <territory type="US">JungtinÄ—s Valstijos</territory>
+ <territory type="UY">Urugvajus</territory>
+ <territory type="UZ">Uzbekistanas</territory>
+ <territory type="VA">Vatikanas</territory>
+ <territory type="VC">Å ventasis Vincentas ir Grenadinai</territory>
+ <territory type="VC" alt="proposed" draft="provisional">Sent Vinsentas ir Grenadinai</territory>
+ <territory type="VE">Venesuela</territory>
+ <territory type="VG">Didžiosios Britanijos Mergelių salos</territory>
+ <territory type="VI">Mergelių salos (JAV)</territory>
+ <territory type="VN">Vietnamas</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallisas ir Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Jemenas</territory>
+ <territory type="YT">Mayotte’as</territory>
+ <territory type="ZA">Pietų Afrika</territory>
+ <territory type="ZM">Zambija</territory>
+ <territory type="ZW">ZimbabvÄ—</territory>
+ </territories>
+ <keys>
+ <key type="calendar">kalendorius</key>
+ <key type="collation" draft="provisional">gretinimas</key>
+ <key type="currency">valiuta</key>
+ </keys>
+ <types>
+ <type type="gregorian" key="calendar" draft="provisional">Grigaliaus</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a Ä… b c Ä d e Ä™ Ä— f-i į y j-p r s Å¡ t u ų Å« v z ž]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[q w x]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>„</quotationStart>
+ <quotationEnd>“</quotationEnd>
+ </delimiters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Sau</month>
+ <month type="2">Vas</month>
+ <month type="3">Kov</month>
+ <month type="4">Bal</month>
+ <month type="5">Geg</month>
+ <month type="6">Bir</month>
+ <month type="7">Lie</month>
+ <month type="8">Rgp</month>
+ <month type="9">Rgs</month>
+ <month type="10">Spl</month>
+ <month type="11">Lap</month>
+ <month type="12">Grd</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">sausio</month>
+ <month type="2">vasario</month>
+ <month type="3">kovo</month>
+ <month type="4">balandžio</month>
+ <month type="5">gegužės</month>
+ <month type="6">birželio</month>
+ <month type="7">liepos</month>
+ <month type="8">rugpjÅ«Äio</month>
+ <month type="9">rugsÄ—jo</month>
+ <month type="10">spalio</month>
+ <month type="11">lapkriÄio</month>
+ <month type="12">gruodžio</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">S</month>
+ <month type="2">V</month>
+ <month type="3">K</month>
+ <month type="4">B</month>
+ <month type="5">G</month>
+ <month type="6">B</month>
+ <month type="7">L</month>
+ <month type="8">R</month>
+ <month type="9">R</month>
+ <month type="10">S</month>
+ <month type="11">L</month>
+ <month type="12">G</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Sausis</month>
+ <month type="2">Vasaris</month>
+ <month type="3">Kovas</month>
+ <month type="4">Balandis</month>
+ <month type="5">Gegužė</month>
+ <month type="6">Birželis</month>
+ <month type="7">Liepa</month>
+ <month type="8">Rugpjūtis</month>
+ <month type="9">RugsÄ—jis</month>
+ <month type="10">Spalis</month>
+ <month type="11">Lapkritis</month>
+ <month type="12">Gruodis</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Sk</day>
+ <day type="mon">Pr</day>
+ <day type="tue">An</day>
+ <day type="wed">Tr</day>
+ <day type="thu">Kt</day>
+ <day type="fri">Pn</day>
+ <day type="sat">Å t</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">sekmadienis</day>
+ <day type="mon">pirmadienis</day>
+ <day type="tue">antradienis</day>
+ <day type="wed">treÄiadienis</day>
+ <day type="thu">ketvirtadienis</day>
+ <day type="fri">penktadienis</day>
+ <day type="sat">šeštadienis</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">S</day>
+ <day type="mon">P</day>
+ <day type="tue">A</day>
+ <day type="wed">T</day>
+ <day type="thu">K</day>
+ <day type="fri">P</day>
+ <day type="sat">Å </day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">K1</quarter>
+ <quarter type="2">K2</quarter>
+ <quarter type="3">K3</quarter>
+ <quarter type="4">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">pirmas ketvirtis</quarter>
+ <quarter type="2">antras ketvirtis</quarter>
+ <quarter type="3">treÄias ketvirtis</quarter>
+ <quarter type="4">ketvirtas ketvirtis</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>priešpiet</am>
+ <pm>popiet</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">pr. Kr.</era>
+ <era type="1">po Kr.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>yyyy 'm.' MMMM d 'd.',EEEE</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>yyyy 'm.' MMMM d 'd.'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy.MM.dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yyyy-MM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="MMMdd" draft="provisional">MMM-dd</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">MM.dd</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">yyyy.MM</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName>era</displayName>
+ </field>
+ <field type="year">
+ <displayName>metai</displayName>
+ </field>
+ <field type="month">
+ <displayName>mÄ—nuo</displayName>
+ </field>
+ <field type="week">
+ <displayName>savaitÄ—</displayName>
+ </field>
+ <field type="day">
+ <displayName>diena</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>savaitÄ—s diena</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName>dienos metas</displayName>
+ </field>
+ <field type="hour">
+ <displayName>valanda</displayName>
+ </field>
+ <field type="minute">
+ <displayName>minutÄ—</displayName>
+ </field>
+ <field type="second">
+ <displayName>SekundÄ—</displayName>
+ </field>
+ <field type="zone">
+ <displayName>juosta</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>San Paulas</exemplarCity>
+ </zone>
+ <zone type="America/Moncton">
+ <exemplarCity>Monktonas</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <exemplarCity>Los Andželas</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <exemplarCity>Fyniksas</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <exemplarCity>Denveris</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <exemplarCity>ÄŒikaga</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Petersburg">
+ <exemplarCity>Peterburgas</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <exemplarCity>Niujorkas</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="BRL">
+ <displayName>Brazilijos realas</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>Ženminbi juanis</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euras</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Svaras sterlingų</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Indijos rupija</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>Jena</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>Litas</displayName>
+ <symbol>Lt</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>Rusijos rublis</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>JAV doleris</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>taip:t</yesstr>
+ <nostr>ne:n</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1" uri="http://eur-lex.europa.eu/LexUriServ/site/lt/oj/2005/l_158/l_15820050621lt00060009.pdf">European Commision Reglament EB Nr. 936/2005</reference>
+ <reference type="RP2" uri="http://europa.eu.int/constitution/lt/ptoc133_lt.htm">Constitution of Europe</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/lt_LT.xml b/libs/Zend/Locale/Data/lt_LT.xml
new file mode 100755
index 0000000000..4eafcb63e7
--- /dev/null
+++ b/libs/Zend/Locale/Data/lt_LT.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.40 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="lt"/>
+ <territory type="LT"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ab">Abchazų</language>
+ <language type="ady">Adygėjų</language>
+ <language type="ale">Aleutų</language>
+ <language type="ang">Senoji anglų (450-1100)</language>
+ <language type="art">DirbtinÄ— (kita)</language>
+ <language type="aus">Australų kalbos</language>
+ <language type="az">AzerbaidžanieÄių</language>
+ <language type="ba">Baškirų</language>
+ <language type="bat">Baltų (kita)</language>
+ <language type="be">Baltarusių</language>
+ <language type="ber">Berberų</language>
+ <language type="bnt">Bantų</language>
+ <language type="bo">TibetieÄių</language>
+ <language type="br">Bretonų</language>
+ <language type="bs">Bosnių</language>
+ <language type="bua">Buriatų</language>
+ <language type="ca">Katalonų</language>
+ <language type="cai">Centrinės Amerikos indėnų (kita)</language>
+ <language type="cau">KaukazieÄių (kita)</language>
+ <language type="ce">ÄŒeÄÄ—nų</language>
+ <language type="cel">Keltų (kita)</language>
+ <language type="co">KorsikieÄių</language>
+ <language type="crh">Krymo turkų; Krymo totorių</language>
+ <language type="cu">Bažnytinė slavų</language>
+ <language type="cv">Čiuvašų</language>
+ <language type="cy">Valų</language>
+ <language type="eu">Baskų</language>
+ <language type="fa">Persų</language>
+ <language type="fiu">Finougrų (kita)</language>
+ <language type="fro">Senoji prancūzų</language>
+ <language type="fy">Fryzų</language>
+ <language type="ga">Airių</language>
+ <language type="gem">Germanų (kita)</language>
+ <language type="got">Gotų</language>
+ <language type="grc">Senovės graikų</language>
+ <language type="hy">Armėnų</language>
+ <language type="id">IndonezieÄių</language>
+ <language type="ine">IndoeuropieÄių (kita)</language>
+ <language type="inh">Ingušų</language>
+ <language type="ira">IranieÄių</language>
+ <language type="is">Islandų</language>
+ <language type="ka">Gruzinų</language>
+ <language type="kaa">Karakalpakų</language>
+ <language type="kbd">Kabardinų</language>
+ <language type="kk">Kazachų</language>
+ <language type="km">Khmerų</language>
+ <language type="ku">Kurdų</language>
+ <language type="ky">Kirgizų</language>
+ <language type="la">Lotynų</language>
+ <language type="lb">LiuksemburgieÄių</language>
+ <language type="lez">Lezginų</language>
+ <language type="mis">Įvairios kalbos</language>
+ <language type="mk">Makedonų</language>
+ <language type="mn">Mongolų</language>
+ <language type="mo">Moldavų</language>
+ <language type="ms">Malajų</language>
+ <language type="mul">Kelios kalbos</language>
+ <language type="nai">Šiaurės Amerikos indėnų (kita)</language>
+ <language type="nap">NeapolieÄių</language>
+ <language type="os">Osetinų</language>
+ <language type="paa">Papuasų (kita)</language>
+ <language type="peo">Senoji persų</language>
+ <language type="sa">Sanskritas</language>
+ <language type="sah">Jakutų</language>
+ <language type="sc">SardinieÄių</language>
+ <language type="scn">SicilieÄių</language>
+ <language type="sco">Škotų</language>
+ <language type="sga">Senoji airių</language>
+ <language type="sla">Slavų (kita)</language>
+ <language type="sq">Albanų</language>
+ <language type="sr">Serbų</language>
+ <language type="sux">Šumerų</language>
+ <language type="ta">Tamilų</language>
+ <language type="tk">Turkmėnų</language>
+ <language type="tt">Totorių</language>
+ <language type="tyv">Tuvių</language>
+ <language type="udm">Udmurtų</language>
+ <language type="uk">UkrainieÄių</language>
+ <language type="und">Nenustatyta</language>
+ <language type="uz">Uzbekų</language>
+ <language type="vi">VietnamieÄių</language>
+ <language type="vo">Volapiuk</language>
+ <language type="wa">Valonų</language>
+ <language type="xal">Kalmukų</language>
+ <language type="yi">Jidiš</language>
+ </languages>
+ <scripts>
+ <script type="Arab">Arabų</script>
+ <script type="Armn">Armėnų</script>
+ <script type="Beng">Bengalų</script>
+ <script type="Cyrl">Kirilica</script>
+ <script type="Cyrs">Kirilica (senasis bažnytinis variantas)</script>
+ <script type="Egyp">Egipto hieroglifai</script>
+ <script type="Ethi">Etiopų</script>
+ <script type="Geor">Gruzinų</script>
+ <script type="Goth">Gotų</script>
+ <script type="Grek">Graikų</script>
+ <script type="Hebr">Hebrajų</script>
+ <script type="Hung">Senasis vengrų</script>
+ <script type="Ital">Senasis italų</script>
+ <script type="Kana">Katakana</script>
+ <script type="Khmr">Khmerų</script>
+ <script type="Latn">Lotynų</script>
+ <script type="Mong">Mongolų</script>
+ <script type="Runr">Runų</script>
+ </scripts>
+ <territories>
+ <territory type="172">Nepriklausomų Valstybių Sandrauga</territory>
+ </territories>
+ </localeDisplayNames>
+ <delimiters>
+ <alternateQuotationStart>„</alternateQuotationStart>
+ <alternateQuotationEnd>“</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/lv.xml b/libs/Zend/Locale/Data/lv.xml
new file mode 100755
index 0000000000..a8e60067a2
--- /dev/null
+++ b/libs/Zend/Locale/Data/lv.xml
@@ -0,0 +1,422 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.57 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="lv"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar">arÄbu</language>
+ <language type="bg">bulgÄru</language>
+ <language type="cs">Äehu</language>
+ <language type="da">dÄņu</language>
+ <language type="de">vÄcu</language>
+ <language type="el">grieÄ·u</language>
+ <language type="en">angļu</language>
+ <language type="es">spÄņu</language>
+ <language type="et">igauņu</language>
+ <language type="fi">somu</language>
+ <language type="fr">franÄu</language>
+ <language type="he">ivrits</language>
+ <language type="hr">horvÄtu</language>
+ <language type="hu">ungÄru</language>
+ <language type="it">itÄlieÅ¡u</language>
+ <language type="ja">japÄņu</language>
+ <language type="ko">korejiešu</language>
+ <language type="lt">lietuviešu</language>
+ <language type="lv">latviešu</language>
+ <language type="mt" draft="unconfirmed">maltiešu</language>
+ <language type="nl">holandiešu</language>
+ <language type="no">norvēģu</language>
+ <language type="pl">poļu</language>
+ <language type="pt">portugÄļu</language>
+ <language type="ro">rumÄņu</language>
+ <language type="ru">krievu</language>
+ <language type="sk">slovÄku</language>
+ <language type="sl">slovēņu</language>
+ <language type="sv">zviedru</language>
+ <language type="tr">turku</language>
+ <language type="zh">ķīniešu</language>
+ </languages>
+ <territories>
+ <territory type="AD">Andora</territory>
+ <territory type="AE">Apvienotie ArÄbu EmirÄti</territory>
+ <territory type="AF">AfganistÄna</territory>
+ <territory type="AG">Antigva un Barbuda</territory>
+ <territory type="AI">Angilja</territory>
+ <territory type="AL">AlbÄnija</territory>
+ <territory type="AM">Armēnija</territory>
+ <territory type="AN">Antiļas</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktika</territory>
+ <territory type="AR">Argentīna</territory>
+ <territory type="AS">AmerikÄņu Samoa</territory>
+ <territory type="AT">Austrija</territory>
+ <territory type="AU">AustrÄlija</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AZ">AzerbaidžÄna</territory>
+ <territory type="BA">Bosnija un Hercegovina</territory>
+ <territory type="BB">Barbadosa</territory>
+ <territory type="BD">Bangladeša</territory>
+ <territory type="BE">Beļģija</territory>
+ <territory type="BF">Burkinafaso</territory>
+ <territory type="BG">BulgÄrija</territory>
+ <territory type="BH">Bahreina</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benina</territory>
+ <territory type="BM">Bermudu salas</territory>
+ <territory type="BN">Bruneja</territory>
+ <territory type="BO">Bolīvija</territory>
+ <territory type="BR">Brazīlija</territory>
+ <territory type="BS">Bahamas</territory>
+ <territory type="BT">ButÄna</territory>
+ <territory type="BV">Buvē sala</territory>
+ <territory type="BW">BotsvÄna</territory>
+ <territory type="BY">Baltkrievija</territory>
+ <territory type="BZ">Beliza</territory>
+ <territory type="CA">KanÄda</territory>
+ <territory type="CC">Kokosu (KÄ«linga) salas</territory>
+ <territory type="CD">Kongo DemokrÄtiskÄ Republika</territory>
+ <territory type="CF">CentrÄlÄfrikas Republika</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Å veice</territory>
+ <territory type="CI">KotdivuÄra</territory>
+ <territory type="CK">Kuka salas</territory>
+ <territory type="CL">Čīle</territory>
+ <territory type="CM">Kamerūna</territory>
+ <territory type="CN">Ķīna</territory>
+ <territory type="CO">Kolumbija</territory>
+ <territory type="CR">Kostarika</territory>
+ <territory type="CS">Serbija un Melnkalne</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Kaboverde</territory>
+ <territory type="CX">Ziemsvētku sala</territory>
+ <territory type="CY">Kipra</territory>
+ <territory type="CZ">ÄŒehija</territory>
+ <territory type="DE">VÄcija</territory>
+ <territory type="DJ">Džibutija</territory>
+ <territory type="DK">DÄnija</territory>
+ <territory type="DM">Dominika</territory>
+ <territory type="DO">DominikÄnas Republika</territory>
+ <territory type="DZ">Alžīrija</territory>
+ <territory type="EC">Ekvadora</territory>
+ <territory type="EE">Igaunija</territory>
+ <territory type="EG">Ä’Ä£ipte</territory>
+ <territory type="EH">RietumsahÄra</territory>
+ <territory type="ER">Eritreja</territory>
+ <territory type="ES">SpÄnija</territory>
+ <territory type="ET">Etiopija</territory>
+ <territory type="FI">Somija</territory>
+ <territory type="FJ">Fidži</territory>
+ <territory type="FK">Folklenda salas</territory>
+ <territory type="FM">MikronÄ“zijas FederatÄ«vÄs Valstis</territory>
+ <territory type="FO">Farēru salas</territory>
+ <territory type="FR">Francija</territory>
+ <territory type="GA">Gabona</territory>
+ <territory type="GB">LielbritÄnija</territory>
+ <territory type="GD">GrenÄda</territory>
+ <territory type="GE">Gruzija</territory>
+ <territory type="GF">FranÄu GviÄna</territory>
+ <territory type="GH">Gana</territory>
+ <territory type="GI">GibraltÄrs</territory>
+ <territory type="GL">Grenlande</territory>
+ <territory type="GM">Gambija</territory>
+ <territory type="GN">Gvineja</territory>
+ <territory type="GP">Gvadelupa</territory>
+ <territory type="GQ">EkvatoriÄlÄ Gvineja</territory>
+ <territory type="GR">GrieÄ·ija</territory>
+ <territory type="GS">Dienviddžordžija un DienvidsendviÄu salas</territory>
+ <territory type="GT">Gvatemala</territory>
+ <territory type="GU">Guama</territory>
+ <territory type="GW">Gvineja-Bisava</territory>
+ <territory type="GY">GajÄna</territory>
+ <territory type="HK">Honkonga, Ķīnas Ä«paÅ¡Äs pÄrvaldes apgabals</territory>
+ <territory type="HM">HÄ“rda un Makdonalda salas</territory>
+ <territory type="HN">Hondurasa</territory>
+ <territory type="HR">HorvÄtija</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">UngÄrija</territory>
+ <territory type="ID">Indonēzija</territory>
+ <territory type="IE">Īrija</territory>
+ <territory type="IL">Izraēla</territory>
+ <territory type="IN">Indija</territory>
+ <territory type="IO">Britu Indijas okeÄna teritorija</territory>
+ <territory type="IQ">IrÄka</territory>
+ <territory type="IR">IrÄna</territory>
+ <territory type="IS">Islande</territory>
+ <territory type="IT">ItÄlija</territory>
+ <territory type="JM">Jamaika</territory>
+ <territory type="JO">JordÄnija</territory>
+ <territory type="JP">JapÄna</territory>
+ <territory type="KE">Kenija</territory>
+ <territory type="KG">Kirgīzija</territory>
+ <territory type="KH">Kambodža</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komoru salas</territory>
+ <territory type="KN">Sentkitsa un Nevisa</territory>
+ <territory type="KP">Ziemeļkoreja</territory>
+ <territory type="KR">Dienvidkoreja</territory>
+ <territory type="KW">Kuveita</territory>
+ <territory type="KY">Kaimanu salas</territory>
+ <territory type="KZ">KazahstÄna</territory>
+ <territory type="LA">Laosa</territory>
+ <territory type="LB">LibÄna</territory>
+ <territory type="LC">Sentlūsija</territory>
+ <territory type="LI">Lihtenšteina</territory>
+ <territory type="LK">Å rilanka</territory>
+ <territory type="LR">Libērija</territory>
+ <territory type="LS">Lesoto</territory>
+ <territory type="LT">Lietuva</territory>
+ <territory type="LU">Luksemburga</territory>
+ <territory type="LV">Latvija</territory>
+ <territory type="LY">LÄ«bija</territory>
+ <territory type="MA">Maroka</territory>
+ <territory type="MC">Monako</territory>
+ <territory type="MD">Moldova</territory>
+ <territory type="MG">Madagaskara</territory>
+ <territory type="MH">MÄrÅ¡ala salas</territory>
+ <territory type="MK">MaÄ·edonija</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Mjanma</territory>
+ <territory type="MN">Mongolija</territory>
+ <territory type="MO">Makao, Ķīnas Ä«paÅ¡Äs pÄrvaldes apgabals</territory>
+ <territory type="MP">Ziemeļu Marianas</territory>
+ <territory type="MQ">Martinika</territory>
+ <territory type="MR">MauritÄnija</territory>
+ <territory type="MS">Montserrata</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Maurīcija</territory>
+ <territory type="MV">Maldīvija</territory>
+ <territory type="MW">MalÄvija</territory>
+ <territory type="MX">Meksika</territory>
+ <territory type="MY">Malaizija</territory>
+ <territory type="MZ">Mozambika</territory>
+ <territory type="NA">Namībija</territory>
+ <territory type="NC">Jaunkaledonija</territory>
+ <territory type="NE">Nigēra</territory>
+ <territory type="NF">Norfolka</territory>
+ <territory type="NG">Nigērija</territory>
+ <territory type="NI">Nikaragva</territory>
+ <territory type="NL">NÄ«derlande</territory>
+ <territory type="NO">Norvēģija</territory>
+ <territory type="NP">NepÄla</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Jaunzēlande</territory>
+ <territory type="OM">OmÄna</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">FranÄu PolinÄ“zija</territory>
+ <territory type="PG">Papua-Jaungvineja</territory>
+ <territory type="PH">Filipīnas</territory>
+ <territory type="PK">PakistÄna</territory>
+ <territory type="PL">Polija</territory>
+ <territory type="PM">Senpjēra un Mikelona</territory>
+ <territory type="PN">Pitkērna</territory>
+ <territory type="PR">Puertoriko</territory>
+ <territory type="PS">PalestÄ«nieÅ¡u paÅ¡pÄrvaldes teritorija</territory>
+ <territory type="PT">PortugÄle</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paragvaja</territory>
+ <territory type="QA">Katara</territory>
+ <territory type="RE">Reinjona</territory>
+ <territory type="RO">RumÄnija</territory>
+ <territory type="RU">Krievija</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SA">SaÅ«da ArÄbija</territory>
+ <territory type="SB">ZÄlamana salas</territory>
+ <territory type="SC">Seišeļu salas</territory>
+ <territory type="SD">SudÄna</territory>
+ <territory type="SE">Zviedrija</territory>
+ <territory type="SG">Singapūra</territory>
+ <territory type="SH">Sv. Helēnas sala</territory>
+ <territory type="SI">Slovēnija</territory>
+ <territory type="SJ">SvalbÄra un Jana Majena sala</territory>
+ <territory type="SK">SlovÄkija</territory>
+ <territory type="SL">Sjerraleone</territory>
+ <territory type="SM">Sanmarīno</territory>
+ <territory type="SN">SenegÄla</territory>
+ <territory type="SO">SomÄlija</territory>
+ <territory type="SR">Surinama</territory>
+ <territory type="ST">Santome un Prinsipi</territory>
+ <territory type="SV">Salvadora</territory>
+ <territory type="SY">SÄ«rija</territory>
+ <territory type="SZ">Svazilenda</territory>
+ <territory type="TC">TÄ“rksas un Kaikosas salas</territory>
+ <territory type="TD">ÄŒada</territory>
+ <territory type="TF">FranÄu dienvidu teritorijas</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Taizeme</territory>
+ <territory type="TJ">TadžikistÄna</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Austrumtimora</territory>
+ <territory type="TM">TurkmenistÄna</territory>
+ <territory type="TN">Tunisija</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turcija</territory>
+ <territory type="TT">TrinidÄda un TobÄgo</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">TaivÄna</territory>
+ <territory type="TZ">TanzÄnija</territory>
+ <territory type="UA">Ukraina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">ASV mazÄs aizjÅ«ras teritorijas</territory>
+ <territory type="US">United States</territory>
+ <territory type="UY">Urugvaja</territory>
+ <territory type="UZ">UzbekistÄna</territory>
+ <territory type="VA">VatikÄns</territory>
+ <territory type="VC">Sentvinsenta un Grenadīnas</territory>
+ <territory type="VE">Venecuēla</territory>
+ <territory type="VG">Britu Virdžīnu salas</territory>
+ <territory type="VI">AmerikÄņu Virdžīnu salas</territory>
+ <territory type="VN">Vjetnama</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Volisa un Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Jemena</territory>
+ <territory type="YT">Majota</territory>
+ <territory type="ZA">DienvidÄfrika</territory>
+ <territory type="ZM">Zambija</territory>
+ <territory type="ZW">Zimbabve</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a Ä b c Ä d e Ä“ f g Ä£ h i Ä« j k Ä· l ļ m n ņ o p r s Å¡ t u Å« v z ž]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[y q w x]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Jan</month>
+ <month type="2">Feb</month>
+ <month type="3">Mar</month>
+ <month type="4">Apr</month>
+ <month type="5">Mai</month>
+ <month type="6">JÅ«n</month>
+ <month type="7">JÅ«l</month>
+ <month type="8">Aug</month>
+ <month type="9">Sep</month>
+ <month type="10">Okt</month>
+ <month type="11">Nov</month>
+ <month type="12">Dec</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">janvÄris</month>
+ <month type="2">februÄris</month>
+ <month type="3">marts</month>
+ <month type="4">aprīlis</month>
+ <month type="5">maijs</month>
+ <month type="6">jūnijs</month>
+ <month type="7">jūlijs</month>
+ <month type="8">augusts</month>
+ <month type="9">septembris</month>
+ <month type="10">oktobris</month>
+ <month type="11">novembris</month>
+ <month type="12">decembris</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Sv</day>
+ <day type="mon">P</day>
+ <day type="tue">O</day>
+ <day type="wed">T</day>
+ <day type="thu">C</day>
+ <day type="fri">Pk</day>
+ <day type="sat">S</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">svētdiena</day>
+ <day type="mon">pirmdiena</day>
+ <day type="tue">otrdiena</day>
+ <day type="wed">trešdiena</day>
+ <day type="thu">ceturtdiena</day>
+ <day type="fri">piektdiena</day>
+ <day type="sat">sestdiena</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">C1</quarter>
+ <quarter type="2">C2</quarter>
+ <quarter type="3">C3</quarter>
+ <quarter type="4">C4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">1. ceturksnis</quarter>
+ <quarter type="2" draft="unconfirmed">2. ceturksnis</quarter>
+ <quarter type="3" draft="unconfirmed">3. ceturksnis</quarter>
+ <quarter type="4" draft="unconfirmed">4. ceturksnis</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">pirms mūsu ēras</era>
+ <era type="1" draft="unconfirmed">mÅ«su Ä“rÄ</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">pmē</era>
+ <era type="1">mē</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, yyyy'. gada 'd. MMMM</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>yyyy'. gada 'd. MMMM</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy.d.M</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yy.d.M</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="unconfirmed">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="unconfirmed">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">d.M</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <currencies>
+ <currency type="LVL">
+ <symbol>Ls</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">ÄjÄ:ja:j</yesstr>
+ <nostr draft="unconfirmed">nē:ne:n</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/lv_LV.xml b/libs/Zend/Locale/Data/lv_LV.xml
new file mode 100755
index 0000000000..1762bc88b9
--- /dev/null
+++ b/libs/Zend/Locale/Data/lv_LV.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="lv"/>
+ <territory type="LV"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/mk.xml b/libs/Zend/Locale/Data/mk.xml
new file mode 100755
index 0000000000..60c8af281f
--- /dev/null
+++ b/libs/Zend/Locale/Data/mk.xml
@@ -0,0 +1,1046 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.58 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="mk"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="de">германÑки</language>
+ <language type="en">англиÑки</language>
+ <language type="es">шпанÑки</language>
+ <language type="fr">француÑки</language>
+ <language type="it">италијанÑки</language>
+ <language type="ja">јапонÑки</language>
+ <language type="mk">македонÑки</language>
+ <language type="pt">португалÑки</language>
+ <language type="ru">руÑки</language>
+ <language type="zh">кинеÑки</language>
+ </languages>
+ <territories>
+ <territory type="AD">Ðндора</territory>
+ <territory type="AE">Обединети ÐрапÑки Емирати</territory>
+ <territory type="AF">ÐвганиÑтан</territory>
+ <territory type="AG">Ðнтигуа и Барбуда</territory>
+ <territory type="AI">Ðнгвила</territory>
+ <territory type="AL">Ðлбанија</territory>
+ <territory type="AM">Ерменија</territory>
+ <territory type="AN">ХоландÑки Ðнтили</territory>
+ <territory type="AO">Ðнгола</territory>
+ <territory type="AQ">Ðнтарктик</territory>
+ <territory type="AR">Ðргентина</territory>
+ <territory type="AS">ÐмериканÑка Самоа</territory>
+ <territory type="AT">ÐвÑтрија</territory>
+ <territory type="AU">ÐвÑтралија</territory>
+ <territory type="AW">Ðруба</territory>
+ <territory type="AZ">Ðзејберџан</territory>
+ <territory type="BA">БоÑна и Херцеговина</territory>
+ <territory type="BB">БарбадоÑ</territory>
+ <territory type="BD">Бангладеш</territory>
+ <territory type="BE">Белгија</territory>
+ <territory type="BF">Буркина ФаÑо</territory>
+ <territory type="BG">Бугарија</territory>
+ <territory type="BH">Бахреин</territory>
+ <territory type="BI">Бурунди</territory>
+ <territory type="BJ">Бенин</territory>
+ <territory type="BM">Бермуди</territory>
+ <territory type="BN">Брунеи</territory>
+ <territory type="BO">Боливија</territory>
+ <territory type="BR">Бразил</territory>
+ <territory type="BS">Бахами</territory>
+ <territory type="BT">Бутан</territory>
+ <territory type="BV">Боувитови оÑтрови</territory>
+ <territory type="BW">Боцвана</territory>
+ <territory type="BY">БелоруÑија</territory>
+ <territory type="BZ">Белизе</territory>
+ <territory type="CA">Канада</territory>
+ <territory type="CC">КокоÑови оÑтрови</territory>
+ <territory type="CD">ДемократÑка Република Конго</territory>
+ <territory type="CF">Централан Ðфричка република</territory>
+ <territory type="CG">Конго</territory>
+ <territory type="CH">Швајцарија</territory>
+ <territory type="CI">Брегот на Слоновата КоÑка</territory>
+ <territory type="CK">Кукови ОÑтрови</territory>
+ <territory type="CL">Чиле</territory>
+ <territory type="CM">Камерун</territory>
+ <territory type="CN">Кина</territory>
+ <territory type="CO">Колумбија</territory>
+ <territory type="CR">КоÑтарика</territory>
+ <territory type="CS">Србија и Црна Гора</territory>
+ <territory type="CU">Куба</territory>
+ <territory type="CV">ЗеленортÑки ОÑтрови</territory>
+ <territory type="CX">Божиќни ОÑтрови</territory>
+ <territory type="CY">Кипар</territory>
+ <territory type="CZ">Чешка Република</territory>
+ <territory type="DE">Германија</territory>
+ <territory type="DJ">Ðибути</territory>
+ <territory type="DK">ДанÑка</territory>
+ <territory type="DM">Доминика</territory>
+ <territory type="DO">ДоминиканÑка Република</territory>
+ <territory type="DZ">Ðлжир</territory>
+ <territory type="EC">Еквадор</territory>
+ <territory type="EE">ЕÑтонија</territory>
+ <territory type="EG">Египет</territory>
+ <territory type="EH">Западна Сахара</territory>
+ <territory type="ER">Еритреја</territory>
+ <territory type="ES">Шпанија</territory>
+ <territory type="ET">Етиопија</territory>
+ <territory type="FI">ФинÑка</territory>
+ <territory type="FJ">Фиџи</territory>
+ <territory type="FK">ФокландÑки ОÑтрови</territory>
+ <territory type="FM">Микронезија</territory>
+ <territory type="FO">ФарÑки ОÑтрови</territory>
+ <territory type="FR">Франција</territory>
+ <territory type="GA">Габон</territory>
+ <territory type="GB">Велика Британија</territory>
+ <territory type="GD">Гренада</territory>
+ <territory type="GE">Ðорџија</territory>
+ <territory type="GF">ФранцуÑка Гуана</territory>
+ <territory type="GH">Гана</territory>
+ <territory type="GI">Гилбартар</territory>
+ <territory type="GL">Гренланд</territory>
+ <territory type="GM">Гамбија</territory>
+ <territory type="GN">Гвинеја</territory>
+ <territory type="GP">Гвадалупе</territory>
+ <territory type="GQ">ЕкваторÑка Гвинеја</territory>
+ <territory type="GR">Грција</territory>
+ <territory type="GS">Јужна Ðорџија и Јужни Сендвич ОÑтрови</territory>
+ <territory type="GT">Гватемала</territory>
+ <territory type="GU">Гвам</territory>
+ <territory type="GW">Гвинеа-БиÑа</territory>
+ <territory type="GY">Гвајана</territory>
+ <territory type="HK">Хон Конг С.Ð.Р Кина</territory>
+ <territory type="HM">Хардови оÑтрови и Мекдоналд ОÑтрови</territory>
+ <territory type="HN">ХондураÑ</territory>
+ <territory type="HR">ХрватÑка</territory>
+ <territory type="HT">Хаити</territory>
+ <territory type="HU">Унгарија</territory>
+ <territory type="ID">Индонезија</territory>
+ <territory type="IE">ИрÑка</territory>
+ <territory type="IL">Израел</territory>
+ <territory type="IN">Индија</territory>
+ <territory type="IO">БританÑко ИндиÑко ОкеанÑка територија</territory>
+ <territory type="IQ">Ирак</territory>
+ <territory type="IR">Иран</territory>
+ <territory type="IS">ИÑланд</territory>
+ <territory type="IT">Италија</territory>
+ <territory type="JM">Јамајка</territory>
+ <territory type="JO">Јордан</territory>
+ <territory type="JP">Јапонија</territory>
+ <territory type="KE">Кенија</territory>
+ <territory type="KG">КургиÑтан</territory>
+ <territory type="KH">Камбоџа</territory>
+ <territory type="KI">Кирибати</territory>
+ <territory type="KM">КомороÑ</territory>
+ <territory type="KN">Сент КриÑтофер и ÐевиÑ</territory>
+ <territory type="KP">Северна Кореа</territory>
+ <territory type="KR">Јужна Кореа</territory>
+ <territory type="KW">Кувајт</territory>
+ <territory type="KY">Кајманови ОÑтрови</territory>
+ <territory type="KZ">КазаџÑтан</territory>
+ <territory type="LA">ЛаоÑ</territory>
+ <territory type="LB">Либанон</territory>
+ <territory type="LC">Света Лучија</territory>
+ <territory type="LI">Лихтенштајн</territory>
+ <territory type="LK">Шри Ланка</territory>
+ <territory type="LR">Либериа</territory>
+ <territory type="LS">Лешото</territory>
+ <territory type="LT">Литванија</territory>
+ <territory type="LU">ЛукÑембург</territory>
+ <territory type="LV">Латвија</territory>
+ <territory type="LY">Либија</territory>
+ <territory type="MA">Мароко</territory>
+ <territory type="MC">Монако</territory>
+ <territory type="MD">Молдова</territory>
+ <territory type="MG">МадагаÑкар</territory>
+ <territory type="MH">Маршалови ОСтрови</territory>
+ <territory type="MK">Македонија</territory>
+ <territory type="ML">Мали</territory>
+ <territory type="MM">Муанмар</territory>
+ <territory type="MN">Монголија</territory>
+ <territory type="MO">Макао С.Ð.Р Кина</territory>
+ <territory type="MP">Северни Маријанини ОÑтрови</territory>
+ <territory type="MQ">Мартиник</territory>
+ <territory type="MR">Мавританија</territory>
+ <territory type="MS">МонÑерат</territory>
+ <territory type="MT">Малта</territory>
+ <territory type="MU">МауритуÑ</territory>
+ <territory type="MV">Малдиви</territory>
+ <territory type="MW">Малави</territory>
+ <territory type="MX">МекÑико</territory>
+ <territory type="MY">Малезија</territory>
+ <territory type="MZ">Мозамбе</territory>
+ <territory type="NA">Ðамибија</territory>
+ <territory type="NC">Ðова Каледонија</territory>
+ <territory type="NE">Ðигер</territory>
+ <territory type="NF">Ðофролк ОÑтров</territory>
+ <territory type="NG">Ðигерија</territory>
+ <territory type="NI">Ðикараква</territory>
+ <territory type="NL">Холандија</territory>
+ <territory type="NO">Ðорвешка</territory>
+ <territory type="NP">Ðепал</territory>
+ <territory type="NR">Ðауру</territory>
+ <territory type="NU">Ðие</territory>
+ <territory type="NZ">Ðов Зеланд</territory>
+ <territory type="OM">Оман</territory>
+ <territory type="PA">Панама</territory>
+ <territory type="PE">Перу</territory>
+ <territory type="PF">ФранцуÑка Полинезија</territory>
+ <territory type="PG">Папуа Ðова Гвинеја</territory>
+ <territory type="PH">Филипини</territory>
+ <territory type="PK">ПакиÑтан</territory>
+ <territory type="PL">ПолÑка</territory>
+ <territory type="PM">Сент Пјер и Микелан</territory>
+ <territory type="PN">Питкарн</territory>
+ <territory type="PR">Порторико</territory>
+ <territory type="PS">ПалеÑтинÑка Територија</territory>
+ <territory type="PT">Португалија</territory>
+ <territory type="PW">Палау</territory>
+ <territory type="PY">Парагвај</territory>
+ <territory type="QA">Кватар</territory>
+ <territory type="RE">Рејунион</territory>
+ <territory type="RO">Романија</territory>
+ <territory type="RU">РуÑија</territory>
+ <territory type="RW">Руанда</territory>
+ <territory type="SA">СаудиÑка Ðрабија</territory>
+ <territory type="SB">Соломоновите ОÑтрови</territory>
+ <territory type="SC">Сејшели</territory>
+ <territory type="SD">Судан</territory>
+ <territory type="SE">ШведÑка</territory>
+ <territory type="SG">Сингапур</territory>
+ <territory type="SH">Света Елена</territory>
+ <territory type="SI">Словенија</territory>
+ <territory type="SJ">Свалбард и Жан Мијен ОÑтрови</territory>
+ <territory type="SK">Словачка</territory>
+ <territory type="SL">Сиера Леоне</territory>
+ <territory type="SM">Сан Марино</territory>
+ <territory type="SN">Сенегал</territory>
+ <territory type="SO">Сомалија</territory>
+ <territory type="SR">Суринам</territory>
+ <territory type="ST">Сао Томе и Принципе</territory>
+ <territory type="SV">Ел Салвадор</territory>
+ <territory type="SY">Сирија</territory>
+ <territory type="SZ">Свазиленд</territory>
+ <territory type="TC">Турк и ÐšÐ°Ð¸ÐºÐ¾Ñ ÐžÑтрови</territory>
+ <territory type="TD">Чад</territory>
+ <territory type="TF">ФранцуÑки Јужни територии</territory>
+ <territory type="TG">Того</territory>
+ <territory type="TH">Тајланд</territory>
+ <territory type="TJ">ТаџикиÑтан</territory>
+ <territory type="TK">Токелау</territory>
+ <territory type="TL">ИÑточен Тимор</territory>
+ <territory type="TM">ТуркмениÑтан</territory>
+ <territory type="TN">ТуниÑ</territory>
+ <territory type="TO">Тонга</territory>
+ <territory type="TR">Турција</territory>
+ <territory type="TT">Тринидад и Тобаго</territory>
+ <territory type="TV">Тувалу</territory>
+ <territory type="TW">Тајван</territory>
+ <territory type="TZ">Танзанија</territory>
+ <territory type="UA">Украина</territory>
+ <territory type="UG">Уганда</territory>
+ <territory type="US">Обединети Држави</territory>
+ <territory type="UY">Уругвај</territory>
+ <territory type="UZ">УзбекиÑтан</territory>
+ <territory type="VA">Ватикан</territory>
+ <territory type="VC">Сент Винцент и Гренадините</territory>
+ <territory type="VE">Венецуела</territory>
+ <territory type="VG">БританÑки ДевÑтвени ОÑтрови</territory>
+ <territory type="VI">ДевÑтвени ОÑтрови на СÐД</territory>
+ <territory type="VN">Виетнам</territory>
+ <territory type="VU">Ванату</territory>
+ <territory type="WF">Ð’Ð¾Ð»Ð¸Ñ Ð¸ Футуна оÑтрови</territory>
+ <territory type="WS">Самоа</territory>
+ <territory type="YE">Јемен</territory>
+ <territory type="YT">Мајоте</territory>
+ <territory type="ZA">Јужна Ðфрика</territory>
+ <territory type="ZM">Замбија</territory>
+ <territory type="ZW">Зимбабве</territory>
+ </territories>
+ <keys>
+ <key type="calendar">Календар</key>
+ <key type="collation">Сортирање</key>
+ <key type="currency">Валута</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">БудиÑтички календар</type>
+ <type type="chinese" key="calendar">КинеÑки Календар</type>
+ <type type="direct" key="collation">Директно</type>
+ <type type="gregorian" key="calendar">ГрегорианÑки Календар</type>
+ <type type="hebrew" key="calendar">ЕврејÑки Календар</type>
+ <type type="islamic" key="calendar">ИÑламÑки Календар</type>
+ <type type="islamic-civil" key="calendar">ИÑламÑко граѓанÑки Календар</type>
+ <type type="japanese" key="calendar">ЈапонÑки Календар</type>
+ <type type="phonebook" key="collation">Ðзбучен редоÑлед</type>
+ <type type="pinyin" key="collation">Сортирање Pinyin</type>
+ <type type="stroke" key="collation">Ритмички редоÑлед</type>
+ <type type="traditional" key="collation">Традиционално</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[а-г ѓ д-з ѕ и ј к ќ л љ м н њ о-ч џ ш]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[Ñ Ñ]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GuMtkHmsSEDFwWahKzUeygAZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">јан.</month>
+ <month type="2">фев.</month>
+ <month type="3">мар.</month>
+ <month type="4">апр.</month>
+ <month type="5">мај.</month>
+ <month type="6">јун.</month>
+ <month type="7">јул.</month>
+ <month type="8">авг.</month>
+ <month type="9">Ñепт.</month>
+ <month type="10">окт.</month>
+ <month type="11">ноем.</month>
+ <month type="12">декем.</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">јануари</month>
+ <month type="2">февруари</month>
+ <month type="3">март</month>
+ <month type="4">април</month>
+ <month type="5">мај</month>
+ <month type="6">јуни</month>
+ <month type="7">јули</month>
+ <month type="8">авгуÑÑ‚</month>
+ <month type="9">Ñептември</month>
+ <month type="10">октомври</month>
+ <month type="11">ноември</month>
+ <month type="12">декември</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">ј</month>
+ <month type="2">Ñ„</month>
+ <month type="3">м</month>
+ <month type="4">а</month>
+ <month type="5">м</month>
+ <month type="6">ј</month>
+ <month type="7">ј</month>
+ <month type="8">а</month>
+ <month type="9">Ñе</month>
+ <month type="10">о</month>
+ <month type="11">но</month>
+ <month type="12">д</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">нед.</day>
+ <day type="mon">пон.</day>
+ <day type="tue">вт.</day>
+ <day type="wed">Ñре.</day>
+ <day type="thu">чет.</day>
+ <day type="fri">пет.</day>
+ <day type="sat">Ñаб.</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">недела</day>
+ <day type="mon">понеделник</day>
+ <day type="tue">вторник</day>
+ <day type="wed">Ñреда</day>
+ <day type="thu">четврток</day>
+ <day type="fri">петок</day>
+ <day type="sat">Ñабота</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">н</day>
+ <day type="mon">п</day>
+ <day type="tue">в</day>
+ <day type="wed">Ñ</day>
+ <day type="thu">ч</day>
+ <day type="fri">п</day>
+ <day type="sat">Ñ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraAbbr>
+ <era type="0">пр.н.е.</era>
+ <era type="1">ае.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd.M.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd.M.yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="Mdd" draft="provisional">dd.M</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">M.yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="ADP">
+ <displayName>ÐндорÑка Пезета</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>Дирхам</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>Ðвгани (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>Ðвгани</displayName>
+ <symbol>Af</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>ÐлбанÑки Лек</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>ЕрмениÑки Драм</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>ÐнголÑка Кванза</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>ÐнголÑка Кванза (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>ÐнголÑка нова Кванза (1990-2000)</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>ÐргентинÑки ÐŸÐµÐ·Ð¾Ñ (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>ÐргентинÑки ПезоÑ</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>ÐвÑтралиÑки Шилинг</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>ÐвÑтралиÑки Долар</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="BAD">
+ <displayName>БоÑанÑко-ХерцеговÑки Динар</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>БоÑанÑко-ХерцеговÑки Динар конвертабилна марка</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>БарбадоÑки Долар</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>БелгиÑки Франк (конвертибилен)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>БелгиÑки Франк</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>БелгиÑки Франк (финанÑиÑки)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>БугарÑки цврÑÑ‚ лев</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>БугарÑки нов лев</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>БахраинÑки Динар</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>БуриндиÑки Франк</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>БермудÑки Долар</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>БрунејÑки долар</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>БахамÑки Долар</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>БоцвантÑка Пула</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>БелоруÑка нова рубља (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>БелоруÑка Рубља</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>БелизиÑки Долар</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>КанадÑки Долар</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CHF">
+ <displayName>ШвајцарÑки Франк</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>КолумбиÑки ПезоÑ</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="CRC">
+ <displayName>КоÑтариканÑки Колон</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSK">
+ <displayName>ЧехоÑловачка цврÑта корона</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>КубанÑки пезоÑ</displayName>
+ </currency>
+ <currency type="CYP">
+ <displayName>КипарÑка фунта</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>Чешка корона</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>ГерманÑка Марка</displayName>
+ </currency>
+ <currency type="DOP">
+ <displayName>ДоминиканÑки ПезоÑ</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>ÐлгериÑки Динар</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="EGP">
+ <displayName>ЕгипетÑка Фунта</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>ШпанÑка Пезета</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>ЕтиопиÑки Бир</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>Евро</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>ФинÑка марка</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Фиџи долар</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>ФакландÑка фунта</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>ФранцуÑки франк</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>БританÑка Фунта</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>ГрузиÑки лари</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>ГанајÑки Седи</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>ГибралтарÑка фунта</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>ГамбиÑки ДалаÑи</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>ГвинејÑки франк</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GRD">
+ <displayName>Грчка драхма</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>ГватемалÑки кветцал</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWP">
+ <displayName>ГвинејÑки БиÑау пезоÑ</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>ГвијанÑки Долар</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>Хонгкошки долар</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>ХондурÑка лемпира</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>ХрватÑки динар</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>ХрватÑка Куна</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>ХаитÑки гурд</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>УнгарÑка форинта</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>ИрÑка фунта</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>ИзрелÑка фунта</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>ИзраелÑки нов шекел</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>ИндиÑка рупија</displayName>
+ <symbol>INR</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>Ирачки динар</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>ИранÑки риал</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>ИÑландÑка крона</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>ИталијанкÑа лира</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>ЈамајканÑки долар</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>ЈорданÑки динар</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>ЈапонÑки јен</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>КениÑки шилинг</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>КиргиÑтанÑки Ñом</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>КамбоџиÑки рел</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>КоморÑки долар</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>Северно корејÑки вон</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Јужно корејÑки вон</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>КувајтÑки динар</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KZT">
+ <displayName>КазакÑтантÑка тенга</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>ЛаоÑки кип</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>ЛибиÑка фунта</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>ШриланканÑка рупија</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>ЛибериÑки долар</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>ЛеÑотÑко лоти</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LTL">
+ <displayName>ЛитваниÑка лита</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>ЛитваниÑки литаз</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>ЛукÑембуршки франк</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>ЛатвијÑки лат</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>ЛатвијÑка рубља</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>ЛибијÑки динар</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>МароканÑки Дирхам</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>МарконÑки франк</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>МолдавÑки леу</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>МакедонÑки денар</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>МалÑки франк</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>МонголиÑки тугрик</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Макао патака</displayName>
+ </currency>
+ <currency type="MTL">
+ <displayName>МалтиÑка лира</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>МалтиÑка финта</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName>МекÑиканÑки пезоÑ</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>МекÑиканÑки Ñребрен Ð¿ÐµÐ·Ð¾Ñ (1861-1992)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>МалазиÑки рингит</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>МозамбиÑко еÑкудо</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>МозамбиÑки метикал</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>ÐамибиÑки долар</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>ÐигериÑка наира</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>ÐикарагванÑка кордоба</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>ХоландÑки гилдер</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Ðорвешка круна</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>ÐепалÑка рупија</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>ÐовозеланÑки долар</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>ОманÑки Риал</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>ПанамÑка балбоа</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>ПеруанÑки нов Ñол</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>ПеруанÑки Ñол</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Папуа новогвинејÑкиа кина</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>ФилипинÑки пезоÑ</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>ПакиÑтанÑка рупија</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>ПолÑка злота</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>ПолÑка злота (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>ПортугалÑко еÑкудо</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>ПарагвајÑка гуарана</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>КватарÑки риал</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="ROL">
+ <displayName>РоманÑка леа</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>РуÑка рубља</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>РуÑка рубља (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>РуандÑки франк</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>СаудиÑки риал</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>СоломонÑки долар</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>СејшелÑка рупија</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>СуданÑки динар</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>СуданÑка фунта</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>ШведÑка круна</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>СингапурÑки доалр</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SIT">
+ <displayName>СловенÑки толар</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Словачка круна</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>СиералеонÑко леоне</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>СомалијÑки шилинг</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRG">
+ <displayName>СуринамÑки гилдер</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>СоветÑка рубља</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>ЕлÑавадорÑки колон</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>СириÑка фунта</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>СвазилендÑки лилаген</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>Таи бат</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>таџикиÑтанÑка рубља</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>ТаџикиÑтантÑки Ñомони</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>ТурментиÑтантÑки матат</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>ТунезиÑки динар</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>ТиморÑки еÑкудо</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>ТурÑка лира</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>ТајванÑки нов долар</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>ТанзаниÑки шилинг</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>УкраинÑка хривнија</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>УгандиÑки шилинг (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>УгандиÑки шилинг</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>СÐД долар</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>СÐД долар (Next day)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>СÐД долар (Same day)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>УругвајÑко пеÑо (1975-1993)</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName>УЗбекиÑтанÑки Сум</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>ВенецуелÑки боливар</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>ВиетнамÑки донг</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>ВанатÑки вату</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>Самоа тала</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>ИÑточно карибиÑки долар</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="YDD">
+ <displayName>ЈеменÑки дианр</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>ЈеменÑки риал</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>ЈугоÑловенÑки динар</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>ЈугоÑловенÑки конвертибилен динар</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>Јужно афрички ранд(финанÑиÑки)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Јужно афрички ранд</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>ЗамбиÑка кванча</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>ЗаирÑко новозаире</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>ЗирÑко заире</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>ЗимбабвиÑки долар</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>да:д</yesstr>
+ <nostr>не:н</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/mk_MK.xml b/libs/Zend/Locale/Data/mk_MK.xml
new file mode 100755
index 0000000000..a21d625009
--- /dev/null
+++ b/libs/Zend/Locale/Data/mk_MK.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.34 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="mk"/>
+ <territory type="MK"/>
+ </identity>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#,##0.###;(#,##0.###)</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ml.xml b/libs/Zend/Locale/Data/ml.xml
new file mode 100755
index 0000000000..c80360a73b
--- /dev/null
+++ b/libs/Zend/Locale/Data/ml.xml
@@ -0,0 +1,427 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.28 $"/>
+ <generation date="$Date: 2006/08/04 21:50:49 $"/>
+ <language type="ml"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa" draft="provisional">അഫാരàµâ€</language>
+ <language type="ab" draft="provisional">à´…à´¬àµà´–ാസിയനàµâ€</language>
+ <language type="af" draft="provisional">ആഫàµà´°à´¿à´•àµà´•à´¨àµâ€</language>
+ <language type="am" draft="provisional">അംഹാറികàµ</language>
+ <language type="ar" draft="provisional">അറബികàµà´•àµ</language>
+ <language type="as" draft="provisional">ആസàµà´¸à´¾à´®àµ€à´¸àµ</language>
+ <language type="ay" draft="provisional">à´…à´¯àµà´®à´¾à´±</language>
+ <language type="az" draft="provisional">അസരàµâ€à´¬àµˆà´œà´¾à´¨à´¿</language>
+ <language type="ba" draft="provisional">ബഷàµà´–à´¿à´°àµâ€</language>
+ <language type="be" draft="provisional">ബൈലോറഷàµà´¯à´¨àµâ€</language>
+ <language type="bh" draft="provisional">ബീഹാറി</language>
+ <language type="bi" draft="provisional">ബിസàµâ€Œà´²à´¾à´®</language>
+ <language type="bn" draft="provisional">ബംഗാളി</language>
+ <language type="bo" draft="unconfirmed">തിബറàµà´±à´¨àµâ€</language>
+ <language type="br" draft="provisional">à´¬àµà´°à´¿à´Ÿàµà´Ÿà´£àµâ€</language>
+ <language type="ca" draft="provisional">à´•àµà´¯à´¾à´±àµà´±à´²à´¨àµâ€</language>
+ <language type="co" draft="provisional">കോരàµâ€à´¸à´¿à´•àµà´•à´¨àµâ€</language>
+ <language type="cs" draft="provisional">ചെകàµà´•àµ</language>
+ <language type="cy" draft="unconfirmed">വെലàµâ€à´·àµ</language>
+ <language type="da" draft="provisional">ഡാനിഷàµ</language>
+ <language type="de" draft="provisional">ജരàµâ€à´®àµà´®à´¨àµâ€</language>
+ <language type="dz" draft="provisional">ഭൂടàµà´Ÿà´¾à´¨à´¿</language>
+ <language type="el" draft="provisional">à´—àµà´°àµ€à´•àµà´•àµ</language>
+ <language type="en" draft="provisional">ഇംഗàµà´²àµ€à´·àµ</language>
+ <language type="es" draft="unconfirmed">à´¸àµà´ªà´¾à´¨à´¿à´·àµ</language>
+ <language type="et" draft="provisional">à´Žà´¸àµà´±àµà´±àµ‹à´£à´¿à´¯à´¨àµâ€</language>
+ <language type="eu" draft="provisional">ബാസàµà´•àµà´•àµ</language>
+ <language type="fa" draft="unconfirmed">പേരàµâ€à´·àµà´¯à´¨àµâ€</language>
+ <language type="fi" draft="provisional">à´«à´¿à´¨àµà´¨à´¿à´·àµ</language>
+ <language type="fj" draft="provisional">ഫിജിയനàµâ€</language>
+ <language type="fo" draft="provisional">ഫാറോസàµ</language>
+ <language type="fr" draft="provisional">à´«àµà´°à´žàµà´šàµ</language>
+ <language type="fy" draft="unconfirmed">à´«àµà´°àµ€à´¸à´¿à´¯à´¨àµâ€</language>
+ <language type="ga" draft="provisional">à´à´±à´¿à´·àµ</language>
+ <language type="gd" draft="unconfirmed">à´¸àµà´•àµ‹à´Ÿàµà´Ÿà´¿à´·àµ ഗൈലികàµ</language>
+ <language type="gl" draft="provisional">ഗലിഷàµà´¯à´£àµâ€</language>
+ <language type="gn" draft="provisional">à´—àµà´µà´¾à´±à´¾à´¨à´¿</language>
+ <language type="gu" draft="provisional">à´—àµà´œà´±à´¾à´¤àµà´¤à´¿</language>
+ <language type="ha" draft="provisional">ഹൌസ</language>
+ <language type="he" draft="provisional">ഹിബàµà´°àµ</language>
+ <language type="hr" draft="provisional">à´•àµà´°àµ‹à´¯àµ‡à´·àµà´¯à´¨àµâ€</language>
+ <language type="hu" draft="provisional">ഹംഗേറിയനàµâ€</language>
+ <language type="hy" draft="provisional">à´…à´°àµâ€à´®àµ‡à´¨à´¿à´¯à´¨àµâ€</language>
+ <language type="ia" draft="provisional">ഇനàµâ€à´±à´°àµâ€à´²à´¿à´‚à´—àµà´µà´¾</language>
+ <language type="id" draft="provisional">ഇനàµâ€à´¡àµ‹à´¨àµ‡à´·àµà´¯à´¨àµâ€</language>
+ <language type="ie" draft="provisional">ഇനàµâ€à´±à´°àµâ€à´²à´¿à´‚à´—àµà´µà´¿</language>
+ <language type="ik" draft="provisional">ഇനàµà´ªà´¿à´¯à´¾à´•àµ</language>
+ <language type="is" draft="provisional">à´à´¸àµâ€Œà´²à´¾à´¨àµâ€à´¡à´¿à´•àµ</language>
+ <language type="it" draft="provisional">ഇറàµà´±à´¾à´²à´¿à´¯à´¨àµâ€</language>
+ <language type="iu" draft="provisional">ഇനàµà´•àµà´±àµà´±à´¿à´±àµà´±à´Ÿàµà´Ÿàµ</language>
+ <language type="ja" draft="provisional">ജാപàµà´ªà´¨àµ€à´¸àµ</language>
+ <language type="jv" draft="provisional">ജാവാനീസàµ</language>
+ <language type="ka" draft="provisional">ജോരàµâ€à´œà´¿à´¯à´¨àµâ€</language>
+ <language type="kk" draft="provisional">കസാഖàµ</language>
+ <language type="kn" draft="provisional">à´•à´¨àµà´¨à´¡</language>
+ <language type="ko" draft="provisional">കൊറിയനàµâ€</language>
+ <language type="kok" draft="provisional">കൊങàµà´•à´£à´¿</language>
+ <language type="ks" draft="provisional">കാശàµà´®àµ€à´°à´¿</language>
+ <language type="ku" draft="provisional">à´•àµà´°àµâ€à´¦à´¿à´·àµ</language>
+ <language type="ky" draft="provisional">à´•à´¿à´°àµâ€à´—à´¿à´¸àµ</language>
+ <language type="la" draft="provisional">ലാറàµà´±à´¿à´¨àµâ€</language>
+ <language type="ln" draft="provisional">ലിംഗാല</language>
+ <language type="lo" draft="provisional">ലാവോതàµà´¯à´¨àµâ€</language>
+ <language type="lt" draft="provisional">ലിതàµà´µà´¾à´¨à´¿à´¯à´¨àµâ€</language>
+ <language type="mg" draft="provisional">മലഗാസി</language>
+ <language type="mi" draft="provisional">മൌറി</language>
+ <language type="mk" draft="provisional">മാസിഡോണിയനàµâ€</language>
+ <language type="ml" draft="unconfirmed">മലയാളം</language>
+ <language type="mn" draft="provisional">മംഗോളിയനàµâ€</language>
+ <language type="mo" draft="provisional">മൊളàµâ€à´¡àµ‹à´µà´¨àµâ€</language>
+ <language type="mr" draft="provisional">മറാഠി</language>
+ <language type="ms" draft="provisional">മലയ</language>
+ <language type="mt" draft="provisional">മാളàµâ€à´Ÿàµà´Ÿàµ€à´¸àµ</language>
+ <language type="my" draft="provisional">ബരàµâ€à´®àµ€à´¸àµ</language>
+ <language type="na" draft="provisional">നൌറàµ</language>
+ <language type="ne" draft="provisional">നേപàµà´ªà´¾à´³à´¿</language>
+ <language type="nl" draft="provisional">à´¡à´šàµà´šàµ</language>
+ <language type="no" draft="provisional">നോരàµâ€à´µàµ€à´œà´¿à´¯à´¨àµâ€</language>
+ <language type="oc" draft="unconfirmed">ഒസിറàµà´±à´¾à´¨àµâ€</language>
+ <language type="om" draft="provisional">ഒറോമിംഗ</language>
+ <language type="or" draft="provisional">ഒറിയ</language>
+ <language type="pa" draft="unconfirmed">പഞàµà´šà´¾à´¬à´¿</language>
+ <language type="pl" draft="unconfirmed">പോളിഷàµ</language>
+ <language type="ps" draft="provisional">പഷàµà´¤àµ</language>
+ <language type="pt" draft="unconfirmed">പോരàµâ€à´šàµà´šàµà´—ീസàµ</language>
+ <language type="qu" draft="unconfirmed">à´•àµà´µàµ†à´šàµà´šàµà´µ</language>
+ <language type="rm" draft="unconfirmed">രഹയàµà´Ÿàµà´Ÿàµ‹-റോമനàµâ€à´¸àµ</language>
+ <language type="rn" draft="unconfirmed">à´•à´¿à´±àµà´£àµà´Ÿà´¿</language>
+ <language type="ro" draft="unconfirmed">റൊമാനിയനàµâ€</language>
+ <language type="root" draft="unconfirmed">ശിഖരàµâ€</language>
+ <language type="ru" draft="unconfirmed">റഷàµà´¯à´¨àµâ€</language>
+ <language type="rw" draft="provisional">à´•à´¿à´¨àµà´¯à´°àµâ€à´µà´£àµà´Ÿ</language>
+ <language type="sa" draft="unconfirmed">സംസàµà´•àµƒà´¤à´‚</language>
+ <language type="sd" draft="unconfirmed">സിനàµà´§à´¿</language>
+ <language type="sg" draft="unconfirmed">സാങàµà´•àµ‹</language>
+ <language type="si" draft="unconfirmed">സിംഹളീസàµ</language>
+ <language type="sk" draft="unconfirmed">à´¸àµà´²àµ‹à´µà´¾à´•àµà´•àµ</language>
+ <language type="sl" draft="unconfirmed">à´¸àµà´²àµ‹à´µàµ‡à´¨à´¿à´¯à´¨àµâ€</language>
+ <language type="sm" draft="unconfirmed">സമോവനàµâ€</language>
+ <language type="sn" draft="unconfirmed">ഷോണാ</language>
+ <language type="so" draft="unconfirmed">സോമാലി</language>
+ <language type="sq" draft="provisional">à´…à´²àµâ€à´¬àµ‡à´¨à´¿à´¯à´¨àµâ€</language>
+ <language type="sr" draft="unconfirmed">സെരàµâ€à´¬à´¿à´¯à´¨àµâ€</language>
+ <language type="ss" draft="unconfirmed">à´¸àµà´µà´¾à´¸à´¿</language>
+ <language type="st" draft="unconfirmed">സെസോതàµà´¤àµ‹</language>
+ <language type="su" draft="unconfirmed">à´¸àµà´¡à´¾à´¨àµ€à´¸àµ</language>
+ <language type="sv" draft="unconfirmed">à´¸àµà´µàµ€à´¡à´¿à´·àµ</language>
+ <language type="sw" draft="unconfirmed">à´¸àµà´µà´¾à´¹à´¿à´²à´¿</language>
+ <language type="ta" draft="unconfirmed">തമിഴàµ</language>
+ <language type="te" draft="unconfirmed">തെലàµà´—àµ</language>
+ <language type="tg" draft="unconfirmed">താജികàµ</language>
+ <language type="th" draft="unconfirmed">തായàµ</language>
+ <language type="ti" draft="unconfirmed">തിഗàµà´°à´¿à´—àµâ€Œà´¨à´¾</language>
+ <language type="tk" draft="unconfirmed">à´¤àµà´°àµâ€à´•àµà´•à´®à´¨àµâ€</language>
+ <language type="tl" draft="unconfirmed">തഗാലോഗàµ</language>
+ <language type="tn" draft="unconfirmed">സെറàµà´±àµà´¸àµà´µà´¾à´¨</language>
+ <language type="to" draft="unconfirmed">ടോംഗനàµâ€</language>
+ <language type="tr" draft="unconfirmed">à´Ÿà´°àµâ€à´•àµà´•à´¿à´·àµ</language>
+ <language type="ts" draft="unconfirmed">ഷോണ</language>
+ <language type="tt" draft="unconfirmed">à´±àµà´±à´¾à´±àµà´±à´°àµâ€</language>
+ <language type="tw" draft="unconfirmed">à´¤àµà´µà´µà´¿</language>
+ <language type="ug" draft="unconfirmed">ഉയàµà´˜àµà´°àµâ€</language>
+ <language type="uk" draft="unconfirmed">ഉകàµà´°àµ‡à´¨à´¿à´¯à´¨àµâ€</language>
+ <language type="ur" draft="unconfirmed">ഉറàµà´¦àµ</language>
+ <language type="uz" draft="unconfirmed">ഉസàµà´¬à´•àµ</language>
+ <language type="vi" draft="unconfirmed">വിയറàµà´±àµà´¨à´¾à´®àµ€à´¸àµ</language>
+ <language type="vo" draft="unconfirmed">വോളാപàµà´•àµ</language>
+ <language type="wo" draft="unconfirmed">വൊളോഫàµ</language>
+ <language type="xh" draft="unconfirmed">à´•àµà´·àµ‹à´¸à´¾</language>
+ <language type="yi" draft="unconfirmed">യിദàµà´¦à´¿à´·àµ</language>
+ <language type="yo" draft="unconfirmed">യൊറൂബാ</language>
+ <language type="za" draft="unconfirmed">à´¸àµà´µà´¾à´‚à´—àµ</language>
+ <language type="zh" draft="provisional">ചൈനീസàµ</language>
+ <language type="zu" draft="unconfirmed">à´¸àµà´³àµ</language>
+ </languages>
+ <scripts>
+ <script type="Arab" draft="provisional">അറബികàµà´•àµ</script>
+ <script type="Beng" draft="provisional">ബംഗാളി</script>
+ <script type="Gujr" draft="provisional">à´—àµà´œà´±à´¾à´¤àµà´¤à´¿</script>
+ <script type="Hant" draft="provisional">ചൈനയàµà´Ÿàµ† à´ªàµà´°à´¾à´šàµ€à´¨ ലിപി</script>
+ <script type="Hira" draft="provisional">ഹിബàµà´°àµ</script>
+ <script type="Knda" draft="provisional">à´•à´¨àµà´¨à´¡</script>
+ <script type="Latn" draft="provisional">ലാറàµà´±à´¿à´¨àµâ€</script>
+ <script type="Mlym" draft="provisional">മലയാളം</script>
+ <script type="Orya" draft="provisional">ഒറിയ</script>
+ <script type="Taml" draft="provisional">തമിഴàµ</script>
+ </scripts>
+ <territories>
+ <territory type="002" draft="provisional">ആഫàµà´°à´¿à´•àµà´•</territory>
+ <territory type="005" draft="unconfirmed">ദകàµà´·à´¿à´£ അമേരികàµà´•</territory>
+ <territory type="011" draft="unconfirmed">പശàµà´šà´¿à´®à´†à´«àµà´°à´¿à´•àµà´•</territory>
+ <territory type="013" draft="provisional">മദàµà´§àµà´¯à´…മേരികàµà´•</territory>
+ <territory type="015" draft="unconfirmed">ഉതàµà´¤à´°à´†à´«àµà´°à´¿à´•àµà´•</territory>
+ <territory type="017" draft="unconfirmed">മദàµà´§àµà´¯à´†à´«àµà´°à´¿à´•àµà´•</territory>
+ <territory type="019" draft="provisional">അമേരികàµà´•à´¸àµ</territory>
+ <territory type="029" draft="provisional">കരീബിയനàµâ€</territory>
+ <territory type="142" draft="provisional">à´à´·àµà´¯</territory>
+ <territory type="150" draft="provisional">യൂറോപàµà´ªàµ</territory>
+ <territory type="AD" draft="provisional">à´…à´¨àµâ€à´Ÿàµ‹à´±</territory>
+ <territory type="AE" draft="unconfirmed">സംയàµà´•àµà´¤ അറബൠരാഷàµà´Ÿàµà´°à´‚</territory>
+ <territory type="AF" draft="provisional">à´…à´«àµà´—ാനിസàµà´¥à´¾à´¨àµâ€</territory>
+ <territory type="AG" draft="provisional">ആനàµâ€à´±à´¿à´—àµà´µ ആനàµâ€à´±àµ ബരàµâ€à´¬àµà´¡</territory>
+ <territory type="AL" draft="provisional">à´…à´²àµâ€à´¬àµ‡à´¨à´¿à´¯</territory>
+ <territory type="AM" draft="provisional">à´…à´°àµâ€à´®àµ‡à´¨à´¿à´¯</territory>
+ <territory type="AO" draft="provisional">അംഗോള</territory>
+ <territory type="AQ" draft="provisional">à´…à´¨àµâ€à´±à´¾à´°àµâ€à´Ÿàµà´Ÿà´¿à´•àµà´•</territory>
+ <territory type="AR" draft="provisional">à´…à´°àµâ€à´œà´¨àµâ€à´±àµ€à´¨</territory>
+ <territory type="AT" draft="provisional">à´“à´¸àµà´Ÿàµà´°à´¿à´¯</territory>
+ <territory type="AU" draft="provisional">à´“à´¸àµà´Ÿàµà´°àµ‡à´²à´¿à´¯</territory>
+ <territory type="AZ" draft="provisional">അസരàµâ€à´¬àµˆà´œà´¾à´¨àµâ€</territory>
+ <territory type="BA" draft="provisional">ബോസàµà´¨à´¿à´¯ ഹെരàµâ€à´¸à´—ോവിന</territory>
+ <territory type="BB" draft="provisional">ബാരàµâ€à´¬à´¡àµ‹à´¸àµ</territory>
+ <territory type="BD" draft="provisional">ബംഗàµà´²à´¾à´¦àµ‡à´¶àµ</territory>
+ <territory type="BE" draft="provisional">ബെലàµâ€à´œà´¿à´¯à´‚</territory>
+ <territory type="BF" draft="provisional">à´¬àµà´°àµâ€à´•àµà´•à´¿à´¨à´¾ ഫാസോ</territory>
+ <territory type="BG" draft="provisional">ബളàµâ€à´—േറിയ</territory>
+ <territory type="BH" draft="provisional">ബഹàµà´±àµˆà´¨àµâ€</territory>
+ <territory type="BI" draft="provisional">à´¬àµà´±àµà´£àµà´Ÿà´¿</territory>
+ <territory type="BJ" draft="provisional">ബെനിനàµâ€</territory>
+ <territory type="BM" draft="provisional">ബരàµâ€à´®àµà´¡</territory>
+ <territory type="BN" draft="provisional">à´¬àµà´°àµ‚ണയàµ</territory>
+ <territory type="BO" draft="provisional">ബൊളീവിയ</territory>
+ <territory type="BR" draft="provisional">à´¬àµà´°à´¸àµ€à´²àµâ€</territory>
+ <territory type="BS" draft="provisional">ബഹാമാസàµ</territory>
+ <territory type="BT" draft="provisional">ഭൂടàµà´Ÿà´¾à´¨àµâ€</territory>
+ <territory type="BW" draft="provisional">ബോടàµà´¸àµà´µà´¾à´¨</territory>
+ <territory type="BY" draft="provisional">ബെലറൂസàµ</territory>
+ <territory type="BZ" draft="provisional">ബെലീസàµ</territory>
+ <territory type="CA" draft="provisional">കനഡ</territory>
+ <territory type="CC" draft="provisional">കോകàµà´•à´¸àµ</territory>
+ <territory type="CF" draft="provisional">സെനàµâ€à´Ÿàµà´°à´²àµâ€ ആഫàµà´°à´¿à´•àµà´•à´¨àµâ€ റിപàµà´ªà´¬àµà´²à´¿à´•àµ</territory>
+ <territory type="CG" draft="provisional">കോംഗോ</territory>
+ <territory type="CH" draft="unconfirmed">à´¸àµà´µà´¿à´±àµà´±àµà´¸à´°àµâ€à´²à´¨àµâ€à´¡àµ</territory>
+ <territory type="CI" draft="unconfirmed">à´à´µà´±à´¿ കോസàµà´±àµà´±àµ</territory>
+ <territory type="CL" draft="provisional">ചിലി</territory>
+ <territory type="CM" draft="provisional">കാമറൂണàµâ€</territory>
+ <territory type="CN" draft="provisional">ചൈന</territory>
+ <territory type="CO" draft="provisional">കൊളംബിയ</territory>
+ <territory type="CR" draft="provisional">കോസàµà´±àµà´±à´±à´¿à´•àµà´•</territory>
+ <territory type="CU" draft="provisional">à´•àµà´¯àµ‚à´¬</territory>
+ <territory type="CV" draft="provisional">കേപàµà´ªàµ വെരàµâ€à´¡àµ†</territory>
+ <territory type="CY" draft="provisional">സൈപàµà´°à´¸àµà´¸àµ</territory>
+ <territory type="CZ" draft="provisional">ചെകàµà´•àµ റിപàµà´ªà´¬àµà´²à´¿à´•àµ</territory>
+ <territory type="DE" draft="provisional">ജരàµâ€à´®à´¨à´¿</territory>
+ <territory type="DJ" draft="provisional">ജിബൂടàµà´Ÿà´¿</territory>
+ <territory type="DK" draft="provisional">ഡെനàµà´®à´¾à´°àµâ€à´•àµà´•àµ</territory>
+ <territory type="DM" draft="provisional">ഡൊമിനികàµà´•</territory>
+ <territory type="DO" draft="provisional">ഡൊമിനികàµà´•à´¨àµâ€ റിപàµà´ªà´¬àµà´²à´¿à´•àµ</territory>
+ <territory type="DZ" draft="provisional">à´…à´²àµâ€à´œàµ€à´±à´¿à´¯</territory>
+ <territory type="EC" draft="provisional">ഇകàµà´µà´¡àµ‹à´°àµâ€</territory>
+ <territory type="EE" draft="provisional">à´Žà´¸àµà´±àµà´±àµ‹à´£à´¿à´¯â€</territory>
+ <territory type="EG" draft="provisional">ഈജിപàµà´¤àµ</territory>
+ <territory type="EH" draft="unconfirmed">പശàµà´šà´¿à´® സഹാറ</territory>
+ <territory type="ER" draft="provisional">à´Žà´°à´¿à´Ÿàµà´°à´¿à´¯</territory>
+ <territory type="ES" draft="unconfirmed">à´¸àµà´ªàµ†à´¯àµà´¨àµâ€</territory>
+ <territory type="ET" draft="provisional">à´Žà´¤àµà´¯àµ‹à´ªàµà´¯</territory>
+ <territory type="FI" draft="provisional">à´«à´¿à´¨àµâ€à´²à´¾à´¨àµâ€à´¡àµ</territory>
+ <territory type="FJ" draft="provisional">ഫിജി</territory>
+ <territory type="FR" draft="provisional">à´«àµà´°à´¾à´¨àµâ€à´¸àµ</territory>
+ <territory type="GB" draft="unconfirmed">à´¬àµà´°à´¿à´Ÿàµà´Ÿà´¨àµâ€</territory>
+ <territory type="GD" draft="provisional">à´—àµà´°à´¨àµ‡à´¡</territory>
+ <territory type="GE" draft="provisional">ജോരàµâ€à´œà´¿à´¯</territory>
+ <territory type="GI" draft="provisional">ജിബàµà´°à´¿à´³àµâ€à´Ÿàµà´Ÿà´°àµâ€</territory>
+ <territory type="GL" draft="provisional">à´—àµà´°àµ€à´¨àµâ€à´²à´¾à´¨àµâ€à´±àµ</territory>
+ <territory type="GM" draft="provisional">ഗാംബിയ</territory>
+ <territory type="GR" draft="provisional">à´—àµà´°àµ€à´¸àµ</territory>
+ <territory type="GT" draft="provisional">à´—àµà´µà´¾à´Ÿàµà´Ÿà´¿à´®à´¾à´²à´¾</territory>
+ <territory type="GW" draft="provisional">ഗിനി-ബിസോ</territory>
+ <territory type="GY" draft="provisional">ഗയാന</territory>
+ <territory type="HR" draft="provisional">à´•àµà´°àµŠà´¯àµ‡à´·àµà´¯</territory>
+ <territory type="HT" draft="provisional">ഹൈയàµà´¤à´¿</territory>
+ <territory type="HU" draft="provisional">ഹംഗറി</territory>
+ <territory type="IE" draft="provisional">à´à´¯à´°àµâ€à´²à´¾à´¨àµâ€à´±àµ</territory>
+ <territory type="IL" draft="unconfirmed">ഇസàµà´°à´¾à´¯àµ‡à´²àµâ€</territory>
+ <territory type="IN">ഇനàµà´¤àµà´¯</territory>
+ <territory type="IQ" draft="provisional">ഇറാകàµà´•àµ</territory>
+ <territory type="IR" draft="provisional">ഇറാനàµâ€</territory>
+ <territory type="IT" draft="unconfirmed">ഇറàµà´±à´²à´¿</territory>
+ <territory type="JM" draft="unconfirmed">ജമൈകàµà´•</territory>
+ <territory type="JO" draft="unconfirmed">ജോരàµâ€à´¦àµà´¦à´¾à´¨àµâ€</territory>
+ <territory type="JP" draft="unconfirmed">ജപàµà´ªà´¾à´¨àµâ€</territory>
+ <territory type="KE" draft="unconfirmed">കെനിയ</territory>
+ <territory type="KG" draft="unconfirmed">à´•à´¿à´°àµâ€à´—à´¿à´¸àµà´¥à´¾à´¨àµâ€</territory>
+ <territory type="KH" draft="provisional">കംബോഡിയ</territory>
+ <territory type="KI" draft="unconfirmed">കിരിബാതàµà´¤à´¿</territory>
+ <territory type="KP" draft="unconfirmed">ഉതàµà´¤à´°à´•àµŠà´±à´¿à´¯</territory>
+ <territory type="KR" draft="unconfirmed">ദകàµà´·à´¿à´£à´•àµŠà´±à´¿à´¯</territory>
+ <territory type="KW" draft="unconfirmed">à´•àµà´µàµˆà´±àµà´±àµ</territory>
+ <territory type="KZ" draft="unconfirmed">കസാഖàµà´¸àµà´¥à´¾à´¨àµâ€</territory>
+ <territory type="LA" draft="unconfirmed">ലാവോസàµ</territory>
+ <territory type="LB" draft="unconfirmed">ലബനനàµâ€</territory>
+ <territory type="LK" draft="unconfirmed">à´¶àµà´°àµ€à´²à´™àµà´•</territory>
+ <territory type="LR" draft="unconfirmed">ലൈബീരിയ</territory>
+ <territory type="LS" draft="unconfirmed">ലെസോതàµà´¤àµ‹</territory>
+ <territory type="LT" draft="unconfirmed">ലിതàµà´µà´¾à´¨à´¿à´¯</territory>
+ <territory type="LU" draft="unconfirmed">ലകàµà´¸à´‚ബരàµâ€à´—àµ</territory>
+ <territory type="LY" draft="unconfirmed">ലിബിയ</territory>
+ <territory type="MA" draft="unconfirmed">മൊറോകàµà´•àµŠ</territory>
+ <territory type="MC" draft="unconfirmed">മൊണോകàµà´•àµŠ</territory>
+ <territory type="MG" draft="unconfirmed">മഡഗാസàµà´•à´°àµâ€</territory>
+ <territory type="ML" draft="unconfirmed">മാലി</territory>
+ <territory type="MM" draft="unconfirmed">à´®àµà´¯à´¾à´¨àµâ€à´®à´¾à´°àµâ€</territory>
+ <territory type="MN" draft="unconfirmed">മംഗോളിയ</territory>
+ <territory type="MT" draft="unconfirmed">മാളàµâ€à´Ÿàµà´Ÿ</territory>
+ <territory type="MX" draft="unconfirmed">മേകàµà´¸à´¿à´•àµà´•àµ‹</territory>
+ <territory type="MY" draft="unconfirmed">മലേഷàµà´¯</territory>
+ <territory type="MZ" draft="unconfirmed">മൊസാംബികàµà´•àµ</territory>
+ <territory type="NA" draft="unconfirmed">നമീബിയ</territory>
+ <territory type="NE" draft="unconfirmed">നൈഗരàµâ€</territory>
+ <territory type="NG" draft="unconfirmed">നൈജീരിയ</territory>
+ <territory type="NP" draft="unconfirmed">നേപàµà´ªà´¾à´³àµâ€</territory>
+ <territory type="PA" draft="unconfirmed">പനാമ</territory>
+ <territory type="PE" draft="unconfirmed">പെറàµ</territory>
+ <territory type="PH" draft="unconfirmed">ഫിലിപàµà´ªàµˆà´¨àµâ€à´¸àµ</territory>
+ <territory type="PK" draft="unconfirmed">പാകàµà´•à´¿à´¸àµà´¥à´¾à´¨àµâ€</territory>
+ <territory type="PT" draft="unconfirmed">പോരàµâ€à´šàµà´šàµà´—à´²àµâ€</territory>
+ <territory type="QA" draft="unconfirmed">à´–à´¤àµà´¤à´°àµâ€</territory>
+ <territory type="RU" draft="unconfirmed">റഷàµà´¯</territory>
+ <territory type="SD" draft="unconfirmed">à´¸àµà´¡à´¾à´¨àµâ€</territory>
+ <territory type="SE" draft="unconfirmed">à´¸àµà´µàµ€à´¡à´¨àµâ€</territory>
+ <territory type="SG" draft="unconfirmed">സിംഗപàµà´ªàµà´°àµâ€</territory>
+ <territory type="SN" draft="unconfirmed">സെനഗലàµâ€</territory>
+ <territory type="SO" draft="unconfirmed">സോമാലിയ</territory>
+ <territory type="SY" draft="unconfirmed">സിറിയ</territory>
+ <territory type="TL" draft="provisional">à´•à´¿à´´à´•àµà´•à´¨àµâ€ തിമàµà´°àµâ€</territory>
+ <territory type="TV" draft="unconfirmed">à´¤àµà´µà´¾à´²àµ</territory>
+ <territory type="US" draft="unconfirmed">à´¯àµà´£àµˆà´±àµà´±à´¡àµ à´¸àµà´±àµà´±àµ‡à´±àµà´±àµà´¸àµ ഓഫൠഅമേരികàµà´•</territory>
+ <territory type="VA" draft="unconfirmed">വതàµà´¤à´¿à´•àµà´•à´¾à´¨àµâ€</territory>
+ <territory type="VN" draft="unconfirmed">വിയറàµà´±àµà´¨à´¾à´‚</territory>
+ <territory type="ZM" draft="unconfirmed">സാംബിയ</territory>
+ <territory type="ZW" draft="unconfirmed">സിംബാവെ</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[അ-ഋ ൠ ഌ ൡ എ-ഠഒ-ന പ-ര ല വ ള ഴ റ ശ-ഹ ഃ ം ാ-ൃ െ-ൈ ൊ-ൠൗ]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">ജനàµ</month>
+ <month type="2" draft="unconfirmed">à´«à´¿à´¬àµ</month>
+ <month type="3" draft="unconfirmed">മാറàµà´…</month>
+ <month type="4" draft="unconfirmed">à´à´ªàµà´±à´¿à´²àµà´…</month>
+ <month type="5" draft="unconfirmed">മെയàµ</month>
+ <month type="6" draft="unconfirmed">ജൂണàµà´…</month>
+ <month type="7" draft="unconfirmed">ജൂൈല</month>
+ <month type="8" draft="unconfirmed">ആഗ</month>
+ <month type="9" draft="unconfirmed">സെപàµà´¤à´‚</month>
+ <month type="10" draft="unconfirmed">à´’à´•àµà´Ÿ</month>
+ <month type="11" draft="unconfirmed">നവം</month>
+ <month type="12" draft="unconfirmed">ഡിസം</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">ജനàµà´µà´°à´¿</month>
+ <month type="2" draft="unconfirmed">à´«à´¿à´¬àµà´±à´µà´°à´¿</month>
+ <month type="3" draft="unconfirmed">മാറàµà´…à´šàµà´…à´šàµ</month>
+ <month type="4" draft="unconfirmed">à´à´ªàµà´±à´¿à´²àµà´…</month>
+ <month type="5" draft="unconfirmed">മെയàµ</month>
+ <month type="6" draft="unconfirmed">ജൂണàµà´…</month>
+ <month type="7" draft="unconfirmed">ജൂൈല</month>
+ <month type="8" draft="unconfirmed">ആഗസàµà´¤àµà´…</month>
+ <month type="9" draft="unconfirmed">സെപàµà´¤à´‚ബറàµà´…</month>
+ <month type="10" draft="unconfirmed">à´’à´•àµà´Ÿàµˆà´¬à´±àµà´…</month>
+ <month type="11" draft="unconfirmed">നവംബറàµà´…</month>
+ <month type="12" draft="unconfirmed">ഡിസംബറàµà´…</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">à´žà´¾</day>
+ <day type="mon" draft="unconfirmed">തി</day>
+ <day type="tue" draft="unconfirmed">ചൊ</day>
+ <day type="wed" draft="unconfirmed">à´¬àµ</day>
+ <day type="thu" draft="unconfirmed">à´µàµà´¯</day>
+ <day type="fri" draft="unconfirmed">വെ</day>
+ <day type="sat" draft="unconfirmed">à´¶</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">ഞായറàµà´…</day>
+ <day type="mon" draft="unconfirmed">തിങàµà´•à´³àµà´…</day>
+ <day type="tue" draft="unconfirmed">ചൊവàµà´µ</day>
+ <day type="wed" draft="unconfirmed">à´¬àµà´¨à´­àµà´…</day>
+ <day type="thu" draft="unconfirmed">à´µàµà´¯à´¾à´´à´‚</day>
+ <day type="fri" draft="unconfirmed">വെളàµà´³à´¿</day>
+ <day type="sat" draft="unconfirmed">ശനി</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">രാവിലെ</am>
+ <pm draft="unconfirmed">വൈകàµ</pm>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <nativeZeroDigit draft="unconfirmed">൦</nativeZeroDigit>
+ </symbols>
+ <currencies>
+ <currency type="AED">
+ <displayName draft="provisional">à´¯àµà´Žà´‡ ദിരàµâ€à´¹à´‚</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName draft="provisional">ആസàµà´Ÿàµà´°àµ‡à´²à´¿à´¯à´¨àµâ€ ഡോളരàµâ€</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName draft="provisional">ബാരàµâ€à´¬à´¡àµ‹à´¸àµ ഡോളരàµâ€</displayName>
+ </currency>
+ <currency type="BEL">
+ <displayName draft="provisional">ബലàµâ€à´œà´¿à´¯à´¨àµâ€ à´«àµà´°à´¾à´™àµà´•àµ</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName draft="provisional">ബളàµâ€à´—േറിയനàµâ€ à´¨àµà´¯àµ‚ലവàµ</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">à´¬àµà´°à´¸àµ€à´²à´¿à´¯à´¨àµâ€ റിയാലàµâ€</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="provisional">യൂറോ</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName draft="provisional">ഫിജി ഡോളരàµâ€</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="provisional">à´¬àµà´°à´¿à´Ÿàµà´Ÿàµ€à´·àµ പൌണàµà´Ÿàµ à´¸àµà´±àµà´±àµ†à´°àµâ€à´²à´¿à´‚à´™àµ</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">ഇനàµâ€à´¡àµà´¯à´¨àµâ€ രൂപ</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName draft="provisional">ഇറàµà´±à´¾à´²à´¿à´¯à´¨àµâ€ ലിറ</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="provisional">ജാപàµà´ªà´¾à´¨àµ€à´¸àµ യെനàµâ€</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">റഷàµà´¯à´¨àµâ€ റൂബിളàµâ€</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="provisional">à´¯àµà´Žà´¸àµ ഡോളരàµâ€</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">അതെ</yesstr>
+ <nostr draft="unconfirmed">à´…à´²àµà´²</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1" uri="http://tdil.mit.gov.in/newsIndexApr02.htm">Govt of India Newsletter April 02</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ml_IN.xml b/libs/Zend/Locale/Data/ml_IN.xml
new file mode 100755
index 0000000000..950609309a
--- /dev/null
+++ b/libs/Zend/Locale/Data/ml_IN.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.27 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="ml"/>
+ <territory type="IN"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="de" draft="provisional">ജരàµâ€à´®àµà´®à´¨àµ</language>
+ </languages>
+ </localeDisplayNames>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern draft="unconfirmed">#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern draft="unconfirmed">#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/mn.xml b/libs/Zend/Locale/Data/mn.xml
new file mode 100755
index 0000000000..c62a23e963
--- /dev/null
+++ b/libs/Zend/Locale/Data/mn.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.31 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="mn"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="de">герман</language>
+ <language type="en">англи</language>
+ <language type="es">иÑпани</language>
+ <language type="fr">франц</language>
+ <language type="it">итали</language>
+ <language type="ja">Ñпон</language>
+ <language type="mn" draft="unconfirmed">Монгол Ñ…Ñл</language>
+ <language type="pt">португали</language>
+ <language type="ru">ороÑ</language>
+ <language type="zh">Ñ…Ñтад</language>
+ </languages>
+ <territories>
+ <territory type="BR">Бразили</territory>
+ <territory type="DE">Герман</territory>
+ <territory type="FR">Франц</territory>
+ <territory type="IN">ЭнÑÑ‚Ñ…Ñг</territory>
+ <territory type="IT">Итали</territory>
+ <territory type="JP">Япон</territory>
+ <territory type="MN" draft="unconfirmed">Монгол улÑ</territory>
+ <territory type="RU">ОроÑ</territory>
+ <territory type="US">Ðмерикийн ÐÑгдÑÑн УлÑ</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters references="RP1">[а-е Ñ‘ ж-о Ó© п-у Ò¯ Ñ„-Ñ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" references="RP1">[Ó™ Ò— ÓŠ Ò»]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">хул</month>
+ <month type="2" draft="unconfirmed">үхÑ</month>
+ <month type="3" draft="unconfirmed">бар</month>
+ <month type="4" draft="unconfirmed">туу</month>
+ <month type="5" draft="unconfirmed">луу</month>
+ <month type="6" draft="unconfirmed">мог</month>
+ <month type="7" draft="unconfirmed">мор</month>
+ <month type="8" draft="unconfirmed">хон</month>
+ <month type="9" draft="unconfirmed">бич</month>
+ <month type="10" draft="unconfirmed">тах</month>
+ <month type="11" draft="unconfirmed">нох</month>
+ <month type="12" draft="unconfirmed">гах</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Хулгана</month>
+ <month type="2" draft="unconfirmed">ҮхÑÑ€</month>
+ <month type="3" draft="unconfirmed">Бар</month>
+ <month type="4" draft="unconfirmed">Туулай</month>
+ <month type="5" draft="unconfirmed">Луу</month>
+ <month type="6" draft="unconfirmed">Могой</month>
+ <month type="7" draft="unconfirmed">Морь</month>
+ <month type="8" draft="unconfirmed">Хонь</month>
+ <month type="9" draft="unconfirmed">Бич</month>
+ <month type="10" draft="unconfirmed">Тахиа</month>
+ <month type="11" draft="unconfirmed">Ðохой</month>
+ <month type="12" draft="unconfirmed">Гахай</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">ÐÑ</day>
+ <day type="mon" draft="unconfirmed">Да</day>
+ <day type="tue" draft="unconfirmed">ÐœÑ</day>
+ <day type="wed" draft="unconfirmed">Лх</day>
+ <day type="thu" draft="unconfirmed">Пү</day>
+ <day type="fri" draft="unconfirmed">Ба</day>
+ <day type="sat" draft="unconfirmed">БÑ</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">нÑм</day>
+ <day type="mon" draft="unconfirmed">даваа</day>
+ <day type="tue" draft="unconfirmed">мÑгмар</day>
+ <day type="wed" draft="unconfirmed">лхагва</day>
+ <day type="thu" draft="unconfirmed">пүрÑв</day>
+ <day type="fri" draft="unconfirmed">бааÑан</day>
+ <day type="sat" draft="unconfirmed">бÑмба</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">1/4</quarter>
+ <quarter type="2" draft="unconfirmed">2/4</quarter>
+ <quarter type="3">3/4</quarter>
+ <quarter type="4" draft="unconfirmed">4/4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">дөрөвний нÑг</quarter>
+ <quarter type="2" draft="unconfirmed">дөрөвний хоёр</quarter>
+ <quarter type="3" draft="unconfirmed">дөрөвний гурав</quarter>
+ <quarter type="4" draft="unconfirmed">дөрөвний дөрөв</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">манай Ñриний өмнөх</era>
+ <era type="1" draft="unconfirmed">манай Ñриний</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">м.Ñ.Ó©</era>
+ <era type="1" draft="unconfirmed">м.Ñ.</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal draft="unconfirmed">,</decimal>
+ <group draft="unconfirmed"> </group>
+ </symbols>
+ <currencies>
+ <currency type="MNT">
+ <symbol draft="unconfirmed">â‚®</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1" uri="http://en.wikipedia.org/wiki/Cyrillic_alphabet">Wikipedia - Cyrillic alphabet, usage in various languages</reference>
+ <reference type="RP2" uri="http://www.omniglot.com/writing/mongolian.htm">Omniglot on Mongolian</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/mn_MN.xml b/libs/Zend/Locale/Data/mn_MN.xml
new file mode 100755
index 0000000000..6bc8802aa9
--- /dev/null
+++ b/libs/Zend/Locale/Data/mn_MN.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.31 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="mn"/>
+ <territory type="MN"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/mr.xml b/libs/Zend/Locale/Data/mr.xml
new file mode 100755
index 0000000000..29b7c618fa
--- /dev/null
+++ b/libs/Zend/Locale/Data/mr.xml
@@ -0,0 +1,259 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.50 $"/>
+ <generation date="$Date: 2006/06/28 06:03:59 $"/>
+ <language type="mr"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">अफार</language>
+ <language type="ab">अबखेजियन</language>
+ <language type="af">अफà¥à¤°à¤¿à¤•à¤¾à¤¨à¥à¤¸</language>
+ <language type="am">अमहारिक</language>
+ <language type="ar">अरेबिक</language>
+ <language type="as">असामी</language>
+ <language type="ay">à¤à¤®à¤°à¤¾</language>
+ <language type="az">अज़रबाइजानी</language>
+ <language type="ba">बषà¥à¤•à¤¿à¤°</language>
+ <language type="be">बैलोरà¥à¤¸à¤¿à¤¯à¤¨</language>
+ <language type="bg">बलà¥à¤—ेरियन</language>
+ <language type="bh">बीहारी</language>
+ <language type="bi">बिसलमा</language>
+ <language type="bn">बंगाली</language>
+ <language type="bo">तिबेटियन</language>
+ <language type="br">बà¥à¤°à¥‡à¤Ÿà¤¨</language>
+ <language type="ca">कटलन</language>
+ <language type="co">कोरà¥à¤¸à¤¿à¤•à¤¨</language>
+ <language type="cs">ज़ेक</language>
+ <language type="cy">वेलà¥à¤·</language>
+ <language type="da">डानिष</language>
+ <language type="de">जरà¥à¤®à¤¨</language>
+ <language type="dz">भूटानी</language>
+ <language type="el">गà¥à¤°à¥€à¤•</language>
+ <language type="en">इंगà¥à¤°à¥‡à¤œà¥€</language>
+ <language type="eo">इसà¥à¤ªà¤°à¤¾à¤¨à¥à¤Ÿà¥‹</language>
+ <language type="es">सà¥à¤ªà¤¾à¤¨à¤¿à¤·</language>
+ <language type="et">इसà¥à¤Ÿà¥‹à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="eu">बासà¥à¤•</language>
+ <language type="fa">परà¥à¤·à¤¿à¤¯à¤¨à¥</language>
+ <language type="fi">फिनà¥à¤¨à¤¿à¤·</language>
+ <language type="fj">फिजी</language>
+ <language type="fo">फेरोसà¥</language>
+ <language type="fr">फà¥à¤°à¥‡à¤¨à¥à¤š</language>
+ <language type="fy">फà¥à¤°à¤¿à¤¸à¤¿à¤¯à¤¨à¥</language>
+ <language type="ga">à¤à¤°à¤¿à¤·</language>
+ <language type="gd">सà¥à¤•à¤¾à¤Ÿà¤¸à¥ गेलिक</language>
+ <language type="gl">गेलीशियन</language>
+ <language type="gn">गौरानी</language>
+ <language type="gu">गà¥à¤œà¤°à¤¾à¤¤à¥€</language>
+ <language type="ha">हौसा</language>
+ <language type="he">हेबृ</language>
+ <language type="hi">हिनà¥à¤¦à¥€</language>
+ <language type="hr">कà¥à¤°à¥‹à¤¯à¥‡à¤·à¤¿à¤¯à¤¨à¥</language>
+ <language type="hu">हंगेरियनà¥</language>
+ <language type="hy">आरà¥à¤®à¥€à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="ia">इनà¥à¤Ÿà¤°à¤²à¤¿à¤‚गà¥à¤µà¤¾</language>
+ <language type="id">इनà¥à¤¡à¥‹à¤¨à¥‡à¤·à¤¿à¤¯à¤¨</language>
+ <language type="ie">इनà¥à¤Ÿà¤°à¤²à¤¿à¤‚ग</language>
+ <language type="ik">इनूपियाक</language>
+ <language type="is">आईसलानà¥à¤¡à¤¿à¤•</language>
+ <language type="it">इटालियन</language>
+ <language type="iu">इनà¥à¤•à¤¿à¤Ÿà¥à¤Ÿà¥</language>
+ <language type="ja">जापनीसà¥</language>
+ <language type="jv">जावनीसà¥</language>
+ <language type="ka">जारà¥à¤œà¤¿à¤¯à¤¨à¥</language>
+ <language type="kk">कज़क</language>
+ <language type="kl">गà¥à¤°à¥€à¤¨à¤²à¤¾à¤¨à¥à¤¡à¤¿à¤•</language>
+ <language type="km">कंबोडियन</language>
+ <language type="kn">कनà¥à¤¨à¤¡</language>
+ <language type="ko">कोरियनà¥</language>
+ <language type="kok">कोंकणी</language>
+ <language type="ks">कशà¥à¤®à¥€à¤°à¥€</language>
+ <language type="ku">कà¥à¤°à¥à¤¦à¤¿à¤·</language>
+ <language type="ky">किरà¥à¤—िज़</language>
+ <language type="la">लाटिन</language>
+ <language type="ln">लिंगाला</language>
+ <language type="lo">लाओतियनà¥</language>
+ <language type="lt">लिथà¥à¤†à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="lv">लाटà¥à¤µà¤¿à¤¯à¤¨à¥ (लेटà¥à¤Ÿà¤¿à¤·)</language>
+ <language type="mg">मलागसी</language>
+ <language type="mi">माओरी</language>
+ <language type="mk">मसीडोनियनà¥</language>
+ <language type="ml">मलियालम</language>
+ <language type="mn">मंगोलियनà¥</language>
+ <language type="mo">मोलà¥à¤¡à¤¾à¤µà¤¿à¤¯à¤¨à¥</language>
+ <language type="mr">मराठी</language>
+ <language type="ms">मलय</language>
+ <language type="mt">मालतीसà¥</language>
+ <language type="my">बरà¥à¤®à¥€à¤¸à¥</language>
+ <language type="na">नौरो</language>
+ <language type="ne">नेपाली</language>
+ <language type="nl">डच</language>
+ <language type="no">नोरà¥à¤µà¥‡à¤œà¤¿à¤¯à¤¨</language>
+ <language type="oc">ओसिटानà¥</language>
+ <language type="om">ओरोमो (अफान)</language>
+ <language type="or">ओरिया</language>
+ <language type="pa">पंजाबी</language>
+ <language type="pl">पोलिष</language>
+ <language type="ps">पषà¥à¤Ÿà¥‹ (पà¥à¤·à¥à¤Ÿà¥‹)</language>
+ <language type="pt">पोरà¥à¤šà¥à¤—ीसà¥</language>
+ <language type="qu">कà¥à¤µà¥‡à¤šà¤“</language>
+ <language type="rm">रहटो-रोमानà¥à¤¸à¥</language>
+ <language type="rn">किरà¥à¤¨à¥à¤¦à¥€</language>
+ <language type="ro">रोमानियनà¥</language>
+ <language type="root">शिखर</language>
+ <language type="ru">रषà¥à¤¯à¤¨à¥</language>
+ <language type="rw">किनà¥à¤¯à¤¾à¤°à¥à¤µà¤¾à¤¨à¥à¤¡à¤¾</language>
+ <language type="sa">संसà¥à¤•à¥ƒà¤¤</language>
+ <language type="sd">सिंधी</language>
+ <language type="sg">सांगà¥à¤°à¥‹</language>
+ <language type="sh">सेरà¥à¤¬à¥‹-कà¥à¤°à¥‹à¤¯à¥‡à¤·à¤¿à¤¯à¤¨à¥</language>
+ <language type="si">सिनà¥à¤¹à¤²à¥€à¤¸à¥</language>
+ <language type="sk">सà¥à¤²à¥‹à¤µà¤¾à¤•</language>
+ <language type="sl">सà¥à¤²à¥‹à¤µà¥‡à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="sm">समोन</language>
+ <language type="sn">शोना</language>
+ <language type="so">सोमाली</language>
+ <language type="sq">आलà¥à¤¬à¥‡à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="sr">सेरà¥à¤¬à¤¿à¤¯à¤¨à¥</language>
+ <language type="ss">सिसà¥à¤µà¤¤à¥€</language>
+ <language type="st">सेसोथो</language>
+ <language type="su">सà¥à¤‚दनीसà¥</language>
+ <language type="sv">सà¥à¤µà¥€à¤¡à¤¿à¤·</language>
+ <language type="sw">सà¥à¤µà¤¾à¤¹à¤¿à¤²à¥€</language>
+ <language type="ta">तमिळ</language>
+ <language type="te">तेलंगू</language>
+ <language type="tg">तजिक</language>
+ <language type="th">थाई</language>
+ <language type="ti">तिगà¥à¤°à¤¿à¤¨à¥à¤¯à¤¾</language>
+ <language type="tk">तà¥à¤°à¥à¤•à¤®à¥‡à¤¨</language>
+ <language type="tl">तगालोग</language>
+ <language type="tn">सेतà¥à¤¸à¥à¤µà¤¾à¤¨à¤¾</language>
+ <language type="to">तोंगा</language>
+ <language type="tr">तà¥à¤°à¥à¤•à¤¿à¤·</language>
+ <language type="ts">तà¥à¤¸à¥‹à¤—ा</language>
+ <language type="tt">टटार</language>
+ <language type="tw">तà¥à¤µà¤¿</language>
+ <language type="ug">उधूर</language>
+ <language type="uk">यà¥à¤•à¥à¤°à¥‡à¤¨à¤¿à¤¯à¤¨à¥</language>
+ <language type="ur">उरà¥à¤¦à¥‚</language>
+ <language type="uz">उज़बेक</language>
+ <language type="vi">वियतà¥à¤¨à¤¾à¤®à¥€à¤œà¤¼</language>
+ <language type="vo">ओलापà¥à¤•</language>
+ <language type="wo">उलोफ</language>
+ <language type="xh">कà¥à¤¸à¥à¤¹à¥‹à¤¸à¤¾</language>
+ <language type="yi">इदà¥à¤¦à¤¿à¤·</language>
+ <language type="yo">यूरà¥à¤¬à¤¾</language>
+ <language type="za">à¤à¥à¤¹à¥à¤¨à¥à¤—</language>
+ <language type="zh">चिनीसà¥</language>
+ <language type="zu">जà¥à¤²à¥‚</language>
+ </languages>
+ <territories>
+ <territory type="BR">बà¥à¤°à¤¾à¤œà¥€à¤²</territory>
+ <territory type="DE">जमिन</territory>
+ <territory type="IN">भारत</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[़ à¤-ः ०-९ ॠअ-ठà¤-ऑ ओ-न प-र ल ळ व-ह ऽ-ॅ े-ॉ ो-à¥]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">जानेवारी</month>
+ <month type="2">फेबृवारी</month>
+ <month type="3">मारà¥à¤š</month>
+ <month type="4">à¤à¤ªà¥à¤°à¤¿à¤²</month>
+ <month type="5">मे</month>
+ <month type="6">जून</month>
+ <month type="7">जà¥à¤²à¥ˆ</month>
+ <month type="8">ओगसà¥à¤Ÿ</month>
+ <month type="9">सेपà¥à¤Ÿà¥‡à¤‚बर</month>
+ <month type="10">ओकà¥à¤Ÿà¥‹à¤¬à¤°</month>
+ <month type="11">नोवà¥à¤¹à¥‡à¤‚बर</month>
+ <month type="12">डिसेंबर</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">जानेवारी</month>
+ <month type="2">फेबृवारी</month>
+ <month type="3">मारà¥à¤š</month>
+ <month type="4">à¤à¤ªà¥à¤°à¤¿à¤²</month>
+ <month type="5">मे</month>
+ <month type="6">जून</month>
+ <month type="7">जà¥à¤²à¥ˆ</month>
+ <month type="8">ओगसà¥à¤Ÿ</month>
+ <month type="9">सेपà¥à¤Ÿà¥‡à¤‚बर</month>
+ <month type="10">ओकà¥à¤Ÿà¥‹à¤¬à¤°</month>
+ <month type="11">नोवà¥à¤¹à¥‡à¤‚बर</month>
+ <month type="12">डिसेंबर</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">रवि</day>
+ <day type="mon">सोम</day>
+ <day type="tue">मंगळ</day>
+ <day type="wed">बà¥à¤§</day>
+ <day type="thu">गà¥à¤°à¥</day>
+ <day type="fri">शà¥à¤•à¥à¤°</day>
+ <day type="sat">शनि</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">रविवार</day>
+ <day type="mon">सोमवार</day>
+ <day type="tue">मंगळवार</day>
+ <day type="wed">बà¥à¤§à¤µà¤¾à¤°</day>
+ <day type="thu">गà¥à¤°à¥à¤µà¤¾à¤°</day>
+ <day type="fri">शà¥à¤•à¥à¤°à¤µà¤¾à¤°</day>
+ <day type="sat">शनिवार</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am>म.पू.</am>
+ <pm>म.नं.</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">ईसापूरà¥à¤µ</era>
+ <era type="1">सन</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Asia/Calcutta">
+ <long>
+ <standard>भारतीय समय</standard>
+ <daylight>भारतीय समय</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IST</daylight>
+ </short>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="INR">
+ <symbol>रà¥</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">हां</yesstr>
+ <nostr draft="unconfirmed">ना</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1" uri="http://tdil.mit.gov.in/newsIndexJan02.htm">Govt of India TDIL Magazine, Jan 2002</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/mr_IN.xml b/libs/Zend/Locale/Data/mr_IN.xml
new file mode 100755
index 0000000000..4158dfbd37
--- /dev/null
+++ b/libs/Zend/Locale/Data/mr_IN.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.47 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="mr"/>
+ <territory type="IN"/>
+ </identity>
+ <delimiters>
+ <quotationStart>'</quotationStart>
+ <quotationEnd>'</quotationEnd>
+ <alternateQuotationStart>&quot;</alternateQuotationStart>
+ <alternateQuotationEnd>&quot;</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d-M-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ms.xml b/libs/Zend/Locale/Data/ms.xml
new file mode 100755
index 0000000000..7a5eee7f98
--- /dev/null
+++ b/libs/Zend/Locale/Data/ms.xml
@@ -0,0 +1,354 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.44 $"/>
+ <generation date="$Date: 2006/06/27 18:46:54 $"/>
+ <language type="ms"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ms">Bahasa Melayu</language>
+ </languages>
+ <territories>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Emiriah Arab Bersatu</territory>
+ <territory type="AF">Afghanistan</territory>
+ <territory type="AG">Antigua dan Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albania</territory>
+ <territory type="AM">Armenia</territory>
+ <territory type="AN">Netherlands Antilles</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarctica</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">American Samoa</territory>
+ <territory type="AT">Austria</territory>
+ <territory type="AU">Australia</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AZ">Azerbaijan</territory>
+ <territory type="BA">Bosnia dan Herzegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BE">Belgium</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgaria</territory>
+ <territory type="BH">Bahrain</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei</territory>
+ <territory type="BO">Bolivia</territory>
+ <territory type="BR">Brazil</territory>
+ <territory type="BS">Bahamas</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BV">Bouvet Island</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Belarus</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Cocos (Keeling) Islands</territory>
+ <territory type="CD">Democratic Republic of the Congo</territory>
+ <territory type="CF">Republik Afrika Tengah</territory>
+ <territory type="CG">Congo</territory>
+ <territory type="CH">Switzerland</territory>
+ <territory type="CI">Pantai Gading</territory>
+ <territory type="CK">Cook Islands</territory>
+ <territory type="CL">Cile</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Cina</territory>
+ <territory type="CO">Colombia</territory>
+ <territory type="CR">Kosta Rika</territory>
+ <territory type="CS" draft="unconfirmed">Serbia</territory>
+ <territory type="CU">Cuba</territory>
+ <territory type="CV">Cape Verde</territory>
+ <territory type="CX">Christmas Island</territory>
+ <territory type="CY">Kibris</territory>
+ <territory type="CZ">Republik Czech</territory>
+ <territory type="DE">Jerman</territory>
+ <territory type="DJ">Jibouti</territory>
+ <territory type="DK">Denmark</territory>
+ <territory type="DM">Dominica</territory>
+ <territory type="DO">Republik Dominican</territory>
+ <territory type="DZ">Aljazair</territory>
+ <territory type="EC">Ecuador</territory>
+ <territory type="EE">Estonia</territory>
+ <territory type="EG">Mesir</territory>
+ <territory type="EH">Sahara Barat</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Sepanyol</territory>
+ <territory type="ET">Ethiopia</territory>
+ <territory type="FI">Finland</territory>
+ <territory type="FJ">Fiji</territory>
+ <territory type="FK">Falkland Islands</territory>
+ <territory type="FM">Micronesia</territory>
+ <territory type="FO">Faroe Islands</territory>
+ <territory type="FR">Perancis</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">United Kingdom</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Georgia</territory>
+ <territory type="GF">French Guiana</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Greenland</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Equatorial Guinea</territory>
+ <territory type="GR">Yunani</territory>
+ <territory type="GS">South Georgia and the South Sandwich Islands</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinea Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Hong Kong S.A.R., China</territory>
+ <territory type="HM">Heard Island and McDonald Islands</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Croatia</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Hungari</territory>
+ <territory type="ID">Indonesia</territory>
+ <territory type="IE">Ireland</territory>
+ <territory type="IL">Israel</territory>
+ <territory type="IN">Hindia</territory>
+ <territory type="IO">British Indian Ocean Territory</territory>
+ <territory type="IQ">Iraq</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Iceland</territory>
+ <territory type="IT">Itali</territory>
+ <territory type="JM">Jamaika</territory>
+ <territory type="JO">Jordan</territory>
+ <territory type="JP">Jepun</territory>
+ <territory type="KE">Kenya</territory>
+ <territory type="KG">Kyrgyzstan</territory>
+ <territory type="KH">Kemboja</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Comoros</territory>
+ <territory type="KN">Saint Kitts dan Nevis</territory>
+ <territory type="KP">Utara Korea</territory>
+ <territory type="KR">Selatan Korea</territory>
+ <territory type="KW">Kuwait</territory>
+ <territory type="KY">Cayman Islands</territory>
+ <territory type="KZ">Kazakhstan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Lubnan</territory>
+ <territory type="LC">Saint Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberia</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Lithuania</territory>
+ <territory type="LU">Luksembourg</territory>
+ <territory type="LV">Latvia</territory>
+ <territory type="LY">Libya</territory>
+ <territory type="MA">Maghribi</territory>
+ <territory type="MC">Monaco</territory>
+ <territory type="MD">Moldova</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Kepulauan Marshall</territory>
+ <territory type="MK">Macedonia</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongolia</territory>
+ <territory type="MO">Macao S.A.R., China</territory>
+ <territory type="MP">Northern Mariana Islands</territory>
+ <territory type="MQ">Martinique</territory>
+ <territory type="MR">Mauritania</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Maldiv</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Meksiko</territory>
+ <territory type="MY">Malaysia</territory>
+ <territory type="MZ">Mozambik</territory>
+ <territory type="NA">Namibia</territory>
+ <territory type="NC">New Caledonia</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Norfolk Island</territory>
+ <territory type="NG">Nigeria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Belanda</territory>
+ <territory type="NO">Norway</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">New Zealand</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">French Polynesia</territory>
+ <territory type="PG">Papua New Guinea</territory>
+ <territory type="PH">Filipina</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Poland</territory>
+ <territory type="PM">Saint Pierre and Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Puerto Rico</territory>
+ <territory type="PS">Palestinian Territory</territory>
+ <territory type="PT">Feringgi</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Qatar</territory>
+ <territory type="RE">Réunion</territory>
+ <territory type="RO">Romania</territory>
+ <territory type="RU">Russia</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Arab Saudi</territory>
+ <territory type="SB">Kepulauan Solomon</territory>
+ <territory type="SC">Seychelles</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Sweden</territory>
+ <territory type="SG">Singapura</territory>
+ <territory type="SH">Saint Helena</territory>
+ <territory type="SI">Slovenia</territory>
+ <territory type="SJ">Svalbard and Jan Mayen</territory>
+ <territory type="SK">Slovakia</territory>
+ <territory type="SL">Siera Leon</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalia</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">Sao Tome dan Principe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Syria</territory>
+ <territory type="SZ">Swaziland</territory>
+ <territory type="TC">Turks and Caicos Islands</territory>
+ <territory type="TD">Cad</territory>
+ <territory type="TF">French Southern Territories</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Thailand</territory>
+ <territory type="TJ">Tadjikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Timor-Leste</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunisia</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turki</territory>
+ <territory type="TT">Trinidad dan Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TZ">Tanzania</territory>
+ <territory type="UA">Ukraine</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">United States Minor Outlying Islands</territory>
+ <territory type="US">Amerika Syarikat</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Uzbekistan</territory>
+ <territory type="VA">Vatican</territory>
+ <territory type="VC">Saint Vincent dan Grenadines</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">British Virgin Islands</territory>
+ <territory type="VI">U.S. Virgin Islands</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis and Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Yaman</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Afrika Selatan</territory>
+ <territory type="ZM">Zambia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a {ai} {au} b-d {dz} e-k {kh} l-n {ng} {ngg} {ny} o-s {sy} t {ts} u {ua} v-z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Jan</month>
+ <month type="2">Feb</month>
+ <month type="3">Mac</month>
+ <month type="4">Apr</month>
+ <month type="5">Mei</month>
+ <month type="6">Jun</month>
+ <month type="7">Jul</month>
+ <month type="8">Ogos</month>
+ <month type="9">Sep</month>
+ <month type="10">Okt</month>
+ <month type="11">Nov</month>
+ <month type="12">Dis</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Januari</month>
+ <month type="2">Februari</month>
+ <month type="3">Mac</month>
+ <month type="4">April</month>
+ <month type="5">Mei</month>
+ <month type="6">Jun</month>
+ <month type="7">Julai</month>
+ <month type="8">Ogos</month>
+ <month type="9">September</month>
+ <month type="10">Oktober</month>
+ <month type="11">November</month>
+ <month type="12">Disember</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Ahd</day>
+ <day type="mon">Isn</day>
+ <day type="tue">Sel</day>
+ <day type="wed">Rab</day>
+ <day type="thu">Kha</day>
+ <day type="fri">Jum</day>
+ <day type="sat">Sab</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Ahad</day>
+ <day type="mon">Isnin</day>
+ <day type="tue">Selasa</day>
+ <day type="wed">Rabu</day>
+ <day type="thu">Khamis</day>
+ <day type="fri">Jumaat</day>
+ <day type="sat">Sabtu</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">S1</quarter>
+ <quarter type="2" draft="unconfirmed">S2</quarter>
+ <quarter type="3" draft="unconfirmed">S3</quarter>
+ <quarter type="4" draft="unconfirmed">S4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">suku pertama</quarter>
+ <quarter type="2" draft="unconfirmed">suku kedua</quarter>
+ <quarter type="3" draft="unconfirmed">suku ketiga</quarter>
+ <quarter type="4" draft="unconfirmed">suku keempat</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">S.M.</era>
+ <era type="1" draft="unconfirmed">T.M.</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="MYR">
+ <displayName>Ringgit Malaysia</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">ya:y</yesstr>
+ <nostr draft="unconfirmed">tidak:t</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ms_BN.xml b/libs/Zend/Locale/Data/ms_BN.xml
new file mode 100755
index 0000000000..8b13e941b9
--- /dev/null
+++ b/libs/Zend/Locale/Data/ms_BN.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.31 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ms"/>
+ <territory type="BN"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss aa</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="Hmm" draft="provisional">H:mm</dateFormatItem>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="BND">
+ <symbol>$</symbol>
+ </currency>
+ <currency type="USD">
+ <symbol>US$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ms_MY.xml b/libs/Zend/Locale/Data/ms_MY.xml
new file mode 100755
index 0000000000..9c5f65b822
--- /dev/null
+++ b/libs/Zend/Locale/Data/ms_MY.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.35 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ms"/>
+ <territory type="MY"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE dd MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/mt.xml b/libs/Zend/Locale/Data/mt.xml
new file mode 100755
index 0000000000..2e735c59ed
--- /dev/null
+++ b/libs/Zend/Locale/Data/mt.xml
@@ -0,0 +1,979 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.55 $"/>
+ <generation date="$Date: 2006/10/26 22:46:09 $"/>
+ <language type="mt"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">Afar</language>
+ <language type="ab">Abkażjan</language>
+ <language type="ace">Aċiniż</language>
+ <language type="ach">Akoli</language>
+ <language type="ada">Adangme</language>
+ <language type="ady">Adyghe</language>
+ <language type="ae">Avestan</language>
+ <language type="af">Afrikans</language>
+ <language type="afa">Afro-Asjatiku (Oħra)</language>
+ <language type="afh">Afriħili</language>
+ <language type="ain">Ajnu</language>
+ <language type="ak">Akan</language>
+ <language type="akk">Akkadjen</language>
+ <language type="ale">Aleut</language>
+ <language type="alg">Lingwi Algonqwinjani</language>
+ <language type="am">Amħariku</language>
+ <language type="an">Aragonese</language>
+ <language type="ang">Ingliż, Antik</language>
+ <language type="apa">Lingwi Apaċi</language>
+ <language type="ar">Għarbi</language>
+ <language type="arc">Aramajk</language>
+ <language type="arn">Arawkanjan</language>
+ <language type="arp">Arapaħo</language>
+ <language type="art">Artifiċjali (Oħra)</language>
+ <language type="arw">Arawak</language>
+ <language type="as">Assamese</language>
+ <language type="ast">Asturian</language>
+ <language type="ath">Lingwi Atabaskani</language>
+ <language type="aus">Lingwi Awstraljani</language>
+ <language type="av">Avarik</language>
+ <language type="awa">Awadħi</language>
+ <language type="ay">Ajmara</language>
+ <language type="az">Ażerbajġani</language>
+ <language type="ba">Baxkir</language>
+ <language type="bad">Banda</language>
+ <language type="bai">Lingwi Bamileke</language>
+ <language type="bal">Baluċi</language>
+ <language type="ban">Baliniż</language>
+ <language type="bas">Basa</language>
+ <language type="bat">Baltiku (Oħra)</language>
+ <language type="be">Belarussu</language>
+ <language type="bej">Beja</language>
+ <language type="bem">Bemba</language>
+ <language type="ber">Beber</language>
+ <language type="bg">Bulgaru</language>
+ <language type="bh">Biħari</language>
+ <language type="bho">Bojpuri</language>
+ <language type="bi">Bislama</language>
+ <language type="bik">Bikol</language>
+ <language type="bin">Bini</language>
+ <language type="bla">Siksika</language>
+ <language type="bm">Bambara</language>
+ <language type="bn">Bengali</language>
+ <language type="bnt">Bantu</language>
+ <language type="bo">Tibetjan</language>
+ <language type="br">Brenton</language>
+ <language type="bra">Braj</language>
+ <language type="bs">Bosnijan</language>
+ <language type="btk">Batak</language>
+ <language type="bua">Burjat</language>
+ <language type="bug">Buginiż</language>
+ <language type="byn">Blin</language>
+ <language type="ca">Katalan</language>
+ <language type="cad">Kaddo</language>
+ <language type="cai">Amerika Ċentrali (Oħra)</language>
+ <language type="car">Karib</language>
+ <language type="cau">Kawkasu (Oħra)</language>
+ <language type="ce">Ċeċen</language>
+ <language type="ceb">Sibwano</language>
+ <language type="cel">Keltiku (Oħra)</language>
+ <language type="ch">ÄŠamorro</language>
+ <language type="chb">Ċibċa</language>
+ <language type="chg">ÄŠagataj</language>
+ <language type="chk">ÄŠukese</language>
+ <language type="chm">Mari</language>
+ <language type="chn">Ġargon taċ-Ċinuk</language>
+ <language type="cho">ÄŠostaw</language>
+ <language type="chp">ÄŠipewjan</language>
+ <language type="chr">ÄŠerokij</language>
+ <language type="chy">Xajenn</language>
+ <language type="cmc">Lingwi ÄŠamiki</language>
+ <language type="co">Korsiku</language>
+ <language type="cop">Koptiku</language>
+ <language type="cpe">Kreoli u Piġini, Bbażat fuq l-Ingliż (Oħra)</language>
+ <language type="cpf">Kreoli u Piġini, Bbażat fuq il-Franċiż (Oħra)</language>
+ <language type="cpp">Kreoli u Piġini, Bbażat fuq il-Portugiż (Oħra)</language>
+ <language type="cr">Krij</language>
+ <language type="crh">Crimean Turkish; Crimean Tatar</language>
+ <language type="crp">Kreoli u Piġini (Oħra)</language>
+ <language type="cs">ÄŠek</language>
+ <language type="csb">Kashubian</language>
+ <language type="cu">Slaviku tal-Knisja</language>
+ <language type="cus">Kuxtiku (Oħra)</language>
+ <language type="cv">ÄŠuvax</language>
+ <language type="cy">Welx</language>
+ <language type="da">Daniż</language>
+ <language type="dak">Dakota</language>
+ <language type="dar">Dargwa</language>
+ <language type="day">Dajak</language>
+ <language type="de">Ġermaniż</language>
+ <language type="del">Delawerjan</language>
+ <language type="den">Slav</language>
+ <language type="dgr">Dogrib</language>
+ <language type="din">Dinka</language>
+ <language type="doi">Dogri</language>
+ <language type="dra">Dravidjan (Oħra)</language>
+ <language type="dsb">Lower Sorbian</language>
+ <language type="dua">Dwala</language>
+ <language type="dum">Olandiż, Medjevali</language>
+ <language type="dv">Diveħi</language>
+ <language type="dyu">Djula</language>
+ <language type="dz">Dżongka</language>
+ <language type="ee">Ewe</language>
+ <language type="efi">Efik</language>
+ <language type="egy">EÄ¡izzjan (Antik)</language>
+ <language type="eka">Ekajuk</language>
+ <language type="el">Grieg</language>
+ <language type="elx">Elamit</language>
+ <language type="en">Ingliż</language>
+ <language type="enm">Ingliż, Medjevali (1100-1500)</language>
+ <language type="eo">Esperanto</language>
+ <language type="es">Spanjol</language>
+ <language type="et">Estonjan</language>
+ <language type="eu">Bask</language>
+ <language type="ewo">Ewondo</language>
+ <language type="fa">Persjan</language>
+ <language type="fan">Fang</language>
+ <language type="fat">Fanti</language>
+ <language type="ff">Fulaħ</language>
+ <language type="fi">Finlandiż</language>
+ <language type="fiu">Finno - Ugrijan</language>
+ <language type="fj">Fiġi</language>
+ <language type="fo">Fawriż</language>
+ <language type="fon">Fon</language>
+ <language type="fr">Franċiż</language>
+ <language type="frm">Franċiż, Medjevali</language>
+ <language type="fro">Franċiż, Antik</language>
+ <language type="fur">Frijuljan</language>
+ <language type="fy">Friżjan</language>
+ <language type="ga">Irlandiż</language>
+ <language type="gaa">Ga</language>
+ <language type="gay">Gajo</language>
+ <language type="gba">Gbaja</language>
+ <language type="gd">Galliku Skoċċiż</language>
+ <language type="gem">Ġermaniku (Oħra)</language>
+ <language type="gez">Geez</language>
+ <language type="gil">Gilbertjan</language>
+ <language type="gl">Gallegjan</language>
+ <language type="gmh">Ä ermaniku, Medjevali Pulit</language>
+ <language type="gn">Gwarani</language>
+ <language type="goh">Ä ermaniku, Antik Pulit</language>
+ <language type="gon">Gondi</language>
+ <language type="gor">Gorontalo</language>
+ <language type="got">Gotiku</language>
+ <language type="grb">Ä erbo</language>
+ <language type="grc">Grieg, Antik (to 1453)</language>
+ <language type="gu">Guġarati</language>
+ <language type="gv">Manks</language>
+ <language type="gwi">Gwiċin</language>
+ <language type="ha">Ħawsa</language>
+ <language type="hai">Ħajda</language>
+ <language type="haw">Ħawajjan</language>
+ <language type="he">Ebrajk</language>
+ <language type="hi">Ħindi</language>
+ <language type="hil">Hiligaynon</language>
+ <language type="him">Ħimaċali</language>
+ <language type="hit">Ħittit</language>
+ <language type="hmn">Ħmong</language>
+ <language type="ho">Ħiri Motu</language>
+ <language type="hr">Kroat</language>
+ <language type="hsb">Upper Sorbian</language>
+ <language type="ht">Haitian</language>
+ <language type="hu">Ungeriż</language>
+ <language type="hup">Ħupa</language>
+ <language type="hy">Armenjan</language>
+ <language type="hz">Ħerero</language>
+ <language type="ia">Interlingua</language>
+ <language type="iba">Iban</language>
+ <language type="id">Indoneżjan</language>
+ <language type="ie">Interlingue</language>
+ <language type="ig">Igbo</language>
+ <language type="ii">Sichuan Yi</language>
+ <language type="ijo">IÄ¡o</language>
+ <language type="ik">Inupjak</language>
+ <language type="ilo">Iloko</language>
+ <language type="inc">Indjan (Oħra)</language>
+ <language type="ine">Indo-Ewropew</language>
+ <language type="inh">Ingush</language>
+ <language type="io">Ido</language>
+ <language type="ira">Iranjan</language>
+ <language type="iro">Lingwi Irogwjani</language>
+ <language type="is">Iżlandiż</language>
+ <language type="it">Taljan</language>
+ <language type="iu">Inukitut</language>
+ <language type="ja">Ġappuniż</language>
+ <language type="jbo">Lojban</language>
+ <language type="jpr">Lhudi-Persjan</language>
+ <language type="jrb">Lhudi-Għarbi</language>
+ <language type="jv">Ġavaniż</language>
+ <language type="ka">Ġorġjan</language>
+ <language type="kaa">Kara-Kalpak</language>
+ <language type="kab">Kabuljan</language>
+ <language type="kac">Kaċin</language>
+ <language type="kam">Kamba</language>
+ <language type="kar">Karen</language>
+ <language type="kaw">Kawi</language>
+ <language type="kbd">Kabardian</language>
+ <language type="kg">Kongo</language>
+ <language type="kha">Kasi</language>
+ <language type="khi">Kojsan</language>
+ <language type="kho">Kotaniż</language>
+ <language type="ki">Kikuju</language>
+ <language type="kj">Kuanyama</language>
+ <language type="kk">Każak</language>
+ <language type="kl">Kalallisut</language>
+ <language type="km">Kmer</language>
+ <language type="kmb">Kimbundu</language>
+ <language type="kn">Kannada</language>
+ <language type="ko">Korejan</language>
+ <language type="kok">Konkani</language>
+ <language type="kos">Kosrejan</language>
+ <language type="kpe">Kpelle</language>
+ <language type="kr">Kanuri</language>
+ <language type="krc">Karachay-Balkar</language>
+ <language type="kro">Kru</language>
+ <language type="kru">Kurusk</language>
+ <language type="ks">Kaxmiri</language>
+ <language type="ku">Kurdiż</language>
+ <language type="kum">Kumiku</language>
+ <language type="kut">Kutenaj</language>
+ <language type="kv">Komi</language>
+ <language type="kw">Korniku</language>
+ <language type="ky">Kirgiż</language>
+ <language type="la">Latin</language>
+ <language type="lad">Ladino</language>
+ <language type="lah">Landa</language>
+ <language type="lam">Lamba</language>
+ <language type="lb">Letżburgiż</language>
+ <language type="lez">Leżgjan</language>
+ <language type="lg">Ganda</language>
+ <language type="li">Limburgish</language>
+ <language type="ln">Lingaljan</language>
+ <language type="lo">Lao</language>
+ <language type="lol">Mongo</language>
+ <language type="loz">Lożi</language>
+ <language type="lt">Litwanjan</language>
+ <language type="lu">Luba-Katanga</language>
+ <language type="lua">Luba-Luluwa</language>
+ <language type="lui">Luwisinuż</language>
+ <language type="lun">Lunda</language>
+ <language type="luo">Luwa</language>
+ <language type="lus">Luxaj</language>
+ <language type="lv">Latvjan (Lettix)</language>
+ <language type="mad">Maduriż</language>
+ <language type="mag">Magaħi</language>
+ <language type="mai">Majtili</language>
+ <language type="mak">Makasar</language>
+ <language type="man">Mandingwan</language>
+ <language type="map">Awstronesjan</language>
+ <language type="mas">Masaj</language>
+ <language type="mdf">Moksha</language>
+ <language type="mdr">Mandar</language>
+ <language type="men">Mende</language>
+ <language type="mg">Malagażi</language>
+ <language type="mga">Irlandiż, Medjevali (900-1200)</language>
+ <language type="mh">Marxall</language>
+ <language type="mi">Maori</language>
+ <language type="mic">Mikmek</language>
+ <language type="min">Minangkabaw</language>
+ <language type="mis">Lingwi Oħra</language>
+ <language type="mk">Maċedonjan</language>
+ <language type="mkh">Mon-Kmer (Oħra)</language>
+ <language type="ml">Malajalam</language>
+ <language type="mn">Mongoljan</language>
+ <language type="mnc">Manċurjan</language>
+ <language type="mni">Manipuri</language>
+ <language type="mno">Lingwi Manobo</language>
+ <language type="mo">Moldavjan</language>
+ <language type="moh">Moħak</language>
+ <language type="mos">Mossi</language>
+ <language type="mr">Marati</language>
+ <language type="ms">Malajan</language>
+ <language type="mt">Malti</language>
+ <language type="mul">Lingwi Diversi</language>
+ <language type="mun">Lingwi tal-Munda</language>
+ <language type="mus">Kriek</language>
+ <language type="mwl">Mirandiż</language>
+ <language type="mwr">Marwari</language>
+ <language type="my">Burmiż</language>
+ <language type="myn">Majan</language>
+ <language type="myv">Erzya</language>
+ <language type="na">Nawuru</language>
+ <language type="nah">Naħwatil</language>
+ <language type="nai">Indjan tal-Amerika ta’ Fuq (Oħra)</language>
+ <language type="nap">Neapolitan</language>
+ <language type="nb">Bokmahal Norveġiż</language>
+ <language type="nd">Ndebele, ta’ Fuq</language>
+ <language type="nds">Ġermaniż Komuni; Sassonu Komuni</language>
+ <language type="ne">Nepaliż</language>
+ <language type="new">Newari</language>
+ <language type="ng">Ndonga</language>
+ <language type="nia">Nijas</language>
+ <language type="nic">Niġerjan - Kordofanjan</language>
+ <language type="niu">Nijuwejan</language>
+ <language type="nl">Olandiż</language>
+ <language type="nn">Ninorsk Norveġiż</language>
+ <language type="no">Norveġiż</language>
+ <language type="nog">Nogai</language>
+ <language type="non">Skandinav, Antik</language>
+ <language type="nr">Ndebele, t’Isfel</language>
+ <language type="nso">Soto, ta’ Fuq</language>
+ <language type="nub">Lingwi Nubjani</language>
+ <language type="nv">Navaħo</language>
+ <language type="nwc">Classical Newari</language>
+ <language type="ny">Ċiċewa; Njanġa</language>
+ <language type="nym">Njamweżi</language>
+ <language type="nyn">Nyankole</language>
+ <language type="nyo">Njoro</language>
+ <language type="nzi">Nżima</language>
+ <language type="oc">Provenzal (wara 1500)</language>
+ <language type="oj">OÄ¡ibwa</language>
+ <language type="om">Oromo (Afan)</language>
+ <language type="or">Orija</language>
+ <language type="os">Ossettiku</language>
+ <language type="osa">Osaġjan</language>
+ <language type="ota">Tork (Imperu Ottoman)</language>
+ <language type="oto">Lingwi Otomjani</language>
+ <language type="pa">Punġabi</language>
+ <language type="paa">Papwan (Oħra)</language>
+ <language type="pag">Pangasinjan</language>
+ <language type="pal">Paħlavi</language>
+ <language type="pam">Pampamga</language>
+ <language type="pap">Papjamento</language>
+ <language type="pau">Palawjan</language>
+ <language type="peo">Persjan Antik</language>
+ <language type="phi">Filippin (Oħra)</language>
+ <language type="phn">Feniċju</language>
+ <language type="pi">Pali</language>
+ <language type="pl">Pollakk</language>
+ <language type="pon">Ponpejan</language>
+ <language type="pra">Lingwi Prakriti</language>
+ <language type="pro">Provenzal, Antik (sa l-1500)</language>
+ <language type="ps">Paxtun</language>
+ <language type="pt">Portugiż</language>
+ <language type="qu">Keċwa</language>
+ <language type="raj">Raġastani</language>
+ <language type="rap">Rapanwi</language>
+ <language type="rar">Rarotongani</language>
+ <language type="rm">Reto-Romanz</language>
+ <language type="rn">Rundi</language>
+ <language type="ro">Rumen</language>
+ <language type="roa">Romanz (Oħra)</language>
+ <language type="rom">Żingaru</language>
+ <language type="root">Għerq</language>
+ <language type="ru">Russu</language>
+ <language type="rup">Aromanijan</language>
+ <language type="rw">Kinjarwanda</language>
+ <language type="sa">Sanskrit</language>
+ <language type="sad">Sandawe</language>
+ <language type="sah">Jakut</language>
+ <language type="sai">Indjan tal-Amerika t’Isfel (Oħra)</language>
+ <language type="sal">Salixan</language>
+ <language type="sam">Samritan</language>
+ <language type="sas">Saska</language>
+ <language type="sat">Santali</language>
+ <language type="sc">Sardinjan</language>
+ <language type="sco">Skoċċiż</language>
+ <language type="sd">Sindi</language>
+ <language type="se">Sami ta’ Fuq</language>
+ <language type="sel">Selkup</language>
+ <language type="sem">Semitiku</language>
+ <language type="sg">Sango</language>
+ <language type="sga">Irlandiż, Antik (sa l-900)</language>
+ <language type="sgn">Lingwa tas-Sinjali</language>
+ <language type="sh">Serbo-Kroat</language>
+ <language type="shn">Xan</language>
+ <language type="si">Sinħaliż</language>
+ <language type="sid">Sidamo</language>
+ <language type="sio">Lingwi Suwjani</language>
+ <language type="sit">Sino-Tibetjani (Oħra)</language>
+ <language type="sk">Slovakk</language>
+ <language type="sl">Sloven</language>
+ <language type="sla">Slavic (Other)</language>
+ <language type="sm">Samojan</language>
+ <language type="sma">Southern Sami</language>
+ <language type="smi">Sami languages (Other)</language>
+ <language type="smj">Lule Sami</language>
+ <language type="smn">Inari Sami</language>
+ <language type="sms">Skolt Sami</language>
+ <language type="sn">Xona</language>
+ <language type="snk">Soninke</language>
+ <language type="so">Somali</language>
+ <language type="sog">Sogdien</language>
+ <language type="son">Songaj</language>
+ <language type="sq">Albaniż</language>
+ <language type="sr">Serb</language>
+ <language type="srr">Serer</language>
+ <language type="ss">Swati</language>
+ <language type="ssa">Nilo-Saħaram</language>
+ <language type="st">Soto, t’Isfel</language>
+ <language type="su">Sundaniż</language>
+ <language type="suk">Sukuma</language>
+ <language type="sus">Susu</language>
+ <language type="sux">Sumerjan</language>
+ <language type="sv">Svediż</language>
+ <language type="sw">Swaħili</language>
+ <language type="syr">Sirjan</language>
+ <language type="ta">Tamil</language>
+ <language type="tai">Tai (Oħra)</language>
+ <language type="te">Telugu</language>
+ <language type="tem">Timne</language>
+ <language type="ter">Tereno</language>
+ <language type="tet">Tetum</language>
+ <language type="tg">Taġik</language>
+ <language type="th">Tajlandiż</language>
+ <language type="ti">Tigrinja</language>
+ <language type="tig">Tigre</language>
+ <language type="tiv">Tiv</language>
+ <language type="tk">Turkmeni</language>
+ <language type="tkl">Tokelau</language>
+ <language type="tl">Tagalog</language>
+ <language type="tlh">Klingon</language>
+ <language type="tli">Tlingit</language>
+ <language type="tmh">Tamaxek</language>
+ <language type="tn">Zwana</language>
+ <language type="to">Tongan (Gżejjer ta’ Tonga)</language>
+ <language type="tog">Tonga (Njasa)</language>
+ <language type="tpi">Tok Pisin</language>
+ <language type="tr">Tork</language>
+ <language type="ts">Tsonga</language>
+ <language type="tsi">Zimxjan</language>
+ <language type="tt">Tatar</language>
+ <language type="tum">Tumbuka</language>
+ <language type="tup">Tupi languages</language>
+ <language type="tut">Altajk (Oħra)</language>
+ <language type="tvl">Tuvalu</language>
+ <language type="tw">Twi</language>
+ <language type="ty">Taħitjan</language>
+ <language type="tyv">Tuvinjan</language>
+ <language type="udm">Udmurt</language>
+ <language type="ug">Wigur</language>
+ <language type="uga">Ugaritiku</language>
+ <language type="uk">Ukranjan</language>
+ <language type="umb">Umbundu</language>
+ <language type="und">Indeterminat</language>
+ <language type="ur">Urdu</language>
+ <language type="uz">Użbek</language>
+ <language type="vai">Vai</language>
+ <language type="ve">Venda</language>
+ <language type="vi">Vjetnamiż</language>
+ <language type="vo">Volapuk</language>
+ <language type="vot">Votik</language>
+ <language type="wa">Walloon</language>
+ <language type="wak">Lingwi Wakaxani</language>
+ <language type="wal">Walamo</language>
+ <language type="war">Waraj</language>
+ <language type="was">Waxo</language>
+ <language type="wen">Lingwi Sorbjani</language>
+ <language type="wo">Wolof</language>
+ <language type="xal">Kalmyk</language>
+ <language type="xh">Ħoża</language>
+ <language type="yao">Jao</language>
+ <language type="yap">Japese</language>
+ <language type="yi">Jiddix</language>
+ <language type="yo">Joruba</language>
+ <language type="ypk">Lingwi Jupiċi</language>
+ <language type="za">Żwang</language>
+ <language type="zap">Żapotek</language>
+ <language type="zen">Żenaga</language>
+ <language type="zh">Ċiniż</language>
+ <language type="znd">Żande</language>
+ <language type="zu">Żulu</language>
+ <language type="zun">Żuni</language>
+ </languages>
+ <scripts>
+ <script type="Arab">Għarbi</script>
+ <script type="Hans">Ħan Sempliċi</script>
+ <script type="Hant">Ħan Tradizzjonali</script>
+ <script type="Latn">Latin</script>
+ <script type="Xpeo">Persjan Antik</script>
+ <script type="Zyyy">Komuni</script>
+ </scripts>
+ <territories>
+ <territory type="001">Dinja</territory>
+ <territory type="002">Affrika</territory>
+ <territory type="003" draft="unconfirmed">Amerika ta’ Fuq</territory>
+ <territory type="005">Amerika t’Isfel</territory>
+ <territory type="009">OÄ‹ejanja</territory>
+ <territory type="011">Affrika tal-Punent</territory>
+ <territory type="013">Amerika ÄŠentrali</territory>
+ <territory type="014">Affrika tal-Lvant</territory>
+ <territory type="015">Affrika ta’ Fuq</territory>
+ <territory type="017">Affrika Nofsani</territory>
+ <territory type="018">Affrika t’Isfel</territory>
+ <territory type="019">Amerika</territory>
+ <territory type="021" draft="unconfirmed">Amerika Nòrdiku</territory>
+ <territory type="029">Karibew</territory>
+ <territory type="030">Asja tal-Lvant</territory>
+ <territory type="034">Asja t’Isfel Ċentrali</territory>
+ <territory type="035">Asja tax-Xlokk</territory>
+ <territory type="039">Ewropa t’Isfel</territory>
+ <territory type="053">Awstralja u New Zealand</territory>
+ <territory type="054">Melanesja</territory>
+ <territory type="057" draft="unconfirmed">Żona ta’ Mikronesja</territory>
+ <territory type="061">Polinesja</territory>
+ <territory type="142">Asja</territory>
+ <territory type="145">Asja tal-Punent</territory>
+ <territory type="150">Ewropa</territory>
+ <territory type="151">Ewropa tal-Lvant</territory>
+ <territory type="154">Ewropa ta’ Fuq</territory>
+ <territory type="155">Ewropa tal-Punent</territory>
+ <territory type="172">Commonwealth tal-Istati Independenti</territory>
+ <territory type="419">Amerika Latina u l-Karibew</territory>
+ <territory type="830" draft="unconfirmed">Channel Islands</territory>
+ <territory type="IM">Isle of Man</territory>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Emirati Għarab Maqgħuda</territory>
+ <territory type="AF">Afganistan</territory>
+ <territory type="AG">Antigua and Barbuda</territory>
+ <territory type="AI">Angwilla</territory>
+ <territory type="AL">Albanija</territory>
+ <territory type="AM">Armenja</territory>
+ <territory type="AN">Antilles Olandiżi</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antartika</territory>
+ <territory type="AR">Arġentina</territory>
+ <territory type="AS">Samoa Amerikana</territory>
+ <territory type="AT">Awstrija</territory>
+ <territory type="AU">Awstralja</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AZ">Ażerbajġan</territory>
+ <territory type="BA">Bożnija Ħerżegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladexx</territory>
+ <territory type="BE">Belġju</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgarija</territory>
+ <territory type="BH">Baħrajn</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunej</territory>
+ <territory type="BO">Bolivja</territory>
+ <territory type="BR">Brażil</territory>
+ <territory type="BS">Baħamas</territory>
+ <territory type="BT">Butan</territory>
+ <territory type="BV">Bouvet Island</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Bjelorussja</territory>
+ <territory type="BZ">Beliże</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Cocos (Keeling) Islands</territory>
+ <territory type="CD">Democratic Republic of the Congo</territory>
+ <territory type="CF">Repubblika Afrikana ÄŠentrali</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Svizzera</territory>
+ <territory type="CI">Kosta ta’ l-Avorju</territory>
+ <territory type="CK">Cook Islands</territory>
+ <territory type="CL">ÄŠili</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">ÄŠina</territory>
+ <territory type="CO">Kolumbja</territory>
+ <territory type="CR">Kosta Rika</territory>
+ <territory type="CS">Serbja u Montenegro</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Kape Verde</territory>
+ <territory type="CX">Christmas Island</territory>
+ <territory type="CY">ÄŠipru</territory>
+ <territory type="CZ">Repubblika ÄŠeka</territory>
+ <territory type="DE">Ä ermanja</territory>
+ <territory type="DJ">Ä ibuti</territory>
+ <territory type="DK">Danimarka</territory>
+ <territory type="DM">Dominika</territory>
+ <territory type="DO">Republikka Domenikana</territory>
+ <territory type="DZ">Alġerija</territory>
+ <territory type="EC">Ekwador</territory>
+ <territory type="EE">Estonja</territory>
+ <territory type="EG">EÄ¡ittu</territory>
+ <territory type="EH">Sahara tal-Punent</territory>
+ <territory type="ER">Eritreja</territory>
+ <territory type="ES">Spanja</territory>
+ <territory type="ET">Etijopja</territory>
+ <territory type="FI">Finlandja</territory>
+ <territory type="FJ">Fiġi</territory>
+ <territory type="FK">Falkland Islands</territory>
+ <territory type="FM">Mikronesja</territory>
+ <territory type="FO">Gżejjer Faroe</territory>
+ <territory type="FR">Franza</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Ingilterra</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Ġorġja</territory>
+ <territory type="GF">Gujana Franċiża</territory>
+ <territory type="GH">Gana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Grinlandja</territory>
+ <territory type="GM">Gambja</territory>
+ <territory type="GN">Gineja</territory>
+ <territory type="GP">Gwadelupe</territory>
+ <territory type="GQ">Ginea Ekwatorjali</territory>
+ <territory type="GR">Greċja</territory>
+ <territory type="GS">South Georgia and the South Sandwich Islands</territory>
+ <territory type="GT">Gwatemala</territory>
+ <territory type="GU">Gwam</territory>
+ <territory type="GW">Ginea-Bissaw</territory>
+ <territory type="GY">Gujana</territory>
+ <territory type="HK">Ħong Kong S.A.R., Ċina</territory>
+ <territory type="HM">Heard Island and McDonald Islands</territory>
+ <territory type="HN">Ħonduras</territory>
+ <territory type="HR">Kroazja</territory>
+ <territory type="HT">Ħaiti</territory>
+ <territory type="HU">Ungerija</territory>
+ <territory type="ID">Indoneżja</territory>
+ <territory type="IE">Irlanda</territory>
+ <territory type="IL">Iżrael</territory>
+ <territory type="IN">Indja</territory>
+ <territory type="IO">British Indian Ocean Territory</territory>
+ <territory type="IQ">Iraq</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Islanda</territory>
+ <territory type="IT">Italja</territory>
+ <territory type="JM">Ä amajka</territory>
+ <territory type="JO">Ä ordan</territory>
+ <territory type="JP">Ä appun</territory>
+ <territory type="KE">Kenja</territory>
+ <territory type="KG">Kirgistan</territory>
+ <territory type="KH">Kambodja</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komoros</territory>
+ <territory type="KN">Saint Kitts and Nevis</territory>
+ <territory type="KP">Koreja ta’ Fuq</territory>
+ <territory type="KR">Koreja t’Isfel</territory>
+ <territory type="KW">Kuwajt</territory>
+ <territory type="KY">Cayman Islands</territory>
+ <territory type="KZ">Każakstan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Libanu</territory>
+ <territory type="LC">Santa Luċija</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberja</territory>
+ <territory type="LS">Lesoto</territory>
+ <territory type="LT">Litwanja</territory>
+ <territory type="LU">Lussemburgu</territory>
+ <territory type="LV">Latvja</territory>
+ <territory type="LY">Libja</territory>
+ <territory type="MA">Marokk</territory>
+ <territory type="MC">Monako</territory>
+ <territory type="MD">Maldova</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Gżejjer ta’ Marshall</territory>
+ <territory type="MK">Maċedonja</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Mjanmar</territory>
+ <territory type="MN">Mongolja</territory>
+ <territory type="MO">Macao S.A.R., China</territory>
+ <territory type="MP">Gżejjer Marjana ta’ Fuq</territory>
+ <territory type="MQ">Martinik</territory>
+ <territory type="MR">Mawritanja</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mawrizju</territory>
+ <territory type="MV">Maldives</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Messiku</territory>
+ <territory type="MY">Malasja</territory>
+ <territory type="MZ">Możambik</territory>
+ <territory type="NA">Namibja</territory>
+ <territory type="NC">New Caledonia</territory>
+ <territory type="NE">Niġer</territory>
+ <territory type="NF">Norfolk Island</territory>
+ <territory type="NG">Niġerja</territory>
+ <territory type="NI">Nikaragwa</territory>
+ <territory type="NL">Olanda</territory>
+ <territory type="NO">Norveġja</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">New Zealand</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Polinesja Franċiża</territory>
+ <territory type="PG">Papwa-Ginea Ä dida</territory>
+ <territory type="PH">Filippini</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Polonja</territory>
+ <territory type="PM">Saint Pierre and Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Puerto Rico</territory>
+ <territory type="PS">Palestinian Territory</territory>
+ <territory type="PT">Portugall</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paragwaj</territory>
+ <territory type="QA">Qatar</territory>
+ <territory type="RE">Réunion</territory>
+ <territory type="RO">Rumanija</territory>
+ <territory type="RU">Russja</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Għarabja Sawdita</territory>
+ <territory type="SB">Solomon Islands</territory>
+ <territory type="SC">Seychelles</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Żvezja</territory>
+ <territory type="SG">Singapor</territory>
+ <territory type="SH">Saint Helena</territory>
+ <territory type="SI">Slovenja</territory>
+ <territory type="SJ">Svalbard and Jan Mayen</territory>
+ <territory type="SK">Slovakkja</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalja</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">Sao Tome and Principe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Sirja</territory>
+ <territory type="SZ">Sważiland</territory>
+ <territory type="TC">Turks and Caicos Islands</territory>
+ <territory type="TD">ÄŠad</territory>
+ <territory type="TF">Territorji Franċiżi ta’ Nofsinhar</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Tajlandja</territory>
+ <territory type="TJ">Taġikistan</territory>
+ <territory type="TK">Tokelaw</territory>
+ <territory type="TL">Timor tal-Lvant</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tuneż</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turkija</territory>
+ <territory type="TT">Trinidad u Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Tajwan</territory>
+ <territory type="TZ">Tanżanija</territory>
+ <territory type="UA">Ukraina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">United States Minor Outlying Islands</territory>
+ <territory type="US">Stati Uniti</territory>
+ <territory type="UY">Urugwaj</territory>
+ <territory type="UZ">Użbekistan</territory>
+ <territory type="VA">Vatikan</territory>
+ <territory type="VC">Saint Vincent and the Grenadines</territory>
+ <territory type="VE">Venezwela</territory>
+ <territory type="VG">British Virgin Islands</territory>
+ <territory type="VI">U.S. Virgin Islands</territory>
+ <territory type="VN">Vjetnam</territory>
+ <territory type="VU">Vanwatu</territory>
+ <territory type="WF">Wallis and Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="YT">Majotte</territory>
+ <territory type="ZA">Afrika t’Isfel</territory>
+ <territory type="ZM">Żambja</territory>
+ <territory type="ZW">Żimbabwe</territory>
+ </territories>
+ <variants>
+ <variant type="REVISED">Ortografija Irriveda</variant>
+ </variants>
+ <keys>
+ <key type="calendar">Kalendarju</key>
+ <key type="collation">Kollazjoni</key>
+ <key type="currency">Munita</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">Ordni Ċiniż Tradizzjonali (Big5)</type>
+ <type type="buddhist" key="calendar">Kalendarju Buddist</type>
+ <type type="chinese" key="calendar">Kalendarju Ċiniż</type>
+ <type type="direct" key="collation">Ordni Diretta</type>
+ <type type="gb2312han" key="collation">Ordni Ċiniż Sempliċi (GB2312)</type>
+ <type type="gregorian" key="calendar">Kalendarju Gregorjan</type>
+ <type type="hebrew" key="calendar">Kalendarju Ebrajk</type>
+ <type type="islamic" key="calendar">Kalendarju Islamiku</type>
+ <type type="islamic-civil" key="calendar">Kalendarju Islamiku-ÄŠivili</type>
+ <type type="japanese" key="calendar">Kalendarju Ġappuniż</type>
+ <type type="phonebook" key="collation">Ordni Telefonika</type>
+ <type type="pinyin" key="collation">Ordni tal-Pinjin</type>
+ <type type="stroke" key="collation">Ordni Maħżuża</type>
+ <type type="traditional" key="collation">Tradizzjonali</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="metric">Metriku</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a à b ċ d e è f ġ g {għ} h ħ i ì j-o ò p-u ù v-x ż z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[c y]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Jan</month>
+ <month type="2">Fra</month>
+ <month type="3">Mar</month>
+ <month type="4">Apr</month>
+ <month type="5">Mej</month>
+ <month type="6">Ä un</month>
+ <month type="7">Lul</month>
+ <month type="8">Awi</month>
+ <month type="9">Set</month>
+ <month type="10">Ott</month>
+ <month type="11">Nov</month>
+ <month type="12">Diċ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Jannar</month>
+ <month type="2">Frar</month>
+ <month type="3">Marzu</month>
+ <month type="4">April</month>
+ <month type="5">Mejju</month>
+ <month type="6">Ä unju</month>
+ <month type="7">Lulju</month>
+ <month type="8">Awissu</month>
+ <month type="9">Settembru</month>
+ <month type="10">Ottubru</month>
+ <month type="11">Novembru</month>
+ <month type="12">Diċembru</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Ħad</day>
+ <day type="mon">Tne</day>
+ <day type="tue">Tli</day>
+ <day type="wed">Erb</day>
+ <day type="thu">Ħam</day>
+ <day type="fri">Ä im</day>
+ <day type="sat">Sib</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" references="R01">Il-Ħadd</day>
+ <day type="mon">It-Tnejn</day>
+ <day type="tue">It-Tlieta</day>
+ <day type="wed">L-Erbgħa</day>
+ <day type="thu">Il-Ħamis</day>
+ <day type="fri">Il-Ġimgħa</day>
+ <day type="sat">Is-Sibt</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">Ħ</day>
+ <day type="mon">T</day>
+ <day type="tue">T</day>
+ <day type="wed">E</day>
+ <day type="thu">Ħ</day>
+ <day type="fri">Ä </day>
+ <day type="sat">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">K1</quarter>
+ <quarter type="2">K2</quarter>
+ <quarter type="3">K3</quarter>
+ <quarter type="4">K4</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>QN</am>
+ <pm>WN</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">QK</era>
+ <era type="1">WK</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d 'ta’' MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d 'ta’' MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d 'ta’' MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMM" draft="provisional">MMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName>Epoka</displayName>
+ </field>
+ <field type="year">
+ <displayName>Sena</displayName>
+ </field>
+ <field type="month">
+ <displayName>Xahar</displayName>
+ </field>
+ <field type="week">
+ <displayName>Ġimgħa</displayName>
+ </field>
+ <field type="day">
+ <displayName>Jum</displayName>
+ </field>
+ <field type="hour">
+ <displayName>Siegħa</displayName>
+ </field>
+ <field type="minute">
+ <displayName>Minuta</displayName>
+ </field>
+ <field type="second">
+ <displayName>Sekonda</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Europe/London">
+ <exemplarCity>Londra</exemplarCity>
+ </zone>
+ <zone type="Europe/Malta">
+ <long>
+ <standard>Ħin Ċentrali Ewropew</standard>
+ <daylight>Ħin Ċentrali Ewropew tas-Sajf</daylight>
+ </long>
+ <short>
+ <standard>CET</standard>
+ <daylight>CEST</daylight>
+ </short>
+ <exemplarCity>Valletta</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="EUR">
+ <displayName>Ewro</displayName>
+ </currency>
+ <currency type="MTL">
+ <displayName>Lira Maltija</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>iva:i</yesstr>
+ <nostr>le:l</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="R01" uri="http://www.msa.org.mt/standards/standards.htm">MSA 200:2003</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/mt_MT.xml b/libs/Zend/Locale/Data/mt_MT.xml
new file mode 100755
index 0000000000..499babd3f9
--- /dev/null
+++ b/libs/Zend/Locale/Data/mt_MT.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="mt"/>
+ <territory type="MT"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/nb.xml b/libs/Zend/Locale/Data/nb.xml
new file mode 100755
index 0000000000..55a020b49e
--- /dev/null
+++ b/libs/Zend/Locale/Data/nb.xml
@@ -0,0 +1,2077 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.70 $"/>
+ <generation date="$Date: 2006/08/04 21:50:50 $"/>
+ <language type="nb"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">afar</language>
+ <language type="ab">abkhasisk</language>
+ <language type="ace">achinesisk</language>
+ <language type="ach">acoli</language>
+ <language type="ada">adangme</language>
+ <language type="ady">adyghe</language>
+ <language type="ae">avestisk</language>
+ <language type="af">afrikaans</language>
+ <language type="afa" draft="provisional">afroasiatisk språk (annet)</language>
+ <language type="afh">afrihili</language>
+ <language type="ain">ainu</language>
+ <language type="ak">akan</language>
+ <language type="akk">akkadisk</language>
+ <language type="ale">aleutisk</language>
+ <language type="alg">algonkinsk språk</language>
+ <language type="alt">søraltaisk</language>
+ <language type="am">amharisk</language>
+ <language type="an">aragonsk</language>
+ <language type="ang">gammelengelsk (ca. 450-1100)</language>
+ <language type="ang" alt="proposed-u219-1" draft="unconfirmed">gammelengelsk (c:a 450-1100)</language>
+ <language type="anp">angika</language>
+ <language type="apa">apache-språk</language>
+ <language type="ar">arabisk</language>
+ <language type="arc">arameisk</language>
+ <language type="arn">araukansk</language>
+ <language type="arp">arapaho</language>
+ <language type="art">kunstig (annet)</language>
+ <language type="arw">arawak</language>
+ <language type="as">assamisk</language>
+ <language type="ast">asturisk</language>
+ <language type="ath">athapaskansk språk</language>
+ <language type="aus">australsk språk</language>
+ <language type="av">avarisk</language>
+ <language type="awa">awadhi</language>
+ <language type="ay">aymara</language>
+ <language type="az">aserbajdsjansk</language>
+ <language type="ba">basjkirsk</language>
+ <language type="bad">banda</language>
+ <language type="bai">bamilekisk språk</language>
+ <language type="bal">baluchi</language>
+ <language type="ban">balinesisk</language>
+ <language type="bas">basa</language>
+ <language type="bat" draft="provisional">baltisk språk (annet)</language>
+ <language type="be">hviterussisk</language>
+ <language type="bej">beja</language>
+ <language type="bem">bemba</language>
+ <language type="ber" draft="provisional">berbisk</language>
+ <language type="bg">bulgarsk</language>
+ <language type="bh">bihari</language>
+ <language type="bho">bhojpuri</language>
+ <language type="bi">bislama</language>
+ <language type="bik">bikol</language>
+ <language type="bin">bini</language>
+ <language type="bla">siksika</language>
+ <language type="bm">bambara</language>
+ <language type="bn">bengali</language>
+ <language type="bnt">bantu</language>
+ <language type="bo">tibetansk</language>
+ <language type="br">bretonsk</language>
+ <language type="bra">braj</language>
+ <language type="bs">bosnisk</language>
+ <language type="btk">batak (Indonesia)</language>
+ <language type="bua">buriat</language>
+ <language type="bug">buginesisk</language>
+ <language type="byn">blin</language>
+ <language type="ca">katalansk</language>
+ <language type="cad">caddo</language>
+ <language type="cai" draft="provisional">sentralamerikansk indiansk språk (annet)</language>
+ <language type="car">karibisk</language>
+ <language type="cau" draft="provisional">kaukasisk språk (annet)</language>
+ <language type="ce">tsjetsjensk</language>
+ <language type="ceb">cebuansk</language>
+ <language type="cel" draft="provisional">keltisk språk (annet)</language>
+ <language type="ch">chamorro</language>
+ <language type="chb">chibcha</language>
+ <language type="chg">chagatai</language>
+ <language type="chk">chuukesisk</language>
+ <language type="chm">mari</language>
+ <language type="chn">chinook</language>
+ <language type="cho">choctaw</language>
+ <language type="chp">chipewiansk</language>
+ <language type="chr">cherokee</language>
+ <language type="chy">cheyenne</language>
+ <language type="cmc">kamisk språk</language>
+ <language type="co">korsikansk</language>
+ <language type="cop">koptisk</language>
+ <language type="cpe">kreolsk og pidgin, engelskbasert (annet)</language>
+ <language type="cpf">kreolsk og pidgin, franskbasert (annet)</language>
+ <language type="cpp">kreolsk og pidgin, portugisiskbasert (annet)</language>
+ <language type="cr">cree</language>
+ <language type="crh">krimtatarisk</language>
+ <language type="crp">kreolsk og pidgin (annet)</language>
+ <language type="cs">tsjekkisk</language>
+ <language type="csb">kasjubisk</language>
+ <language type="cu">kirkeslavisk</language>
+ <language type="cus" draft="provisional">kusjitisk språk (annet)</language>
+ <language type="cv">tsjuvansk</language>
+ <language type="cy">walisisk</language>
+ <language type="da">dansk</language>
+ <language type="dak">dakota</language>
+ <language type="dar">dargwa</language>
+ <language type="day">dayak</language>
+ <language type="de">tysk</language>
+ <language type="del">delaware</language>
+ <language type="den" draft="provisional">slavej</language>
+ <language type="dgr">dogrib</language>
+ <language type="din">dinka</language>
+ <language type="doi">dogri</language>
+ <language type="dra" draft="provisional">dravidisk språk (annet)</language>
+ <language type="dsb">lavsorbisk</language>
+ <language type="dua">duala</language>
+ <language type="dum">mellomnederlandsk (ca. 1050-1350)</language>
+ <language type="dv">divehi</language>
+ <language type="dyu">dyula</language>
+ <language type="dz">dzongkha</language>
+ <language type="ee">ewe</language>
+ <language type="efi">efik</language>
+ <language type="egy">egyptisk (historisk)</language>
+ <language type="eka">ekajuk</language>
+ <language type="el">gresk</language>
+ <language type="elx">elamittisk</language>
+ <language type="en">engelsk</language>
+ <language type="enm">mellomengelsk (1100-1500)</language>
+ <language type="eo">esperanto</language>
+ <language type="es">spansk</language>
+ <language type="et">estisk</language>
+ <language type="eu">baskisk</language>
+ <language type="ewo">ewondo</language>
+ <language type="fa">persisk</language>
+ <language type="fan">fang</language>
+ <language type="fat">fanti</language>
+ <language type="ff">fulani</language>
+ <language type="fi">finsk</language>
+ <language type="fil">filippinsk</language>
+ <language type="fil" alt="proposed-u124-1" draft="unconfirmed">filipinsk</language>
+ <language type="fiu" draft="provisional">finsk-ugrisk språk (annet)</language>
+ <language type="fj">fijiansk</language>
+ <language type="fo">færøysk</language>
+ <language type="fon">fon</language>
+ <language type="fr">fransk</language>
+ <language type="frm">mellomfransk (ca.1400-1600)</language>
+ <language type="frm" alt="proposed-u219-1" draft="unconfirmed">mellomfransk (c:a 1400-1600)</language>
+ <language type="fro">gammelfransk (842 til ca.1400)</language>
+ <language type="fro" alt="proposed-u219-1" draft="unconfirmed">gammelfransk (842 til c:a1400)</language>
+ <language type="frr">nordfrisisk</language>
+ <language type="frs">østfrisisk</language>
+ <language type="fur">friuliansk</language>
+ <language type="fy" draft="unconfirmed">vestfrisisk</language>
+ <language type="ga">irsk</language>
+ <language type="gaa">ga</language>
+ <language type="gay">gayo</language>
+ <language type="gba">gbaya</language>
+ <language type="gd">skotsk gælisk</language>
+ <language type="gem" draft="provisional">germansk språk (annet)</language>
+ <language type="gez">ges</language>
+ <language type="gil">kiribatisk; gilbertesisk</language>
+ <language type="gl">galicisk</language>
+ <language type="gmh">mellomhøytysk (ca.1050-1500)</language>
+ <language type="gmh" alt="proposed-u219-1" draft="unconfirmed">mellomhøytysk (c:a 1050-1500)</language>
+ <language type="gn">guarani</language>
+ <language type="goh">gammelhøytysk (ca.750-1050)</language>
+ <language type="goh" alt="proposed-u219-1" draft="unconfirmed">gammelhøytysk (c:a 750-1050)</language>
+ <language type="gon">gondi</language>
+ <language type="gor">gorontalo</language>
+ <language type="got">gotisk</language>
+ <language type="grb">grebo</language>
+ <language type="grc">gammelgresk (til 1453)</language>
+ <language type="gsw">sveitsertysk</language>
+ <language type="gu">gujarati</language>
+ <language type="gv">manx</language>
+ <language type="gwi">gwichin</language>
+ <language type="ha">hausa</language>
+ <language type="hai">haida</language>
+ <language type="haw">hawaiisk</language>
+ <language type="he">hebraisk</language>
+ <language type="hi">hindi</language>
+ <language type="hil">hiligaynon</language>
+ <language type="him">himachali</language>
+ <language type="hit">hettittisk</language>
+ <language type="hmn">hmong</language>
+ <language type="ho">hiri motu</language>
+ <language type="hr">kroatisk</language>
+ <language type="hsb">høysorbisk</language>
+ <language type="ht">haitisk</language>
+ <language type="hu">ungarsk</language>
+ <language type="hup">hupa</language>
+ <language type="hy">armensk</language>
+ <language type="hz">herero</language>
+ <language type="ia">interlingua</language>
+ <language type="iba">iban</language>
+ <language type="id">indonesisk</language>
+ <language type="ie">interlingue</language>
+ <language type="ig">ibo</language>
+ <language type="ii">sichuan-yi</language>
+ <language type="ijo">ijo</language>
+ <language type="ik">unupiak</language>
+ <language type="ilo">iloko</language>
+ <language type="inc" draft="provisional">indisk språk (annet)</language>
+ <language type="ine" draft="provisional">indoeuropeisk språk (annet)</language>
+ <language type="inh">ingusjisk</language>
+ <language type="io">ido</language>
+ <language type="ira">iransk</language>
+ <language type="iro">irokansk språk</language>
+ <language type="is">islandsk</language>
+ <language type="it">italiensk</language>
+ <language type="iu">inuktitut</language>
+ <language type="ja">japansk</language>
+ <language type="jbo">lojban</language>
+ <language type="jpr">jødepersisk</language>
+ <language type="jrb">jødearabisk</language>
+ <language type="jv">javanesisk</language>
+ <language type="ka">georgisk</language>
+ <language type="kaa">karakalpakisk</language>
+ <language type="kab">kabylsk</language>
+ <language type="kac">kachin</language>
+ <language type="kam">kamba</language>
+ <language type="kar">karensk</language>
+ <language type="kaw">kawi</language>
+ <language type="kbd">kabardisk</language>
+ <language type="kg">kikongo</language>
+ <language type="kha">khasi</language>
+ <language type="khi">khoisanspråk (annet)</language>
+ <language type="kho">khotanesisk</language>
+ <language type="ki">kikuyu</language>
+ <language type="kj">kuanyama</language>
+ <language type="kk">kasakhisk</language>
+ <language type="kl" draft="unconfirmed">kalaallisut; grønlandsk</language>
+ <language type="km">khmer</language>
+ <language type="kmb">kimbundu</language>
+ <language type="kn">kannada</language>
+ <language type="ko">koreansk</language>
+ <language type="kok">konkani</language>
+ <language type="kos">kosraeansk</language>
+ <language type="kpe">kpelle</language>
+ <language type="kr">kanuri</language>
+ <language type="krc">karachay-balkar</language>
+ <language type="krl">karelsk</language>
+ <language type="kro">kru</language>
+ <language type="kru">kurukh</language>
+ <language type="ks">kasjmiri</language>
+ <language type="ku">kurdisk</language>
+ <language type="kum">kumyk</language>
+ <language type="kut">kutenai</language>
+ <language type="kv">komi</language>
+ <language type="kw">kornisk</language>
+ <language type="ky">kirgisisk</language>
+ <language type="la">latin</language>
+ <language type="lad">ladinsk</language>
+ <language type="lah">lahnda</language>
+ <language type="lam">lamba</language>
+ <language type="lb">luxemburgsk</language>
+ <language type="lez">lezghian</language>
+ <language type="lg">ganda</language>
+ <language type="li">limburgisk</language>
+ <language type="ln">lingala</language>
+ <language type="lo">laotisk</language>
+ <language type="lol">mongo</language>
+ <language type="loz">lozi</language>
+ <language type="lt">litauisk</language>
+ <language type="lu">luba-katanga</language>
+ <language type="lua">luba-lulua</language>
+ <language type="lui">luiseno</language>
+ <language type="lun">lunda</language>
+ <language type="luo">luo</language>
+ <language type="lus">lushai</language>
+ <language type="lv">latvisk</language>
+ <language type="mad">maduresisk</language>
+ <language type="mag">magahi</language>
+ <language type="mai">maithili</language>
+ <language type="mak">makasar</language>
+ <language type="man">mandingo</language>
+ <language type="map">austronesisk</language>
+ <language type="mas">masai</language>
+ <language type="mdf">moksha</language>
+ <language type="mdr">mandar</language>
+ <language type="men">mende</language>
+ <language type="mg">madagassisk</language>
+ <language type="mga">mellomirsk (900-1200)</language>
+ <language type="mh">marshallesisk</language>
+ <language type="mi">maori</language>
+ <language type="mic">micmac</language>
+ <language type="min">minangkabau</language>
+ <language type="mis" draft="unconfirmed">annet språk</language>
+ <language type="mk">makedonsk</language>
+ <language type="mkh">mon-khmerspråk (annet)</language>
+ <language type="ml">malayalam</language>
+ <language type="mn">mongolsk</language>
+ <language type="mnc">mandsju</language>
+ <language type="mni">manipuri</language>
+ <language type="mno">manobospråk</language>
+ <language type="mo">moldavisk</language>
+ <language type="moh">mohawk</language>
+ <language type="mos">mossi</language>
+ <language type="mr">marathi</language>
+ <language type="ms">malayisk</language>
+ <language type="mt">maltesisk</language>
+ <language type="mul">flere språk</language>
+ <language type="mun">mundaspråk</language>
+ <language type="mus">creek</language>
+ <language type="mwl">mirandesisk</language>
+ <language type="mwr">marwari</language>
+ <language type="my">burmesisk</language>
+ <language type="myn">mayaspråk</language>
+ <language type="myv">erzya</language>
+ <language type="na">nauru</language>
+ <language type="nah">nahuatl</language>
+ <language type="nai" draft="provisional">nordamerikansk indiansk språk (annet)</language>
+ <language type="nap">napolitansk</language>
+ <language type="nb">bokmål</language>
+ <language type="nd">nord-ndebele</language>
+ <language type="nds">lavtysk; lavsaksisk</language>
+ <language type="ne">nepalsk</language>
+ <language type="new">newari</language>
+ <language type="ng">ndonga</language>
+ <language type="nia">nias</language>
+ <language type="nic">niger-kordofiansk (annet)</language>
+ <language type="nic" alt="proposed-u219-1" draft="unconfirmed">Niger-Kongospråk (annet)</language>
+ <language type="niu">niueansk</language>
+ <language type="nl">nederlandsk</language>
+ <language type="nn">nynorsk</language>
+ <language type="no">norsk</language>
+ <language type="nog">nogai</language>
+ <language type="non">gammelnorsk</language>
+ <language type="nr">sør-ndebele</language>
+ <language type="nso">nord-sotho</language>
+ <language type="nub">nubisk språk</language>
+ <language type="nv">navajo</language>
+ <language type="nwc">klassisk newari</language>
+ <language type="ny">nyanja</language>
+ <language type="nym">nyamwezi</language>
+ <language type="nyn">nyankole</language>
+ <language type="nyo">nyoro</language>
+ <language type="nzi">nzima</language>
+ <language type="oc">oksitansk (etter 1500)</language>
+ <language type="oj">ojibwa</language>
+ <language type="om">oromo</language>
+ <language type="or">oriya</language>
+ <language type="os">ossetisk</language>
+ <language type="osa">osage</language>
+ <language type="ota">ottomansk tyrkisk</language>
+ <language type="oto">otomisk språk</language>
+ <language type="pa">panjabi</language>
+ <language type="paa" draft="provisional">papuisk språk (annet)</language>
+ <language type="pag">pangasinan</language>
+ <language type="pal">pahlavi</language>
+ <language type="pam">pampanga</language>
+ <language type="pap">papiamento</language>
+ <language type="pau">palauisk</language>
+ <language type="peo">gammelpersisk (ca. 600-400 f. kr.)</language>
+ <language type="peo" alt="proposed-u219-1" draft="unconfirmed">gammelpersisk (c:a 600-400 f.kr.)</language>
+ <language type="phi" draft="provisional">filippinsk språk (annet)</language>
+ <language type="phn">fønikisk</language>
+ <language type="pi">pali</language>
+ <language type="pl">polsk</language>
+ <language type="pon">ponapisk</language>
+ <language type="pra">prakrit-språk</language>
+ <language type="pro">gammelprovençalsk (til 1500)</language>
+ <language type="ps">pashto</language>
+ <language type="pt">portugisisk</language>
+ <language type="qu">quechua</language>
+ <language type="raj">rajasthani</language>
+ <language type="rap">rapanui</language>
+ <language type="rar">rarotongansk</language>
+ <language type="rm">retoromansk</language>
+ <language type="rn">rundi</language>
+ <language type="ro">rumensk</language>
+ <language type="roa" draft="provisional">romansk språk (annet)</language>
+ <language type="rom">romani</language>
+ <language type="root">rot</language>
+ <language type="ru">russisk</language>
+ <language type="rup">aromansk</language>
+ <language type="rw">kinjarwanda</language>
+ <language type="sa">sanskrit</language>
+ <language type="sad">sandawe</language>
+ <language type="sah">jakutsk</language>
+ <language type="sai" draft="provisional">søramerikansk indiansk språk (annet)</language>
+ <language type="sal">salishansk språk</language>
+ <language type="sam">samaritansk arameisk</language>
+ <language type="sas">sasak</language>
+ <language type="sat">santali</language>
+ <language type="sc">sardinsk</language>
+ <language type="scn">siciliansk</language>
+ <language type="sco">skotsk</language>
+ <language type="sd">sindhi</language>
+ <language type="se">nordsamisk</language>
+ <language type="sel">selkupisk</language>
+ <language type="sem" draft="provisional">semittisk språk (annet)</language>
+ <language type="sg">sango</language>
+ <language type="sga">gammelirsk (til 900)</language>
+ <language type="sgn">tegnspråk</language>
+ <language type="sh">serbokroatisk</language>
+ <language type="shn">shan</language>
+ <language type="si">singalesisk</language>
+ <language type="sid">sidamo</language>
+ <language type="sio">sioux-språk</language>
+ <language type="sit" draft="provisional">sino-tibetansk språk (annet)</language>
+ <language type="sk">slovakisk</language>
+ <language type="sl">slovensk</language>
+ <language type="sla" draft="provisional">slavisk språk (annet)</language>
+ <language type="sm">samoansk</language>
+ <language type="sma">sørsamisk</language>
+ <language type="smi">samisk språk (annet)</language>
+ <language type="smj">lulesamisk</language>
+ <language type="smn">enaresamisk</language>
+ <language type="sms">skoltesamisk</language>
+ <language type="sn">shona</language>
+ <language type="snk">soninke</language>
+ <language type="so" draft="provisional">somali</language>
+ <language type="sog">sogdisk</language>
+ <language type="son">songhai</language>
+ <language type="sq">albansk</language>
+ <language type="sr">serbisk</language>
+ <language type="srn">sranan tongo</language>
+ <language type="srr">serer</language>
+ <language type="ss">swati</language>
+ <language type="ssa" draft="provisional">nilo-saharaspråk (annet)</language>
+ <language type="st">sør-sotho</language>
+ <language type="su">sundanesisk</language>
+ <language type="suk">sukuma</language>
+ <language type="sus">susu</language>
+ <language type="sux">sumerisk</language>
+ <language type="sv">svensk</language>
+ <language type="sw">swahili</language>
+ <language type="syr">syrisk</language>
+ <language type="ta">tamil</language>
+ <language type="tai" draft="provisional">taispråk (annet)</language>
+ <language type="te">telugu</language>
+ <language type="tem">temne</language>
+ <language type="ter">tereno</language>
+ <language type="tet">tetum</language>
+ <language type="tg">tatsjikisk</language>
+ <language type="th">thai</language>
+ <language type="ti">tigrinja</language>
+ <language type="tig">tigré</language>
+ <language type="tiv">tiv</language>
+ <language type="tk">turkmensk</language>
+ <language type="tkl">tokelau</language>
+ <language type="tl">tagalog</language>
+ <language type="tlh">klingon</language>
+ <language type="tli">tlingit</language>
+ <language type="tmh">tamasjek</language>
+ <language type="tn">tswana</language>
+ <language type="to">tonga (Tonga-øyene)</language>
+ <language type="tog">tonga (Nyasa)</language>
+ <language type="tpi">tok pisin</language>
+ <language type="tr">tyrkisk</language>
+ <language type="ts">tsonga</language>
+ <language type="tsi">tsimshian</language>
+ <language type="tt">tatarisk</language>
+ <language type="tum">tumbuka</language>
+ <language type="tup">tupi-språk</language>
+ <language type="tut" draft="provisional">altaisk språk (annet)</language>
+ <language type="tvl">tuvalu</language>
+ <language type="tw">twi</language>
+ <language type="ty">tahitisk</language>
+ <language type="tyv">tuvinisk</language>
+ <language type="udm">udmurt</language>
+ <language type="ug">uigurisk</language>
+ <language type="uga">ugaritisk</language>
+ <language type="uk">ukrainsk</language>
+ <language type="umb">umbundu</language>
+ <language type="und">ikke angitt</language>
+ <language type="ur">urdu</language>
+ <language type="uz">usbekisk</language>
+ <language type="vai">vai</language>
+ <language type="ve">venda</language>
+ <language type="vi">vietnamesisk</language>
+ <language type="vo">volapyk</language>
+ <language type="vot">votisk</language>
+ <language type="wa">vallonsk</language>
+ <language type="wak">wakasjansk språk</language>
+ <language type="wal">walamo</language>
+ <language type="war">waray</language>
+ <language type="was">washo</language>
+ <language type="wen">sorbisk språk</language>
+ <language type="wo">wolof</language>
+ <language type="xal">kalmyk</language>
+ <language type="xh">xhosa</language>
+ <language type="yao">yao</language>
+ <language type="yap">yapesisk</language>
+ <language type="yi">jiddisk</language>
+ <language type="yo">joruba</language>
+ <language type="ypk">jupisk språk</language>
+ <language type="za">zhuang</language>
+ <language type="zap">zapotec</language>
+ <language type="zen">zenaga</language>
+ <language type="zh">kinesisk</language>
+ <language type="znd">zande</language>
+ <language type="zu">zulu</language>
+ <language type="zun">zuni</language>
+ <language type="zxx">uten språklig innhold</language>
+ </languages>
+ <scripts>
+ <script type="Arab">arabisk</script>
+ <script type="Armn">armensk</script>
+ <script type="Bali">balinesisk</script>
+ <script type="Batk">batak</script>
+ <script type="Beng">bengalsk</script>
+ <script type="Blis">blissymbol</script>
+ <script type="Bopo">bopomofo</script>
+ <script type="Brah">brahmi</script>
+ <script type="Brai">braille</script>
+ <script type="Bugi">buginesisk</script>
+ <script type="Buhd">buhid</script>
+ <script type="Cans">felles kanadiske urspråksstavelser</script>
+ <script type="Cham">cham</script>
+ <script type="Cher">cherokee</script>
+ <script type="Cirt">cirth</script>
+ <script type="Copt">koptisk</script>
+ <script type="Cprt">kypriotisk</script>
+ <script type="Cyrl">kyrillisk</script>
+ <script type="Cyrs">kyrillisk (kirkeslavisk variant)</script>
+ <script type="Deva">devanagari</script>
+ <script type="Dsrt">deseret</script>
+ <script type="Egyd">egyptisk demotisk</script>
+ <script type="Egyh">egyptisk hieratisk</script>
+ <script type="Egyp">egyptiske hieroglyfer</script>
+ <script type="Ethi">etiopisk</script>
+ <script type="Geok">khutsuri (asomtavruli og nuskhuri)</script>
+ <script type="Geor">georgisk</script>
+ <script type="Glag">glagolittisk</script>
+ <script type="Goth">gotisk</script>
+ <script type="Grek">gresk</script>
+ <script type="Gujr">gujarati</script>
+ <script type="Guru">gurmukhi</script>
+ <script type="Hang">hangul</script>
+ <script type="Hani">han</script>
+ <script type="Hano">hanunoo</script>
+ <script type="Hans">forenklet han</script>
+ <script type="Hant">tradisjonell han</script>
+ <script type="Hebr">hebraisk</script>
+ <script type="Hira">hiragana</script>
+ <script type="Hmng">pahawh hmong</script>
+ <script type="Hrkt">katakana eller hiragana</script>
+ <script type="Hung">gammelungarsk</script>
+ <script type="Inds">indus (harappansk)</script>
+ <script type="Ital">gammelitalisk</script>
+ <script type="Java">javanesisk</script>
+ <script type="Kali">kayah li</script>
+ <script type="Kana">katakana</script>
+ <script type="Khar">kharoshthi</script>
+ <script type="Khmr">khmer</script>
+ <script type="Knda">kannada</script>
+ <script type="Laoo">laotisk</script>
+ <script type="Latf">latinsk (frakturvariant)</script>
+ <script type="Latg">latinsk (gælisk variant)</script>
+ <script type="Latn">latin</script>
+ <script type="Lepc">lepcha (róng)</script>
+ <script type="Limb">limbu</script>
+ <script type="Lina">lineær A</script>
+ <script type="Linb">lineær B</script>
+ <script type="Mand">mandaisk</script>
+ <script type="Maya">maya-hieroglyfer</script>
+ <script type="Mero">meroitisk</script>
+ <script type="Mlym">malayalam</script>
+ <script type="Mong">mongolsk</script>
+ <script type="Mymr">myanmar</script>
+ <script type="Nkoo">n'ko</script>
+ <script type="Ogam">ogham</script>
+ <script type="Orkh">orkhon</script>
+ <script type="Orya">oriya</script>
+ <script type="Osma">osmanya</script>
+ <script type="Perm">gammelpermisk</script>
+ <script type="Phag">phags-pa</script>
+ <script type="Phnx">fønikisk</script>
+ <script type="Plrd">pollard-fonetisk</script>
+ <script type="Qaai">nedarvet</script>
+ <script type="Roro">rongorongo</script>
+ <script type="Runr">runer</script>
+ <script type="Sara">sarati</script>
+ <script type="Shaw">shavisk</script>
+ <script type="Sinh">sinhala</script>
+ <script type="Sylo">syloti nagri</script>
+ <script type="Syrc">syrisk</script>
+ <script type="Syre">syriakisk (estrangelo-variant)</script>
+ <script type="Syrj">syriakisk (vestlig variant)</script>
+ <script type="Syrn">syriakisk (østlig variant)</script>
+ <script type="Tagb">tagbanwa</script>
+ <script type="Tale">tai le</script>
+ <script type="Talu">ny tai lue</script>
+ <script type="Taml">tamil</script>
+ <script type="Telu">telugu</script>
+ <script type="Teng">tengwar</script>
+ <script type="Tfng">tifinagh (berber)</script>
+ <script type="Tglg">tagalog</script>
+ <script type="Thaa">thaana</script>
+ <script type="Thai">thai</script>
+ <script type="Tibt">tibetansk</script>
+ <script type="Ugar">ugaritisk</script>
+ <script type="Vaii">vai</script>
+ <script type="Visp">synlig tale</script>
+ <script type="Xpeo">gammelpersisk</script>
+ <script type="Xsux">sumersk-akkadisk kileskrift</script>
+ <script type="Yiii">yi</script>
+ <script type="Zxxx">kode for språk uten skrift</script>
+ <script type="Zyyy">felles</script>
+ <script type="Zzzz">kode for ukodet skrift</script>
+ </scripts>
+ <territories>
+ <territory type="001">verden</territory>
+ <territory type="002">Afrika</territory>
+ <territory type="005">Sør-Amerika</territory>
+ <territory type="005" alt="proposed-u124-1" draft="unconfirmed">Sør-amerika</territory>
+ <territory type="009">Oseania</territory>
+ <territory type="011">Vest-Afrika</territory>
+ <territory type="011" alt="proposed-u124-1" draft="unconfirmed">Vest-afrika</territory>
+ <territory type="013">Sentral-Amerika</territory>
+ <territory type="013" alt="proposed-u124-1" draft="unconfirmed">Sentral-amerika</territory>
+ <territory type="014">Øst-Afrika</territory>
+ <territory type="014" alt="proposed-u124-1" draft="unconfirmed">Øst-afrika</territory>
+ <territory type="015">Nord-Afrika</territory>
+ <territory type="015" alt="proposed-u124-1" draft="unconfirmed">Nord-afrika</territory>
+ <territory type="017">Sentral-Afrika</territory>
+ <territory type="017" alt="proposed-u124-1" draft="unconfirmed">Midtre Afrika</territory>
+ <territory type="018">Sørlige Afrika</territory>
+ <territory type="019">Amerika</territory>
+ <territory type="021">Nord-Amerika</territory>
+ <territory type="029">Karibia</territory>
+ <territory type="030">Øst-Asia</territory>
+ <territory type="034">Sør-Asia</territory>
+ <territory type="035">Sørøst-Asia</territory>
+ <territory type="039">Sør-Europa</territory>
+ <territory type="053">Australia og New Zealand</territory>
+ <territory type="054">Melanesia</territory>
+ <territory type="057">Mikronesia</territory>
+ <territory type="061">Polynesia</territory>
+ <territory type="142">Asia</territory>
+ <territory type="143">Sentral-Asia</territory>
+ <territory type="145">Vest-Asia</territory>
+ <territory type="150">Europa</territory>
+ <territory type="151">Øst-Europa</territory>
+ <territory type="154">Nord-Europa</territory>
+ <territory type="155">Vest-Europa</territory>
+ <territory type="172">Samveldet av uavhengige stater</territory>
+ <territory type="172" alt="proposed-u124-1" draft="unconfirmed">Sambandet av uavhengige stater</territory>
+ <territory type="419">Latin-Amerika og Karibia</territory>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">De forente arabiske emirater</territory>
+ <territory type="AE" alt="proposed-u124-1" draft="unconfirmed">Forenede Arabiske Emirater</territory>
+ <territory type="AF">Afghanistan</territory>
+ <territory type="AG">Antigua og Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albania</territory>
+ <territory type="AM">Armenia</territory>
+ <territory type="AN">De nederlandske antiller</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktis</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">Amerikansk Samoa</territory>
+ <territory type="AT">Østerrike</territory>
+ <territory type="AU">Australia</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Ã…land</territory>
+ <territory type="AZ">Aserbajdsjan</territory>
+ <territory type="BA">Bosnia og Hercegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BE">Belgia</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgaria</territory>
+ <territory type="BH" references="RP4">Bahrain</territory>
+ <territory type="BH" references="RP4" alt="proposed-u124-1" draft="unconfirmed">Bahrein</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei Darussalam</territory>
+ <territory type="BO">Bolivia</territory>
+ <territory type="BR">Brasil</territory>
+ <territory type="BS">Bahamas</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BV">Bouvetøya</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Hviterussland</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Canada</territory>
+ <territory type="CC">Kokosøyene (Keelingøyene)</territory>
+ <territory type="CD">Kongo-Kinshasa</territory>
+ <territory type="CF">Den sentralafrikanske republikk</territory>
+ <territory type="CG">Kongo-Brazzaville</territory>
+ <territory type="CH">Sveits</territory>
+ <territory type="CI">Elfenbenskysten</territory>
+ <territory type="CK">Cookøyene</territory>
+ <territory type="CL">Chile</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Kina</territory>
+ <territory type="CO">Colombia</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS">Serbia og Montenegro</territory>
+ <territory type="CU">Cuba</territory>
+ <territory type="CV">Kapp Verde</territory>
+ <territory type="CX">Christmasøya</territory>
+ <territory type="CY">Kypros</territory>
+ <territory type="CZ">Tsjekkia</territory>
+ <territory type="DE">Tyskland</territory>
+ <territory type="DJ">Djibouti</territory>
+ <territory type="DK">Danmark</territory>
+ <territory type="DM">Dominica</territory>
+ <territory type="DO">Den dominikanske republikk</territory>
+ <territory type="DZ">Algerie</territory>
+ <territory type="EC">Ecuador</territory>
+ <territory type="EE">Estland</territory>
+ <territory type="EG">Egypt</territory>
+ <territory type="EH">Vest-Sahara</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Spania</territory>
+ <territory type="ET">Etiopia</territory>
+ <territory type="FI">Finland</territory>
+ <territory type="FJ">Fiji</territory>
+ <territory type="FK">Falklandsøyene (Malvinas)</territory>
+ <territory type="FM">Mikronesiaføderasjonen</territory>
+ <territory type="FO">Færøyene</territory>
+ <territory type="FR">Frankrike</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Storbritannia</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Georgia</territory>
+ <territory type="GF">Fransk Guyana</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Grønland</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Ekvatorial-Guinea</territory>
+ <territory type="GR">Hellas</territory>
+ <territory type="GS">Sør-Georgia og Sør-Sandwich-øyene</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinea-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Hong Kong S.A.R. (Kina)</territory>
+ <territory type="HM">Heard- og McDonaldsøyene</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Kroatia</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Ungarn</territory>
+ <territory type="ID">Indonesia</territory>
+ <territory type="IE">Irland</territory>
+ <territory type="IL">Israel</territory>
+ <territory type="IN">India</territory>
+ <territory type="IO">Britiske områder i det indiske hav</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Island</territory>
+ <territory type="IT">Italia</territory>
+ <territory type="JM">Jamaica</territory>
+ <territory type="JO">Jordan</territory>
+ <territory type="JP">Japan</territory>
+ <territory type="KE">Kenya</territory>
+ <territory type="KG">Kirgisistan</territory>
+ <territory type="KH">Kambodsja</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komorene</territory>
+ <territory type="KN">St. Christopher og Nevis</territory>
+ <territory type="KP">Nord-Korea</territory>
+ <territory type="KR">Sør-Korea</territory>
+ <territory type="KW">Kuwait</territory>
+ <territory type="KY">Caymanøyene</territory>
+ <territory type="KZ">Kasakhstan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Libanon</territory>
+ <territory type="LC">St. Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberia</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Litauen</territory>
+ <territory type="LU">Luxembourg</territory>
+ <territory type="LV">Latvia</territory>
+ <territory type="LY">Libya</territory>
+ <territory type="MA">Marokko</territory>
+ <territory type="MC">Monaco</territory>
+ <territory type="MD">Moldova</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshalløyene</territory>
+ <territory type="MK">Makedonia, Republikken</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongolia</territory>
+ <territory type="MO">Macao S.A.R. (Kina)</territory>
+ <territory type="MP">Nord-Marianene</territory>
+ <territory type="MQ">Martinique</territory>
+ <territory type="MR">Mauritania</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Maldivene</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Mexico</territory>
+ <territory type="MY">Malaysia</territory>
+ <territory type="MZ">Mosambik</territory>
+ <territory type="NA">Namibia</territory>
+ <territory type="NC">Ny-Caledonia</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Norfolkøyene</territory>
+ <territory type="NG">Nigeria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Nederland</territory>
+ <territory type="NO">Norge</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">New Zealand</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Fransk Polynesia</territory>
+ <territory type="PG">Papua Ny-Guinea</territory>
+ <territory type="PH">Filippinene</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Polen</territory>
+ <territory type="PM">St. Pierre og Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Puerto Rico</territory>
+ <territory type="PS">Palestinsk territorium</territory>
+ <territory type="PT">Portugal</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Qatar</territory>
+ <territory type="QO">avsidesliggende Oceania</territory>
+ <territory type="RE">Reunion</territory>
+ <territory type="RO">Romania</territory>
+ <territory type="RU">Den russiske føderasjon</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Saudi Arabia</territory>
+ <territory type="SB">Salomonøyene</territory>
+ <territory type="SC">Seychellene</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Sverige</territory>
+ <territory type="SG">Singapore</territory>
+ <territory type="SH">Saint Helena</territory>
+ <territory type="SI">Slovenia</territory>
+ <territory type="SJ">Svalbard og Jan Mayen</territory>
+ <territory type="SK">Slovakia</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalia</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">Sao Tome og Principe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Syria</territory>
+ <territory type="SZ">Swaziland</territory>
+ <territory type="TC">Turks- og Caicosøyene</territory>
+ <territory type="TD">Tchad</territory>
+ <territory type="TF">Franske sørområder</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Thailand</territory>
+ <territory type="TJ">Tadsjikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Øst-Timor</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunisia</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Tyrkia</territory>
+ <territory type="TT">Trinidad og Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TZ">Tanzania</territory>
+ <territory type="UA">Ukraina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">USAs mindre øyer</territory>
+ <territory type="US">USA</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Usbekistan</territory>
+ <territory type="VA">Vatikanstaten</territory>
+ <territory type="VC">St. Vincent og Grenadinene</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Jomfruøyene (britisk)</territory>
+ <territory type="VI">Jomfruøyene (USA)</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis og Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Sør-Afrika</territory>
+ <territory type="ZM">Zambia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ <variants>
+ <variant type="1901">tradisjonell tysk ortografi</variant>
+ <variant type="1996">tysk ortografi fra 1996</variant>
+ <variant type="POLYTONI">polytonisk</variant>
+ <variant type="REVISED">revidert ortografi</variant>
+ </variants>
+ <keys>
+ <key type="calendar">kalender</key>
+ <key type="collation">kollasjon</key>
+ <key type="currency">valuta</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">tradisjonell kinesisk</type>
+ <type type="buddhist" key="calendar">buddhistisk kalender</type>
+ <type type="chinese" key="calendar">kinesisk kalender</type>
+ <type type="direct" key="collation">direkte sortering</type>
+ <type type="gb2312han" key="collation">forenklet kinesisk</type>
+ <type type="gregorian" key="calendar">gregoriansk kalender</type>
+ <type type="hebrew" key="calendar">hebraisk kalender</type>
+ <type type="islamic" key="calendar">islamsk kalender</type>
+ <type type="islamic-civil" key="calendar">islamsk sivil kalender</type>
+ <type type="japanese" key="calendar">japansk kalender</type>
+ <type type="phonebook" key="collation">telefonkatalogsortering</type>
+ <type type="pinyin" key="collation">pinyinsortering</type>
+ <type type="stroke" key="collation">streksortering</type>
+ <type type="traditional" key="collation">tradisjonell sortering</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US">amerikansk</measurementSystemName>
+ <measurementSystemName type="metric">metrisk</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a à b-e é f-o ó ò ô p-z æ ø å]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[á ÇŽ Ä Ã§ Ä‘ è ê Å„ ñ Å‹ Å¡ ŧ ü ž ä ö]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>«</quotationStart>
+ <quotationEnd>»</quotationEnd>
+ <alternateQuotationStart>&quot;</alternateQuotationStart>
+ <alternateQuotationStart alt="proposed-u219-1" draft="unconfirmed">â€</alternateQuotationStart>
+ <alternateQuotationEnd>&quot;</alternateQuotationEnd>
+ <alternateQuotationEnd alt="proposed-u219-1" draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" references="R1">jan.</month>
+ <month type="2" references="R1">feb.</month>
+ <month type="3" references="R1">mars</month>
+ <month type="4" references="R1">april</month>
+ <month type="5" references="R1">mai</month>
+ <month type="6" references="R1">juni</month>
+ <month type="7" references="R1">juli</month>
+ <month type="8" references="R1">aug.</month>
+ <month type="9" references="R1">sep.</month>
+ <month type="10" references="R1">okt.</month>
+ <month type="11" references="R1">nov.</month>
+ <month type="12" references="R1">des.</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">januar</month>
+ <month type="2">februar</month>
+ <month type="3">mars</month>
+ <month type="4">april</month>
+ <month type="5">mai</month>
+ <month type="6">juni</month>
+ <month type="7">juli</month>
+ <month type="8">august</month>
+ <month type="9">september</month>
+ <month type="10">oktober</month>
+ <month type="11">november</month>
+ <month type="12">desember</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">J</month>
+ <month type="2">F</month>
+ <month type="3">M</month>
+ <month type="4">A</month>
+ <month type="5">M</month>
+ <month type="6">J</month>
+ <month type="7">J</month>
+ <month type="8">A</month>
+ <month type="9">S</month>
+ <month type="10">O</month>
+ <month type="11">N</month>
+ <month type="12">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" references="R1">sø.</day>
+ <day type="mon" references="R1">ma.</day>
+ <day type="tue" references="R1">ti.</day>
+ <day type="wed" references="R1">on.</day>
+ <day type="thu" references="R1">to.</day>
+ <day type="fri" references="R1">fr.</day>
+ <day type="sat" references="R1">lø.</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">søndag</day>
+ <day type="mon">mandag</day>
+ <day type="tue">tirsdag</day>
+ <day type="wed">onsdag</day>
+ <day type="thu">torsdag</day>
+ <day type="fri">fredag</day>
+ <day type="sat">lørdag</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">S</day>
+ <day type="mon">M</day>
+ <day type="tue">T</day>
+ <day type="wed">O</day>
+ <day type="thu">T</day>
+ <day type="fri">F</day>
+ <day type="sat">L</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">K1</quarter>
+ <quarter type="2">K2</quarter>
+ <quarter type="3">K3</quarter>
+ <quarter type="4">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1. kvartal</quarter>
+ <quarter type="2">2. kvartal</quarter>
+ <quarter type="3">3. kvartal</quarter>
+ <quarter type="4">4. kvartal</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>formiddag</am>
+ <pm>ettermiddag</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">f.Kr.</era>
+ <era type="1">e.Kr.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d. MMM. yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd.MM.yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>'kl. 'HH.mm.ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>HH.mm.ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>HH.mm.ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>HH.mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d. MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd.MM</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm.ss</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM.yy</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="provisional">QQQQ yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName>tidsalder</displayName>
+ </field>
+ <field type="year">
+ <displayName>Ã¥r</displayName>
+ </field>
+ <field type="month">
+ <displayName>måned</displayName>
+ </field>
+ <field type="week">
+ <displayName>uke</displayName>
+ </field>
+ <field type="day">
+ <displayName>dag</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>ukedag</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName>f.m./e.m.-valg</displayName>
+ </field>
+ <field type="hour">
+ <displayName>time</displayName>
+ </field>
+ <field type="minute">
+ <displayName>minutt</displayName>
+ </field>
+ <field type="second">
+ <displayName>sekund</displayName>
+ </field>
+ <field type="zone">
+ <displayName>sone</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Sørpolen</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <exemplarCity>St. John's</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity>Godthåb</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>Azorene</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lisboa</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>østeuropeisk standardtid</standard>
+ <daylight>østeuropeisk sommertid</daylight>
+ </long>
+ <short>
+ <standard>EET</standard>
+ <daylight>EEST</daylight>
+ </short>
+ <exemplarCity>Bucuresti</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moskva</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##0 %</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencies>
+ <currency type="ADP">
+ <displayName>andorranske pesetas</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>UAE dirham</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>afghani (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>afghani</displayName>
+ <symbol>Af</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>albanske lek</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>armenske dram</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>nederlandske antillegylden</displayName>
+ <symbol>NA f.</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>angolanske kwanza</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>angolanske kwanza (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>angolanske nye kwanza (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>angolanske kwanza reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>argentinske australer</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>argentinske pesos (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>argentinske pesos</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>østerrikske shilling</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>australske dollar</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>arubiske gylden</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>aserbajdsjanske manat</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>bosnisk-hercegovinske dinarer</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>bosnisk-hercegovinske mark (konvertible)</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>barbadiske dollar</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>bangladeshiske taka</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>belgiske franc (konvertible)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>belgiske franc</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>belgiske franc (finansielle)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>bulgarske lev (hard)</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>bulgarske lev</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>bahrainske dinarer</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>burundiske franc</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>bermudiske dollar</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>bruneiske dollar</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>boliviano</displayName>
+ <symbol>Bs</symbol>
+ </currency>
+ <currency type="BOP">
+ <displayName>bolivianske pesos</displayName>
+ <displayName alt="proposed-u223-2" draft="unconfirmed">boliviansk pesos</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>bolivianske mvdol</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>brasilianske cruzeiro novo (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>brasilianske cruzado</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>brasilianske cruzeiro (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>brasilianske realer</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRN">
+ <displayName>brasilianske cruzado novo</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>brasilianske cruzeiro</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>bahamske dollar</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>bhutanske ngultrum</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>burmesiske kyat</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>botswanske pula</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>hviterussiske nye rubler (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>hviterussiske rubler</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>beliziske dollar</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>kanadiske dollar</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>kongolesiske franc (congolais)</displayName>
+ </currency>
+ <currency type="CHE">
+ <displayName>WIR euro</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>sveitsiske franc</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CHW">
+ <displayName>WIR franc</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>chilenske unidades de fomento</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>chilenske pesos</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>kinesiske yuan renminbi</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>colombianske pesos</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="COU">
+ <displayName>unidad de valor real</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>costaricanske colon</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSD">
+ <displayName>serbiske dinarer</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>tsjekkoslovakiske koruna (hard)</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>kubanske pesos</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>kappverdiske escudo</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>kypriotiske pund</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>tsjekkiske koruna</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>østtyske ostmark</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>tyske mark</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>djiboutiske franc</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>danske kroner</displayName>
+ <symbol>Dkr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>dominikanske pesos</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>algeriske dinarer</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>ecuadorianske sucre</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>ecuadorianske unidad de valor constante (UVC)</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>estiske kroon</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>egyptiske pund</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>eritreiske nakfa</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName draft="unconfirmed">spanske peseta (A-konto)</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName>spanske peseta (konvertibel konto)</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>spanske peseta</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>etiopiske birr</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>finske mark</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>fijianske dollar</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>Falklandsøyene-pund</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>franske franc</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>britiske pund sterling</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>georgiske kupon larit</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>georgiske lari</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>ghanesiske cedi</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>gibraltarske pund</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>gambiske dalasi</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>guineanske franc</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>guineanske syli</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>ekvatorialguineanske ekwele guineana</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>greske drakmer</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>guatemalanske quetzal</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>portugisiske guinea escudo</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Guinea-Bissau-pesos</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>guyanske dollar</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>Hongkong-dollar</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>Hoduras Lempira</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>kroatiske dinarer</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>kroatiske kuna</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>haitiske gourde</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>ungarske forinter</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>indonesiske rupier</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>irske pund</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>israelske pund</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>israelske nye shekler</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>indiske rupier</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>irakske dinarer</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>iranske rialer</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>islandske kronar</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>italienske lire</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>jamaikanske dollar</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>jordanske dinarer</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>japanske yen</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>kenyanske shilling</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>kirgisiske som</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>kambodsjanske riel</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>komoriske franc</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>nordkoreanske won</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>sørkoreanske won</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>kuwaitiske dinarer</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>caymanske dollar</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>kasakhstanske tenge</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>laotiske kip</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>libanesiske pund</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>srilankiske rupier</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>liberiske dollar</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>lesothiske loti</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LSM">
+ <displayName>maloti</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>litauiske lita</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>litauiske talonas</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName>luxemburgske konvertible franc</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>luxemburgske franc</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName>luxemburgske finansielle franc</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>latviske lats</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>latviske rubler</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>libyske dinarer</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>marokkanske dirham</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>marokkanske franc</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>moldovske leu</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>madagassiske ariary</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>madagassiske franc</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>makedonske denarer</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>maliske franc</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>myanmarske kyat</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>mongolske tugrik</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>makaoske pataca</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>mauritanske ouguiya</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>maltesiske lira</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>maltesiske pund</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>mauritiske rupier</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>maldiviske rufiyaa</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>malawiske kwacha</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>meksikanske pesos</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>meksikanske sølvpesos (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>meksikanske unidad de inversion (UDI)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>malaysiske ringgit</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>mosambikiske escudo</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>mosambikiske metical</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>namibiske dollar</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>nigerianske naira</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>nicaraguanske cordoba</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>nicaraguanske cordoba oro</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>nederlandske gylden</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>norske kroner</displayName>
+ <symbol>kr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>nepalesiske rupier</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>nyzealandske dollar</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>omanske rialer</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>panamanske balboa</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>peruvianske inti</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>peruvianske sol nuevo</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>peruvianske sol</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>papuanske kina</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>filippinske pesos</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>pakistanske rupier</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>polske zloty</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>polske zloty (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>portugisiske escudo</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>paraguayanske guarani</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>qatarske riyaler</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="RHD">
+ <displayName>rhodesiske dollar</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>rumenske leu</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>russiske rubler</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>russiske rubler (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>rwandiske franc</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>saudiarabiske riyaler</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>salomonske dollar</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>seychelliske rupier</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>sudanesiske dinarer</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>sudanesiske pund</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>svenske kroner</displayName>
+ <symbol>Skr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>singaporske dollar</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>sankthelenske pund</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>slovenske tolar</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>slovakiske koruna</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>sierraleonske leone</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>somaliske shilling</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRD">
+ <displayName>surinamske dollar</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>surinamske gylden</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>Sao Tome og Principe-dobra</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>sovjetiske rubler</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>salvadoranske colon</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>syriske pund</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>swazilandske lilangeni</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>thailandske baht</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>tadsjikiske rubler</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>tadsjikiske somoni</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>turkmenske manat</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>tunisiske dinarer</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>tonganske paʻanga</displayName>
+ <symbol>T$</symbol>
+ </currency>
+ <currency type="TPE">
+ <displayName>timoresiske escudo</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>tyrkiske lira</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName>ny tyrkisk lire</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>trinidadiske dollar</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>taiwanske nye dollar</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>tanzanianske shilling</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>ukrainsle hryvnia</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>ukrainske karbovanetz</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>ugandiske shilling (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>ugandiske shilling</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>amerikanske dollar</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>amerikanske dollar (neste dag)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>amerikanske dollar (samme dag)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>uruguayanske pesos (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>uruguayanske peso uruguayo</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>usbekiske sum</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>venezuelanske bolivar</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>vietnamesiske dong</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>vanuatisk vatu</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>vestsamoisk tala</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>CFA franc BEAC</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName>sølv</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>gull</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>europeisk sammensatt enhet</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>europeisk monetær enhet</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>europeisk kontoenhet (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>europeisk kontoenhet (XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>østkaribiske dollar</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>spesielle trekkrettigheter</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>europeisk valutaenhet</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>franske gullfranc</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>franske UIC-franc</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>CFA franc BCEAO</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName>palladium</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>CFP franc</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="XPT">
+ <displayName>platinum</displayName>
+ </currency>
+ <currency type="XRE">
+ <displayName>RINET-fond</displayName>
+ </currency>
+ <currency type="XXX">
+ <displayName>ingen valuta</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>jemenittiske dinarer</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>jemenittiske rialer</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>jugoslaviske dinarer (hard)</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>jugoslaviske noviy-dinarer</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>jugoslaviske konvertible dinarer</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>sørafrikanske rand (finansielle)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>sørafrikanske rand</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>zambiske kwacha</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>zairiske nye zaire</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>zairiske zaire</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>zimbabwiske dollar</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>ja</yesstr>
+ <nostr>nei</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="R1" uri="URN:ISBN:82-03-32936-5">Vinje, Finn-Erik, Skriveregler (1994)</reference>
+ <reference type="RP1" uri="URN:ISBN:9979-9004-3-1">INSTA report: Nordic Cultural Requirements on Information Technology (1992)</reference>
+ <reference type="RP2" uri="http://www.norid.no/navnepolitikk.html#link3">NORID Navnepolitikk for .no-domenet</reference>
+ <reference type="RP3" draft="provisional">Bokmålsordboka</reference>
+ <reference type="RP4" uri="http://www.sprakrad.no/templates/Page.aspx?id=3312">Språkrådet</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/nb_NO.xml b/libs/Zend/Locale/Data/nb_NO.xml
new file mode 100755
index 0000000000..850e916fdf
--- /dev/null
+++ b/libs/Zend/Locale/Data/nb_NO.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="nb"/>
+ <territory type="NO"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">’</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">«</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">»</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH.mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH.mm.ss</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd. MM</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ <pattern alt="proposed-u223-1" draft="unconfirmed">¤ #,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ne.xml b/libs/Zend/Locale/Data/ne.xml
new file mode 100755
index 0000000000..942fab2902
--- /dev/null
+++ b/libs/Zend/Locale/Data/ne.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.11 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="ne"/>
+ </identity>
+ <characters>
+ <exemplarCharacters>[à¤-ः ०-९ अ-ऋ ठठओ-न प-र ल व-ह ा-ृ े ै ो ौ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">'</quotationStart>
+ <quotationEnd draft="unconfirmed">'</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">&quot;</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">&quot;</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">जन</month>
+ <month type="2" draft="unconfirmed">फेब</month>
+ <month type="3" draft="unconfirmed">मारà¥à¤š</month>
+ <month type="4" draft="unconfirmed">अपà¥à¤°à¤¿</month>
+ <month type="5" draft="unconfirmed">मे</month>
+ <month type="6" draft="unconfirmed">जà¥à¤¨</month>
+ <month type="7" draft="unconfirmed">जà¥à¤²à¤¾</month>
+ <month type="8" draft="unconfirmed">अग</month>
+ <month type="9" draft="unconfirmed">सेपà¥à¤Ÿ</month>
+ <month type="10" draft="unconfirmed">अकà¥à¤Ÿà¥‹</month>
+ <month type="11" draft="unconfirmed">नोभे</month>
+ <month type="12" draft="unconfirmed">डिसे</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">जनवरी</month>
+ <month type="2" draft="unconfirmed">फेबà¥à¤°à¥à¤…री</month>
+ <month type="3" draft="unconfirmed">मारà¥à¤š</month>
+ <month type="4" draft="unconfirmed">अपà¥à¤°à¤¿à¤²</month>
+ <month type="5" draft="unconfirmed">मे</month>
+ <month type="6" draft="unconfirmed">जà¥à¤¨</month>
+ <month type="7" draft="unconfirmed">जà¥à¤²à¤¾à¤ˆ</month>
+ <month type="8" draft="unconfirmed">अगसà¥à¤¤</month>
+ <month type="9" draft="unconfirmed">सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°</month>
+ <month type="10" draft="unconfirmed">अकà¥à¤Ÿà¥‹à¤¬à¤°</month>
+ <month type="11" draft="unconfirmed">नोभेमà¥à¤¬à¤°</month>
+ <month type="12" draft="unconfirmed">डिसेमà¥à¤¬à¤°</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">आइत</day>
+ <day type="mon" draft="unconfirmed">सोम</day>
+ <day type="tue" draft="unconfirmed">मङà¥à¤—ल</day>
+ <day type="wed" draft="unconfirmed">बà¥à¤§</day>
+ <day type="thu" draft="unconfirmed">बिही</day>
+ <day type="fri" draft="unconfirmed">शà¥à¤•à¥à¤°</day>
+ <day type="sat" draft="unconfirmed">शनि</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">आइतबार</day>
+ <day type="mon" draft="unconfirmed">सोमबार</day>
+ <day type="tue" draft="unconfirmed">मङà¥à¤—लबार</day>
+ <day type="wed" draft="unconfirmed">बà¥à¤§à¤¬à¤¾à¤°</day>
+ <day type="thu" draft="unconfirmed">बिहीबार</day>
+ <day type="fri" draft="unconfirmed">शà¥à¤•à¥à¤°à¤¬à¤¾à¤°</day>
+ <day type="sat" draft="unconfirmed">शनिबार</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">पहिलो सतà¥à¤°</quarter>
+ <quarter type="2" draft="unconfirmed">दोसà¥à¤°à¥‹ सतà¥à¤°</quarter>
+ <quarter type="3" draft="unconfirmed">तेसà¥à¤°à¥‹ सतà¥à¤°</quarter>
+ <quarter type="4" draft="unconfirmed">चौथो सतà¥à¤°</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am draft="unconfirmed">पूरà¥à¤µà¤¾à¤¨à¥à¤¹</am>
+ <pm draft="unconfirmed">अपरानà¥à¤¹</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">ईसापूरà¥à¤µ</era>
+ <era type="1" draft="unconfirmed">सनà¥</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">ईसापूरà¥à¤µ</era>
+ <era type="1" draft="unconfirmed">सनà¥</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="NPR">
+ <symbol draft="unconfirmed">रू</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ne_NP.xml b/libs/Zend/Locale/Data/ne_NP.xml
new file mode 100755
index 0000000000..a3495520e2
--- /dev/null
+++ b/libs/Zend/Locale/Data/ne_NP.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ne"/>
+ <territory type="NP"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/nl.xml b/libs/Zend/Locale/Data/nl.xml
new file mode 100755
index 0000000000..25be73da60
--- /dev/null
+++ b/libs/Zend/Locale/Data/nl.xml
@@ -0,0 +1,2266 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.74 $"/>
+ <generation date="$Date: 2006/10/26 22:46:09 $"/>
+ <language type="nl"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">Afar</language>
+ <language type="ab">Abchazisch</language>
+ <language type="ace">Atjees</language>
+ <language type="ach">Akoli</language>
+ <language type="ada">Adangme</language>
+ <language type="ady">Adyghe</language>
+ <language type="ae">Avestisch</language>
+ <language type="af">Afrikaans</language>
+ <language type="afa">Afro-Aziatisch (overige)</language>
+ <language type="afh">Afrihili</language>
+ <language type="ain">Ainu</language>
+ <language type="ak">Akan</language>
+ <language type="akk">Akkadisch</language>
+ <language type="ale">Aleut</language>
+ <language type="alg">Algonkium-talen</language>
+ <language type="alt" draft="provisional">Zuid-Altai</language>
+ <language type="am">Amhaars</language>
+ <language type="an">Aragonees</language>
+ <language type="ang">Engels, oud (ca. 450-1100)</language>
+ <language type="apa">Apache-talen</language>
+ <language type="ar">Arabisch</language>
+ <language type="arc">Aramees</language>
+ <language type="arn">Araukaans</language>
+ <language type="arp">Arapaho</language>
+ <language type="art">Kunstmatige talen (overige)</language>
+ <language type="arw">Arawak</language>
+ <language type="as">Assamees</language>
+ <language type="ast">Asturisch</language>
+ <language type="ath">Athapascaanse talen</language>
+ <language type="aus">Australische talen</language>
+ <language type="av">Avarisch</language>
+ <language type="awa">Awadhi</language>
+ <language type="ay">Aymara</language>
+ <language type="az">Azerbeidzjaans</language>
+ <language type="ba">Basjkiers</language>
+ <language type="bad">Banda</language>
+ <language type="bai">Bamileke-talen</language>
+ <language type="bal">Baloetsji</language>
+ <language type="ban">Balinees</language>
+ <language type="bas">Basa</language>
+ <language type="bat">Baltisch (overige)</language>
+ <language type="be">Wit-Russisch</language>
+ <language type="bej">Beja</language>
+ <language type="bem">Bemba</language>
+ <language type="ber">Berber (overige)</language>
+ <language type="bg">Bulgaars</language>
+ <language type="bh">Bihari</language>
+ <language type="bho">Bhojpuri</language>
+ <language type="bi">Bislama</language>
+ <language type="bik">Bikol</language>
+ <language type="bin">Bini</language>
+ <language type="bla">Siksika</language>
+ <language type="bm">Bambara</language>
+ <language type="bn">Bengalees</language>
+ <language type="bnt">Bantoe (overige)</language>
+ <language type="bo">Tibetaans</language>
+ <language type="br">Bretons</language>
+ <language type="bra">Braj</language>
+ <language type="bs">Bosnisch</language>
+ <language type="btk">Bataks (Indonesië)</language>
+ <language type="bua">Buriat</language>
+ <language type="bug">Buginees</language>
+ <language type="byn">Blin</language>
+ <language type="ca">Catalaans</language>
+ <language type="cad">Caddo</language>
+ <language type="cai">Midden-Amerikaans Indiaans (overige)</language>
+ <language type="car">Caribisch</language>
+ <language type="cau">Kaukasisch (overige)</language>
+ <language type="ce">Chechen</language>
+ <language type="ceb">Cebuano</language>
+ <language type="cel">Keltisch (overige)</language>
+ <language type="ch">Chamorro</language>
+ <language type="chb">Chibcha</language>
+ <language type="chg">Chagatai</language>
+ <language type="chk">Chuukees</language>
+ <language type="chm">Mari</language>
+ <language type="chn">Chinook-jargon</language>
+ <language type="cho">Choctaw</language>
+ <language type="chp">Chipewyan</language>
+ <language type="chr">Cherokee</language>
+ <language type="chy">Cheyenne</language>
+ <language type="cmc">Chamische talen</language>
+ <language type="co">Corsicaans</language>
+ <language type="cop">Koptisch</language>
+ <language type="cpe">Creools en Pidgin, op Engels gebaseerd (overige)</language>
+ <language type="cpf">Creools en Pidgin, op Frans gebaseerd (overige)</language>
+ <language type="cpp">Creools en Pidgin, op Portugees gebaseerd (overige)</language>
+ <language type="cr">Cree</language>
+ <language type="crh">Krim-Tataars</language>
+ <language type="crp">Creools en Pidgin (overige)</language>
+ <language type="cs">Tsjechisch</language>
+ <language type="csb">Kasjoebisch</language>
+ <language type="cu">Kerkslavisch</language>
+ <language type="cus">Koesjitisch (overige)</language>
+ <language type="cv">Tsjoevasjisch</language>
+ <language type="cy">Welsh</language>
+ <language type="da">Deens</language>
+ <language type="dak">Dakota</language>
+ <language type="dar">Dargwa</language>
+ <language type="day">Dajak</language>
+ <language type="de">Duits</language>
+ <language type="del">Delaware</language>
+ <language type="den">Slave (Athapascan)</language>
+ <language type="dgr">Dogrib</language>
+ <language type="din">Dinka</language>
+ <language type="doi">Dogri</language>
+ <language type="dra">Dravidisch (overige)</language>
+ <language type="dsb">Nedersorbisch</language>
+ <language type="dua">Duala</language>
+ <language type="dum">Nederlands, middel- (ca. 1050-1350)</language>
+ <language type="dv">Divehi</language>
+ <language type="dyu">Dyula</language>
+ <language type="dz">Dzongkha</language>
+ <language type="ee">Ewe</language>
+ <language type="efi">Efik</language>
+ <language type="egy">Egyptisch (klassiek)</language>
+ <language type="eka">Ekajuk</language>
+ <language type="el">Grieks</language>
+ <language type="elx">Elamitisch</language>
+ <language type="en">Engels</language>
+ <language type="enm">Engels, middel- (1100-1500)</language>
+ <language type="eo">Esperanto</language>
+ <language type="es">Spaans</language>
+ <language type="et">Estlands</language>
+ <language type="eu">Baskisch</language>
+ <language type="ewo">Ewondo</language>
+ <language type="fa">Perzisch</language>
+ <language type="fan">Fang</language>
+ <language type="fat">Fanti</language>
+ <language type="ff">Fulah</language>
+ <language type="fi">Fins</language>
+ <language type="fil">Filipijns</language>
+ <language type="fiu">Finoegrische talen (overige)</language>
+ <language type="fj">Fijisch</language>
+ <language type="fo">Faeröers</language>
+ <language type="fon">Fon</language>
+ <language type="fr">Frans</language>
+ <language type="frm">Frans, middel- (ca. 1400-1800)</language>
+ <language type="fro">Frans, oud- (ca. 842-1400)</language>
+ <language type="fur">Friulisch</language>
+ <language type="fy">Fries</language>
+ <language type="ga">Iers</language>
+ <language type="gaa">Ga</language>
+ <language type="gay">Gayo</language>
+ <language type="gba">Gbaya</language>
+ <language type="gd">Schots Gaelic</language>
+ <language type="gem">Germaans (overige)</language>
+ <language type="gez">Geez</language>
+ <language type="gil">Gilbertees</language>
+ <language type="gl">Galicisch</language>
+ <language type="gmh">Duits, middelhoog- (ca. 1050-1500)</language>
+ <language type="gn">Guarani</language>
+ <language type="goh">Duits, oudhoog- (ca. 750-1050)</language>
+ <language type="gon">Gondi</language>
+ <language type="gor">Gorontalo</language>
+ <language type="got">Gothisch</language>
+ <language type="grb">Grebo</language>
+ <language type="grc">Grieks, klassiek (tot 1453)</language>
+ <language type="gu">Gujarati</language>
+ <language type="gv">Manx</language>
+ <language type="gwi">Gwichʼin</language>
+ <language type="ha">Hausa</language>
+ <language type="hai">Haida</language>
+ <language type="haw">Hawaïaans</language>
+ <language type="he">Hebreeuws</language>
+ <language type="hi">Hindi</language>
+ <language type="hil">Hiligaynon</language>
+ <language type="him">Himachali</language>
+ <language type="hit">Hettitisch</language>
+ <language type="hmn">Hmong</language>
+ <language type="ho">Hiri Motu</language>
+ <language type="hr">Kroatisch</language>
+ <language type="hsb">Oppersorbisch</language>
+ <language type="ht">Haïtiaans</language>
+ <language type="hu">Hongaars</language>
+ <language type="hup">Hupa</language>
+ <language type="hy">Armeens</language>
+ <language type="hz">Herero</language>
+ <language type="ia">Interlingua</language>
+ <language type="iba">Iban</language>
+ <language type="id">Indonesisch</language>
+ <language type="ie">Interlingue</language>
+ <language type="ig">Igbo</language>
+ <language type="ii">Sichuan Yi</language>
+ <language type="ijo">Ijo</language>
+ <language type="ik">Inupiaq</language>
+ <language type="ilo">Iloko</language>
+ <language type="inc">Indisch (overige)</language>
+ <language type="ine">Indo-Europees (overige)</language>
+ <language type="inh">Ingoesj</language>
+ <language type="io">Ido</language>
+ <language type="ira">Iraans (overige)</language>
+ <language type="iro">Irokese talen</language>
+ <language type="is">IJslands</language>
+ <language type="it">Italiaans</language>
+ <language type="iu">Inuktitut</language>
+ <language type="ja">Japans</language>
+ <language type="jbo">Lojban</language>
+ <language type="jpr">Judeo-Perzisch</language>
+ <language type="jrb">Judeo-Arabisch</language>
+ <language type="jv">Javaans</language>
+ <language type="ka">Georgisch</language>
+ <language type="kaa">Karakalpaks</language>
+ <language type="kab">Kabyle</language>
+ <language type="kac">Kachin</language>
+ <language type="kam">Kamba</language>
+ <language type="kar">Karen</language>
+ <language type="kaw">Kawi</language>
+ <language type="kbd">Kabardisch</language>
+ <language type="kg">Kongo</language>
+ <language type="kha">Khasi</language>
+ <language type="khi">Khoisan (overige)</language>
+ <language type="kho">Khotanees</language>
+ <language type="ki">Kikuyu</language>
+ <language type="kj">Kuanyama</language>
+ <language type="kk">Kazachs</language>
+ <language type="kl">Kalaallisut</language>
+ <language type="km">Khmer</language>
+ <language type="kmb">Kimbundu</language>
+ <language type="kn">Kannada</language>
+ <language type="ko">Koreaans</language>
+ <language type="kok">Konkani</language>
+ <language type="kos">Kosraeaans</language>
+ <language type="kpe">Kpelle</language>
+ <language type="kr">Kanuri</language>
+ <language type="krc">Karachay-Balkar</language>
+ <language type="kro">Kru</language>
+ <language type="kru">Kurukh</language>
+ <language type="ks">Kashmiri</language>
+ <language type="ku">Koerdisch</language>
+ <language type="kum">Kumyk</language>
+ <language type="kut">Kutenai</language>
+ <language type="kv">Komi</language>
+ <language type="kw">Cornish</language>
+ <language type="ky">Kirgizisch</language>
+ <language type="la">Latijn</language>
+ <language type="lad">Ladino</language>
+ <language type="lah">Lahnda</language>
+ <language type="lam">Lamba</language>
+ <language type="lb">Luxemburgs</language>
+ <language type="lez">Lezgisch</language>
+ <language type="lg">Ganda</language>
+ <language type="li">Limburgs</language>
+ <language type="ln">Lingala</language>
+ <language type="lo">Lao</language>
+ <language type="lol">Mongo</language>
+ <language type="loz">Lozi</language>
+ <language type="lt">Litouws</language>
+ <language type="lu">Luba-Katanga</language>
+ <language type="lua">Luba-Lulua</language>
+ <language type="lui">Luiseno</language>
+ <language type="lun">Lunda</language>
+ <language type="luo">Luo (Kenia en Tanzania)</language>
+ <language type="lus">Lushai</language>
+ <language type="lv">Letlands</language>
+ <language type="mad">Madurees</language>
+ <language type="mag">Magahi</language>
+ <language type="mai">Maithili</language>
+ <language type="mak">Makassaars</language>
+ <language type="man">Mandingo</language>
+ <language type="map">Austronesisch (overige)</language>
+ <language type="mas">Masai</language>
+ <language type="mdf">Moksha</language>
+ <language type="mdr">Mandar</language>
+ <language type="men">Mende</language>
+ <language type="mg">Malagasisch</language>
+ <language type="mga">Iers, middel- (900-1200)</language>
+ <language type="mh">Marshallees</language>
+ <language type="mi">Maori</language>
+ <language type="mic">Mi'kmaq</language>
+ <language type="min">Minangkabau</language>
+ <language type="mis">Diverse talen</language>
+ <language type="mk">Macedonisch</language>
+ <language type="mkh">Mon-Khmer (overige)</language>
+ <language type="ml">Malayalam</language>
+ <language type="mn">Mongools</language>
+ <language type="mnc">Mantsjoe</language>
+ <language type="mni">Manipoeri</language>
+ <language type="mno">Manobo-talen</language>
+ <language type="mo">Moldavisch</language>
+ <language type="moh">Mohawk</language>
+ <language type="mos">Mossi</language>
+ <language type="mr">Marathi</language>
+ <language type="ms">Maleis</language>
+ <language type="mt">Maltees</language>
+ <language type="mul">Meerdere talen</language>
+ <language type="mun">Munda-talen</language>
+ <language type="mus">Creek</language>
+ <language type="mwl">Mirandees</language>
+ <language type="mwr">Marwari</language>
+ <language type="my">Birmees</language>
+ <language type="myn">Mayan-talen</language>
+ <language type="myv">Erzya</language>
+ <language type="na">Nauru</language>
+ <language type="nah">Nahuatl</language>
+ <language type="nai">Noord-Amerikaans Indiaans</language>
+ <language type="nap">Napolitaans</language>
+ <language type="nb">Noors - Bokmål</language>
+ <language type="nd">Ndebele, noord-</language>
+ <language type="nds">Laagduits</language>
+ <language type="ne">Nepalees</language>
+ <language type="new">Newari</language>
+ <language type="ng">Ndonga</language>
+ <language type="nia">Nias</language>
+ <language type="nic">Niger-Kordofanisch (overige)</language>
+ <language type="niu">Niueaans</language>
+ <language type="nl">Nederlands</language>
+ <language type="nn">Noors - Nynorsk</language>
+ <language type="no">Noors</language>
+ <language type="nog">Nogai</language>
+ <language type="non">Noors, oud-</language>
+ <language type="nr">Ndebele, zuid-</language>
+ <language type="nso">Noord-Sotho</language>
+ <language type="nub">Nubische talen</language>
+ <language type="nv">Navajo</language>
+ <language type="nwc">Klassiek Newari</language>
+ <language type="ny">Nyanja</language>
+ <language type="nym">Nyamwezi</language>
+ <language type="nyn">Nyankole</language>
+ <language type="nyo">Nyoro</language>
+ <language type="nzi">Nzima</language>
+ <language type="oc">Langue d’Oc (na 1500)</language>
+ <language type="oj">Ojibwa</language>
+ <language type="om">Oromo</language>
+ <language type="or">Oriya</language>
+ <language type="os">Ossetisch</language>
+ <language type="osa">Osage</language>
+ <language type="ota">Turks, Ottomaans (1500-1928)</language>
+ <language type="oto">Otomi-talen</language>
+ <language type="pa">Punjabi</language>
+ <language type="paa">Papoeaas (overige)</language>
+ <language type="pag">Pangasinan</language>
+ <language type="pal">Pahlavi</language>
+ <language type="pam">Pampanga</language>
+ <language type="pap">Papiamento</language>
+ <language type="pau">Palauaans</language>
+ <language type="peo">Perzisch, oud- (ca. 600-400 v. Chr.)</language>
+ <language type="phi">Filippijns (overige)</language>
+ <language type="phn">Foenicisch</language>
+ <language type="pi">Pali</language>
+ <language type="pl">Pools</language>
+ <language type="pon">Pohnpeiaans</language>
+ <language type="pra">Prakrit-talen</language>
+ <language type="pro">Provençaals, oud- (tot 1500)</language>
+ <language type="ps">Pashto</language>
+ <language type="pt">Portugees</language>
+ <language type="qu">Quechua</language>
+ <language type="raj">Rajasthani</language>
+ <language type="rap">Rapanui</language>
+ <language type="rar">Rarotongan</language>
+ <language type="rm">Retoromaans</language>
+ <language type="rn">Rundi</language>
+ <language type="ro">Roemeens</language>
+ <language type="roa">Romaans (overige)</language>
+ <language type="rom">Romani</language>
+ <language type="root">Root</language>
+ <language type="ru">Russisch</language>
+ <language type="rup">Aromaniaans</language>
+ <language type="rw">Kinyarwanda</language>
+ <language type="sa">Sanskrit</language>
+ <language type="sad">Sandawe</language>
+ <language type="sah">Yakut</language>
+ <language type="sai">Zuid-Amerikaans Indiaans (overige)</language>
+ <language type="sal">Salishan-talen</language>
+ <language type="sam">Samaritaans-Aramees</language>
+ <language type="sas">Sasak</language>
+ <language type="sat">Santali</language>
+ <language type="sc">Sardinisch</language>
+ <language type="scn">Siciliaans</language>
+ <language type="sco">Schots</language>
+ <language type="sd">Sindhi</language>
+ <language type="se">Noord-Samisch</language>
+ <language type="sel">Selkup</language>
+ <language type="sem">Semitisch (overige)</language>
+ <language type="sg">Sango</language>
+ <language type="sga">Iers, oud- (tot 900)</language>
+ <language type="sgn">Gebarentalen</language>
+ <language type="sh">Servokroatisch</language>
+ <language type="shn">Shan</language>
+ <language type="si">Singalees</language>
+ <language type="sid">Sidamo</language>
+ <language type="sio">Siouaanse talen</language>
+ <language type="sit">Sino-Tibetaans (overige)</language>
+ <language type="sk">Slowaaks</language>
+ <language type="sl">Sloveens</language>
+ <language type="sla">Slavisch (overige)</language>
+ <language type="sm">Samoaans</language>
+ <language type="sma">Zuid-Samisch</language>
+ <language type="smi">Sami-talen (overige)</language>
+ <language type="smj">Lule Sami</language>
+ <language type="smn">Inari Sami</language>
+ <language type="sms">Skolt Sami</language>
+ <language type="sn">Shona</language>
+ <language type="snk">Soninke</language>
+ <language type="so">Somalisch</language>
+ <language type="sog">Sogdisch</language>
+ <language type="son">Songhai</language>
+ <language type="sq">Albanees</language>
+ <language type="sr">Servisch</language>
+ <language type="srn">Sranantongo</language>
+ <language type="srr">Serer</language>
+ <language type="ss">Swati</language>
+ <language type="ssa" draft="provisional">Nilo-Saharaans (overige)</language>
+ <language type="st">Sotho, zuid</language>
+ <language type="su">Sundanees</language>
+ <language type="suk">Sukuma</language>
+ <language type="sus">Soesoe</language>
+ <language type="sux">Soemerisch</language>
+ <language type="sv">Zweeds</language>
+ <language type="sw">Swahili</language>
+ <language type="syr">Syriac</language>
+ <language type="ta">Tamil</language>
+ <language type="tai">Tai (overige)</language>
+ <language type="te">Teloegoe</language>
+ <language type="tem">Timne</language>
+ <language type="ter">Tereno</language>
+ <language type="tet">Tetum</language>
+ <language type="tg">Tadzjik</language>
+ <language type="th">Thai</language>
+ <language type="ti">Tigrinya</language>
+ <language type="tig">Tigre</language>
+ <language type="tiv">Tiv</language>
+ <language type="tk">Turkmeens</language>
+ <language type="tkl">Tokelau</language>
+ <language type="tl">Tagalog</language>
+ <language type="tlh">Klingon</language>
+ <language type="tli">Tlingit</language>
+ <language type="tmh">Tamashek</language>
+ <language type="tn">Tswana</language>
+ <language type="to">Tonga (Tonga-eilanden)</language>
+ <language type="tog">Tonga (Nyasa)</language>
+ <language type="tpi">Tok Pisin</language>
+ <language type="tr">Turks</language>
+ <language type="ts">Tsonga</language>
+ <language type="tsi">Tsimshian</language>
+ <language type="tt">Tataars</language>
+ <language type="tum">Toemboeka</language>
+ <language type="tup">Tupi-talen</language>
+ <language type="tut">Altaïsch (overige)</language>
+ <language type="tvl">Tuvalu</language>
+ <language type="tw">Twi</language>
+ <language type="ty">Tahitisch</language>
+ <language type="tyv">Tuvinisch</language>
+ <language type="udm">Udmurt</language>
+ <language type="ug">Uighur</language>
+ <language type="uga">Oegaritisch</language>
+ <language type="uk">Oekraïens</language>
+ <language type="umb">Umbundu</language>
+ <language type="und">Onbepaald</language>
+ <language type="ur">Urdu</language>
+ <language type="uz">Oezbeeks</language>
+ <language type="vai">Vai</language>
+ <language type="ve">Venda</language>
+ <language type="vi">Vietnamees</language>
+ <language type="vo">Volapük</language>
+ <language type="vot">Votisch</language>
+ <language type="wa">Wallonisch</language>
+ <language type="wak">Wakashan-talen</language>
+ <language type="wal">Walamo</language>
+ <language type="war">Waray</language>
+ <language type="was">Washo</language>
+ <language type="wen">Sorbische talen</language>
+ <language type="wo">Wolof</language>
+ <language type="xal">Kalmyk</language>
+ <language type="xh">Xhosa</language>
+ <language type="yao">Yao</language>
+ <language type="yap">Yapees</language>
+ <language type="yi">Jiddisch</language>
+ <language type="yo">Joruba</language>
+ <language type="ypk">Yupik-talen</language>
+ <language type="za">Zhuang</language>
+ <language type="zap">Zapotec</language>
+ <language type="zen">Zenaga</language>
+ <language type="zh">Chinees</language>
+ <language type="znd">Zande</language>
+ <language type="zu">Zulu</language>
+ <language type="zun">Zuni</language>
+ </languages>
+ <scripts>
+ <script type="Arab">Arabisch</script>
+ <script type="Armn">Armeens</script>
+ <script type="Bali">Balinees</script>
+ <script type="Batk">Batak</script>
+ <script type="Beng">Bengalees</script>
+ <script type="Blis">Blissymbolen</script>
+ <script type="Bopo">Bopomofo</script>
+ <script type="Brah">Brahmi</script>
+ <script type="Brai">Braille</script>
+ <script type="Bugi">Buginees</script>
+ <script type="Buhd">Buhid</script>
+ <script type="Cans">Verenigde Canadese Aboriginal-symbolen</script>
+ <script type="Cher">Cherokee</script>
+ <script type="Cirt">Cirth</script>
+ <script type="Copt">Koptisch</script>
+ <script type="Cprt">Cyprisch</script>
+ <script type="Cyrl">Cyrillisch</script>
+ <script type="Cyrs">Cyrillisch (Oudkerkslavische variant)</script>
+ <script type="Deva">Devanagari</script>
+ <script type="Dsrt">Deseret</script>
+ <script type="Egyd">Egyptisch (demotisch)</script>
+ <script type="Egyh">Egyptisch (hiëratisch)</script>
+ <script type="Egyp" draft="provisional">Egyptisch (hiërogliefen)</script>
+ <script type="Ethi">Ethiopisch</script>
+ <script type="Geok">Khutsuri (Asomtavruli en Nuskhuri)</script>
+ <script type="Geor">Georgisch</script>
+ <script type="Glag">Glagolitisch</script>
+ <script type="Goth">Gothisch</script>
+ <script type="Grek">Grieks</script>
+ <script type="Gujr">Gujarati</script>
+ <script type="Guru">Gurmukhi</script>
+ <script type="Hang">Hangul</script>
+ <script type="Hani">Han</script>
+ <script type="Hano">Hanunoo</script>
+ <script type="Hans">Vereenvoudigd Han</script>
+ <script type="Hant">Traditioneel Han</script>
+ <script type="Hebr">Hebreeuws</script>
+ <script type="Hira">Hiragana</script>
+ <script type="Hmng">Pahawh Hmong</script>
+ <script type="Hrkt">Katakana of Hiragana</script>
+ <script type="Hung">Oudhongaars</script>
+ <script type="Inds">Indus (Harappan)</script>
+ <script type="Ital">Oud-italisch</script>
+ <script type="Java">Javaans</script>
+ <script type="Kali">Kayah Li</script>
+ <script type="Kana">Katakana</script>
+ <script type="Khar">Kharoshthi</script>
+ <script type="Khmr">Khmer</script>
+ <script type="Knda">Kannada</script>
+ <script type="Laoo">Lao</script>
+ <script type="Latf">Latijn (Fraktur-variant)</script>
+ <script type="Latg">Latijn (Gaelic variant)</script>
+ <script type="Latn">Latijn</script>
+ <script type="Lepc">Lepcha (Róng)</script>
+ <script type="Limb">Limbu</script>
+ <script type="Lina">Lineair A</script>
+ <script type="Linb">Lineair B</script>
+ <script type="Mand">Mandaeans</script>
+ <script type="Maya">Mayahiërogliefen</script>
+ <script type="Mero">Meroïtisch</script>
+ <script type="Mlym">Malayalam</script>
+ <script type="Mong">Mongools</script>
+ <script type="Mymr">Myanmar</script>
+ <script type="Nkoo">N’Ko</script>
+ <script type="Ogam">Ogham</script>
+ <script type="Orkh">Orkhon</script>
+ <script type="Orya">Oriya</script>
+ <script type="Osma">Osmanya</script>
+ <script type="Perm">Oudpermisch</script>
+ <script type="Phag">Phags-pa</script>
+ <script type="Phnx">Foenicisch</script>
+ <script type="Plrd">Pollard-fonetisch</script>
+ <script type="Qaai">Overgeërfd</script>
+ <script type="Roro">Rongorongo</script>
+ <script type="Runr">Runic</script>
+ <script type="Sara">Sarati</script>
+ <script type="Shaw">Shavian</script>
+ <script type="Sinh">Sinhala</script>
+ <script type="Sylo">Syloti Nagri</script>
+ <script type="Syrc">Syriac</script>
+ <script type="Syre" draft="provisional">Aramees (Estrangelo-variant)</script>
+ <script type="Syrj" draft="provisional">Aramees (Westelijke variant)</script>
+ <script type="Syrn" draft="provisional">Aramees (Oostelijke variant)</script>
+ <script type="Tagb">Tagbanwa</script>
+ <script type="Tale">Tai Le</script>
+ <script type="Talu">Tai Lue (nieuw)</script>
+ <script type="Taml">Tamil</script>
+ <script type="Telu">Telugu</script>
+ <script type="Teng">Tengwar</script>
+ <script type="Tfng">Tifinagh (Berber)</script>
+ <script type="Tglg">Tagalog</script>
+ <script type="Thaa">Thaana</script>
+ <script type="Tibt">Tibetaans</script>
+ <script type="Ugar">Ugaritisch</script>
+ <script type="Vaii">Vai</script>
+ <script type="Visp">Zichtbare spraak</script>
+ <script type="Xpeo">Oudperzisch</script>
+ <script type="Xsux">Sumero-Akkadian Cuneiform</script>
+ <script type="Yiii">Yi</script>
+ <script type="Zxxx">Code voor ongeschreven talen</script>
+ <script type="Zyyy">Algemeen</script>
+ <script type="Zzzz">Code voor ongecodeerde schriftsystemen</script>
+ </scripts>
+ <territories>
+ <territory type="001">Wereld</territory>
+ <territory type="002">Afrika</territory>
+ <territory type="005">Zuid-Amerika</territory>
+ <territory type="009">Oceanië</territory>
+ <territory type="011">West-Afrika</territory>
+ <territory type="013">Midden-Amerika</territory>
+ <territory type="014">Oost-Afrika</territory>
+ <territory type="015">Noord-Afrika</territory>
+ <territory type="017">Centraal-Afrika</territory>
+ <territory type="018">Zuidelijk Afrika</territory>
+ <territory type="019">Amerika</territory>
+ <territory type="021">Noord-Amerika</territory>
+ <territory type="029">Caribisch gebied</territory>
+ <territory type="030">Oost-Azië</territory>
+ <territory type="034">Zuid-Azië</territory>
+ <territory type="035">Zuidoost-Azië</territory>
+ <territory type="039">Zuid-Europa</territory>
+ <territory type="053">Australië en Nieuw-Zeeland</territory>
+ <territory type="054">Melanesië</territory>
+ <territory type="057">Micronesië</territory>
+ <territory type="061">Polynesië</territory>
+ <territory type="062">Zuidelijk Centraal-Azië</territory>
+ <territory type="142">Azië</territory>
+ <territory type="143">Centraal-Azië</territory>
+ <territory type="145">West-Azië</territory>
+ <territory type="150">Europa</territory>
+ <territory type="151">Oost-Europa</territory>
+ <territory type="154">Noord-Europa</territory>
+ <territory type="155">West-Europa</territory>
+ <territory type="419">Latijns-Amerika en het Caribisch gebied</territory>
+ <territory type="830">Kanaaleilanden</territory>
+ <territory type="IM">Isle of Man</territory>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Verenigde Arabische Emiraten</territory>
+ <territory type="AF">Afghanistan</territory>
+ <territory type="AG">Antigua en Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albanië</territory>
+ <territory type="AM">Armenië</territory>
+ <territory type="AN">Nederlandse Antillen</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarctica</territory>
+ <territory type="AR">Argentinië</territory>
+ <territory type="AS">Amerikaans Samoa</territory>
+ <territory type="AT">Oostenrijk</territory>
+ <territory type="AU">Australië</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Alandeilanden</territory>
+ <territory type="AZ">Azerbeidzjan</territory>
+ <territory type="BA">Bosnië Herzegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BE">België</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgarije</territory>
+ <territory type="BH">Bahrein</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei Darussalam</territory>
+ <territory type="BO">Bolivia</territory>
+ <territory type="BR">Brazilië</territory>
+ <territory type="BS">Bahama’s</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BV">Bouveteiland</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Wit-Rusland</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Canada</territory>
+ <territory type="CC">Cocoseilanden</territory>
+ <territory type="CD">Congo, Democratische Republiek</territory>
+ <territory type="CD" alt="proposed-u10-1" draft="provisional">Congo-Kinshasa</territory>
+ <territory type="CF">Centraal-Afrikaanse Republiek</territory>
+ <territory type="CG">Congo</territory>
+ <territory type="CG" alt="proposed-u10-1" draft="provisional">Congo-Brazzaville</territory>
+ <territory type="CH">Zwitserland</territory>
+ <territory type="CI">Ivoorkust</territory>
+ <territory type="CK">Cookeilanden</territory>
+ <territory type="CL">Chili</territory>
+ <territory type="CM">Kameroen</territory>
+ <territory type="CN">China</territory>
+ <territory type="CO">Colombia</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS">Servië en Montenegro</territory>
+ <territory type="CU">Cuba</territory>
+ <territory type="CV">Kaapverdië</territory>
+ <territory type="CX">Christmaseiland</territory>
+ <territory type="CY">Cyprus</territory>
+ <territory type="CZ">Tsjechië</territory>
+ <territory type="DE">Duitsland</territory>
+ <territory type="DJ">Djibouti</territory>
+ <territory type="DK">Denemarken</territory>
+ <territory type="DM">Dominica</territory>
+ <territory type="DO">Dominicaanse Republiek</territory>
+ <territory type="DZ">Algerije</territory>
+ <territory type="EC">Ecuador</territory>
+ <territory type="EE">Estland</territory>
+ <territory type="EG">Egypte</territory>
+ <territory type="EH">West-Sahara</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Spanje</territory>
+ <territory type="ET">Ethiopië</territory>
+ <territory type="FI">Finland</territory>
+ <territory type="FJ">Fiji</territory>
+ <territory type="FK">Falklandeilanden</territory>
+ <territory type="FM">Micronesia</territory>
+ <territory type="FO">Faeröer</territory>
+ <territory type="FR">Frankrijk</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Verenigd Koninkrijk</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Georgië</territory>
+ <territory type="GF">Frans-Guyana</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Groenland</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Equatoriaal-Guinea</territory>
+ <territory type="GR">Griekenland</territory>
+ <territory type="GS">Zuid-Georgië en Zuidelijke Sandwicheilanden</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinee-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Hongkong S.A.R. van China</territory>
+ <territory type="HM">Heard- en McDonaldeilanden</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Kroatië</territory>
+ <territory type="HT">Haïti</territory>
+ <territory type="HU">Hongarije</territory>
+ <territory type="ID">Indonesië</territory>
+ <territory type="IE">Ierland</territory>
+ <territory type="IL">Israël</territory>
+ <territory type="IN">India</territory>
+ <territory type="IO">Britse Gebieden in de Indische Oceaan</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">IJsland</territory>
+ <territory type="IT">Italië</territory>
+ <territory type="JM">Jamaica</territory>
+ <territory type="JO">Jordanië</territory>
+ <territory type="JP">Japan</territory>
+ <territory type="KE">Kenia</territory>
+ <territory type="KG">Kirgizstan</territory>
+ <territory type="KH">Cambodja</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Comoren</territory>
+ <territory type="KN">Saint Kitts en Nevis</territory>
+ <territory type="KP">Noord-Korea</territory>
+ <territory type="KR">Zuid-Korea</territory>
+ <territory type="KW">Koeweit</territory>
+ <territory type="KY">Caymaneilanden</territory>
+ <territory type="KZ">Kazachstan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Libanon</territory>
+ <territory type="LC">Saint Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberia</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Litouwen</territory>
+ <territory type="LU">Luxemburg</territory>
+ <territory type="LV">Letland</territory>
+ <territory type="LY">Libië</territory>
+ <territory type="MA">Marokko</territory>
+ <territory type="MC">Monaco</territory>
+ <territory type="MD">Moldavië</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshalleilanden</territory>
+ <territory type="MK">Macedonië</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongolië</territory>
+ <territory type="MO">Macao S.A.R. van China</territory>
+ <territory type="MP">Noordelijke Marianeneilanden</territory>
+ <territory type="MQ">Martinique</territory>
+ <territory type="MR">Mauritanië</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Maldiven</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Mexico</territory>
+ <territory type="MY">Maleisië</territory>
+ <territory type="MZ">Mozambique</territory>
+ <territory type="NA">Namibië</territory>
+ <territory type="NC">Nieuw-Caledonië</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Norfolkeiland</territory>
+ <territory type="NG">Nigeria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Nederland</territory>
+ <territory type="NO">Noorwegen</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Nieuw-Zeeland</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Frans-Polynesië</territory>
+ <territory type="PG">Papoea-Nieuw-Guinea</territory>
+ <territory type="PH">Filipijnen</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Polen</territory>
+ <territory type="PM">Saint Pierre en Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Puerto Rico</territory>
+ <territory type="PS">Palestijns Gebied</territory>
+ <territory type="PT">Portugal</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Qatar</territory>
+ <territory type="QO">Oceanië (overige)</territory>
+ <territory type="RE">Réunion</territory>
+ <territory type="RO">Roemenië</territory>
+ <territory type="RU">Rusland</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Saoedi-Arabië</territory>
+ <territory type="SB">Salomonseilanden</territory>
+ <territory type="SC">Seychellen</territory>
+ <territory type="SD">Soedan</territory>
+ <territory type="SE">Zweden</territory>
+ <territory type="SG">Singapore</territory>
+ <territory type="SH">Saint Helena</territory>
+ <territory type="SI">Slovenië</territory>
+ <territory type="SJ">Svalbard en Jan Mayen</territory>
+ <territory type="SK">Slowakije</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalië</territory>
+ <territory type="SR">Suriname</territory>
+ <territory type="ST">Sao Tomé en Principe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Syrië</territory>
+ <territory type="SZ">Swaziland</territory>
+ <territory type="TC">Turks- en Caicoseilanden</territory>
+ <territory type="TD">Tsjaad</territory>
+ <territory type="TF">Franse Gebieden in de zuidelijke Indische Oceaan</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Thailand</territory>
+ <territory type="TJ">Tadzjikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Oost-Timor</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunesië</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turkije</territory>
+ <territory type="TT">Trinidad en Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TZ">Tanzania</territory>
+ <territory type="UA">Oekraïne</territory>
+ <territory type="UG">Oeganda</territory>
+ <territory type="UM">Amerikaanse ondergeschikte afgelegen eilanden</territory>
+ <territory type="US">Verenigde Staten</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Oezbekistan</territory>
+ <territory type="VA">Vaticaanstad</territory>
+ <territory type="VC">Saint Vincent en de Grenadines</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Britse Maagdeneilanden</territory>
+ <territory type="VI">Amerikaanse Maagdeneilanden</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis en Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Zuid-Afrika</territory>
+ <territory type="ZM">Zambia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ <variants>
+ <variant type="1901">Traditionele Duitse ortografie</variant>
+ <variant type="1996">Duitse ortografie van 1996</variant>
+ <variant type="NEDIS">Natisone (dialect)</variant>
+ <variant type="POLYTONI">Polytonaal</variant>
+ <variant type="REVISED">Gewijzigde ortografie</variant>
+ <variant type="ROZAJ">Resiaans</variant>
+ <variant type="SAAHO">Saho</variant>
+ </variants>
+ <keys>
+ <key type="calendar">Kalender</key>
+ <key type="collation">Volgorde</key>
+ <key type="currency">Munteenheid</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">Traditioneel Chinees</type>
+ <type type="buddhist" key="calendar">Boeddhistische kalender</type>
+ <type type="chinese" key="calendar">Chinese kalender</type>
+ <type type="direct" key="collation">Directe volgorde</type>
+ <type type="gb2312han" key="collation">Vereenvoudigd Chinees</type>
+ <type type="gregorian" key="calendar">Gregoriaanse kalender</type>
+ <type type="hebrew" key="calendar">Joodse kalender</type>
+ <type type="islamic" key="calendar">Islamitische kalender</type>
+ <type type="islamic-civil" key="calendar">Islamitische kalender (cyclisch)</type>
+ <type type="japanese" key="calendar">Japanse kalender</type>
+ <type type="phonebook" key="collation">Telefoonboekvolgorde</type>
+ <type type="pinyin" key="collation">Pinyinvolgorde</type>
+ <type type="stroke" key="collation">Streekvolgorde</type>
+ <type type="traditional" key="collation">Traditionele volgorde</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US" draft="provisional">Amerikaans</measurementSystemName>
+ <measurementSystemName type="metric">Metriek</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a á ä b-e é ë f-i í ï {ij} j-o ó ö p-u ú ü v-z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[å ã ç ñ ô]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>‘</quotationStart>
+ <quotationEnd>’</quotationEnd>
+ <alternateQuotationStart>“</alternateQuotationStart>
+ <alternateQuotationEnd>â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">jan</month>
+ <month type="2">feb</month>
+ <month type="3">mrt</month>
+ <month type="4">apr</month>
+ <month type="5">mei</month>
+ <month type="6">jun</month>
+ <month type="7">jul</month>
+ <month type="8">aug</month>
+ <month type="9">sep</month>
+ <month type="10">okt</month>
+ <month type="11">nov</month>
+ <month type="12">dec</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">januari</month>
+ <month type="2">februari</month>
+ <month type="3">maart</month>
+ <month type="4">april</month>
+ <month type="5">mei</month>
+ <month type="6">juni</month>
+ <month type="7">juli</month>
+ <month type="8">augustus</month>
+ <month type="9">september</month>
+ <month type="10">oktober</month>
+ <month type="11">november</month>
+ <month type="12">december</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">J</month>
+ <month type="2">F</month>
+ <month type="3">M</month>
+ <month type="4">A</month>
+ <month type="5">M</month>
+ <month type="6">J</month>
+ <month type="7">J</month>
+ <month type="8">A</month>
+ <month type="9">S</month>
+ <month type="10">O</month>
+ <month type="11">N</month>
+ <month type="12">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">zo</day>
+ <day type="mon">ma</day>
+ <day type="tue">di</day>
+ <day type="wed">wo</day>
+ <day type="thu">do</day>
+ <day type="fri">vr</day>
+ <day type="sat">za</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">zondag</day>
+ <day type="mon">maandag</day>
+ <day type="tue">dinsdag</day>
+ <day type="wed">woensdag</day>
+ <day type="thu">donderdag</day>
+ <day type="fri">vrijdag</day>
+ <day type="sat">zaterdag</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">Z</day>
+ <day type="mon">M</day>
+ <day type="tue">D</day>
+ <day type="wed">W</day>
+ <day type="thu">D</day>
+ <day type="fri">V</day>
+ <day type="sat">Z</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">K1</quarter>
+ <quarter type="2">K2</quarter>
+ <quarter type="3">K3</quarter>
+ <quarter type="4">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="provisional">1e kwartaal</quarter>
+ <quarter type="2" draft="provisional">2e kwartaal</quarter>
+ <quarter type="3" draft="provisional">3e kwartaal</quarter>
+ <quarter type="4" draft="provisional">4e kwartaal</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraAbbr>
+ <era type="0">v. Chr.</era>
+ <era type="1">n. Chr.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd-MM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH:mm:ss v</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM-yy</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="provisional">QQQQ yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName>Tijdperk</displayName>
+ </field>
+ <field type="year">
+ <displayName>Jaar</displayName>
+ </field>
+ <field type="month">
+ <displayName>Maand</displayName>
+ </field>
+ <field type="day">
+ <displayName>Dag</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>Dag van de week</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName draft="provisional">Dagdeel</displayName>
+ </field>
+ <field type="hour">
+ <displayName>Uur</displayName>
+ </field>
+ <field type="minute">
+ <displayName>Minuut</displayName>
+ </field>
+ <field type="second">
+ <displayName>Seconde</displayName>
+ </field>
+ </fields>
+ </calendar>
+ <calendar type="hebrew">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1">Tisjrie</month>
+ <month type="2">Chesjwan</month>
+ <month type="5">Sjevat</month>
+ <month type="6">Adar</month>
+ <month type="7">Adar B</month>
+ <month type="9">Ijar</month>
+ <month type="11">Tammoez</month>
+ <month type="13">Elloel</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="islamic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1">Moeharram</month>
+ <month type="3">Rabiʻa al awal</month>
+ <month type="4">Rabiʻa al thani</month>
+ <month type="5">Joemadʻal awal</month>
+ <month type="6">Joemadʻal thani</month>
+ <month type="8">Sjaʻaban</month>
+ <month type="10">Sjawal</month>
+ <month type="11">Doe al kaʻaba</month>
+ <month type="12">Doe al hizja</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <eras>
+ <eraAbbr>
+ <era type="0">Saʻna Hizjria</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Africa/Timbuktu">
+ <exemplarCity>Timboektoe</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/ComodRivadavia">
+ <exemplarCity>Comodora Rivadavia</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Zuidpool</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity>Dumont d'Urville</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Rio_Gallegos">
+ <exemplarCity>Río Gallegos</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity>Córdoba</exemplarCity>
+ </zone>
+ <zone type="America/Porto_Velho">
+ <exemplarCity>Pôrto Velho</exemplarCity>
+ </zone>
+ <zone type="America/Cuiaba">
+ <exemplarCity>Cuiabá</exemplarCity>
+ </zone>
+ <zone type="America/Belem">
+ <exemplarCity>Belém</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>São Paulo</exemplarCity>
+ </zone>
+ <zone type="America/Maceio">
+ <exemplarCity>Maceió</exemplarCity>
+ </zone>
+ <zone type="America/Montreal">
+ <exemplarCity>Montréal</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <standard>Atlantic-standaardtijd</standard>
+ <daylight>Atlantic-zomertijd</daylight>
+ </long>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <standard>Newfoundland-standaardtijd</standard>
+ <daylight>Newfoundland-zomertijd</daylight>
+ </long>
+ <exemplarCity>St. Johns</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>Paaseiland</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <standard>Chinese standaardtijd</standard>
+ <daylight>Chinese standaardtijd</daylight>
+ </long>
+ <exemplarCity draft="provisional">Sjanghai</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>Canarische Eilanden</exemplarCity>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <standard>Midden-Europese standaardtijd</standard>
+ <daylight>Midden-Europese zomertijd</daylight>
+ </long>
+ <short>
+ <standard>CET</standard>
+ <daylight>CEST</daylight>
+ </short>
+ <exemplarCity>Parijs</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>Londen</exemplarCity>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <standard>Israëlische standaardtijd</standard>
+ <daylight>Israëlische zomertijd</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IDT</daylight>
+ </short>
+ <exemplarCity>Jeruzalem</exemplarCity>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <standard>Japanse standaardtijd</standard>
+ <daylight>Japanse standaardtijd</daylight>
+ </long>
+ <short>
+ <standard>JST</standard>
+ <daylight>JST</daylight>
+ </short>
+ <exemplarCity>Tokyo</exemplarCity>
+ <exemplarCity alt="proposed-u10-1" draft="provisional">Tokio</exemplarCity>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <standard>Greenwich Mean Time</standard>
+ <daylight>Greenwich Mean Time</daylight>
+ </long>
+ <short>
+ <standard>GMT</standard>
+ <daylight>GMT</daylight>
+ </short>
+ <exemplarCity>Casablanca</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>Ulaanbaator</exemplarCity>
+ </zone>
+ <zone type="America/Mazatlan">
+ <exemplarCity>Mazatlán</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>Mexico Stad</exemplarCity>
+ <exemplarCity alt="proposed-u10-1" draft="provisional">Mexico-stad</exemplarCity>
+ </zone>
+ <zone type="America/Merida">
+ <exemplarCity>Mérida</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>Cancún</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>Azoren</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lissabon</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>Oost-Europese standaardtijd</standard>
+ <daylight>Oost-Europese zomertijd</daylight>
+ </long>
+ <short>
+ <standard>EET</standard>
+ <daylight>EEST</daylight>
+ </short>
+ <exemplarCity>Boekarest</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moskou</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity draft="provisional">Jekaterinenburg</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity draft="provisional">Krasnojarsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity draft="provisional">Irkoetsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity draft="provisional">Jakoetsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity draft="provisional">Sachalin</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity draft="provisional">Kamtsjatka</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity draft="provisional">Oezjhorod</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity draft="provisional">Zaporizja</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <standard>Hawaï-standaardtijd</standard>
+ <daylight>Hawaï-standaardtijd</daylight>
+ </long>
+ <short>
+ <standard>HST</standard>
+ <daylight>HST</daylight>
+ </short>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <standard>Alaska-standaardtijd</standard>
+ <daylight>Alaska-zomertijd</daylight>
+ </long>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <standard>Pacific-standaardtijd</standard>
+ <daylight>Pacific-zomertijd</daylight>
+ </long>
+ <short>
+ <standard>PST</standard>
+ <daylight>PDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Phoenix">
+ <long>
+ <standard>Mountain-standaardtijd</standard>
+ <daylight>Mountain-standaardtijd</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MST</daylight>
+ </short>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <standard>Mountain-standaardtijd</standard>
+ <daylight>Mountain-zomertijd</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <standard>Central-standaardtijd</standard>
+ <daylight>Central-zomertijd</daylight>
+ </long>
+ <short>
+ <standard>CST</standard>
+ <daylight>CDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <standard>Eastern-standaardtijd</standard>
+ <daylight>Eastern-zomertijd</daylight>
+ </long>
+ <short>
+ <standard>EST</standard>
+ <daylight>EDT</daylight>
+ </short>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Tasjkent</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Andorrese peseta</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>Verenigde Arabische Emiraten-dirham</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>Afghani (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>Afghani</displayName>
+ <symbol>Af</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>Albanese lek</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>Armeense dram</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>Nederlands-Antilliaanse gulden</displayName>
+ <symbol>NA f.</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>Angolese kwanza</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Angolese kwanza (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>Angolese nieuwe kwanza (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>Angolese kwanza reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>Argentijnse austral</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Argentijnse peso (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Argentijnse peso</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>Oostenrijkse schilling</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>Australische dollar</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>Arubaanse gulden</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>Azerbeidzjaanse manat</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>Bosnische dinar</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>Bosnische convertibele mark</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>Barbadaanse dollar</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>Bengalese taka</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>Belgische frank (convertibel)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Belgische frank</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>Belgische frank (financieel)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>Bulgaarse harde lev</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>Bulgaarse nieuwe lev</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>Bahreinse dinar</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>Burundese franc</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>Bermuda-dollar</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>Bruneise dollar</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>Boliviano</displayName>
+ <symbol>Bs</symbol>
+ </currency>
+ <currency type="BOP">
+ <displayName>Boliviaanse peso</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Boliviaanse mvdol</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>Braziliaanse cruzeiro novo (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>Braziliaanse cruzado</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>Braziliaanse cruzeiro (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Braziliaanse real</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRN">
+ <displayName>Braziliaanse cruzado novo</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>Braziliaanse cruzeiro</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>Bahamaanse dollar</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>Bhutaanse ngultrum</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>Birmese kyat</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>Botswaanse pula</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>Wit-Russische nieuwe roebel (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>Wit-Russische roebel</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>Belizaanse dollar</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>Canadese dollar</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>Congolese franc</displayName>
+ </currency>
+ <currency type="CHE">
+ <displayName>WIR euro</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Zwitserse franc</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CHW">
+ <displayName>WIR franc</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>Chileense unidades de fomento</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Chileense peso</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>Chinese yuan renminbi</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>Colombiaanse peso</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="COU">
+ <displayName>Unidad de Valor Real</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>Costaricaanse colón</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSD">
+ <displayName>Servische dinar</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>Tsjechoslowaakse harde koruna</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Cubaanse peso</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Kaapverdische escudo</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>Cyprisch pond</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>Tsjechische koruna</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>Oost-Duitse ostmark</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Duitse mark</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Djiboutiaanse franc</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>Deense kroon</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>Dominicaanse peso</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>Algerijnse dinar</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>Ecuadoraanse sucre</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>Ecuadoraanse unidad de valor constante (UVC)</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>Estlandse kroon</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>Egyptisch pond</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Eritrese nakfa</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName>Spaanse peseta (account A)</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName>Spaanse peseta (convertibele account)</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Spaanse peseta</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>Ethiopische birr</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>Finse markka</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Fijische dollar</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>Falklandeilands pond</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Franse franc</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Brits pond sterling</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>Georgische kupon larit</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>Georgische lari</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>Ghanese cedi</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>Gibraltarees pond</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>Gambiaanse dalasi</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Guinese franc</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>Guinese syli</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Equatoriaal-Guinese ekwele guineana</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Griekse drachme</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Guatemalteekse quetzal</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>Portugees-Guinese escudo</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Guinee-Bissause peso</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>Guyaanse dollar</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>Hongkongse dollar</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>Hondurese lempira</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>Kroatische dinar</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Kroatische kuna</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>Haïtiaanse gourde</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Hongaarse forint</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>Indonesische rupiah</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>Iers pond</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>Israëlisch pond</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Israëlische nieuwe shekel</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Indiase rupee</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>Iraakse dinar</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>Iraanse rial</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>IJslandse kroon</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>Italiaanse lire</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>Jamaicaanse dollar</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>Jordaanse dinar</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>Japanse yen</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>Kenyaanse shilling</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>Kirgizische som</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>Cambodjaanse riel</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>Comorese franc</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>Noord-Koreaanse won</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Zuid-Koreaanse won</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>Koeweitse dinar</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>Caymaneilandse dollar</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Kazachstaanse tenge</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>Laotiaanse kip</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>Libanees pond</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>Srilankaanse rupee</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>Liberiaanse dollar</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Lesothaanse loti</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LTL">
+ <displayName>Litouwse litas</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Litouwse talonas</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName>Luxemburgse convertibele franc</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Luxemburgse frank</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName>Luxemburgse financiële franc</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Letse lats</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>Letse roebel</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>Libische dinar</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>Marokkaanse dirham</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>Marokkaanse franc</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>Moldavische leu</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>Malagassische ariary</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Malagassische franc</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>Macedonische denar</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>Malinese franc</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Myanmarese kyat</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>Mongoolse tugrik</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Macause pataca</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Mauritaanse ouguiya</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>Maltese lire</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>Maltees pond</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>Mauritiaanse rupee</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>Maldivische rufiyaa</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Malawische kwacha</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>Mexicaanse peso</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>Mexicaanse zilveren peso (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>Mexicaanse unidad de inversion (UDI)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Maleisische ringgit</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>Mozambikaanse escudo</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Mozambikaanse metical</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>Namibische dollar</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>Nigeriaanse naira</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>Nicaraguaanse córdoba</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>Nicaraguaanse córdoba oro</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Nederlandse gulden</displayName>
+ <symbol>fl</symbol>
+ </currency>
+ <currency type="NOK">
+ <displayName>Noorse kroon</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>Nepalese rupee</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>Nieuw-Zeelandse dollar</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>Omaanse rial</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>Panamese balboa</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>Peruaanse inti</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>Peruaanse nieuwe sol</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>Peruaanse sol</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Papuaanse kina</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>Filipijnse peso</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>Pakistaanse rupee</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>Poolse zloty</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Poolse zloty (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Portugese escudo</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>Paraguayaanse guarani</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>Qatarese rial</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="ROL">
+ <displayName>Roemeense leu</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>Russische roebel</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Russische roebel (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>Rwandese franc</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>Saoedische rial</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>Salomonseilandse dollar</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>Seychelse rupee</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>Soedanese dinar</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>Soedanees pond</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>Zweedse kroon</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>Singaporese dollar</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>Sint-Heleense pond</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Sloveense tolar</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Slowaakse koruna</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>Sierraleoonse leone</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>Somalische shilling</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRD">
+ <displayName>Surinaamse dollar</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>Surinaamse gulden</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>Santomese dobra</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>Sovjet-roebel</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>Salvadoraanse colón</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>Syrisch pond</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>Swazische lilangeni</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>Thaise baht</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>Tadzjikistaanse roebel</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Tadzjikistaanse somoni</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Turkmeense manat</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>Tunesische dinar</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>Tongaanse paʻanga</displayName>
+ <symbol>T$</symbol>
+ </currency>
+ <currency type="TPE">
+ <displayName>Timorese escudo</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Turkse lire</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName>Nieuwe Turkse lire</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Trinidad en Tobago-dollar</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>Nieuwe Taiwanese dollar</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>Tanzaniaanse shilling</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>Oekraïense hryvnia</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Oekraïense karbovanetz</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Oegandese shilling (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Oegandese shilling</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>Amerikaanse dollar</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>Amerikaanse dollar (volgende dag)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>Amerikaanse dollar (zelfde dag)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>Uruguayaanse peso (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>Uruguayaanse peso uruguayo</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>Oezbekistaanse sum</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Venezolaanse bolivar</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>Vietnamese dong</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>Vanuatuaanse vatu</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>West-Samoaanse tala</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>CFA-franc BEAC</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName>Zilver</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>Goud</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>Europese samengestelde eenheid</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>Europese monetaire eenheid</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>Europese rekeneenheid (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>Europese rekeneenheid (XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>Oost-Caribische dollar</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>Special Drawing Rights</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>European Currency Unit</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>Franse gouden franc</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>Franse UIC-franc</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>CFA-franc BCEAO</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>CFP-franc</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="XPT">
+ <displayName>Platina</displayName>
+ </currency>
+ <currency type="XRE">
+ <displayName>RINET-fondsen</displayName>
+ </currency>
+ <currency type="XTS">
+ <displayName>Valutacode voor testdoeleinden</displayName>
+ </currency>
+ <currency type="XXX">
+ <displayName>Geen valuta</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>Jemenitische dinar</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Jemenitische rial</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>Joegoslavische harde dinar</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>Joegoslavische noviy-dinar</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>Joegoslavische convertibele dinar</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>Zuid-Afrikaanse rand (financieel)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Zuid-Afrikaanse rand</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Zambiaanse kwacha</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Zaïrese nieuwe zaïre</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Zaïrese zaïre</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Zimbabwaanse dollar</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>ja:j</yesstr>
+ <nostr>nee:n</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1" uri="http://ec.europa.eu/comm/translation/currencies/nltable1.htm">LANDNAMEN EN MUNTEENHEDEN (EU Country list)</reference>
+ <reference type="RP2" uri="http://taalunieversum.org/taal/aardrijkskundige_namen/">Nederlandse Taalnunie</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/nl_BE.xml b/libs/Zend/Locale/Data/nl_BE.xml
new file mode 100755
index 0000000000..f97899b08b
--- /dev/null
+++ b/libs/Zend/Locale/Data/nl_BE.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.51 $"/>
+ <generation date="$Date: 2006/10/26 22:46:09 $"/>
+ <language type="nl"/>
+ <territory type="BE"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="lv">Lets</language>
+ <language type="oc">Occitaans (na 1500); Provençaals</language>
+ <language type="sa">Sanskriet</language>
+ <language type="sh">Servo-Kroatisch</language>
+ <language type="ssa" draft="provisional">Nilo-Saharisch</language>
+ </languages>
+ <territories>
+ <territory type="013" draft="provisional">Centraal-Amerika</territory>
+ <territory type="143" draft="provisional">Centraal-Azië</territory>
+ <territory type="172">Gemenebest van Onafhankelijke Staten</territory>
+ <territory type="419" draft="provisional">Latijns-Amerika en de Caraïben</territory>
+ <territory type="IM">Het Eiland Man</territory>
+ <territory type="KG" draft="provisional">Kirgizië</territory>
+ <territory type="MV" draft="provisional">Malediven</territory>
+ <territory type="SB" draft="provisional">Salomoneilanden</territory>
+ <territory type="TZ" draft="provisional">Tanzanië</territory>
+ </territories>
+ <types>
+ <type type="traditional" key="collation">Traditioneel</type>
+ </types>
+ </localeDisplayNames>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMd" draft="provisional">d-MMM</dateFormatItem>
+ <dateFormatItem id="MMd" draft="provisional">d/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyMMM" draft="provisional">MMM-yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/nl_NL.xml b/libs/Zend/Locale/Data/nl_NL.xml
new file mode 100755
index 0000000000..025ce125a8
--- /dev/null
+++ b/libs/Zend/Locale/Data/nl_NL.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="nl"/>
+ <territory type="NL"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##0.00;¤ #,##0.00-</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/nn.xml b/libs/Zend/Locale/Data/nn.xml
new file mode 100755
index 0000000000..8d3d7d1a7a
--- /dev/null
+++ b/libs/Zend/Locale/Data/nn.xml
@@ -0,0 +1,1387 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.61 $"/>
+ <generation date="$Date: 2006/10/26 22:46:09 $"/>
+ <language type="nn"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">afar</language>
+ <language type="ab">abkhasisk</language>
+ <language type="ace">achinesisk</language>
+ <language type="ach">acoli</language>
+ <language type="ada">adangme</language>
+ <language type="ady">adyghe</language>
+ <language type="ae">avestisk</language>
+ <language type="af">afrikaans</language>
+ <language type="afa">afroasiatisk språk (anna)</language>
+ <language type="afh">afrihili</language>
+ <language type="ain">ainu</language>
+ <language type="ak">akan</language>
+ <language type="akk">akkadisk</language>
+ <language type="ale">aleutisk</language>
+ <language type="alg">algonkinsk språk</language>
+ <language type="alt">sør-altai</language>
+ <language type="am">amharisk</language>
+ <language type="an">aragonsk</language>
+ <language type="ang">gammalengelsk (ca. 450-1100)</language>
+ <language type="ang" alt="proposed-u219-1" draft="unconfirmed">gammalengelsk (c:a 450-1100)</language>
+ <language type="anp">angika</language>
+ <language type="apa">apache-språk</language>
+ <language type="ar">arabisk</language>
+ <language type="arc">arameisk</language>
+ <language type="arn">araukansk</language>
+ <language type="arp">arapaho</language>
+ <language type="art">kunstig (anna)</language>
+ <language type="art" alt="proposed-u219-1" draft="unconfirmed">kunstig språk (anna)</language>
+ <language type="arw">arawak</language>
+ <language type="as">assamisk</language>
+ <language type="ast">asturisk</language>
+ <language type="ath">athapaskansk språk</language>
+ <language type="aus">australsk språk</language>
+ <language type="av">avarisk</language>
+ <language type="awa">awadhi</language>
+ <language type="ay">aymara</language>
+ <language type="az">aserbajdsjansk</language>
+ <language type="ba">basjkirsk</language>
+ <language type="bad">banda</language>
+ <language type="bai">bamilekisk språk</language>
+ <language type="bal">baluchi</language>
+ <language type="ban">balinesisk</language>
+ <language type="bas">basa</language>
+ <language type="bat">baltisk (anna)</language>
+ <language type="bat" alt="proposed-u219-1" draft="unconfirmed">baltisk språk (anna)</language>
+ <language type="be">kviterussisk</language>
+ <language type="bej">beja</language>
+ <language type="bem">bemba</language>
+ <language type="ber">berbisk</language>
+ <language type="bg">bulgarsk</language>
+ <language type="bh">bihari</language>
+ <language type="bho">bhojpuri</language>
+ <language type="bi">bislama</language>
+ <language type="bik">bikol</language>
+ <language type="bin">bini</language>
+ <language type="bla">siksika</language>
+ <language type="bm">bambara</language>
+ <language type="bn">bengali</language>
+ <language type="bnt">bantu</language>
+ <language type="bo">tibetansk</language>
+ <language type="br">bretonsk</language>
+ <language type="bra">braj</language>
+ <language type="bs">bosnisk</language>
+ <language type="btk">batak (Indonesia)</language>
+ <language type="btk" alt="proposed-u219-1" draft="unconfirmed">batak</language>
+ <language type="bua">buriat</language>
+ <language type="bua" alt="proposed-u219-1" draft="unconfirmed">burjatisk</language>
+ <language type="bug">buginesisk</language>
+ <language type="byn">blin</language>
+ <language type="ca">katalansk</language>
+ <language type="cad">caddo</language>
+ <language type="cai">sentralamerikansk indiansk (anna)</language>
+ <language type="cai" alt="proposed-u219-1" draft="unconfirmed">sentralamerikansk indiansk språk (anna)</language>
+ <language type="car">karibisk</language>
+ <language type="cau">kaukasisk (anna)</language>
+ <language type="cau" alt="proposed-u219-1" draft="unconfirmed">kaukasisk språk (anna)</language>
+ <language type="ce">tsjetsjensk</language>
+ <language type="ceb">cebuansk</language>
+ <language type="cel">keltisk (anna)</language>
+ <language type="cel" alt="proposed-u219-1" draft="unconfirmed">keltisk språk (anna)</language>
+ <language type="ch">chamorro</language>
+ <language type="chb">chibcha</language>
+ <language type="chg">chagatai</language>
+ <language type="chk">chuukesisk</language>
+ <language type="chm">mari</language>
+ <language type="chn">chinook</language>
+ <language type="cho">choctaw</language>
+ <language type="chp">chipewiansk</language>
+ <language type="chr">cherokee</language>
+ <language type="chy">cheyenne</language>
+ <language type="cmc">kamisk språk</language>
+ <language type="co">korsikansk</language>
+ <language type="cop">koptisk</language>
+ <language type="cpe">kreolsk og pidgin, engelskbasert (anna)</language>
+ <language type="cpf">kreolsk og pidgin, franskbasert (anna)</language>
+ <language type="cpp">kreolsk og pidgin, portugisiskbasert (anna)</language>
+ <language type="cr">cree</language>
+ <language type="crh">krimtatarisk</language>
+ <language type="crp">kreolsk og pidgin (anna)</language>
+ <language type="crp" alt="proposed-u219-1" draft="unconfirmed">kreolspråk (anna)</language>
+ <language type="cs">tsjekkisk</language>
+ <language type="csb">kasjubisk</language>
+ <language type="cu">kyrkjeslavisk</language>
+ <language type="cus">kusjitisk språk (anna)</language>
+ <language type="cv">tsjuvansk</language>
+ <language type="cy">walisisk</language>
+ <language type="da">dansk</language>
+ <language type="dak">dakota</language>
+ <language type="dar">dargwa</language>
+ <language type="day">dayak</language>
+ <language type="de">tysk</language>
+ <language type="del">delaware</language>
+ <language type="den">slavej</language>
+ <language type="dgr">dogrib</language>
+ <language type="din">dinka</language>
+ <language type="doi">dogri</language>
+ <language type="dra">dravidisk språk (anna)</language>
+ <language type="dsb">lågsorbisk</language>
+ <language type="dua">duala</language>
+ <language type="dum">mellumnederlandsk</language>
+ <language type="dv">divehi</language>
+ <language type="dyu">dyula</language>
+ <language type="dz">dzongkha</language>
+ <language type="ee">ewe</language>
+ <language type="efi">efik</language>
+ <language type="egy">egyptisk (historisk)</language>
+ <language type="eka">ekajuk</language>
+ <language type="el">gresk</language>
+ <language type="elx">elamittisk</language>
+ <language type="en">engelsk</language>
+ <language type="enm">mellomengelsk (1100-1500)</language>
+ <language type="eo">esperanto</language>
+ <language type="es">spansk</language>
+ <language type="et">estisk</language>
+ <language type="eu">baskisk</language>
+ <language type="ewo">ewondo</language>
+ <language type="fa">persisk</language>
+ <language type="fan">fang</language>
+ <language type="fat">fanti</language>
+ <language type="ff">fulani</language>
+ <language type="fi">finsk</language>
+ <language type="fil">filippinsk</language>
+ <language type="fiu">finsk-ugrisk språk (anna)</language>
+ <language type="fj">fijiansk</language>
+ <language type="fo">færøysk</language>
+ <language type="fon">fon</language>
+ <language type="fr">fransk</language>
+ <language type="frm">mellomfransk (ca.1400-1600)</language>
+ <language type="frm" alt="proposed-u219-1" draft="unconfirmed">mellomfransk (c:a 1400-1600)</language>
+ <language type="fro">gammalfransk (842 til ca.1400)</language>
+ <language type="fro" alt="proposed-u219-1" draft="unconfirmed">gammalfransk (842 til c:a 1400)</language>
+ <language type="frr">nordfrisisk</language>
+ <language type="frs">austfrisisk</language>
+ <language type="fur">friuliansk</language>
+ <language type="fy">vestfrisisk</language>
+ <language type="ga">irsk</language>
+ <language type="gaa">ga</language>
+ <language type="gay">gayo</language>
+ <language type="gba">gbaya</language>
+ <language type="gd">skotsk-gælisk</language>
+ <language type="gem">germansk språk (anna)</language>
+ <language type="gez">ges</language>
+ <language type="gil">kiribatisk; gilbertesisk</language>
+ <language type="gl">galicisk</language>
+ <language type="gmh">mellomhøgtysk (ca.1050-1500)</language>
+ <language type="gmh" alt="proposed-u219-1" draft="unconfirmed">mellomhøgtysk (c:a 1050-1500)</language>
+ <language type="gn">guarani</language>
+ <language type="goh">gammalhøgtysk (ca.750-1050)</language>
+ <language type="goh" alt="proposed-u219-1" draft="unconfirmed">gammalhøgtysk (c:a 750-1050)</language>
+ <language type="gon">gondi</language>
+ <language type="gor">gorontalo</language>
+ <language type="got">gotisk</language>
+ <language type="grb">grebo</language>
+ <language type="grc">gammalgresk (til 1453)</language>
+ <language type="gsw">sveitsertysk</language>
+ <language type="gu">gujarati</language>
+ <language type="gv">manx</language>
+ <language type="gwi">gwichin</language>
+ <language type="ha">hausa</language>
+ <language type="hai">haida</language>
+ <language type="haw">hawaiisk</language>
+ <language type="he">hebraisk</language>
+ <language type="hi">hindi</language>
+ <language type="hil">hiligaynon</language>
+ <language type="him">himachali</language>
+ <language type="hit">hettittisk</language>
+ <language type="hmn">hmong</language>
+ <language type="ho">hiri motu</language>
+ <language type="hr">kroatisk</language>
+ <language type="hsb">høgsorbisk</language>
+ <language type="ht">haitisk</language>
+ <language type="hu">ungarsk</language>
+ <language type="hup">hupa</language>
+ <language type="hy">armensk</language>
+ <language type="hz">herero</language>
+ <language type="ia">interlingua</language>
+ <language type="iba">iban</language>
+ <language type="id">indonesisk</language>
+ <language type="ie">interlingue</language>
+ <language type="ig">ibo</language>
+ <language type="ii">sichuan-yi</language>
+ <language type="ijo">ijo</language>
+ <language type="ik">inupiak</language>
+ <language type="ilo">iloko</language>
+ <language type="inc">indisk språk (anna)</language>
+ <language type="ine">indo-europeisk språk (anna)</language>
+ <language type="inh">ingusjisk</language>
+ <language type="io">ido</language>
+ <language type="ira">iransk</language>
+ <language type="iro">irokansk språk</language>
+ <language type="is">islandsk</language>
+ <language type="it">italiensk</language>
+ <language type="iu">inuktitut</language>
+ <language type="ja">japansk</language>
+ <language type="jbo">lojban</language>
+ <language type="jpr">jødepersisk</language>
+ <language type="jrb">jødearabisk</language>
+ <language type="jv">javanesisk</language>
+ <language type="ka">georgisk</language>
+ <language type="kaa">karakalpakisk</language>
+ <language type="kab">kabylsk</language>
+ <language type="kac">kachin</language>
+ <language type="kam">kamba</language>
+ <language type="kar">karensk</language>
+ <language type="kaw">kawi</language>
+ <language type="kbd">kabardisk</language>
+ <language type="kg">kikongo</language>
+ <language type="kha">khasi</language>
+ <language type="khi">khoisanspråk (anna)</language>
+ <language type="kho">khotanesisk</language>
+ <language type="ki">kikuyu</language>
+ <language type="kj">kuanyama</language>
+ <language type="kk">kasakhisk</language>
+ <language type="kl">kalaallisut; grønlandsk</language>
+ <language type="km">khmer</language>
+ <language type="kmb">kimbundu</language>
+ <language type="kn">kannada</language>
+ <language type="ko">koreansk</language>
+ <language type="kok">konkani</language>
+ <language type="kos">kosraeansk</language>
+ <language type="kpe">kpelle</language>
+ <language type="kr">kanuri</language>
+ <language type="krc">karachay-balkar</language>
+ <language type="krl">karelsk</language>
+ <language type="kro">kru</language>
+ <language type="kru">kurukh</language>
+ <language type="ks">kasjmiri</language>
+ <language type="ku">kurdisk</language>
+ <language type="kum">kumyk</language>
+ <language type="kut">kutenai</language>
+ <language type="kv">komi</language>
+ <language type="kw">kornisk</language>
+ <language type="ky">kirgisisk</language>
+ <language type="la">latin</language>
+ <language type="lad">ladinsk</language>
+ <language type="lah">lahnda</language>
+ <language type="lam">lamba</language>
+ <language type="lb">luxemburgsk</language>
+ <language type="lez">lezghian</language>
+ <language type="lg">ganda</language>
+ <language type="li">limburgisk</language>
+ <language type="ln">lingala</language>
+ <language type="lo">laotisk</language>
+ <language type="lol">mongo</language>
+ <language type="loz">lozi</language>
+ <language type="lt">litauisk</language>
+ <language type="lu">luba-katanga</language>
+ <language type="lua">luba-lulua</language>
+ <language type="lui">luiseno</language>
+ <language type="lun">lunda</language>
+ <language type="luo">luo</language>
+ <language type="lus">lushai</language>
+ <language type="lv">latvisk</language>
+ <language type="mad">maduresisk</language>
+ <language type="mag">magahi</language>
+ <language type="mai">maithili</language>
+ <language type="mak">makasar</language>
+ <language type="man">mandingo</language>
+ <language type="map">austronesisk</language>
+ <language type="mas">masai</language>
+ <language type="mdf">moksha</language>
+ <language type="mdr">mandar</language>
+ <language type="men">mende</language>
+ <language type="mg">madagassisk</language>
+ <language type="mga">mellomirsk (900-1200)</language>
+ <language type="mh">marshallesisk</language>
+ <language type="mi">maori</language>
+ <language type="mic">micmac</language>
+ <language type="min">minangkabau</language>
+ <language type="mis">ulike språk</language>
+ <language type="mis" alt="proposed-u219-1" draft="unconfirmed">anna språk</language>
+ <language type="mk">makedonsk</language>
+ <language type="mkh">mon-khmerspråk (anna)</language>
+ <language type="mkh" alt="proposed-u219-1" draft="unconfirmed">mon-khmerisk språk (anna)</language>
+ <language type="ml">malayalam</language>
+ <language type="mn">mongolsk</language>
+ <language type="mnc">mandsju</language>
+ <language type="mni">manipuri</language>
+ <language type="mno">manobospråk</language>
+ <language type="mo">moldavisk</language>
+ <language type="moh">mohawk</language>
+ <language type="mos">mossi</language>
+ <language type="mr">marathi</language>
+ <language type="ms">malayisk</language>
+ <language type="mt">maltesisk</language>
+ <language type="mul">fleire språk</language>
+ <language type="mun">mundaspråk</language>
+ <language type="mus">creek</language>
+ <language type="mwl">mirandesisk</language>
+ <language type="mwr">marwari</language>
+ <language type="my">burmesisk</language>
+ <language type="myn">mayaspråk</language>
+ <language type="myv">erzya</language>
+ <language type="na">nauru</language>
+ <language type="nah">nahuatl</language>
+ <language type="nai">nordamerikansk indiansk språk (anna)</language>
+ <language type="nap">napolitansk</language>
+ <language type="nb">bokmål</language>
+ <language type="nd">nord-ndebele</language>
+ <language type="nds">lågtysk; lågsaksisk</language>
+ <language type="ne">nepalsk</language>
+ <language type="new">newari</language>
+ <language type="ng">ndonga</language>
+ <language type="nia">nias</language>
+ <language type="nic">niger-kordofaniansk språk (anna)</language>
+ <language type="niu">niueansk</language>
+ <language type="nl">nederlandsk</language>
+ <language type="nn">nynorsk</language>
+ <language type="no">norsk</language>
+ <language type="nog">nogai</language>
+ <language type="non">gammalnorsk</language>
+ <language type="nr">sør-ndebele</language>
+ <language type="nso">nordsotho</language>
+ <language type="nub">nubisk språk</language>
+ <language type="nv">navajo</language>
+ <language type="nwc">klassisk newarisk</language>
+ <language type="ny">nyanja</language>
+ <language type="nym">nyamwezi</language>
+ <language type="nyn">nyankole</language>
+ <language type="nyo">nyoro</language>
+ <language type="nzi">nzima</language>
+ <language type="oc">oksitansk (etter 1500)</language>
+ <language type="oj">ojibwa</language>
+ <language type="om">oromo</language>
+ <language type="or">oriya</language>
+ <language type="os">ossetisk</language>
+ <language type="osa">osage</language>
+ <language type="ota">ottomansk tyrkisk</language>
+ <language type="oto">otomisk språk</language>
+ <language type="pa">panjabi</language>
+ <language type="paa">papuisk språk (anna)</language>
+ <language type="pag">pangasinan</language>
+ <language type="pal">pahlavi</language>
+ <language type="pam">pampanga</language>
+ <language type="pap">papiamento</language>
+ <language type="pau">palauisk</language>
+ <language type="peo">gammalpersisk (ca. 600-400 f. kr.)</language>
+ <language type="peo" alt="proposed-u219-1" draft="unconfirmed">gammalpersisk (c:a 600-400 f.kr.)</language>
+ <language type="phi">filippinsk språk (anna)</language>
+ <language type="phn">fønikisk</language>
+ <language type="pi">pali</language>
+ <language type="pl">polsk</language>
+ <language type="pon">ponapisk</language>
+ <language type="pra">prakrit-språk</language>
+ <language type="pro">gammalprovençalsk</language>
+ <language type="pro" alt="proposed-u219-1" draft="unconfirmed">provensalsk (før 1500)</language>
+ <language type="ps">pashto</language>
+ <language type="pt">portugisisk</language>
+ <language type="qu">quechua</language>
+ <language type="raj">rajasthani</language>
+ <language type="rap">rapanui</language>
+ <language type="rar">rarotongansk</language>
+ <language type="rm">retoromansk</language>
+ <language type="rn">rundi</language>
+ <language type="ro">rumensk</language>
+ <language type="roa">romansk språk (anna)</language>
+ <language type="rom">romani</language>
+ <language type="root">rot</language>
+ <language type="ru">russisk</language>
+ <language type="rup">aromansk</language>
+ <language type="rw">kinjarwanda</language>
+ <language type="sa">sanskrit</language>
+ <language type="sad">sandawe</language>
+ <language type="sah">jakutsk</language>
+ <language type="sai">søramerikansk indiansk språk (anna)</language>
+ <language type="sal">salishansk språk</language>
+ <language type="sam">samaritansk arameisk</language>
+ <language type="sas">sasak</language>
+ <language type="sat">santali</language>
+ <language type="sc">sardinsk</language>
+ <language type="scn">siciliansk</language>
+ <language type="sco">skotsk</language>
+ <language type="sd">sindhi</language>
+ <language type="se">nordsamisk</language>
+ <language type="sel">selkupisk</language>
+ <language type="sem">semittisk språk (anna)</language>
+ <language type="sg">sango</language>
+ <language type="sga">gammalirsk (til 900)</language>
+ <language type="sgn">teiknspråk</language>
+ <language type="shn">shan</language>
+ <language type="si">singalesisk</language>
+ <language type="sid">sidamo</language>
+ <language type="sio">sioux-språk</language>
+ <language type="sit">sino-tibetansk språk (anna)</language>
+ <language type="sk">slovakisk</language>
+ <language type="sl">slovensk</language>
+ <language type="sla">slavisk språk (anna)</language>
+ <language type="sm">samoansk</language>
+ <language type="sma">sørsamisk</language>
+ <language type="smi">samisk språk (anna)</language>
+ <language type="smj">lulesamisk</language>
+ <language type="smn">enaresamisk</language>
+ <language type="sms">skoltesamisk</language>
+ <language type="sn">shona</language>
+ <language type="snk">soninke</language>
+ <language type="so">somali</language>
+ <language type="sog">sogdisk</language>
+ <language type="son">songhai</language>
+ <language type="sq">albansk</language>
+ <language type="sr">serbisk</language>
+ <language type="srn">sranan tongo</language>
+ <language type="srr">serer</language>
+ <language type="ss">swati</language>
+ <language type="ssa">nilo-saharaspråk (anna)</language>
+ <language type="st">sørsotho</language>
+ <language type="su">sundanesisk</language>
+ <language type="suk">sukuma</language>
+ <language type="sus">susu</language>
+ <language type="sux">sumerisk</language>
+ <language type="sv">svensk</language>
+ <language type="sw">swahili</language>
+ <language type="syr">syrisk</language>
+ <language type="ta">tamil</language>
+ <language type="tai">taispråk (anna)</language>
+ <language type="te">telugu</language>
+ <language type="tem">temne</language>
+ <language type="ter">tereno</language>
+ <language type="tet">tetum</language>
+ <language type="tg">tatsjikisk</language>
+ <language type="th">thai</language>
+ <language type="ti">tigrinja</language>
+ <language type="tig">tigré</language>
+ <language type="tiv">tivi</language>
+ <language type="tk">turkmensk</language>
+ <language type="tkl">tokelau</language>
+ <language type="tl">tagalog</language>
+ <language type="tlh">klingon</language>
+ <language type="tli">tlingit</language>
+ <language type="tmh">tamasjek</language>
+ <language type="tn">tswana</language>
+ <language type="to">tonga (Tonga-øyane)</language>
+ <language type="to" alt="proposed-u219-1" draft="unconfirmed">tongansk (Tonga-øyane)</language>
+ <language type="tog">tonga (Nyasa)</language>
+ <language type="tog" alt="proposed-u219-1" draft="unconfirmed">tongansk (Nyasa)</language>
+ <language type="tpi">tok pisin</language>
+ <language type="tr">tyrkisk</language>
+ <language type="ts">tsonga</language>
+ <language type="tsi">tsimshian</language>
+ <language type="tt">tatarisk</language>
+ <language type="tum">tumbuka</language>
+ <language type="tup">tupi-språk</language>
+ <language type="tut">altaisk (anna)</language>
+ <language type="tut" alt="proposed-u219-1" draft="unconfirmed">altaisk språk (anna)</language>
+ <language type="tvl">tuvalu</language>
+ <language type="tw">twi</language>
+ <language type="ty">tahitisk</language>
+ <language type="tyv">tuvinisk</language>
+ <language type="udm">udmurt</language>
+ <language type="ug">uigurisk</language>
+ <language type="uga">ugaritisk</language>
+ <language type="uk">ukrainsk</language>
+ <language type="umb">umbundu</language>
+ <language type="und">ikkje bestemt</language>
+ <language type="ur">urdu</language>
+ <language type="uz">usbekisk</language>
+ <language type="vai">vai</language>
+ <language type="ve">venda</language>
+ <language type="vi">vietnamesisk</language>
+ <language type="vo">volapyk</language>
+ <language type="vot">votisk</language>
+ <language type="wa">vallonsk</language>
+ <language type="wak">wakasjansk språk</language>
+ <language type="wal">walamo</language>
+ <language type="war">waray</language>
+ <language type="was">washo</language>
+ <language type="wen">sorbisk språk</language>
+ <language type="wo">wolof</language>
+ <language type="xal">kalmyk</language>
+ <language type="xh">xhosa</language>
+ <language type="yao">yao</language>
+ <language type="yap">yapesisk</language>
+ <language type="yi">jiddisk</language>
+ <language type="yo">joruba</language>
+ <language type="ypk">jupisk språk</language>
+ <language type="za">zhuang</language>
+ <language type="zap">zapotec</language>
+ <language type="zen">zenaga</language>
+ <language type="zh">kinesisk</language>
+ <language type="znd">zande</language>
+ <language type="zu">zulu</language>
+ <language type="zun">zuni</language>
+ <language type="zxx">utan språkleg innhald</language>
+ </languages>
+ <scripts>
+ <script type="Arab">arabisk</script>
+ <script type="Armn">armensk</script>
+ <script type="Bali">balinesisk</script>
+ <script type="Batk">batak</script>
+ <script type="Beng">bengali</script>
+ <script type="Blis">blissymbol</script>
+ <script type="Bopo">bopomofo</script>
+ <script type="Brah">brahmi</script>
+ <script type="Brai">braille</script>
+ <script type="Bugi">buginesisk</script>
+ <script type="Buhd">buhid</script>
+ <script type="Cans">felles kanadiske urspråksstavingar</script>
+ <script type="Cham">cham</script>
+ <script type="Cher">cherokee</script>
+ <script type="Cirt">cirth</script>
+ <script type="Copt">koptisk</script>
+ <script type="Cprt">kypriotisk</script>
+ <script type="Cyrl">kyrillisk</script>
+ <script type="Cyrs">kyrillisk (kyrkjeslavisk variant)</script>
+ <script type="Deva">devanagari</script>
+ <script type="Dsrt">deseret</script>
+ <script type="Egyd">egyptisk demotisk</script>
+ <script type="Egyh">egyptisk hieratisk</script>
+ <script type="Egyp">egyptiske hieroglyfar</script>
+ <script type="Ethi">etiopisk</script>
+ <script type="Geok">khutsuri (asomtavruli og nuskhuri)</script>
+ <script type="Geor">georgisk</script>
+ <script type="Glag">glagolittisk</script>
+ <script type="Goth">gotisk</script>
+ <script type="Grek">gresk</script>
+ <script type="Gujr">gujarati</script>
+ <script type="Guru">gurmukhi</script>
+ <script type="Hang">hangul</script>
+ <script type="Hani">han</script>
+ <script type="Hano">hanunoo</script>
+ <script type="Hans">forenkla han</script>
+ <script type="Hans" alt="proposed-u219-1" draft="unconfirmed">forenkla kinesisk</script>
+ <script type="Hant">tradisjonell han</script>
+ <script type="Hant" alt="proposed-u219-1" draft="unconfirmed">tradisjonell kinesisk</script>
+ <script type="Hebr">hebraisk</script>
+ <script type="Hira">hiragana</script>
+ <script type="Hmng">pahawk hmong</script>
+ <script type="Hrkt">katakana eller hiragana</script>
+ <script type="Hung">gammalungarsk</script>
+ <script type="Inds">indus (Harappan)</script>
+ <script type="Ital">gammalitalisk</script>
+ <script type="Java">javanesisk</script>
+ <script type="Kali">kayah li</script>
+ <script type="Kana">katakana</script>
+ <script type="Khar">kharoshthi</script>
+ <script type="Khmr">khmer</script>
+ <script type="Knda">kannada</script>
+ <script type="Laoo">laotisk</script>
+ <script type="Latf">latinsk (frakturvariant)</script>
+ <script type="Latg">latinsk (gælisk variant)</script>
+ <script type="Latn">latinsk</script>
+ <script type="Lepc">lepcha (róng)</script>
+ <script type="Limb">lumbu</script>
+ <script type="Lina">lineær A</script>
+ <script type="Linb">lineær B</script>
+ <script type="Mand">mandaisk</script>
+ <script type="Maya">maya-hieroglyfar</script>
+ <script type="Mero">meroitisk</script>
+ <script type="Mlym">malayalam</script>
+ <script type="Mong">mongolsk</script>
+ <script type="Mymr">myanmar</script>
+ <script type="Nkoo">n'ko</script>
+ <script type="Ogam">ogham</script>
+ <script type="Orkh">orkhon</script>
+ <script type="Orya">oriya</script>
+ <script type="Osma">osmanya</script>
+ <script type="Perm">gammalpermisk</script>
+ <script type="Phag">phags-pa</script>
+ <script type="Phnx">fønikisk</script>
+ <script type="Plrd">pollard-fonetisk</script>
+ <script type="Qaai">nedarva</script>
+ <script type="Roro">rongorongo</script>
+ <script type="Runr">runer</script>
+ <script type="Sara">sarati</script>
+ <script type="Shaw">shavisk</script>
+ <script type="Sinh">sinhala</script>
+ <script type="Sylo">syloti nagri</script>
+ <script type="Syrc">syriakisk</script>
+ <script type="Syre">syriakisk (estrangelo-variant)</script>
+ <script type="Syrj">syriakisk (vestleg variant)</script>
+ <script type="Syrn">syriakisk (austleg variant)</script>
+ <script type="Tagb">tagbanwa</script>
+ <script type="Tale">tai le</script>
+ <script type="Talu">ny tai lue</script>
+ <script type="Taml">tamilsk</script>
+ <script type="Telu">telugu</script>
+ <script type="Teng">tengwar</script>
+ <script type="Tfng">tifinagh (berber)</script>
+ <script type="Tglg">tagalog</script>
+ <script type="Thaa">thaana</script>
+ <script type="Thai">thai</script>
+ <script type="Tibt">tibetansk</script>
+ <script type="Ugar">ugaritisk</script>
+ <script type="Vaii">vai</script>
+ <script type="Visp">synleg tale</script>
+ <script type="Xpeo">gammalpersisk</script>
+ <script type="Xsux">sumero-akkadisk kileskrift</script>
+ <script type="Yiii">yi</script>
+ <script type="Zxxx">kode for språk utan skrift</script>
+ <script type="Zyyy">felles</script>
+ <script type="Zzzz">kode for ukoda skrift</script>
+ </scripts>
+ <territories>
+ <territory type="001" draft="provisional">verda</territory>
+ <territory type="002">Afrika</territory>
+ <territory type="005">Sør-Amerika</territory>
+ <territory type="009">Oseania</territory>
+ <territory type="011">Vest-Afrika</territory>
+ <territory type="013">Sentral-Amerika</territory>
+ <territory type="014">Aust-Afrika</territory>
+ <territory type="015">Nord-Afrika</territory>
+ <territory type="017">Sentral-Afrika</territory>
+ <territory type="018">Sørlege Afrika</territory>
+ <territory type="019">Amerika</territory>
+ <territory type="021">Nord-Amerika</territory>
+ <territory type="029">Karibiske hav</territory>
+ <territory type="029" alt="proposed-u223-1" draft="unconfirmed">Karibia</territory>
+ <territory type="030">Aust-Asia</territory>
+ <territory type="034">Sør-Asia</territory>
+ <territory type="035">Søraust-Asia</territory>
+ <territory type="039">Sør-Europa</territory>
+ <territory type="053">Australia og New Zealand</territory>
+ <territory type="054">Melanesia</territory>
+ <territory type="057">Mikronesia</territory>
+ <territory type="061">Polynesia</territory>
+ <territory type="062">Sørlege Sentral-Asia</territory>
+ <territory type="142">Asia</territory>
+ <territory type="143">Sentral-Asia</territory>
+ <territory type="145">Vest-Asia</territory>
+ <territory type="150">Europa</territory>
+ <territory type="151">Aust-Europa</territory>
+ <territory type="154">Nord-Europa</territory>
+ <territory type="155">Vest-Europa</territory>
+ <territory type="172">Samveldet av uavhengige statar</territory>
+ <territory type="419">Latin-Amerika og Karibia</territory>
+ <territory type="830">Kanaløyane</territory>
+ <territory type="IM">Man</territory>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Dei sameinte arabiske emirata</territory>
+ <territory type="AF">Afghanistan</territory>
+ <territory type="AG">Antigua og Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albania</territory>
+ <territory type="AM">Armenia</territory>
+ <territory type="AN">Dei nederlandske Antillane</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktis</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">Amerikansk Samoa</territory>
+ <territory type="AT">Austerrike</territory>
+ <territory type="AU">Australia</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Ã…land</territory>
+ <territory type="AZ">Aserbajdsjan</territory>
+ <territory type="BA">Bosnia og Hercegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BE">Belgia</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgaria</territory>
+ <territory type="BH">Bahrain</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei Darussalam</territory>
+ <territory type="BO">Bolivia</territory>
+ <territory type="BR">Brasil</territory>
+ <territory type="BS">Bahamas</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BV">Bouvetøya</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Kviterussland</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Canada</territory>
+ <territory type="CC">Kokosøyane (Keelingøyane)</territory>
+ <territory type="CD">Kongo, Den demokratiske republikken</territory>
+ <territory type="CD" alt="proposed-u219-1" draft="provisional">Kongo-Kinshasa</territory>
+ <territory type="CF">Den sentralafrikanske republikk</territory>
+ <territory type="CF" alt="proposed-u223-1" draft="provisional">Den sentralafrikanske republikken</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CG" alt="proposed-u219-1" draft="provisional">Kongo-Brazzaville</territory>
+ <territory type="CH">Sveits</territory>
+ <territory type="CI">Elfenbeinskysten</territory>
+ <territory type="CK">Cookøyane</territory>
+ <territory type="CL">Chile</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Kina</territory>
+ <territory type="CO">Colombia</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS">Serbia Montenegro</territory>
+ <territory type="CS" alt="proposed-u223-1" draft="unconfirmed">Serbia og Montenegro</territory>
+ <territory type="CU">Cuba</territory>
+ <territory type="CV">Kapp Verde</territory>
+ <territory type="CX">Christmasøya</territory>
+ <territory type="CY">Kypros</territory>
+ <territory type="CZ">Tsjekkia</territory>
+ <territory type="DE">Tyskland</territory>
+ <territory type="DJ">Djibouti</territory>
+ <territory type="DK">Danmark</territory>
+ <territory type="DM">Dominica</territory>
+ <territory type="DO">Den dominikanske republikk</territory>
+ <territory type="DO" alt="proposed-u223-1" draft="provisional">Den dominikanske republikken</territory>
+ <territory type="DZ">Algerie</territory>
+ <territory type="EC">Ecuador</territory>
+ <territory type="EE">Estland</territory>
+ <territory type="EG">Egypt</territory>
+ <territory type="EH">Vest-Sahara</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Spania</territory>
+ <territory type="ET">Etiopia</territory>
+ <territory type="FI">Finland</territory>
+ <territory type="FJ">Fiji</territory>
+ <territory type="FK">Falklandsøyane</territory>
+ <territory type="FK" alt="proposed-u223-1" draft="unconfirmed">Falklandsøyane (Malvinas)</territory>
+ <territory type="FM">Mikronesiaføderasjonen</territory>
+ <territory type="FO">Færøyane</territory>
+ <territory type="FR">Frankrike</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Storbritannia</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Georgia</territory>
+ <territory type="GF">Fransk Guyana</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Grønland</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Ekvatorial-Guinea</territory>
+ <territory type="GR">Hellas</territory>
+ <territory type="GS">Sør-Georgia og Sør-Sandwich-øyane</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinea-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Hong Kong S.A.R. (Kina)</territory>
+ <territory type="HK" alt="proposed-u219-1" draft="provisional">Hong Kong</territory>
+ <territory type="HM">Heard- og McDonaldsøyane</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Kroatia</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Ungarn</territory>
+ <territory type="ID">Indonesia</territory>
+ <territory type="IE">Irland</territory>
+ <territory type="IL">Israel</territory>
+ <territory type="IN">India</territory>
+ <territory type="IO">Britiske områder i det indiske hav</territory>
+ <territory type="IO" alt="proposed-u223-1" draft="provisional">Britiske område i Det indiske hav</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Island</territory>
+ <territory type="IT">Italia</territory>
+ <territory type="JM">Jamaica</territory>
+ <territory type="JO">Jordan</territory>
+ <territory type="JP">Japan</territory>
+ <territory type="KE">Kenya</territory>
+ <territory type="KG">Kirgisistan</territory>
+ <territory type="KH">Kambodsja</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komorene</territory>
+ <territory type="KN">St. Christopher og Nevis</territory>
+ <territory type="KP">Nord-Korea</territory>
+ <territory type="KR">Sør-Korea</territory>
+ <territory type="KW">Kuwait</territory>
+ <territory type="KY">Caymanøyane</territory>
+ <territory type="KZ">Kasakhstan</territory>
+ <territory type="LA">Laos, Den folkedemokratiske republikken</territory>
+ <territory type="LA" alt="proposed-u219-1" draft="provisional">Laos</territory>
+ <territory type="LB">Libanon</territory>
+ <territory type="LC">St. Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberia</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Litauen</territory>
+ <territory type="LU">Luxembourg</territory>
+ <territory type="LV">Latvia</territory>
+ <territory type="LY">Libya</territory>
+ <territory type="MA">Marokko</territory>
+ <territory type="MC">Monaco</territory>
+ <territory type="MD">Moldova</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshalløyane</territory>
+ <territory type="MK">Makedonia, Republikken</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongolia</territory>
+ <territory type="MO">Macao S.A.R. (Kina)</territory>
+ <territory type="MO" alt="proposed-u219-1" draft="provisional">Macao</territory>
+ <territory type="MP">Nord-Marianane</territory>
+ <territory type="MQ">Martinique</territory>
+ <territory type="MR">Mauritania</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Maldivene</territory>
+ <territory type="MV" alt="proposed-u223-1" draft="provisional">Maldivane</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Mexico</territory>
+ <territory type="MY">Malaysia</territory>
+ <territory type="MZ">Mosambik</territory>
+ <territory type="NA">Namibia</territory>
+ <territory type="NC">Ny-Caledonia</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Norfolkøyane</territory>
+ <territory type="NG">Nigeria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Nederland</territory>
+ <territory type="NO">Noreg</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">New Zealand</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Fransk Polynesia</territory>
+ <territory type="PG">Papua Ny-Guinea</territory>
+ <territory type="PH">Filippinane</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Polen</territory>
+ <territory type="PM">St. Pierre og Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Puerto Rico</territory>
+ <territory type="PS">Palestinsk territorium</territory>
+ <territory type="PT">Portugal</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Qatar</territory>
+ <territory type="QO">Ytre Oseania</territory>
+ <territory type="RE">Reunion</territory>
+ <territory type="RO">Romania</territory>
+ <territory type="RU">Den russiske føderasjon</territory>
+ <territory type="RU" alt="proposed-u223-1" draft="provisional">Den russiske føderasjonen</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Saudi Arabia</territory>
+ <territory type="SB">Salomonøyane</territory>
+ <territory type="SC">Seychellane</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Sverige</territory>
+ <territory type="SG">Singapore</territory>
+ <territory type="SH">Saint Helena</territory>
+ <territory type="SI">Slovenia</territory>
+ <territory type="SJ">Svalbard og Jan Mayen</territory>
+ <territory type="SK">Slovakia</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalia</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">Sao Tome og Principe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Syria</territory>
+ <territory type="SZ">Swaziland</territory>
+ <territory type="TC">Turks- og Caicosøyane</territory>
+ <territory type="TD">Tchad</territory>
+ <territory type="TF">Franske sørområder</territory>
+ <territory type="TF" alt="proposed-u223-1" draft="provisional">Franske sørområde</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Thailand</territory>
+ <territory type="TJ">Tadsjikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Aust-Timor</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunisia</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Tyrkia</territory>
+ <territory type="TT">Trinidad og Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TZ">Tanzania</territory>
+ <territory type="UA">Ukraina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">USAs ytre småøyar</territory>
+ <territory type="US">USA</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Usbekistan</territory>
+ <territory type="VA">Vatikanstaten</territory>
+ <territory type="VC">St. Vincent og Grenadinane</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Jomfruøyane (britisk)</territory>
+ <territory type="VI">Jomfruøyene (USA)</territory>
+ <territory type="VI" alt="proposed-u14-1" draft="provisional">Jomfruøyane (USA)</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis og Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Yemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Sør-Afrika</territory>
+ <territory type="ZM">Zambia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ <variants>
+ <variant type="1901">tradisjonell tysk ortografi</variant>
+ <variant type="1996">tysk ortografi frå 1996</variant>
+ <variant type="POLYTONI">polytonisk</variant>
+ <variant type="REVISED">revidert ortografi</variant>
+ </variants>
+ <keys>
+ <key type="calendar">kalender</key>
+ <key type="collation">kollasjon</key>
+ <key type="currency">valuta</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">tradisjonell kinesisk (Big5)</type>
+ <type type="buddhist" key="calendar">buddhistisk kalender</type>
+ <type type="chinese" key="calendar">kinesisk kalender</type>
+ <type type="direct" key="collation">direkte sortering</type>
+ <type type="gb2312han" key="collation">forenkla kinesisk</type>
+ <type type="gregorian" key="calendar">gregoriansk kalender</type>
+ <type type="hebrew" key="calendar">hebraisk kalender</type>
+ <type type="islamic" key="calendar">islamsk kalender</type>
+ <type type="islamic-civil" key="calendar">islamsk sivil kalender</type>
+ <type type="japanese" key="calendar">japansk kalender</type>
+ <type type="phonebook" key="collation">telefonkatalogsortering</type>
+ <type type="pinyin" key="collation">pinyin-sortering</type>
+ <type type="stroke" key="collation">streksortering</type>
+ <type type="traditional" key="collation">tradisjonell sortering</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US">amerikansk</measurementSystemName>
+ <measurementSystemName type="metric">metrisk</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a à b-e é f-o ó ò ô p-z æ ø å]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[á ÇŽ Ä Ã§ Ä‘ è ê Å„ ñ Å‹ Å¡ ŧ ü ž ä ö]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">jan</month>
+ <month type="1" references="R1" alt="proposed" draft="unconfirmed">jan.</month>
+ <month type="2">feb</month>
+ <month type="2" references="R1" alt="proposed" draft="unconfirmed">feb.</month>
+ <month type="3">mar</month>
+ <month type="3" references="R1" alt="proposed" draft="unconfirmed">mars</month>
+ <month type="4">apr</month>
+ <month type="4" references="R1" alt="proposed" draft="unconfirmed">april</month>
+ <month type="5" references="R1">mai</month>
+ <month type="6">jun</month>
+ <month type="6" references="R1" alt="proposed" draft="unconfirmed">juni</month>
+ <month type="7">jul</month>
+ <month type="7" references="R1" alt="proposed" draft="unconfirmed">juli</month>
+ <month type="8">aug</month>
+ <month type="8" references="R1" alt="proposed" draft="unconfirmed">aug.</month>
+ <month type="9">sep</month>
+ <month type="9" references="R1" alt="proposed" draft="unconfirmed">sep.</month>
+ <month type="10">okt</month>
+ <month type="10" references="R1" alt="proposed" draft="unconfirmed">okt.</month>
+ <month type="11">nov</month>
+ <month type="11" references="R1" alt="proposed" draft="unconfirmed">nov.</month>
+ <month type="12">des</month>
+ <month type="12" references="R1" alt="proposed" draft="unconfirmed">des.</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">januar</month>
+ <month type="2">februar</month>
+ <month type="3">mars</month>
+ <month type="4">april</month>
+ <month type="5">mai</month>
+ <month type="6">juni</month>
+ <month type="7">juli</month>
+ <month type="8">august</month>
+ <month type="9">september</month>
+ <month type="10">oktober</month>
+ <month type="11">november</month>
+ <month type="12">desember</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">J</month>
+ <month type="2" draft="unconfirmed">F</month>
+ <month type="3" draft="unconfirmed">M</month>
+ <month type="4" draft="unconfirmed">A</month>
+ <month type="5" draft="unconfirmed">M</month>
+ <month type="6" draft="unconfirmed">J</month>
+ <month type="7" draft="unconfirmed">J</month>
+ <month type="8" draft="unconfirmed">A</month>
+ <month type="9" draft="unconfirmed">S</month>
+ <month type="10" draft="unconfirmed">O</month>
+ <month type="11" draft="unconfirmed">N</month>
+ <month type="12" draft="unconfirmed">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">su</day>
+ <day type="sun" alt="proposed-u219-1" draft="unconfirmed">sø.</day>
+ <day type="mon">må</day>
+ <day type="mon" references="R1" alt="proposed" draft="unconfirmed">må.</day>
+ <day type="tue">ty</day>
+ <day type="tue" references="R1" alt="proposed" draft="unconfirmed">ty.</day>
+ <day type="wed">on</day>
+ <day type="wed" references="R1" alt="proposed" draft="unconfirmed">on.</day>
+ <day type="thu">to</day>
+ <day type="thu" references="R1" alt="proposed" draft="unconfirmed">to.</day>
+ <day type="fri">fr</day>
+ <day type="fri" references="R1" alt="proposed" draft="unconfirmed">fr.</day>
+ <day type="sat">la</day>
+ <day type="sat" references="R1" alt="proposed" draft="unconfirmed">la.</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">sundag</day>
+ <day type="sun" alt="proposed-u223-1" draft="unconfirmed">søndag</day>
+ <day type="mon">måndag</day>
+ <day type="tue">tysdag</day>
+ <day type="wed">onsdag</day>
+ <day type="thu">torsdag</day>
+ <day type="fri">fredag</day>
+ <day type="sat">laurdag</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">S</day>
+ <day type="mon">M</day>
+ <day type="tue">T</day>
+ <day type="wed">O</day>
+ <day type="thu">T</day>
+ <day type="fri">F</day>
+ <day type="sat">L</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">K1</quarter>
+ <quarter type="2">K2</quarter>
+ <quarter type="3">K3</quarter>
+ <quarter type="4">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1. kvartal</quarter>
+ <quarter type="2">2. kvartal</quarter>
+ <quarter type="3">3. kvartal</quarter>
+ <quarter type="4">4. kvartal</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am draft="unconfirmed">formiddag</am>
+ <pm draft="unconfirmed">ettermiddag</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">f.Kr.</era>
+ <era type="1">e.Kr.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d. MMM. yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd.MM.yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>'kl. 'HH.mm.ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>HH.mm.ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>HH.mm.ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>HH.mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d. MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd.MM</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm.ss</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM.yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName draft="unconfirmed">æra</displayName>
+ </field>
+ <field type="year">
+ <displayName draft="unconfirmed">Ã¥r</displayName>
+ </field>
+ <field type="month">
+ <displayName draft="unconfirmed">månad</displayName>
+ </field>
+ <field type="week">
+ <displayName draft="unconfirmed">veke</displayName>
+ </field>
+ <field type="day">
+ <displayName draft="unconfirmed">dag</displayName>
+ </field>
+ <field type="weekday">
+ <displayName draft="unconfirmed">vekedag</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName>f.m./e.m.-val</displayName>
+ </field>
+ <field type="hour">
+ <displayName draft="unconfirmed">time</displayName>
+ </field>
+ <field type="minute">
+ <displayName draft="unconfirmed">minutt</displayName>
+ </field>
+ <field type="second">
+ <displayName draft="unconfirmed">sekund</displayName>
+ </field>
+ <field type="zone">
+ <displayName draft="unconfirmed">sone</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HH.mm;-HH.mm</hourFormat>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Sørpolen</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>Påskeøya</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity draft="unconfirmed">Kanariøyane</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity>Godthåb</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>Ulan Bator</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>Mexico by</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity draft="unconfirmed">Azorane</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lisboa</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moskva</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Tasjkent</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##0 %</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencies>
+ <currency type="ADP">
+ <displayName draft="provisional">andorransk peseta</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName draft="unconfirmed">UAE dirham</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName draft="provisional">afghani (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName draft="provisional">afghani</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName draft="provisional">albansk lek</displayName>
+ </currency>
+ <currency type="AMD">
+ <displayName draft="provisional">armensk dram</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName draft="unconfirmed">nederlansk antillegylden</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName draft="provisional">angolsk kwanza</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName draft="provisional">angolsk kwanza (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName draft="provisional">angolsk ny kwanza (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName draft="provisional">angolsk kwanza reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName draft="provisional">argentisk austral</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName draft="provisional">argentinsk peso (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName draft="provisional">argentinsk peso</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName draft="unconfirmed">austerriksk shilling</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName draft="provisional">australsk dollar</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName draft="provisional">arubisk gylden</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName draft="unconfirmed">aserbaijansk manat</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName draft="unconfirmed">Bosnia-Hercegovina dinar</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName draft="unconfirmed">Bosnia-Hercegovina konvertibel mark</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName draft="unconfirmed">Barbados-dollar</displayName>
+ </currency>
+ <currency type="BDT">
+ <displayName draft="unconfirmed">bangladeshisk taka</displayName>
+ </currency>
+ <currency type="BEC">
+ <displayName draft="unconfirmed">belgisk franc (konvertibel)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName draft="unconfirmed">belgisk franc</displayName>
+ </currency>
+ <currency type="BEL">
+ <displayName draft="unconfirmed">belgisk franc (finansiell)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName draft="unconfirmed">bulgarsk hard lev</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName draft="unconfirmed">bulgarsk ny lev</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName draft="unconfirmed">bahrainsk dinar</displayName>
+ </currency>
+ <currency type="BIF">
+ <displayName draft="unconfirmed">burundisk franc</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName draft="unconfirmed">bermudisk dollar</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName draft="unconfirmed">bruneisk dollar</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName draft="unconfirmed">boliviano</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName draft="unconfirmed">bolivisk peso</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName draft="unconfirmed">bolivisk mvdol</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName draft="unconfirmed">brasiliansk cruzeiro novo (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName draft="unconfirmed">brasiliansk cruzado</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName draft="unconfirmed">brasiliansk cruzeiro (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">brasiliansk real</displayName>
+ </currency>
+ <currency type="BRN">
+ <displayName draft="unconfirmed">brasiliansk cruzado novo</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName draft="unconfirmed">brasiliansk cruzeiro</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName draft="unconfirmed">bahamisk dollar</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName draft="unconfirmed">bhutansk ngultrum</displayName>
+ </currency>
+ <currency type="BUK">
+ <displayName draft="unconfirmed">burmesisk kyat</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="unconfirmed">Kinesiske yuan renminbi</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName draft="unconfirmed">dansk krone</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">Britiske pund</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">Indiske rupi</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName draft="unconfirmed">norsk krone</displayName>
+ <symbol>kr</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">Russiske rubler</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">Amerikanske dollar</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName draft="unconfirmed">sørafrikansk rand (finansiell)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName draft="unconfirmed">sørafrikansk rand</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName draft="unconfirmed">zambisk kwacha</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName draft="unconfirmed">zairisk ny zaire</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName draft="unconfirmed">zairisk zaire</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName draft="unconfirmed">Zimbabwe-dollar</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="R1" uri="URN:ISBN:82-03-32936-5">Vinje, Finn-Erik, Skriveregler (1994)</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/nn_NO.xml b/libs/Zend/Locale/Data/nn_NO.xml
new file mode 100755
index 0000000000..1bb72cabaa
--- /dev/null
+++ b/libs/Zend/Locale/Data/nn_NO.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="nn"/>
+ <territory type="NO"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">’</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">«</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">»</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/nr.xml b/libs/Zend/Locale/Data/nr.xml
new file mode 100755
index 0000000000..0c227f92e0
--- /dev/null
+++ b/libs/Zend/Locale/Data/nr.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.12 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="nr"/>
+ </identity>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[a-z]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Jan</month>
+ <month type="2" draft="unconfirmed">Feb</month>
+ <month type="3" draft="unconfirmed">Mat</month>
+ <month type="4" draft="unconfirmed">Apr</month>
+ <month type="5" draft="unconfirmed">Mey</month>
+ <month type="6" draft="unconfirmed">Jun</month>
+ <month type="7" draft="unconfirmed">Jul</month>
+ <month type="8" draft="unconfirmed">Arh</month>
+ <month type="9" draft="unconfirmed">Sep</month>
+ <month type="10" draft="unconfirmed">Okt</month>
+ <month type="11" draft="unconfirmed">Usi</month>
+ <month type="12" draft="unconfirmed">Dis</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Janabari</month>
+ <month type="2" draft="unconfirmed">uFeberbari</month>
+ <month type="3" draft="unconfirmed">uMatjhi</month>
+ <month type="4" draft="unconfirmed">u-Apreli</month>
+ <month type="5" draft="unconfirmed">Meyi</month>
+ <month type="6" draft="unconfirmed">Juni</month>
+ <month type="7" draft="unconfirmed">Julayi</month>
+ <month type="8" draft="unconfirmed">Arhostosi</month>
+ <month type="9" draft="unconfirmed">Septemba</month>
+ <month type="10" draft="unconfirmed">Oktoba</month>
+ <month type="11" draft="unconfirmed">Usinyikhaba</month>
+ <month type="12" draft="unconfirmed">Disemba</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Son</day>
+ <day type="mon" draft="unconfirmed">Mvu</day>
+ <day type="tue" draft="unconfirmed">Bil</day>
+ <day type="wed" draft="unconfirmed">Tha</day>
+ <day type="thu" draft="unconfirmed">Ne</day>
+ <day type="fri" draft="unconfirmed">Hla</day>
+ <day type="sat" draft="unconfirmed">Gqi</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">uSonto</day>
+ <day type="mon" draft="unconfirmed">uMvulo</day>
+ <day type="tue" draft="unconfirmed">uLesibili</day>
+ <day type="wed" draft="unconfirmed">Lesithathu</day>
+ <day type="thu" draft="unconfirmed">uLesine</day>
+ <day type="fri" draft="unconfirmed">ngoLesihlanu</day>
+ <day type="sat" draft="unconfirmed">umGqibelo</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ZAR">
+ <symbol draft="unconfirmed">R</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/nr_ZA.xml b/libs/Zend/Locale/Data/nr_ZA.xml
new file mode 100755
index 0000000000..5af6eef0f5
--- /dev/null
+++ b/libs/Zend/Locale/Data/nr_ZA.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="nr"/>
+ <territory type="ZA"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/nso.xml b/libs/Zend/Locale/Data/nso.xml
new file mode 100755
index 0000000000..55668660e2
--- /dev/null
+++ b/libs/Zend/Locale/Data/nso.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.13 $"/>
+ <generation date="$Date: 2006/06/29 15:44:37 $"/>
+ <language type="nso"/>
+ </identity>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[a-s Å¡ t u w-y]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" draft="unconfirmed">[è ò v z]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Jan</month>
+ <month type="2" draft="unconfirmed">Feb</month>
+ <month type="3" draft="unconfirmed">Mat</month>
+ <month type="4" draft="unconfirmed">Apo</month>
+ <month type="5" draft="unconfirmed">Mei</month>
+ <month type="6" draft="unconfirmed">Jun</month>
+ <month type="7" draft="unconfirmed">Jul</month>
+ <month type="8" draft="unconfirmed">Ago</month>
+ <month type="9" draft="unconfirmed">Set</month>
+ <month type="10" draft="unconfirmed">Okt</month>
+ <month type="11" draft="unconfirmed">Nof</month>
+ <month type="12" draft="unconfirmed">Dis</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Janaware</month>
+ <month type="2" draft="unconfirmed">Feberware</month>
+ <month type="3" draft="unconfirmed">Matšhe</month>
+ <month type="4" draft="unconfirmed">Aporele</month>
+ <month type="5" draft="unconfirmed">Mei</month>
+ <month type="6" draft="unconfirmed">June</month>
+ <month type="7" draft="unconfirmed">Julae</month>
+ <month type="8" draft="unconfirmed">Agostose</month>
+ <month type="9" draft="unconfirmed">Setemere</month>
+ <month type="10" draft="unconfirmed">Oktobore</month>
+ <month type="11" draft="unconfirmed">Nofemere</month>
+ <month type="12" draft="unconfirmed">Disemere</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Son</day>
+ <day type="mon" draft="unconfirmed">Mos</day>
+ <day type="tue" draft="unconfirmed">Bed</day>
+ <day type="wed" draft="unconfirmed">Rar</day>
+ <day type="thu" draft="unconfirmed">Ne</day>
+ <day type="fri" draft="unconfirmed">Hla</day>
+ <day type="sat" draft="unconfirmed">Mok</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Sontaga</day>
+ <day type="mon" draft="unconfirmed">Mosupalogo</day>
+ <day type="tue" draft="unconfirmed">Labobedi</day>
+ <day type="wed" draft="unconfirmed">Laboraro</day>
+ <day type="thu" draft="unconfirmed">Labone</day>
+ <day type="fri" draft="unconfirmed">Labohlano</day>
+ <day type="sat" draft="unconfirmed">Mokibelo</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ZAR">
+ <symbol draft="unconfirmed">R</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/nso_ZA.xml b/libs/Zend/Locale/Data/nso_ZA.xml
new file mode 100755
index 0000000000..13a5f0101b
--- /dev/null
+++ b/libs/Zend/Locale/Data/nso_ZA.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="nso"/>
+ <territory type="ZA"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ny.xml b/libs/Zend/Locale/Data/ny.xml
new file mode 100755
index 0000000000..2f3837ed3a
--- /dev/null
+++ b/libs/Zend/Locale/Data/ny.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.13 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="ny"/>
+ </identity>
+ <characters>
+ <exemplarCharacters references="RP1">[a-p r-u w ŵ y z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" references="RP1">[q v x]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Jan</month>
+ <month type="2" draft="unconfirmed">Feb</month>
+ <month type="3" draft="unconfirmed">Mal</month>
+ <month type="4" draft="unconfirmed">Epu</month>
+ <month type="5" draft="unconfirmed">Mei</month>
+ <month type="6" draft="unconfirmed">Jun</month>
+ <month type="7" draft="unconfirmed">Jul</month>
+ <month type="8" draft="unconfirmed">Oga</month>
+ <month type="9" draft="unconfirmed">Sep</month>
+ <month type="10" draft="unconfirmed">Oku</month>
+ <month type="11" draft="unconfirmed">Nov</month>
+ <month type="12" draft="unconfirmed">Dis</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Januwale</month>
+ <month type="2" draft="unconfirmed">Febuluwale</month>
+ <month type="3" draft="unconfirmed">Malichi</month>
+ <month type="4" draft="unconfirmed">Epulo</month>
+ <month type="5" draft="unconfirmed">Mei</month>
+ <month type="6" draft="unconfirmed">Juni</month>
+ <month type="7" draft="unconfirmed">Julai</month>
+ <month type="8" draft="unconfirmed">Ogasiti</month>
+ <month type="9" draft="unconfirmed">Seputemba</month>
+ <month type="10" draft="unconfirmed">Okutoba</month>
+ <month type="11" draft="unconfirmed">Novemba</month>
+ <month type="12" draft="unconfirmed">Disemba</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Mul</day>
+ <day type="mon" draft="unconfirmed">Lem</day>
+ <day type="tue" draft="unconfirmed">Wir</day>
+ <day type="wed" draft="unconfirmed">Tat</day>
+ <day type="thu" draft="unconfirmed">Nai</day>
+ <day type="fri" draft="unconfirmed">San</day>
+ <day type="sat" draft="unconfirmed">Wer</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Lamulungu</day>
+ <day type="mon" draft="unconfirmed">Lolemba</day>
+ <day type="tue" draft="unconfirmed">Lachiwiri</day>
+ <day type="wed" draft="unconfirmed">Lachitatu</day>
+ <day type="thu" draft="unconfirmed">Lachinayi</day>
+ <day type="fri" draft="unconfirmed">Lachisanu</day>
+ <day type="sat" draft="unconfirmed">Loweruka</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="MWK">
+ <displayName draft="unconfirmed">Malawian Kwacha</displayName>
+ <symbol draft="unconfirmed">K</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1" uri="http://www.ideography.co.uk/library/pdf/charsets.pdf">Character Sets for African Languages</reference>
+ <reference type="RP2" uri="http://www.eki.ee/letter/chardata.cgi?lang=ny+Chichewa&amp;script=latin">Letter Database (non-ASCII-range) - Chichewa</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ny_MW.xml b/libs/Zend/Locale/Data/ny_MW.xml
new file mode 100755
index 0000000000..aa57982f25
--- /dev/null
+++ b/libs/Zend/Locale/Data/ny_MW.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.8 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ny"/>
+ <territory type="MW"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/om.xml b/libs/Zend/Locale/Data/om.xml
new file mode 100755
index 0000000000..730863a803
--- /dev/null
+++ b/libs/Zend/Locale/Data/om.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.40 $"/>
+ <generation date="$Date: 2006/06/27 18:46:54 $"/>
+ <language type="om"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar" draft="unconfirmed">Arabic</language>
+ <language type="de" draft="unconfirmed">German</language>
+ <language type="en" draft="unconfirmed">English</language>
+ <language type="es" draft="unconfirmed">Spanish</language>
+ <language type="fr" draft="unconfirmed">French</language>
+ <language type="hi" draft="unconfirmed">Hindi</language>
+ <language type="it" draft="unconfirmed">Italian</language>
+ <language type="ja" draft="unconfirmed">Japanese</language>
+ <language type="om">Oromoo</language>
+ <language type="pt" draft="unconfirmed">Portuguese</language>
+ <language type="ru" draft="unconfirmed">Russian</language>
+ <language type="zh" draft="unconfirmed">Chinese</language>
+ </languages>
+ <scripts>
+ <script type="Latn" draft="unconfirmed">Latin</script>
+ </scripts>
+ <territories>
+ <territory type="BR" draft="unconfirmed">Brazil</territory>
+ <territory type="CN" draft="unconfirmed">China</territory>
+ <territory type="DE" draft="unconfirmed">Germany</territory>
+ <territory type="ET">Itoophiyaa</territory>
+ <territory type="FR" draft="unconfirmed">France</territory>
+ <territory type="GB" draft="unconfirmed">United Kingdom</territory>
+ <territory type="IN" draft="unconfirmed">India</territory>
+ <territory type="IT" draft="unconfirmed">Italy</territory>
+ <territory type="JP" draft="unconfirmed">Japan</territory>
+ <territory type="KE">Keeniyaa</territory>
+ <territory type="RU" draft="unconfirmed">Russia</territory>
+ <territory type="US" draft="unconfirmed">United States</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Ama</month>
+ <month type="2">Gur</month>
+ <month type="3">Bit</month>
+ <month type="4">Elb</month>
+ <month type="5">Cam</month>
+ <month type="6">Wax</month>
+ <month type="7">Ado</month>
+ <month type="8">Hag</month>
+ <month type="9">Ful</month>
+ <month type="10">Onk</month>
+ <month type="11">Sad</month>
+ <month type="12">Mud</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Amajjii</month>
+ <month type="2">Guraandhala</month>
+ <month type="3">Bitooteessa</month>
+ <month type="4">Elba</month>
+ <month type="5">Caamsa</month>
+ <month type="6">Waxabajjii</month>
+ <month type="7">Adooleessa</month>
+ <month type="8">Hagayya</month>
+ <month type="9">Fuulbana</month>
+ <month type="10">Onkololeessa</month>
+ <month type="11">Sadaasa</month>
+ <month type="12">Muddee</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">J</month>
+ <month type="2" draft="unconfirmed">F</month>
+ <month type="3" draft="unconfirmed">M</month>
+ <month type="4" draft="unconfirmed">A</month>
+ <month type="5" draft="unconfirmed">M</month>
+ <month type="6" draft="unconfirmed">J</month>
+ <month type="7" draft="unconfirmed">J</month>
+ <month type="8" draft="unconfirmed">A</month>
+ <month type="9" draft="unconfirmed">S</month>
+ <month type="10" draft="unconfirmed">O</month>
+ <month type="11" draft="unconfirmed">N</month>
+ <month type="12" draft="unconfirmed">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Dil</day>
+ <day type="mon">Wix</day>
+ <day type="tue">Qib</day>
+ <day type="wed">Rob</day>
+ <day type="thu">Kam</day>
+ <day type="fri">Jim</day>
+ <day type="sat">San</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Dilbata</day>
+ <day type="mon">Wiixata</day>
+ <day type="tue">Qibxata</day>
+ <day type="wed">Roobii</day>
+ <day type="thu">Kamiisa</day>
+ <day type="fri">Jimaata</day>
+ <day type="sat">Sanbata</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">S</day>
+ <day type="mon" draft="unconfirmed">M</day>
+ <day type="tue" draft="unconfirmed">T</day>
+ <day type="wed" draft="unconfirmed">W</day>
+ <day type="thu" draft="unconfirmed">T</day>
+ <day type="fri" draft="unconfirmed">F</day>
+ <day type="sat" draft="unconfirmed">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraAbbr>
+ <era type="0">KD</era>
+ <era type="1">KB</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">Brazilian Real</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="unconfirmed">Chinese Yuan Renminbi</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName draft="unconfirmed">Itoophiyaa Birrii</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="unconfirmed">Euro</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">British Pound Sterling</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">Indian Rupee</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="unconfirmed">Japanese Yen</displayName>
+ </currency>
+ <currency type="KES">
+ <symbol>Ksh</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">Russian Ruble</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">US Dollar</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/om_ET.xml b/libs/Zend/Locale/Data/om_ET.xml
new file mode 100755
index 0000000000..20942e0868
--- /dev/null
+++ b/libs/Zend/Locale/Data/om_ET.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="om"/>
+ <territory type="ET"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <am>WD</am>
+ <pm>WB</pm>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, MMMM d, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ETB">
+ <symbol>$</symbol>
+ </currency>
+ <currency type="USD">
+ <symbol>US$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/om_KE.xml b/libs/Zend/Locale/Data/om_KE.xml
new file mode 100755
index 0000000000..8b8a85ac8e
--- /dev/null
+++ b/libs/Zend/Locale/Data/om_KE.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="om"/>
+ <territory type="KE"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <am>WD</am>
+ <pm>WB</pm>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, MMMM d, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/or.xml b/libs/Zend/Locale/Data/or.xml
new file mode 100755
index 0000000000..2362336f44
--- /dev/null
+++ b/libs/Zend/Locale/Data/or.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.27 $"/>
+ <generation date="$Date: 2006/06/28 16:30:20 $"/>
+ <language type="or"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="or" draft="unconfirmed">ଓଡ଼ିଆ</language>
+ </languages>
+ <territories>
+ <territory type="IN" draft="unconfirmed">ଭାରତ</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[ଅ-ଋ ଠଠଓ-ନ ପ-ର ଲ ଳ ଶ-ହ ୟ ୱ ଵ ଂ ଃ ଠୠ଼ ା-ୃ େ ୈ ୋ ୌ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">ଜାନà­à¬†à¬°à­€</month>
+ <month type="2" draft="unconfirmed">ଫେବà­à¬°à­à­Ÿà¬¾à¬°à­€</month>
+ <month type="3" draft="unconfirmed">ମାରà­à¬šà­à¬š</month>
+ <month type="4" draft="unconfirmed">ଅପà­à¬°à­‡à¬²</month>
+ <month type="5" draft="unconfirmed">ମେ</month>
+ <month type="6" draft="unconfirmed">ଜà­à¬¨</month>
+ <month type="7" draft="unconfirmed">ଜà­à¬²à¬¾à¬‡</month>
+ <month type="8" draft="unconfirmed">ଅଗଷà­à¬Ÿ</month>
+ <month type="9" draft="unconfirmed">ସେପà­à¬Ÿà­‡à¬®à­à¬¬à¬°</month>
+ <month type="10" draft="unconfirmed">ଅକà­à¬Ÿà­‹à¬¬à¬°</month>
+ <month type="11" draft="unconfirmed">ନଭେମà­à¬¬à¬°</month>
+ <month type="12" draft="unconfirmed">ଡିସେମà­à¬¬à¬°</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">ରବି</day>
+ <day type="mon" draft="unconfirmed">ସୋମ</day>
+ <day type="tue" draft="unconfirmed">ମଙà­à¬—ଳ</day>
+ <day type="wed" draft="unconfirmed">ବà­à¬§</day>
+ <day type="thu" draft="unconfirmed">ଗà­à¬°à­</day>
+ <day type="fri" draft="unconfirmed">ଶà­à¬•à­à¬°</day>
+ <day type="sat" draft="unconfirmed">ଶନି</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">ରବିବାର</day>
+ <day type="mon" draft="unconfirmed">ସୋମବାର</day>
+ <day type="tue" draft="unconfirmed">ମଙà­à¬—ଳବାର</day>
+ <day type="wed" draft="unconfirmed">ବà­à¬§à¬¬à¬¾à¬°</day>
+ <day type="thu" draft="unconfirmed">ଗà­à¬°à­à¬¬à¬¾à¬°</day>
+ <day type="fri" draft="unconfirmed">ଶà­à¬•à­à¬°à¬¬à¬¾à¬°</day>
+ <day type="sat" draft="unconfirmed">ଶନିବାର</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <nativeZeroDigit draft="unconfirmed">à­¦</nativeZeroDigit>
+ </symbols>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/or_IN.xml b/libs/Zend/Locale/Data/or_IN.xml
new file mode 100755
index 0000000000..12a6be7b4c
--- /dev/null
+++ b/libs/Zend/Locale/Data/or_IN.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.29 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="or"/>
+ <territory type="IN"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern draft="unconfirmed">#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern draft="unconfirmed">#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/pa.xml b/libs/Zend/Locale/Data/pa.xml
new file mode 100755
index 0000000000..606d28b844
--- /dev/null
+++ b/libs/Zend/Locale/Data/pa.xml
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.45 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="pa"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="pa">ਪੰਜਾਬੀ</language>
+ </languages>
+ <scripts>
+ <script type="Deva" draft="unconfirmed">ਦੇਵਨਾਗਰੀ</script>
+ <script type="Guru" draft="unconfirmed">ਗà©à¨°à¨®à©à¨–à©€</script>
+ </scripts>
+ <territories>
+ <territory type="IN">ਭਾਰਤ</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[਼ à©° ੱ ੦-੯ à©´ ੳ ਉ ਊ ਓ ਅ ਆ ਠਔ ੲ ਇ ਈ ਠਸ {ਸ਼} ਹ ਕ ਖ {ਖ਼} ਗ {ਗ਼} ਘ-ਜ {ਜ਼} à¨-ਨ ਪ ਫ {ਫ਼} ਬ-ਰ ਲ ਵ à©œ ਾ-à©‚ ੇ ੈ à©‹-à©]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D à¨-ਃ {ਲ਼}]</exemplarCharacters>
+ <exemplarCharacters alt="proposed-u211-1" draft="unconfirmed">[\u200C \u200D ਼ à¨-ਃ à©° ੱ ੦-੯ à©´ ੳ ਉ ਊ ਓ ਅ ਆ ਠਔ ੲ ਇ ਈ ਠਸ {ਸ਼} ਹ ਕ ਖ {ਖ਼} ਗ {ਗ਼} ਘ-ਜ {ਜ਼} à¨-ਨ ਪ ਫ {ਫ਼} ਬ-ਰ ਲ {ਲ਼} ਵ à©œ ਾ-à©‚ ੇ ੈ à©‹-à©]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">ਜਨਵਰੀ</month>
+ <month type="2">ਫ਼ਰਵਰੀ</month>
+ <month type="3">ਮਾਰਚ</month>
+ <month type="4">ਅਪà©à¨°à©ˆà¨²</month>
+ <month type="5">ਮਈ</month>
+ <month type="6">ਜੂਨ</month>
+ <month type="7">ਜà©à¨²à¨¾à¨ˆ</month>
+ <month type="8">ਅਗਸਤ</month>
+ <month type="9">ਸਤੰਬਰ</month>
+ <month type="10">ਅਕਤੂਬਰ</month>
+ <month type="11">ਨਵੰਬਰ</month>
+ <month type="12">ਦਸੰਬਰ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">ਜਨਵਰੀ</month>
+ <month type="2">ਫ਼ਰਵਰੀ</month>
+ <month type="3">ਮਾਰਚ</month>
+ <month type="4">ਅਪà©à¨°à©ˆà¨²</month>
+ <month type="5">ਮਈ</month>
+ <month type="6">ਜੂਨ</month>
+ <month type="7">ਜà©à¨²à¨¾à¨ˆ</month>
+ <month type="8">ਅਗਸਤ</month>
+ <month type="9">ਸਤੰਬਰ</month>
+ <month type="10">ਅਕਤੂਬਰ</month>
+ <month type="11">ਨਵੰਬਰ</month>
+ <month type="12">ਦਸੰਬਰ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">à¨à¨¤.</day>
+ <day type="mon">ਸੋਮ.</day>
+ <day type="tue">ਮੰਗਲ.</day>
+ <day type="wed">ਬà©à¨§.</day>
+ <day type="wed" alt="proposed-u211-1" draft="unconfirmed">ਬà©à©±à¨§.</day>
+ <day type="thu">ਵੀਰ.</day>
+ <day type="fri">ਸ਼à©à¨•à¨°.</day>
+ <day type="fri" alt="proposed-u211-2" draft="unconfirmed">ਸ਼à©à©±à¨•à¨°.</day>
+ <day type="sat">ਸ਼ਨੀ.</day>
+ <day type="sat" alt="proposed-u211-1" draft="unconfirmed">ਸ਼ਨਿੱਚਰ.</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">à¨à¨¤à¨µà¨¾à¨°</day>
+ <day type="mon">ਸੋਮਵਾਰ</day>
+ <day type="tue">ਮੰਗਲਵਾਰ</day>
+ <day type="wed">ਬà©à¨§à¨µà¨¾à¨°</day>
+ <day type="wed" alt="proposed-u211-1" draft="unconfirmed">ਬà©à©±à¨§à¨µà¨¾à¨°</day>
+ <day type="thu">ਵੀਰਵਾਰ</day>
+ <day type="fri">ਸ਼à©à©±à¨•à¨°à¨µà¨¾à¨°</day>
+ <day type="sat">ਸ਼ਨੀਚਰਵਾਰ</day>
+ <day type="sat" alt="proposed-u211-1" draft="unconfirmed">ਸ਼ਨਿੱਚਰਵਾਰ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">ਪਹਿਲਾਂ ਚੌਥਾਈ</quarter>
+ <quarter type="2" draft="unconfirmed">ਦੂਜਾ ਚੌਥਾਈ</quarter>
+ <quarter type="3" draft="unconfirmed">ਤੀਜਾ ਚੌਥਾਈ</quarter>
+ <quarter type="4" draft="unconfirmed">ਚੌਥਾ ਚੌਥਾਈ</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>ਸਵੇਰੇ</am>
+ <am alt="proposed-u211-1" draft="unconfirmed">ਸਵੇਰ</am>
+ <pm>ਸ਼ਾਮ</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">ਈਸਾਪੂਰਵ</era>
+ <era type="1" draft="unconfirmed">ਸੰਨ</era>
+ </eraNames>
+ </eras>
+ <fields>
+ <field type="year">
+ <displayName draft="unconfirmed">ਸਾਲ</displayName>
+ </field>
+ <field type="month">
+ <displayName draft="unconfirmed">ਮਹੀਨਾ</displayName>
+ </field>
+ <field type="week">
+ <displayName draft="unconfirmed">ਹਫ਼ਤਾ</displayName>
+ </field>
+ <field type="day">
+ <displayName draft="unconfirmed">ਦਿਨ</displayName>
+ </field>
+ <field type="weekday">
+ <displayName draft="unconfirmed">ਹਫ਼ਤੇ ਦਾ ਦਿਨ</displayName>
+ </field>
+ <field type="hour">
+ <displayName draft="unconfirmed">ਘੰਟਾ</displayName>
+ </field>
+ <field type="minute">
+ <displayName draft="unconfirmed">ਮਿੰਟ</displayName>
+ </field>
+ <field type="zone">
+ <displayName draft="unconfirmed">ਖੇਤਰ</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <nativeZeroDigit>੦</nativeZeroDigit>
+ </symbols>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="AFN">
+ <displayName draft="unconfirmed">ਅਫ਼ਗਾਨੀ</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="unconfirmed">ਯੂਰੋ</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>ਰà©à¨ªà¨¿à¨¯</displayName>
+ <displayName alt="proposed-u211-3" draft="unconfirmed">ਰà©à¨ªà¨ˆà¨†</displayName>
+ <symbol>ਰà©.</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">ਹਾਂ</yesstr>
+ <nostr draft="unconfirmed">ਨਹੀਂ</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1" uri="http://tdil.mit.gov.in/newsIndexApr02.htm">Govt of India Vishwabhart Newsletter</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/pa_Arab.xml b/libs/Zend/Locale/Data/pa_Arab.xml
new file mode 100755
index 0000000000..2614022f4f
--- /dev/null
+++ b/libs/Zend/Locale/Data/pa_Arab.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.11 $"/>
+ <generation date="$Date: 2006/07/17 01:03:00 $"/>
+ <language type="pa"/>
+ <script type="Arab"/>
+ </identity>
+ <localeDisplayNames>
+ <scripts>
+ <script type="Guru">Ú¯ÙرمÙÚ©Ú¾ÛŒ</script>
+ </scripts>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[ء آ ؤ ئ-ب پ ت ث ٹ ج چ ح-ذ ڈ ر ز ڑ ژ س-غ ٠ق ک گ ل-ن ں ه ھ و ی ے]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[Ø£ Ù» Ø© Ùº Ù¼ Ù½]</exemplarCharacters>
+ <exemplarCharacters alt="proposed-u211-1" draft="unconfirmed">[ء-ؤ ئ-ب ٻ پ ة-ث ٹ ٺ ټ ٽ ج چ ح-ذ ڈ ر ز ڑ ژ س-غ ٠ق ک گ ل-ن ں ه ھ و ی ے]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1">جنوری</month>
+ <month type="2">Ùروری</month>
+ <month type="3">مارچ</month>
+ <month type="4">اپریل</month>
+ <month type="5">مئ</month>
+ <month type="6">جون</month>
+ <month type="7">جولائی</month>
+ <month type="8">اگست</month>
+ <month type="9">ستمبر</month>
+ <month type="10">اکتوبر</month>
+ <month type="11">نومبر</month>
+ <month type="12">دسمبر</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="wide">
+ <day type="sun">اتوار</day>
+ <day type="mon">پیر</day>
+ <day type="tue">منگل</day>
+ <day type="wed">بÙدھ</day>
+ <day type="thu">جمعرات</day>
+ <day type="fri">جمعÛ</day>
+ <day type="sat">ÛÙتÛ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1">چوتھاي Ù¾Ûلاں</quarter>
+ <quarter type="2">چوتھاي دوجا</quarter>
+ <quarter type="3">چوتھاي تيجا</quarter>
+ <quarter type="4">چوتھاي چوتھا</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraNames>
+ <era type="0">ايساپورو</era>
+ <era type="1">سں</era>
+ </eraNames>
+ </eras>
+ <fields>
+ <field type="year">
+ <displayName>ورھا</displayName>
+ </field>
+ <field type="month">
+ <displayName>Ù…Ûينا</displayName>
+ </field>
+ <field type="week">
+ <displayName>ÛÙتÛ</displayName>
+ </field>
+ <field type="day">
+ <displayName>دئن</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>ÛÙتے دا دن</displayName>
+ </field>
+ <field type="hour">
+ <displayName>گھنٹا</displayName>
+ </field>
+ <field type="minute">
+ <displayName>منٹ</displayName>
+ </field>
+ <field type="zone">
+ <displayName>ٹپÛ</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="EUR">
+ <displayName>يورو</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Ø±ÙˆÙ¾Ø¦ÛŒÛ [INR]</displayName>
+ <symbol>ر [INR]</symbol>
+ </currency>
+ <currency type="PKR">
+ <displayName>روپئیÛ</displayName>
+ <symbol>ر</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>Ûاں</yesstr>
+ <nostr>Ù†ÛÙŠÚº</nostr>
+ </messages>
+ </posix>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/pa_Arab_PK.xml b/libs/Zend/Locale/Data/pa_Arab_PK.xml
new file mode 100755
index 0000000000..25e4ae8ed7
--- /dev/null
+++ b/libs/Zend/Locale/Data/pa_Arab_PK.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.6 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="pa"/>
+ <script type="Arab"/>
+ <territory type="PK"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/pa_Guru.xml b/libs/Zend/Locale/Data/pa_Guru.xml
new file mode 100755
index 0000000000..e192fedd8f
--- /dev/null
+++ b/libs/Zend/Locale/Data/pa_Guru.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.6 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="pa"/>
+ <script type="Guru"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/pa_Guru_IN.xml b/libs/Zend/Locale/Data/pa_Guru_IN.xml
new file mode 100755
index 0000000000..272addd381
--- /dev/null
+++ b/libs/Zend/Locale/Data/pa_Guru_IN.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.6 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="pa"/>
+ <script type="Guru"/>
+ <territory type="IN"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/pa_IN.xml b/libs/Zend/Locale/Data/pa_IN.xml
new file mode 100755
index 0000000000..3cd03f538b
--- /dev/null
+++ b/libs/Zend/Locale/Data/pa_IN.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="pa"/>
+ <territory type="IN"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">'</quotationStart>
+ <quotationEnd draft="unconfirmed">'</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">&quot;</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">&quot;</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d-M-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="INR">
+ <displayName draft="provisional">ਰà©à¨ªà¨¿à¨†</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/pa_PK.xml b/libs/Zend/Locale/Data/pa_PK.xml
new file mode 100755
index 0000000000..cf8e47fe2d
--- /dev/null
+++ b/libs/Zend/Locale/Data/pa_PK.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.6 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="pa"/>
+ <territory type="PK"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/pl.xml b/libs/Zend/Locale/Data/pl.xml
new file mode 100755
index 0000000000..88bd2d5557
--- /dev/null
+++ b/libs/Zend/Locale/Data/pl.xml
@@ -0,0 +1,1541 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.72 $"/>
+ <generation date="$Date: 2006/10/26 22:46:09 $"/>
+ <language type="pl"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar">arabski</language>
+ <language type="bg">bułgarski</language>
+ <language type="bn">bengalski</language>
+ <language type="ca">kataloński</language>
+ <language type="cs">czeski</language>
+ <language type="cy">walijski</language>
+ <language type="da">duński</language>
+ <language type="de">niemiecki</language>
+ <language type="el">grecki</language>
+ <language type="en">angielski</language>
+ <language type="es">hiszpański</language>
+ <language type="et">estoński</language>
+ <language type="eu">baskijski</language>
+ <language type="fi">fiński</language>
+ <language type="fr">francuski</language>
+ <language type="he">hebrajski</language>
+ <language type="hi">hindi</language>
+ <language type="hr">chorwacki</language>
+ <language type="hu">węgierski</language>
+ <language type="it">włoski</language>
+ <language type="ja">japoński</language>
+ <language type="ko">koreański</language>
+ <language type="lt">litewski</language>
+ <language type="lv">Å‚otewski</language>
+ <language type="mt">maltański</language>
+ <language type="nl">niderlandzki</language>
+ <language type="no">norweski</language>
+ <language type="pl">polski</language>
+ <language type="pt">portugalski</language>
+ <language type="ro">rumuński</language>
+ <language type="ru">rosyjski</language>
+ <language type="sk">słowacki</language>
+ <language type="sl">słoweński</language>
+ <language type="sv">szwedzki</language>
+ <language type="th">tajski</language>
+ <language type="tr">turecki</language>
+ <language type="zh">chiński</language>
+ </languages>
+ <scripts>
+ <script type="Arab">Arabski</script>
+ <script type="Armn">Armeński</script>
+ <script type="Beng">Bengalski</script>
+ <script type="Cans">Zunifikowane symbole kanadyjskich autochtonów</script>
+ <script type="Cher">Czerokezki</script>
+ <script type="Copt">Koptyjski</script>
+ <script type="Cyrl">Cyrylicki</script>
+ <script type="Ethi">Etiopski</script>
+ <script type="Geor">Gruziński</script>
+ <script type="Goth">Gotycki</script>
+ <script type="Grek">Grecki</script>
+ <script type="Gujr">Gudżarati</script>
+ <script type="Hano">Hanunoo</script>
+ <script type="Hans">Uproszczony Han</script>
+ <script type="Hant">Tradycyjny Han</script>
+ <script type="Hebr">Hebrajski</script>
+ <script type="Ital">Starowłoski</script>
+ <script type="Khmr">Khmerski</script>
+ <script type="Laoo">Laotański</script>
+ <script type="Latn">ÅaciÅ„ski</script>
+ <script type="Limb">Limbu</script>
+ <script type="Linb">Linearny B</script>
+ <script type="Mlym">Malayalam</script>
+ <script type="Mong">Mongolski</script>
+ <script type="Mymr">Myanmar</script>
+ <script type="Ogam">Ogham</script>
+ <script type="Orya">Oriya</script>
+ <script type="Osma">Csmanya</script>
+ <script type="Qaai">Dziedziczny</script>
+ <script type="Runr">Runiczny</script>
+ <script type="Sinh">Syngaleski</script>
+ <script type="Syrc">Syryjski</script>
+ <script type="Tagb">Tagbanwa</script>
+ <script type="Taml">Tamilski</script>
+ <script type="Telu">Telugu</script>
+ <script type="Tglg">Tagalog</script>
+ <script type="Thaa">Thaana</script>
+ <script type="Thai">Tajski</script>
+ <script type="Tibt">Tybetański</script>
+ <script type="Ugar">Ugarycki</script>
+ <script type="Zyyy">Wspólny</script>
+ </scripts>
+ <territories>
+ <territory type="001">Åšwiat</territory>
+ <territory type="002">Afryka</territory>
+ <territory type="005">Ameryka Południowa</territory>
+ <territory type="009">Oceania</territory>
+ <territory type="011">Afryka Zachodnia</territory>
+ <territory type="013">Ameryka Åšrodkowa</territory>
+ <territory type="014">Afryka Wschodnia</territory>
+ <territory type="015">Afryka Północna</territory>
+ <territory type="017">Afryka Åšrodkowa</territory>
+ <territory type="019">Ameryka</territory>
+ <territory type="021">Ameryka Północna</territory>
+ <territory type="029" draft="provisional">Karaiby</territory>
+ <territory type="030">Azja Wschodnia</territory>
+ <territory type="035">Azja Południowo-Wschodnia</territory>
+ <territory type="039">Europa Południowa</territory>
+ <territory type="053">Australia i Nowa Zelandia</territory>
+ <territory type="054">Melanezja</territory>
+ <territory type="057">Mikronezja</territory>
+ <territory type="061">Polinezja</territory>
+ <territory type="062" draft="provisional">(empty)</territory>
+ <territory type="142">Azja</territory>
+ <territory type="145">Azja Zachodnia</territory>
+ <territory type="150">Europa</territory>
+ <territory type="151">Europa Wschodnia</territory>
+ <territory type="154">Europa Północna</territory>
+ <territory type="155">Europa Zachodnia</territory>
+ <territory type="830">Wyspy Normandzkie</territory>
+ <territory type="IM">Wyspa Man</territory>
+ <territory type="AD">Andora</territory>
+ <territory type="AE">Zjednoczone Emiraty Arabskie</territory>
+ <territory type="AF">Afganistan</territory>
+ <territory type="AG">Antigua i Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albania</territory>
+ <territory type="AM">Armenia</territory>
+ <territory type="AN">Antyle Holenderskie</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktyka</territory>
+ <territory type="AR">Argentyna</territory>
+ <territory type="AS">Samoa Amerykańskie</territory>
+ <territory type="AT">Austria</territory>
+ <territory type="AU">Australia</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Wyspy Alandzkie</territory>
+ <territory type="AZ">Azerbejdżan</territory>
+ <territory type="BA">Bośnia i Hercegowina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesz</territory>
+ <territory type="BE">Belgia</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bułgaria</territory>
+ <territory type="BH">Bahrajn</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermudy</territory>
+ <territory type="BN">Brunei Darussalam</territory>
+ <territory type="BO">Boliwia</territory>
+ <territory type="BR">Brazylia</territory>
+ <territory type="BS">Bahamy</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BV">Wyspa Bouveta</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Białoruś</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Wyspy Kokosowe (Keelinga)</territory>
+ <territory type="CD">Kongo, Republika Demokratyczna</territory>
+ <territory type="CF">Republika Åšrodkowej Afryki</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Szwajcaria</territory>
+ <territory type="CI">Wybrzeże Kości Słoniowej</territory>
+ <territory type="CK">Wyspy Cooka</territory>
+ <territory type="CL">Chile</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Chiny</territory>
+ <territory type="CO">Kolumbia</territory>
+ <territory type="CR">Kostaryka</territory>
+ <territory type="CS">Serbia i Czarnogóra</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Wyspy Zielonego PrzylÄ…dka</territory>
+ <territory type="CX">Wyspa Bożego Narodzenia</territory>
+ <territory type="CY">Cypr</territory>
+ <territory type="CZ">Republika Czeska</territory>
+ <territory type="DE">Niemcy</territory>
+ <territory type="DJ">Dżibuti</territory>
+ <territory type="DK">Dania</territory>
+ <territory type="DM">Dominika</territory>
+ <territory type="DO">Republika Dominikańska</territory>
+ <territory type="DZ">Algieria</territory>
+ <territory type="EC">Ekwador</territory>
+ <territory type="EE">Estonia</territory>
+ <territory type="EG">Egipt</territory>
+ <territory type="EH">Sahara Zachodnia</territory>
+ <territory type="ER">Erytrea</territory>
+ <territory type="ES">Hiszpania</territory>
+ <territory type="ET">Etiopia</territory>
+ <territory type="FI">Finlandia</territory>
+ <territory type="FJ">Fidżi</territory>
+ <territory type="FK">Falklandy (Malwiny)</territory>
+ <territory type="FM">Mikronezja, Stany Sfederowane</territory>
+ <territory type="FO">Wyspy Owcze</territory>
+ <territory type="FR">Francja</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Wielka Brytania</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Gruzja</territory>
+ <territory type="GF">Gujana Francuska</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Grenlandia</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Gwinea</territory>
+ <territory type="GP">Gwadelupa</territory>
+ <territory type="GQ">Gwinea Równikowa</territory>
+ <territory type="GR">Grecja</territory>
+ <territory type="GS">Wyspy Georgia Południowa i Sandwich Południowy</territory>
+ <territory type="GT">Gwatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Gwinea Bissau</territory>
+ <territory type="GY">Gujana</territory>
+ <territory type="HK">Hongkong, Specjalny Region Administracyjny Chin</territory>
+ <territory type="HM">Wyspy Heard i McDonald</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Chorwacja</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Węgry</territory>
+ <territory type="ID">Indonezja</territory>
+ <territory type="IE">Irlandia</territory>
+ <territory type="IL">Izrael</territory>
+ <territory type="IN">Indie</territory>
+ <territory type="IO">Terytorium Brytyjskie Oceanu Indyjskiego</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Islandia</territory>
+ <territory type="IT">WÅ‚ochy</territory>
+ <territory type="JM">Jamajka</territory>
+ <territory type="JO">Jordania</territory>
+ <territory type="JP">Japonia</territory>
+ <territory type="KE">Kenia</territory>
+ <territory type="KG">Kirgistan</territory>
+ <territory type="KH">Kambodża</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komory</territory>
+ <territory type="KN">Saint Kitts i Nevis</territory>
+ <territory type="KP">Korea Północna</territory>
+ <territory type="KR">Korea Południowa</territory>
+ <territory type="KW">Kuwejt</territory>
+ <territory type="KY">Kajmany</territory>
+ <territory type="KZ">Kazachstan</territory>
+ <territory type="LA">Laos (Demokratyczna Republika Ludowa)</territory>
+ <territory type="LB">Liban</territory>
+ <territory type="LC">Saint Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberia</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Litwa</territory>
+ <territory type="LU">Luksemburg</territory>
+ <territory type="LV">Åotwa</territory>
+ <territory type="LY">Libijska</territory>
+ <territory type="MA">Maroko</territory>
+ <territory type="MC">Monako</territory>
+ <territory type="MD">Mołdawia, Republika</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Wyspy Marshalla</territory>
+ <territory type="MK">Macedonia, Republika</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Birma</territory>
+ <territory type="MN">Mongolia</territory>
+ <territory type="MO">Makau, Specjalny Region Administracyjny Chin</territory>
+ <territory type="MP">Wspólnota Marianów Północnych</territory>
+ <territory type="MQ">Martynika</territory>
+ <territory type="MR">Mauretania</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Malediwy</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Meksyk</territory>
+ <territory type="MY">Malezja</territory>
+ <territory type="MZ">Mozambik</territory>
+ <territory type="NA">Namibia</territory>
+ <territory type="NC">Nowa Kaledonia</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Wyspa Norfolk</territory>
+ <territory type="NG">Nigeria</territory>
+ <territory type="NI">Nikaragua</territory>
+ <territory type="NL">Holandia</territory>
+ <territory type="NO">Norwegia</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Nowa Zelandia</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Polinezja Francuska</territory>
+ <territory type="PG">Papua Nowa Gwinea</territory>
+ <territory type="PH">Filipiny</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Polska</territory>
+ <territory type="PM">St. Pierre i Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Puerto Rico</territory>
+ <territory type="PS">Terytoria Palestyńskie</territory>
+ <territory type="PT">Portugalia</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paragwaj</territory>
+ <territory type="QA">Katar</territory>
+ <territory type="QO">Oceania inne</territory>
+ <territory type="RE">Reunion</territory>
+ <territory type="RO">Rumunia</territory>
+ <territory type="RU">Federacja Rosyjska</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Arabia Saudyjska</territory>
+ <territory type="SB">Wyspy Salomona</territory>
+ <territory type="SC">Seszele</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Szwecja</territory>
+ <territory type="SG">Singapur</territory>
+ <territory type="SH">Wyspa Świętej Heleny</territory>
+ <territory type="SI">SÅ‚owenia</territory>
+ <territory type="SJ">Svalbard i Wyspy Jan Mayen</territory>
+ <territory type="SK">SÅ‚owacja</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalia</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">Wyspy Świętego Tomasza i Książęca</territory>
+ <territory type="SV">Salwador</territory>
+ <territory type="SY">Syria</territory>
+ <territory type="SZ">Suazi</territory>
+ <territory type="TC">Turks i Caicos</territory>
+ <territory type="TD">Czad</territory>
+ <territory type="TF">Francuskie Terytoria Południowe</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Tajlandia</territory>
+ <territory type="TJ">Tadżykistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Timor Wschodni</territory>
+ <territory type="TM">Turkmenia</territory>
+ <territory type="TN">Tunezja</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turcja</territory>
+ <territory type="TT">Trinidad i Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Tajwan</territory>
+ <territory type="TZ">Tanzania</territory>
+ <territory type="UA">Ukraina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">United States Minor Outlying Islands</territory>
+ <territory type="US">Stany Zjednoczone</territory>
+ <territory type="UY">Urugwaj</territory>
+ <territory type="UZ">Uzbekistan</territory>
+ <territory type="VA">Stolica Apostolska (Państwo Watykańskie)</territory>
+ <territory type="VC">Saint Vincent and the Grenadines</territory>
+ <territory type="VE">Wenezuela</territory>
+ <territory type="VG">Brytyjskie Wyspy Dziewicze</territory>
+ <territory type="VI">Wyspy Dziewicze, Stanów Zjednoczonych</territory>
+ <territory type="VN">Wietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis i Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="YT">Majotta</territory>
+ <territory type="ZA">Afryka Południowa</territory>
+ <territory type="ZM">Zambia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ <keys>
+ <key type="calendar">Kalendarz</key>
+ <key type="collation">Sortowanie</key>
+ <key type="currency">Waluta</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">Kalendarz buddyjski</type>
+ <type type="chinese" key="calendar">Kalendarz chiński</type>
+ <type type="direct" key="collation">porządek bezpośredni</type>
+ <type type="gregorian" key="calendar">Kalendarz gregoriański</type>
+ <type type="hebrew" key="calendar">Kalendarz żydowski</type>
+ <type type="islamic" key="calendar">Kalendarz muzułmański</type>
+ <type type="islamic-civil" key="calendar">Kalendarz muzułmański cywilny</type>
+ <type type="japanese" key="calendar">Kalendarz japoński</type>
+ <type type="phonebook" key="collation">porządek książki telefonicznej</type>
+ <type type="pinyin" key="collation">porzÄ…dek Pinyin</type>
+ <type type="stroke" key="collation">porządek akcentów</type>
+ <type type="traditional" key="collation">tradycyjny</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a ą b c ć d e ę f-l ł m n ń o ó p r s ś t u w-z ź ż]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[q v x]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">st</month>
+ <month type="2">lut</month>
+ <month type="3">mrz</month>
+ <month type="4">kw</month>
+ <month type="5">maj</month>
+ <month type="6">cz</month>
+ <month type="7">lip</month>
+ <month type="8">sier</month>
+ <month type="9">wrz</month>
+ <month type="10">paź</month>
+ <month type="11">lis</month>
+ <month type="12">gr</month>
+ </monthWidth>
+ <monthWidth type="narrow">
+ <month type="1">s</month>
+ <month type="2">l</month>
+ <month type="3">m</month>
+ <month type="4">k</month>
+ <month type="5">m</month>
+ <month type="6">c</month>
+ <month type="7">l</month>
+ <month type="8">s</month>
+ <month type="9">w</month>
+ <month type="10">p</month>
+ <month type="11">l</month>
+ <month type="12">g</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">stycznia</month>
+ <month type="2">lutego</month>
+ <month type="3">marca</month>
+ <month type="4">kwietnia</month>
+ <month type="5">maja</month>
+ <month type="6">czerwca</month>
+ <month type="7">lipca</month>
+ <month type="8">sierpnia</month>
+ <month type="9">września</month>
+ <month type="10">października</month>
+ <month type="11">listopada</month>
+ <month type="12">grudnia</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="abbreviated">
+ <month type="1">st</month>
+ <month type="2">lut</month>
+ <month type="3">mrz</month>
+ <month type="4">kw</month>
+ <month type="5">maj</month>
+ <month type="6">cz</month>
+ <month type="7">lip</month>
+ <month type="8">sier</month>
+ <month type="9">wrz</month>
+ <month type="10">paź</month>
+ <month type="11">lis</month>
+ <month type="12">gr</month>
+ </monthWidth>
+ <monthWidth type="narrow">
+ <month type="1">s</month>
+ <month type="2">l</month>
+ <month type="3">m</month>
+ <month type="4">k</month>
+ <month type="5">m</month>
+ <month type="6">c</month>
+ <month type="7">l</month>
+ <month type="8">s</month>
+ <month type="9">w</month>
+ <month type="10">p</month>
+ <month type="11">l</month>
+ <month type="12">g</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">styczeń</month>
+ <month type="2">luty</month>
+ <month type="3">marzec</month>
+ <month type="4">kwiecień</month>
+ <month type="5">maj</month>
+ <month type="6">czerwiec</month>
+ <month type="7">lipiec</month>
+ <month type="8">sierpień</month>
+ <month type="9">wrzesień</month>
+ <month type="10">październik</month>
+ <month type="11">listopad</month>
+ <month type="12">grudzień</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">niedz.</day>
+ <day type="mon">pon.</day>
+ <day type="tue">wt.</day>
+ <day type="wed">śr.</day>
+ <day type="thu">czw.</day>
+ <day type="fri">pt.</day>
+ <day type="sat">sob.</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">niedziela</day>
+ <day type="mon">poniedziałek</day>
+ <day type="tue">wtorek</day>
+ <day type="wed">środa</day>
+ <day type="thu">czwartek</day>
+ <day type="fri">piÄ…tek</day>
+ <day type="sat">sobota</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">N</day>
+ <day type="mon">P</day>
+ <day type="tue">W</day>
+ <day type="wed">Åš</day>
+ <day type="thu">C</day>
+ <day type="fri">P</day>
+ <day type="sat">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">K1</quarter>
+ <quarter type="2">K2</quarter>
+ <quarter type="3">K3</quarter>
+ <quarter type="4">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">I kwartał</quarter>
+ <quarter type="2">II kwartał</quarter>
+ <quarter type="3">III kwartał</quarter>
+ <quarter type="4">IV kwartał</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraAbbr>
+ <era type="0">p.n.e.</era>
+ <era type="1">n.e.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy-MM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yy-MM-dd</pattern>
+ <pattern alt="proposed" draft="provisional">dd.MM.yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">MM-dd</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">yyyy-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="America/Argentina/ComodRivadavia">
+ <exemplarCity>Comodoro Rivadavia</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Rothera">
+ <exemplarCity>Stacja Naukowa Rothera</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Palmer">
+ <exemplarCity>Archipelag Palmera</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Biegun południowy</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Syowa">
+ <exemplarCity>Stacja Syowa</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Mawson">
+ <exemplarCity>Wybrzeże Mawsona</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Vostok">
+ <exemplarCity>Wostok</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity>Dumont d'Urville</exemplarCity>
+ </zone>
+ <zone type="Antarctica/McMurdo">
+ <exemplarCity>Mc Murdo</exemplarCity>
+ </zone>
+ <zone type="Australia/Lord_Howe">
+ <exemplarCity>Wyspa Lord Howe</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <exemplarCity>St. John's</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity>Kinszasa</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity>Lubumbaszi</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>Wyspy Wielkanocne</exemplarCity>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity>Kaszgar</exemplarCity>
+ </zone>
+ <zone type="Asia/Urumqi">
+ <exemplarCity>Urumczi</exemplarCity>
+ </zone>
+ <zone type="Asia/Chongqing">
+ <exemplarCity>Czunking</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity>Szanghaj</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>Wyspy Kanaryjskie</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity>Madryt</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>Londyn</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity>Dżakarta</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtau">
+ <exemplarCity>Aktau</exemplarCity>
+ </zone>
+ <zone type="Asia/Oral">
+ <exemplarCity>Uralsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtobe">
+ <exemplarCity>Aktiubińsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Qyzylorda">
+ <exemplarCity>Kyzył Orda</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity>AÅ‚ma Ata</exemplarCity>
+ </zone>
+ <zone type="Asia/Hovd">
+ <exemplarCity>Howd</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>UÅ‚an Bator</exemplarCity>
+ </zone>
+ <zone type="Asia/Choibalsan">
+ <exemplarCity>Czojbalsan</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>Meksyk</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuching">
+ <exemplarCity>Kuczing</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>Azory</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Madeira">
+ <exemplarCity>Madera</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lizbona</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moskwa</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>Jekaterynburg</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity>Nowosybirsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>Krasnojarsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity>Irkuck</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>Jakuck</exemplarCity>
+ </zone>
+ <zone type="Asia/Vladivostok">
+ <exemplarCity>WÅ‚adywostok</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>Sachalin</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>Kamczatka</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>Użgorod</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>Kijów</exemplarCity>
+ </zone>
+ <zone type="Europe/Simferopol">
+ <exemplarCity>Symferopol</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>Zaporoże</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <exemplarCity>Nowy Jork</exemplarCity>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity>Samarkanda</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Taszkient</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <currencies>
+ <currency type="ADP">
+ <displayName>peseta andorska</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>dirham ZEA</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>afgani (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>afgani</displayName>
+ <symbol>Af</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>lek albański</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>dram armeński</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>gulden Antyle Holenderskie</displayName>
+ <symbol>NA f.</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>kwanza angolańska</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>kwanza angolańska (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>nowa kwanza angolańska (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>kwanza angolańska Reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>austral argentyński</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>peso argentyńskie (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>peso argentyńskie</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>szyling austriacki </displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>dolar australijski</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>gulden arubski</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>manat azerbejdżański</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>dinar Bośni i Hercegowiny</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>marka konwertybilna Bośni i Hercegowiny</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>dolar Barbadosu</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>taka bengalska</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>frank belgijski (zamienny)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>frank belgijski</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>frank belgijski (finansowy)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>lew bułgarski</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>nowy lew bułgarski</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>dinar bahrański</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>frank burundyjski</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>dolar bermudzki</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>dolar brunejski</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>boliviano</displayName>
+ <symbol>Bs</symbol>
+ </currency>
+ <currency type="BOP">
+ <displayName>peso boliwijskie</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>mvdol boliwijski</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>cruzeiro novo brazylijskie (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>cruzado brazylijskie</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>cruzeiro brazylijskie(1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>real brazylijski</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRR">
+ <displayName>cruzeiro brazylijskie</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>dolar bahamski</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>ngultrum Bhutan</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>kyat birmański</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>pula</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>rubel białoruski (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>rubel białoruski</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>dolar belizeński</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>dolar kanadyjski</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>frank kongijski</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>frank szwajcarski</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CLP">
+ <displayName>peso chilijskie</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>juan renminbi</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>peso kolumbijskie</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="CRC">
+ <displayName>colon kostarykański</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSK">
+ <displayName>korona czechosłowacka</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>peso kubańskie</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>escudo Zielonego PrzylÄ…dka</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>funt cypryjski</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>korona czeska</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>wschodnia marka wschodnioniemiecka</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>marka niemiecka</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>frank Dżibuti</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>korona duńska</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>peso dominikańskie</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>dinar algierski</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>sucre ekwadorski</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>korona estońska</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>funt egipski</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>nakfa erytrejska</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>peseta hiszpańska</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>birr etiopski</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>marka fińska</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>dolar fidżijski</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>funt Wysp Falklandzkich</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>frank francuski </displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>funt szterling</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>Larit gruziński kupon</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>lari gruzińskie</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>cedi ghańskie</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>funt gibraltarski</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>dalasi gambijskie</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>frank gwinejski</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>syli gwinejskie</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>ekwele gwinejskie Gwinei Równikowej</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>drachma grecka</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>quetzal gwatemalski</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>escudo Gwinea Portugalska</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>peso Guinea-Bissau</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>dolar gujański</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>dolar hongkoński</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>lempira Hondurasu</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>dinar chorwacki</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>kuna chorwacka</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>gourde haitańskie</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>forint węgierski </displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>rupia indonezyjska</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>funt irlandzki</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>funt izraelski</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>nowy szekel izraelski</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>rupia indyjska</displayName>
+ <symbol>INR</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>dinar iracki</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>rial irański</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>korona islandzka</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>lir włoski</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>dolar jamajski</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>dinar jordański</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>jen japoński</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>szyling kenijski</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>som kirgiski</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>riel kambodżański</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>frank komoryjski</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>won północnokoreański</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>won południowokoreański</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>dinar kuwejcki</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>dolar kajmański</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Tenge kazachskie</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>kip laotański</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>funt libański</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>rupia lankijska</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>dolar liberyjski</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>loti Lesoto</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LTL">
+ <displayName>lit litewski</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>talon litewski</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>frank luksemburski</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Å‚at Å‚otewski</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>rubel Å‚otewski</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>dinar libijski</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>dirham marokański</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>frank marokański</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>lej mołdawski</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>ariar malgaski</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>frank malgaski</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>denar macedoński</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>frank malijski</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>kyat Myanmar</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>tugrik mongolski</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>pataka Macao</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>ouguiya mauterańska</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>lira maltańska</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>funt maltański</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>rupia Mauritius</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>rufiyaa malediwska</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>kwacha malawska</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>peso meksykańskie</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>peso srebrne meksykańskie (1861-1992)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>ringgit malezyjski</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>escudo mozambickie</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>metical Mozambik</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>dolar namibijski</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>naira nigeryjska</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>cordoba nikaraguańska</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>cordoba oro nikaraguańska</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>gulden holenderski </displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>korona norweska</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>rupia nepalska</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>dolar nowozelandzki</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>rial Omanu</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>balboa panamski</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>inti peruwiański</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>nowy sol peruwiański</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>sol peruwiański</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>kina Papua Nowa Gwinea</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>peso filipińskie</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>rupia pakistańska</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>złoty polski</displayName>
+ <symbol>zł</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>złoty polski (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>escudo portugalskie</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>guarani paragwajskie</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>rial katarski</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="ROL">
+ <displayName>lej rumuński</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>rubel rosyjski</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>rubel rosyjski (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>frank ruandyjski</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>rial saudyjski</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>dolar Wysp Salomona</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>rupia seszelska</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>dinar sudański</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>funt sudański</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>korona szwedzka</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>dolar singapurski</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>funt Wyspy Świętej Heleny</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>tolar słoweński</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>korona słowacka</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>leone Sierra Leone</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>szyling somalijski</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRG">
+ <displayName>gulden surinamski</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>dobra Wysp Świętego Tomasza i Książęcej</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>rubel radziecki</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>colon salwadorski</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>funt syryjski</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>lilangeni Suazi</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>baht tajski</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>rubel tadżycki</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>somoni tadżyckie</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>manat turkmeński</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>dinar tunezyjski</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>paʻanga Tonga</displayName>
+ <symbol>T$</symbol>
+ </currency>
+ <currency type="TPE">
+ <displayName>escudo timorskie</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>lir turecki</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName>nowa lira turecka</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>dolar Trynidadu i Tobago</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>nowy dolar tajwański</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>szyling tanzański</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>hrywna ukraińska</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>karbowaniec ukraiński</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>szyling ugandyjski (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>szyling ugandyjski</displayName>
+ <symbol>USh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>dolar amerykański </displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="UYP">
+ <displayName>peso urugwajskie (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>peso urugwajskie</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>som uzbecki</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>boliwar wenezuelski</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>dong wietnamski</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>vatu Vanuatu</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>tala samoańska</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>frank CFA BEAC</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>złoto</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>dolar wschodniokaraibski</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>specjalne prawa ciÄ…gnienia</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>frank złoty francuski</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>UIC-frank francuski</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>frank CFA</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>frank CFP</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="YDD">
+ <displayName>dinar jemeński</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>rial jemeński</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUM">
+ <displayName>nowy dinar jugosławiański</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>dinar jugosławiański wymienny</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>rand południowoafrykański (finansowy)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>rand południowoafrykański</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>kwacha zambijska</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>nowy zair zairski</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>zair zairski</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>dolar Zimbabwe</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>tak:t</yesstr>
+ <nostr>nie:n</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/pl_PL.xml b/libs/Zend/Locale/Data/pl_PL.xml
new file mode 100755
index 0000000000..850db43ad6
--- /dev/null
+++ b/libs/Zend/Locale/Data/pl_PL.xml
@@ -0,0 +1,494 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.40 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="pl"/>
+ <territory type="PL"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">afar</language>
+ <language type="ab">abchaski</language>
+ <language type="ach">aczoli</language>
+ <language type="ady">adygejski</language>
+ <language type="ae">awestyjski</language>
+ <language type="af">afrikaans</language>
+ <language type="afa">afro-azjatycki (inne)</language>
+ <language type="ain">ajnu</language>
+ <language type="ak">akan</language>
+ <language type="akk">akadyjski</language>
+ <language type="ale">aleucki</language>
+ <language type="alg">języki algonkin</language>
+ <language type="am">amharski</language>
+ <language type="an">aragoński</language>
+ <language type="ang">staroangielski (450-1100)</language>
+ <language type="apa">języki Apaczów</language>
+ <language type="arc">aramejski</language>
+ <language type="art">sztuczny (inne)</language>
+ <language type="arw">arawak</language>
+ <language type="as">asamski</language>
+ <language type="ast">asturyjski</language>
+ <language type="ath">języki Atapasków</language>
+ <language type="aus">języki australijskie</language>
+ <language type="av">awarski</language>
+ <language type="awa">awadhi</language>
+ <language type="ay">ajmara</language>
+ <language type="az">azerski</language>
+ <language type="ba">baszkirski</language>
+ <language type="bal">beludżi</language>
+ <language type="ban">balijski</language>
+ <language type="bat">bałtycki (inne)</language>
+ <language type="be">białoruski</language>
+ <language type="bej">bedża</language>
+ <language type="bem">bemba</language>
+ <language type="ber">berberski</language>
+ <language type="bh">biharski</language>
+ <language type="bho">bhodźpuri</language>
+ <language type="bi">bislama</language>
+ <language type="bik">bikol</language>
+ <language type="bm">bambara</language>
+ <language type="bnt">bantu</language>
+ <language type="bo">tybetański</language>
+ <language type="br">bretoński</language>
+ <language type="bra">bradź</language>
+ <language type="bs">bośniacki</language>
+ <language type="btk">batak</language>
+ <language type="bua">buriacki</language>
+ <language type="cad">kaddo</language>
+ <language type="cai">język Indian środkowoamerykańskich (inne)</language>
+ <language type="car">karibi</language>
+ <language type="cau">kaukaski (inne)</language>
+ <language type="ce">czeczeński</language>
+ <language type="cel">celtycki (inne)</language>
+ <language type="ch">chamorro</language>
+ <language type="chb">czibcza</language>
+ <language type="chg">czagatajski</language>
+ <language type="chk">truk</language>
+ <language type="chm">maryjski</language>
+ <language type="chn">żargon Chinook</language>
+ <language type="chy">język Czejenów</language>
+ <language type="cmc">czam</language>
+ <language type="co">korsykański</language>
+ <language type="cop">koptyjski</language>
+ <language type="cpe">kreolski i pidżynowy, angielskie (inne)</language>
+ <language type="cpf">kreolski i pidżynowy, francuskie (inne)</language>
+ <language type="cpp">kreolski i pidżynowy, portugalskie (inne)</language>
+ <language type="cr">kri</language>
+ <language type="crh">karaimski turecki; karaimski tatarski</language>
+ <language type="crp">kreolski i pidżynowy (inne)</language>
+ <language type="csb">kaszubski</language>
+ <language type="cu">staro-cerkiewno-słowiański</language>
+ <language type="cus">kuszycki (inne)</language>
+ <language type="cv">czuwaski</language>
+ <language type="dar">dargwijski</language>
+ <language type="day">dajak</language>
+ <language type="dgr">dogrib</language>
+ <language type="din">dinka</language>
+ <language type="doi">dogri</language>
+ <language type="dra">drawidyjski (inne)</language>
+ <language type="dsb">dolnołużycki</language>
+ <language type="dum">niderlandzki, średniowiecze (ok. 1050-1350)</language>
+ <language type="dv">malediwski</language>
+ <language type="dz">dzongkha</language>
+ <language type="ee">ewe</language>
+ <language type="efi">efik</language>
+ <language type="egy">egipski (starożytny)</language>
+ <language type="enm">średnioangielski</language>
+ <language type="eo">esperanto</language>
+ <language type="fa">perski</language>
+ <language type="fan">fang</language>
+ <language type="fat">fanti</language>
+ <language type="ff">fulani</language>
+ <language type="fiu">ugrofiński (inne)</language>
+ <language type="fj">fidżijski</language>
+ <language type="fo">farerski</language>
+ <language type="frm">średniofrancuski</language>
+ <language type="fro">starofrancuski</language>
+ <language type="fur">friulijski</language>
+ <language type="fy">fryzyjski</language>
+ <language type="ga">irlandzki</language>
+ <language type="gd">szkocki gaelicki</language>
+ <language type="gem">germański (inne)</language>
+ <language type="gez">gyyz</language>
+ <language type="gil">gilbertański</language>
+ <language type="gl" draft="provisional">galisyjski</language>
+ <language type="gmh">średnio-wysoko-niemiecki</language>
+ <language type="gn">guarani</language>
+ <language type="goh">staro-wysoko-niemiecki</language>
+ <language type="gon">gondi</language>
+ <language type="got">gocki</language>
+ <language type="grb">grebo</language>
+ <language type="grc">starogrecki</language>
+ <language type="gu">gudźaracki</language>
+ <language type="gv">manx</language>
+ <language type="ha">hausa</language>
+ <language type="hai">haida</language>
+ <language type="haw">hawajski</language>
+ <language type="hit">hetycki</language>
+ <language type="ho">hiri motu</language>
+ <language type="hsb">górnołużycki</language>
+ <language type="hy">ormiański</language>
+ <language type="hz">herero</language>
+ <language type="ia">interlingua</language>
+ <language type="iba">ibanag</language>
+ <language type="id">indonezyjski</language>
+ <language type="ie">interlingue</language>
+ <language type="ig">igbo</language>
+ <language type="ii">syczuański</language>
+ <language type="ik">inupiak</language>
+ <language type="ilo">ilokano</language>
+ <language type="ine">indoeuropejskie (pozostałe)</language>
+ <language type="inh">inguski</language>
+ <language type="io">ido</language>
+ <language type="ira">irański</language>
+ <language type="is">islandzki</language>
+ <language type="iu">inuktitut</language>
+ <language type="jv">jawajski</language>
+ <language type="ka">gruziński</language>
+ <language type="kaa">karakałpacki</language>
+ <language type="kar">kareński</language>
+ <language type="kbd">kabardyjski</language>
+ <language type="kg">kongo</language>
+ <language type="kha">khasi</language>
+ <language type="khi">khoisan (inne)</language>
+ <language type="ki">kikuju</language>
+ <language type="kj">kwanyama</language>
+ <language type="kk">kazaski</language>
+ <language type="km">khmerski</language>
+ <language type="kn">kannada</language>
+ <language type="kok">konkani</language>
+ <language type="kos">kosrae</language>
+ <language type="kpe">kpelle</language>
+ <language type="kr">kanuri</language>
+ <language type="krc">karaczajsko-bałkarski</language>
+ <language type="kro" draft="provisional">kru</language>
+ <language type="kru">kurukh</language>
+ <language type="ks">kaszmirski</language>
+ <language type="ku">kurdyjski</language>
+ <language type="kum">kumycki</language>
+ <language type="kv">komi</language>
+ <language type="kw">kornijski</language>
+ <language type="ky">kirgiski</language>
+ <language type="la">łaciński</language>
+ <language type="lb">luksemburski</language>
+ <language type="lg">ganda</language>
+ <language type="li">limburgijski</language>
+ <language type="ln">lingala</language>
+ <language type="lo">laotański</language>
+ <language type="lu">luba-katanga</language>
+ <language type="lua">luba-lulua</language>
+ <language type="mad">madurajski</language>
+ <language type="map">austronezyjski</language>
+ <language type="mas">masajski</language>
+ <language type="mg">malgaski</language>
+ <language type="mga">średnioirlandzki</language>
+ <language type="mh">marshall</language>
+ <language type="mi">maoryjski</language>
+ <language type="mis">języki różne</language>
+ <language type="mk">macedoński</language>
+ <language type="mkh">mon-khmer (pozostałe)</language>
+ <language type="ml">malajalam</language>
+ <language type="mn">mongolski</language>
+ <language type="mo">mołdawski</language>
+ <language type="mr">marathijski</language>
+ <language type="ms">malajski</language>
+ <language type="mun">języki mundajskie</language>
+ <language type="my">birmański</language>
+ <language type="myn" draft="provisional">języki maja</language>
+ <language type="na">nauru</language>
+ <language type="nah">nahuatl</language>
+ <language type="nai">języki Indian północnoamerykańskich (pozostałe)</language>
+ <language type="nap">neapolitański</language>
+ <language type="nb">norweski Bokmål</language>
+ <language type="nd">ndebele północny</language>
+ <language type="nds">dolnoniemiecki, dolnosaksoński</language>
+ <language type="ne">nepalski</language>
+ <language type="new">newarski</language>
+ <language type="nic">niger-kordofańskie (pozostałe)</language>
+ <language type="niu">niue</language>
+ <language type="nn">norweski Nynorsk</language>
+ <language type="nr">ndebele południowy</language>
+ <language type="nso">sotho północny</language>
+ <language type="nub">języki nubijskie</language>
+ <language type="nv">nawaho</language>
+ <language type="nwc">newarski klasyczny</language>
+ <language type="ny">njandża</language>
+ <language type="oc">oksytański (po 1500); prowansalski</language>
+ <language type="oj">odżibwa</language>
+ <language type="om">oromo</language>
+ <language type="or">orija</language>
+ <language type="os">osetyjski</language>
+ <language type="ota">osmańsko-turecki</language>
+ <language type="oto">języki Otomi</language>
+ <language type="pa">pendżabski</language>
+ <language type="paa">papuaski (inne)</language>
+ <language type="pau">palau</language>
+ <language type="peo">staroperski</language>
+ <language type="phn">fenicki</language>
+ <language type="pi">palijski</language>
+ <language type="pra">prakryty</language>
+ <language type="pro">staroprowansalski</language>
+ <language type="ps">paszto</language>
+ <language type="qu">keczua</language>
+ <language type="raj">radźasthani</language>
+ <language type="rap">rapanui</language>
+ <language type="rar">rarotonga</language>
+ <language type="rm">retoromański</language>
+ <language type="rn">rundi</language>
+ <language type="roa">romański (inne)</language>
+ <language type="rom">cygański</language>
+ <language type="rup">arumuński</language>
+ <language type="rw">kinya-ruanda</language>
+ <language type="sa">sanskryt</language>
+ <language type="sah">jakucki</language>
+ <language type="sai">języki Indian południowoamerykańskich (pozostałe)</language>
+ <language type="sal">języki salisz</language>
+ <language type="sam">samarytański aramejski</language>
+ <language type="sas">sasak</language>
+ <language type="sat">santali</language>
+ <language type="sc">sardyński</language>
+ <language type="scn">sycylijski</language>
+ <language type="sco">szkocki</language>
+ <language type="sd">sindhi</language>
+ <language type="se">lapoński północny</language>
+ <language type="sem">semickie (pozostałe)</language>
+ <language type="sg">sango</language>
+ <language type="sga">staroirlandzki</language>
+ <language type="sgn">migowy</language>
+ <language type="si">syngaleski</language>
+ <language type="sid">sidamo</language>
+ <language type="sit">chińsko-tybetańskie (pozostałe)</language>
+ <language type="sla">słowiańskie (pozostałe)</language>
+ <language type="sm">samoański</language>
+ <language type="sma">lapoński południowy</language>
+ <language type="smi">lapońskie (pozostałe)</language>
+ <language type="smj">lapoński Lule</language>
+ <language type="smn">lapoński Inari</language>
+ <language type="sms">lapoński Skolt</language>
+ <language type="sn">szona</language>
+ <language type="so">somali</language>
+ <language type="sq">albański</language>
+ <language type="sr">serbski</language>
+ <language type="ss">suazi</language>
+ <language type="ssa">nilo-saharyjskie (pozostałe)</language>
+ <language type="st">sotho południowy</language>
+ <language type="su">sundajski</language>
+ <language type="suk">sukuma</language>
+ <language type="sux">sumeryjski</language>
+ <language type="sw">suahili</language>
+ <language type="syr">syryjski</language>
+ <language type="ta">tamilski</language>
+ <language type="tai">taj (pozostałe)</language>
+ <language type="te">telugu</language>
+ <language type="tet">tetum</language>
+ <language type="tg">tadżycki</language>
+ <language type="ti">tigrinia</language>
+ <language type="tig">tigre</language>
+ <language type="tk">turkmeński</language>
+ <language type="tkl">tokelau</language>
+ <language type="tl">tagalski</language>
+ <language type="tlh">klingoński</language>
+ <language type="tli">tlingit</language>
+ <language type="tmh">tamaszek</language>
+ <language type="tn">tswana</language>
+ <language type="to">tonga (wyspy Tonga)</language>
+ <language type="tog">tonga (Niasa)</language>
+ <language type="ts">tsonga</language>
+ <language type="tt">tatarski</language>
+ <language type="tup">języki tupi</language>
+ <language type="tut">ałtajski (pozostałe)</language>
+ <language type="tw">twi</language>
+ <language type="ty">tahitański</language>
+ <language type="tyv">tuwiński</language>
+ <language type="udm">udmurcki</language>
+ <language type="ug">ujgurski</language>
+ <language type="uga">ugarycki</language>
+ <language type="uk">ukraiński</language>
+ <language type="und">nieokreślony</language>
+ <language type="ur">urdu</language>
+ <language type="uz">uzbecki</language>
+ <language type="vai">wai</language>
+ <language type="ve">venda</language>
+ <language type="vi">wietnamski</language>
+ <language type="vo">volapuk</language>
+ <language type="vot">wotiacki</language>
+ <language type="wa">waloński</language>
+ <language type="wak">języki wakasz</language>
+ <language type="wen">języki łużyckie</language>
+ <language type="wo">wolof</language>
+ <language type="xal">kałmucki</language>
+ <language type="xh">khosa</language>
+ <language type="yap">japski</language>
+ <language type="yi">jidysz</language>
+ <language type="yo">joruba</language>
+ <language type="za">czuang</language>
+ <language type="zen">zenaga</language>
+ <language type="znd">azande</language>
+ <language type="zu">zulu</language>
+ <language type="zun">zuni</language>
+ </languages>
+ <scripts>
+ <script type="Armn">Ormiański</script>
+ <script type="Batk">Batak</script>
+ <script type="Cher">Irokeski</script>
+ <script type="Cyrs">Cyrylicki (odmiana staro-cerkiewno-słowiańska)</script>
+ <script type="Deva">Devanagari</script>
+ <script type="Dsrt">Deseret</script>
+ <script type="Egyd">Egipski demotyczny</script>
+ <script type="Egyh">Egipski hieratyczny</script>
+ <script type="Egyp">Hieroglify egipskie</script>
+ <script type="Glag">GÅ‚agolicki</script>
+ <script type="Gujr">Gudźaracki</script>
+ <script type="Guru">Gurmukhi</script>
+ <script type="Hang">Hangul</script>
+ <script type="Hani">Han</script>
+ <script type="Hira">Hiragana</script>
+ <script type="Hmng">Pahawh Hmong</script>
+ <script type="Hrkt">Katakana lub Hiragana</script>
+ <script type="Hung">Starowęgierski</script>
+ <script type="Inds">Indus (Harappan)</script>
+ <script type="Kana">Katakana</script>
+ <script type="Khar">Kharoshthi</script>
+ <script type="Knda">Kannada</script>
+ <script type="Latg">ÅaciÅ„ski (odmiana gaelicka)</script>
+ <script type="Lepc">Lepcha (Róng)</script>
+ <script type="Lina">Linearny A</script>
+ <script type="Osma">Osmanya</script>
+ <script type="Perm">Staropermski</script>
+ <script type="Phnx">Fenicki</script>
+ <script type="Sara">Sarati</script>
+ <script type="Syrj">Syryjski (odmiana zachodnia)</script>
+ <script type="Syrn">Syryjski (odmiana wschodnia)</script>
+ <script type="Tfng">Tifinagh (berberski)</script>
+ <script type="Xpeo">Staroperski</script>
+ </scripts>
+ <territories>
+ <territory type="001">świat</territory>
+ <territory type="034">Azja Południowa</territory>
+ <territory type="143">Azja Åšrodkowa</territory>
+ <territory type="172">Wspólnota Niezależnych Państw</territory>
+ <territory type="419">Ameryka ÅaciÅ„ska i Karaiby</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LY">Libia</territory>
+ <territory type="MD">Mołdawia</territory>
+ <territory type="MK">Macedonia</territory>
+ <territory type="MP">Mariany Północne</territory>
+ <territory type="PM">Saint-Pierre i Miquelon</territory>
+ <territory type="PR">Portoryko</territory>
+ <territory type="SH">Święta Helena</territory>
+ <territory type="TF">Francuskie Terytoria Południowe i Antarktyczne</territory>
+ <territory type="UM">Dalekie Wyspy Mniejsze Stanów Zjednoczonych</territory>
+ <territory type="VA">Watykan</territory>
+ <territory type="VC">Saint Vincent i Grenadyny</territory>
+ <territory type="VI">Wyspy Dziewicze Stanów Zjednoczonych</territory>
+ <territory type="ZA">Republika Południowej Afryki</territory>
+ </territories>
+ <variants>
+ <variant type="1901">Tradycyjna ortografia niemiecka</variant>
+ <variant type="1996">Ortografia niemiecka z 1996 r.</variant>
+ </variants>
+ <types>
+ <type type="big5han" key="collation">Tradycyjny chiński (Big5)</type>
+ <type type="gb2312han" key="collation">Uproszczony chiński (GB2312)</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US">USA</measurementSystemName>
+ <measurementSystemName type="metric">metryczny</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <delimiters>
+ <quotationStart>‘</quotationStart>
+ <quotationEnd>’</quotationEnd>
+ <alternateQuotationStart>„</alternateQuotationStart>
+ <alternateQuotationEnd>â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">sty</month>
+ <month type="3">mar</month>
+ <month type="4">kwi</month>
+ <month type="6">cze</month>
+ <month type="8">sie</month>
+ <month type="12">gru</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="abbreviated">
+ <month type="1">sty</month>
+ <month type="3">mar</month>
+ <month type="4">kwi</month>
+ <month type="6">cze</month>
+ <month type="8">sie</month>
+ <month type="12">gru</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <fields>
+ <field type="year">
+ <displayName>Rok</displayName>
+ </field>
+ <field type="month">
+ <displayName>MiesiÄ…c</displayName>
+ </field>
+ <field type="week">
+ <displayName>Tydzień</displayName>
+ </field>
+ <field type="day">
+ <displayName>Dzień</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>Dzień tygodnia</displayName>
+ </field>
+ <field type="hour">
+ <displayName>Godzina</displayName>
+ </field>
+ <field type="minute">
+ <displayName>Minuta</displayName>
+ </field>
+ <field type="second">
+ <displayName>Sekunda</displayName>
+ </field>
+ <field type="zone">
+ <displayName>Strefa</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="BRE">
+ <displayName>cruzeiro brazylijskie (1990-1993)</displayName>
+ </currency>
+ <currency type="BRN">
+ <displayName>nowe cruzado brazylijskie</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>ngultrum Bhutanu</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName>peseta hiszpańska (Konto A)</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName>peseta hiszpańska (konto wymienne)</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>kupon gruziński larit</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ps.xml b/libs/Zend/Locale/Data/ps.xml
new file mode 100755
index 0000000000..8a80b57230
--- /dev/null
+++ b/libs/Zend/Locale/Data/ps.xml
@@ -0,0 +1,273 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ps"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar">عربي</language>
+ <language type="bal">بلوڅي</language>
+ <language type="de">الماني</language>
+ <language type="el">یوناني</language>
+ <language type="en">انګلیسي</language>
+ <language type="et">حبشي</language>
+ <language type="fa">Ùارسي</language>
+ <language type="fi">Ùینلنډي</language>
+ <language type="fr">Ùرانسوي</language>
+ <language type="he">عبري</language>
+ <language type="hi">هندي</language>
+ <language type="hy">ارمني</language>
+ <language type="ine">هند و اروپایي</language>
+ <language type="it">ایټالوي</language>
+ <language type="ja">جاپانی</language>
+ <language type="ku">کردي</language>
+ <language type="la">لاتیني</language>
+ <language type="mg">ملغاسي</language>
+ <language type="mk">مقدوني</language>
+ <language type="mn">مغولي</language>
+ <language type="ms">ملایا</language>
+ <language type="pl">پولنډي</language>
+ <language type="ps">پښتو</language>
+ <language type="pt">پورتګالي</language>
+ <language type="ru">روسي</language>
+ <language type="sa">سنسکریټ</language>
+ <language type="sv">سویډنی</language>
+ <language type="tg">تاجک</language>
+ <language type="tk">ترکمني</language>
+ <language type="tt">تاتار</language>
+ <language type="uz">ازبکي</language>
+ <language type="zh">چیني</language>
+ </languages>
+ <scripts>
+ <script type="Arab" references="RP1">عربي</script>
+ </scripts>
+ <territories>
+ <territory type="AF">اÙغانستان</territory>
+ <territory type="AL">البانیه</territory>
+ <territory type="AO">انګولا</territory>
+ <territory type="AQ">انتارکتیکا</territory>
+ <territory type="AT">اتریش</territory>
+ <territory type="BD">بنګله‌دیش</territory>
+ <territory type="BG">بلغاریه</territory>
+ <territory type="CA">کاناډا</territory>
+ <territory type="CH">سویس</territory>
+ <territory type="CN">چین</territory>
+ <territory type="CO">کولمبیا</territory>
+ <territory type="CU">کیوبا</territory>
+ <territory type="DE">المان</territory>
+ <territory type="DK">ډنمارک</territory>
+ <territory type="DZ">الجزایر</territory>
+ <territory type="EG">مصر</territory>
+ <territory type="ES">هسپانیه</territory>
+ <territory type="ET">حبشه</territory>
+ <territory type="FI">Ùنلینډ</territory>
+ <territory type="FR">Ùرانسه</territory>
+ <territory type="GB">برتانیه</territory>
+ <territory type="GH">ګانا</territory>
+ <territory type="GN">ګیانا</territory>
+ <territory type="GR">یونان</territory>
+ <territory type="GT">ګواتیمالا</territory>
+ <territory type="HN">هانډوراس</territory>
+ <territory type="HU">مجارستان</territory>
+ <territory type="ID">اندونیزیا</territory>
+ <territory type="IN">هند</territory>
+ <territory type="IQ">عراق</territory>
+ <territory type="IS">آیسلینډ</territory>
+ <territory type="IT">ایټالیه</territory>
+ <territory type="JM">جمیکا</territory>
+ <territory type="JP">جاپان</territory>
+ <territory type="KH">کمبودیا</territory>
+ <territory type="KW">کویټ</territory>
+ <territory type="LA">لاوس</territory>
+ <territory type="LB">لبنان</territory>
+ <territory type="LR">لایبریا</territory>
+ <territory type="LY">لیبیا</territory>
+ <territory type="MA">مراکش</territory>
+ <territory type="MN">مغولستان</territory>
+ <territory type="MY">مالیزیا</territory>
+ <territory type="NG">نایجیریا</territory>
+ <territory type="NI">نکاراګوا</territory>
+ <territory type="NL">هالÛÙ†Ú‰</territory>
+ <territory type="NO">ناروÛ</territory>
+ <territory type="NP">نیپال</territory>
+ <territory type="NZ">نیوزیلنډ</territory>
+ <territory type="PK">پاکستان</territory>
+ <territory type="PL">پولنډ</territory>
+ <territory type="PS">Ùلسطین</territory>
+ <territory type="PT">پورتګال</territory>
+ <territory type="RU">روسیه</territory>
+ <territory type="RW">روندا</territory>
+ <territory type="SA">سعودی عربستان</territory>
+ <territory type="SE">سویډن</territory>
+ <territory type="SV">سالوÛډور</territory>
+ <territory type="SY">سوریه</territory>
+ <territory type="TJ">تاجکستان</territory>
+ <territory type="TZ">تنزانیا</territory>
+ <territory type="UY">یوروګوای</territory>
+ <territory type="YE">یمن</territory>
+ </territories>
+ </localeDisplayNames>
+ <layout>
+ <orientation characters="right-to-left"/>
+ </layout>
+ <characters>
+ <exemplarCharacters>[ÙŽ Ù Ù Ù‹ Ù ÙŒ Ù‘ Ù’ Ù” Ù° Ø¢ ا Ø£ Ø¡ ب Ù¾ ت Ù¼ Ø« ج Ú Ú† Ú… Ø­-د Ú‰ Ø° ر Ú“ ز Ú˜ Ú– س Ø´ Úš ص-غ Ù Ù‚ Ú© Ú« Ù„-Ù† Ú¼ Ù‡ Ø© Ùˆ ؤ ÛŒ ÙŠ Û Û Ø¦]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="5">مـی</month>
+ <month type="6">جون</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">جنوري</month>
+ <month type="2">Ùبروري</month>
+ <month type="3">مارچ</month>
+ <month type="4">اپریل</month>
+ <month type="5">می</month>
+ <month type="6">جون</month>
+ <month type="7">جولای</month>
+ <month type="8">اګست</month>
+ <month type="9">سپتمبر</month>
+ <month type="10">اکتوبر</month>
+ <month type="11">نومبر</month>
+ <month type="12">دسمبر</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="wide">
+ <day type="sun">یکشنبه</day>
+ <day type="mon">دوشنبه</day>
+ <day type="tue">سه‌شنبه</day>
+ <day type="wed">چهارشنبه</day>
+ <day type="thu">پنجشنبه</day>
+ <day type="fri">جمعه</day>
+ <day type="sat">شنبه</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am>غ.م.</am>
+ <pm>غ.و.</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">Ù‚.Ù….</era>
+ <era type="1">Ù….</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE د yyyy د MMMM d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>د yyyy د MMMM d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yyyy/M/d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H:mm:ss (z)</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss (z)</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">M/d</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">yyyy/M</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">د yyyy د MMMM</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ <calendar type="persian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" references="RP1">وری</month>
+ <month type="2" references="RP1">غویی</month>
+ <month type="3" references="RP1">غبرګولی</month>
+ <month type="4" references="RP1">چنګاښ</month>
+ <month type="5" references="RP1">زمری</month>
+ <month type="6" references="RP1">وږی</month>
+ <month type="7" references="RP1">تله</month>
+ <month type="8" references="RP1">Ù„Ú“Ù…</month>
+ <month type="9" references="RP1">لیندÛ</month>
+ <month type="10" references="RP1">مرغومی</month>
+ <month type="11" references="RP1">سلواغه</month>
+ <month type="12" references="RP1">کب</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" references="RP1">وری</month>
+ <month type="2" references="RP1">غویی</month>
+ <month type="3" references="RP1">غبرګولی</month>
+ <month type="4" references="RP1">چنګاښ</month>
+ <month type="5" references="RP1">زمری</month>
+ <month type="6" references="RP1">وږی</month>
+ <month type="7" references="RP1">تله</month>
+ <month type="8" references="RP1">Ù„Ú“Ù…</month>
+ <month type="9" references="RP1">لیندÛ</month>
+ <month type="10" references="RP1">مرغومی</month>
+ <month type="11" references="RP1">سلواغه</month>
+ <month type="12" references="RP1">کب</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <regionFormat references="RP1">د {0} په وخت</regionFormat>
+ <zone type="Asia/Kabul">
+ <exemplarCity>کابل</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="AFN">
+ <displayName>اÙغانÛ</displayName>
+ <symbol references="RP1">Ø‹</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1" uri="http://www.evertype.com/standards/af/">Computer Locale Requirements for Afghanistan</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ps_AF.xml b/libs/Zend/Locale/Data/ps_AF.xml
new file mode 100755
index 0000000000..090ad757af
--- /dev/null
+++ b/libs/Zend/Locale/Data/ps_AF.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/27 18:46:54 $"/>
+ <language type="ps"/>
+ <territory type="AF"/>
+ </identity>
+ <numbers>
+ <symbols>
+ <decimal>Ù«</decimal>
+ <group>Ù¬</group>
+ <percentSign>Ùª</percentSign>
+ <nativeZeroDigit>Û°</nativeZeroDigit>
+ <minusSign>−</minusSign>
+ <exponential>×۱۰^</exponential>
+ </symbols>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/pt.xml b/libs/Zend/Locale/Data/pt.xml
new file mode 100755
index 0000000000..eb93563693
--- /dev/null
+++ b/libs/Zend/Locale/Data/pt.xml
@@ -0,0 +1,1913 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.65 $"/>
+ <generation date="$Date: 2006/07/11 19:27:38 $"/>
+ <language type="pt"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">afar</language>
+ <language type="ab">abkhazian</language>
+ <language type="ace">achinese</language>
+ <language type="ach">acoli</language>
+ <language type="ada">adangme</language>
+ <language type="ady">adyghe</language>
+ <language type="ae">avéstico</language>
+ <language type="af">africâner</language>
+ <language type="afa">afro-asiático (outros)</language>
+ <language type="afh">Afrihili</language>
+ <language type="ak">Akan</language>
+ <language type="akk">acadiano</language>
+ <language type="ale">aleúte</language>
+ <language type="alg">idiomas algonquianos</language>
+ <language type="am">amárico</language>
+ <language type="an">aragonês</language>
+ <language type="ang">inglês, arcaico (aprox. 450-1100)</language>
+ <language type="apa">idiomas apache</language>
+ <language type="ar">árabe</language>
+ <language type="arc">aramaico</language>
+ <language type="arn">araucano</language>
+ <language type="arp">arapaho</language>
+ <language type="art">artificiais (outros)</language>
+ <language type="arw">arauaqui</language>
+ <language type="as">assamês</language>
+ <language type="ast">asturiano</language>
+ <language type="ath">idiomas atabascanos</language>
+ <language type="aus">idiomas australianos</language>
+ <language type="av">avaric</language>
+ <language type="awa">Awadhi</language>
+ <language type="ay">aimara</language>
+ <language type="az">azerbaijano</language>
+ <language type="ba">bashkir</language>
+ <language type="bad">banda</language>
+ <language type="bai">bamileke Languages</language>
+ <language type="bal">balúchi</language>
+ <language type="ban">balinês</language>
+ <language type="bas">basa</language>
+ <language type="bat">bálticos (outros)</language>
+ <language type="be">bielo-russo</language>
+ <language type="bej">beja</language>
+ <language type="bem">bemba</language>
+ <language type="ber">berbere</language>
+ <language type="bg">búlgaro</language>
+ <language type="bh">biari</language>
+ <language type="bho">bhojpuri</language>
+ <language type="bi">bislamá</language>
+ <language type="bik">bikol</language>
+ <language type="bin">bini</language>
+ <language type="bla">siksika</language>
+ <language type="bm">bambara</language>
+ <language type="bn">bengali</language>
+ <language type="bnt">banto</language>
+ <language type="bo">tibetano</language>
+ <language type="br">bretão</language>
+ <language type="bra">braj</language>
+ <language type="bs">bósnio</language>
+ <language type="btk">bataque</language>
+ <language type="bua">Buriat</language>
+ <language type="bug">Buginese</language>
+ <language type="byn">Blin</language>
+ <language type="ca">catalão</language>
+ <language type="cad">caddo</language>
+ <language type="cai">indígenas centro-americanos (outros)</language>
+ <language type="car">caribe</language>
+ <language type="cau">caucasianos (outros)</language>
+ <language type="ce">chechene</language>
+ <language type="ceb">cebuano</language>
+ <language type="cel">célticos (outros)</language>
+ <language type="ch">chamorro</language>
+ <language type="chb">chibcha</language>
+ <language type="chg">chagatai</language>
+ <language type="chk">chuukese</language>
+ <language type="chm">mari</language>
+ <language type="chn">chinook jargon</language>
+ <language type="cho">choctaw</language>
+ <language type="chp">chipewyan</language>
+ <language type="chr">cheroqui</language>
+ <language type="chy">cheiene</language>
+ <language type="cmc">chamic languages</language>
+ <language type="co">córsico</language>
+ <language type="cop">copta</language>
+ <language type="cpe">crioulos e pídgin, inglês (outros)</language>
+ <language type="cpf">crioulos e pídgin, francês (outros)</language>
+ <language type="cpp">crioulos e pídgin, português (outros)</language>
+ <language type="cr">cree</language>
+ <language type="crh">crimean turkish; crimean tatar</language>
+ <language type="crp">crioulos e pídgins (outros)</language>
+ <language type="cs">tcheco</language>
+ <language type="cs" alt="proposed" draft="provisional">checo</language>
+ <language type="csb">kashubian</language>
+ <language type="cu">eslavo eclesiástico</language>
+ <language type="cus">cuxitas (outros)</language>
+ <language type="cv">chuvash</language>
+ <language type="cy">galês</language>
+ <language type="da">dinamarquês</language>
+ <language type="dak">dacota</language>
+ <language type="dar">dargwa</language>
+ <language type="day">dayak</language>
+ <language type="de">alemão</language>
+ <language type="del">delaware</language>
+ <language type="den">slave</language>
+ <language type="dgr">dogrib</language>
+ <language type="din">dinka</language>
+ <language type="doi">dogri</language>
+ <language type="dra">dravídicos (outros)</language>
+ <language type="dsb">Lower Sorbian</language>
+ <language type="dua">duala</language>
+ <language type="dum">holandês, medieval (aprox. 1050-1350)</language>
+ <language type="dv">divehi</language>
+ <language type="dyu">diúla</language>
+ <language type="dz">dzonga</language>
+ <language type="ee">eve</language>
+ <language type="efi">efique</language>
+ <language type="egy">egípcio (arcaico)</language>
+ <language type="eka">ekajuk</language>
+ <language type="el">grego</language>
+ <language type="elx">elamite</language>
+ <language type="en">inglês</language>
+ <language type="enm">inglês, medieval (1100-1500)</language>
+ <language type="eo">esperanto</language>
+ <language type="es">espanhol</language>
+ <language type="et">estoniano</language>
+ <language type="et" alt="proposed" draft="provisional">estónio</language>
+ <language type="eu">basco</language>
+ <language type="ewo">ewondo</language>
+ <language type="fa">persa</language>
+ <language type="fan">fangue</language>
+ <language type="fat">fanti</language>
+ <language type="ff">fula</language>
+ <language type="fi">finlandês</language>
+ <language type="fiu">ugro-finês (outros)</language>
+ <language type="fj">fijiano</language>
+ <language type="fo">feroês</language>
+ <language type="fon">fom</language>
+ <language type="fr">francês</language>
+ <language type="frm">francês, medieval (aprox.1400-1600)</language>
+ <language type="fro">francês, arcaico (842-aprox.1400)</language>
+ <language type="fur">friulano</language>
+ <language type="fy">frisão</language>
+ <language type="ga">irlandês</language>
+ <language type="gaa">ga</language>
+ <language type="gay">gayo</language>
+ <language type="gba">gbaia</language>
+ <language type="gd">gaélico escocês</language>
+ <language type="gem">germânicos (outros)</language>
+ <language type="gez">geez</language>
+ <language type="gil">gilbertês</language>
+ <language type="gl">galego</language>
+ <language type="gmh">alemão, medieval alto (aprox.1050-1500)</language>
+ <language type="gn">guarani</language>
+ <language type="goh">alemão, arcaico alto (aprox.750-1050)</language>
+ <language type="gon">gondi</language>
+ <language type="gor">gorontalo</language>
+ <language type="got">gótico</language>
+ <language type="grb">Gerbo</language>
+ <language type="grc">grego, arcaico (até 1453)</language>
+ <language type="gu">guzerate</language>
+ <language type="gv">manx</language>
+ <language type="gwi" draft="unconfirmed">gwichʼin</language>
+ <language type="ha">hauçá</language>
+ <language type="hai">haida</language>
+ <language type="haw">havaiano</language>
+ <language type="he">hebraico</language>
+ <language type="hi">hindi</language>
+ <language type="hil">hiligaynon</language>
+ <language type="him">himachali</language>
+ <language type="hit">hitita</language>
+ <language type="hmn">hmong</language>
+ <language type="ho">hiri motu</language>
+ <language type="hr">croata</language>
+ <language type="hsb">upper sorbian</language>
+ <language type="ht">haitiano</language>
+ <language type="hu">húngaro</language>
+ <language type="hup">hupa</language>
+ <language type="hy">armênio</language>
+ <language type="hz">herero</language>
+ <language type="ia">interlíngua</language>
+ <language type="iba">Iban</language>
+ <language type="id">indonésio</language>
+ <language type="ie">interlingue</language>
+ <language type="ig">ibo</language>
+ <language type="ii">sichuan yi</language>
+ <language type="ik">Inupiaq</language>
+ <language type="ilo">ilocano</language>
+ <language type="inc">índicos (outros)</language>
+ <language type="ine">indo-europeus (outros)</language>
+ <language type="inh">inguche</language>
+ <language type="io">ido</language>
+ <language type="ira">iraniano</language>
+ <language type="iro">idiomas iroqueses</language>
+ <language type="is">islandês</language>
+ <language type="it">italiano</language>
+ <language type="iu">inuktitut</language>
+ <language type="ja">japonês</language>
+ <language type="jbo">lojban</language>
+ <language type="jpr">judaico-persa</language>
+ <language type="jrb">judaico-arábico</language>
+ <language type="ka">georgiano</language>
+ <language type="kaa">kara-Kalpak</language>
+ <language type="kab">kabyle</language>
+ <language type="kac">kachin</language>
+ <language type="kam">kamba</language>
+ <language type="kar">karen</language>
+ <language type="kaw">kawi</language>
+ <language type="kbd">kabardian</language>
+ <language type="kg">congolês</language>
+ <language type="kha">khasi</language>
+ <language type="khi">khoisan (other)</language>
+ <language type="kho">khotanese</language>
+ <language type="ki">quicuio</language>
+ <language type="kj">Kuanyama</language>
+ <language type="kk">cazaque</language>
+ <language type="kl">groenlandês</language>
+ <language type="km">cmer</language>
+ <language type="kmb">quimbundo</language>
+ <language type="kn">canarês</language>
+ <language type="ko">coreano</language>
+ <language type="kok">concani</language>
+ <language type="kos">kosraean</language>
+ <language type="kpe">kpelle</language>
+ <language type="kr">canúri</language>
+ <language type="krc">karachay-Balkar</language>
+ <language type="kro">kru</language>
+ <language type="kru">kurukh</language>
+ <language type="ks">kashmiri</language>
+ <language type="ku">curdo</language>
+ <language type="kum">kumyk</language>
+ <language type="kut">kutenai</language>
+ <language type="kv">komi</language>
+ <language type="kw">córnico</language>
+ <language type="ky">quirguiz</language>
+ <language type="la">latim</language>
+ <language type="lad">ladino</language>
+ <language type="lah">lahnda</language>
+ <language type="lam">lamba</language>
+ <language type="lb">luxemburguês</language>
+ <language type="lez">lezghian</language>
+ <language type="lg">luganda</language>
+ <language type="li">limburgish</language>
+ <language type="ln">lingala</language>
+ <language type="lo">laosiano</language>
+ <language type="lol">mongo</language>
+ <language type="loz">lozi</language>
+ <language type="lt">lituano</language>
+ <language type="lu">luba-catanga</language>
+ <language type="lua">luba-Lulua</language>
+ <language type="lui">luiseno</language>
+ <language type="lun">lunda</language>
+ <language type="lus">lushai</language>
+ <language type="lv">letão</language>
+ <language type="mad">madurês</language>
+ <language type="mag">magahi</language>
+ <language type="mai">maithili</language>
+ <language type="mak">makasar</language>
+ <language type="man">mandinga</language>
+ <language type="map">austronésio</language>
+ <language type="mas">massai</language>
+ <language type="mdf">mocsa</language>
+ <language type="mdr">mandar</language>
+ <language type="men">mende</language>
+ <language type="mg">malgaxe</language>
+ <language type="mga">irlandês, medieval (900-1200)</language>
+ <language type="mh">marshallês</language>
+ <language type="mi">maori</language>
+ <language type="mic">miquemaque</language>
+ <language type="min">minangkabau</language>
+ <language type="mis">idiomas diversos</language>
+ <language type="mk">macedônio</language>
+ <language type="mkh">mon-khmer (other)</language>
+ <language type="ml">malaiala</language>
+ <language type="mn">mongol</language>
+ <language type="mnc">manchu</language>
+ <language type="mni">manipuri</language>
+ <language type="mno">manobo languages</language>
+ <language type="mo">moldávio</language>
+ <language type="moh">mohawk</language>
+ <language type="mos">mossi</language>
+ <language type="mr">marata</language>
+ <language type="ms">malaio</language>
+ <language type="mt">maltês</language>
+ <language type="mul">idiomas múltiplos</language>
+ <language type="mun">idiomas munda</language>
+ <language type="mus">creek</language>
+ <language type="mwr">marwari</language>
+ <language type="my">birmanês</language>
+ <language type="myn">maia</language>
+ <language type="myv">erzya</language>
+ <language type="na">nauruano</language>
+ <language type="nah">náuatle</language>
+ <language type="nai">indígenas norte-americanos (outros)</language>
+ <language type="nap">napolitano</language>
+ <language type="nb">bokmål norueguês</language>
+ <language type="nd">ndebele, north</language>
+ <language type="nds">alto alemão; baixo saxão</language>
+ <language type="ne">nepali</language>
+ <language type="new">newari</language>
+ <language type="ng">dongo</language>
+ <language type="nia">nias</language>
+ <language type="nic">niger - kordofanian (other)</language>
+ <language type="niu">niueano</language>
+ <language type="nl">holandês</language>
+ <language type="nl" alt="proposed" draft="provisional">neerlandês</language>
+ <language type="nn">nynorsk norueguês</language>
+ <language type="no">norueguês</language>
+ <language type="nog">nogai</language>
+ <language type="non">norse, old</language>
+ <language type="nr">ndebele, south</language>
+ <language type="nso">soto, setentrional</language>
+ <language type="nub">idiomas núbios</language>
+ <language type="nv">navajo</language>
+ <language type="ny">nianja; chicheua; cheua</language>
+ <language type="nym">nyamwezi</language>
+ <language type="nyn">nyankole</language>
+ <language type="nyo">nyoro</language>
+ <language type="nzi">nzima</language>
+ <language type="oc">occitânico (após 1500); provençal</language>
+ <language type="oj">ojibwa</language>
+ <language type="om">oromo</language>
+ <language type="or">oriya</language>
+ <language type="os">ossetic</language>
+ <language type="osa">osage</language>
+ <language type="ota">turco, otomano (1500-1928)</language>
+ <language type="oto">idiomas otomanos</language>
+ <language type="pa">panjabi</language>
+ <language type="paa">papuanos (outros)</language>
+ <language type="pag">pangasinã</language>
+ <language type="pal">pálavi</language>
+ <language type="pam">pampanga</language>
+ <language type="pap">papiamento</language>
+ <language type="pau">palauano</language>
+ <language type="peo">persa arcaico (aprox. 600-400 a.C.)</language>
+ <language type="phi">filipinos (outros)</language>
+ <language type="phn">fenício</language>
+ <language type="pi">páli</language>
+ <language type="pl">polonês</language>
+ <language type="pl" alt="proposed" draft="provisional">polaco</language>
+ <language type="pon">pohnpeian</language>
+ <language type="pra">idiomas prácrito</language>
+ <language type="pro">provençal, arcaico (até 1500)</language>
+ <language type="ps">pashto (pushto)</language>
+ <language type="pt">português</language>
+ <language type="qu">quíchua</language>
+ <language type="raj">rajastani</language>
+ <language type="rap">rapanui</language>
+ <language type="rar">rarotongano</language>
+ <language type="rm">rhaeto-romance</language>
+ <language type="rn">rundi</language>
+ <language type="ro">romeno</language>
+ <language type="roa">romances (outros)</language>
+ <language type="rom">romani</language>
+ <language type="ru">russo</language>
+ <language type="rw">kinyarwanda</language>
+ <language type="sa">sânscrito</language>
+ <language type="sad">sandawe</language>
+ <language type="sah">iacuto</language>
+ <language type="sai">indígenas sul-americanos (outros)</language>
+ <language type="sal">salishan languages</language>
+ <language type="sam">aramaico samaritano</language>
+ <language type="sas">sasak</language>
+ <language type="sat">santali</language>
+ <language type="sc">sardo</language>
+ <language type="sco">escocês</language>
+ <language type="sd">sindi</language>
+ <language type="se">northern sami</language>
+ <language type="sel">selkup</language>
+ <language type="sem">semíticos (outros)</language>
+ <language type="sg">sango</language>
+ <language type="sga">irlandês, arcaico (até 900)</language>
+ <language type="sgn">linguages de sinais</language>
+ <language type="sh">servo-croata</language>
+ <language type="shn">shan</language>
+ <language type="si">cingalês</language>
+ <language type="sid">sidamo</language>
+ <language type="sio">idiomas sioux</language>
+ <language type="sit">sino-tibetanos (outros)</language>
+ <language type="sk">eslovaco</language>
+ <language type="sl">eslovênio</language>
+ <language type="sl" alt="proposed" draft="provisional">esloveno</language>
+ <language type="so">somali</language>
+ <language type="sog">sogdien</language>
+ <language type="son">songai</language>
+ <language type="sq">albanês</language>
+ <language type="sr">sérvio</language>
+ <language type="srr">serere</language>
+ <language type="ss">swati</language>
+ <language type="ssa">nilo-saarianos (outros)</language>
+ <language type="st">soto, do sul</language>
+ <language type="su">sundanês</language>
+ <language type="suk">sukuma</language>
+ <language type="sus">sosso</language>
+ <language type="sux">sumério</language>
+ <language type="sv">sueco</language>
+ <language type="sw">suaíli</language>
+ <language type="syr">siríaco</language>
+ <language type="ta">tâmil</language>
+ <language type="tai">tai (outros)</language>
+ <language type="te">telugu</language>
+ <language type="tem">timne</language>
+ <language type="ter">tereno</language>
+ <language type="tet">tétum</language>
+ <language type="tg">tadjique</language>
+ <language type="th">tailandês</language>
+ <language type="ti">tigrínia</language>
+ <language type="tig">tigré</language>
+ <language type="tk">turcomano</language>
+ <language type="tkl">toquelauano</language>
+ <language type="tli">tlinguite</language>
+ <language type="tmh">tamaxeque</language>
+ <language type="tn">tswana</language>
+ <language type="to">tonga (ilhas tonga)</language>
+ <language type="tog">toganês (Nyasa)</language>
+ <language type="tpi">tok pisin</language>
+ <language type="tr">turco</language>
+ <language type="ts">tsonga</language>
+ <language type="tsi">tsimshian</language>
+ <language type="tt">tatar</language>
+ <language type="tum">tumbuka</language>
+ <language type="tup">idiomas tupi</language>
+ <language type="tut">altaicos (outros)</language>
+ <language type="tvl">tuvaluano</language>
+ <language type="tw">twi</language>
+ <language type="ty">taitiano</language>
+ <language type="tyv">tuvinian</language>
+ <language type="udm">udmurt</language>
+ <language type="ug">uighur</language>
+ <language type="uga">ugarítico</language>
+ <language type="uk">ucraniano</language>
+ <language type="umb">umbundu</language>
+ <language type="und">indeterminado</language>
+ <language type="ur">urdu</language>
+ <language type="uz">usbeque</language>
+ <language type="ve">venda</language>
+ <language type="vi">vietnamita</language>
+ <language type="vo">volapuque</language>
+ <language type="vot">votic</language>
+ <language type="wa">walloon</language>
+ <language type="wak">wakashan languages</language>
+ <language type="wal">walamo</language>
+ <language type="war">waray</language>
+ <language type="was">washo</language>
+ <language type="wen">sorbian languages</language>
+ <language type="wo">uolofe</language>
+ <language type="xal">kalmyk</language>
+ <language type="xh">xosa</language>
+ <language type="yao">iao</language>
+ <language type="yap">yapese</language>
+ <language type="yi">iídiche</language>
+ <language type="yo">ioruba</language>
+ <language type="ypk">idiomas iúpique</language>
+ <language type="za">zhuang</language>
+ <language type="zap">zapoteca</language>
+ <language type="zen">zenaga</language>
+ <language type="zh">chinês</language>
+ <language type="znd">zande</language>
+ <language type="zu">zulu</language>
+ <language type="zun">zunhi</language>
+ </languages>
+ <scripts>
+ <script type="Arab">árabe</script>
+ <script type="Armn">armênio</script>
+ <script type="Beng">bengali</script>
+ <script type="Bopo">bopomofo</script>
+ <script type="Brai">braile</script>
+ <script type="Buhd">buhid</script>
+ <script type="Cans">símbolos aborígenes do Canadá Unificado</script>
+ <script type="Cher">cheroqui</script>
+ <script type="Copt">cóptico</script>
+ <script type="Cprt">cipriota</script>
+ <script type="Cyrl">cirílico</script>
+ <script type="Deva">devanágari</script>
+ <script type="Dsrt">deseret</script>
+ <script type="Ethi">etiópico</script>
+ <script type="Geor">georgiano</script>
+ <script type="Goth">gótico</script>
+ <script type="Grek">grego</script>
+ <script type="Gujr">gujerati</script>
+ <script type="Guru">gurmuqui</script>
+ <script type="Hang">hangul</script>
+ <script type="Hani">han</script>
+ <script type="Hano">hanunoo</script>
+ <script type="Hans">han simplificado</script>
+ <script type="Hant">han tradicional</script>
+ <script type="Hebr">hebraico</script>
+ <script type="Hira">hiragana</script>
+ <script type="Ital">itálico antigo</script>
+ <script type="Kana">katakana</script>
+ <script type="Khmr">khmer</script>
+ <script type="Knda">kannada</script>
+ <script type="Laoo">lao</script>
+ <script type="Latn">latim</script>
+ <script type="Limb">limbu</script>
+ <script type="Linb">b linear</script>
+ <script type="Mlym">malaiala</script>
+ <script type="Mong">mongol</script>
+ <script type="Mymr">myanmar</script>
+ <script type="Ogam">ogâmico</script>
+ <script type="Orya">oriya</script>
+ <script type="Osma">osmanya</script>
+ <script type="Qaai">herdado</script>
+ <script type="Runr">rúnico</script>
+ <script type="Shaw">shaviano</script>
+ <script type="Sinh">cingalês</script>
+ <script type="Syrc">siríaco</script>
+ <script type="Tagb">tagbanwa</script>
+ <script type="Tale">tai Le</script>
+ <script type="Taml">tâmil</script>
+ <script type="Telu">télugu</script>
+ <script type="Tglg">tagalo</script>
+ <script type="Thaa">thaana</script>
+ <script type="Thai">tailandês</script>
+ <script type="Tibt">tibetano</script>
+ <script type="Ugar">ugarítico</script>
+ <script type="Yiii">yi</script>
+ <script type="Zyyy">comum</script>
+ </scripts>
+ <territories>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Emirados Ãrabes Unidos</territory>
+ <territory type="AF">Afeganistão</territory>
+ <territory type="AG">Antígua e Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albânia</territory>
+ <territory type="AM">Armênia</territory>
+ <territory type="AN">Antilhas Holandesas</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antártida</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">Samoa Americana</territory>
+ <territory type="AT">Ãustria</territory>
+ <territory type="AU">Austrália</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AZ">Azerbaijão</territory>
+ <territory type="BA">Bósnia-Herzegóvina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BE">Bélgica</territory>
+ <territory type="BF">Burquina Faso</territory>
+ <territory type="BG">Bulgária</territory>
+ <territory type="BH">Bareine</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermudas</territory>
+ <territory type="BN">Brunei</territory>
+ <territory type="BO">Bolívia</territory>
+ <territory type="BR">Brasil</territory>
+ <territory type="BS">Bahamas</territory>
+ <territory type="BT">Butão</territory>
+ <territory type="BV">Ilha Bouvet</territory>
+ <territory type="BW">Botsuana</territory>
+ <territory type="BY">Belarus</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Canadá</territory>
+ <territory type="CC">Ilhas Cocos (Keeling)</territory>
+ <territory type="CD">Congo, República Democrática do</territory>
+ <territory type="CF">República Centro-Africana</territory>
+ <territory type="CG">Congo</territory>
+ <territory type="CH">Suíça</territory>
+ <territory type="CI">Costa do Marfim</territory>
+ <territory type="CK">Ilhas Cook</territory>
+ <territory type="CL">Chile</territory>
+ <territory type="CM">República dos Camarões</territory>
+ <territory type="CN">China</territory>
+ <territory type="CO">Colômbia</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS">Sérvia e Montenegro</territory>
+ <territory type="CU">Cuba</territory>
+ <territory type="CV">Cabo Verde</territory>
+ <territory type="CX">Ilhas Natal</territory>
+ <territory type="CY">Chipre</territory>
+ <territory type="CZ">República Tcheca</territory>
+ <territory type="DE">Alemanha</territory>
+ <territory type="DJ">Djibuti</territory>
+ <territory type="DK">Dinamarca</territory>
+ <territory type="DM">Dominica</territory>
+ <territory type="DO">República Dominicana</territory>
+ <territory type="DZ">Argélia</territory>
+ <territory type="EC">Equador</territory>
+ <territory type="EE">Estônia</territory>
+ <territory type="EG">Egito</territory>
+ <territory type="EH">Saara Ocidental</territory>
+ <territory type="ER">Eritréia</territory>
+ <territory type="ES">Espanha</territory>
+ <territory type="ET">Etiópia</territory>
+ <territory type="FI">Finlândia</territory>
+ <territory type="FJ">Fiji</territory>
+ <territory type="FK">Ilhas Malvinas</territory>
+ <territory type="FM">Micronésia, Estados Federados da</territory>
+ <territory type="FO">Ilhas Faroe</territory>
+ <territory type="FR">França</territory>
+ <territory type="GA">Gabão</territory>
+ <territory type="GB">Reino Unido</territory>
+ <territory type="GD">Granada</territory>
+ <territory type="GE">Geórgia</territory>
+ <territory type="GF">Guiana Francesa</territory>
+ <territory type="GH">Gana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Groênlandia</territory>
+ <territory type="GM">Gâmbia</territory>
+ <territory type="GN">Guiné</territory>
+ <territory type="GP">Guadalupe</territory>
+ <territory type="GQ">Guiné Equatorial</territory>
+ <territory type="GR">Grécia</territory>
+ <territory type="GS">Geórgia do Sul e Ilhas Sandwich do Sul</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guiné Bissau</territory>
+ <territory type="GY">Guiana</territory>
+ <territory type="HK">Hong Kong, Região Admin. Especial da China</territory>
+ <territory type="HM">Ilha Heard e Ilhas McDonald</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Croácia</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Hungria</territory>
+ <territory type="ID">Indonésia</territory>
+ <territory type="IE">Irlanda</territory>
+ <territory type="IL">Israel</territory>
+ <territory type="IN">Ãndia</territory>
+ <territory type="IO">Território Britânico do Oceano Ãndico</territory>
+ <territory type="IQ">Iraque</territory>
+ <territory type="IR">Irã</territory>
+ <territory type="IS">Islândia</territory>
+ <territory type="IT">Itália</territory>
+ <territory type="JM">Jamaica</territory>
+ <territory type="JO">Jordânia</territory>
+ <territory type="JP">Japão</territory>
+ <territory type="KE">Quênia</territory>
+ <territory type="KG">Quirguistão</territory>
+ <territory type="KH">Camboja</territory>
+ <territory type="KI">Quiribati</territory>
+ <territory type="KM">Comores</territory>
+ <territory type="KN">São Cristovão e Nevis</territory>
+ <territory type="KP">Coréia, Norte</territory>
+ <territory type="KR">Coréia, Sul</territory>
+ <territory type="KW">Kuwait</territory>
+ <territory type="KY">Ilhas Caiman</territory>
+ <territory type="KZ">Casaquistão</territory>
+ <territory type="LA">República Democrática Popular de Lao</territory>
+ <territory type="LB">Líbano</territory>
+ <territory type="LC">Santa Lúcia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Libéria</territory>
+ <territory type="LS">Lesoto</territory>
+ <territory type="LT">Lituânia</territory>
+ <territory type="LU">Luxemburgo</territory>
+ <territory type="LV">Letônia</territory>
+ <territory type="LY">Líbia</territory>
+ <territory type="MA">Marrocos</territory>
+ <territory type="MC">Mônaco</territory>
+ <territory type="MD">Moldova, República de</territory>
+ <territory type="MG">Madagascar</territory>
+ <territory type="MH">Ilhas Marshall</territory>
+ <territory type="MK">Macedônia, República da</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Mianmá</territory>
+ <territory type="MN">Mongólia</territory>
+ <territory type="MO">Macau, Região Admin. Especial da China</territory>
+ <territory type="MP">Ilhas Marianas do Norte</territory>
+ <territory type="MQ">Martinica</territory>
+ <territory type="MR">Mauritânia</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Maurício</territory>
+ <territory type="MV">Maldivas</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">México</territory>
+ <territory type="MY">Malásia</territory>
+ <territory type="MZ">Moçambique</territory>
+ <territory type="NA">Namíbia</territory>
+ <territory type="NC">Nova Caledônia</territory>
+ <territory type="NE">Níger</territory>
+ <territory type="NF">Ilha Norfolk</territory>
+ <territory type="NG">Nigéria</territory>
+ <territory type="NI">Nicarágua</territory>
+ <territory type="NL">Países Baixos</territory>
+ <territory type="NO">Noruega</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Nova Zelândia</territory>
+ <territory type="OM">Omã</territory>
+ <territory type="PA">Panamá</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Polinésia Francesa</territory>
+ <territory type="PG">Papua-Nova Guiné</territory>
+ <territory type="PH">Filipinas</territory>
+ <territory type="PK">Paquistão</territory>
+ <territory type="PL">Polônia</territory>
+ <territory type="PM">Saint Pierre e Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Porto Rico</territory>
+ <territory type="PS">Território da Palestina</territory>
+ <territory type="PT">Portugal</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguai</territory>
+ <territory type="QA">Catar</territory>
+ <territory type="RE">Reunião</territory>
+ <territory type="RO">Romênia</territory>
+ <territory type="RU">Rússia</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SA">Arábia Saudita</territory>
+ <territory type="SB">Ilhas Salomão</territory>
+ <territory type="SC">Seychelles</territory>
+ <territory type="SD">Sudão</territory>
+ <territory type="SE">Suécia</territory>
+ <territory type="SG">Cingapura</territory>
+ <territory type="SH">Santa Helena</territory>
+ <territory type="SI">Eslovênia</territory>
+ <territory type="SJ">Svalbard e Jan Mayen</territory>
+ <territory type="SK">Eslováquia</territory>
+ <territory type="SL">Serra Leoa</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somália</territory>
+ <territory type="SR">Suriname</territory>
+ <territory type="ST">São Tomé e Príncipe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Síria</territory>
+ <territory type="SZ">Suazilândia</territory>
+ <territory type="TC">Ilhas Turks e Caicos</territory>
+ <territory type="TD">Chade</territory>
+ <territory type="TF">Territórios Franceses do Sul</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Tailândia</territory>
+ <territory type="TJ">Tadjiquistão</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Timor Leste</territory>
+ <territory type="TM">Turcomenistão</territory>
+ <territory type="TN">Tunísia</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turquia</territory>
+ <territory type="TT">Trinidad e Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TZ">Tanzânia</territory>
+ <territory type="UA">Ucrânia</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">Ilhas Menores Distantes dos Estados Unidos</territory>
+ <territory type="US">Estados Unidos</territory>
+ <territory type="UY">Uruguai</territory>
+ <territory type="UZ">Uzbequistão</territory>
+ <territory type="VA">Vaticano</territory>
+ <territory type="VC">São Vicente e Granadinas</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Ilhas Virgens Britânicas</territory>
+ <territory type="VI">Ilhas Virgens dos EUA</territory>
+ <territory type="VN">Vietnã</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis e Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Iêmen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Ãfrica do Sul</territory>
+ <territory type="ZM">Zâmbia</territory>
+ <territory type="ZW">Zimbábwe</territory>
+ </territories>
+ <variants>
+ <variant type="REVISED">Revisado</variant>
+ </variants>
+ <keys>
+ <key type="calendar">Calendário</key>
+ <key type="collation">Intercalação</key>
+ <key type="currency">Moeda</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">Calendário Budista</type>
+ <type type="chinese" key="calendar">Calendário Chinês</type>
+ <type type="direct" key="collation">Ordem Direta</type>
+ <type type="gregorian" key="calendar">Calendário Gregoriano</type>
+ <type type="hebrew" key="calendar">Calendário Hebraico</type>
+ <type type="islamic" key="calendar">Calendário Islâmico</type>
+ <type type="islamic-civil" key="calendar">Calendário Civil Islâmico</type>
+ <type type="japanese" key="calendar">Calendário Japonês</type>
+ <type type="phonebook" key="collation">Ordem de Lista Telefônica</type>
+ <type type="pinyin" key="collation">Ordem Pin-yin</type>
+ <type type="stroke" key="collation">Ordem dos Traços</type>
+ <type type="traditional" key="collation">Ordem Tradicional</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a á à â ã b c ç d e é ê f-i í j-o ó ò ô õ p-u ú ü v-z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">jan</month>
+ <month type="2">fev</month>
+ <month type="3">mar</month>
+ <month type="4">abr</month>
+ <month type="5">mai</month>
+ <month type="6">jun</month>
+ <month type="7">jul</month>
+ <month type="8">ago</month>
+ <month type="9">set</month>
+ <month type="10">out</month>
+ <month type="11">nov</month>
+ <month type="12">dez</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">janeiro</month>
+ <month type="2">fevereiro</month>
+ <month type="3">março</month>
+ <month type="4">abril</month>
+ <month type="5">maio</month>
+ <month type="6">junho</month>
+ <month type="7">julho</month>
+ <month type="8">agosto</month>
+ <month type="9">setembro</month>
+ <month type="10">outubro</month>
+ <month type="11">novembro</month>
+ <month type="12">dezembro</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">J</month>
+ <month type="2">F</month>
+ <month type="3">M</month>
+ <month type="4">A</month>
+ <month type="5">M</month>
+ <month type="6">J</month>
+ <month type="7">J</month>
+ <month type="8">A</month>
+ <month type="9">S</month>
+ <month type="10">O</month>
+ <month type="11">N</month>
+ <month type="12">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">dom</day>
+ <day type="mon">seg</day>
+ <day type="tue">ter</day>
+ <day type="wed">qua</day>
+ <day type="thu">qui</day>
+ <day type="fri">sex</day>
+ <day type="sat">sáb</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">domingo</day>
+ <day type="mon">segunda-feira</day>
+ <day type="tue">terça-feira</day>
+ <day type="wed">quarta-feira</day>
+ <day type="thu">quinta-feira</day>
+ <day type="fri">sexta-feira</day>
+ <day type="sat">sábado</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">D</day>
+ <day type="mon">S</day>
+ <day type="tue">T</day>
+ <day type="wed">Q</day>
+ <day type="thu">Q</day>
+ <day type="fri">S</day>
+ <day type="sat">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">T1</quarter>
+ <quarter type="2">T2</quarter>
+ <quarter type="3">T3</quarter>
+ <quarter type="4">T4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1º trimestre</quarter>
+ <quarter type="2">2º trimestre</quarter>
+ <quarter type="3">3º trimestre</quarter>
+ <quarter type="4">4º trimestre</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraAbbr>
+ <era type="0">a.C.</era>
+ <era type="1">d.C.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d' de 'MMMM' de 'yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d' de 'MMMM' de 'yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d/MMM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH'H'mm'm'ss's' z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMM" draft="provisional">MMM/yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Pólo Sul</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Tucuman">
+ <exemplarCity>Tucumán</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity>Córdoba</exemplarCity>
+ </zone>
+ <zone type="America/Cuiaba">
+ <exemplarCity>Cuiabá</exemplarCity>
+ </zone>
+ <zone type="America/Belem">
+ <exemplarCity>Belém</exemplarCity>
+ </zone>
+ <zone type="America/Araguaina">
+ <exemplarCity>Araguaína</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>São Paulo</exemplarCity>
+ </zone>
+ <zone type="America/Maceio">
+ <exemplarCity>Maceió</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <standard>Horário Padrão Atlântico</standard>
+ <daylight>Horário de Verão Atlântico</daylight>
+ </long>
+ <short>
+ <standard>AST</standard>
+ <daylight>ADT</daylight>
+ </short>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <standard>Horário Padrão de Terra Nova</standard>
+ <daylight>Horário de Verão de Terra Nova</daylight>
+ </long>
+ <short>
+ <standard>NST</standard>
+ <daylight>NDT</daylight>
+ </short>
+ <exemplarCity>St. Johns</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <standard>Horário Padrão da China</standard>
+ <daylight>Horário Padrão da China</daylight>
+ </long>
+ <exemplarCity>Xangai</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity>Galápagos</exemplarCity>
+ </zone>
+ <zone type="America/Guayaquil">
+ <exemplarCity>Guaiaquil</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>Canárias</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity draft="unconfirmed">Madri</exemplarCity>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <standard>Horário Padrão Europa Central</standard>
+ <daylight>Horário de Verão Europa Central</daylight>
+ </long>
+ <short>
+ <standard>CET</standard>
+ <daylight>CEST</daylight>
+ </short>
+ <exemplarCity>Paris</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>Londres</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity>Jacarta</exemplarCity>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <standard>Horário Padrão de Israel</standard>
+ <daylight>Horário de Verão de Israel</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IDT</daylight>
+ </short>
+ <exemplarCity>Jerusalém</exemplarCity>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <standard>Horário Padrão do Japão</standard>
+ <daylight>Horário Padrão do Japão</daylight>
+ </long>
+ <short>
+ <standard>JST</standard>
+ <daylight>JST</daylight>
+ </short>
+ <exemplarCity>Tóquio</exemplarCity>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <standard>Horário do Meridiano de Greenwich</standard>
+ <daylight>Horário do Meridiano de Greenwich</daylight>
+ </long>
+ <short>
+ <standard>GMT</standard>
+ <daylight>GMT</daylight>
+ </short>
+ <exemplarCity>Casablanca</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>Cidade do México</exemplarCity>
+ </zone>
+ <zone type="America/Merida">
+ <exemplarCity>Mérida</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>Cancún</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity>Taiti</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>Açores</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lisboa</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>Horário Padrão da Europa Oriental</standard>
+ <daylight>Horário de Verão da Europa Oriental</daylight>
+ </long>
+ <short>
+ <standard>EET</standard>
+ <daylight>EEST</daylight>
+ </short>
+ <exemplarCity>Bucareste</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity draft="unconfirmed">Moscou</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <standard>Horário Padrão do Havaí</standard>
+ <daylight>Horário Padrão do Havaí</daylight>
+ </long>
+ <short>
+ <standard>HST</standard>
+ <daylight>HST</daylight>
+ </short>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <standard>Horário Padrão do Alasca</standard>
+ <daylight>Horário de Verão do Alasca</daylight>
+ </long>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <standard>Horário Padrão do Pacífico</standard>
+ <daylight>Horário de Verão do Pacífico</daylight>
+ </long>
+ <short>
+ <standard>PST</standard>
+ <daylight>PDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Phoenix">
+ <long>
+ <standard>Horário Padrão Montanha</standard>
+ <daylight>Horário Padrão Montanha</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MST</daylight>
+ </short>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <standard>Horário Padrão Montanha</standard>
+ <daylight>Horário de Verão Montanha</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity>Central</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <standard>Horário Padrão Central</standard>
+ <daylight>Horário de Verão Central</daylight>
+ </long>
+ <short>
+ <standard>CST</standard>
+ <daylight>CDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Indianapolis">
+ <exemplarCity>Indianápolis</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <standard>Horário Padrão Oriental</standard>
+ <daylight>Horário de Verão Oriental</daylight>
+ </long>
+ <short>
+ <standard>EST</standard>
+ <daylight>EDT</daylight>
+ </short>
+ <exemplarCity>Nova Iorque</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Peseta de Andorra</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>Dirém dos Emirados Ãrabes Unidos</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>Afegane (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>Afegane</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName>Lek Albanês</displayName>
+ </currency>
+ <currency type="AMD">
+ <displayName>Dram Arménio</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName>Guilder das Antilhas Holandesas</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName>Cuanza angolano</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Cuanza angolano (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>Cuanza novo angolano (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>Cuanza angolano reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>Austral argentino</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Peso argentino (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Peso argentino</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName>Xelim austríaco</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>Dólar australiano</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName>Guilder de Aruba</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>Manat azerbaijano</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>Dinar da Bósnia-Herzegóvina</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>Marco bósnio-herzegóvino conversível</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName>Dólar de Barbados</displayName>
+ </currency>
+ <currency type="BDT">
+ <displayName>Taka de Bangladesh</displayName>
+ </currency>
+ <currency type="BEC">
+ <displayName>Franco belga (conversível)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Franco belga</displayName>
+ </currency>
+ <currency type="BEL">
+ <displayName>Franco belga (financeiro)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>Lev forte búlgaro</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName>Lev novo búlgaro</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>Dinar bareinita</displayName>
+ </currency>
+ <currency type="BIF">
+ <displayName>Franco do Burundi</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName>Dólar das Bermudas</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName>Dólar do Brunei</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>Boliviano</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>Peso boliviano</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Mvdol boliviano</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>Cruzeiro novo brasileiro(1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>Cruzado brasileiro</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>Cruzeiro brasileiro (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Real brasileiro</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRN">
+ <displayName>Cruzado novo brasileiro</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>Cruzeiro brasileiro</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>Dólar das Bahamas</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>Ngultrum do Butão</displayName>
+ </currency>
+ <currency type="BUK">
+ <displayName>Kyat birmanês</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>Pula botsuanesa</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>Rublo novo bielo-russo (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>Rublo bielo-russo</displayName>
+ </currency>
+ <currency type="BZD">
+ <displayName>Dólar do Belize</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>Dólar canadense</displayName>
+ </currency>
+ <currency type="CDF">
+ <displayName>Franco congolês</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Franco suíço</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>Unidades de Fomento chilenas</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Peso chileno</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>Yuan Renminbi chinês</displayName>
+ </currency>
+ <currency type="COP">
+ <displayName>Peso colombiano</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>Colon da Costa Rica</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>Coroa Forte checoslovaca</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Peso cubano</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Escudo cabo-verdiano</displayName>
+ </currency>
+ <currency type="CYP">
+ <displayName>Libra de Chipre</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName>Coroa da República Checa</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>Ostmark da Alemanha Oriental</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Marco alemão</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Franco do Djibuti</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName>Coroa dinamarquesa</displayName>
+ </currency>
+ <currency type="DOP">
+ <displayName>Peso dominicano</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName>Dinar argelino</displayName>
+ </currency>
+ <currency type="ECS">
+ <displayName>Sucre equatoriano</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>Unidad de Valor Constante (UVC) do Equador</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>Coroa estoniana</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>Libra egípcia</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Nakfa da Eritréia</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Peseta espanhola</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>Birr etíope</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>Marca finlandesa</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Dólar de Fiji</displayName>
+ </currency>
+ <currency type="FKP">
+ <displayName>Libra das Malvinas</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Franco francês</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Libra esterlina britânica</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>Cupom Lari georgiano</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>Lari georgiano</displayName>
+ </currency>
+ <currency type="GHC">
+ <displayName>Cedi de Gana</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>Libra de Gibraltar</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>Dalasi de Gâmbia</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Franco de Guiné</displayName>
+ </currency>
+ <currency type="GNS">
+ <displayName>Syli de Guiné</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Ekwele de Guiné Equatorial</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Dracma grego</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Quetçal da Guatemala</displayName>
+ </currency>
+ <currency type="GWE">
+ <displayName>Escudo da Guiné Portuguesa</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Peso da Guiné-Bissau</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>Dólar da Guiana</displayName>
+ </currency>
+ <currency type="HKD">
+ <displayName>Dólar de Hong Kong</displayName>
+ </currency>
+ <currency type="HNL">
+ <displayName>Lempira de Honduras</displayName>
+ </currency>
+ <currency type="HRD">
+ <displayName>Dinar croata</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Kuna croata</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>Gurde do Haiti</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Forinte húngaro</displayName>
+ </currency>
+ <currency type="IDR">
+ <displayName>Rupia indonésia</displayName>
+ </currency>
+ <currency type="IEP">
+ <displayName>Libra irlandesa</displayName>
+ </currency>
+ <currency type="ILP">
+ <displayName>Libra israelita</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Sheqel Novo israelita</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Rupia indiana</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>Dinar iraquiano</displayName>
+ </currency>
+ <currency type="IRR">
+ <displayName>Rial iraniano</displayName>
+ </currency>
+ <currency type="ISK">
+ <displayName>Coroa islandesa</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>Lira italiana</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>Dólar jamaicano</displayName>
+ </currency>
+ <currency type="JOD">
+ <displayName>Dinar jordaniano</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>Iene japonês</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>Xelim queniano</displayName>
+ </currency>
+ <currency type="KGS">
+ <displayName>Som de Quirguistão</displayName>
+ </currency>
+ <currency type="KHR">
+ <displayName>Riel cambojano</displayName>
+ </currency>
+ <currency type="KMF">
+ <displayName>Franco de Comores</displayName>
+ </currency>
+ <currency type="KPW">
+ <displayName>Won norte-coreano</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Won sul-coreano</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>Dinar coveitiano</displayName>
+ </currency>
+ <currency type="KYD">
+ <displayName>Dólar das Ilhas Caimão</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Tenge do Cazaquistão</displayName>
+ </currency>
+ <currency type="LAK">
+ <displayName>Kip de Laos</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>Libra libanesa</displayName>
+ </currency>
+ <currency type="LKR">
+ <displayName>Rupia de Sri Lanka</displayName>
+ </currency>
+ <currency type="LRD">
+ <displayName>Dólar liberiano</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Loti de Lesoto</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>Lita lituano</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Talonas lituano</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Franco luxemburguês</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Lats letão</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>Rublo letão</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>Dinar líbio</displayName>
+ </currency>
+ <currency type="MAD">
+ <displayName>Dirém marroquino</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>Franco marroquino</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>Leu de Moldávia</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>Ariary de Madagascar</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Franco de Madagascar</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>Dinar macedônio</displayName>
+ </currency>
+ <currency type="MLF">
+ <displayName>Franco de Mali</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Kyat de Mianmar</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>Tugrik mongol</displayName>
+ </currency>
+ <currency type="MOP">
+ <displayName>Pataca macaense</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Ouguiya da Mauritânia</displayName>
+ </currency>
+ <currency type="MTL">
+ <displayName>Lira maltesa</displayName>
+ </currency>
+ <currency type="MTP">
+ <displayName>Libra maltesa</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>Rupia de Maurício</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>Rupias das Ilhas Maldivas</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Cuacha do Maláui</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName>Peso mexicano</displayName>
+ </currency>
+ <currency type="MXP">
+ <displayName>Peso Plata mexicano (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>Unidad de Inversion (UDI) mexicana</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Ringgit malaio</displayName>
+ </currency>
+ <currency type="MZE">
+ <displayName>Escudo de Moçambique</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Metical de Moçambique</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName>Dólar da Namíbia</displayName>
+ </currency>
+ <currency type="NGN">
+ <displayName>Naira nigeriana</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>Córdoba nicaraguano</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>Córdoba Ouro nicaraguano</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Guilder holandês</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Coroa norueguesa</displayName>
+ </currency>
+ <currency type="NPR">
+ <displayName>Rupia nepalesa</displayName>
+ </currency>
+ <currency type="NZD">
+ <displayName>Dólar da Nova Zelândia</displayName>
+ </currency>
+ <currency type="OMR">
+ <displayName>Rial de Omã</displayName>
+ </currency>
+ <currency type="PAB">
+ <displayName>Balboa panamenho</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>Inti peruano</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>Sol Novo peruano</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>Sol peruano</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Kina da Papua-Nova Guiné</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>Peso filipino</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>Rupia paquistanesa</displayName>
+ </currency>
+ <currency type="PLN">
+ <displayName>Zloti polonês</displayName>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Zloti polonês (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Escudo português</displayName>
+ <symbol>Esc.</symbol>
+ </currency>
+ <currency type="PYG">
+ <displayName>Guarani paraguaio</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>Rial catariano</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>Leu romeno</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>Rublo russo</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Rublo russo (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>Franco ruandês</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>Rial saudita</displayName>
+ </currency>
+ <currency type="SBD">
+ <displayName>Dólar das Ilhas Salomão</displayName>
+ </currency>
+ <currency type="SCR">
+ <displayName>Rupia das Seychelles</displayName>
+ </currency>
+ <currency type="SDD">
+ <displayName>Dinar sudanês</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>Libra sudanesa</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>Coroa sueca</displayName>
+ </currency>
+ <currency type="SGD">
+ <displayName>Dólar de Cingapura</displayName>
+ </currency>
+ <currency type="SHP">
+ <displayName>Libra de Santa Helena</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Tolar Bons esloveno</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Coroa eslovaca</displayName>
+ </currency>
+ <currency type="SLL">
+ <displayName>Leone de Serra Leoa</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>Xelim somali</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>Guilder do Suriname</displayName>
+ </currency>
+ <currency type="STD">
+ <displayName>Dobra de São Tomé e Príncipe</displayName>
+ </currency>
+ <currency type="SUR">
+ <displayName>Rublo soviético</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>Colom salvadorenho</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>Libra síria</displayName>
+ </currency>
+ <currency type="SZL">
+ <displayName>Lilangeni da Suazilândia</displayName>
+ </currency>
+ <currency type="THB">
+ <displayName>Baht tailandês</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>Rublo do Tadjiquistão</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Somoni tadjique</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Manat do Turcomenistão</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>Dinar tunisiano</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>Paʻanga de Tonga</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>Escudo timorense</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Lira turca</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Dólar de Trinidad e Tobago</displayName>
+ </currency>
+ <currency type="TWD">
+ <displayName>Dólar Novo de Taiwan</displayName>
+ </currency>
+ <currency type="TZS">
+ <displayName>Xelim de Tanzânia</displayName>
+ </currency>
+ <currency type="UAH">
+ <displayName>Hryvnia ucraniano</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Karbovanetz ucraniano</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Xelim ugandense (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Xelim ugandense</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>Dólar norte-americano</displayName>
+ </currency>
+ <currency type="USN">
+ <displayName>Dólar norte-americano (Dia seguinte)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>Dólar norte-americano (Mesmo dia)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>Peso uruguaio (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>Peso uruguaio</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName>Sum do Usbequistão</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Bolívar venezuelano</displayName>
+ </currency>
+ <currency type="VND">
+ <displayName>Dong vietnamita</displayName>
+ <symbol>Ä‘</symbol>
+ </currency>
+ <currency type="VUV">
+ <displayName>Vatu de Vanuatu</displayName>
+ </currency>
+ <currency type="WST">
+ <displayName>Tala de Samoa Ocidental</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>Franco CFA BEAC</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>Ouro</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>Unidade Composta Européia</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>Unidade Monetária Européia</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>Unidade de Conta Européia (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>Unidade de Conta Européia (XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>Dólar do Caribe Oriental</displayName>
+ </currency>
+ <currency type="XDR">
+ <displayName>Direitos Especiais de Giro</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>Franco-ouro francês</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>Franco UIC francês</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>Franco CFA BCEAO</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>Franco CFP</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="YDD">
+ <displayName>Dinar iemenita</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Rial iemenita</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>Dinar forte iugoslavo</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>Super Dinar iugoslavo</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>Dinar conversível iugoslavo</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>Rand sul-africano (financeiro)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Rand sul-africano</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Cuacha zambiano</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Zaire Novo zairense</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Zaire zairense</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Dólar do Zimbábwe</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>sim:s</yesstr>
+ <nostr draft="unconfirmed">não:nao:n</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1">the changes on “code lists†and “other items†are based on results of google searches within Portugal pages</reference>
+ <reference type="RP2" uri="http://ec.europa.eu/comm/translation/currencies/pttable1.htm">EU Currency and Country List</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/pt_BR.xml b/libs/Zend/Locale/Data/pt_BR.xml
new file mode 100755
index 0000000000..618bdcf15f
--- /dev/null
+++ b/libs/Zend/Locale/Data/pt_BR.xml
@@ -0,0 +1,301 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.42 $"/>
+ <generation date="$Date: 2006/06/28 10:58:36 $"/>
+ <language type="pt"/>
+ <territory type="BR"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ang">inglês arcaico (aprox. 450-1100)</language>
+ <language type="awa">awadhi</language>
+ <language type="bai">idiomas bamileke</language>
+ <language type="bug">buguinês</language>
+ <language type="ce">checheno</language>
+ <language type="cmc" draft="provisional">idiomas chamic</language>
+ <language type="crh">turco da criméia; tártaro da criméia</language>
+ <language type="dsb">sérvio baixo</language>
+ <language type="dum">holandês medieval</language>
+ <language type="enm">inglês medieval</language>
+ <language type="frm">francês medieval</language>
+ <language type="fro">francês arcaico</language>
+ <language type="gmh">alemão medieval alto</language>
+ <language type="goh">alemão arcaico alto</language>
+ <language type="grc">grego arcaico</language>
+ <language type="iba">ibã</language>
+ <language type="ik">inupiaque</language>
+ <language type="jv">javanês</language>
+ <language type="kbd">kabardiano</language>
+ <language type="khi">khoisan (outros)</language>
+ <language type="mga">irlandês medieval</language>
+ <language type="mh" draft="provisional">marshalês</language>
+ <language type="mkh">mon-khmer (outros)</language>
+ <language type="mno" draft="provisional">idiomas manobo</language>
+ <language type="nd">ndebele do norte</language>
+ <language type="nic">Cordofano-nigeriano (outros)</language>
+ <language type="non">nórdico arcaico</language>
+ <language type="nr">ndebele do sul</language>
+ <language type="nso">soto setentrional</language>
+ <language type="ota">turco otomano</language>
+ <language type="peo">persa arcaico</language>
+ <language type="pro">provençal arcaico</language>
+ <language type="sal">idiomas salisanos</language>
+ <language type="sgn">linguagem de sinais</language>
+ <language type="st">soto do sul</language>
+ <language type="wak">idiomas wakashan</language>
+ <language type="wen">idiomas sórbios</language>
+ </languages>
+ <scripts>
+ <script type="Bali" draft="provisional">balinês</script>
+ <script type="Batk" draft="provisional">bataque</script>
+ <script type="Osma" draft="provisional">osmania</script>
+ </scripts>
+ <territories>
+ <territory type="172">Comunidade dos Estados Independentes</territory>
+ <territory type="AX">Ilhas Aland</territory>
+ <territory type="BA">Bósnia-Herzegovina</territory>
+ <territory type="BH">Bahrain</territory>
+ <territory type="KP">Coréia do Norte</territory>
+ <territory type="KR" draft="provisional">Coréia do Sul</territory>
+ <territory type="MK">Macedônia</territory>
+ <territory type="NL" draft="provisional">Holanda</territory>
+ <territory type="ZW">Zimbábue</territory>
+ </territories>
+ <measurementSystemNames>
+ <measurementSystemName type="US" draft="provisional">americano</measurementSystemName>
+ <measurementSystemName type="metric" draft="provisional">métrico</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <delimiters>
+ <quotationStart draft="provisional">&quot;</quotationStart>
+ <quotationEnd draft="provisional">&quot;</quotationEnd>
+ <alternateQuotationStart draft="provisional">&quot;</alternateQuotationStart>
+ <alternateQuotationEnd draft="provisional">&quot;</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="buddhist">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="provisional">EEEE, d de MMMM de yyyy G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="provisional">d de MMMM de yyyy G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="provisional">d de MMMM de yyyy G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="provisional">d/M/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ </calendar>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH'h'mm'min'ss's' z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H'h'm'min's's' z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <fields>
+ <field type="year">
+ <displayName>Ano</displayName>
+ </field>
+ <field type="month">
+ <displayName>Mês</displayName>
+ </field>
+ <field type="week">
+ <displayName>Semana</displayName>
+ </field>
+ <field type="day">
+ <displayName>Dia</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>Dia da semana</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName>Período do dia</displayName>
+ </field>
+ <field type="hour">
+ <displayName>Hora</displayName>
+ </field>
+ <field type="minute">
+ <displayName>Minuto</displayName>
+ </field>
+ <field type="second">
+ <displayName>Segundo</displayName>
+ </field>
+ <field type="zone">
+ <displayName>Fuso</displayName>
+ </field>
+ </fields>
+ </calendar>
+ <calendar type="japanese">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="provisional">EEEE, d de MMMM de y G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="provisional">d de MMMM de y G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="provisional">d de MMM de y G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="provisional">d/M/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="America/Argentina/Tucuman">
+ <exemplarCity draft="provisional">Tucumã</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <standard draft="provisional">Horário Padrão do Atlântico</standard>
+ <daylight draft="provisional">Horário de Verão do Atlântico</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <daylight draft="provisional">Horário de Verão da China</daylight>
+ </long>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <standard draft="provisional">Horário Padrão da Europa Central</standard>
+ <daylight draft="provisional">Horário de Verão da Europa Central</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <daylight draft="provisional">Horário de Verão do Japão</daylight>
+ </long>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <daylight draft="provisional">Horário de Verão do Havaí</daylight>
+ </long>
+ </zone>
+ <zone type="America/Phoenix">
+ <long>
+ <standard draft="provisional">Horário Padrão da Montanha</standard>
+ </long>
+ <exemplarCity draft="provisional">Fênix</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <standard draft="provisional">Horário Padrão da Montanha</standard>
+ <daylight draft="provisional">Horário de Verão da Montanha</daylight>
+ </long>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="AON">
+ <displayName draft="provisional">Novo cuanza angolano (1990-2000)</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName draft="provisional">Dinar da Bósnia-Herzegovina</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName draft="provisional">Marco bósnio-herzegovino conversível</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName draft="provisional">Cruzeiro novo brasileiro (1967-1986)</displayName>
+ </currency>
+ <currency type="CYP">
+ <displayName draft="provisional">Libra do Chipre</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName draft="provisional">Coroa da República Tcheca</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName draft="provisional">Unidade de Valor Constante (UVC) do Equador</displayName>
+ </currency>
+ <currency type="GNS">
+ <displayName draft="provisional">Syli da Guiné</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName draft="provisional">Ekwele da Guiné Equatorial</displayName>
+ </currency>
+ <currency type="KGS">
+ <displayName draft="provisional">Som do Quirguistão</displayName>
+ </currency>
+ <currency type="KYD">
+ <displayName draft="provisional">Dólar das Ilhas Caiman</displayName>
+ </currency>
+ <currency type="LKR">
+ <displayName draft="provisional">Rupia do Sri Lanka</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName draft="provisional">Loti do Lesoto</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName draft="provisional">Leu da Moldávia</displayName>
+ </currency>
+ <currency type="MXP">
+ <displayName draft="provisional">Peso Prata mexicano (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName draft="provisional">Unidade de Investimento (UDI) mexicana</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName draft="provisional">Córdoba nicaraguense</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName draft="provisional">Córdoba Ouro nicaraguense</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName draft="provisional">Florim holandês</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName draft="provisional">Florim do Suriname</displayName>
+ </currency>
+ <currency type="TZS">
+ <displayName draft="provisional">Xelim da Tanzânia</displayName>
+ </currency>
+ <currency type="WST">
+ <displayName draft="provisional">Tala da Samoa Ocidental</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/pt_PT.xml b/libs/Zend/Locale/Data/pt_PT.xml
new file mode 100755
index 0000000000..7c10a6b5d6
--- /dev/null
+++ b/libs/Zend/Locale/Data/pt_PT.xml
@@ -0,0 +1,397 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.53 $"/>
+ <generation date="$Date: 2006/07/11 19:27:38 $"/>
+ <language type="pt"/>
+ <territory type="PT"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="chy" draft="provisional">cheyenne</language>
+ <language type="cmc" draft="provisional">idiomas chamic</language>
+ <language type="crh" draft="provisional">turco da crimeia, tatar da crimeia</language>
+ <language type="cs">checo</language>
+ <language type="cus" draft="provisional">cuchíticas (outros)</language>
+ <language type="dsb" draft="provisional">Baixo Sórbio</language>
+ <language type="dyu" draft="provisional">diula</language>
+ <language type="ee" draft="provisional">ewe</language>
+ <language type="efi" draft="provisional">efik</language>
+ <language type="et">estónio</language>
+ <language type="fan" draft="provisional">fang</language>
+ <language type="fo" draft="provisional">faroés</language>
+ <language type="gl" draft="provisional">galiciano</language>
+ <language type="grb" draft="provisional">Grebo</language>
+ <language type="ha" draft="provisional">hausa</language>
+ <language type="hsb" draft="provisional">sorbiano superior</language>
+ <language type="hy" draft="provisional">arménio</language>
+ <language type="ig" draft="provisional">igbo</language>
+ <language type="ilo" draft="provisional">iloko</language>
+ <language type="kbd" draft="provisional">kabardiano</language>
+ <language type="khi" draft="provisional">khoisan (outros)</language>
+ <language type="kho" draft="provisional">khotanês</language>
+ <language type="ki" draft="provisional">kikuyu</language>
+ <language type="kl" draft="provisional">kalaallisut</language>
+ <language type="km" draft="provisional">khmer</language>
+ <language type="lez" draft="provisional">lezghiano</language>
+ <language type="mh" draft="provisional">marsalhês</language>
+ <language type="mk" draft="provisional">macedónio</language>
+ <language type="mno" draft="provisional">idiomas manobo</language>
+ <language type="nah" draft="provisional">nauatle</language>
+ <language type="nic" draft="provisional">níger - kordofaniano (outros)</language>
+ <language type="nr" draft="provisional">ndebele do sul</language>
+ <language type="os" draft="provisional">ossético</language>
+ <language type="pl">polaco</language>
+ <language type="sl">esloveno</language>
+ <language type="ssa" draft="provisional">nilo-saariano (outros)</language>
+ <language type="st" draft="provisional">soto do sul</language>
+ <language type="ta" draft="provisional">tamil</language>
+ <language type="tet" draft="provisional">tetum</language>
+ <language type="tig" draft="provisional">tigre</language>
+ <language type="tut" draft="provisional">altaico (outros)</language>
+ <language type="tyv" draft="provisional">tuviniano</language>
+ <language type="wen" draft="provisional">idiomas sorbio</language>
+ </languages>
+ <scripts>
+ <script type="Armn" draft="provisional">arménio</script>
+ <script type="Bali" draft="provisional">Balinês</script>
+ <script type="Batk" draft="provisional">Batak</script>
+ <script type="Brah" draft="provisional">Brahmi</script>
+ <script type="Bugi" draft="provisional">Buginês</script>
+ <script type="Cyrs" draft="provisional">Cirílico (Eslavónico Sacro Antigo)</script>
+ <script type="Egyd" draft="provisional">Demótico egípcio</script>
+ <script type="Egyh" draft="provisional">Hierático egípcio</script>
+ <script type="Egyp" draft="provisional">Hieroglifos egípcios</script>
+ <script type="Geok" draft="provisional">Khutsuri (Asomtavruli e Nuskhuri)</script>
+ <script type="Glag" draft="provisional">Glagolítico</script>
+ <script type="Hmng" draft="provisional">Pahawh Hmong</script>
+ <script type="Hrkt" draft="provisional">Katakana ou Hiragana</script>
+ <script type="Hung" draft="provisional">Húngaro antigo</script>
+ <script type="Inds" draft="provisional">Indi (Harapan)</script>
+ <script type="Java" draft="provisional">Javanês</script>
+ <script type="Latf" draft="provisional">Latim (Fraktur)</script>
+ <script type="Latg" draft="provisional">Latim (Gaélico)</script>
+ <script type="Lepc" draft="provisional">Lepcha (Róng)</script>
+ <script type="Lina" draft="provisional">Linear A</script>
+ <script type="Linb" draft="provisional">Linear B</script>
+ <script type="Maya" draft="provisional">Hieroglifos maias</script>
+ <script type="Mlym" draft="provisional">Malaialam</script>
+ <script type="Phnx" draft="provisional">fenício</script>
+ <script type="Sylo" draft="provisional">Siloti Nagri</script>
+ <script type="Taml" draft="provisional">tamil</script>
+ </scripts>
+ <territories>
+ <territory type="AE">Emiratos Ãrabes Unidos</territory>
+ <territory type="AI" draft="provisional">Anguilha</territory>
+ <territory type="AM">Arménia</territory>
+ <territory type="AQ">Antárctica</territory>
+ <territory type="AX" draft="provisional">Ilhas Aland</territory>
+ <territory type="AZ">Azerbeijão</territory>
+ <territory type="BA">Bósnia-Herzegovina</territory>
+ <territory type="BJ">Benim</territory>
+ <territory type="BY">Bielorrússia</territory>
+ <territory type="CM">Camarões</territory>
+ <territory type="CX">Ilha do Natal</territory>
+ <territory type="CZ">República Checa</territory>
+ <territory type="EE">Estónia</territory>
+ <territory type="EG">Egipto</territory>
+ <territory type="EH">Sahara Ocidental</territory>
+ <territory type="ER">Eritreia</territory>
+ <territory type="FK">Ilhas Falkland</territory>
+ <territory type="GL">Gronelândia</territory>
+ <territory type="GS">Ilhas South Georgia e South Sandwich</territory>
+ <territory type="GW">Guiné-Bissau</territory>
+ <territory type="HK">Hong Kong - Região Administrativa Especial da China</territory>
+ <territory type="IR" draft="provisional">Irão</territory>
+ <territory type="KE">Quénia</territory>
+ <territory type="KG">Quirguizistão</territory>
+ <territory type="KN">Saint Kitts e Nevis</territory>
+ <territory type="KP">Coreia do Norte</territory>
+ <territory type="KR">Coreia do Sul</territory>
+ <territory type="KY">Ilhas Caimão</territory>
+ <territory type="KZ">Cazaquistão</territory>
+ <territory type="LA">Lao, República Popular Democrática</territory>
+ <territory type="LV">Letónia</territory>
+ <territory type="MC">Mónaco</territory>
+ <territory type="MD">Moldávia, República da</territory>
+ <territory type="MG">Madagáscar</territory>
+ <territory type="MK">Macedónia, República da</territory>
+ <territory type="MO">Macau - Região Administrativa Especial da China</territory>
+ <territory type="MP">Ilhas Mariana do Norte</territory>
+ <territory type="MU">Maurícias</territory>
+ <territory type="NC">Nova Caledónia</territory>
+ <territory type="PG">Papua Nova Guiné</territory>
+ <territory type="PL">Polónia</territory>
+ <territory type="PS">Território Palestiniano</territory>
+ <territory type="QO" draft="provisional">Outlying Oceania</territory>
+ <territory type="RE">Reunion</territory>
+ <territory type="RE" alt="proposed-u86-1" draft="provisional">Reunião</territory>
+ <territory type="RO">Roménia</territory>
+ <territory type="SC">Seicheles</territory>
+ <territory type="SG">Singapura</territory>
+ <territory type="SI">Eslovénia</territory>
+ <territory type="SM">São Marino</territory>
+ <territory type="TC">Ilhas Turcas e Caicos</territory>
+ <territory type="TD">Tchade</territory>
+ <territory type="TF">Territórios Franceses a Sul</territory>
+ <territory type="TJ">Tajiquistão</territory>
+ <territory type="TM">Turquemenistão</territory>
+ <territory type="UM">Ilhas Minor Outlying (E.U.A)</territory>
+ <territory type="UZ">Uzbaquistão</territory>
+ <territory type="VA">Santa Sé (Estado da Cidade do Vaticano)</territory>
+ <territory type="VC">Saint Vincent e Grenadines</territory>
+ <territory type="VG">Ilhas Virgin Britânicas</territory>
+ <territory type="VI">Ilhas Virgin E.U.A.</territory>
+ <territory type="VN">Vietname</territory>
+ <territory type="YE">Iémen</territory>
+ <territory type="ZW" draft="provisional">Zimbabwe</territory>
+ </territories>
+ <types>
+ <type type="direct" key="collation" draft="provisional">Ordem Directa</type>
+ <type type="phonebook" key="collation" draft="provisional">Ordem da Lista Telefónica</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US" draft="provisional">EUA</measurementSystemName>
+ <measurementSystemName type="metric" draft="provisional">Métrico</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <delimiters>
+ <quotationStart>‘</quotationStart>
+ <quotationEnd>’</quotationEnd>
+ <alternateQuotationStart>“</alternateQuotationStart>
+ <alternateQuotationEnd>â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy/MM/dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yy/MM/dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMdd" draft="provisional">MM/dd</dateFormatItem>
+ <dateFormatItem id="yyMMMEEEd" draft="provisional">EEE, d 'de' MMM 'de' yy</dateFormatItem>
+ <dateFormatItem id="yyMMMd" draft="provisional">d 'de' MMM 'de' yy</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">yyyy/MM</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="year">
+ <displayName draft="provisional">Ano</displayName>
+ </field>
+ <field type="month">
+ <displayName draft="provisional">Mês</displayName>
+ </field>
+ <field type="week">
+ <displayName draft="provisional">Semana</displayName>
+ </field>
+ <field type="day">
+ <displayName draft="provisional">Dia</displayName>
+ </field>
+ <field type="weekday">
+ <displayName draft="provisional">Dia da semana</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName draft="provisional">Período do dia</displayName>
+ </field>
+ <field type="hour">
+ <displayName draft="provisional">Hora</displayName>
+ </field>
+ <field type="minute">
+ <displayName draft="provisional">Minuto</displayName>
+ </field>
+ <field type="zone">
+ <displayName draft="provisional">Zona</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="America/Cuiaba">
+ <exemplarCity>Cuibá</exemplarCity>
+ </zone>
+ <zone type="America/Araguaina">
+ <exemplarCity>Araguaina</exemplarCity>
+ </zone>
+ <zone type="America/Bahia">
+ <exemplarCity>Baía</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity>Madrid</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>Ulan Bator</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>Cancun</exemplarCity>
+ </zone>
+ <zone type="Europe/Kaliningrad">
+ <exemplarCity>Kaliningrado</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moscovo</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>Sacalina</exemplarCity>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity>Center</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="AED">
+ <displayName draft="provisional">Dirham dos Emirados Ãrabes Unidos</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>Afeghani (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName draft="provisional">Afeghani</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName draft="provisional">Florim das Antilhas Holandesa</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName draft="provisional">Kwanza angolano</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName draft="provisional">Kwanza angolano (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName draft="provisional">Kwanza novo angolano (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName draft="provisional">Kwanza angolano reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName draft="provisional">Florim de Aruba</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>Cruzeiro novo brasileiro (1967-1986)</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName draft="provisional">Dólar das Fiji</displayName>
+ </currency>
+ <currency type="GHC">
+ <displayName draft="provisional">Cedi do Gana</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName draft="provisional">Dalasi da Gâmbia</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName draft="provisional">Franco da Guiné</displayName>
+ </currency>
+ <currency type="GNS">
+ <displayName draft="provisional">Syli da Guiné</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName draft="provisional">Ekwele da Guiné Equatorial</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName draft="provisional">Quetzal da Guatemala</displayName>
+ </currency>
+ <currency type="HNL">
+ <displayName draft="provisional">Lempira das Honduras</displayName>
+ </currency>
+ <currency type="KGS">
+ <displayName draft="provisional">Som do Quirguistão</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName draft="provisional">Dinar koweitiano</displayName>
+ </currency>
+ <currency type="LKR">
+ <displayName draft="provisional">Rupia do Sri Lanka</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName draft="provisional">Loti do Lesoto</displayName>
+ </currency>
+ <currency type="MAD">
+ <displayName draft="provisional">Dirham marroquino</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName draft="provisional">Leu da Moldávia</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName draft="provisional">Dinar macedónio</displayName>
+ </currency>
+ <currency type="MLF">
+ <displayName draft="provisional">Franco do Mali</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName draft="provisional">Kwacha do Malawi</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName draft="provisional">Florim holandês</displayName>
+ </currency>
+ <currency type="PLN">
+ <displayName draft="provisional">Zloti polaco</displayName>
+ </currency>
+ <currency type="PLZ">
+ <displayName draft="provisional">Zloti polaco (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <pattern>#,##0.00 ¤;-#,##0.00 ¤</pattern>
+ <decimal>$</decimal>
+ <group>,</group>
+ </currency>
+ <currency type="QAR">
+ <displayName draft="provisional">Rial do Qatar</displayName>
+ </currency>
+ <currency type="SGD">
+ <displayName draft="provisional">Dólar de Singapura</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName draft="provisional">Florim do Suriname</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName draft="provisional">Unidade Composta Europeia</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName draft="provisional">Unidade Monetária Europeia</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName draft="provisional">Unidade de Conta Europeia (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName draft="provisional">Unidade de Conta Europeia (XBD)</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName draft="provisional">Unidade da Moeda Europeia</displayName>
+ </currency>
+ <currency type="YUD">
+ <displayName draft="provisional">Dinar forte jugoslavo</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName draft="provisional">Super Dinar jugoslavo</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName draft="provisional">Dinar conversível jugoslavo</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName draft="provisional">Kwacha da Zâmbia</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName draft="provisional">Dólar do Zimbabwe</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ro.xml b/libs/Zend/Locale/Data/ro.xml
new file mode 100755
index 0000000000..962fdb3f8f
--- /dev/null
+++ b/libs/Zend/Locale/Data/ro.xml
@@ -0,0 +1,534 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.66 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ro"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar">Arabă</language>
+ <language type="bg">Bulgară</language>
+ <language type="cs">Cehă</language>
+ <language type="da">Daneză</language>
+ <language type="de">Germană</language>
+ <language type="el">Greacă</language>
+ <language type="en">Engleză</language>
+ <language type="es">Spaniolă</language>
+ <language type="et">Estoniană</language>
+ <language type="fi">Finlandeză</language>
+ <language type="fr">Franceză</language>
+ <language type="he">Ebraică</language>
+ <language type="hr">Croată</language>
+ <language type="hu">Maghiară</language>
+ <language type="it">Italiană</language>
+ <language type="ja">Japoneză</language>
+ <language type="ko">Coreeană</language>
+ <language type="lt">Lituaniană</language>
+ <language type="lv">Letonă</language>
+ <language type="nl">Olandeză</language>
+ <language type="no">Norvegiană</language>
+ <language type="pl">Poloneză</language>
+ <language type="pt">Portugheză</language>
+ <language type="ro">Română</language>
+ <language type="ru">Rusă</language>
+ <language type="sk">Slovacă</language>
+ <language type="sl">Slovenă</language>
+ <language type="sv">Suedeză</language>
+ <language type="tr">Turcă</language>
+ <language type="zh">Chineză</language>
+ </languages>
+ <territories>
+ <territory type="001">Lume</territory>
+ <territory type="005">America de Sud</territory>
+ <territory type="011">Africa occidentală</territory>
+ <territory type="013">America centrală</territory>
+ <territory type="014">Africa orientală</territory>
+ <territory type="015">Africa septentrională</territory>
+ <territory type="017">Africa centrală</territory>
+ <territory type="018">Africa australă</territory>
+ <territory type="019">Americi</territory>
+ <territory type="021">America de Nord</territory>
+ <territory type="029">Caraibe</territory>
+ <territory type="030">Asia orientală</territory>
+ <territory type="035">Asia de Sud-Est</territory>
+ <territory type="039">Europa meridională</territory>
+ <territory type="053">Australia și Noua Zeelandă</territory>
+ <territory type="054">Melanezia</territory>
+ <territory type="057">Micronezia</territory>
+ <territory type="061">Polinezia</territory>
+ <territory type="062">Asia centrala și de Sud</territory>
+ <territory type="145">Asia occidentală</territory>
+ <territory type="150">Europa</territory>
+ <territory type="151">Europa de Est</territory>
+ <territory type="154">Europa septentrională</territory>
+ <territory type="155">Europa occidentală</territory>
+ <territory type="830">Insulele Anglo-Normande</territory>
+ <territory type="AD">Andora</territory>
+ <territory type="AE">Emiratele Arabe Unite</territory>
+ <territory type="AF">Afganistan</territory>
+ <territory type="AG">Antigua și Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albania</territory>
+ <territory type="AM">Armenia</territory>
+ <territory type="AN">Antilele Olandeze</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarctica</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">Samoa Americană</territory>
+ <territory type="AT">Austria</territory>
+ <territory type="AU">Australia</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Insulele Aland</territory>
+ <territory type="AZ">Azerbaidjan</territory>
+ <territory type="BA">Bosnia și Herzegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BE">Belgia</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgaria</territory>
+ <territory type="BH">Bahrain</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei</territory>
+ <territory type="BO">Bolivia</territory>
+ <territory type="BR">Brazilia</territory>
+ <territory type="BS">Bahamas</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BV">Insula Bouvet</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Bielorusia</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Canada</territory>
+ <territory type="CC">Insulele Cocos (Keeling)</territory>
+ <territory type="CD">Congo, Republica Democratică</territory>
+ <territory type="CF">Republica Central Africană</territory>
+ <territory type="CG">Congo</territory>
+ <territory type="CH">Eleveția</territory>
+ <territory type="CI">Coasta de FildeÈ™</territory>
+ <territory type="CK">Insulele Cook</territory>
+ <territory type="CL">Chile</territory>
+ <territory type="CM">Camerun</territory>
+ <territory type="CN">China</territory>
+ <territory type="CO">Columbia</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS">Serbia și Muntenegru</territory>
+ <territory type="CU">Cuba</territory>
+ <territory type="CV">Capul Verde</territory>
+ <territory type="CX">Insula Christmas</territory>
+ <territory type="CY">Cipru</territory>
+ <territory type="CZ">Republica Cehă</territory>
+ <territory type="DE">Germania</territory>
+ <territory type="DJ">Djibouti</territory>
+ <territory type="DK">Danemarca</territory>
+ <territory type="DM">Dominica</territory>
+ <territory type="DO">Republica Dominicană</territory>
+ <territory type="DZ">Algeria</territory>
+ <territory type="EC">Ecuador</territory>
+ <territory type="EE">Estonia</territory>
+ <territory type="EG">Egipt</territory>
+ <territory type="EH">Sahara de Vest</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Spania</territory>
+ <territory type="ET">Etiopia</territory>
+ <territory type="FI">Finlanda</territory>
+ <territory type="FJ">Fiji</territory>
+ <territory type="FK">Insulele Falkland</territory>
+ <territory type="FM">Micronezia, Statele Federate</territory>
+ <territory type="FO">Insulele Feroe</territory>
+ <territory type="FR">Franța</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB" draft="unconfirmed">Regatul Unit</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Georgia</territory>
+ <territory type="GF">Guyana Franceză</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Groenlanda</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guineea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Guineea Ecuatorială</territory>
+ <territory type="GR">Grecia</territory>
+ <territory type="GS">Insulele South Georgia și South Sandwich</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guineea-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">R.A.S. Hong Kong a Chinei</territory>
+ <territory type="HM">Insula Heard și Insulele McDonald</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Croația</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Ungaria</territory>
+ <territory type="ID">Indonezia</territory>
+ <territory type="IE">Irlanda</territory>
+ <territory type="IL">Israel</territory>
+ <territory type="IN">India</territory>
+ <territory type="IO">Teritoriile Britanice din Oceanul Indian</territory>
+ <territory type="IQ">Iraq</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Islanda</territory>
+ <territory type="IT">Italia</territory>
+ <territory type="JM">Jamaica</territory>
+ <territory type="JO">Iordania</territory>
+ <territory type="JP">Japonia</territory>
+ <territory type="KE">Kenya</territory>
+ <territory type="KG">Kirghizia</territory>
+ <territory type="KH">Cambodgia</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Comoros</territory>
+ <territory type="KN">Saint Kitts și Nevis</territory>
+ <territory type="KP">Coreea de Nord</territory>
+ <territory type="KR">Coreea de Sud</territory>
+ <territory type="KW">Kuweit</territory>
+ <territory type="KY">Insulele Cayman</territory>
+ <territory type="KZ">Kazahstan</territory>
+ <territory type="LA">Lao, Republica Democratică Populară</territory>
+ <territory type="LB">Liban</territory>
+ <territory type="LC">Saint Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberia</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Lituania</territory>
+ <territory type="LU">Luxemburg</territory>
+ <territory type="LV">Letonia</territory>
+ <territory type="LY">Libia, Jamahiriya Arabă</territory>
+ <territory type="MA">Maroc</territory>
+ <territory type="MC">Monaco</territory>
+ <territory type="MD">Moldova, Republica</territory>
+ <territory type="MG">Madagascar</territory>
+ <territory type="MH">Insulele Marshall</territory>
+ <territory type="MK">Macedonia</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongolia</territory>
+ <territory type="MO">R.A.S. Macao a Chinei</territory>
+ <territory type="MP">Insulele Northern Mariana</territory>
+ <territory type="MQ">Martinica</territory>
+ <territory type="MR">Mauritania</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Maldive</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Mexic</territory>
+ <territory type="MY">Malaezia</territory>
+ <territory type="MZ">Mozambic</territory>
+ <territory type="NA">Namibia</territory>
+ <territory type="NC">Noua Caledonie</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Insulele Norfolk</territory>
+ <territory type="NG">Nigeria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Olanda</territory>
+ <territory type="NO">Norvegia</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Noua Zeelandă</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Polinezia Franceză</territory>
+ <territory type="PG">Papua Noua Guinee</territory>
+ <territory type="PH">Filipine</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Polonia</territory>
+ <territory type="PM">Saint Pierre și Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Porto Rico</territory>
+ <territory type="PS">Teritoriul Palestinian</territory>
+ <territory type="PT">Portugalia</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Qatar</territory>
+ <territory type="QO">Altă Oceania</territory>
+ <territory type="RE">Reunion</territory>
+ <territory type="RO">România</territory>
+ <territory type="RU">Federația Rusă</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Arabia Saudită</territory>
+ <territory type="SB">Insulele Solomon</territory>
+ <territory type="SC">Seychelles</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Suedia</territory>
+ <territory type="SG">Singapore</territory>
+ <territory type="SH">Saint Helena</territory>
+ <territory type="SI">Slovenia</territory>
+ <territory type="SJ">Svalbard și Jan Mayen</territory>
+ <territory type="SK">Slovacia</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalia</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">Sao Tome și Principe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Siria</territory>
+ <territory type="SZ">Swaziland</territory>
+ <territory type="TC">Insulele Turks și Caicos</territory>
+ <territory type="TD">Ciad</territory>
+ <territory type="TF">Teritoriile Franceze de Sud</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Tailanda</territory>
+ <territory type="TJ">Tadjikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Timorul de Est</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunisia</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turcia</territory>
+ <territory type="TT">Trinidad ÅŸi Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TZ">Tanzania</territory>
+ <territory type="UA">Ucraina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">United States Minor Outlying Islands</territory>
+ <territory type="US">Statele Unite</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Uzbekistan</territory>
+ <territory type="VA">Sfântul Scaun (Statul Vatican)</territory>
+ <territory type="VC">Saint Vincent ÅŸi Grenadines</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Insulele Virgine Britanice</territory>
+ <territory type="VI">Insulele Virgine S.U.A.</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis ÅŸi Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Yemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Africa de Sud</territory>
+ <territory type="ZM">Zambia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a ă â b-i î j-p r s ș t ț u-x z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[q w y]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Ian</month>
+ <month type="2">Feb</month>
+ <month type="3">Mar</month>
+ <month type="4">Apr</month>
+ <month type="5">Mai</month>
+ <month type="6">Iun</month>
+ <month type="7">Iul</month>
+ <month type="8">Aug</month>
+ <month type="9">Sep</month>
+ <month type="10">Oct</month>
+ <month type="11">Nov</month>
+ <month type="12">Dec</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">ianuarie</month>
+ <month type="2">februarie</month>
+ <month type="3">martie</month>
+ <month type="4">aprilie</month>
+ <month type="5">mai</month>
+ <month type="6">iunie</month>
+ <month type="7">iulie</month>
+ <month type="8">august</month>
+ <month type="9">septembrie</month>
+ <month type="10">octombrie</month>
+ <month type="11">noiembrie</month>
+ <month type="12">decembrie</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">I</month>
+ <month type="2">F</month>
+ <month type="3">M</month>
+ <month type="4">A</month>
+ <month type="5">M</month>
+ <month type="6">I</month>
+ <month type="7">I</month>
+ <month type="8">A</month>
+ <month type="9">S</month>
+ <month type="10">O</month>
+ <month type="11">N</month>
+ <month type="12">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">D</day>
+ <day type="mon">L</day>
+ <day type="tue">Ma</day>
+ <day type="wed">Mi</day>
+ <day type="thu">J</day>
+ <day type="fri">V</day>
+ <day type="sat">S</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">duminică</day>
+ <day type="mon">luni</day>
+ <day type="tue">marți</day>
+ <day type="wed">miercuri</day>
+ <day type="thu">joi</day>
+ <day type="fri">vineri</day>
+ <day type="sat">sîmbătă</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">D</day>
+ <day type="mon">L</day>
+ <day type="tue">M</day>
+ <day type="wed">M</day>
+ <day type="thu">J</day>
+ <day type="fri">V</day>
+ <day type="sat">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">T1</quarter>
+ <quarter type="2" draft="unconfirmed">T2</quarter>
+ <quarter type="3" draft="unconfirmed">T3</quarter>
+ <quarter type="4" draft="unconfirmed">T4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">trimestrul 1</quarter>
+ <quarter type="2" draft="unconfirmed">trimestrul 2</quarter>
+ <quarter type="3" draft="unconfirmed">trimestrul 3</quarter>
+ <quarter type="4" draft="unconfirmed">trimestrul 4</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraAbbr>
+ <era type="0">d.C.</era>
+ <era type="1">î.d.C.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd.MM.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd.MM.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd.MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM.yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Polul Sud</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>Canare</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>Londra</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>Azore</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lisabona</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moscova</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>Ekaterinburg</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity>Irkuțk</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>Yakuțk</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>Sahalin</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>Kamciatka</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>Zaporoje</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">Real brazilian</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="unconfirmed">Yuan Renminbi chinezesc</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">Liră sterlină britanică</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">Rupie indiană</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="unconfirmed">Yen japonez</displayName>
+ </currency>
+ <currency type="ROL">
+ <symbol draft="unconfirmed">lei</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">Rublă rusească</displayName>
+ </currency>
+ <currency type="TRY">
+ <displayName draft="unconfirmed">Noua liră turcească</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">Dolar SUA</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>da:d</yesstr>
+ <nostr>nu:n</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ro_RO.xml b/libs/Zend/Locale/Data/ro_RO.xml
new file mode 100755
index 0000000000..f2338b11bc
--- /dev/null
+++ b/libs/Zend/Locale/Data/ro_RO.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ro"/>
+ <territory type="RO"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">„</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/root.xml b/libs/Zend/Locale/Data/root.xml
new file mode 100755
index 0000000000..ed4e3a791e
--- /dev/null
+++ b/libs/Zend/Locale/Data/root.xml
@@ -0,0 +1,877 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.84 $"/>
+ <generation date="$Date: 2006/06/29 15:44:37 $"/>
+ <language type="root"/>
+ </identity>
+ <localeDisplayNames>
+ <measurementSystemNames>
+ <measurementSystemName type="US">US</measurementSystemName>
+ <measurementSystemName type="metric">Metric</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <layout>
+ <orientation draft="unconfirmed"/>
+ </layout>
+ <characters>
+ <exemplarCharacters>[]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>“</quotationStart>
+ <quotationEnd>â€</quotationEnd>
+ <alternateQuotationStart>‘</alternateQuotationStart>
+ <alternateQuotationEnd>’</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <localizedPatternChars>GyMdkHmsSEDFwWahKzYeugAZvcL</localizedPatternChars>
+ <calendars>
+ <default choice="gregorian"/>
+ <calendar type="buddhist">
+ <eras>
+ <eraAbbr>
+ <era type="0">BE</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <default choice="medium"/>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, MMMM d, yyyy G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>MMMM d, yyyy G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>MMM d, yyyy G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>M/d/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/timeFormats"/>
+ </timeFormats>
+ <dateTimeFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/dateTimeFormats"/>
+ </dateTimeFormats>
+ </calendar>
+ <calendar type="chinese">
+ <dateFormats>
+ <default choice="medium"/>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE y'x'G-Ml-d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>y'x'G-Ml-d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>y'x'G-Ml-d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>y'x'G-Ml-d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/timeFormats"/>
+ </timeFormats>
+ <dateTimeFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/dateTimeFormats"/>
+ </dateTimeFormats>
+ </calendar>
+ <calendar type="coptic">
+ <months>
+ <default choice="format" draft="unconfirmed"/>
+ <monthContext type="format">
+ <default choice="wide" draft="unconfirmed"/>
+ <monthWidth type="abbreviated">
+ <alias source="locale" path="../monthWidth[@type='wide']" draft="unconfirmed"/>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Tout</month>
+ <month type="2" draft="unconfirmed">Baba</month>
+ <month type="3" draft="unconfirmed">Hator</month>
+ <month type="4" draft="unconfirmed">Kiahk</month>
+ <month type="5" draft="unconfirmed">Toba</month>
+ <month type="6" draft="unconfirmed">Amshir</month>
+ <month type="7" draft="unconfirmed">Baramhat</month>
+ <month type="8" draft="unconfirmed">Baramouda</month>
+ <month type="9" draft="unconfirmed">Bashans</month>
+ <month type="10" draft="unconfirmed">Paona</month>
+ <month type="11" draft="unconfirmed">Epep</month>
+ <month type="12" draft="unconfirmed">Mesra</month>
+ <month type="13" draft="unconfirmed">Nasie</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">ERA0</era>
+ <era type="1" draft="unconfirmed">ERA1</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/dateFormats" draft="unconfirmed"/>
+ </dateFormats>
+ <timeFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/timeFormats" draft="unconfirmed"/>
+ </timeFormats>
+ <dateTimeFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/dateTimeFormats" draft="unconfirmed"/>
+ </dateTimeFormats>
+ </calendar>
+ <calendar type="ethiopic">
+ <months>
+ <default choice="format" draft="unconfirmed"/>
+ <monthContext type="format">
+ <default choice="wide" draft="unconfirmed"/>
+ <monthWidth type="abbreviated">
+ <alias source="locale" path="../monthWidth[@type='wide']" draft="unconfirmed"/>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Meskerem</month>
+ <month type="2" draft="unconfirmed">Tekemt</month>
+ <month type="3" draft="unconfirmed">Hedar</month>
+ <month type="4" draft="unconfirmed">Tahsas</month>
+ <month type="5" draft="unconfirmed">Ter</month>
+ <month type="6" draft="unconfirmed">Yekatit</month>
+ <month type="7" draft="unconfirmed">Megabit</month>
+ <month type="8" draft="unconfirmed">Miazia</month>
+ <month type="9" draft="unconfirmed">Genbot</month>
+ <month type="10" draft="unconfirmed">Sene</month>
+ <month type="11" draft="unconfirmed">Hamle</month>
+ <month type="12" draft="unconfirmed">Nehasse</month>
+ <month type="13" draft="unconfirmed">Pagumen</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">ERA0</era>
+ <era type="1" draft="unconfirmed">ERA1</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/dateFormats"/>
+ </dateFormats>
+ <timeFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/timeFormats"/>
+ </timeFormats>
+ <dateTimeFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/dateTimeFormats"/>
+ </dateTimeFormats>
+ </calendar>
+ <calendar type="gregorian">
+ <months>
+ <default choice="format"/>
+ <monthContext type="format">
+ <default choice="wide"/>
+ <monthWidth type="abbreviated">
+ <alias source="locale" path="../monthWidth[@type='wide']"/>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">1</month>
+ <month type="2">2</month>
+ <month type="3">3</month>
+ <month type="4">4</month>
+ <month type="5">5</month>
+ <month type="6">6</month>
+ <month type="7">7</month>
+ <month type="8">8</month>
+ <month type="9">9</month>
+ <month type="10">10</month>
+ <month type="11">11</month>
+ <month type="12">12</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">1</month>
+ <month type="2">2</month>
+ <month type="3">3</month>
+ <month type="4">4</month>
+ <month type="5">5</month>
+ <month type="6">6</month>
+ <month type="7">7</month>
+ <month type="8">8</month>
+ <month type="9">9</month>
+ <month type="10">10</month>
+ <month type="11">11</month>
+ <month type="12">12</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <default choice="format"/>
+ <dayContext type="format">
+ <default choice="wide"/>
+ <dayWidth type="abbreviated">
+ <day type="sun">1</day>
+ <day type="mon">2</day>
+ <day type="tue">3</day>
+ <day type="wed">4</day>
+ <day type="thu">5</day>
+ <day type="fri">6</day>
+ <day type="sat">7</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">1</day>
+ <day type="mon">2</day>
+ <day type="tue">3</day>
+ <day type="wed">4</day>
+ <day type="thu">5</day>
+ <day type="fri">6</day>
+ <day type="sat">7</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">1</day>
+ <day type="mon">2</day>
+ <day type="tue">3</day>
+ <day type="wed">4</day>
+ <day type="thu">5</day>
+ <day type="fri">6</day>
+ <day type="sat">7</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">Q1</quarter>
+ <quarter type="2">Q2</quarter>
+ <quarter type="3">Q3</quarter>
+ <quarter type="4">Q4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">Q1</quarter>
+ <quarter type="2">Q2</quarter>
+ <quarter type="3">Q3</quarter>
+ <quarter type="4">Q4</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>AM</am>
+ <pm>PM</pm>
+ <eras>
+ <eraNames>
+ <alias source="locale" path="../eraAbbr"/>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">BCE</era>
+ <era type="1">CE</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <default choice="medium"/>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, yyyy MMMM dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>yyyy MMMM d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy MMM d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yy/MM/dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <default choice="medium"/>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>HH:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>HH:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <dateTimeFormatLength>
+ <dateTimeFormat>
+ <pattern>{1} {0}</pattern>
+ </dateTimeFormat>
+ </dateTimeFormatLength>
+ <availableFormats>
+ <dateFormatItem id="yyQ" draft="provisional">Q yy</dateFormatItem>
+ </availableFormats>
+ <appendItems>
+ <appendItem request="Day">{0} ({2}: {1})</appendItem>
+ <appendItem request="Day-Of-Week">{0} {1}</appendItem>
+ <appendItem request="Era">{0} {1}</appendItem>
+ <appendItem request="Hour">{0} ({2}: {1})</appendItem>
+ <appendItem request="Minute">{0} ({2}: {1})</appendItem>
+ <appendItem request="Month">{0} ({2}: {1})</appendItem>
+ <appendItem request="Quarter">{0} ({2}: {1})</appendItem>
+ <appendItem request="Second">{0} ({2}: {1})</appendItem>
+ <appendItem request="Timezone">{0} {1}</appendItem>
+ <appendItem request="Week">{0} ({2}: {1})</appendItem>
+ <appendItem request="Year">{0} {1}</appendItem>
+ </appendItems>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName>Era</displayName>
+ </field>
+ <field type="year">
+ <displayName>Year</displayName>
+ </field>
+ <field type="month">
+ <displayName>Month</displayName>
+ </field>
+ <field type="week">
+ <displayName>Week</displayName>
+ </field>
+ <field type="day">
+ <displayName>Day</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>Day of the Week</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName>Dayperiod</displayName>
+ </field>
+ <field type="hour">
+ <displayName>Hour</displayName>
+ </field>
+ <field type="minute">
+ <displayName>Minute</displayName>
+ </field>
+ <field type="second">
+ <displayName>Second</displayName>
+ </field>
+ <field type="zone">
+ <displayName>Zone</displayName>
+ </field>
+ </fields>
+ </calendar>
+ <calendar type="hebrew">
+ <months>
+ <default choice="format"/>
+ <monthContext type="format">
+ <default choice="wide"/>
+ <monthWidth type="abbreviated">
+ <alias source="locale" path="../monthWidth[@type='wide']"/>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Tishri</month>
+ <month type="2">Heshvan</month>
+ <month type="3">Kislev</month>
+ <month type="4">Tevet</month>
+ <month type="5">Shevat</month>
+ <month type="6">Adar I</month>
+ <month type="7">Adar</month>
+ <month type="8">Nisan</month>
+ <month type="9">Iyar</month>
+ <month type="10">Sivan</month>
+ <month type="11">Tamuz</month>
+ <month type="12">Av</month>
+ <month type="13">Elul</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <eras>
+ <eraAbbr>
+ <era type="0">AM</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ <calendar type="islamic">
+ <months>
+ <default choice="format"/>
+ <monthContext type="format">
+ <default choice="wide"/>
+ <monthWidth type="abbreviated">
+ <alias source="locale" path="../monthWidth[@type='wide']"/>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Muharram</month>
+ <month type="2">Safar</month>
+ <month type="3">RabiÊ» I</month>
+ <month type="4">RabiÊ» II</month>
+ <month type="5">Jumada I</month>
+ <month type="6">Jumada II</month>
+ <month type="7">Rajab</month>
+ <month type="8">Shaʻban</month>
+ <month type="9">Ramadan</month>
+ <month type="10">Shawwal</month>
+ <month type="11">Dhuʻl-Qiʻdah</month>
+ <month type="12">Dhuʻl-Hijjah</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <eras>
+ <eraAbbr>
+ <era type="0">AH</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/dateFormats"/>
+ </dateFormats>
+ <timeFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/timeFormats"/>
+ </timeFormats>
+ <dateTimeFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/dateTimeFormats"/>
+ </dateTimeFormats>
+ </calendar>
+ <calendar type="islamic-civil">
+ <alias source="locale" path="../calendar[@type='islamic']"/>
+ </calendar>
+ <calendar type="japanese">
+ <eras>
+ <eraAbbr>
+ <era type="0">Taika</era>
+ <era type="1">Hakuchi</era>
+ <era type="2">HakuhÅ</era>
+ <era type="3">ShuchÅ</era>
+ <era type="4">TaihÅ</era>
+ <era type="5">Keiun</era>
+ <era type="6">WadÅ</era>
+ <era type="7">Reiki</era>
+ <era type="8">YÅrÅ</era>
+ <era type="9">Jinki</era>
+ <era type="10">TempyÅ</era>
+ <era type="11">TempyÅ-kampÅ</era>
+ <era type="12">TempyÅ-shÅhÅ</era>
+ <era type="13">TempyÅ-hÅji</era>
+ <era type="14">TemphÅ-jingo</era>
+ <era type="15">Jingo-keiun</era>
+ <era type="16">HÅki</era>
+ <era type="17">Ten-Å</era>
+ <era type="18">Enryaku</era>
+ <era type="19">DaidÅ</era>
+ <era type="20">KÅnin</era>
+ <era type="21">TenchÅ</era>
+ <era type="22">ShÅwa</era>
+ <era type="23">KajÅ</era>
+ <era type="24">Ninju</era>
+ <era type="25">Saiko</era>
+ <era type="26">Tennan</era>
+ <era type="27">JÅgan</era>
+ <era type="28">Genkei</era>
+ <era type="29">Ninna</era>
+ <era type="30">KampyÅ</era>
+ <era type="31">ShÅtai</era>
+ <era type="32">Engi</era>
+ <era type="33">EnchÅ</era>
+ <era type="34">ShÅhei</era>
+ <era type="35">TengyÅ</era>
+ <era type="36">Tenryaku</era>
+ <era type="37">Tentoku</era>
+ <era type="38">ÅŒwa</era>
+ <era type="39">KÅhÅ</era>
+ <era type="40">Anna</era>
+ <era type="41">Tenroku</era>
+ <era type="42">Ten-en</era>
+ <era type="43">JÅgen</era>
+ <era type="44">Tengen</era>
+ <era type="45">Eikan</era>
+ <era type="46">Kanna</era>
+ <era type="47">Ei-en</era>
+ <era type="48">Eiso</era>
+ <era type="49">ShÅryaku</era>
+ <era type="50">ChÅtoku</era>
+ <era type="51">ChÅhÅ</era>
+ <era type="52">KankÅ</era>
+ <era type="53">ChÅwa</era>
+ <era type="54">Kannin</era>
+ <era type="55">Jian</era>
+ <era type="56">Manju</era>
+ <era type="57">ChÅgen</era>
+ <era type="58">ChÅryaku</era>
+ <era type="59">ChÅkyÅ«</era>
+ <era type="60">Kantoku</era>
+ <era type="61">EishÅ</era>
+ <era type="62">Tengi</era>
+ <era type="63">KÅhei</era>
+ <era type="64">Jiryaku</era>
+ <era type="65">Enkyū</era>
+ <era type="66">ShÅho</era>
+ <era type="67">ShÅryaku</era>
+ <era type="68">Eiho</era>
+ <era type="69">ÅŒtoku</era>
+ <era type="70">Kanji</era>
+ <era type="71">Kaho</era>
+ <era type="72">EichÅ</era>
+ <era type="73">ShÅtoku</era>
+ <era type="74">KÅwa</era>
+ <era type="75">ChÅji</era>
+ <era type="76">KashÅ</era>
+ <era type="77">Tennin</era>
+ <era type="78">Ten-ei</era>
+ <era type="79">Eikyū</era>
+ <era type="80">Gen-ei</era>
+ <era type="81">Hoan</era>
+ <era type="82">Tenji</era>
+ <era type="83">Daiji</era>
+ <era type="84">TenshÅ</era>
+ <era type="85">ChÅshÅ</era>
+ <era type="86">Hoen</era>
+ <era type="87">Eiji</era>
+ <era type="88">KÅji</era>
+ <era type="89">TenyÅ</era>
+ <era type="90">Kyūan</era>
+ <era type="91">Ninpei</era>
+ <era type="92">Kyūju</era>
+ <era type="93">Hogen</era>
+ <era type="94">Heiji</era>
+ <era type="95">Eiryaku</era>
+ <era type="96">ÅŒho</era>
+ <era type="97">ChÅkan</era>
+ <era type="98">Eiman</era>
+ <era type="99">Nin-an</era>
+ <era type="100">KaÅ</era>
+ <era type="101">ShÅan</era>
+ <era type="102">Angen</era>
+ <era type="103">JishÅ</era>
+ <era type="104">YÅwa</era>
+ <era type="105">Juei</era>
+ <era type="106">Genryuku</era>
+ <era type="107">Bunji</era>
+ <era type="108">Kenkyū</era>
+ <era type="109">ShÅji</era>
+ <era type="110">Kennin</era>
+ <era type="111">Genkyū</era>
+ <era type="112">Ken-ei</era>
+ <era type="113">ShÅgen</era>
+ <era type="114">Kenryaku</era>
+ <era type="115">KenpÅ</era>
+ <era type="116">ShÅkyÅ«</era>
+ <era type="117">JÅÅ</era>
+ <era type="118">Gennin</era>
+ <era type="119">Karoku</era>
+ <era type="120">Antei</era>
+ <era type="121">Kanki</era>
+ <era type="122">JÅei</era>
+ <era type="123">Tempuku</era>
+ <era type="124">Bunryaku</era>
+ <era type="125">Katei</era>
+ <era type="126">Ryakunin</era>
+ <era type="127">En-Å</era>
+ <era type="128">Ninji</era>
+ <era type="129">Kangen</era>
+ <era type="130">HÅji</era>
+ <era type="131">KenchÅ</era>
+ <era type="132">KÅgen</era>
+ <era type="133">ShÅka</era>
+ <era type="134">ShÅgen</era>
+ <era type="135">Bun-Å</era>
+ <era type="136">KÅchÅ</era>
+ <era type="137">Bun-ei</era>
+ <era type="138">Kenji</era>
+ <era type="139">KÅan</era>
+ <era type="140">ShÅÅ</era>
+ <era type="141">Einin</era>
+ <era type="142">ShÅan</era>
+ <era type="143">Kengen</era>
+ <era type="144">Kagen</era>
+ <era type="145">Tokuji</era>
+ <era type="146">Enkei</era>
+ <era type="147">ÅŒchÅ</era>
+ <era type="148">ShÅwa</era>
+ <era type="149">BunpÅ</era>
+ <era type="150">GenÅ</era>
+ <era type="151">GenkyÅ</era>
+ <era type="152">ShÅchÅ«</era>
+ <era type="153">Kareki</era>
+ <era type="154">Gentoku</era>
+ <era type="155">GenkÅ</era>
+ <era type="156">Kemmu</era>
+ <era type="157">Engen</era>
+ <era type="158">KÅkoku</era>
+ <era type="159">ShÅhei</era>
+ <era type="160">Kentoku</era>
+ <era type="161">Bunchũ</era>
+ <era type="162">Tenju</era>
+ <era type="163">KÅryaku</era>
+ <era type="164">KÅwa</era>
+ <era type="165">Genchũ</era>
+ <era type="166">Meitoku</era>
+ <era type="167">Kakei</era>
+ <era type="168">KÅÅ</era>
+ <era type="169">Meitoku</era>
+ <era type="170">ÅŒei</era>
+ <era type="171">ShÅchÅ</era>
+ <era type="172">EikyÅ</era>
+ <era type="173">Kakitsu</era>
+ <era type="174">Bun-an</era>
+ <era type="175">HÅtoku</era>
+ <era type="176">KyÅtoku</era>
+ <era type="177">KÅshÅ</era>
+ <era type="178">ChÅroku</era>
+ <era type="179">KanshÅ</era>
+ <era type="180">BunshÅ</era>
+ <era type="181">ÅŒnin</era>
+ <era type="182">Bunmei</era>
+ <era type="183">ChÅkyÅ</era>
+ <era type="184">Entoku</era>
+ <era type="185">MeiÅ</era>
+ <era type="186">Bunki</era>
+ <era type="187">EishÅ</era>
+ <era type="188">Taiei</era>
+ <era type="189">KyÅroku</era>
+ <era type="190">Tenmon</era>
+ <era type="191">KÅji</era>
+ <era type="192">Eiroku</era>
+ <era type="193">Genki</era>
+ <era type="194">TenshÅ</era>
+ <era type="195">Bunroku</era>
+ <era type="196">KeichÅ</era>
+ <era type="197">Genwa</era>
+ <era type="198">Kan-ei</era>
+ <era type="199">ShÅho</era>
+ <era type="200">Keian</era>
+ <era type="201">ShÅÅ</era>
+ <era type="202">Meiryaku</era>
+ <era type="203">Manji</era>
+ <era type="204">Kanbun</era>
+ <era type="205">EnpÅ</era>
+ <era type="206">Tenwa</era>
+ <era type="207">JÅkyÅ</era>
+ <era type="208">Genroku</era>
+ <era type="209">HÅei</era>
+ <era type="210">ShÅtoku</era>
+ <era type="211">KyÅhÅ</era>
+ <era type="212">Genbun</era>
+ <era type="213">KanpÅ</era>
+ <era type="214">EnkyÅ</era>
+ <era type="215">Kan-en</era>
+ <era type="216">HÅryaku</era>
+ <era type="217">Meiwa</era>
+ <era type="218">An-ei</era>
+ <era type="219">Tenmei</era>
+ <era type="220">Kansei</era>
+ <era type="221">KyÅwa</era>
+ <era type="222">Bunka</era>
+ <era type="223">Bunsei</era>
+ <era type="224">TenpÅ</era>
+ <era type="225">KÅka</era>
+ <era type="226">Kaei</era>
+ <era type="227">Ansei</era>
+ <era type="228">Man-en</era>
+ <era type="229">Bunkyū</era>
+ <era type="230">Genji</era>
+ <era type="231">KeiÅ</era>
+ <era type="232">Meiji</era>
+ <era type="233">TaishÅ</era>
+ <era type="234">ShÅwa</era>
+ <era type="235">Heisei</era>
+ </eraAbbr>
+ <eraNarrow>
+ <era type="232" draft="unconfirmed">M</era>
+ <era type="233" draft="unconfirmed">T</era>
+ <era type="234" draft="unconfirmed">S</era>
+ <era type="235" draft="unconfirmed">H</era>
+ </eraNarrow>
+ </eras>
+ <dateFormats>
+ <default choice="medium"/>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, MMMM d, y G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>MMMM d, y G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>MMM d, y G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>M/d/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/timeFormats"/>
+ </timeFormats>
+ <dateTimeFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/dateTimeFormats"/>
+ </dateTimeFormats>
+ </calendar>
+ <calendar type="persian">
+ <months>
+ <default choice="format" draft="unconfirmed"/>
+ <monthContext type="format">
+ <default choice="wide" draft="unconfirmed"/>
+ <monthWidth type="abbreviated">
+ <alias source="locale" path="../monthWidth[@type='wide']" draft="unconfirmed"/>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Farvardin</month>
+ <month type="2">Ordibehesht</month>
+ <month type="3">Khordad</month>
+ <month type="4">Tir</month>
+ <month type="5">Mordad</month>
+ <month type="6">Shahrivar</month>
+ <month type="7">Mehr</month>
+ <month type="8">Aban</month>
+ <month type="9">Azar</month>
+ <month type="10">Dey</month>
+ <month type="11">Bahman</month>
+ <month type="12">Esfand</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <eras>
+ <eraAbbr>
+ <era type="0">AP</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/dateFormats"/>
+ </dateFormats>
+ <timeFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/timeFormats"/>
+ </timeFormats>
+ <dateTimeFormats>
+ <alias source="locale" path="../../calendar[@type='gregorian']/dateTimeFormats"/>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HH:mm;-HH:mm</hourFormat>
+ <hoursFormat>{0}/{1}</hoursFormat>
+ <gmtFormat>GMT{0}</gmtFormat>
+ <regionFormat>{0}</regionFormat>
+ <fallbackFormat>{0} ({1})</fallbackFormat>
+ <abbreviationFallback choice="standard" draft="unconfirmed"/>
+ <preferenceOrdering choice="" draft="unconfirmed"/>
+ <singleCountries list="Africa/Bamako America/Godthab America/Santiago America/Guayaquil Asia/Shanghai Asia/Tashkent Asia/Kuala_Lumpur Europe/Madrid Europe/Lisbon Europe/London Pacific/Auckland Pacific/Tahiti" draft="unconfirmed"/>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>.</decimal>
+ <group>,</group>
+ <list>;</list>
+ <percentSign>%</percentSign>
+ <nativeZeroDigit>0</nativeZeroDigit>
+ <patternDigit>#</patternDigit>
+ <plusSign>+</plusSign>
+ <minusSign>-</minusSign>
+ <exponential>E</exponential>
+ <perMille>‰</perMille>
+ <infinity>∞</infinity>
+ <nan>NaN</nan>
+ </symbols>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <scientificFormats>
+ <scientificFormatLength>
+ <scientificFormat>
+ <pattern>#E0</pattern>
+ </scientificFormat>
+ </scientificFormatLength>
+ </scientificFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencySpacing>
+ <beforeCurrency>
+ <currencyMatch>[:letter:]</currencyMatch>
+ <surroundingMatch>[:digit:]</surroundingMatch>
+ <insertBetween> </insertBetween>
+ </beforeCurrency>
+ <afterCurrency>
+ <currencyMatch>[:letter:]</currencyMatch>
+ <surroundingMatch>[:digit:]</surroundingMatch>
+ <insertBetween> </insertBetween>
+ </afterCurrency>
+ </currencySpacing>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="EUR">
+ <displayName>EUR</displayName>
+ <symbol>€</symbol>
+ </currency>
+ <currency type="GBP">
+ <displayName>GBP</displayName>
+ <symbol>£</symbol>
+ </currency>
+ <currency type="INR">
+ <displayName>INR</displayName>
+ <symbol choice="true">0≤Rs.|1≤Re.|1&lt;Rs.</symbol>
+ </currency>
+ <currency type="ITL">
+ <displayName>ITL</displayName>
+ <symbol>₤</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>JPY</displayName>
+ <symbol>Â¥</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>USD</displayName>
+ <symbol>$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>yes:y</yesstr>
+ <nostr>no:n</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ru.xml b/libs/Zend/Locale/Data/ru.xml
new file mode 100755
index 0000000000..a09068626b
--- /dev/null
+++ b/libs/Zend/Locale/Data/ru.xml
@@ -0,0 +1,2412 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.91.2.1 $"/>
+ <generation date="$Date: 2007/01/04 00:09:46 $"/>
+ <language type="ru"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">афар</language>
+ <language type="ab">абхазÑкий</language>
+ <language type="ace">ачехÑкий</language>
+ <language type="ach">ачоли</language>
+ <language type="ada">адангме</language>
+ <language type="ady">адыгейÑкий</language>
+ <language type="ae">авеÑтийÑкий</language>
+ <language type="af">африкаанÑ</language>
+ <language type="afa">афразийÑкие (другие)</language>
+ <language type="afh">африхили</language>
+ <language type="akk">аккадÑкий</language>
+ <language type="ale">алеутÑкий</language>
+ <language type="alg">алгонкинÑкие Ñзыки</language>
+ <language type="alt">южноалтайÑкий</language>
+ <language type="am">амхарÑкий</language>
+ <language type="an">арагонÑкий</language>
+ <language type="ang">ÑтароанглийÑкий</language>
+ <language type="apa">апачÑкий</language>
+ <language type="ar">арабÑкий</language>
+ <language type="arc">арамейÑкий</language>
+ <language type="arn">арауканÑкий</language>
+ <language type="art">иÑкуÑÑтвенные (другие)</language>
+ <language type="arw">аравакÑкий</language>
+ <language type="as">аÑÑамÑкий</language>
+ <language type="ast">аÑтурийÑкий</language>
+ <language type="ath">атапачÑкие Ñзыки</language>
+ <language type="aus">авÑтралийÑкие Ñзыки</language>
+ <language type="av">аварÑкий</language>
+ <language type="awa">авадхи</language>
+ <language type="ay">аймара</language>
+ <language type="az">азербайджанÑкий</language>
+ <language type="ba">башкирÑкий</language>
+ <language type="bad">банда</language>
+ <language type="bai">бамилеке Ñзыки</language>
+ <language type="bal">белуджÑкий</language>
+ <language type="ban">балийÑкий</language>
+ <language type="bas">баÑа</language>
+ <language type="bat">балтийÑкие (другие)</language>
+ <language type="be">белоруÑÑкий</language>
+ <language type="bej">беджа</language>
+ <language type="bem">бемба</language>
+ <language type="ber">берберÑкий</language>
+ <language type="bg">болгарÑкий</language>
+ <language type="bh">бихари</language>
+ <language type="bho">бходжпури</language>
+ <language type="bi">биÑлама</language>
+ <language type="bik">бикольÑкий</language>
+ <language type="bin">бини</language>
+ <language type="bla">ÑикÑика</language>
+ <language type="bm">бамбарийÑкий</language>
+ <language type="bn">бенгальÑкий</language>
+ <language type="bnt">банту (другие)</language>
+ <language type="bo">тибетÑкий</language>
+ <language type="br">бретонÑкий</language>
+ <language type="bra">брауи</language>
+ <language type="bs">боÑнийÑкий</language>
+ <language type="btk">батакÑкий</language>
+ <language type="bua">бурÑÑ‚Ñкий</language>
+ <language type="bug">бугийÑкий</language>
+ <language type="ca">каталанÑкий</language>
+ <language type="cad">каддо</language>
+ <language type="cai">Центральной Ðмерики индейцев (другие)</language>
+ <language type="car">кариб</language>
+ <language type="cau">кавказÑкие (другие)</language>
+ <language type="ce">чеченÑкий</language>
+ <language type="ceb">кебуано</language>
+ <language type="ch">чаморро</language>
+ <language type="chb">чибча</language>
+ <language type="chg">чагатайÑкий</language>
+ <language type="chk">чукотÑкий</language>
+ <language type="chm">марийÑкий (черемиÑÑкий)</language>
+ <language type="chn">чинук жаргон</language>
+ <language type="cho">чоктав</language>
+ <language type="chp">чипеваÑн</language>
+ <language type="chr">чероки</language>
+ <language type="chy">чейенн</language>
+ <language type="co">корÑиканÑкий</language>
+ <language type="cop">коптÑкий</language>
+ <language type="cpe">англо-креольÑкие и пиджины (другие)</language>
+ <language type="cpf">франко-креольÑкие и пиджины (другие)</language>
+ <language type="cpp">португало-креольÑкие и пиджины (другие)</language>
+ <language type="cr">криийÑкий</language>
+ <language type="crp">креольÑкие и пиджины (другие)</language>
+ <language type="cs">чешÑкий</language>
+ <language type="csb">кашубианÑкий</language>
+ <language type="cu">церковноÑлавÑнÑкий</language>
+ <language type="cus">кушитÑкие (другие)</language>
+ <language type="cv">чувашÑкий</language>
+ <language type="cy">валлийÑкий</language>
+ <language type="da">датÑкий</language>
+ <language type="dak">дакота</language>
+ <language type="de">немецкий</language>
+ <language type="del">делаварÑкий</language>
+ <language type="den">ÑлÑйви</language>
+ <language type="din">динка</language>
+ <language type="doi">догри</language>
+ <language type="dra">дравидийÑкие (другие)</language>
+ <language type="dua">дуала</language>
+ <language type="dum">нидерландÑкий Ñредневековый</language>
+ <language type="dyu">диула (дьюла)</language>
+ <language type="dz">дзонг-кÑ</language>
+ <language type="ee">Ñве</language>
+ <language type="efi">Ñфик</language>
+ <language type="egy">древнеегипетÑкий</language>
+ <language type="eka">Ñкаджук</language>
+ <language type="el">гречеÑкий</language>
+ <language type="elx">ÑламÑкий</language>
+ <language type="en">английÑкий</language>
+ <language type="enm">ÑреднеанглийÑкий</language>
+ <language type="eo">ÑÑперанто</language>
+ <language type="es">иÑпанÑкий</language>
+ <language type="et">ÑÑтонÑкий</language>
+ <language type="eu">баÑкÑкий</language>
+ <language type="ewo">Ñвондо</language>
+ <language type="fa">перÑидÑкий</language>
+ <language type="fan">фанг</language>
+ <language type="fat">фанти</language>
+ <language type="fi">финÑкий</language>
+ <language type="fil">филиппинÑкий</language>
+ <language type="fiu">финно-угорÑкие (другие)</language>
+ <language type="fj">фиджи</language>
+ <language type="fo">фарерÑкий</language>
+ <language type="fon">фон</language>
+ <language type="fr">французÑкий</language>
+ <language type="frm">ÑреднефранцузÑкий</language>
+ <language type="fro">ÑтарофранцузÑкий</language>
+ <language type="fur">фриуланÑкий</language>
+ <language type="fy">фризÑкий</language>
+ <language type="ga">ирландÑкий</language>
+ <language type="gaa">га</language>
+ <language type="gay">гайо</language>
+ <language type="gba">гбаÑ</language>
+ <language type="gd">гÑльÑкий</language>
+ <language type="gem">германÑкие (другие)</language>
+ <language type="gez">геÑз</language>
+ <language type="gil">гильбертÑкий</language>
+ <language type="gl">галиÑийÑкий</language>
+ <language type="gmh">Ñредневерхненемецкий</language>
+ <language type="gn">гуарани</language>
+ <language type="goh">Ñтароверхненемецкий</language>
+ <language type="gon">гонди</language>
+ <language type="got">готÑкий</language>
+ <language type="grb">гребо</language>
+ <language type="grc">древнегречеÑкий</language>
+ <language type="gu">гуджарати</language>
+ <language type="gv">мÑнÑкий</language>
+ <language type="gwi">гвичин</language>
+ <language type="ha">хауÑа</language>
+ <language type="hai">хайда</language>
+ <language type="haw">гавайÑкий</language>
+ <language type="he">иврит</language>
+ <language type="hi">хинди</language>
+ <language type="hil">хилигайнон</language>
+ <language type="him">химачали</language>
+ <language type="hit">хетÑкий</language>
+ <language type="hmn">хмонг</language>
+ <language type="hr">хорватÑкий</language>
+ <language type="ht">гаитÑнÑкий</language>
+ <language type="hu">венгерÑкий</language>
+ <language type="hup">Хупа</language>
+ <language type="hy">армÑнÑкий</language>
+ <language type="hz">гереро</language>
+ <language type="ia">интерлингва</language>
+ <language type="iba">ибанÑкий</language>
+ <language type="id">индонезийÑкий</language>
+ <language type="ie">интерлингве</language>
+ <language type="ig">игбо</language>
+ <language type="ijo">иджо</language>
+ <language type="ik">инупиак</language>
+ <language type="ilo">илоко</language>
+ <language type="inc">индийÑкие (другие)</language>
+ <language type="ine">индоевропейÑкие (другие)</language>
+ <language type="inh">ингушÑкий</language>
+ <language type="ira">иранÑкие (другие)</language>
+ <language type="iro">ирокезÑкие Ñзыки</language>
+ <language type="is">иÑландÑкий</language>
+ <language type="it">итальÑнÑкий</language>
+ <language type="iu">инуктитут</language>
+ <language type="ja">ÑпонÑкий</language>
+ <language type="jbo">ложбан</language>
+ <language type="jpr">еврейÑко-перÑидÑкий</language>
+ <language type="jrb">еврейÑко-арабÑкий</language>
+ <language type="jv">ÑванÑкий</language>
+ <language type="ka">грузинÑкий</language>
+ <language type="kaa">каракалпакÑкий</language>
+ <language type="kab">кабильÑкий</language>
+ <language type="kac">качин</language>
+ <language type="kam">камба</language>
+ <language type="kar">каренÑкий</language>
+ <language type="kaw">кави</language>
+ <language type="kbd">кабардинÑкий</language>
+ <language type="kg">конго</language>
+ <language type="kha">кхаÑи</language>
+ <language type="khi">койÑанÑкие (другие)</language>
+ <language type="kho">хотанÑкий</language>
+ <language type="ki">кикуйю</language>
+ <language type="kj">кунама</language>
+ <language type="kk">казахÑкий</language>
+ <language type="kl">ÑÑкимоÑÑкий (гренландÑкий)</language>
+ <language type="km">кхмерÑкий</language>
+ <language type="kmb">кимбундийÑкий</language>
+ <language type="kn">каннада</language>
+ <language type="ko">корейÑкий</language>
+ <language type="kok">конкани</language>
+ <language type="kpe">кпелле</language>
+ <language type="kr">канури</language>
+ <language type="krc">карачаево-балкарÑкий</language>
+ <language type="kro">кру</language>
+ <language type="kru">курух</language>
+ <language type="ks">кашмири</language>
+ <language type="ku">курдÑкий</language>
+ <language type="kum">кумыкÑкий</language>
+ <language type="kut">кутенаи</language>
+ <language type="kv">коми</language>
+ <language type="kw">корнийÑкий</language>
+ <language type="ky">киргизÑкий</language>
+ <language type="la">латинÑкий</language>
+ <language type="lad">ладино</language>
+ <language type="lah">лахнда</language>
+ <language type="lam">ламба</language>
+ <language type="lb">люкÑембургÑкий</language>
+ <language type="lez">лезгинÑкий</language>
+ <language type="lg">ганда</language>
+ <language type="ln">лингала</language>
+ <language type="lo">лаоÑÑкий</language>
+ <language type="lol">монго</language>
+ <language type="loz">лози</language>
+ <language type="lt">литовÑкий</language>
+ <language type="lu">луба-катанга</language>
+ <language type="lua">луба-лулуа</language>
+ <language type="lui">луиÑеньо</language>
+ <language type="lun">лунда</language>
+ <language type="luo">луо (ÐšÐµÐ½Ð¸Ñ Ð¸ ТанзаниÑ)</language>
+ <language type="lv">латышÑкий</language>
+ <language type="mad">мадурÑкий</language>
+ <language type="mag">магахи</language>
+ <language type="mai">майтхили</language>
+ <language type="mak">макаÑÑарÑкий</language>
+ <language type="man">мандинго</language>
+ <language type="map">авÑтронезийÑкие (другие)</language>
+ <language type="mas">маÑаи</language>
+ <language type="mdf">мокша</language>
+ <language type="mdr">мандарÑкий</language>
+ <language type="men">менде</language>
+ <language type="mg">малагаÑийÑкий</language>
+ <language type="mga">ÑреднеирландÑкий</language>
+ <language type="mh">маршальÑкий</language>
+ <language type="mi">маори</language>
+ <language type="mic">микмак</language>
+ <language type="min">минангкабау</language>
+ <language type="mis">Ñмешанные (другие)</language>
+ <language type="mk">македонÑкий</language>
+ <language type="mkh">монкхмерÑкие (другие)</language>
+ <language type="ml">малаÑлам</language>
+ <language type="mn">монгольÑкий</language>
+ <language type="mnc">маньчжурÑкий</language>
+ <language type="mni">манипурÑкий</language>
+ <language type="mno">манобо Ñзыки</language>
+ <language type="mo">молдавÑкий</language>
+ <language type="moh">мохаук</language>
+ <language type="mos">моей</language>
+ <language type="mr">маратхи</language>
+ <language type="ms">малайÑкий</language>
+ <language type="mt">мальтийÑкий</language>
+ <language type="mul">разных Ñемей Ñзыки</language>
+ <language type="mun">мунда Ñзыки</language>
+ <language type="mus">крик</language>
+ <language type="mwr">марвари</language>
+ <language type="my">бирманÑкий</language>
+ <language type="myn">Ð¼Ð°Ð¹Ñ Ñзыки</language>
+ <language type="myv">ÑрзÑ</language>
+ <language type="na">науру</language>
+ <language type="nah">ацтекÑкий</language>
+ <language type="nai">Северной Ðмерики индейцев (другие)</language>
+ <language type="nap">неаполитанÑкий</language>
+ <language type="nd">ндебели (Ñеверный)</language>
+ <language type="nds">нижнегерманÑкий; нижнеÑакÑонÑкий</language>
+ <language type="ne">непальÑкий</language>
+ <language type="new">неварÑкий</language>
+ <language type="nic">нигер-кордофанÑкие (другие)</language>
+ <language type="niu">ниуÑ</language>
+ <language type="nl">голландÑкий</language>
+ <language type="nn">новонорвежÑкий</language>
+ <language type="no">норвежÑкий</language>
+ <language type="nog">ногайÑкий</language>
+ <language type="non">ÑтаронорвежÑкий</language>
+ <language type="nr">ндебели (южный)</language>
+ <language type="nso">Ñото Ñеверный</language>
+ <language type="nub">нубийÑкие Ñзыки</language>
+ <language type="nv">навахо</language>
+ <language type="nwc">невари (клаÑÑичеÑкий)</language>
+ <language type="ny">ньÑнджа</language>
+ <language type="nym">ньÑмвези</language>
+ <language type="nyn">ньÑнколе</language>
+ <language type="nyo">ньоро</language>
+ <language type="nzi">нзима</language>
+ <language type="oc">окÑитанÑкий</language>
+ <language type="oj">оджибва</language>
+ <language type="om">оромо</language>
+ <language type="or">ориÑ</language>
+ <language type="os">оÑетинÑкий</language>
+ <language type="osa">оÑеджи</language>
+ <language type="ota">Ñтаротурецкий</language>
+ <language type="oto">отомангÑкие Ñзыки</language>
+ <language type="pa">панджаби (пенджаби)</language>
+ <language type="paa">папуаÑÑко-авÑтралийÑкие (другие)</language>
+ <language type="pag">пангаÑинан</language>
+ <language type="pal">пехлевийÑкий</language>
+ <language type="pam">пампанга</language>
+ <language type="pap">папьÑменто</language>
+ <language type="pau">палау</language>
+ <language type="peo">ÑтароперÑидÑкий</language>
+ <language type="phi">филиппинÑкие (другие)</language>
+ <language type="phn">финикийÑкий</language>
+ <language type="pi">пали</language>
+ <language type="pl">польÑкий</language>
+ <language type="pon">понапе</language>
+ <language type="pra">пракриты Ñзыки</language>
+ <language type="pro">ÑтаропрованÑальÑкий</language>
+ <language type="ps">пашто (пушту)</language>
+ <language type="pt">португальÑкий</language>
+ <language type="qu">кечуа</language>
+ <language type="raj">раджаÑтхани</language>
+ <language type="rar">раротонганÑкий</language>
+ <language type="rm">ретороманÑкий</language>
+ <language type="rn">рунди</language>
+ <language type="ro">румынÑкий</language>
+ <language type="roa">романÑкие (другие)</language>
+ <language type="rom">цыганÑкий</language>
+ <language type="ru">руÑÑкий</language>
+ <language type="rw">киньÑруанда</language>
+ <language type="sa">ÑанÑкрит</language>
+ <language type="sad">Ñандаве</language>
+ <language type="sah">ÑкутÑкий</language>
+ <language type="sai">южной америки индейцев (другие)</language>
+ <language type="sal">ÑалишÑкие Ñзыки</language>
+ <language type="sam">ÑамаритÑнÑкий арамейÑкий</language>
+ <language type="sc">ÑардинÑкий</language>
+ <language type="sd">Ñиндхи</language>
+ <language type="se">ÑаамÑкий (Ñеверный)</language>
+ <language type="sel">ÑелькупÑкий</language>
+ <language type="sem">ÑемитÑкие (другие)</language>
+ <language type="sg">Ñанго</language>
+ <language type="sga">ÑтароирландÑкий</language>
+ <language type="sh">ÑербÑкохорватÑкий</language>
+ <language type="shn">шанÑкий</language>
+ <language type="si">ÑингальÑкий</language>
+ <language type="sid">Ñидама</language>
+ <language type="sio">Ñиу Ñзыки</language>
+ <language type="sit">ÑинотибетÑкие (другие)</language>
+ <language type="sk">Ñловацкий</language>
+ <language type="sl">ÑловенÑкий</language>
+ <language type="sla">ÑлавÑнÑкие (другие)</language>
+ <language type="sm">ÑамоанÑкий</language>
+ <language type="sma">ÑаамÑкий (южный)</language>
+ <language type="smi">ÑаамÑкие Ñзыки</language>
+ <language type="sn">шона</language>
+ <language type="snk">ÑонинкийÑкий</language>
+ <language type="so">Ñомали</language>
+ <language type="sog">ÑогдийÑкий</language>
+ <language type="son">cонгаи</language>
+ <language type="sq">албанÑкий</language>
+ <language type="sr">ÑербÑкий</language>
+ <language type="srr">Ñерер</language>
+ <language type="ss">Ñвази</language>
+ <language type="ssa">нило-ÑахарÑкие (другие)</language>
+ <language type="st">Ñото южный</language>
+ <language type="su">ÑунданÑкий</language>
+ <language type="suk">Ñукума</language>
+ <language type="sus">ÑуÑу</language>
+ <language type="sux">шумерÑкий</language>
+ <language type="sv">шведÑкий</language>
+ <language type="sw">Ñуахили</language>
+ <language type="syr">ÑирийÑкий</language>
+ <language type="ta">тамильÑкий</language>
+ <language type="tai">тайÑкие (другие)</language>
+ <language type="te">телугу</language>
+ <language type="ter">терено</language>
+ <language type="tg">таджикÑкий</language>
+ <language type="th">тайÑкий</language>
+ <language type="ti">тигриньÑ</language>
+ <language type="tig">тигре</language>
+ <language type="tiv">тиви</language>
+ <language type="tk">туркменÑкий</language>
+ <language type="tkl">токелайÑкий</language>
+ <language type="tl">тагалог</language>
+ <language type="tlh">клингон</language>
+ <language type="tli">тлингит</language>
+ <language type="tmh">тамашек</language>
+ <language type="tn">Ñ‚Ñвана</language>
+ <language type="to">тонга</language>
+ <language type="tog">тонга (ньÑÑа)</language>
+ <language type="tr">турецкий</language>
+ <language type="ts">Ñ‚Ñонга</language>
+ <language type="tsi">цимшиан</language>
+ <language type="tt">татарÑкий</language>
+ <language type="tum">тумбука</language>
+ <language type="tup">тупи</language>
+ <language type="tut">алтайÑкие (другие)</language>
+ <language type="tw">тви</language>
+ <language type="ty">таитÑнÑкий</language>
+ <language type="tyv">тувинÑкий</language>
+ <language type="udm">удмуртÑкий</language>
+ <language type="ug">уйгурÑкий</language>
+ <language type="uga">угаритÑкий</language>
+ <language type="uk">украинÑкий</language>
+ <language type="umb">умбунду</language>
+ <language type="und">неидентифицированный</language>
+ <language type="ur">урду</language>
+ <language type="uz">узбекÑкий</language>
+ <language type="vai">ваи</language>
+ <language type="ve">венда</language>
+ <language type="vi">вьетнамÑкий</language>
+ <language type="vo">волапюк</language>
+ <language type="vot">удмуртÑкий (вотÑцкий)</language>
+ <language type="wak">вакашÑкие Ñзыки</language>
+ <language type="wal">воламо</language>
+ <language type="war">варай</language>
+ <language type="was">вашо</language>
+ <language type="wen">лужицкие Ñзыки</language>
+ <language type="wo">волоф</language>
+ <language type="xal">калмыцкий</language>
+ <language type="xh">кÑоза</language>
+ <language type="yao">Ñо</language>
+ <language type="yap">Ñп</language>
+ <language type="yi">идиш</language>
+ <language type="yo">йоруба</language>
+ <language type="za">чжуань</language>
+ <language type="zap">ÑапотекÑкий</language>
+ <language type="zen">зенагÑкий</language>
+ <language type="zh">китайÑкий</language>
+ <language type="znd">занди</language>
+ <language type="zu">зулу</language>
+ <language type="zun">зуньи</language>
+ </languages>
+ <scripts>
+ <script type="Arab">ÐрабÑкаÑ</script>
+ <script type="Armn">ÐрмÑнÑкаÑ</script>
+ <script type="Beng">БенгальÑкаÑ</script>
+ <script type="Bopo">Бопомофо</script>
+ <script type="Brai">БрайлÑ</script>
+ <script type="Buhd">Бухид</script>
+ <script type="Cans">Унифицированные Символы КанадÑких Ðборигенов</script>
+ <script type="Cher">Чероки</script>
+ <script type="Copt">КоптÑкаÑ</script>
+ <script type="Cprt">КипрÑкаÑ</script>
+ <script type="Cyrl">Кириллица</script>
+ <script type="Deva">Деванагари</script>
+ <script type="Dsrt">Дезерет</script>
+ <script type="Ethi">ЭфиопÑкаÑ</script>
+ <script type="Geor">ГрузинÑкаÑ</script>
+ <script type="Goth">ГотÑкаÑ</script>
+ <script type="Grek">ГречеÑкаÑ</script>
+ <script type="Gujr">Гуджарати</script>
+ <script type="Guru">Гурмукхи</script>
+ <script type="Hang">Хангул</script>
+ <script type="Hano">Хануну</script>
+ <script type="Hebr">Иврит</script>
+ <script type="Hira">Хирагана</script>
+ <script type="Ital">СтароитальÑнÑкаÑ</script>
+ <script type="Kana">Катакана</script>
+ <script type="Khmr">КхмерÑкаÑ</script>
+ <script type="Knda">Каннада</script>
+ <script type="Laoo">ЛаоÑÑкаÑ</script>
+ <script type="Latn">Латиница</script>
+ <script type="Limb">Лимбу</script>
+ <script type="Linb">Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð‘</script>
+ <script type="Mlym">МалаÑльÑкаÑ</script>
+ <script type="Mong">МонгольÑкаÑ</script>
+ <script type="Mymr">МайанмарÑкаÑ</script>
+ <script type="Ogam">ОгамичеÑкаÑ</script>
+ <script type="Orya">ОриÑ</script>
+ <script type="Osma">ОÑманÑкаÑ</script>
+ <script type="Qaai">УнаÑледованнаÑ</script>
+ <script type="Runr">РуничеÑкаÑ</script>
+ <script type="Shaw">Ðлфавит Шоу</script>
+ <script type="Sinh">СингальÑкаÑ</script>
+ <script type="Syrc">СирийÑкаÑ</script>
+ <script type="Tagb">Тагбанва</script>
+ <script type="Taml">ТамильÑкаÑ</script>
+ <script type="Telu">Телугу</script>
+ <script type="Tglg">Тагалог</script>
+ <script type="Thaa">Таана</script>
+ <script type="Thai">ТайÑкаÑ</script>
+ <script type="Tibt">ТибетÑкаÑ</script>
+ <script type="Ugar">УгаритÑкаÑ</script>
+ <script type="Xpeo">СтароперÑидÑкаÑ</script>
+ <script type="Xsux">Шумеро-аккадÑÐºÐ°Ñ ÐºÐ»Ð¸Ð½Ð¾Ð¿Ð¸ÑÑŒ</script>
+ <script type="Xsux" alt="proposed-u179-1" draft="unconfirmed">Шумер-ÐккадÑÐºÐ°Ñ ÐºÐ»Ð¸Ð½Ð¾Ð¿Ð¸ÑÑŒ</script>
+ <script type="Yiii">Йи (ицзу)</script>
+ <script type="Zyyy">ÐеопределеннаÑ</script>
+ </scripts>
+ <territories>
+ <territory type="001">Ð’Ñемирное</territory>
+ <territory type="002">Ðфрика</territory>
+ <territory type="005">Ð®Ð¶Ð½Ð°Ñ Ðмерика</territory>
+ <territory type="009">ОкеаниÑ</territory>
+ <territory type="011">Ð—Ð°Ð¿Ð°Ð´Ð½Ð°Ñ Ðфрика</territory>
+ <territory type="013">Ð¦ÐµÐ½Ñ‚Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ðмерика</territory>
+ <territory type="014">ВоÑÑ‚Ð¾Ñ‡Ð½Ð°Ñ Ðфрика</territory>
+ <territory type="015">Ð¡ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ðфрика</territory>
+ <territory type="017">Ð¦ÐµÐ½Ñ‚Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ðфрика</territory>
+ <territory type="018">Ð®Ð¶Ð½Ð°Ñ Ðфрика [018]</territory>
+ <territory type="019">Ð¦ÐµÐ½Ñ‚Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð¸ Ð®Ð¶Ð½Ð°Ñ Ðмерика</territory>
+ <territory type="021">Ð¡ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ðмерика</territory>
+ <territory type="029">Карибы</territory>
+ <territory type="030">ВоÑÑ‚Ð¾Ñ‡Ð½Ð°Ñ ÐзиÑ</territory>
+ <territory type="035">Юго-ВоÑÑ‚Ð¾Ñ‡Ð½Ð°Ñ ÐзиÑ</territory>
+ <territory type="039">Ð®Ð¶Ð½Ð°Ñ Ð•Ð²Ñ€Ð¾Ð¿Ð°</territory>
+ <territory type="053">ÐвÑÑ‚Ñ€Ð°Ð»Ð¸Ñ Ð¸ ÐÐ¾Ð²Ð°Ñ Ð—ÐµÐ»Ð°Ð½Ð´Ð¸Ñ</territory>
+ <territory type="054">МеланезиÑ</territory>
+ <territory type="057">МикронезиÑ</territory>
+ <territory type="061">ПолинезиÑ</territory>
+ <territory type="062">Юг Средней Ðзии</territory>
+ <territory type="142">ÐзиÑ</territory>
+ <territory type="145">Ближний и Средний ВоÑток</territory>
+ <territory type="150">Европа</territory>
+ <territory type="151">ВоÑÑ‚Ð¾Ñ‡Ð½Ð°Ñ Ð•Ð²Ñ€Ð¾Ð¿Ð°</territory>
+ <territory type="154">Ð¡ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð•Ð²Ñ€Ð¾Ð¿Ð°</territory>
+ <territory type="155">Ð—Ð°Ð¿Ð°Ð´Ð½Ð°Ñ Ð•Ð²Ñ€Ð¾Ð¿Ð°</territory>
+ <territory type="830">ÐормандÑкие оÑтрова</territory>
+ <territory type="IM">ÐœÑн, оÑтров</territory>
+ <territory type="AD">Ðндорра</territory>
+ <territory type="AE">Объединенные ÐрабÑкие Эмираты</territory>
+ <territory type="AF">ÐфганиÑтан</territory>
+ <territory type="AG">Ðнтигуа и Барбуда</territory>
+ <territory type="AI">Ðнгуилла</territory>
+ <territory type="AL">ÐлбаниÑ</territory>
+ <territory type="AM">ÐрмениÑ</territory>
+ <territory type="AN">ГолландÑкие ÐнтильÑкие ОÑтрова</territory>
+ <territory type="AO">Ðнгола</territory>
+ <territory type="AQ">Ðнтарктида</territory>
+ <territory type="AR">Ðргентина</territory>
+ <territory type="AS">ÐмериканÑкое Самоа</territory>
+ <territory type="AT">ÐвÑтриÑ</territory>
+ <territory type="AU">ÐвÑтралиÑ</territory>
+ <territory type="AW">Ðруба</territory>
+ <territory type="AX">ÐландÑкие оÑтрова</territory>
+ <territory type="AZ">Ðзербайджан</territory>
+ <territory type="BA">БоÑниÑ</territory>
+ <territory type="BB">БарбадоÑ</territory>
+ <territory type="BD">Бангладеш</territory>
+ <territory type="BE">БельгиÑ</territory>
+ <territory type="BF">Буркина ФаÑо</territory>
+ <territory type="BG">БолгариÑ</territory>
+ <territory type="BH">Бахрейн</territory>
+ <territory type="BI">Бурунди</territory>
+ <territory type="BJ">Бенин</territory>
+ <territory type="BM">БермудÑкие ОÑтрова</territory>
+ <territory type="BN">Бруней ДаруÑÑалам</territory>
+ <territory type="BO">БоливиÑ</territory>
+ <territory type="BR">БразилиÑ</territory>
+ <territory type="BS">БагамÑкие оÑтрова</territory>
+ <territory type="BT">Бутан</territory>
+ <territory type="BV">ОÑтров Буве</territory>
+ <territory type="BW">БотÑвана</territory>
+ <territory type="BY">БеларуÑÑŒ</territory>
+ <territory type="BZ">Белиз</territory>
+ <territory type="CA">Канада</territory>
+ <territory type="CC">КокоÑовые ОÑтрова (Киилинг)</territory>
+ <territory type="CD">Конго, ДемократичеÑÐºÐ°Ñ Ð ÐµÑпублика</territory>
+ <territory type="CF">Центрально-ÐфриканÑÐºÐ°Ñ Ð ÐµÑпублика</territory>
+ <territory type="CG">Конго</territory>
+ <territory type="CH">ШвейцариÑ</territory>
+ <territory type="CI">Кот д’Ивуар</territory>
+ <territory type="CK">ОÑтрова Кука</territory>
+ <territory type="CL">Чили</territory>
+ <territory type="CM">Камерун</territory>
+ <territory type="CN">Китай</territory>
+ <territory type="CO">КолумбиÑ</territory>
+ <territory type="CR">КоÑта-Рика</territory>
+ <territory type="CS">Ð¡ÐµÑ€Ð±Ð¸Ñ Ð¸ ЧерногориÑ</territory>
+ <territory type="CU">Куба</territory>
+ <territory type="CV">ОÑтрова Зеленого МыÑа</territory>
+ <territory type="CX">ОÑтров РождеÑтва</territory>
+ <territory type="CY">Кипр</territory>
+ <territory type="CZ">ЧешÑÐºÐ°Ñ Ð ÐµÑпублика</territory>
+ <territory type="DE">ГерманиÑ</territory>
+ <territory type="DJ">Джибути</territory>
+ <territory type="DK">ДаниÑ</territory>
+ <territory type="DM">ОÑтров Доминика</territory>
+ <territory type="DO">ДоминиканÑÐºÐ°Ñ Ð ÐµÑпублика</territory>
+ <territory type="DZ">Ðлжир</territory>
+ <territory type="EC">Эквадор</territory>
+ <territory type="EE">ЭÑтониÑ</territory>
+ <territory type="EG">Египет</territory>
+ <territory type="EH">Ð—Ð°Ð¿Ð°Ð´Ð½Ð°Ñ Ð¡Ð°Ñ…Ð°Ñ€Ð°</territory>
+ <territory type="ER">ЭритреÑ</territory>
+ <territory type="ES">ИÑпаниÑ</territory>
+ <territory type="ET">ЭфиопиÑ</territory>
+ <territory type="FI">ФинлÑндиÑ</territory>
+ <territory type="FJ">Фиджи</territory>
+ <territory type="FK">ФолклендÑкие оÑтрова</territory>
+ <territory type="FM">Федеративное ГоÑударÑтво МикронезиÑ</territory>
+ <territory type="FO">ФарерÑкие оÑтрова</territory>
+ <territory type="FR">ФранциÑ</territory>
+ <territory type="GA">Габон</territory>
+ <territory type="GB">ВеликобританиÑ</territory>
+ <territory type="GD">Гренада</territory>
+ <territory type="GE">ГрузиÑ</territory>
+ <territory type="GF">ФранцузÑÐºÐ°Ñ Ð“Ð²Ð¸Ð°Ð½Ð°</territory>
+ <territory type="GH">Гана</territory>
+ <territory type="GI">Гибралтар</territory>
+ <territory type="GL">ГренландиÑ</territory>
+ <territory type="GM">ГамбиÑ</territory>
+ <territory type="GN">ГвинеÑ</territory>
+ <territory type="GP">Гваделупа</territory>
+ <territory type="GQ">Ð­ÐºÐ²Ð°Ñ‚Ð¾Ñ€Ð¸Ð°Ð»ÑŒÐ½Ð°Ñ Ð“Ð²Ð¸Ð½ÐµÑ</territory>
+ <territory type="GR">ГрециÑ</territory>
+ <territory type="GS">Ð®Ð¶Ð½Ð°Ñ Ð”Ð¶Ð¾Ñ€Ð´Ð¶Ð¸Ñ Ð¸ Южные Сандвичевы ОÑтрова</territory>
+ <territory type="GT">Гватемала</territory>
+ <territory type="GU">Гуам</territory>
+ <territory type="GW">ГвинеÑ-БиÑÑау</territory>
+ <territory type="GY">Гайана</territory>
+ <territory type="HK">Гонконг (ОблаÑÑ‚ÑŒ Ñ ÐžÑобым ÐдминиÑтративным Управлением, Китай)</territory>
+ <territory type="HM">ОÑтрова Херд и Мак-Дональд</territory>
+ <territory type="HN">ГондураÑ</territory>
+ <territory type="HR">ХорватиÑ</territory>
+ <territory type="HT">Гаити</territory>
+ <territory type="HU">ВенгриÑ</territory>
+ <territory type="ID">ИндонезиÑ</territory>
+ <territory type="IE">ИрландиÑ</territory>
+ <territory type="IL">Израиль</territory>
+ <territory type="IN">ИндиÑ</territory>
+ <territory type="IO">БританÑкие Территории в ИндийÑком Океане</territory>
+ <territory type="IQ">Ирак</territory>
+ <territory type="IR">Иран</territory>
+ <territory type="IS">ИÑландиÑ</territory>
+ <territory type="IT">ИталиÑ</territory>
+ <territory type="JM">Ямайка</territory>
+ <territory type="JO">ИорданиÑ</territory>
+ <territory type="JP">ЯпониÑ</territory>
+ <territory type="KE">КениÑ</territory>
+ <territory type="KG">КыргызÑтан</territory>
+ <territory type="KH">Камбоджа</territory>
+ <territory type="KI">Кирибати</territory>
+ <territory type="KM">КоморÑкие ОÑтрова</territory>
+ <territory type="KN">Сент-ÐšÐ¸Ñ‚Ñ‚Ñ Ð¸ ÐевиÑ</territory>
+ <territory type="KP">Ð¡ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐšÐ¾Ñ€ÐµÑ</territory>
+ <territory type="KR">Ð®Ð¶Ð½Ð°Ñ ÐšÐ¾Ñ€ÐµÑ</territory>
+ <territory type="KW">Кувейт</territory>
+ <territory type="KY">Каймановы ОÑтрова</territory>
+ <territory type="KZ">КазахÑтан</territory>
+ <territory type="LA">ЛаоÑ</territory>
+ <territory type="LB">Ливан</territory>
+ <territory type="LC">Сент-ЛюÑиÑ</territory>
+ <territory type="LI">Лихтенштейн</territory>
+ <territory type="LK">Шри-Ланка</territory>
+ <territory type="LR">ЛибериÑ</territory>
+ <territory type="LS">ЛеÑото</territory>
+ <territory type="LT">Литва</territory>
+ <territory type="LU">ЛюкÑембург</territory>
+ <territory type="LV">ЛатвиÑ</territory>
+ <territory type="LY">ЛивиÑ</territory>
+ <territory type="MA">Марокко</territory>
+ <territory type="MC">Монако</territory>
+ <territory type="MD">Молдова</territory>
+ <territory type="MG">МадагаÑкар</territory>
+ <territory type="MH">Маршалловы ОÑтрова</territory>
+ <territory type="MK">МакедониÑ</territory>
+ <territory type="ML">Мали</territory>
+ <territory type="MM">МьÑнма</territory>
+ <territory type="MN">МонголиÑ</territory>
+ <territory type="MO">Макао (ОблаÑÑ‚ÑŒ Ñ ÐžÑобым ÐдминиÑтративным Управлением, Китай)</territory>
+ <territory type="MP">Северные МарианÑкие ОÑтрова</territory>
+ <territory type="MQ">Мартиник</territory>
+ <territory type="MR">МавританиÑ</territory>
+ <territory type="MS">МонÑеррат</territory>
+ <territory type="MT">Мальта</territory>
+ <territory type="MU">Маврикий</territory>
+ <territory type="MV">Мальдивы</territory>
+ <territory type="MW">Малави</territory>
+ <territory type="MX">МекÑика</territory>
+ <territory type="MY">МалайзиÑ</territory>
+ <territory type="MZ">Мозамбик</territory>
+ <territory type="NA">ÐамибиÑ</territory>
+ <territory type="NC">ÐÐ¾Ð²Ð°Ñ ÐšÐ°Ð»ÐµÐ´Ð¾Ð½Ð¸Ñ</territory>
+ <territory type="NE">Ðигер</territory>
+ <territory type="NF">ОÑтров Ðорфолк</territory>
+ <territory type="NG">ÐигериÑ</territory>
+ <territory type="NI">Ðикарагуа</territory>
+ <territory type="NL">Ðидерланды</territory>
+ <territory type="NO">ÐорвегиÑ</territory>
+ <territory type="NP">Ðепал</territory>
+ <territory type="NR">Ðауру</territory>
+ <territory type="NU">Ðиуе</territory>
+ <territory type="NZ">ÐÐ¾Ð²Ð°Ñ Ð—ÐµÐ»Ð°Ð½Ð´Ð¸Ñ</territory>
+ <territory type="OM">Оман</territory>
+ <territory type="PA">Панама</territory>
+ <territory type="PE">Перу</territory>
+ <territory type="PF">ФранцузÑÐºÐ°Ñ ÐŸÐ¾Ð»Ð¸Ð½ÐµÐ·Ð¸Ñ</territory>
+ <territory type="PG">Папуа-ÐÐ¾Ð²Ð°Ñ Ð“Ð²Ð¸Ð½ÐµÑ</territory>
+ <territory type="PH">Филиппины</territory>
+ <territory type="PK">ПакиÑтан</territory>
+ <territory type="PL">Польша</territory>
+ <territory type="PM">Сен-Пьер и Микелон</territory>
+ <territory type="PN">Питкерн</territory>
+ <territory type="PR">ПуÑрто-Рико</territory>
+ <territory type="PS">ПалеÑтинÑÐºÐ°Ñ Ð°Ð²Ñ‚Ð¾Ð½Ð¾Ð¼Ð¸Ñ</territory>
+ <territory type="PT">ПортугалиÑ</territory>
+ <territory type="PW">Палау</territory>
+ <territory type="PY">Парагвай</territory>
+ <territory type="QA">Катар</territory>
+ <territory type="QO">ВнешнÑÑ ÐžÐºÐµÐ°Ð½Ð¸Ñ</territory>
+ <territory type="RE">Реюньон</territory>
+ <territory type="RO">РумыниÑ</territory>
+ <territory type="RU">РоÑÑиÑ</territory>
+ <territory type="RW">Руанда</territory>
+ <territory type="SA">СаудовÑÐºÐ°Ñ ÐравиÑ</territory>
+ <territory type="SB">Соломоновы ОÑтрова</territory>
+ <territory type="SC">СейшельÑкие ОÑтрова</territory>
+ <territory type="SD">Судан</territory>
+ <territory type="SE">ШвециÑ</territory>
+ <territory type="SG">Сингапур</territory>
+ <territory type="SH">ОÑтров СвÑтой Елены</territory>
+ <territory type="SI">СловениÑ</territory>
+ <territory type="SJ">Свальбард и Ян-Майен</territory>
+ <territory type="SK">СловакиÑ</territory>
+ <territory type="SL">Сьерра-Леоне</territory>
+ <territory type="SM">Сан-Марино</territory>
+ <territory type="SN">Сенегал</territory>
+ <territory type="SO">Сомали</territory>
+ <territory type="SR">Суринам</territory>
+ <territory type="ST">Сан-Томе и ПринÑипи</territory>
+ <territory type="SV">Сальвадор</territory>
+ <territory type="SY">СирийÑÐºÐ°Ñ ÐрабÑÐºÐ°Ñ Ð ÐµÑпублика</territory>
+ <territory type="SZ">Свазиленд</territory>
+ <territory type="TC">ОÑтрова Ð¢Ñ‘Ñ€ÐºÑ Ð¸ КайкоÑ</territory>
+ <territory type="TD">Чад</territory>
+ <territory type="TF">ФранцузÑкие Южные Территории</territory>
+ <territory type="TG">Того</territory>
+ <territory type="TH">Таиланд</territory>
+ <territory type="TJ">ТаджикиÑтан</territory>
+ <territory type="TK">Токелау</territory>
+ <territory type="TL">ВоÑточный Тимор</territory>
+ <territory type="TM">ТуркмениÑтан</territory>
+ <territory type="TN">ТуниÑ</territory>
+ <territory type="TO">Тонга</territory>
+ <territory type="TR">ТурциÑ</territory>
+ <territory type="TT">Тринидад и Тобаго</territory>
+ <territory type="TV">Тувалу</territory>
+ <territory type="TW">Тайвань</territory>
+ <territory type="TZ">ТанзаниÑ</territory>
+ <territory type="UA">Украина</territory>
+ <territory type="UG">Уганда</territory>
+ <territory type="UM">Внешние малые оÑтрова (СШÐ)</territory>
+ <territory type="US">Соединенные Штаты</territory>
+ <territory type="UY">Уругвай</territory>
+ <territory type="UZ">УзбекиÑтан</territory>
+ <territory type="VA">Ватикан</territory>
+ <territory type="VC">Сент-ВинÑент и Гренадины</territory>
+ <territory type="VE">ВенеÑуÑла</territory>
+ <territory type="VG">БританÑкие ВиргинÑкие ОÑтрова</territory>
+ <territory type="VI">ÐмериканÑкие ВиргинÑкие ОÑтрова</territory>
+ <territory type="VN">Вьетнам</territory>
+ <territory type="VU">Вануату</territory>
+ <territory type="WF">Ð­Ð»Ð»Ð¸Ñ Ð¸ Футуна</territory>
+ <territory type="WS">Самоа</territory>
+ <territory type="YE">Йемен</territory>
+ <territory type="YT">Майотта</territory>
+ <territory type="ZA">Ð®Ð¶Ð½Ð°Ñ Ðфрика</territory>
+ <territory type="ZM">ЗамбиÑ</territory>
+ <territory type="ZW">Зимбабве</territory>
+ </territories>
+ <keys>
+ <key type="calendar">Календарь</key>
+ <key type="collation">Сортировка</key>
+ <key type="currency">Валюта</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">БуддийÑкий календарь</type>
+ <type type="chinese" key="calendar">КитайÑкий календарь</type>
+ <type type="gregorian" key="calendar">ГригорианÑкий календарь</type>
+ <type type="hebrew" key="calendar">ЕврейÑкий календарь</type>
+ <type type="islamic" key="calendar">ИÑламÑкий календарь</type>
+ <type type="islamic-civil" key="calendar">ИÑламÑкий гражданÑкий календарь</type>
+ <type type="japanese" key="calendar">ЯпонÑкий календарь</type>
+ </types>
+ </localeDisplayNames>
+ <layout>
+ <inList casing="titlecase-firstword"/>
+ </layout>
+ <characters>
+ <exemplarCharacters>[а-е Ñ‘ ж-Ñ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[i v x]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>«</quotationStart>
+ <quotationEnd>»</quotationEnd>
+ <alternateQuotationStart>„</alternateQuotationStart>
+ <alternateQuotationEnd>“</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" references="R1">Ñнв.</month>
+ <month type="2" references="R1">февр.</month>
+ <month type="3" references="R1">марта</month>
+ <month type="4" references="R1">апр.</month>
+ <month type="5" references="R1">маÑ</month>
+ <month type="6" references="R1">июнÑ</month>
+ <month type="7" references="R1">июлÑ</month>
+ <month type="8" references="R1">авг.</month>
+ <month type="9" references="R1">Ñент.</month>
+ <month type="10" references="R1">окт.</month>
+ <month type="11" references="R1">ноÑб.</month>
+ <month type="12" references="R1">дек.</month>
+ </monthWidth>
+ <monthWidth type="narrow">
+ <month type="1">Я</month>
+ <month type="2">Ф</month>
+ <month type="3">М</month>
+ <month type="4">Ð</month>
+ <month type="5">М</month>
+ <month type="6">И</month>
+ <month type="7">И</month>
+ <month type="8">Ð</month>
+ <month type="9">С</month>
+ <month type="10">О</month>
+ <month type="11">Ð</month>
+ <month type="12">Д</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">ÑнварÑ</month>
+ <month type="2">февралÑ</month>
+ <month type="3">марта</month>
+ <month type="4">апрелÑ</month>
+ <month type="5">маÑ</month>
+ <month type="6">июнÑ</month>
+ <month type="7">июлÑ</month>
+ <month type="8">авгуÑта</month>
+ <month type="9">ÑентÑбрÑ</month>
+ <month type="10">октÑбрÑ</month>
+ <month type="11">ноÑбрÑ</month>
+ <month type="12">декабрÑ</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="abbreviated">
+ <month type="1" references="R1">Ñнв.</month>
+ <month type="2" references="R1">февр.</month>
+ <month type="3" references="R1">март</month>
+ <month type="4" references="R1">апр.</month>
+ <month type="5" references="R1">май</month>
+ <month type="6" references="R1">июнь</month>
+ <month type="7" references="R1">июль</month>
+ <month type="8" references="R1">авг.</month>
+ <month type="9" references="R1">Ñент.</month>
+ <month type="10" references="R1">окт.</month>
+ <month type="11" references="R1">ноÑб.</month>
+ <month type="12" references="R1">дек.</month>
+ </monthWidth>
+ <monthWidth type="narrow">
+ <month type="1">Я</month>
+ <month type="2">Ф</month>
+ <month type="3">М</month>
+ <month type="4">Ð</month>
+ <month type="5">М</month>
+ <month type="6">И</month>
+ <month type="7">И</month>
+ <month type="8">Ð</month>
+ <month type="9">С</month>
+ <month type="10">О</month>
+ <month type="11">Ð</month>
+ <month type="12">Д</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Январь</month>
+ <month type="2">Февраль</month>
+ <month type="3">Март</month>
+ <month type="4">Ðпрель</month>
+ <month type="5">Май</month>
+ <month type="6">Июнь</month>
+ <month type="7">Июль</month>
+ <month type="8">ÐвгуÑÑ‚</month>
+ <month type="9">СентÑбрь</month>
+ <month type="10">ОктÑбрь</month>
+ <month type="11">ÐоÑбрь</month>
+ <month type="12">Декабрь</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Ð’Ñ</day>
+ <day type="mon">Пн</day>
+ <day type="tue">Ð’Ñ‚</day>
+ <day type="wed">Ср</day>
+ <day type="thu">Чт</day>
+ <day type="fri">Пт</day>
+ <day type="sat">Сб</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">воÑкреÑенье</day>
+ <day type="mon">понедельник</day>
+ <day type="tue">вторник</day>
+ <day type="wed">Ñреда</day>
+ <day type="thu">четверг</day>
+ <day type="fri">пÑтница</day>
+ <day type="sat">Ñуббота</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">Ð’</day>
+ <day type="mon">П</day>
+ <day type="tue">Ð’</day>
+ <day type="wed">С</day>
+ <day type="thu">Ч</day>
+ <day type="fri">П</day>
+ <day type="sat">С</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">1-й кв.</quarter>
+ <quarter type="2">2-й кв.</quarter>
+ <quarter type="3">3-й кв.</quarter>
+ <quarter type="4">4-й кв.</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1-й квартал</quarter>
+ <quarter type="2">2-й квартал</quarter>
+ <quarter type="3">3-й квартал</quarter>
+ <quarter type="4">4-й квартал</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraAbbr>
+ <era type="0">до н.Ñ.</era>
+ <era type="1">н.Ñ.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern references="RP1">d MMMM yyyy\u00a0'г.'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy\u00a0'г.'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd.MM.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd.MM.yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMd" draft="provisional">d MMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd.MM</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyMMMEEEd" draft="provisional">EEE, d MMM yy</dateFormatItem>
+ <dateFormatItem id="yyyyLLLL" draft="provisional">LLLL yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM.yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyQQQQ" draft="provisional">QQQQ yyyy 'г.'</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="day">
+ <displayName>День</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>День недели</displayName>
+ </field>
+ </fields>
+ </calendar>
+ <calendar type="hebrew">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Тишрей</month>
+ <month type="2">Хешван</month>
+ <month type="3">КиÑлев</month>
+ <month type="4">Тевет</month>
+ <month type="5">Шеват</month>
+ <month type="7">Ðдар</month>
+ <month type="8">ÐиÑан</month>
+ <month type="9">ИÑÑ€</month>
+ <month type="10">Сиван</month>
+ <month type="11">Таммуз</month>
+ <month type="12">Ðв</month>
+ <month type="13">Элул</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Тишрей</month>
+ <month type="2">Хешван</month>
+ <month type="3">КиÑлев</month>
+ <month type="4">Тевет</month>
+ <month type="5">Шеват</month>
+ <month type="7">Ðдар</month>
+ <month type="8">ÐиÑан</month>
+ <month type="9">ИÑÑ€</month>
+ <month type="10">Сиван</month>
+ <month type="11">Таммуз</month>
+ <month type="12">Ðв</month>
+ <month type="13">Элул</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="islamic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Мухаррам</month>
+ <month type="2">Сафар</month>
+ <month type="3">Раби-уль-авваль</month>
+ <month type="4">Раби-уль-ахир</month>
+ <month type="5">Джумад-уль-авваль</month>
+ <month type="6">Джумад-уль-ахир</month>
+ <month type="7">Раджаб</month>
+ <month type="8">Шаабан</month>
+ <month type="9">Рамадан</month>
+ <month type="10">Шавваль</month>
+ <month type="11">Зуль-Каада</month>
+ <month type="12">Зуль-Хиджжа</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Мухаррам</month>
+ <month type="2">Сафар</month>
+ <month type="3">Раби-уль-авваль</month>
+ <month type="4">Раби-уль-ахир</month>
+ <month type="5">Джумад-уль-авваль</month>
+ <month type="6">Джумад-уль-ахир</month>
+ <month type="7">Раджаб</month>
+ <month type="8">Шаабан</month>
+ <month type="9">Рамадан</month>
+ <month type="10">Шавваль</month>
+ <month type="11">Зуль-Каада</month>
+ <month type="12">Зуль-Хиджжа</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="persian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Фарвардин</month>
+ <month type="2">Ордибехешт</month>
+ <month type="3">Хордад</month>
+ <month type="4">Тир</month>
+ <month type="5">Мордад</month>
+ <month type="6">Шахривер</month>
+ <month type="7">Мехр</month>
+ <month type="8">Ðбан</month>
+ <month type="9">Ðзер</month>
+ <month type="10">Дей</month>
+ <month type="11">Бахман</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Фарвардин</month>
+ <month type="2">Ордибехешт</month>
+ <month type="3">Хордад</month>
+ <month type="4">Тир</month>
+ <month type="5">Мордад</month>
+ <month type="6">Шахривер</month>
+ <month type="7">Мехр</month>
+ <month type="8">Ðбан</month>
+ <month type="9">Ðзер</month>
+ <month type="10">Дей</month>
+ <month type="11">Бахман</month>
+ <month type="12">ЭÑфанд</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <timeFormats>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>ЭÑфанд</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Africa/Timbuktu">
+ <exemplarCity>Тимбукту</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/ComodRivadavia">
+ <exemplarCity>Комодоро-РивадавиÑ</exemplarCity>
+ </zone>
+ <zone type="Europe/Belfast">
+ <exemplarCity>БелфаÑÑ‚</exemplarCity>
+ </zone>
+ <zone type="Pacific/Yap">
+ <exemplarCity>Яп, о-ва</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Rothera">
+ <exemplarCity>Ротера</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Palmer">
+ <exemplarCity>Палмер</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Южный полюÑ</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Syowa">
+ <exemplarCity>Сева</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Mawson">
+ <exemplarCity>МоуÑон</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Davis">
+ <exemplarCity>ДейвиÑ</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Vostok">
+ <exemplarCity>ВоÑток</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Casey">
+ <exemplarCity>КейÑи</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity>Дюмон-д'Юрвиль</exemplarCity>
+ </zone>
+ <zone type="Antarctica/McMurdo">
+ <exemplarCity>Мак-Мердо</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Rio_Gallegos">
+ <exemplarCity>Рио-ГальегоÑ</exemplarCity>
+ </zone>
+ <zone type="America/Mendoza">
+ <exemplarCity>МендоÑа</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/San_Juan">
+ <exemplarCity>Сан-Хуан</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Ushuaia">
+ <exemplarCity>УшуаÑ</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/La_Rioja">
+ <exemplarCity>Ла-Риоха</exemplarCity>
+ </zone>
+ <zone type="America/Catamarca">
+ <exemplarCity>Катамарка</exemplarCity>
+ </zone>
+ <zone type="America/Jujuy">
+ <exemplarCity>Жужуй</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Tucuman">
+ <exemplarCity>Тукуман</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity>Кордова</exemplarCity>
+ </zone>
+ <zone type="America/Buenos_Aires">
+ <exemplarCity>БуÑноÑ-ÐйреÑ</exemplarCity>
+ </zone>
+ <zone type="Australia/Perth">
+ <exemplarCity>Перт</exemplarCity>
+ </zone>
+ <zone type="Australia/Darwin">
+ <exemplarCity>Дарвин</exemplarCity>
+ </zone>
+ <zone type="Australia/Adelaide">
+ <exemplarCity>Ðделаида</exemplarCity>
+ </zone>
+ <zone type="Australia/Broken_Hill">
+ <exemplarCity>Брокен-Хилл</exemplarCity>
+ </zone>
+ <zone type="Australia/Melbourne">
+ <exemplarCity>Мельбурн</exemplarCity>
+ </zone>
+ <zone type="Australia/Hobart">
+ <exemplarCity>Хобарт</exemplarCity>
+ </zone>
+ <zone type="Australia/Lindeman">
+ <exemplarCity>Линдеман</exemplarCity>
+ </zone>
+ <zone type="Australia/Sydney">
+ <exemplarCity>Сидней</exemplarCity>
+ </zone>
+ <zone type="Australia/Brisbane">
+ <exemplarCity>БриÑбен</exemplarCity>
+ </zone>
+ <zone type="Australia/Lord_Howe">
+ <exemplarCity>Лорд-Хау, о-в</exemplarCity>
+ </zone>
+ <zone type="America/Eirunepe">
+ <exemplarCity>Эйрунепе</exemplarCity>
+ </zone>
+ <zone type="America/Rio_Branco">
+ <exemplarCity>Риу-Бранку</exemplarCity>
+ </zone>
+ <zone type="America/Porto_Velho">
+ <exemplarCity>Порту-Велью</exemplarCity>
+ </zone>
+ <zone type="America/Boa_Vista">
+ <exemplarCity>Боа-ВиÑта</exemplarCity>
+ </zone>
+ <zone type="America/Manaus">
+ <exemplarCity>МанауÑ</exemplarCity>
+ </zone>
+ <zone type="America/Cuiaba">
+ <exemplarCity>КуÑба</exemplarCity>
+ </zone>
+ <zone type="America/Campo_Grande">
+ <exemplarCity>Кампу-Гранди</exemplarCity>
+ </zone>
+ <zone type="America/Belem">
+ <exemplarCity>Белен</exemplarCity>
+ </zone>
+ <zone type="America/Araguaina">
+ <exemplarCity>Ðрагуаина</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>Сан-Паулу</exemplarCity>
+ </zone>
+ <zone type="America/Bahia">
+ <exemplarCity>БаиÑ</exemplarCity>
+ </zone>
+ <zone type="America/Fortaleza">
+ <exemplarCity>Форталеза</exemplarCity>
+ </zone>
+ <zone type="America/Maceio">
+ <exemplarCity>МаÑейо</exemplarCity>
+ </zone>
+ <zone type="America/Recife">
+ <exemplarCity>РеÑифи</exemplarCity>
+ </zone>
+ <zone type="America/Noronha">
+ <exemplarCity>Ðоронха</exemplarCity>
+ </zone>
+ <zone type="America/Dawson">
+ <exemplarCity>ДоуÑон</exemplarCity>
+ </zone>
+ <zone type="America/Whitehorse">
+ <exemplarCity>УайтхорÑ</exemplarCity>
+ </zone>
+ <zone type="America/Vancouver">
+ <exemplarCity>Ванкувер</exemplarCity>
+ </zone>
+ <zone type="America/Dawson_Creek">
+ <exemplarCity>ДоÑон-Крик</exemplarCity>
+ </zone>
+ <zone type="America/Yellowknife">
+ <exemplarCity>Йеллоунайф</exemplarCity>
+ </zone>
+ <zone type="America/Inuvik">
+ <exemplarCity>Инувик</exemplarCity>
+ </zone>
+ <zone type="America/Edmonton">
+ <exemplarCity>Эдмонтон</exemplarCity>
+ </zone>
+ <zone type="America/Swift_Current">
+ <exemplarCity>Свифт-Карент</exemplarCity>
+ </zone>
+ <zone type="America/Cambridge_Bay">
+ <exemplarCity>Кеймбридж-Бей</exemplarCity>
+ </zone>
+ <zone type="America/Regina">
+ <exemplarCity>Реджайна</exemplarCity>
+ </zone>
+ <zone type="America/Winnipeg">
+ <exemplarCity>Виннипег</exemplarCity>
+ </zone>
+ <zone type="America/Rainy_River">
+ <exemplarCity>Рейни-Ривер</exemplarCity>
+ </zone>
+ <zone type="America/Rankin_Inlet">
+ <exemplarCity>Ранкин-Инлет</exemplarCity>
+ </zone>
+ <zone type="America/Thunder_Bay">
+ <exemplarCity>Тандер-Бей</exemplarCity>
+ </zone>
+ <zone type="America/Nipigon">
+ <exemplarCity>Ðипигон</exemplarCity>
+ </zone>
+ <zone type="America/Coral_Harbour">
+ <exemplarCity>Корал-Харбор</exemplarCity>
+ </zone>
+ <zone type="America/Toronto">
+ <exemplarCity>Торонто</exemplarCity>
+ </zone>
+ <zone type="America/Montreal">
+ <exemplarCity>Монреаль</exemplarCity>
+ </zone>
+ <zone type="America/Iqaluit">
+ <exemplarCity>Икалуит</exemplarCity>
+ </zone>
+ <zone type="America/Pangnirtung">
+ <exemplarCity>Пангниртанг</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <exemplarCity>ГалифакÑ</exemplarCity>
+ </zone>
+ <zone type="America/Goose_Bay">
+ <exemplarCity>ГуÑ-Бей</exemplarCity>
+ </zone>
+ <zone type="America/Glace_Bay">
+ <exemplarCity>ГлейÑ-Бей</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <exemplarCity>Сент-ДжонÑ</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity>КиншаÑа</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity>Лубумбаши</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>ПаÑхи, о-в</exemplarCity>
+ </zone>
+ <zone type="America/Santiago">
+ <exemplarCity>СантьÑго</exemplarCity>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity>Кашгар</exemplarCity>
+ </zone>
+ <zone type="Asia/Urumqi">
+ <exemplarCity>Урумчи</exemplarCity>
+ </zone>
+ <zone type="Asia/Chongqing">
+ <exemplarCity>Чунцин</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity>Шанхай</exemplarCity>
+ </zone>
+ <zone type="Asia/Harbin">
+ <exemplarCity>Харбин</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity>ГалапагоÑ, о-ва</exemplarCity>
+ </zone>
+ <zone type="America/Guayaquil">
+ <exemplarCity>ГуаÑкиль</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>КанарÑкие о-ва</exemplarCity>
+ </zone>
+ <zone type="Africa/Ceuta">
+ <exemplarCity>Сеута</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity>Мадрид</exemplarCity>
+ </zone>
+ <zone type="Pacific/Truk">
+ <exemplarCity>Трук, о-ва</exemplarCity>
+ </zone>
+ <zone type="Pacific/Ponape">
+ <exemplarCity>Понапе, о-в</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kosrae">
+ <exemplarCity>КоÑрае</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>Лондон</exemplarCity>
+ </zone>
+ <zone type="America/Thule">
+ <exemplarCity>Туле</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity>Готхоб</exemplarCity>
+ </zone>
+ <zone type="America/Scoresbysund">
+ <exemplarCity>СкорÑбиÑунн</exemplarCity>
+ </zone>
+ <zone type="America/Danmarkshavn">
+ <exemplarCity>ДенмаркÑхавн</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity>Джакарта</exemplarCity>
+ </zone>
+ <zone type="Asia/Pontianak">
+ <exemplarCity>Понтианак</exemplarCity>
+ </zone>
+ <zone type="Asia/Makassar">
+ <exemplarCity>МакаÑар</exemplarCity>
+ </zone>
+ <zone type="Asia/Jayapura">
+ <exemplarCity>Джайпур</exemplarCity>
+ </zone>
+ <zone type="Pacific/Enderbury">
+ <exemplarCity>Эндербери, о-в</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kiritimati">
+ <exemplarCity>Киритимати</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tarawa">
+ <exemplarCity>Тарава</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtau">
+ <exemplarCity>Ðктау</exemplarCity>
+ </zone>
+ <zone type="Asia/Oral">
+ <exemplarCity>Орал (УральÑк)</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtobe">
+ <exemplarCity>Ðктобе (ÐктюбинÑк)</exemplarCity>
+ </zone>
+ <zone type="Asia/Qyzylorda">
+ <exemplarCity>Кызылорда</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity>Ðлматы</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kwajalein">
+ <exemplarCity>Кваджалейн</exemplarCity>
+ </zone>
+ <zone type="Pacific/Majuro">
+ <exemplarCity>Маджуро</exemplarCity>
+ </zone>
+ <zone type="Africa/Bamako">
+ <exemplarCity>Бамако</exemplarCity>
+ </zone>
+ <zone type="Asia/Hovd">
+ <exemplarCity>Ховд</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>Улан-Батор</exemplarCity>
+ </zone>
+ <zone type="Asia/Choibalsan">
+ <exemplarCity>ЧойбалÑан</exemplarCity>
+ </zone>
+ <zone type="America/Tijuana">
+ <exemplarCity>Тихуана</exemplarCity>
+ </zone>
+ <zone type="America/Hermosillo">
+ <exemplarCity>ЭрмоÑильо</exemplarCity>
+ </zone>
+ <zone type="America/Mazatlan">
+ <exemplarCity>МаÑатлан</exemplarCity>
+ </zone>
+ <zone type="America/Chihuahua">
+ <exemplarCity>Чиуауа</exemplarCity>
+ </zone>
+ <zone type="America/Monterrey">
+ <exemplarCity>Монтеррей</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>Мехико</exemplarCity>
+ </zone>
+ <zone type="America/Merida">
+ <exemplarCity>Мерида</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>Канкун</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuala_Lumpur">
+ <exemplarCity>Куала-Лумпур</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuching">
+ <exemplarCity>Кучинг</exemplarCity>
+ </zone>
+ <zone type="Pacific/Chatham">
+ <exemplarCity>Чатем, о-в</exemplarCity>
+ </zone>
+ <zone type="Pacific/Auckland">
+ <exemplarCity>Окленд</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity>Таити, о-в</exemplarCity>
+ </zone>
+ <zone type="Pacific/Marquesas">
+ <exemplarCity>МаркизÑкие о-ва</exemplarCity>
+ </zone>
+ <zone type="Pacific/Gambier">
+ <exemplarCity>Гамбье, о-ва</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>ÐзорÑкие о-ва</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Madeira">
+ <exemplarCity>Мадейра, о-в</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>ЛиÑÑабон</exemplarCity>
+ </zone>
+ <zone type="Europe/Kaliningrad">
+ <exemplarCity>Калининград</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>МоÑква</exemplarCity>
+ </zone>
+ <zone type="Europe/Samara">
+ <exemplarCity>Самара</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>Екатеринбург</exemplarCity>
+ </zone>
+ <zone type="Asia/Omsk">
+ <exemplarCity>ОмÑк</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity>ÐовоÑибирÑк</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>КраÑноÑÑ€Ñк</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity>ИркутÑк</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>ЯкутÑк</exemplarCity>
+ </zone>
+ <zone type="Asia/Vladivostok">
+ <exemplarCity>ВладивоÑток</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>Сахалин, о-в</exemplarCity>
+ </zone>
+ <zone type="Asia/Magadan">
+ <exemplarCity>Магадан</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>Камчатка, п-ов</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity>Ðнадырь</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Jan_Mayen">
+ <exemplarCity>Ян-Майен, о-в</exemplarCity>
+ </zone>
+ <zone type="Arctic/Longyearbyen">
+ <exemplarCity>Лонгйир</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>Ужгород</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>Киев</exemplarCity>
+ </zone>
+ <zone type="Europe/Simferopol">
+ <exemplarCity>Симферополь</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>Запорожье</exemplarCity>
+ </zone>
+ <zone type="Pacific/Midway">
+ <exemplarCity>МидуÑй, о-ва</exemplarCity>
+ </zone>
+ <zone type="Pacific/Johnston">
+ <exemplarCity>ДжонÑтон, ат.</exemplarCity>
+ </zone>
+ <zone type="Pacific/Wake">
+ <exemplarCity>УÑйк, о-в</exemplarCity>
+ </zone>
+ <zone type="America/Adak">
+ <exemplarCity>Ðдак, о-в</exemplarCity>
+ </zone>
+ <zone type="America/Nome">
+ <exemplarCity>Ðом</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <exemplarCity>Гонолулу</exemplarCity>
+ </zone>
+ <zone type="America/Anchorage">
+ <exemplarCity>Ðнкоридж</exemplarCity>
+ </zone>
+ <zone type="America/Yakutat">
+ <exemplarCity>Якутат</exemplarCity>
+ </zone>
+ <zone type="America/Juneau">
+ <exemplarCity>Джуно</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <exemplarCity>ЛоÑ-ÐнджелеÑ</exemplarCity>
+ </zone>
+ <zone type="America/Boise">
+ <exemplarCity>БойÑе</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <exemplarCity>ФиникÑ</exemplarCity>
+ </zone>
+ <zone type="America/Shiprock">
+ <exemplarCity>Шипрок</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <exemplarCity>Денвер</exemplarCity>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity>Ð¡ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð”Ð°ÐºÐ¾Ñ‚Ð° - Центр</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <exemplarCity>Чикаго</exemplarCity>
+ </zone>
+ <zone type="America/Menominee">
+ <exemplarCity>Меномини</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vincennes">
+ <exemplarCity>ВинÑенÑ</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Petersburg">
+ <exemplarCity>ПетерÑбург</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Knox">
+ <exemplarCity>ÐокÑ</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Marengo">
+ <exemplarCity>Маренго</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <exemplarCity>ИндианаполиÑ</exemplarCity>
+ </zone>
+ <zone type="America/Louisville">
+ <exemplarCity>ЛуиÑвилл</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vevay">
+ <exemplarCity>ВивÑй</exemplarCity>
+ </zone>
+ <zone type="America/Kentucky/Monticello">
+ <exemplarCity>МонтиÑелло</exemplarCity>
+ </zone>
+ <zone type="America/Detroit">
+ <exemplarCity>Детройт</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <exemplarCity>Ðью-Йорк</exemplarCity>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity>Самарканд</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Ташкент</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <currencyFormats>
+ <currencySpacing>
+ <afterCurrency>
+ <insertBetween>\u00a0</insertBetween>
+ </afterCurrency>
+ </currencySpacing>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ADP">
+ <displayName>ÐндоррÑÐºÐ°Ñ Ð¿ÐµÑета</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>Дирхам (ОÐЭ)</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>Ðфгани (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>Ðфгани</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName>ÐлбанÑкий лек</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>ÐрмÑнÑкий драм</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>ÐидерландÑкий антильÑкий гульден</displayName>
+ <symbol>NA f.</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>Кванза</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Кванза (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>ÐÐ¾Ð²Ð°Ñ ÐºÐ²Ð°Ð½Ð·Ð°</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>ÐргентинÑкое пеÑо (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>ÐргентинÑкое пеÑо</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>ÐвÑтрийÑкий шиллинг</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>ÐвÑтралийÑкий доллар</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>ÐрубанÑкий гульден</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>ÐзербайджанÑкий манат</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>ÐšÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð¸Ñ€ÑƒÐµÐ¼Ð°Ñ Ð¼Ð°Ñ€ÐºÐ° БоÑнии и Герцеговины</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName>БарбадоÑÑкий доллар</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>БангладешÑÐºÐ°Ñ Ñ‚Ð°ÐºÐ°</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>БельгийÑкий франк (конвертируемый)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>БельгийÑкий франк</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BGL">
+ <displayName>Лев</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>БолгарÑкий лев</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>БахрейнÑкий динар</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>БурундийÑкий франк</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>БермудÑкий доллар</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>БрунейÑкий доллар</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>Боливиано</displayName>
+ <symbol>Bs</symbol>
+ </currency>
+ <currency type="BOP">
+ <displayName>БоливийÑкое пеÑо</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>БразильÑкий реал</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRR">
+ <displayName>Крузейро реал</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>БагамÑкий доллар</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>Ðгултрум</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>Джа</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>БотÑванÑÐºÐ°Ñ Ð¿ÑƒÐ»Ð°</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>БелоруÑÑкий рубль (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>БелоруÑÑкий рубль</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>БелизÑкий доллар</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>КанадÑкий доллар</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>КонголезÑкий франк</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>ШвейцарÑкий франк</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CLP">
+ <displayName>ЧилийÑкое пеÑо</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>КитайÑкий юань</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>КолумбийÑкое пеÑо</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="CRC">
+ <displayName>КоÑтариканÑкий колон</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSD">
+ <displayName>СербÑкий динар</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>КубинÑкое пеÑо</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>ЭÑкудо Кабо-Верде</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>КипрÑкий фунт</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>ЧешÑÐºÐ°Ñ ÐºÑ€Ð¾Ð½Ð°</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>ÐÐµÐ¼ÐµÑ†ÐºÐ°Ñ Ð¼Ð°Ñ€ÐºÐ°</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Франк Джибути</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>ДатÑÐºÐ°Ñ ÐºÑ€Ð¾Ð½Ð°</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>ДоминиканÑкое пеÑо</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>ÐлжирÑкий динар</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>ЭквадорÑкий Ñукре</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>ЭÑтонÑÐºÐ°Ñ ÐºÑ€Ð¾Ð½Ð°</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>ЕгипетÑкий фунт</displayName>
+ </currency>
+ <currency type="EQE">
+ <displayName>Эквеле</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Ðакфа</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName>ИÑпанÑÐºÐ°Ñ Ð¿ÐµÑета (Ð)</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>ИÑпанÑÐºÐ°Ñ Ð¿ÐµÑета</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>ЭфиопÑкий быр</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>Евро</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>ФинÑÐºÐ°Ñ Ð¼Ð°Ñ€ÐºÐ°</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Доллар Фиджи</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>Фунт ФолклендÑких оÑтровов</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>ФранцузÑкий франк</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>ÐнглийÑкий фунт Ñтерлингов</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>ГрузинÑкий купон</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>ГрузинÑкий лари</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>ГанÑкий Ñеди</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>ГибралтарÑкий фунт</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>ГамбийÑкий далаÑи</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>ГвинейÑкий франк</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GRD">
+ <displayName>ГречеÑÐºÐ°Ñ Ð´Ñ€Ð°Ñ…Ð¼Ð°</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>ГватемальÑкий кетÑаль</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWP">
+ <displayName>ПеÑо Гвинеи-БиÑау</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>ГайанÑкий доллар</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>ГонконгÑкий доллар</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>ГондураÑÑÐºÐ°Ñ Ð»ÐµÐ¼Ð¿Ð¸Ñ€Ð°</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>ХорватÑкий динар</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>ХорватÑÐºÐ°Ñ ÐºÑƒÐ½Ð°</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>ГаитÑнÑкий гурд</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>ВенгерÑкий форинт</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>ИндонезийÑÐºÐ°Ñ Ñ€ÑƒÐ¿Ð¸Ñ</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>ИрландÑкий фунт</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILS">
+ <displayName>Ðовый израильÑкий шекель</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>ИндийÑÐºÐ°Ñ Ñ€ÑƒÐ¿Ð¸Ñ</displayName>
+ <symbol>INR</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>ИракÑкий динар</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>ИранÑкий риал</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>ИÑландÑÐºÐ°Ñ ÐºÑ€Ð¾Ð½Ð°</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>ИтальÑнÑÐºÐ°Ñ Ð»Ð¸Ñ€Ð°</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>ЯмайÑкий доллар</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>ИорданÑкий динар</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>ЯпонÑÐºÐ°Ñ Ð¸ÐµÐ½Ð°</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>КенийÑкий шиллинг</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>Сом (киргизÑкий)</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>КамбоджийÑкий риель</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>Франк КоморÑких оÑтровов</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>Северо-корейÑÐºÐ°Ñ Ð²Ð¾Ð½Ð°</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Вона РеÑпублики Кореи</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>КувейтÑкий динар</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>Доллар Каймановых оÑтровов</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Тенге (казахÑкий)</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>Кип ЛÐДР</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>ЛиванÑкий фунт</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>Шри-ЛанкийÑÐºÐ°Ñ Ñ€ÑƒÐ¿Ð¸Ñ</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>ЛиберийÑкий доллар</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Лоти</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LTL">
+ <displayName>ЛитовÑкий лит</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>ЛюкÑембургÑкий франк</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>ЛатвийÑкий лат</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>ЛивийÑкий динар</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>МарокканÑкий дирхам</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>МолдавÑкий лей</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>МалагаÑийÑкий франк</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>МакедонÑкий динар</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MNT">
+ <displayName>МонгольÑкий тугрик</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MRO">
+ <displayName>МавританÑÐºÐ°Ñ ÑƒÐ³Ð¸Ñ</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>МальтийÑÐºÐ°Ñ Ð»Ð¸Ñ€Ð°</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MUR">
+ <displayName>МаврикийÑÐºÐ°Ñ Ñ€ÑƒÐ¿Ð¸Ñ</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>МальдивÑÐºÐ°Ñ Ñ€ÑƒÑ„Ð¸Ñ</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Квача (малавийÑкаÑ)</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>МекÑиканÑкое новое пеÑо</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MYR">
+ <displayName>МалайзийÑкий ринггит</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZM">
+ <displayName>МозамбикÑкий метикал</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>Доллар Ðамибии</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>ÐигерийÑÐºÐ°Ñ Ð½Ð°Ð¹Ñ€Ð°</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>Ð—Ð¾Ð»Ð¾Ñ‚Ð°Ñ ÐºÐ¾Ñ€Ð´Ð¾Ð±Ð°</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>ÐидерландÑкий гульден</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>ÐорвежÑÐºÐ°Ñ ÐºÑ€Ð¾Ð½Ð°</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>ÐепальÑÐºÐ°Ñ Ñ€ÑƒÐ¿Ð¸Ñ</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>ÐовозеландÑкий доллар</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>ОманÑкий риал</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>ПанамÑкое бальбоа</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>ПеруанÑкий новый Ñоль</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Кина</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>ФилиппинÑкое пеÑо</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>ПакиÑтанÑÐºÐ°Ñ Ñ€ÑƒÐ¿Ð¸Ñ</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>ПольÑкий злотый</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Злотый</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>ПортугальÑкое ÑÑкудо</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>ПарагвайÑкий гуарани</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>КатарÑкий риал</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="ROL">
+ <displayName>РумынÑкий лей</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>РоÑÑийÑкий рубль</displayName>
+ <symbol>руб.</symbol>
+ </currency>
+ <currency type="RUR">
+ <displayName>РоÑÑийÑкий рубль (1991-1998)</displayName>
+ <symbol>Ñ€.</symbol>
+ </currency>
+ <currency type="RWF">
+ <displayName>Франк Руанды</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>СаудовÑкий риал</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>Доллар Соломоновых оÑтровов</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>СейшельÑÐºÐ°Ñ Ñ€ÑƒÐ¿Ð¸Ñ</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>СуданÑкий динар</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>ШведÑÐºÐ°Ñ ÐºÑ€Ð¾Ð½Ð°</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>СингапурÑкий доллар</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>Фунт оÑтрова СвÑтой Елены</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>СловенÑкий толар</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Ð¡Ð»Ð¾Ð²Ð°Ñ†ÐºÐ°Ñ ÐºÑ€Ð¾Ð½Ð°</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>Леоне</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>СомалийÑкий шиллинг</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRG">
+ <displayName>СуринамÑкий гульден</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>Добра</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SVC">
+ <displayName>СальвадорÑкий колон</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>СирийÑкий фунт</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>СвазилендÑкий лилангени</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>ТаиландÑкий бат</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>ТаджикÑкий рубль</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>ТаджикÑкий Ñомони</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>ТуркменÑкий манат</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>ТуниÑÑкий динар</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>Паанга</displayName>
+ <symbol>T$</symbol>
+ </currency>
+ <currency type="TPE">
+ <displayName>ТиморÑкое ÑÑкудо</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Ð¢ÑƒÑ€ÐµÑ†ÐºÐ°Ñ Ð»Ð¸Ñ€Ð°</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName>ÐÐ¾Ð²Ð°Ñ Ñ‚ÑƒÑ€ÐµÑ†ÐºÐ°Ñ Ð»Ð¸Ñ€Ð°</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Доллар Тринидада и Тобаго</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>Ðовый тайваньÑкий доллар</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>ТанзанийÑкий шиллинг</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>УкраинÑÐºÐ°Ñ Ð³Ñ€Ð¸Ð²Ð½Ð°</displayName>
+ <symbol>грн.</symbol>
+ </currency>
+ <currency type="UAK">
+ <displayName>Карбованец (украинÑкий)</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>УгандийÑкий шиллинг</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>Доллар СШÐ</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="UYP">
+ <displayName>УругвайÑкое пеÑо</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName>УзбекÑкий Ñум</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>ВенеÑуÑльÑкий боливар</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>ВьетнамÑкий донг</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>Вату</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>Тала</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>Франк КФРВЕÐС</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName>Серебро</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>Золото</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>ВоÑточно-карибÑкий доллар</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>СДР (Ñпециальные права заимÑтвованиÑ)</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>ЭКЮ (единица европейÑкой валюты)</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>Франк КФРВСЕÐО</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName>Палладий</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>Франк КФП</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="XPT">
+ <displayName>Платина</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>ЙеменÑкий динар</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>ЙеменÑкий риал</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUN">
+ <displayName>ЮгоÑлавÑкий динар</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>ЮжноафриканÑкий Ñ€Ñнд</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Квача (замбийÑкаÑ)</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Ðовый заир</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Заир</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Доллар Зимбабве</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>да:д</yesstr>
+ <nostr>нет:н</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="R1" uri="http://www.bibliography.ru/method/gosts/7-12/7_12.htm">ГОСТ 7.12-93</reference>
+ <reference type="RP1" uri="http://www.spravka.gramota.ru/pravila.html?perenos.htm">Правила переноÑов</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ru_RU.xml b/libs/Zend/Locale/Data/ru_RU.xml
new file mode 100755
index 0000000000..ff9d23a810
--- /dev/null
+++ b/libs/Zend/Locale/Data/ru_RU.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.43 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="ru"/>
+ <territory type="RU"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="apa">апачÑкие Ñзыки</language>
+ <language type="den" draft="provisional">ÑлавÑнÑкий</language>
+ <language type="mh" draft="provisional">маршаллийÑкий</language>
+ <language type="tlh">клингонÑкий</language>
+ </languages>
+ <scripts>
+ <script type="Xsux" draft="provisional">Шумер-ÐккадÑÐºÐ°Ñ ÐºÐ»Ð¸Ð½Ð¾Ð¿Ð¸ÑÑŒ</script>
+ </scripts>
+ <types>
+ <type type="buddhist" key="calendar">БуддийÑкий кадендарь</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US">Ðнгло-американÑкаÑ</measurementSystemName>
+ <measurementSystemName type="metric">МетричеÑкаÑ</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <numbers>
+ <currencies>
+ <currency type="BAM">
+ <displayName draft="provisional">ÐšÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð¸Ñ€ÑƒÐµÐ¼Ð°Ñ Ð¼Ð°Ñ€ÐºÐ° БоÑнии и Герциговины</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName>ИÑпанÑÐºÐ°Ñ Ð¿ÐµÑета (Ð) ()</displayName>
+ </currency>
+ <currency type="RHD">
+ <displayName>РодезийÑкий доллар</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>ЮгоÑлавÑкий новый динар</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="R1">http://www.gsnti-norms.ru/norms/common/doc.asp?0&amp;/norms/stands/7_12.htm</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ru_UA.xml b/libs/Zend/Locale/Data/ru_UA.xml
new file mode 100755
index 0000000000..1b86583cdf
--- /dev/null
+++ b/libs/Zend/Locale/Data/ru_UA.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="ru"/>
+ <territory type="UA"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d MMMM yyyy 'г.'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>HH:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>HH:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/rw.xml b/libs/Zend/Locale/Data/rw.xml
new file mode 100755
index 0000000000..04aac8cfb5
--- /dev/null
+++ b/libs/Zend/Locale/Data/rw.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.10 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="rw"/>
+ </identity>
+ <characters>
+ <exemplarCharacters>[a-z]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">«</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">»</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">mut.</month>
+ <month type="2" draft="unconfirmed">gas.</month>
+ <month type="3" draft="unconfirmed">wer.</month>
+ <month type="4" draft="unconfirmed">mat.</month>
+ <month type="5" draft="unconfirmed">gic.</month>
+ <month type="6" draft="unconfirmed">kam.</month>
+ <month type="7" draft="unconfirmed">nya.</month>
+ <month type="8" draft="unconfirmed">kan.</month>
+ <month type="9" draft="unconfirmed">nze.</month>
+ <month type="10" draft="unconfirmed">ukw.</month>
+ <month type="11" draft="unconfirmed">ugu.</month>
+ <month type="12" draft="unconfirmed">uku.</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Mutarama</month>
+ <month type="2" draft="unconfirmed">Gashyantare</month>
+ <month type="3" draft="unconfirmed">Werurwe</month>
+ <month type="4" draft="unconfirmed">Mata</month>
+ <month type="5" draft="unconfirmed">Gicuransi</month>
+ <month type="6" draft="unconfirmed">Kamena</month>
+ <month type="7" draft="unconfirmed">Nyakanga</month>
+ <month type="8" draft="unconfirmed">Kanama</month>
+ <month type="9" draft="unconfirmed">Nzeli</month>
+ <month type="10" draft="unconfirmed">Ukwakira</month>
+ <month type="11" draft="unconfirmed">Ugushyingo</month>
+ <month type="12" draft="unconfirmed">Ukuboza</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">cyu.</day>
+ <day type="mon" draft="unconfirmed">mbe.</day>
+ <day type="tue" draft="unconfirmed">kab.</day>
+ <day type="wed" draft="unconfirmed">gtu.</day>
+ <day type="thu" draft="unconfirmed">kan.</day>
+ <day type="fri" draft="unconfirmed">gnu.</day>
+ <day type="sat" draft="unconfirmed">gnd.</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Ku cyumweru</day>
+ <day type="mon" draft="unconfirmed">Kuwa mbere</day>
+ <day type="tue" draft="unconfirmed">Kuwa kabiri</day>
+ <day type="wed" draft="unconfirmed">Kuwa gatatu</day>
+ <day type="thu" draft="unconfirmed">Kuwa kane</day>
+ <day type="fri" draft="unconfirmed">Kuwa gatanu</day>
+ <day type="sat" draft="unconfirmed">Kuwa gatandatu</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">I1</quarter>
+ <quarter type="2" draft="unconfirmed">I2</quarter>
+ <quarter type="3" draft="unconfirmed">I3</quarter>
+ <quarter type="4" draft="unconfirmed">I4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">igihembwe cya mbere</quarter>
+ <quarter type="2" draft="unconfirmed">igihembwe cya kabiri</quarter>
+ <quarter type="3" draft="unconfirmed">igihembwe cya gatatu</quarter>
+ <quarter type="4" draft="unconfirmed">igihembwe cya kane</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal draft="unconfirmed">,</decimal>
+ <group draft="unconfirmed">.</group>
+ </symbols>
+ <currencies>
+ <currency type="RWF">
+ <symbol draft="unconfirmed">F</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/rw_RW.xml b/libs/Zend/Locale/Data/rw_RW.xml
new file mode 100755
index 0000000000..15254c734b
--- /dev/null
+++ b/libs/Zend/Locale/Data/rw_RW.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="rw"/>
+ <territory type="RW"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sa.xml b/libs/Zend/Locale/Data/sa.xml
new file mode 100755
index 0000000000..e93cb01e8d
--- /dev/null
+++ b/libs/Zend/Locale/Data/sa.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.30 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="sa"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="sa" draft="unconfirmed">संसà¥à¤•à¥ƒà¤¤</language>
+ </languages>
+ <territories>
+ <territory type="IN" draft="unconfirmed">भारतमà¥</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[़ à¤-ः ॑-॔ ॠअ-ऋ ॠ ऌ ॡ ठठओ-न र ल ळ व-ह ऽ-ॄ ॢ ॣ े ै ो-à¥]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D ०-९ ठऑ ॅ ॉ]</exemplarCharacters>
+ </characters>
+ <numbers>
+ <symbols>
+ <nativeZeroDigit draft="unconfirmed">०</nativeZeroDigit>
+ </symbols>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern draft="unconfirmed">#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern draft="unconfirmed">#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="INR">
+ <symbol draft="unconfirmed">रà¥</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sa_IN.xml b/libs/Zend/Locale/Data/sa_IN.xml
new file mode 100755
index 0000000000..80d0f5a54f
--- /dev/null
+++ b/libs/Zend/Locale/Data/sa_IN.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.31 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="sa"/>
+ <territory type="IN"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">d-MM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">hh:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">hh:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">hh:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/se.xml b/libs/Zend/Locale/Data/se.xml
new file mode 100755
index 0000000000..4f81f426d0
--- /dev/null
+++ b/libs/Zend/Locale/Data/se.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.11 $"/>
+ <generation date="$Date: 2006/06/29 16:43:11 $"/>
+ <language type="se"/>
+ </identity>
+ <localeDisplayNames>
+ <territories>
+ <territory type="001" draft="unconfirmed">máilbmi</territory>
+ <territory type="002" draft="unconfirmed">Afrihká</territory>
+ <territory type="005" draft="unconfirmed">mátta-Ameriká</territory>
+ <territory type="011" draft="unconfirmed">oarji-Afrihká</territory>
+ <territory type="015" draft="unconfirmed">dávvi-Afrihká</territory>
+ <territory type="017" draft="unconfirmed">Gaska-Afrihká</territory>
+ <territory type="017" alt="proposed-u219-1" draft="unconfirmed">gaska-Afrihká</territory>
+ <territory type="018" draft="unconfirmed">Mátta-Afrihká [018]</territory>
+ <territory type="018" alt="proposed-u219-1" draft="unconfirmed">mátta-Afrihká</territory>
+ <territory type="021" draft="unconfirmed">Dávvi-Ameriká</territory>
+ <territory type="030" draft="unconfirmed">Nuorta-Ãsia</territory>
+ <territory type="030" alt="proposed-u219-1" draft="unconfirmed">nuorta-Ãsia</territory>
+ <territory type="034" draft="unconfirmed">Mátta-Ãsia</territory>
+ <territory type="034" alt="proposed-u219-1" draft="unconfirmed">mátta-Ãsia</territory>
+ <territory type="039" draft="unconfirmed">Mátta-Europa</territory>
+ <territory type="142" draft="unconfirmed">Ãsia</territory>
+ <territory type="143" draft="unconfirmed">Gaska-Ãsia</territory>
+ <territory type="143" alt="proposed-u219-1" draft="unconfirmed">gaska-Ãsia</territory>
+ <territory type="145" draft="unconfirmed">Oarji-Ãsia</territory>
+ <territory type="145" alt="proposed-u219-1" draft="unconfirmed">oarji-Ãsia</territory>
+ <territory type="150" draft="unconfirmed">Europa</territory>
+ <territory type="151" draft="unconfirmed">nuorta-Europa</territory>
+ <territory type="154" draft="unconfirmed">Dávvi-Europa</territory>
+ <territory type="155" draft="unconfirmed">oarji-Europa</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[a á b c Ä d Ä‘ e-n Å‹ o p r s Å¡ t ŧ u v z ž]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" draft="unconfirmed">[à å ä æ ç é è ń ñ ó ò ö ø q ú ü w-y]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" alt="proposed-u219-2" draft="unconfirmed">[ç ñ ü w]</exemplarCharacters>
+ <exemplarCharacters alt="proposed-u219-2" draft="unconfirmed">[a á à Ã¥ ä æ b c Ä d Ä‘ e é è f-n Å„ Å‹ o ó ò ö ø p-s Å¡ t ŧ u ú v x-z ž]</exemplarCharacters>
+ <exemplarCharacters alt="proposed-u227-1" draft="unconfirmed">[a á Ã¥ æ b c Ä d Ä‘ e-n Å‹ o ø p-s Å¡ t ŧ u-z ž]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">â€</quotationStart>
+ <alternateQuotationStart draft="unconfirmed">’</alternateQuotationStart>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">tsiengele</month>
+ <month type="2" draft="unconfirmed">goevte</month>
+ <month type="3" draft="unconfirmed">njoktje</month>
+ <month type="4" draft="unconfirmed">voerhtje</month>
+ <month type="5" draft="unconfirmed">suehpede</month>
+ <month type="6" draft="unconfirmed">ruffie</month>
+ <month type="7" draft="unconfirmed">snaltje</month>
+ <month type="8" draft="unconfirmed">mietske</month>
+ <month type="9" draft="unconfirmed">skierede</month>
+ <month type="10" draft="unconfirmed">rihkede</month>
+ <month type="11" draft="unconfirmed">rahka</month>
+ <month type="12" draft="unconfirmed">goeve</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">aejlege</day>
+ <day type="mon" draft="unconfirmed">måanta</day>
+ <day type="tue" draft="unconfirmed">däjsta</day>
+ <day type="wed" draft="unconfirmed">gaskevahkoe</day>
+ <day type="thu" draft="unconfirmed">dåarsta</day>
+ <day type="fri" draft="unconfirmed">bearjadahke</day>
+ <day type="sat" draft="unconfirmed">laavadahke</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal draft="unconfirmed">,</decimal>
+ <minusSign draft="unconfirmed">−</minusSign>
+ <nan draft="unconfirmed">¤¤¤</nan>
+ </symbols>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern draft="unconfirmed">#,##0 %</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/se_NO.xml b/libs/Zend/Locale/Data/se_NO.xml
new file mode 100755
index 0000000000..d241b62c65
--- /dev/null
+++ b/libs/Zend/Locale/Data/se_NO.xml
@@ -0,0 +1,266 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.12 $"/>
+ <generation date="$Date: 2006/07/11 19:27:38 $"/>
+ <language type="se"/>
+ <territory type="NO"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ang" draft="unconfirmed">Boares eaŋgalasgiella</language>
+ <language type="apa" draft="unconfirmed">Apachegielat</language>
+ <language type="be" draft="unconfirmed">Vilgesruoššagiella</language>
+ <language type="cs" draft="unconfirmed">TÅ¡ehkkiagiella</language>
+ <language type="da" draft="unconfirmed">Dánskkagiella</language>
+ <language type="de" draft="unconfirmed">Duiskkagiella</language>
+ <language type="el" draft="unconfirmed">Greikkagiella</language>
+ <language type="en" draft="unconfirmed">EÅ‹gelasgiella</language>
+ <language type="es" draft="unconfirmed">Spánskkagiella</language>
+ <language type="et" draft="unconfirmed">Eestegiella</language>
+ <language type="fi" draft="unconfirmed">Suomagiella</language>
+ <language type="fiu" draft="unconfirmed">Fenno-Ugrálaš</language>
+ <language type="fo" draft="unconfirmed">Sjekk</language>
+ <language type="fr" draft="unconfirmed">Fránskkagiella</language>
+ <language type="gem" draft="unconfirmed">Eará duiskkagielat</language>
+ <language type="is" draft="unconfirmed">Islánddagiela</language>
+ <language type="nb" draft="unconfirmed">Girjedárugiela</language>
+ <language type="nn" draft="unconfirmed">Ođđadárogiela</language>
+ <language type="no" draft="unconfirmed">Norgga</language>
+ <language type="ru" draft="unconfirmed">Ruoššagiela</language>
+ <language type="se" draft="unconfirmed">dávvisámegiella</language>
+ <language type="sma" draft="unconfirmed">Máttasámegiella</language>
+ <language type="smi" draft="unconfirmed">Sámi gielat</language>
+ <language type="smj" draft="unconfirmed">juvlevsámegiella</language>
+ <language type="smn" draft="unconfirmed">ánársámegiella</language>
+ <language type="sms" draft="unconfirmed">nuortálašgiella</language>
+ <language type="sv" draft="unconfirmed">Ruoŧagiella</language>
+ </languages>
+ <territories>
+ <territory type="011" draft="unconfirmed">Oarji-Afrihká</territory>
+ <territory type="014" draft="unconfirmed">Nuorta-Afrihká</territory>
+ <territory type="AT" draft="unconfirmed">Nuortariika</territory>
+ <territory type="AU" draft="unconfirmed">Austrália</territory>
+ <territory type="AX" draft="unconfirmed">Ålánda</territory>
+ <territory type="BE" draft="unconfirmed">Belgia</territory>
+ <territory type="BG" draft="unconfirmed">Bulgária</territory>
+ <territory type="BR" draft="unconfirmed">Brasil</territory>
+ <territory type="BY" draft="unconfirmed">Vilgesruošša</territory>
+ <territory type="CH" draft="unconfirmed">Å veica</territory>
+ <territory type="CM" draft="unconfirmed">Kamerun</territory>
+ <territory type="CN" draft="unconfirmed">Kiinná</territory>
+ <territory type="CZ" draft="unconfirmed">ÄŒhekkia</territory>
+ <territory type="DE" draft="unconfirmed">Duiskka</territory>
+ <territory type="DK" draft="unconfirmed">Dánmárku</territory>
+ <territory type="EE" draft="unconfirmed">Estteeana</territory>
+ <territory type="ES" draft="unconfirmed">Espánjja</territory>
+ <territory type="FI" draft="unconfirmed">Suopma</territory>
+ <territory type="FO" draft="unconfirmed">Fearsullot</territory>
+ <territory type="FR" draft="unconfirmed">Fránkriika</territory>
+ <territory type="GL" draft="unconfirmed">Kalaallit Nunaat</territory>
+ <territory type="GR" draft="unconfirmed">Greika</territory>
+ <territory type="HR" draft="unconfirmed">Kroátia</territory>
+ <territory type="HU" draft="unconfirmed">Ungár</territory>
+ <territory type="IE" draft="unconfirmed">Irlánda</territory>
+ <territory type="IQ" draft="unconfirmed">Irak</territory>
+ <territory type="IR" draft="unconfirmed">Ir</territory>
+ <territory type="IS" draft="unconfirmed">Islánda</territory>
+ <territory type="IT" draft="unconfirmed">Itália</territory>
+ <territory type="JP" draft="unconfirmed">Jáhpan</territory>
+ <territory type="KP" draft="unconfirmed">Dávvi-Korea</territory>
+ <territory type="KR" draft="unconfirmed">Mátta-Korea</territory>
+ <territory type="LB" draft="unconfirmed">Libanon</territory>
+ <territory type="LT" draft="unconfirmed">Lietuva</territory>
+ <territory type="LV" draft="unconfirmed">Látvia</territory>
+ <territory type="MA" draft="unconfirmed">Marokko</territory>
+ <territory type="MG" draft="unconfirmed">Madagaskar</territory>
+ <territory type="MH" draft="unconfirmed">Marshallsullot</territory>
+ <territory type="MK" draft="unconfirmed">Makedonia</territory>
+ <territory type="MP" draft="unconfirmed">Dávvi-Mariánat</territory>
+ <territory type="MR" draft="unconfirmed">Mauretania</territory>
+ <territory type="MV" draft="unconfirmed">Malediivvat</territory>
+ <territory type="MY" draft="unconfirmed">Malesia</territory>
+ <territory type="NL" draft="unconfirmed">Nederland</territory>
+ <territory type="NO" draft="unconfirmed">Norgga</territory>
+ <territory type="NZ" draft="unconfirmed">Aotearoa</territory>
+ <territory type="PH" draft="unconfirmed">Filippinene</territory>
+ <territory type="PL" draft="unconfirmed">Polska</territory>
+ <territory type="PS" draft="unconfirmed">Palestina</territory>
+ <territory type="RU" draft="unconfirmed">Ruošša</territory>
+ <territory type="SE" draft="unconfirmed">Ruoŧŧa</territory>
+ <territory type="SI" draft="unconfirmed">Å lovenia</territory>
+ <territory type="SJ" draft="unconfirmed">Svalbárdda ja Jan Mayen</territory>
+ <territory type="SK" draft="unconfirmed">Å lovakia</territory>
+ <territory type="SR" draft="unconfirmed">Surinam</territory>
+ <territory type="TD" draft="unconfirmed">ÄŒhad</territory>
+ <territory type="TL" draft="unconfirmed">Nuorta-Timor</territory>
+ <territory type="TR" draft="unconfirmed">Durka</territory>
+ <territory type="US" draft="unconfirmed">Amerihká Ovttastuvvan Stáhtat</territory>
+ <territory type="ZA" draft="unconfirmed">Mátta-Afrihká</territory>
+ </territories>
+ <keys>
+ <key type="calendar" draft="unconfirmed">kaleandar</key>
+ <key type="currency" draft="unconfirmed">valuhtta</key>
+ </keys>
+ <measurementSystemNames>
+ <measurementSystemName type="metric" draft="unconfirmed">mehter</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <delimiters>
+ <quotationStart draft="unconfirmed">«</quotationStart>
+ <quotationEnd draft="unconfirmed">»</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">&quot;</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">&quot;</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">ođđj</month>
+ <month type="2" draft="unconfirmed">guov</month>
+ <month type="3" draft="unconfirmed">njuk</month>
+ <month type="4" draft="unconfirmed">cuo</month>
+ <month type="5" draft="unconfirmed">mies</month>
+ <month type="6" draft="unconfirmed">geas</month>
+ <month type="7" draft="unconfirmed">suoi</month>
+ <month type="8" draft="unconfirmed">borg</month>
+ <month type="9" draft="unconfirmed">ÄakÄ</month>
+ <month type="10" draft="unconfirmed">golg</month>
+ <month type="11" draft="unconfirmed">skáb</month>
+ <month type="12" draft="unconfirmed">juov</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">ođđajagemánnu</month>
+ <month type="2" draft="unconfirmed">guovvamánnu</month>
+ <month type="3" draft="unconfirmed">njukÄamánnu</month>
+ <month type="4" draft="unconfirmed">cuoŋománnu</month>
+ <month type="5" draft="unconfirmed">miessemánnu</month>
+ <month type="6" draft="unconfirmed">geassemánnu</month>
+ <month type="7" draft="unconfirmed">suoidnemánnu</month>
+ <month type="8" draft="unconfirmed">borgemánnu</month>
+ <month type="9" draft="unconfirmed">ÄakÄamánnu</month>
+ <month type="10" draft="unconfirmed">golggotmánnu</month>
+ <month type="11" draft="unconfirmed">skábmamánnu</month>
+ <month type="12" draft="unconfirmed">juovlamánnu</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">O</month>
+ <month type="2" draft="unconfirmed">G</month>
+ <month type="3" draft="unconfirmed">N</month>
+ <month type="4" draft="unconfirmed">C</month>
+ <month type="5" draft="unconfirmed">M</month>
+ <month type="6" draft="unconfirmed">G</month>
+ <month type="7" draft="unconfirmed">S</month>
+ <month type="8" draft="unconfirmed">B</month>
+ <month type="9" draft="unconfirmed">Č</month>
+ <month type="10" draft="unconfirmed">G</month>
+ <month type="11" draft="unconfirmed">S</month>
+ <month type="12" draft="unconfirmed">J</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">sotn</day>
+ <day type="mon" draft="unconfirmed">vuos</day>
+ <day type="tue" draft="unconfirmed">maŋ</day>
+ <day type="wed" draft="unconfirmed">gask</day>
+ <day type="thu" draft="unconfirmed">duor</day>
+ <day type="fri" draft="unconfirmed">bear</day>
+ <day type="sat" draft="unconfirmed">láv</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">sotnabeaivi</day>
+ <day type="mon" draft="unconfirmed">vuossárga</day>
+ <day type="tue" draft="unconfirmed">maŋŋebárga</day>
+ <day type="wed" draft="unconfirmed">gaskavahkku</day>
+ <day type="thu" draft="unconfirmed">duorasdat</day>
+ <day type="fri" draft="unconfirmed">bearjadat</day>
+ <day type="sat" draft="unconfirmed">lávvardat</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">s</day>
+ <day type="mon" draft="unconfirmed">v</day>
+ <day type="tue" draft="unconfirmed">m</day>
+ <day type="wed" draft="unconfirmed">g</day>
+ <day type="thu" draft="unconfirmed">d</day>
+ <day type="fri" draft="unconfirmed">b</day>
+ <day type="sat" draft="unconfirmed">l</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">Ovdal Kristtusa</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">OK</era>
+ </eraAbbr>
+ </eras>
+ <fields>
+ <field type="year">
+ <displayName draft="unconfirmed">jáhki</displayName>
+ </field>
+ <field type="month">
+ <displayName draft="unconfirmed">mánnu</displayName>
+ </field>
+ <field type="week">
+ <displayName draft="unconfirmed">váhkku</displayName>
+ </field>
+ <field type="day">
+ <displayName draft="unconfirmed">beaivi</displayName>
+ </field>
+ <field type="weekday">
+ <displayName draft="unconfirmed">váhkkubeaivi</displayName>
+ </field>
+ <field type="hour">
+ <displayName draft="unconfirmed">tiibmu</displayName>
+ </field>
+ <field type="minute">
+ <displayName draft="unconfirmed">minuhtta</displayName>
+ </field>
+ <field type="second">
+ <displayName draft="unconfirmed">sekunda</displayName>
+ </field>
+ <field type="zone">
+ <displayName draft="unconfirmed">sone</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="FIM">
+ <displayName draft="unconfirmed">suoma márkki</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName draft="unconfirmed">Norga kruvdno</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName draft="unconfirmed">Ruoŧŧa kruvdno</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName draft="unconfirmed">silba</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName draft="unconfirmed">golli</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">jo</yesstr>
+ <nostr draft="unconfirmed">ii</nostr>
+ </messages>
+ </posix>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sh.xml b/libs/Zend/Locale/Data/sh.xml
new file mode 100755
index 0000000000..1e764c0131
--- /dev/null
+++ b/libs/Zend/Locale/Data/sh.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="sh"/>
+ </identity>
+ <alias source="sr_Latn" path="//ldml"/>
+</ldml>
diff --git a/libs/Zend/Locale/Data/sh_BA.xml b/libs/Zend/Locale/Data/sh_BA.xml
new file mode 100755
index 0000000000..f2f0700ea1
--- /dev/null
+++ b/libs/Zend/Locale/Data/sh_BA.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.13 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="sh"/>
+ <territory type="BA"/>
+ </identity>
+ <alias source="sr_Latn_BA" path="//ldml" draft="unconfirmed"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sh_CS.xml b/libs/Zend/Locale/Data/sh_CS.xml
new file mode 100755
index 0000000000..6a238bd856
--- /dev/null
+++ b/libs/Zend/Locale/Data/sh_CS.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="sh"/>
+ <territory type="CS"/>
+ </identity>
+ <alias source="sr_Latn_CS" path="//ldml" draft="unconfirmed"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sh_YU.xml b/libs/Zend/Locale/Data/sh_YU.xml
new file mode 100755
index 0000000000..779d015e5e
--- /dev/null
+++ b/libs/Zend/Locale/Data/sh_YU.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="sh"/>
+ <territory type="YU"/>
+ </identity>
+ <alias source="sr_Latn_CS" path="//ldml"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sid.xml b/libs/Zend/Locale/Data/sid.xml
new file mode 100755
index 0000000000..bc2b79a6f1
--- /dev/null
+++ b/libs/Zend/Locale/Data/sid.xml
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.31 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="sid"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar" draft="unconfirmed">Arabic</language>
+ <language type="de" draft="unconfirmed">German</language>
+ <language type="en" draft="unconfirmed">English</language>
+ <language type="es" draft="unconfirmed">Spanish</language>
+ <language type="fr" draft="unconfirmed">French</language>
+ <language type="hi" draft="unconfirmed">Hindi</language>
+ <language type="it" draft="unconfirmed">Italian</language>
+ <language type="ja" draft="unconfirmed">Japanese</language>
+ <language type="pt" draft="unconfirmed">Portuguese</language>
+ <language type="ru" draft="unconfirmed">Russian</language>
+ <language type="sid" draft="unconfirmed">Sidaamu Afo</language>
+ <language type="zh" draft="unconfirmed">Chinese</language>
+ </languages>
+ <scripts>
+ <script type="Latn" draft="unconfirmed">Latin</script>
+ </scripts>
+ <territories>
+ <territory type="BR" draft="unconfirmed">Brazil</territory>
+ <territory type="CN" draft="unconfirmed">China</territory>
+ <territory type="DE" draft="unconfirmed">Germany</territory>
+ <territory type="ET" draft="unconfirmed">Itiyoophiya</territory>
+ <territory type="FR" draft="unconfirmed">France</territory>
+ <territory type="GB" draft="unconfirmed">United Kingdom</territory>
+ <territory type="IN" draft="unconfirmed">India</territory>
+ <territory type="IT" draft="unconfirmed">Italy</territory>
+ <territory type="JP" draft="unconfirmed">Japan</territory>
+ <territory type="RU" draft="unconfirmed">Russia</territory>
+ <territory type="US" draft="unconfirmed">United States</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[a-z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Jan</month>
+ <month type="2" draft="unconfirmed">Feb</month>
+ <month type="3" draft="unconfirmed">Mar</month>
+ <month type="4" draft="unconfirmed">Apr</month>
+ <month type="5" draft="unconfirmed">May</month>
+ <month type="6" draft="unconfirmed">Jun</month>
+ <month type="7" draft="unconfirmed">Jul</month>
+ <month type="8" draft="unconfirmed">Aug</month>
+ <month type="9" draft="unconfirmed">Sep</month>
+ <month type="10" draft="unconfirmed">Oct</month>
+ <month type="11" draft="unconfirmed">Nov</month>
+ <month type="12" draft="unconfirmed">Dec</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">January</month>
+ <month type="2" draft="unconfirmed">February</month>
+ <month type="3" draft="unconfirmed">March</month>
+ <month type="4" draft="unconfirmed">April</month>
+ <month type="5" draft="unconfirmed">May</month>
+ <month type="6" draft="unconfirmed">June</month>
+ <month type="7" draft="unconfirmed">July</month>
+ <month type="8" draft="unconfirmed">August</month>
+ <month type="9" draft="unconfirmed">September</month>
+ <month type="10" draft="unconfirmed">October</month>
+ <month type="11" draft="unconfirmed">November</month>
+ <month type="12" draft="unconfirmed">December</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">J</month>
+ <month type="2" draft="unconfirmed">F</month>
+ <month type="3" draft="unconfirmed">M</month>
+ <month type="4" draft="unconfirmed">A</month>
+ <month type="5" draft="unconfirmed">M</month>
+ <month type="6" draft="unconfirmed">J</month>
+ <month type="7" draft="unconfirmed">J</month>
+ <month type="8" draft="unconfirmed">A</month>
+ <month type="9" draft="unconfirmed">S</month>
+ <month type="10" draft="unconfirmed">O</month>
+ <month type="11" draft="unconfirmed">N</month>
+ <month type="12" draft="unconfirmed">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Sam</day>
+ <day type="mon" draft="unconfirmed">San</day>
+ <day type="tue" draft="unconfirmed">Mak</day>
+ <day type="wed" draft="unconfirmed">Row</day>
+ <day type="thu" draft="unconfirmed">Ham</day>
+ <day type="fri" draft="unconfirmed">Arb</day>
+ <day type="sat" draft="unconfirmed">Qid</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Sambata</day>
+ <day type="mon" draft="unconfirmed">Sanyo</day>
+ <day type="tue" draft="unconfirmed">Maakisanyo</day>
+ <day type="wed" draft="unconfirmed">Roowe</day>
+ <day type="thu" draft="unconfirmed">Hamuse</day>
+ <day type="fri" draft="unconfirmed">Arbe</day>
+ <day type="sat" draft="unconfirmed">Qidaame</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">S</day>
+ <day type="mon" draft="unconfirmed">S</day>
+ <day type="tue" draft="unconfirmed">M</day>
+ <day type="wed" draft="unconfirmed">R</day>
+ <day type="thu" draft="unconfirmed">H</day>
+ <day type="fri" draft="unconfirmed">A</day>
+ <day type="sat" draft="unconfirmed">Q</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">soodo</am>
+ <pm draft="unconfirmed">hawwaro</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">YIA</era>
+ <era type="1" draft="unconfirmed">YIG</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEE, MMMM dd, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MMM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">Brazilian Real</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="unconfirmed">Chinese Yuan Renminbi</displayName>
+ </currency>
+ <currency type="ETB">
+ <symbol draft="unconfirmed">$</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="unconfirmed">Euro</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">British Pound Sterling</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">Indian Rupee</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="unconfirmed">Japanese Yen</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">Russian Ruble</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">US Dollar</displayName>
+ <symbol draft="unconfirmed">US$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sid_ET.xml b/libs/Zend/Locale/Data/sid_ET.xml
new file mode 100755
index 0000000000..2389196182
--- /dev/null
+++ b/libs/Zend/Locale/Data/sid_ET.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.27 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="sid"/>
+ <territory type="ET"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sk.xml b/libs/Zend/Locale/Data/sk.xml
new file mode 100755
index 0000000000..7a9bbf8fd8
--- /dev/null
+++ b/libs/Zend/Locale/Data/sk.xml
@@ -0,0 +1,1413 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.66 $"/>
+ <generation date="$Date: 2006/10/26 22:46:09 $"/>
+ <language type="sk"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar">arabský</language>
+ <language type="ar" alt="proposed" draft="provisional">arabÄina</language>
+ <language type="bg">bulharský</language>
+ <language type="bg" alt="proposed" draft="provisional">bulharÄina</language>
+ <language type="cs">Äeský</language>
+ <language type="cs" alt="proposed" draft="provisional">ÄeÅ¡tina</language>
+ <language type="da">dánsky</language>
+ <language type="da" alt="proposed" draft="provisional">dánÄina</language>
+ <language type="de">nemecký</language>
+ <language type="de" alt="proposed" draft="provisional">nemÄina</language>
+ <language type="el">grécky</language>
+ <language type="el" alt="proposed" draft="provisional">gréÄtina</language>
+ <language type="en">anglický</language>
+ <language type="en" alt="proposed" draft="provisional">angliÄtina</language>
+ <language type="es">Å¡panielsky</language>
+ <language type="es" alt="proposed" draft="provisional">Å¡panielÄina</language>
+ <language type="et">estónsky</language>
+ <language type="et" alt="proposed" draft="provisional">estónÄina</language>
+ <language type="fi">fínsky</language>
+ <language type="fi" alt="proposed" draft="provisional">fínÄina</language>
+ <language type="fr">francúzsky</language>
+ <language type="fr" alt="proposed" draft="provisional">francúzština</language>
+ <language type="he">hebrejský</language>
+ <language type="he" alt="proposed" draft="provisional">hebrejÄina</language>
+ <language type="hr">chorvátsky</language>
+ <language type="hr" alt="proposed" draft="provisional">chorvátÄina</language>
+ <language type="hu">maÄarský</language>
+ <language type="hu" alt="proposed" draft="provisional">maÄarÄina</language>
+ <language type="it">taliansky</language>
+ <language type="it" alt="proposed" draft="provisional">talianÄina</language>
+ <language type="ja">japonský</language>
+ <language type="ja" alt="proposed" draft="provisional">japonÄina</language>
+ <language type="ko">kórejský</language>
+ <language type="ko" alt="proposed" draft="provisional">kórejÄina</language>
+ <language type="lt">litovský</language>
+ <language type="lt" alt="proposed" draft="provisional">litovÄina</language>
+ <language type="lv">lotyšský</language>
+ <language type="lv" alt="proposed" draft="provisional">lotyština</language>
+ <language type="mt" draft="provisional">maltÄina</language>
+ <language type="nl">holandský</language>
+ <language type="nl" alt="proposed" draft="provisional">holandÄina</language>
+ <language type="no">nórsky</language>
+ <language type="no" alt="proposed" draft="provisional">nórÄina</language>
+ <language type="pl">poľský</language>
+ <language type="pl" alt="proposed" draft="provisional">poľština</language>
+ <language type="pt">portugalský</language>
+ <language type="pt" alt="proposed" draft="provisional">portugalÄina</language>
+ <language type="ro">rumunský</language>
+ <language type="ro" alt="proposed" draft="provisional">rumunÄina</language>
+ <language type="ru">ruský</language>
+ <language type="ru" alt="proposed" draft="provisional">ruština</language>
+ <language type="sk">slovenský</language>
+ <language type="sk" alt="proposed" draft="provisional">slovenÄina</language>
+ <language type="sl">slovinský</language>
+ <language type="sl" alt="proposed" draft="provisional">slovinÄina</language>
+ <language type="sv">švédsky</language>
+ <language type="sv" alt="proposed" draft="provisional">Å¡védÄina</language>
+ <language type="tr">turecký</language>
+ <language type="tr" alt="proposed" draft="provisional">tureÄtina</language>
+ <language type="zh">Äínsky</language>
+ <language type="zh" alt="proposed" draft="provisional">ÄínÅ¡tina</language>
+ </languages>
+ <scripts>
+ <script type="Arab">Arabský</script>
+ <script type="Armn">Arménsky</script>
+ <script type="Cyrl">Cyrilika</script>
+ <script type="Grek">Grécky</script>
+ <script type="Zyyy">Obecný</script>
+ </scripts>
+ <territories>
+ <territory type="001">Svet</territory>
+ <territory type="002">Afrika</territory>
+ <territory type="005">Južná Amerika</territory>
+ <territory type="011">Západná Afrika</territory>
+ <territory type="013">Stredná Amerika</territory>
+ <territory type="014">Východná Afrika</territory>
+ <territory type="015">Severná Afrika</territory>
+ <territory type="017">Stredná Afrika</territory>
+ <territory type="018">Južná Afrika [018]</territory>
+ <territory type="019">Americký kontinent</territory>
+ <territory type="021">Severná Amerika</territory>
+ <territory type="029">Karibik</territory>
+ <territory type="030">Východná Ãzia</territory>
+ <territory type="035">Juhovýchodná Ãzia</territory>
+ <territory type="039">Južná Európa</territory>
+ <territory type="053">Austrália a Nový Zéland</territory>
+ <territory type="054">Melanézia</territory>
+ <territory type="057">Mikronésia</territory>
+ <territory type="061">Polynézia</territory>
+ <territory type="062">Južná Ãzia</territory>
+ <territory type="142">Ãzia</territory>
+ <territory type="145">Západná Ãzia</territory>
+ <territory type="150">Európa</territory>
+ <territory type="151">Východná Európa</territory>
+ <territory type="154">Severná Európa</territory>
+ <territory type="155">Západná Európa</territory>
+ <territory type="200">ÄŒeskoslovensko</territory>
+ <territory type="830">Kanál La Manche</territory>
+ <territory type="IM">Ostrov Man</territory>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Spojené arabské emiráty</territory>
+ <territory type="AF">Afganistan</territory>
+ <territory type="AG">Antigua a Barbados</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albánsko</territory>
+ <territory type="AM">Arménsko</territory>
+ <territory type="AN">Holandské Antily</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarctica</territory>
+ <territory type="AR">Argentína</territory>
+ <territory type="AS">Americká Samoa</territory>
+ <territory type="AT">Rakúsko</territory>
+ <territory type="AU">Austrália</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Alandské ostrovy</territory>
+ <territory type="AZ">Azerbajdžan</territory>
+ <territory type="BA">Bosna a Hercegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladéš</territory>
+ <territory type="BE">Belgicko</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulharsko</territory>
+ <territory type="BH">Bahrajn</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermudy</territory>
+ <territory type="BN">Brunej</territory>
+ <territory type="BO">Bolívia</territory>
+ <territory type="BR">Brazília</territory>
+ <territory type="BS">Bahamy</territory>
+ <territory type="BT">Bután</territory>
+ <territory type="BV">Bouvetov ostrov</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Bielorusko</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Kokosové (Keelingove) ostrovy</territory>
+ <territory type="CD">Konžská demokratická republika</territory>
+ <territory type="CF">Stredoafrická republika</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Å vajÄiarsko</territory>
+ <territory type="CI">Pobrežie Slonoviny</territory>
+ <territory type="CK">Cookove ostrovy</territory>
+ <territory type="CL">ÄŒile</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Čína</territory>
+ <territory type="CO">Kolumbia</territory>
+ <territory type="CR">Kostarika</territory>
+ <territory type="CS">Srbsko a ÄŒierna Hora</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Kapverdy</territory>
+ <territory type="CX">VianoÄný ostrov</territory>
+ <territory type="CY">Cyprus</territory>
+ <territory type="CZ">Česká republika</territory>
+ <territory type="DE">Nemecko</territory>
+ <territory type="DJ">Džibuti</territory>
+ <territory type="DK">Dánsko</territory>
+ <territory type="DM">Dominika</territory>
+ <territory type="DO">Dominikánska republika</territory>
+ <territory type="DZ">Alžírsko</territory>
+ <territory type="EC">Ekvádor</territory>
+ <territory type="EE">Estónsko</territory>
+ <territory type="EG">Egypt</territory>
+ <territory type="EH">Západná Sahara</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Å panielsko</territory>
+ <territory type="ET">Etiópia</territory>
+ <territory type="FI">Fínsko</territory>
+ <territory type="FJ">Fidži</territory>
+ <territory type="FK">Falklandské ostrovy</territory>
+ <territory type="FM">Mikronézia, Federatívne štáty</territory>
+ <territory type="FO">Faerské ostrovy</territory>
+ <territory type="FR">Francúzsko</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Spojené kráľovstvo</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Gruzínsko</territory>
+ <territory type="GF">Francúzska Guayana</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltár</territory>
+ <territory type="GL">Grónsko</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Rovníková Guinea</territory>
+ <territory type="GR">Grécko</territory>
+ <territory type="GS">Južná Georgia a Južné Sandwichove ostrovy</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinea-Bissau</territory>
+ <territory type="GY">Guayana</territory>
+ <territory type="HK">Hong Kong S.A.R. Číny</territory>
+ <territory type="HM">Heardove ostrovy a McDonaldove ostrovy</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Chorvátsko</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">MaÄarsko</territory>
+ <territory type="ID">Indonézia</territory>
+ <territory type="IE">Ãrsko</territory>
+ <territory type="IL">Izrael</territory>
+ <territory type="IN">India</territory>
+ <territory type="IO">Britské územie v Indickom oceáne</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IR">Irán</territory>
+ <territory type="IS">Island</territory>
+ <territory type="IT">Taliansko</territory>
+ <territory type="JM">Jamajka</territory>
+ <territory type="JO">Jordánsko</territory>
+ <territory type="JP">Japonsko</territory>
+ <territory type="KE">Keňa</territory>
+ <territory type="KG">Kirgizsko</territory>
+ <territory type="KH">Kambodža</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komory</territory>
+ <territory type="KN">Saint Kitts a Nevis</territory>
+ <territory type="KP">Kórea, Severná</territory>
+ <territory type="KR">Kórea, Južná</territory>
+ <territory type="KW">Kuvajt</territory>
+ <territory type="KY">Kajmanské ostrovy</territory>
+ <territory type="KZ">Kazachstan</territory>
+ <territory type="LA">Laoská ľudovodemokratická republika</territory>
+ <territory type="LB">Libanon</territory>
+ <territory type="LC">Svätá Lucia</territory>
+ <territory type="LI">Lichtenštajnsko</territory>
+ <territory type="LK">Srí Lanka</territory>
+ <territory type="LR">Libéria</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Litva</territory>
+ <territory type="LU">Luxembursko</territory>
+ <territory type="LV">Lotyšsko</territory>
+ <territory type="LY">Lýbijská arabská džamahírija</territory>
+ <territory type="MA">Maroko</territory>
+ <territory type="MC">Monako</territory>
+ <territory type="MD">Moldavsko, republika</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshallove ostrovy</territory>
+ <territory type="MK">Macedónsko, republika</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Mjanmarsko</territory>
+ <territory type="MN">Mongolsko</territory>
+ <territory type="MO">Makao S.A.R. Číny</territory>
+ <territory type="MP">Severné Mariány</territory>
+ <territory type="MQ">Martinik</territory>
+ <territory type="MR">Mauritánia</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Maurícius</territory>
+ <territory type="MV">Maldivy</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Mexiko</territory>
+ <territory type="MY">Malajzia</territory>
+ <territory type="MZ">Mozambik</territory>
+ <territory type="NA">Namíbia</territory>
+ <territory type="NC">Nová Kaledónia</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Norfolkov ostrov</territory>
+ <territory type="NG">Nigéria</territory>
+ <territory type="NI">Nikaragua</territory>
+ <territory type="NL">Holandsko</territory>
+ <territory type="NO">Nórsko</territory>
+ <territory type="NP">Nepál</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Nový Zéland</territory>
+ <territory type="OM">Omán</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Francúzska Polynézia</territory>
+ <territory type="PG">Papua Nová Guinea</territory>
+ <territory type="PH">Filipíny</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Poľsko</territory>
+ <territory type="PM">Saint Pierre a Miquelon</territory>
+ <territory type="PN">Pitcairnove ostrovy</territory>
+ <territory type="PR">Portoriko</territory>
+ <territory type="PS">Palestínske územie</territory>
+ <territory type="PT">Portugalsko</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguaj</territory>
+ <territory type="QA">Katar</territory>
+ <territory type="QO">Tichomorie - ostatné</territory>
+ <territory type="RE">Reunion</territory>
+ <territory type="RO">Rumunsko</territory>
+ <territory type="RU">Ruská federácia</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Saudská Arábia</territory>
+ <territory type="SB">Šalamúnove ostrovy</territory>
+ <territory type="SC">Seychelské ostrovy</territory>
+ <territory type="SD">Sudán</territory>
+ <territory type="SE">Švédsko</territory>
+ <territory type="SG">Singapur</territory>
+ <territory type="SH">Svätá Helena</territory>
+ <territory type="SI">Slovinsko</territory>
+ <territory type="SJ">Å picbergy a Jan Mayen</territory>
+ <territory type="SK">Slovenská republika</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Maríno</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somálsko</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">Svätý Tomáš a Princove ostrovy</territory>
+ <territory type="SV">Salvador</territory>
+ <territory type="SY">Sýrska arabská republika</territory>
+ <territory type="SZ">Svazijsko</territory>
+ <territory type="TC">Turks a Caicos</territory>
+ <territory type="TD">ÄŒad</territory>
+ <territory type="TF">Francúzske južné územia</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Thajsko</territory>
+ <territory type="TJ">Tadžikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Východný Timor</territory>
+ <territory type="TM">Turkménsko</territory>
+ <territory type="TN">Tunisko</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turecko</territory>
+ <territory type="TT">Trinidad a Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Tajwan</territory>
+ <territory type="TZ">Tanzánia</territory>
+ <territory type="UA">Ukrajina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">Menšie odľahlé ostrovy USA</territory>
+ <territory type="US">Spojené štáty</territory>
+ <territory type="UY">Uruguaj</territory>
+ <territory type="UZ">Uzbekistan</territory>
+ <territory type="VA">Svätá stolica (Vatikánsky mestský štát)</territory>
+ <territory type="VC">Svätý Vincent a Grenadíny</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Britské panenské ostrovy</territory>
+ <territory type="VI">Panenské ostrovy - USA</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis a Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Južná Afrika</territory>
+ <territory type="ZM">Zambia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ <keys>
+ <key type="calendar">Kalendár</key>
+ <key type="collation">Triedenie</key>
+ <key type="currency">Mena</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">Buddhistický kalendár</type>
+ <type type="chinese" key="calendar">Čínsky kalendár</type>
+ <type type="direct" key="collation">Priame triedenie</type>
+ <type type="gregorian" key="calendar">Gregoriánsky kalendár</type>
+ <type type="hebrew" key="calendar">Židovský kalendár</type>
+ <type type="islamic" key="calendar">Islamský kalendár</type>
+ <type type="islamic-civil" key="calendar">Islamský obÄiansky kalendár</type>
+ <type type="japanese" key="calendar">Japonský kalendár</type>
+ <type type="phonebook" key="collation">Lexikografické triedenie</type>
+ <type type="pinyin" key="collation">Triedenie pinyin</type>
+ <type type="stroke" key="collation">Tiedenie podľa ťahov</type>
+ <type type="traditional" key="collation">TradiÄné</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a á ä b c Ä d Ä e é f-h {ch} i í j-l ĺ ľ m n ň o ó ô p-r Å• s Å¡ t Å¥ u ú v-y ý z ž]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">jan</month>
+ <month type="2">feb</month>
+ <month type="3">mar</month>
+ <month type="4">apr</month>
+ <month type="5">máj</month>
+ <month type="6">jún</month>
+ <month type="7">júl</month>
+ <month type="8">aug</month>
+ <month type="9">sep</month>
+ <month type="10">okt</month>
+ <month type="11">nov</month>
+ <month type="12">dec</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">január</month>
+ <month type="2">február</month>
+ <month type="3">marec</month>
+ <month type="4">apríl</month>
+ <month type="5">máj</month>
+ <month type="6">jún</month>
+ <month type="7">júl</month>
+ <month type="8">august</month>
+ <month type="9">september</month>
+ <month type="10">október</month>
+ <month type="11">november</month>
+ <month type="12">december</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">j</month>
+ <month type="2">f</month>
+ <month type="3">m</month>
+ <month type="4">a</month>
+ <month type="5">m</month>
+ <month type="6">j</month>
+ <month type="7">j</month>
+ <month type="8">a</month>
+ <month type="9">s</month>
+ <month type="10">o</month>
+ <month type="11">n</month>
+ <month type="12">d</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Ne</day>
+ <day type="mon">Po</day>
+ <day type="tue">Ut</day>
+ <day type="wed">St</day>
+ <day type="thu">Å t</day>
+ <day type="fri">Pi</day>
+ <day type="sat">So</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Nedeľa</day>
+ <day type="mon">Pondelok</day>
+ <day type="tue">Utorok</day>
+ <day type="wed">Streda</day>
+ <day type="thu">Å tvrtok</day>
+ <day type="fri">Piatok</day>
+ <day type="sat">Sobota</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">N</day>
+ <day type="mon">P</day>
+ <day type="tue">U</day>
+ <day type="wed">S</day>
+ <day type="thu">Å </day>
+ <day type="fri">P</day>
+ <day type="sat">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1">1. štvrťrok</quarter>
+ <quarter type="2">2. štvrťrok</quarter>
+ <quarter type="3">3. štvrťrok</quarter>
+ <quarter type="4">4. štvrťrok</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraAbbr>
+ <era type="0">pred n.l.</era>
+ <era type="1">n.l.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d.M.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d.M.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d. MMMM</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">d.M</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="provisional">QQQQ yy</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">M.yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HHmm;-HHmm</hourFormat>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Južný pól</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity>Å anghaj</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity>Galapágy</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>Kanárske ostrovy</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>Londýn</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>Ulanbátar</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>Azorské ostrovy</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lisabon</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moskva</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>Jekaterinburg</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>Krasnojarsko</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity>Irkutsko</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>Jakutsko</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>Sachalin</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>KamÄatka</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>Užhorod</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>Kyjev</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>Záporožie</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Taškent</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Andorská peseta</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>UAE dirham</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName>Albánsky lek</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>Armenský dram</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>Nizozemský Antilský guilder</displayName>
+ <symbol>NA f.</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>Angolská kwanza</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Angolská kwanza (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>Angolská nová kwanza (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>Angolská kwanza Reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>Argentinský austral</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Argentinské peso (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Argentinské peso</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>Rakúsky šiling</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>Austrálsky dolár</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>Arubský guilder</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>Azerbaidžanský manat</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>Bosnianský dinár</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>Bosnianský konvertibilná marka</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>Barbadoský dolár</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>Bangladéšska taka</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>Belgický frank (konvertibilný)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Belgický frank</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>Belgický frank (finanÄný)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>Bulharský leva</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>Bulharský leva nový</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>Bahraiský dinár</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>Burundský frank</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>Bermudský dolár</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>Bruneiský dolár</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>Bolivíjske peso</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Bolivíjske mvdol</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>Bolivíjske Cruzeiro Novo (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>Bolivíjske cruzado</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>Bolivíjske cruzeiro (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Bolivíjsky real</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRN">
+ <displayName>Brazílske Cruzado Novo</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>Brazílske cruzeiro</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>Bahamský dolár</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>Bhutansky ngultrum</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>Burmese Kyat</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>Botswanan Pula</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>Belarussian nový rubeľ (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>Belarussian rubeľ</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>Belize dolár</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>Kanadský dolár</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>Konžský frank Congolais</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Å vajÄiarský frank</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CLF">
+ <displayName>Čílske Unidades de Fomento</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Čílske peso</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>Čínsky Yuan Renminbi</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>Colombijské peso</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="CRC">
+ <displayName>Kostarikský colon</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSK">
+ <displayName>Československá koruna</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Kubánske peso</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Cape Verde eskudo</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>Cypruská libra</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>Česká koruna</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>Východonemecká marka</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Nemecká marka</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Džibutský frank</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>Dánska krone</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>Dominikánske peso</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>Alžírsky dinár</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>Ekuadorský sucre</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>Ekuadorský Unidad de Valor Constante (UVC)</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>Estónska kroon</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>Egyptská libra</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Eritrejská nakfa</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Španielská peseta</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>Ethiopský birr</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>Finská marka</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Fiji dolár</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>Falklandská libra</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Francúzsky frank</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Britská libra</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>Gruzínsky Kupon Larit</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>Gruzínsky lari</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>Ghanský cedi</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>Gibraltarská libra</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>Gambský dalasi</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Guinejský frank</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>Guinejský syli</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Rovníková Guinea Ekwele Guineana</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Grécka drachma</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Guatemalský quetzal</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>Portugalská Guinea eskudo</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Guinea-Bissau peso</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>Guyanský dolár</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>Hong Kongský dolár</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>Hoduraská lempira</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>Chorvátsky dinár</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Chorvátska kuna</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>Haitské gourde</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>MaÄarský forint</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>Indonézska rupia</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>Ãrska libra</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>Izraelská libra</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Izraelský šekel</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Indijská rupia</displayName>
+ <symbol>INR</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>Iracký dinár</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>Iránsky rial</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>Islandská krona</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>Talianská lira</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>Jamajský dolár</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>Jordánsky dinár</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>Japonský yen</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>Keňský šiling</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>Kyrgyský som</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>Kambodžský riel</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>Comoro frank</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>Severokórejský won</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Juhokórejský won</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>Kuvaitský dinár</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>Kajmanský dolár</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Kazažský tenge</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>Laoský kip</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>Libanonská libra</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>Šrilanská rupia</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>Libérský dolár</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Lesothský loti</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LTL">
+ <displayName>Litevská lita</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Litevský talonas</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Luxemburský frank</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Lotyšský lats</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>Lotyšský rubeľ</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>Libyjský dinár</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>Marocký dirham</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>Marocký frank</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>Moldavský leu</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>Madagaskarský ariary</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Madagaskarský frank</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>Macedónsky denár</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>Malský frank</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Myanmarský kyat</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>Mongolský tugrik</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Macao Pataca</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Mauritania Ouguiya</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>Maltská lira</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>Maltská libra</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>Mauritská rupia</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>Maldivská rufiyaa</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Malavská kwacha</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>Mexické peso</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>Mexické striborné peso (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>Mexické Unidad de Inversion (UDI)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Malajský ringgit</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>Mozambijské eskudo</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Mozambijské metical</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>Namibský dolár</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>Nigerská naira</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>Nikaragujská cordoba</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>Nikaragujská Cordoba Oro</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Nizozemský guilder</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Nórksy krone</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>Nepálska rupia</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>Novozélandský dolár</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>Ománský rial</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>Panamská balboa</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>Peruvský inti</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>Peruvský sol Nuevo</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>Peruvský sol</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Papua Nová Guinea kina</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>Filipínske peso</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>Pakistanská rupia</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>Polský zloty</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Polský zloty (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Portugalské eskudo</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>Paraguayské guarani</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>Qatarský rial</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="ROL">
+ <displayName>Rumunský leu</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>Ruský rubeľ</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Ruský rubeľ (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>Rwandský frank</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>Saudský riyal</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>Solomon Islands dolár</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>Sejšelská rupia</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>Sudánsky dinár</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>Sudánska libra</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>Švédska krona</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>Singapúrsky dolár</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>Libra</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Slovinský Tolar</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Slovenská koruna</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>Sierra Leone Leone</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>Somálsky šiling</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRG">
+ <displayName>Surinamský guilder</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>Sao Tome a Principe dobra</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>Sovietský rubeľ</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>El Salvadorský colon</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>Syrská libra</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>Swaziland lilangeni</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>Thajský bát</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>Tadžikistanský rubeľ</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Tadžikistanský somoni</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Turkménsky manat</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>Tuniský dinár</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>Tonga Paʻanga</displayName>
+ <symbol>T$</symbol>
+ </currency>
+ <currency type="TPE">
+ <displayName>Timorské eskudo</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Turecká lira</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TTD">
+ <displayName>Trinidad a Tobago dolár</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>Taiwanský nový dolár</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>Tanzanský šiling</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>Ukrainská hrivna</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Ukrainský karbovanetz</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Ugandan Å¡iling (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Ugandský šiling</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>US dolár</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>US dolár (Next day)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>US dolár (Same day)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>Uruguajské peso (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>Uruguajské peso Uruguayo</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>Uzbekistanský sum</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Venezuelský bolivar</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>Vietnamský dong</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>Vanuatu vatu</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>Západná Samoa tala</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>CFA frank BEAC</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>Zlato</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>East Caribbean dolár</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>Å peciálne práva Äerpania</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>Francúzsky zlatý frank</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>Francúzsky UIC-frank</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>CFA frank BCEAO</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>CFP frank</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="YDD">
+ <displayName>Jemenský dinár</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Jemenský rial</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>Juhoslávsky dinár [YUD]</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>Juhoslávsky Noviy dinár</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>Juhoslávsky dinár</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>Juhoafrický rand (financial)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Juhoafrický rand</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Zambská kwacha</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Zairský nový zaire</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Zairský Zaire</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Zimbabský dolár</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>ano:a</yesstr>
+ <nostr>nie:n</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/sk_SK.xml b/libs/Zend/Locale/Data/sk_SK.xml
new file mode 100755
index 0000000000..3d57537783
--- /dev/null
+++ b/libs/Zend/Locale/Data/sk_SK.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="sk"/>
+ <territory type="SK"/>
+ </identity>
+ <delimiters>
+ <quotationStart>‚</quotationStart>
+ <quotationEnd>‘</quotationEnd>
+ <alternateQuotationStart>„</alternateQuotationStart>
+ <alternateQuotationEnd>“</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sl.xml b/libs/Zend/Locale/Data/sl.xml
new file mode 100755
index 0000000000..d99923c021
--- /dev/null
+++ b/libs/Zend/Locale/Data/sl.xml
@@ -0,0 +1,591 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.68 $"/>
+ <generation date="$Date: 2006/10/26 22:46:09 $"/>
+ <language type="sl"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar">ArabÅ¡Äina</language>
+ <language type="bg">BolgarÅ¡Äina</language>
+ <language type="cs">ÄŒeÅ¡Äina</language>
+ <language type="da">DanÅ¡Äina</language>
+ <language type="de">NemÅ¡Äina</language>
+ <language type="el">GrÅ¡Äina</language>
+ <language type="en">AngleÅ¡Äina</language>
+ <language type="es">Å panÅ¡Äina</language>
+ <language type="et">EstonÅ¡Äina</language>
+ <language type="fi">FinÅ¡Äina</language>
+ <language type="fr">FrancoÅ¡Äina</language>
+ <language type="he">HebrejÅ¡Äina</language>
+ <language type="hi" draft="unconfirmed">HindujÅ¡Äina</language>
+ <language type="hr">HrvaÅ¡Äina</language>
+ <language type="hu">MadžarÅ¡Äina</language>
+ <language type="it">ItalijanÅ¡Äina</language>
+ <language type="ja">JaponÅ¡Äina</language>
+ <language type="ko">KorejÅ¡Äina</language>
+ <language type="lt">LitovÅ¡Äina</language>
+ <language type="lv">LetonÅ¡Äina</language>
+ <language type="nl">NizozemÅ¡Äina</language>
+ <language type="no">NorveÅ¡Äina</language>
+ <language type="pl">PoljÅ¡Äina</language>
+ <language type="pt">PortugalÅ¡Äina</language>
+ <language type="ro">RomunÅ¡Äina</language>
+ <language type="ru">RuÅ¡Äina</language>
+ <language type="sk">SlovaÅ¡Äina</language>
+ <language type="sl">SlovenÅ¡Äina</language>
+ <language type="sv">Å vedÅ¡Äina</language>
+ <language type="tr">TurÅ¡Äina</language>
+ <language type="zh">KitajÅ¡Äina</language>
+ </languages>
+ <scripts>
+ <script type="Latn">Latinski</script>
+ </scripts>
+ <territories>
+ <territory type="001">Svet</territory>
+ <territory type="002">Afrika</territory>
+ <territory type="005">Južna Amerika</territory>
+ <territory type="009">Oceanija</territory>
+ <territory type="011">Zahodna Afrika</territory>
+ <territory type="013">Centralna Amerika</territory>
+ <territory type="014">Vzhodna Afrika</territory>
+ <territory type="015">Severna Afrika</territory>
+ <territory type="017">Centralna Afrika</territory>
+ <territory type="018">Južna Afrika [018]</territory>
+ <territory type="019">Amerike</territory>
+ <territory type="021">Severna Amerika</territory>
+ <territory type="029">Karibi</territory>
+ <territory type="030">Vzhodna Azija</territory>
+ <territory type="035">Jugovzhodna Azija</territory>
+ <territory type="039">Južna Evropa</territory>
+ <territory type="053">Avstralija i Nova Zelandija</territory>
+ <territory type="054">Melanezija</territory>
+ <territory type="057">Micronezija</territory>
+ <territory type="061">Polinezija</territory>
+ <territory type="062">Južno-centralna Azija</territory>
+ <territory type="142">Azija</territory>
+ <territory type="145">Zahodna Azija</territory>
+ <territory type="150">Evropa</territory>
+ <territory type="151">Vzhodna Evropa</territory>
+ <territory type="154">Severna Evropa</territory>
+ <territory type="155">Zapadna Evropa</territory>
+ <territory type="830">Kanalski otoki</territory>
+ <territory type="IM">Otok Man</territory>
+ <territory type="AD">Andora</territory>
+ <territory type="AE">Združeni arabski emirati</territory>
+ <territory type="AF">Afganistan</territory>
+ <territory type="AG">Antigva in Barbuda</territory>
+ <territory type="AI">Angvila</territory>
+ <territory type="AL">Albanija</territory>
+ <territory type="AM">Armenija</territory>
+ <territory type="AN">Nizozemski Antili</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktika</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">Ameriška Samoa</territory>
+ <territory type="AT">Avstrija</territory>
+ <territory type="AU">Avstralija</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Alandski otoki</territory>
+ <territory type="AZ">Azerbajdžan</territory>
+ <territory type="BA">Bosna in Hercegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladeš</territory>
+ <territory type="BE">Belgija</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bolgarija</territory>
+ <territory type="BH">Bahrajn</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunej</territory>
+ <territory type="BO">Bolivija</territory>
+ <territory type="BR">Brazilija</territory>
+ <territory type="BS">Bahami</territory>
+ <territory type="BT">Butan</territory>
+ <territory type="BV">Otok Bouvet</territory>
+ <territory type="BW">Bocvana</territory>
+ <territory type="BY">Belorusija</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Kokosovi otoki</territory>
+ <territory type="CD">DemokratiÄna republika Kongo</territory>
+ <territory type="CF">Centralnoafriška republika</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Å vica</territory>
+ <territory type="CI">SlonokoÅ¡Äena obala</territory>
+ <territory type="CK">Cookovi otoki</territory>
+ <territory type="CL">ÄŒile</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Kitajska</territory>
+ <territory type="CO">Kolumbija</territory>
+ <territory type="CR">Kostarika</territory>
+ <territory type="CS">Srbija in ÄŒrna gora</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Kapverdski otoki</territory>
+ <territory type="CX">BožiÄni otok</territory>
+ <territory type="CY">Ciper</territory>
+ <territory type="CZ">Češka</territory>
+ <territory type="DE">NemÄija</territory>
+ <territory type="DJ">Džibuti</territory>
+ <territory type="DK">Danska</territory>
+ <territory type="DM">Dominika</territory>
+ <territory type="DO">Dominikanska republika</territory>
+ <territory type="DZ">Alžirija</territory>
+ <territory type="EC">Ekvador</territory>
+ <territory type="EE">Estonija</territory>
+ <territory type="EG">Egipt</territory>
+ <territory type="EH">Zahodna Sahara</territory>
+ <territory type="ER">Eritreja</territory>
+ <territory type="ES">Å panija</territory>
+ <territory type="ET">Etiopija</territory>
+ <territory type="FI">Finska</territory>
+ <territory type="FJ">Fidži</territory>
+ <territory type="FK">Falklandski (Malvinski) otoki</territory>
+ <territory type="FM">Mikronezija</territory>
+ <territory type="FO">Fererski otoki</territory>
+ <territory type="FR">Francija</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Velika Britanija</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Gruzija</territory>
+ <territory type="GF">Francoska Gvajana</territory>
+ <territory type="GH">Gana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Grenlandija</territory>
+ <territory type="GM">Gambija</territory>
+ <territory type="GN">Gvineja</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Ekvatorialna Gvineja</territory>
+ <territory type="GR">GrÄija</territory>
+ <territory type="GS">Južna Georgija in Južni Sandwich Islands</territory>
+ <territory type="GT">Gvatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Gvineja Bissau</territory>
+ <territory type="GY">Gvajana</territory>
+ <territory type="HK">Hong Kong S.A.R. Kitajske</territory>
+ <territory type="HM">Heardov otok in McDonaldovi otoki</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Hrvaška</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Madžarska</territory>
+ <territory type="ID">Indonezija</territory>
+ <territory type="IE">Irska</territory>
+ <territory type="IL">Izrael</territory>
+ <territory type="IN">Indija</territory>
+ <territory type="IO">Britanska Indija</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Islandija</territory>
+ <territory type="IT">Italija</territory>
+ <territory type="JM">Jamajka</territory>
+ <territory type="JO">Jordan</territory>
+ <territory type="JP">Japonska</territory>
+ <territory type="KE">Kenija</territory>
+ <territory type="KG">Kirgizistan</territory>
+ <territory type="KH">Kambodža</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komori</territory>
+ <territory type="KN">Saint Kitts in Nevis</territory>
+ <territory type="KP">Severna Koreja</territory>
+ <territory type="KR">Južna Koreja</territory>
+ <territory type="KW">Kuvajt</territory>
+ <territory type="KY">Kajmanski otoki</territory>
+ <territory type="KZ">Kazahstan</territory>
+ <territory type="LA">Ljudska demokratiÄna republika Laos</territory>
+ <territory type="LB">Libanon</territory>
+ <territory type="LC">Saint Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Å rilanka</territory>
+ <territory type="LR">Liberija</territory>
+ <territory type="LS">Lesoto</territory>
+ <territory type="LT">Litva</territory>
+ <territory type="LU">Luxemburg</territory>
+ <territory type="LV">Latvija</territory>
+ <territory type="LY">Libija</territory>
+ <territory type="MA">Maroko</territory>
+ <territory type="MC">Monako</territory>
+ <territory type="MD">Republika Moldova</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshallovi otoki</territory>
+ <territory type="MK">Republika Makedonija</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">Mongolija</territory>
+ <territory type="MO">Makao S.A.R. Kitajske</territory>
+ <territory type="MP">Severni Marianski otoki</territory>
+ <territory type="MQ">Martinik</territory>
+ <territory type="MR">Mavretanija</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Maldivi</territory>
+ <territory type="MW">Malavi</territory>
+ <territory type="MX">Mehika</territory>
+ <territory type="MY">Malezija</territory>
+ <territory type="MZ">Mozambik</territory>
+ <territory type="NA">Namibija</territory>
+ <territory type="NC">Nova Kaledonija</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Otok Norfolk</territory>
+ <territory type="NG">Nigerija</territory>
+ <territory type="NI">Nikaragva</territory>
+ <territory type="NL">Nizozemska</territory>
+ <territory type="NO">Norveška</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Nova Zelandija</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Francoska Polinezija</territory>
+ <territory type="PG">Papua Nova Gvineja</territory>
+ <territory type="PH">Filipini</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Poljska</territory>
+ <territory type="PM">Saint Pierre in Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Portoriko</territory>
+ <territory type="PS">Palestinsko ozemlje</territory>
+ <territory type="PT">Portugalska</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paragvaj</territory>
+ <territory type="QA">Katar</territory>
+ <territory type="QO">Ostala oceanija</territory>
+ <territory type="RE">Reunion</territory>
+ <territory type="RO">Romunija</territory>
+ <territory type="RU">Ruska federacija</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SA">Saudova Arabija</territory>
+ <territory type="SB">Salomonovo otoÄje</territory>
+ <territory type="SC">Sejšeli</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Å vedska</territory>
+ <territory type="SG">Singapur</territory>
+ <territory type="SH">Sveta Helena</territory>
+ <territory type="SI">Slovenija</territory>
+ <territory type="SJ">Svalbard in Jan Mayen</territory>
+ <territory type="SK">Slovaška</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalija</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">Sao Tome in Principe</territory>
+ <territory type="SV">Salvador</territory>
+ <territory type="SY">Sirija</territory>
+ <territory type="SZ">Svazi</territory>
+ <territory type="TC">OtoÄji Turks in Caicos</territory>
+ <territory type="TD">ÄŒad</territory>
+ <territory type="TF">Francoski južni teritorij</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Tajska</territory>
+ <territory type="TJ">Tadžikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Vzhodni Timor</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunizija</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">TurÄija</territory>
+ <territory type="TT">Trinidad in Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Tajvan</territory>
+ <territory type="TZ">Tanzanija</territory>
+ <territory type="UA">Ukrajina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">Ameriški manjši oddaljeni otoki</territory>
+ <territory type="US">Združene države Amerike</territory>
+ <territory type="UY">Urugvaj</territory>
+ <territory type="UZ">Uzbekistan</territory>
+ <territory type="VA">Vatikan</territory>
+ <territory type="VC">Saint Vincent in Grenadine</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Britanski Deviški otoki</territory>
+ <territory type="VI">Ameriški Deviški otoki</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis in Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Južna Afrika</territory>
+ <territory type="ZM">Zambija</territory>
+ <territory type="ZW">Zimbabve</territory>
+ </territories>
+ <keys>
+ <key type="calendar">Kolendar</key>
+ <key type="collation">Zlaganje</key>
+ <key type="currency">Valuta</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">BudistiÄni kolendar</type>
+ <type type="chinese" key="calendar">Kitajski kolendar</type>
+ <type type="direct" key="collation">Direktno zlaganje</type>
+ <type type="gregorian" key="calendar">Gregorijanski kolendar</type>
+ <type type="hebrew" key="calendar">Hebrejski kolendar</type>
+ <type type="islamic" key="calendar">Islamski kolendar</type>
+ <type type="islamic-civil" key="calendar">Islamski civilni kolendar</type>
+ <type type="japanese" key="calendar">Japonski kolendar</type>
+ <type type="phonebook" key="collation">Zlaganje po abecedi</type>
+ <type type="pinyin" key="collation">Pinyin zlaganje</type>
+ <type type="stroke" key="collation">Stroke order zlaganje</type>
+ <type type="traditional" key="collation">Tradicionano zlaganje</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-c Ä d-p r s Å¡ t-v z ž]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[q w-y]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">jan</month>
+ <month type="2">feb</month>
+ <month type="3">mar</month>
+ <month type="4">apr</month>
+ <month type="5">maj</month>
+ <month type="6">jun</month>
+ <month type="7">jul</month>
+ <month type="8">avg</month>
+ <month type="9">sep</month>
+ <month type="10">okt</month>
+ <month type="11">nov</month>
+ <month type="12">dec</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">januar</month>
+ <month type="2">februar</month>
+ <month type="3">marec</month>
+ <month type="4">april</month>
+ <month type="5">maj</month>
+ <month type="6">junij</month>
+ <month type="7">julij</month>
+ <month type="8">avgust</month>
+ <month type="9">september</month>
+ <month type="10">oktober</month>
+ <month type="11">november</month>
+ <month type="12">december</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">j</month>
+ <month type="2">f</month>
+ <month type="3">m</month>
+ <month type="4">a</month>
+ <month type="5">m</month>
+ <month type="6">j</month>
+ <month type="7">j</month>
+ <month type="8">a</month>
+ <month type="9">s</month>
+ <month type="10">o</month>
+ <month type="11">n</month>
+ <month type="12">d</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">ned</day>
+ <day type="mon">pon</day>
+ <day type="tue">tor</day>
+ <day type="wed">sre</day>
+ <day type="thu">Äet</day>
+ <day type="fri">pet</day>
+ <day type="sat">sob</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">nedelja</day>
+ <day type="mon">ponedeljek</day>
+ <day type="tue">torek</day>
+ <day type="wed">sreda</day>
+ <day type="thu">Äetrtek</day>
+ <day type="fri">petek</day>
+ <day type="sat">sobota</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">n</day>
+ <day type="mon">p</day>
+ <day type="tue">t</day>
+ <day type="wed">s</day>
+ <day type="thu">Ä</day>
+ <day type="fri">p</day>
+ <day type="sat">s</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">K1</quarter>
+ <quarter type="2" draft="unconfirmed">K2</quarter>
+ <quarter type="3" draft="unconfirmed">K3</quarter>
+ <quarter type="4" draft="unconfirmed">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">Prvo Äetrtletje</quarter>
+ <quarter type="2" draft="unconfirmed">Drugo Äetrtletje</quarter>
+ <quarter type="3" draft="unconfirmed">Tretje Äetrtletje</quarter>
+ <quarter type="4" draft="unconfirmed">ÄŒetrto Äetrtletje</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am draft="unconfirmed">dop.</am>
+ <pm draft="unconfirmed">pop.</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">pred našim štetjem</era>
+ <era type="1" draft="unconfirmed">naše štetje</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">pr.n.Å¡.</era>
+ <era type="1" draft="unconfirmed">po Kr.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, dd. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd. MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d.M.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d.M.yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd. MMMM</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">d.M</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">M.yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HHmm;-HHmm</hourFormat>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Južni pol</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity>Kinšasa</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity>Lubumbaši</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity>Å angaj</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moskva</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>Krasnojarsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>KamÄatka</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity>Anadir</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>Užgorod</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>Kijev</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>Zaporožje</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Taškent</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="BRL">
+ <displayName>Brazilski Real</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>Kitajski Yuan Renminbi</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>Evro</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Britanski Funt Sterling</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Indijski Rupi</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>Japonski Jen</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>Ruska Rublja</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Slovenski tolar</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>Ameriški Dolar</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>da:d:ja:j</yesstr>
+ <nostr>no:NO:n:N:ne:NE</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/sl_SI.xml b/libs/Zend/Locale/Data/sl_SI.xml
new file mode 100755
index 0000000000..0849ffdc8d
--- /dev/null
+++ b/libs/Zend/Locale/Data/sl_SI.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="sl"/>
+ <territory type="SI"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">„</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">“</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/so.xml b/libs/Zend/Locale/Data/so.xml
new file mode 100755
index 0000000000..85e6a00421
--- /dev/null
+++ b/libs/Zend/Locale/Data/so.xml
@@ -0,0 +1,326 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.42 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="so"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar" draft="unconfirmed">Arabic</language>
+ <language type="de" draft="unconfirmed">German</language>
+ <language type="en" draft="unconfirmed">English</language>
+ <language type="es" draft="unconfirmed">Spanish</language>
+ <language type="fr" draft="unconfirmed">French</language>
+ <language type="hi" draft="unconfirmed">Hindi</language>
+ <language type="it" draft="unconfirmed">Italian</language>
+ <language type="ja" draft="unconfirmed">Japanese</language>
+ <language type="pt" draft="unconfirmed">Portuguese</language>
+ <language type="ru" draft="unconfirmed">Russian</language>
+ <language type="so">Soomaali</language>
+ <language type="zh" draft="unconfirmed">Chinese</language>
+ </languages>
+ <scripts>
+ <script type="Latn" draft="unconfirmed">Latin</script>
+ </scripts>
+ <territories>
+ <territory type="AE">Imaaraadka Carabta ee Midoobay</territory>
+ <territory type="AF">Afgaanistaan</territory>
+ <territory type="AM">Armeeniya</territory>
+ <territory type="AO">Angoola</territory>
+ <territory type="AT">Osteeriya</territory>
+ <territory type="AU">Awstraaliya</territory>
+ <territory type="BA">Boosniya Heersigoviina</territory>
+ <territory type="BB">Baarbadoos</territory>
+ <territory type="BD">Bangaala-Deesh</territory>
+ <territory type="BE">Beljiyam</territory>
+ <territory type="BH">Baxrayn</territory>
+ <territory type="BJ">Beniin</territory>
+ <territory type="BR">Braasiil</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CH">Swiiserlaand</territory>
+ <territory type="CL">Jili</territory>
+ <territory type="CM">Kameruun</territory>
+ <territory type="CN">Shiinaha</territory>
+ <territory type="CU">Kuuba</territory>
+ <territory type="DE">Jarmal</territory>
+ <territory type="DJ">Jabuuti</territory>
+ <territory type="DK">Danmaark</territory>
+ <territory type="EG">Masar</territory>
+ <territory type="ES">Isbeyn</territory>
+ <territory type="ET">Itoobiya</territory>
+ <territory type="ET" alt="proposed-u126-1" draft="unconfirmed">Itoobbiya</territory>
+ <territory type="FI">Fiinlaand</territory>
+ <territory type="FR">Faransiis</territory>
+ <territory type="GB" draft="unconfirmed">United Kingdom</territory>
+ <territory type="GD">Giriinaada</territory>
+ <territory type="GN">Gini</territory>
+ <territory type="GR">Giriigga</territory>
+ <territory type="HR">Korweeshiya</territory>
+ <territory type="HU">Hangeri</territory>
+ <territory type="ID">Indoneesiya</territory>
+ <territory type="IE">Ayrlaanda</territory>
+ <territory type="IL" draft="unconfirmed">Israaʼiil</territory>
+ <territory type="IN">Hindiya</territory>
+ <territory type="IQ">Ciraaq</territory>
+ <territory type="IR">Iiraan</territory>
+ <territory type="IS">Iislaand</territory>
+ <territory type="IT">Talyaani</territory>
+ <territory type="JM">Jameyka</territory>
+ <territory type="JO">Urdun</territory>
+ <territory type="JP">Jabbaan</territory>
+ <territory type="KE">Kiiniya</territory>
+ <territory type="KH">Kamboodiya</territory>
+ <territory type="KP">Kuuriyada Waqooyi</territory>
+ <territory type="KR">Kuuriyada Koonfureed</territory>
+ <territory type="KW">Kuwayt</territory>
+ <territory type="KZ">Kasaakhistaan</territory>
+ <territory type="LB">Lubnaan</territory>
+ <territory type="LK">Siirilaanka</territory>
+ <territory type="LR">Laybeeriya</territory>
+ <territory type="LS">Losooto</territory>
+ <territory type="LU">Luksemboorg</territory>
+ <territory type="LV">Laatfiya</territory>
+ <territory type="LY">Liibiya</territory>
+ <territory type="MA">Marooko</territory>
+ <territory type="MC">Moonako</territory>
+ <territory type="MK">Makadooniya</territory>
+ <territory type="ML">Maali</territory>
+ <territory type="MR">Muritaaniya</territory>
+ <territory type="MT">Maalda</territory>
+ <territory type="MV">Maaldiqeen</territory>
+ <territory type="MW">Malaawi</territory>
+ <territory type="MX">Meksiko</territory>
+ <territory type="MZ">Musambiig</territory>
+ <territory type="NA">Namiibiya</territory>
+ <territory type="NG">Nayjeeriya</territory>
+ <territory type="NI">Nikaraaguwa</territory>
+ <territory type="NO">Noorweey</territory>
+ <territory type="NZ">Neyuusilaand</territory>
+ <territory type="OM">Cumaan</territory>
+ <territory type="PH">Filibiin</territory>
+ <territory type="PK">Bakistaan</territory>
+ <territory type="PL">Booland</territory>
+ <territory type="PT">Bortuqaal</territory>
+ <territory type="QA">Qadar</territory>
+ <territory type="RO">Rumaaniya</territory>
+ <territory type="RU">Ruush</territory>
+ <territory type="SA">Sacuudi Carabiya</territory>
+ <territory type="SD">Sudaan</territory>
+ <territory type="SE">Iswidhan</territory>
+ <territory type="SL">Siraaliyoon</territory>
+ <territory type="SO">Soomaaliya</territory>
+ <territory type="SY">Suuriya</territory>
+ <territory type="TD">Jaad</territory>
+ <territory type="TG">Toogo</territory>
+ <territory type="TH">Taylaand</territory>
+ <territory type="TN">Tuniisiya</territory>
+ <territory type="TR">Turki</territory>
+ <territory type="TZ">Tansaaniya</territory>
+ <territory type="UG">Ugaanda</territory>
+ <territory type="US">Qaramada Midoobey ee Maraykanka</territory>
+ <territory type="VA">Faatikaan</territory>
+ <territory type="VE">Fenisuweela</territory>
+ <territory type="VN">Fiyetnaam</territory>
+ <territory type="YE">Yaman</territory>
+ <territory type="ZA">Koonfur Afrika</territory>
+ <territory type="ZM">Saambiya</territory>
+ <territory type="ZW">Simbaabwe</territory>
+ </territories>
+ <keys>
+ <key type="calendar" draft="unconfirmed">Habeentiris</key>
+ <key type="currency" draft="unconfirmed">Lacag</key>
+ </keys>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Kob</month>
+ <month type="2">Lab</month>
+ <month type="3">Sad</month>
+ <month type="4">Afr</month>
+ <month type="5">Sha</month>
+ <month type="6">Lix</month>
+ <month type="7">Tod</month>
+ <month type="8">Sid</month>
+ <month type="9">Sag</month>
+ <month type="10">Tob</month>
+ <month type="11">KIT</month>
+ <month type="12">LIT</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Bisha Koobaad</month>
+ <month type="2">Bisha Labaad</month>
+ <month type="3">Bisha Saddexaad</month>
+ <month type="4">Bisha Afraad</month>
+ <month type="5">Bisha Shanaad</month>
+ <month type="6">Bisha Lixaad</month>
+ <month type="7">Bisha Todobaad</month>
+ <month type="8">Bisha Sideedaad</month>
+ <month type="9">Bisha Sagaalaad</month>
+ <month type="10">Bisha Tobnaad</month>
+ <month type="11">Bisha Kow iyo Tobnaad</month>
+ <month type="12">Bisha Laba iyo Tobnaad</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">K</month>
+ <month type="2" draft="unconfirmed">L</month>
+ <month type="3" draft="unconfirmed">S</month>
+ <month type="4" draft="unconfirmed">A</month>
+ <month type="5" draft="unconfirmed">S</month>
+ <month type="6" draft="unconfirmed">L</month>
+ <month type="7" draft="unconfirmed">T</month>
+ <month type="8" draft="unconfirmed">S</month>
+ <month type="9" draft="unconfirmed">S</month>
+ <month type="10" draft="unconfirmed">T</month>
+ <month type="11" draft="unconfirmed">K</month>
+ <month type="12" draft="unconfirmed">L</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Axa</day>
+ <day type="mon">Isn</day>
+ <day type="tue">Sal</day>
+ <day type="wed">Arb</day>
+ <day type="thu">Kha</day>
+ <day type="fri">Jim</day>
+ <day type="sat">Sab</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Axad</day>
+ <day type="mon">Isniin</day>
+ <day type="tue">Salaaso</day>
+ <day type="wed">Arbaco</day>
+ <day type="thu">Khamiis</day>
+ <day type="fri">Jimco</day>
+ <day type="sat">Sabti</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">A</day>
+ <day type="mon" draft="unconfirmed">I</day>
+ <day type="tue" draft="unconfirmed">S</day>
+ <day type="wed" draft="unconfirmed">A</day>
+ <day type="thu" draft="unconfirmed">K</day>
+ <day type="fri" draft="unconfirmed">J</day>
+ <day type="sat" draft="unconfirmed">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am>sn</am>
+ <pm>gn</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">Ciise ka hor</era>
+ <era type="1">Ciise ka dib</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, MMMM dd, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MMM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">Brazilian Real</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="unconfirmed">Chinese Yuan Renminbi</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName draft="unconfirmed">Jabuuti Faran</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName draft="unconfirmed">Itoobiya Bir</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="unconfirmed">Euro</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">British Pound Sterling</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">Indian Rupee</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="unconfirmed">Japanese Yen</displayName>
+ </currency>
+ <currency type="KES">
+ <symbol>Ksh</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">Russian Ruble</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName draft="unconfirmed">Somalia Schilling</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">US Dollar</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/so_DJ.xml b/libs/Zend/Locale/Data/so_DJ.xml
new file mode 100755
index 0000000000..33681057b5
--- /dev/null
+++ b/libs/Zend/Locale/Data/so_DJ.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="so"/>
+ <territory type="DJ"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="DJF">
+ <symbol>$</symbol>
+ </currency>
+ <currency type="USD">
+ <symbol>US$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/so_ET.xml b/libs/Zend/Locale/Data/so_ET.xml
new file mode 100755
index 0000000000..4ec20c699a
--- /dev/null
+++ b/libs/Zend/Locale/Data/so_ET.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="so"/>
+ <territory type="ET"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ETB">
+ <symbol>$</symbol>
+ </currency>
+ <currency type="USD">
+ <symbol>US$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/so_KE.xml b/libs/Zend/Locale/Data/so_KE.xml
new file mode 100755
index 0000000000..1c88c53626
--- /dev/null
+++ b/libs/Zend/Locale/Data/so_KE.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="so"/>
+ <territory type="KE"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/so_SO.xml b/libs/Zend/Locale/Data/so_SO.xml
new file mode 100755
index 0000000000..b9e5ba25b8
--- /dev/null
+++ b/libs/Zend/Locale/Data/so_SO.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="so"/>
+ <territory type="SO"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="SOS">
+ <symbol>$</symbol>
+ </currency>
+ <currency type="USD">
+ <symbol>US$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/sq.xml b/libs/Zend/Locale/Data/sq.xml
new file mode 100755
index 0000000000..fd12bf8790
--- /dev/null
+++ b/libs/Zend/Locale/Data/sq.xml
@@ -0,0 +1,377 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.55 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="sq"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar">Arabisht</language>
+ <language type="de">Gjermanisht</language>
+ <language type="en">Anglisht</language>
+ <language type="es">Spanjisht</language>
+ <language type="fr">Frengjisht</language>
+ <language type="hi">Hindi</language>
+ <language type="it">Italisht</language>
+ <language type="ja">Japanisht</language>
+ <language type="pt">Portugeze</language>
+ <language type="ru">Rusisht</language>
+ <language type="sq">shqipe</language>
+ <language type="zh">Kineze</language>
+ </languages>
+ <scripts>
+ <script type="Latn">Latine</script>
+ </scripts>
+ <territories>
+ <territory type="AD">Andorrë</territory>
+ <territory type="AE">Emiratet Arabe te Bashkuara</territory>
+ <territory type="AF">Afganistan</territory>
+ <territory type="AG">Antigua e Barbuda</territory>
+ <territory type="AL">Shqipëria</territory>
+ <territory type="AM">Armeni</territory>
+ <territory type="AO">Angolë</territory>
+ <territory type="AR">Argjentinë</territory>
+ <territory type="AT">Austri</territory>
+ <territory type="AU">Australi</territory>
+ <territory type="AZ">Azerbajxhan</territory>
+ <territory type="BA">Bosnja dhe Hercegovina</territory>
+ <territory type="BE">Belgjikë</territory>
+ <territory type="BG">Bullgari</territory>
+ <territory type="BH">Bahrein</territory>
+ <territory type="BN">Brunej</territory>
+ <territory type="BO">Bolivi</territory>
+ <territory type="BR">Brazili</territory>
+ <territory type="BT">Butan</territory>
+ <territory type="BW">Botsvana</territory>
+ <territory type="BY">Bjellorusi</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CF">Republika Qendrore e Afrikës</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Zvicër</territory>
+ <territory type="CI">Bregu i Fildishtë</territory>
+ <territory type="CL">Kili</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Kinë</territory>
+ <territory type="CO">Kolumbi</territory>
+ <territory type="CR">Kosta Rika</territory>
+ <territory type="CS">Serbië en Montenegro</territory>
+ <territory type="CU">Kubë</territory>
+ <territory type="CV">Kap Verde</territory>
+ <territory type="CY">Qipro</territory>
+ <territory type="CZ">Republika e Çekisë</territory>
+ <territory type="DE">Gjermani</territory>
+ <territory type="DJ">Xhibuti</territory>
+ <territory type="DK">Danimarkë</territory>
+ <territory type="DM">Dominikë</territory>
+ <territory type="DO">Republika Dominikanë</territory>
+ <territory type="DZ">Algjeri</territory>
+ <territory type="EC">Ekuator</territory>
+ <territory type="EE">Estoni</territory>
+ <territory type="EG">Egjipt</territory>
+ <territory type="EH">Saharaja Perëndimore</territory>
+ <territory type="ER">Eritre</territory>
+ <territory type="ES">Spanjë</territory>
+ <territory type="ET">Etiopi</territory>
+ <territory type="FI">Finlandë</territory>
+ <territory type="FJ">Fixhi</territory>
+ <territory type="FM">Mikronezi</territory>
+ <territory type="FR">Francë</territory>
+ <territory type="GA">Gjabon</territory>
+ <territory type="GB">Mbretëria e Bashkuar</territory>
+ <territory type="GE">Gjeorgji</territory>
+ <territory type="GH">Ganë</territory>
+ <territory type="GM">Gambi</territory>
+ <territory type="GN">Guine</territory>
+ <territory type="GQ">Guineja Ekuatoriale</territory>
+ <territory type="GR">Greqi</territory>
+ <territory type="GT">Guatemalë</territory>
+ <territory type="GW">Guine Bisau</territory>
+ <territory type="GY">Guajana</territory>
+ <territory type="HR">Kroaci</territory>
+ <territory type="HU">Hungari</territory>
+ <territory type="ID">Indonezi</territory>
+ <territory type="IE">Irlandë</territory>
+ <territory type="IL">Izrael</territory>
+ <territory type="IN">Indi</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IS">Islandë</territory>
+ <territory type="IT">Itali</territory>
+ <territory type="JM">Xhamajkë</territory>
+ <territory type="JO">Jordani</territory>
+ <territory type="JP">Japoni</territory>
+ <territory type="KE">Kenia</territory>
+ <territory type="KG">Kirgistan</territory>
+ <territory type="KH">Kamboxhi</territory>
+ <territory type="KI">Qiribati</territory>
+ <territory type="KM">Komore</territory>
+ <territory type="KN">Saint Kitts e Nevis</territory>
+ <territory type="KP">Koreja e Veriut</territory>
+ <territory type="KR">Koreja e Jugut</territory>
+ <territory type="KW">Kuvajt</territory>
+ <territory type="KZ">Kazakistan</territory>
+ <territory type="LB">Liban</territory>
+ <territory type="LI">Lihtënshtajn</territory>
+ <territory type="LR">Liberi</territory>
+ <territory type="LS">Lesoto</territory>
+ <territory type="LT">Lituani</territory>
+ <territory type="LU">Luksemburg</territory>
+ <territory type="LV">Letoni</territory>
+ <territory type="LY">Libi</territory>
+ <territory type="MA">Maroko</territory>
+ <territory type="MC">Monako</territory>
+ <territory type="MD">Moldavi</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Ishujt Marshall</territory>
+ <territory type="MK">Maqedoni</territory>
+ <territory type="MN">Mongoli</territory>
+ <territory type="MR">Mauritani</territory>
+ <territory type="MT">Maltë</territory>
+ <territory type="MV">Maldivit</territory>
+ <territory type="MW">Malavi</territory>
+ <territory type="MX">Meksikë</territory>
+ <territory type="MY">Malajzi</territory>
+ <territory type="MZ">Mozambik</territory>
+ <territory type="NA">Namibi</territory>
+ <territory type="NG">Nigeri</territory>
+ <territory type="NI">Nikaragua</territory>
+ <territory type="NL">Vendet e Ulëta</territory>
+ <territory type="NO">Norvegji</territory>
+ <territory type="NZ">Zelanda e Re</territory>
+ <territory type="PG">Papua Guineja e Re</territory>
+ <territory type="PH">Filipine</territory>
+ <territory type="PL">Poloni</territory>
+ <territory type="PT">Portugali</territory>
+ <territory type="PY">Paraguaj</territory>
+ <territory type="QA">Katar</territory>
+ <territory type="RO">Rumani</territory>
+ <territory type="RU">Rusi</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SA">Arabia Saudite</territory>
+ <territory type="SB">Ishujt Solomon</territory>
+ <territory type="SC">Sishel</territory>
+ <territory type="SE">Suedi</territory>
+ <territory type="SG">Singapor</territory>
+ <territory type="SI">Slloveni</territory>
+ <territory type="SK">Sllovaki</territory>
+ <territory type="SL">Siera Leone</territory>
+ <territory type="SO">Somali</territory>
+ <territory type="ST">Sao Tome e Prinsipe</territory>
+ <territory type="SY">Siri</territory>
+ <territory type="SZ">Svazilandë</territory>
+ <territory type="TD">Çad</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Tajlandë</territory>
+ <territory type="TJ">Taxhikistan</territory>
+ <territory type="TN">Tunisi</territory>
+ <territory type="TR">Turqi</territory>
+ <territory type="TT">Trinidad e Tobago</territory>
+ <territory type="TW">Tajvan</territory>
+ <territory type="TZ">Tanzani</territory>
+ <territory type="UA">Ukrainë</territory>
+ <territory type="US">Shtetet e Bashkuara të Amerikës</territory>
+ <territory type="UY">Uruguaj</territory>
+ <territory type="VA">Vatikan</territory>
+ <territory type="VC">Saint Vincent e Grenadinet</territory>
+ <territory type="VE">Venezuelë</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="ZA">Afrika e Jugut</territory>
+ <territory type="ZM">Zambi</territory>
+ <territory type="ZW">Zimbabve</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-c ç d {dh} e ë f g {gj} h-l {ll} m n {nj} o-r {rr} s {sh} t {th} u v x {xh} y z {zh}]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[w]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Jan</month>
+ <month type="2">Shk</month>
+ <month type="3">Mar</month>
+ <month type="4">Pri</month>
+ <month type="5">Maj</month>
+ <month type="6">Qer</month>
+ <month type="7">Kor</month>
+ <month type="8">Gsh</month>
+ <month type="9">Sht</month>
+ <month type="10">Tet</month>
+ <month type="11">Nën</month>
+ <month type="12">Dhj</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">janar</month>
+ <month type="2">shkurt</month>
+ <month type="3">mars</month>
+ <month type="4">prill</month>
+ <month type="5">maj</month>
+ <month type="6">qershor</month>
+ <month type="7">korrik</month>
+ <month type="8">gusht</month>
+ <month type="9">shtator</month>
+ <month type="10">tetor</month>
+ <month type="11">nëntor</month>
+ <month type="12">dhjetor</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">J</month>
+ <month type="2">S</month>
+ <month type="3">M</month>
+ <month type="4">P</month>
+ <month type="5">M</month>
+ <month type="6">Q</month>
+ <month type="7">K</month>
+ <month type="8">G</month>
+ <month type="9">S</month>
+ <month type="10">T</month>
+ <month type="11">N</month>
+ <month type="12">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Die</day>
+ <day type="mon">Hën</day>
+ <day type="tue">Mar</day>
+ <day type="wed">Mër</day>
+ <day type="thu">Enj</day>
+ <day type="fri">Pre</day>
+ <day type="sat">Sht</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">e diel</day>
+ <day type="mon">e hënë</day>
+ <day type="tue">e martë</day>
+ <day type="wed">e mërkurë</day>
+ <day type="thu">e enjte</day>
+ <day type="fri">e premte</day>
+ <day type="sat">e shtunë</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">D</day>
+ <day type="mon">H</day>
+ <day type="tue">M</day>
+ <day type="wed">M</day>
+ <day type="thu">E</day>
+ <day type="fri">P</day>
+ <day type="sat">S</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am>PD</am>
+ <pm>MD</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">p.e.r.</era>
+ <era type="1">n.e.r.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy-MM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yy-MM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h.mm.ss.a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h.mm.ss.a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss.a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h.mm.a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">MM-dd</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">yyyy-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="ALL">
+ <symbol>Lek</symbol>
+ </currency>
+ <currency type="BRL">
+ <displayName>Real Brazilian</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>Renminbi(Yuan) Kinez</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euro</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Paund Sterlina Britanike</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Rupee indiane</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>Jeni Japonez</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>Rubla ruse</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>Dollar amerikan</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>po:p</yesstr>
+ <nostr>jo:j</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/sq_AL.xml b/libs/Zend/Locale/Data/sq_AL.xml
new file mode 100755
index 0000000000..2b0187eee6
--- /dev/null
+++ b/libs/Zend/Locale/Data/sq_AL.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.35 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="sq"/>
+ <territory type="AL"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sr.xml b/libs/Zend/Locale/Data/sr.xml
new file mode 100755
index 0000000000..0aa248d401
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr.xml
@@ -0,0 +1,738 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.71 $"/>
+ <generation date="$Date: 2006/10/26 22:46:09 $"/>
+ <language type="sr"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="af">ÐфриканерÑки</language>
+ <language type="ar">ÐрапÑки</language>
+ <language type="be">БелоруÑки</language>
+ <language type="bg">БугарÑки</language>
+ <language type="br">БретонÑки</language>
+ <language type="ca">КаталонÑки</language>
+ <language type="co">КорзиканÑки</language>
+ <language type="cs">Чешки</language>
+ <language type="da">ДанÑки</language>
+ <language type="de">Ðемачки</language>
+ <language type="el">Грчки</language>
+ <language type="en">ЕнглеÑки</language>
+ <language type="eo">ЕÑперанто</language>
+ <language type="es">ШпанÑки</language>
+ <language type="et">ЕÑтонÑки</language>
+ <language type="eu">БаÑкијÑки</language>
+ <language type="fa">ПерÑијÑки</language>
+ <language type="fi">ФинÑки</language>
+ <language type="fr">ФранцуÑки</language>
+ <language type="ga">ИрÑки</language>
+ <language type="he">ХебрејÑки</language>
+ <language type="hi">Хинди</language>
+ <language type="hr">ХрватÑки</language>
+ <language type="hu">МађарÑки</language>
+ <language type="hy">ÐрменÑки</language>
+ <language type="id">ИндонезијÑки</language>
+ <language type="is">ИÑландÑки</language>
+ <language type="it">ИталијанÑки</language>
+ <language type="ja">ЈапанÑки</language>
+ <language type="ka">ГрузијÑки</language>
+ <language type="km">КмерÑки</language>
+ <language type="ko">КорејÑки</language>
+ <language type="ku">КурдÑки</language>
+ <language type="ky">КиргиÑки</language>
+ <language type="la">ЛатинÑки</language>
+ <language type="lt">ЛитванÑки</language>
+ <language type="lv">ЛетонÑки</language>
+ <language type="mk">МакедонÑки</language>
+ <language type="mn">МонголÑки</language>
+ <language type="mo">МолдавÑки</language>
+ <language type="my">БурманÑки</language>
+ <language type="nl">ХоландÑки</language>
+ <language type="no">Ðорвешки</language>
+ <language type="pl">ПољÑки</language>
+ <language type="pt">ПортугалÑки</language>
+ <language type="rm">Рето-РоманÑки</language>
+ <language type="ro">РумунÑки</language>
+ <language type="ru">РуÑки</language>
+ <language type="sa">СанÑкрит</language>
+ <language type="sh">СрпÑко-ХрватÑки</language>
+ <language type="sk">Словачки</language>
+ <language type="sl">Словеначки</language>
+ <language type="sq">ÐлбанÑки</language>
+ <language type="sr">СрпÑки</language>
+ <language type="sv">ШведÑки</language>
+ <language type="sw">Свахили</language>
+ <language type="tr">ТурÑки</language>
+ <language type="uk">УкрајинÑки</language>
+ <language type="vi">ВијетнамÑки</language>
+ <language type="yi">Јидиш</language>
+ <language type="zh">КинеÑки</language>
+ </languages>
+ <scripts>
+ <script type="Arab">арапÑко пиÑмо</script>
+ <script type="Armn">јерменÑко пиÑмо</script>
+ <script type="Beng">бенгалÑко пиÑмо</script>
+ <script type="Brai">Брајево пиÑмо</script>
+ <script type="Cher">Чероки</script>
+ <script type="Copt">коптичко пиÑмо</script>
+ <script type="Cyrl">Ћирилица</script>
+ <script type="Cyrs" draft="provisional">ћирилица (црквено ÑловенÑка варијанта)</script>
+ <script type="Deva">Деванагари</script>
+ <script type="Dsrt">Дезерет</script>
+ <script type="Ethi">етиопÑко пиÑмо</script>
+ <script type="Geor">грузијÑко пиÑмо</script>
+ <script type="Glag" draft="provisional">глагољица</script>
+ <script type="Goth">Готика</script>
+ <script type="Grek">грчко пиÑмо</script>
+ <script type="Hans" draft="provisional">поједноÑтављено кинеÑко пиÑмо</script>
+ <script type="Hant" draft="provisional">традиционално кинеÑко пиÑмо</script>
+ <script type="Hebr">хебрејÑко пиÑмо</script>
+ <script type="Hira">Хирагана</script>
+ <script type="Hrkt">Катакана или Хирагана</script>
+ <script type="Kana">Катакана</script>
+ <script type="Khmr" draft="provisional">кмерÑко пиÑмо</script>
+ <script type="Latf" draft="provisional">латиница (фрактур варијанта)</script>
+ <script type="Latn">Латиница</script>
+ <script type="Runr" draft="provisional">рунÑко пиÑмо</script>
+ </scripts>
+ <territories>
+ <territory type="001">Свет</territory>
+ <territory type="002">Ðфрика</territory>
+ <territory type="005">Јужна Ðмерика</territory>
+ <territory type="009">Океанија</territory>
+ <territory type="011">Западна Ðфрика</territory>
+ <territory type="013">Централна Ðмерика</territory>
+ <territory type="014">ИÑточна Ðфрика</territory>
+ <territory type="015">Северна Ðфрика</territory>
+ <territory type="017">Централна Ðфрика</territory>
+ <territory type="018">Јужна Ðфрика</territory>
+ <territory type="019">Ðмерике</territory>
+ <territory type="021">Северна Ðмерика</territory>
+ <territory type="029">Кариби</territory>
+ <territory type="030">ИÑточна Ðзија</territory>
+ <territory type="035">ЈугоиÑточна Ðзија</territory>
+ <territory type="039">Јужна Европа</territory>
+ <territory type="053">ÐуÑтралија и Ðови Зеланд</territory>
+ <territory type="054">Меланезија</territory>
+ <territory type="057">МикронезијÑки регион</territory>
+ <territory type="061">Полинезија</territory>
+ <territory type="062">Јужно-централна Ðзија</territory>
+ <territory type="142">Ðзија</territory>
+ <territory type="145">Западна Ðзија</territory>
+ <territory type="150">Европа</territory>
+ <territory type="151">ИÑточна Европа</territory>
+ <territory type="154" draft="unconfirmed">Северна Европа</territory>
+ <territory type="155">Западна Европа</territory>
+ <territory type="830">КаналÑка оÑтрва</territory>
+ <territory type="IM">ОÑтрво Ман</territory>
+ <territory type="AD">Ðндора</territory>
+ <territory type="AE">Уједињени ÐрапÑки Емирати</territory>
+ <territory type="AF">ÐвганиÑтан</territory>
+ <territory type="AL">Ðлбанија</territory>
+ <territory type="AM">Ðрменија</territory>
+ <territory type="AN">ХоландÑки Ðнтили</territory>
+ <territory type="AO">Ðнгола</territory>
+ <territory type="AR">Ðргентина</territory>
+ <territory type="AT">ÐуÑтрија</territory>
+ <territory type="AU">ÐуÑтралија</territory>
+ <territory type="AW">Ðруба</territory>
+ <territory type="AX">ÐландÑка оÑтрва</territory>
+ <territory type="AZ">Ðзербејџан</territory>
+ <territory type="BA">БоÑна и Херцеговина</territory>
+ <territory type="BB">БарбадоÑ</territory>
+ <territory type="BD">Бангладеш</territory>
+ <territory type="BE">Белгија</territory>
+ <territory type="BF">Буркина ФаÑо</territory>
+ <territory type="BG">БугарÑка</territory>
+ <territory type="BH">Бахреин</territory>
+ <territory type="BI">Бурунди</territory>
+ <territory type="BJ">Бенин</territory>
+ <territory type="BM">Бермуда</territory>
+ <territory type="BN">Брунеј</territory>
+ <territory type="BO">Боливија</territory>
+ <territory type="BR">Браѕил</territory>
+ <territory type="BR" alt="proposed-u137-1" draft="unconfirmed">Бразил</territory>
+ <territory type="BS">Бахами</territory>
+ <territory type="BT">Бутан</territory>
+ <territory type="BV">Буве</territory>
+ <territory type="BW">Боцвана</territory>
+ <territory type="BY">БелоруÑија</territory>
+ <territory type="BZ">БелиÑе</territory>
+ <territory type="CA">Канада</territory>
+ <territory type="CC">КокоÑова ОÑтрва</territory>
+ <territory type="CD">ДемократÑка република Конго</territory>
+ <territory type="CF">Централно Ðфричка Република</territory>
+ <territory type="CG">Конго</territory>
+ <territory type="CH">ШвајцарÑка</territory>
+ <territory type="CI">Обала Слоноваче</territory>
+ <territory type="CL">Чиле</territory>
+ <territory type="CM">Камерун</territory>
+ <territory type="CN">Кина</territory>
+ <territory type="CO">Колумбија</territory>
+ <territory type="CR">КоÑтарика</territory>
+ <territory type="CS">Србија и Црна Гора</territory>
+ <territory type="CU">Куба</territory>
+ <territory type="CV">Капе Верде</territory>
+ <territory type="CX">Божићно ОÑтрво</territory>
+ <territory type="CY">Кипар</territory>
+ <territory type="CZ">Чешка</territory>
+ <territory type="DE">Ðемачка</territory>
+ <territory type="DJ">Ðибути</territory>
+ <territory type="DK">ДанÑка</territory>
+ <territory type="DM">Доминика</territory>
+ <territory type="DO">ДоминиканÑка Република</territory>
+ <territory type="DZ">Ðлжир</territory>
+ <territory type="EC">Еквадор</territory>
+ <territory type="EE">ЕÑтонија</territory>
+ <territory type="EG">Египат</territory>
+ <territory type="EH">Западна Сахара</territory>
+ <territory type="ER">Еритреја</territory>
+ <territory type="ES">Шпанија</territory>
+ <territory type="ET">Етиопија</territory>
+ <territory type="FI">ФинÑка</territory>
+ <territory type="FJ">Фиџи</territory>
+ <territory type="FK">ФолкландÑка ОÑтрва</territory>
+ <territory type="FM">Микронезија</territory>
+ <territory type="FO">ФарÑка ОÑтрва</territory>
+ <territory type="FR">ФранцуÑка</territory>
+ <territory type="GA">Габон</territory>
+ <territory type="GB">Велика Британија</territory>
+ <territory type="GD">Гренада</territory>
+ <territory type="GE">Грузија</territory>
+ <territory type="GF">ФранцуÑка Гвајана</territory>
+ <territory type="GH">Гана</territory>
+ <territory type="GI">Гибралтар</territory>
+ <territory type="GL">Гренланд</territory>
+ <territory type="GM">Гамбија</territory>
+ <territory type="GN">Гвинеја</territory>
+ <territory type="GP">Гваделупе</territory>
+ <territory type="GQ">Екваторијална Гвинеја</territory>
+ <territory type="GR">Грчка</territory>
+ <territory type="GS">Јужна Ðорџија и Јужна Сендвич ОÑтрва</territory>
+ <territory type="GT">Гватемала</territory>
+ <territory type="GU">Гуам</territory>
+ <territory type="GW">Гвинеја-БиÑао</territory>
+ <territory type="GY">Гвајана</territory>
+ <territory type="HK">Хонг Конг (С. Ð. Р. Кина)</territory>
+ <territory type="HM">Херд и Мекдоналд ОÑтрва</territory>
+ <territory type="HN">ХондураÑ</territory>
+ <territory type="HR">ХрватÑка</territory>
+ <territory type="HT">Хаити</territory>
+ <territory type="HU">МађарÑка</territory>
+ <territory type="ID">Индонезија</territory>
+ <territory type="IE">ИрÑка</territory>
+ <territory type="IL">Израел</territory>
+ <territory type="IN">Индија</territory>
+ <territory type="IQ">Ирак</territory>
+ <territory type="IR">Иран</territory>
+ <territory type="IS">ИÑланд</territory>
+ <territory type="IT">Италија</territory>
+ <territory type="JM">Јамајка</territory>
+ <territory type="JO">Јордан</territory>
+ <territory type="JP">Јапан</territory>
+ <territory type="KE">Кенија</territory>
+ <territory type="KG">КиргизÑтан</territory>
+ <territory type="KH">Камбоџа</territory>
+ <territory type="KI">Кирибати</territory>
+ <territory type="KM">КоморÑка ОÑтрва</territory>
+ <territory type="KN">Сент ÐšÐ¸Ñ‚Ñ Ð¸ ÐевиÑ</territory>
+ <territory type="KP">Северна Кореја</territory>
+ <territory type="KR">Јужна Кореја</territory>
+ <territory type="KW">Кувајт</territory>
+ <territory type="KY">КајманÑка ОÑтрва</territory>
+ <territory type="KZ">КазахÑтан</territory>
+ <territory type="LA">ЛаоÑ</territory>
+ <territory type="LB">Либан</territory>
+ <territory type="LC">Сент Луција</territory>
+ <territory type="LI">Лихтенштајн</territory>
+ <territory type="LK">Шри Ланка</territory>
+ <territory type="LR">Либерија</territory>
+ <territory type="LS">ЛеÑото</territory>
+ <territory type="LT">Литванија</territory>
+ <territory type="LU">ЛукÑембург</territory>
+ <territory type="LV">Летонија</territory>
+ <territory type="LY">Либија</territory>
+ <territory type="MA">Мароко</territory>
+ <territory type="MC">Монако</territory>
+ <territory type="MD">Молдавија</territory>
+ <territory type="MG">МадагаÑкар</territory>
+ <territory type="MH">МаршалÑка ОÑтрва</territory>
+ <territory type="MK">Македонија</territory>
+ <territory type="ML">Мали</territory>
+ <territory type="MM">Мијанмар</territory>
+ <territory type="MN">Монголија</territory>
+ <territory type="MO">Макао (С. Ð. Р. Кина)</territory>
+ <territory type="MP">Северна МаријанÑка ОÑтрва</territory>
+ <territory type="MQ">Мартиник</territory>
+ <territory type="MR">Мауританија</territory>
+ <territory type="MS">МонÑерат</territory>
+ <territory type="MT">Малта</territory>
+ <territory type="MU">МаурицијуÑ</territory>
+ <territory type="MV">Малдиви</territory>
+ <territory type="MW">Малави</territory>
+ <territory type="MX">МекÑико</territory>
+ <territory type="MY">Малезија</territory>
+ <territory type="MZ">Мозамбик</territory>
+ <territory type="NA">Ðамибија</territory>
+ <territory type="NC">Ðова Каледонија</territory>
+ <territory type="NE">Ðигер</territory>
+ <territory type="NF">Ðорфолк ОÑтрво</territory>
+ <territory type="NG">Ðигерија</territory>
+ <territory type="NI">Ðикарагва</territory>
+ <territory type="NL">Холандија</territory>
+ <territory type="NO">Ðорвешка</territory>
+ <territory type="NP">Ðепал</territory>
+ <territory type="NR">Ðауру</territory>
+ <territory type="NU">Ðиуе</territory>
+ <territory type="NZ">Ðови Зеланд</territory>
+ <territory type="OM">Оман</territory>
+ <territory type="PA">Панама</territory>
+ <territory type="PE">Перу</territory>
+ <territory type="PF">ФранцуÑка Полинезија</territory>
+ <territory type="PG">Папуа Ðова Гвинеја</territory>
+ <territory type="PH">Филипини</territory>
+ <territory type="PK">ПакиÑтан</territory>
+ <territory type="PL">ПољÑка</territory>
+ <territory type="PM">Сен Пјер и Микелон</territory>
+ <territory type="PN">Питкерн</territory>
+ <territory type="PR">Порто Рико</territory>
+ <territory type="PS">ПалеÑтинÑка територија</territory>
+ <territory type="PT">Португал</territory>
+ <territory type="PW">Палау</territory>
+ <territory type="PY">Парагвај</territory>
+ <territory type="QA">Катар</territory>
+ <territory type="QO">ОÑтала океанија</territory>
+ <territory type="RE">Реинион</territory>
+ <territory type="RO">Румунија</territory>
+ <territory type="RU">РуÑија</territory>
+ <territory type="RW">Руанда</territory>
+ <territory type="SA">СаудијÑка Ðрабија</territory>
+ <territory type="SB">СоломонÑка ОÑтрва</territory>
+ <territory type="SC">Сејшели</territory>
+ <territory type="SD">Судан</territory>
+ <territory type="SE">ШведÑка</territory>
+ <territory type="SG">Сингапур</territory>
+ <territory type="SH">Света Јелена</territory>
+ <territory type="SI">Словенија</territory>
+ <territory type="SJ">Свалбард и Јанмајен ОÑтрва</territory>
+ <territory type="SK">Словачка</territory>
+ <territory type="SL">Сијера Леоне</territory>
+ <territory type="SM">Сан Марино</territory>
+ <territory type="SN">Сенегал</territory>
+ <territory type="SO">Сомалија</territory>
+ <territory type="SR">Суринам</territory>
+ <territory type="ST">Сао Томе и Принципи</territory>
+ <territory type="SV">Салвадор</territory>
+ <territory type="SY">Сирија</territory>
+ <territory type="SZ">Свазиленд</territory>
+ <territory type="TC">Ð¢ÑƒÑ€ÐºÑ Ð¸ ÐšÐ°Ñ˜ÐºÐ¾Ñ ÐžÑтрва</territory>
+ <territory type="TD">Чад</territory>
+ <territory type="TF">ФранцуÑке Јужне Територије</territory>
+ <territory type="TG">Того</territory>
+ <territory type="TH">Тајланд</territory>
+ <territory type="TJ">ТаџикиÑтан</territory>
+ <territory type="TK">Токелау</territory>
+ <territory type="TL">Тимор-ЛеÑте</territory>
+ <territory type="TM">ТуркмениÑтан</territory>
+ <territory type="TN">ТуниÑ</territory>
+ <territory type="TO">Тонга</territory>
+ <territory type="TR">ТурÑка</territory>
+ <territory type="TT">Тринидад и Тобаго</territory>
+ <territory type="TV">Тувалу</territory>
+ <territory type="TW">Тајван</territory>
+ <territory type="TZ">Танзанија</territory>
+ <territory type="UA">Украјина</territory>
+ <territory type="UG">Уганда</territory>
+ <territory type="UM">Мања удаљена оÑтрва СÐД</territory>
+ <territory type="US">Сједињене Ðмеричке Државе</territory>
+ <territory type="UY">Уругвај</territory>
+ <territory type="UZ">УзбекиÑтан</territory>
+ <territory type="VA">Ватикан</territory>
+ <territory type="VC">Сент ВинÑент и Гренадини</territory>
+ <territory type="VE">Венецуела</territory>
+ <territory type="VG">БританÑка ДевичанÑка ОÑтрва</territory>
+ <territory type="VI">С.Ð.Д. ДевичанÑка ОÑтрва</territory>
+ <territory type="VN">Вијетнам</territory>
+ <territory type="VU">Вануату</territory>
+ <territory type="WF">Ð’Ð°Ð»Ð¸Ñ Ð¸ Футуна ОÑтрва</territory>
+ <territory type="WS">Самоа</territory>
+ <territory type="YE">Јемен</territory>
+ <territory type="YT">Мајоте</territory>
+ <territory type="ZA">Јужноафричка Република</territory>
+ <territory type="ZM">Замбија</territory>
+ <territory type="ZW">Зимбабве</territory>
+ </territories>
+ <keys>
+ <key type="calendar">Календар</key>
+ <key type="collation">Сортирање</key>
+ <key type="currency">Валута</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation" draft="unconfirmed">традиционални кинеÑки</type>
+ <type type="buddhist" key="calendar">БудиÑтички календар</type>
+ <type type="chinese" key="calendar">КинеÑки календар</type>
+ <type type="direct" key="collation">Директно Ñортирање</type>
+ <type type="gb2312han" key="collation" draft="unconfirmed">поједноÑтављени кинеÑки</type>
+ <type type="gregorian" key="calendar">ГрегоријанÑки календар</type>
+ <type type="hebrew" key="calendar">ХебрејÑки календар</type>
+ <type type="islamic" key="calendar">ИÑламÑки календар</type>
+ <type type="islamic-civil" key="calendar">ИÑламÑки цивилни календар</type>
+ <type type="japanese" key="calendar">ЈапанÑки календар</type>
+ <type type="phonebook" key="collation">Сортирање по азбуци</type>
+ <type type="pinyin" key="collation">Пињин Ñортирање</type>
+ <type type="stroke" key="collation">Сортирање по броју црта</type>
+ <type type="traditional" key="collation">Традиционално Ñортирање</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[а-д ђ е-и ј к л љ м н њ о-т ћ у-ч џ ш]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">јан</month>
+ <month type="2">феб</month>
+ <month type="3">мар</month>
+ <month type="4">апр</month>
+ <month type="5">мај</month>
+ <month type="6">јун</month>
+ <month type="7">јул</month>
+ <month type="8">авг</month>
+ <month type="9">Ñеп</month>
+ <month type="10">окт</month>
+ <month type="11">нов</month>
+ <month type="12">дец</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">јануар</month>
+ <month type="2">фебруар</month>
+ <month type="3">март</month>
+ <month type="4">април</month>
+ <month type="5">мај</month>
+ <month type="6">јун</month>
+ <month type="7">јул</month>
+ <month type="8">авгуÑÑ‚</month>
+ <month type="9">Ñептембар</month>
+ <month type="10">октобар</month>
+ <month type="11">новембар</month>
+ <month type="12">децембар</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">ј</month>
+ <month type="2">Ñ„</month>
+ <month type="3">м</month>
+ <month type="4">а</month>
+ <month type="5">м</month>
+ <month type="6">ј</month>
+ <month type="7">ј</month>
+ <month type="8">а</month>
+ <month type="9">Ñ</month>
+ <month type="10">о</month>
+ <month type="11">н</month>
+ <month type="12">д</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">нед</day>
+ <day type="mon">пон</day>
+ <day type="tue">уто</day>
+ <day type="wed">Ñре</day>
+ <day type="thu">чет</day>
+ <day type="fri">пет</day>
+ <day type="sat">Ñуб</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">недеља</day>
+ <day type="mon">понедељак</day>
+ <day type="tue">уторак</day>
+ <day type="wed">Ñреда</day>
+ <day type="thu">четвртак</day>
+ <day type="fri">петак</day>
+ <day type="sat">Ñубота</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">н</day>
+ <day type="mon">п</day>
+ <day type="tue">у</day>
+ <day type="wed">Ñ</day>
+ <day type="thu">ч</day>
+ <day type="fri">п</day>
+ <day type="sat">Ñ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">К1</quarter>
+ <quarter type="2">К2</quarter>
+ <quarter type="3">К3</quarter>
+ <quarter type="4">К4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="provisional">Први квартал</quarter>
+ <quarter type="2" draft="provisional">Други квартал</quarter>
+ <quarter type="3" draft="provisional">Трећи квартал</quarter>
+ <quarter type="4" draft="provisional">Четврти квартал</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraAbbr>
+ <era type="0">п. н. е.</era>
+ <era type="1">н. е</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, dd.MMMM.yyyy.</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd.MM.yyyy.</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd.MM.yyyy.</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d.M.yy.</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH.mm.ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>HH.mm.ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>HH.mm.ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>HH.mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMdd" draft="provisional">dd.MMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">MM-dd</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm.ss</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM.yy</dateFormatItem>
+ <dateFormatItem id="yyMMMd" draft="provisional">d. MMM yy</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="provisional">QQQQ yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HHmm;-HHmm</hourFormat>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Јужни пол</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity draft="unconfirmed">КиншаÑа</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity>Лумумбаши</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity>Шангај</exemplarCity>
+ </zone>
+ <zone type="Europe/Belgrade">
+ <long>
+ <standard>Централно ЕвропÑко Време</standard>
+ <daylight>Централно ЕвропÑко Летње Време</daylight>
+ </long>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>МоÑква</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>КраÑнојарÑк</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>Камчатка</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity>Ðнадир</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>Ужгород</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>Кијев</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>Запорожје</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Ташкент</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencies>
+ <currency type="ATS">
+ <displayName>ÐуÑтријÑки шилинг</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>ÐуÑтралијÑки долар</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="BAM">
+ <displayName>Конвертибилна марка</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BEF">
+ <displayName>БелгијÑки франак</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BRL">
+ <displayName>БразилÑки Реал</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>КанадÑки долар</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CHF">
+ <displayName>ШвајцарÑки франак</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>КинеÑки Јуан Ренминби</displayName>
+ <symbol draft="provisional">Y</symbol>
+ </currency>
+ <currency type="CSD">
+ <displayName>СрпÑки Динар</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Ðемачка марка</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName>ДанÑка круна</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="ESP">
+ <displayName>ШпанÑка пезета</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>ЕВРО</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>ФинÑка марка</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>ФранцуÑки франак</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Фунта Ñтерлинга</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Драхма</displayName>
+ </currency>
+ <currency type="HRD">
+ <displayName>ХрватÑки динар</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Куна</displayName>
+ </currency>
+ <currency type="IEP">
+ <displayName>ИрÑка фунта</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="INR">
+ <displayName>ИндијÑки Рупи</displayName>
+ <symbol>INR</symbol>
+ </currency>
+ <currency type="ITL">
+ <displayName>ИталијанÑка лира</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>Јен</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>КувајтÑки динар</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="LUF">
+ <displayName>ЛукÑембуршки франак</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>ХоландÑки гулден</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Ðорвешка круна</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="PTE">
+ <displayName>ПортугалÑки еÑкудо</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>РуÑка рубља</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>РуÑка рубља (1991-1998)</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>ШведÑка круна</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SIT">
+ <displayName>Толар</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>Ðмерички долар</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="YUN">
+ <symbol>Дин</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>да:д</yesstr>
+ <nostr>не:н</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/sr_BA.xml b/libs/Zend/Locale/Data/sr_BA.xml
new file mode 100755
index 0000000000..f3faf12413
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_BA.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.13 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="sr"/>
+ <territory type="BA"/>
+ </identity>
+ <alias source="sr_Cyrl_BA" path="//ldml" draft="unconfirmed"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sr_CS.xml b/libs/Zend/Locale/Data/sr_CS.xml
new file mode 100755
index 0000000000..a1b91435f8
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_CS.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="sr"/>
+ <territory type="CS"/>
+ </identity>
+ <alias source="sr_Cyrl_CS" path="//ldml" draft="unconfirmed"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sr_Cyrl.xml b/libs/Zend/Locale/Data/sr_Cyrl.xml
new file mode 100755
index 0000000000..ea317f1c78
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_Cyrl.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.26 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="sr"/>
+ <script type="Cyrl"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <eras>
+ <eraNames>
+ <era type="0" draft="provisional">Прије нове ере</era>
+ <era type="1" draft="provisional">Ðове ере</era>
+ </eraNames>
+ </eras>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Europe/Sarajevo">
+ <long>
+ <standard>Средње ЕвропÑко Вријеме</standard>
+ </long>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="BRL">
+ <symbol>R$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sr_Cyrl_BA.xml b/libs/Zend/Locale/Data/sr_Cyrl_BA.xml
new file mode 100755
index 0000000000..beb44c2242
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_Cyrl_BA.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.19 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="sr"/>
+ <script type="Cyrl"/>
+ <territory type="BA"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="sr" draft="provisional">ÑрпÑки</language>
+ </languages>
+ </localeDisplayNames>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="6">јуни</month>
+ <month type="7">јули</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="wed">Ñри</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="wed">Ñриједа</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, dd. MMMM yyyy.</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd. MMMM yyyy.</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy-MM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yy-MM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH 'чаÑова', mm 'минута', ss' Ñекунди'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>HH:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>HH:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd. MMMM</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">yyyy-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy.</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="provisional">#,##0.00 км</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="BAM">
+ <displayName>Конвертибилна Марка</displayName>
+ <symbol>КМ.</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/sr_Cyrl_CS.xml b/libs/Zend/Locale/Data/sr_Cyrl_CS.xml
new file mode 100755
index 0000000000..a70e961d17
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_Cyrl_CS.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.24 $"/>
+ <generation date="$Date: 2006/10/26 21:31:13 $"/>
+ <language type="sr"/>
+ <script type="Cyrl"/>
+ <territory type="CS"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sr_Cyrl_ME.xml b/libs/Zend/Locale/Data/sr_Cyrl_ME.xml
new file mode 100755
index 0000000000..eedb58642b
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_Cyrl_ME.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.1 $"/>
+ <generation date="$Date: 2006/10/26 21:31:13 $"/>
+ <language type="sr"/>
+ <script type="Cyrl"/>
+ <territory type="ME"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sr_Cyrl_RS.xml b/libs/Zend/Locale/Data/sr_Cyrl_RS.xml
new file mode 100755
index 0000000000..732bb17b02
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_Cyrl_RS.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.1 $"/>
+ <generation date="$Date: 2006/10/26 21:31:13 $"/>
+ <language type="sr"/>
+ <script type="Cyrl"/>
+ <territory type="RS"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sr_Cyrl_YU.xml b/libs/Zend/Locale/Data/sr_Cyrl_YU.xml
new file mode 100755
index 0000000000..2016bffc05
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_Cyrl_YU.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.23 $"/>
+ <generation date="$Date: 2006/10/28 00:22:48 $"/>
+ <language type="sr"/>
+ <script type="Cyrl"/>
+ <territory type="YU"/>
+ </identity>
+ <alias source="sr_Cyrl_RS" path="//ldml"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sr_Latn.xml b/libs/Zend/Locale/Data/sr_Latn.xml
new file mode 100755
index 0000000000..a062ba00d6
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_Latn.xml
@@ -0,0 +1,689 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.53 $"/>
+ <generation date="$Date: 2006/10/26 22:46:09 $"/>
+ <language type="sr"/>
+ <script type="Latn"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="af">Afrikanerski</language>
+ <language type="ar">Arapski</language>
+ <language type="be">Beloruski</language>
+ <language type="bg">Bugarski</language>
+ <language type="br">Bretonski</language>
+ <language type="ca">Katalonski</language>
+ <language type="co">Korzikanski</language>
+ <language type="cs">Češki</language>
+ <language type="da">Danski</language>
+ <language type="de">NemaÄki</language>
+ <language type="el">GrÄki</language>
+ <language type="en">Engleski</language>
+ <language type="eo">Esperanto</language>
+ <language type="es">Å panski</language>
+ <language type="et">Estonski</language>
+ <language type="eu">Baskijski</language>
+ <language type="fa">Persijski</language>
+ <language type="fi">Finski</language>
+ <language type="fr">Francuski</language>
+ <language type="ga">Irski</language>
+ <language type="he">Hebrejski</language>
+ <language type="hi">Hindi</language>
+ <language type="hr">Hrvatski</language>
+ <language type="hu">Mađarski</language>
+ <language type="hy">Armenski</language>
+ <language type="id">Indonezijski</language>
+ <language type="is">Islandski</language>
+ <language type="it">Italijanski</language>
+ <language type="ja">Japanski</language>
+ <language type="ka">Gruzijski</language>
+ <language type="km">Kmerski</language>
+ <language type="ko">Korejski</language>
+ <language type="ku">Kurdski</language>
+ <language type="ky">Kirgiski</language>
+ <language type="la">Latinski</language>
+ <language type="lt">Litvanski</language>
+ <language type="lv">Letonski</language>
+ <language type="mk">Makedonski</language>
+ <language type="mn">Mongolski</language>
+ <language type="mo">Moldavski</language>
+ <language type="my">Burmanski</language>
+ <language type="nl">Holandski</language>
+ <language type="no">Norveški</language>
+ <language type="pl">Poljski</language>
+ <language type="pt">Portugalski</language>
+ <language type="rm">Reto-Romanski</language>
+ <language type="ro">Rumunski</language>
+ <language type="ru">Ruski</language>
+ <language type="sa">Sanskrit</language>
+ <language type="sh">Srpsko-Hrvatski</language>
+ <language type="sk">SlovaÄki</language>
+ <language type="sl">SlovenaÄki</language>
+ <language type="sq">Albanski</language>
+ <language type="sr">Srpski</language>
+ <language type="sv">Å vedski</language>
+ <language type="sw">Svahili</language>
+ <language type="tr">Turski</language>
+ <language type="uk">Ukrajinski</language>
+ <language type="vi">Vijetnamski</language>
+ <language type="yi">Jidiš</language>
+ <language type="zh">Kineski</language>
+ </languages>
+ <scripts>
+ <script type="Arab">arapsko pismo</script>
+ <script type="Armn">jermensko pismo</script>
+ <script type="Beng">bengalsko pismo</script>
+ <script type="Brai">Brajevo pismo</script>
+ <script type="Cher">ÄŒeroki</script>
+ <script type="Copt">koptiÄko pismo</script>
+ <script type="Cyrl">Ćirilica</script>
+ <script type="Cyrs">ćirilica (crkveno slovenska varijanta)</script>
+ <script type="Deva">Devanagari</script>
+ <script type="Dsrt">Dezeret</script>
+ <script type="Ethi">etiopsko pismo</script>
+ <script type="Geor">gruzijsko pismo</script>
+ <script type="Glag">glagoljica</script>
+ <script type="Goth">Gotika</script>
+ <script type="Grek">grÄko pismo</script>
+ <script type="Hebr">hebrejsko pismo</script>
+ <script type="Hira">Hiragana</script>
+ <script type="Hrkt">Katakana ili Hiragana</script>
+ <script type="Kana">Katakana</script>
+ <script type="Khmr">kmersko pismo</script>
+ <script type="Latf">Latinica (Fraktur varijanta)</script>
+ <script type="Latn">Latinica</script>
+ <script type="Runr">runsko pismo</script>
+ </scripts>
+ <territories>
+ <territory type="001">Svet</territory>
+ <territory type="002">Afrika</territory>
+ <territory type="005">Južna Amerika</territory>
+ <territory type="009">Okeanija</territory>
+ <territory type="011">Zapadna Afrika</territory>
+ <territory type="013">Centralna Amerika</territory>
+ <territory type="014">IstoÄna Afrika</territory>
+ <territory type="015">Severna Afrika</territory>
+ <territory type="017">Centralna Afrika</territory>
+ <territory type="018">Južna Afrika</territory>
+ <territory type="019">Amerike</territory>
+ <territory type="021">Severna Amerika</territory>
+ <territory type="029">Karibi</territory>
+ <territory type="030">IstoÄna Azija</territory>
+ <territory type="035">JugoistoÄna Azija</territory>
+ <territory type="039">Južna Evropa</territory>
+ <territory type="053">Australija i Novi Zeland</territory>
+ <territory type="054">Melanezija</territory>
+ <territory type="057">Micronezija</territory>
+ <territory type="061">Polinezija</territory>
+ <territory type="062">Južno-centralna Azija</territory>
+ <territory type="142">Azija</territory>
+ <territory type="145">Zapadna Azija</territory>
+ <territory type="150">Evropa</territory>
+ <territory type="151">IstoÄna Evropa</territory>
+ <territory type="154">Severna Evropa</territory>
+ <territory type="155">Zapadna Evropa</territory>
+ <territory type="830">Kanalska ostrva</territory>
+ <territory type="IM">Ostrvo Man</territory>
+ <territory type="AD">Andora</territory>
+ <territory type="AE">Ujedinjeni Arapski Emirati</territory>
+ <territory type="AF">Avganistan</territory>
+ <territory type="AG">Antigva i Barbuda</territory>
+ <territory type="AI">Angvila</territory>
+ <territory type="AL">Albanija</territory>
+ <territory type="AM">Armenija</territory>
+ <territory type="AN">Holandski Antili</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktika</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">AmeriÄka Samoa</territory>
+ <territory type="AT">Austrija</territory>
+ <territory type="AU">Australija</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Alandska ostrva</territory>
+ <territory type="AZ">Azerbejdžan</territory>
+ <territory type="BA">Bosna i Hercegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladeš</territory>
+ <territory type="BE">Belgija</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bugarska</territory>
+ <territory type="BH">Bahrein</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunej</territory>
+ <territory type="BO">Bolivija</territory>
+ <territory type="BR">Brazil</territory>
+ <territory type="BS">Bahami</territory>
+ <territory type="BT">Butan</territory>
+ <territory type="BV">Buve Ostrva</territory>
+ <territory type="BW">Bocvana</territory>
+ <territory type="BY">Belorusija</territory>
+ <territory type="BZ">Belise</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Kokos (Keling) Ostrva</territory>
+ <territory type="CD">Demokratska Republika Kongo</territory>
+ <territory type="CF">Centralno AfriÄka Republika</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Å vajcarska</territory>
+ <territory type="CI">Obala SlonovaÄe</territory>
+ <territory type="CK">Kukova Ostrva</territory>
+ <territory type="CL">ÄŒile</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Kina</territory>
+ <territory type="CO">Kolumbija</territory>
+ <territory type="CR">Kostarika</territory>
+ <territory type="CS">Srbija i Crna Gora</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Kape Verde</territory>
+ <territory type="CX">Uskršnja Ostrva</territory>
+ <territory type="CY">Kipar</territory>
+ <territory type="CZ">Češka</territory>
+ <territory type="DE">NemaÄka</territory>
+ <territory type="DJ">Džibuti</territory>
+ <territory type="DK">Danska</territory>
+ <territory type="DM">Dominika</territory>
+ <territory type="DO">Dominikanska Republika</territory>
+ <territory type="DZ">Alžir</territory>
+ <territory type="EC">Ekvador</territory>
+ <territory type="EE">Estonija</territory>
+ <territory type="EG">Egipat</territory>
+ <territory type="EH">Zapadna Sahara</territory>
+ <territory type="ER">Eritreja</territory>
+ <territory type="ES">Å panija</territory>
+ <territory type="ET">Etiopija</territory>
+ <territory type="FI">Finska</territory>
+ <territory type="FJ">Fidži</territory>
+ <territory type="FK">Folklandska Ostrva</territory>
+ <territory type="FM">Mikronezija</territory>
+ <territory type="FO">Farska Ostrva</territory>
+ <territory type="FR">Francuska</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Velika Britanija</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Gruzija</territory>
+ <territory type="GF">Francuska Gvajana</territory>
+ <territory type="GH">Gana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Grenland</territory>
+ <territory type="GM">Gambija</territory>
+ <territory type="GN">Gvineja</territory>
+ <territory type="GP">Gvadelupe</territory>
+ <territory type="GQ">Ekvatorijalna Gvineja</territory>
+ <territory type="GR">GrÄka</territory>
+ <territory type="GS">Južna Džordžija i Južna SendviÄ Ostrva</territory>
+ <territory type="GT">Gvatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Gvineja-Bisao</territory>
+ <territory type="GY">Gvajana</territory>
+ <territory type="HK">Hong Kong (S. A. R. Kina)</territory>
+ <territory type="HM">Herd i Mekdonald Ostrva</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Hrvatska</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Mađarska</territory>
+ <territory type="ID">Indonezija</territory>
+ <territory type="IE">Irska</territory>
+ <territory type="IL">Izrael</territory>
+ <territory type="IN">Indija</territory>
+ <territory type="IO">British Indian Ocean Territory</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Island</territory>
+ <territory type="IT">Italija</territory>
+ <territory type="JM">Jamajka</territory>
+ <territory type="JO">Jordan</territory>
+ <territory type="JP">Japan</territory>
+ <territory type="KE">Kenija</territory>
+ <territory type="KG">Kirgizstan</territory>
+ <territory type="KH">Kambodža</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komorska Ostrva</territory>
+ <territory type="KN">Sent Kits i Nevis</territory>
+ <territory type="KP">Severna Koreja</territory>
+ <territory type="KR">Južna Koreja</territory>
+ <territory type="KW">Kuvajt</territory>
+ <territory type="KY">Kajmanska Ostrva</territory>
+ <territory type="KZ">Kazahstan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Liban</territory>
+ <territory type="LC">Sent Lucija</territory>
+ <territory type="LI">Lihtenštajn</territory>
+ <territory type="LK">Å ri Lanka</territory>
+ <territory type="LR">Liberija</territory>
+ <territory type="LS">Lesoto</territory>
+ <territory type="LT">Litvanija</territory>
+ <territory type="LU">Luksemburg</territory>
+ <territory type="LV">Letonija</territory>
+ <territory type="LY">Libija</territory>
+ <territory type="MA">Maroko</territory>
+ <territory type="MC">Monako</territory>
+ <territory type="MD">Moldavija</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Maršalska Ostrva</territory>
+ <territory type="MK">Makedonija</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Mijanmar</territory>
+ <territory type="MN">Mongolija</territory>
+ <territory type="MO">Makao (S. A. R. Kina)</territory>
+ <territory type="MP">Severna Marijanska Ostrva</territory>
+ <territory type="MQ">Martinik</territory>
+ <territory type="MR">Mauritanija</territory>
+ <territory type="MS">Monserat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauricius</territory>
+ <territory type="MV">Maldivi</territory>
+ <territory type="MW">Malavi</territory>
+ <territory type="MX">Meksiko</territory>
+ <territory type="MY">Malezija</territory>
+ <territory type="MZ">Mozambik</territory>
+ <territory type="NA">Namibija</territory>
+ <territory type="NC">Nova Kaledonija</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Norfolk Ostrvo</territory>
+ <territory type="NG">Nigerija</territory>
+ <territory type="NI">Nikaragva</territory>
+ <territory type="NL">Holandija</territory>
+ <territory type="NO">Norveška</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Novi Zeland</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Francuska Polinezija</territory>
+ <territory type="PG">Papua Nova Gvineja</territory>
+ <territory type="PH">Filipini</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Poljska</territory>
+ <territory type="PM">Sen Pjer i Mikelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Porto Riko</territory>
+ <territory type="PS">Palestinska Teritorija</territory>
+ <territory type="PT">Portugal</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paragvaj</territory>
+ <territory type="QA">Katar</territory>
+ <territory type="QO">Ostala okeanija</territory>
+ <territory type="RE">Rejunion</territory>
+ <territory type="RO">Rumunija</territory>
+ <territory type="RU">Rusija</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SA">Saudijska Arabija</territory>
+ <territory type="SB">Solomonska Ostrva</territory>
+ <territory type="SC">Sejšeli</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Å vedska</territory>
+ <territory type="SG">Singapur</territory>
+ <territory type="SH">Sveta Jelena</territory>
+ <territory type="SI">Slovenija</territory>
+ <territory type="SJ">Svalbard i Janmajen Ostrva</territory>
+ <territory type="SK">SlovaÄka</territory>
+ <territory type="SL">Sijera Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalija</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">Sao Tome i Principe</territory>
+ <territory type="SV">Salvador</territory>
+ <territory type="SY">Sirija</territory>
+ <territory type="SZ">Svazilend</territory>
+ <territory type="TC">Turks i Kajkos Ostrva</territory>
+ <territory type="TD">ÄŒad</territory>
+ <territory type="TF">Francuske Južne Teritorije</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Tajland</territory>
+ <territory type="TJ">Tadžikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Timor-Leste</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunis</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turska</territory>
+ <territory type="TT">Trinidad i Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Tajvan</territory>
+ <territory type="TZ">Tanzanija</territory>
+ <territory type="UA">Ukrajina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">Manja Udaljena Ostrva SAD</territory>
+ <territory type="US">Sjedinjene AmeriÄke Države</territory>
+ <territory type="UY">Urugvaj</territory>
+ <territory type="UZ">Uzbekistan</territory>
+ <territory type="VA">Vatikan</territory>
+ <territory type="VC">Sent Vinsent i Grenadini</territory>
+ <territory type="VE">Venecuela</territory>
+ <territory type="VG">Britanska DeviÄanska Ostrva</territory>
+ <territory type="VI">S.A.D. DeviÄanska Ostrva</territory>
+ <territory type="VN">Vijetnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Valis i Futuna Ostrva</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="YT">Majote</territory>
+ <territory type="ZA">JužnoafriÄka Republika</territory>
+ <territory type="ZM">Zambija</territory>
+ <territory type="ZW">Zimbabve</territory>
+ </territories>
+ <keys>
+ <key type="calendar">Kalendar</key>
+ <key type="collation">Sortiranje</key>
+ <key type="currency">Valuta</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">Tradicionalni kineski</type>
+ <type type="buddhist" key="calendar">BudistiÄki kalendar</type>
+ <type type="chinese" key="calendar">Kineski kalendar</type>
+ <type type="direct" key="collation">Direktno sortiranje</type>
+ <type type="gb2312han" key="collation">Pojednostavljeni kineski</type>
+ <type type="gregorian" key="calendar">Gregorijanski kalendar</type>
+ <type type="hebrew" key="calendar">Hebrejski kalendar</type>
+ <type type="islamic" key="calendar">Islamski kalendar</type>
+ <type type="islamic-civil" key="calendar">Islamski civilni kalendar</type>
+ <type type="japanese" key="calendar">Japanski kalendar</type>
+ <type type="phonebook" key="collation">Sortiranje po azbuci</type>
+ <type type="pinyin" key="collation">Pinjin sortiranje</type>
+ <type type="stroke" key="collation">Sortiranje po broju crta</type>
+ <type type="traditional" key="collation">Tradicionalno sortiranje</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-c ć Ä d Ä‘ {dž} e-l {lj} m n {nj} o p r s Å¡ t-v z ž]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[q w-y]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">jan</month>
+ <month type="2">feb</month>
+ <month type="3">mar</month>
+ <month type="4">apr</month>
+ <month type="5">maj</month>
+ <month type="6">jun</month>
+ <month type="7">jul</month>
+ <month type="8">avg</month>
+ <month type="9">sep</month>
+ <month type="10">okt</month>
+ <month type="11">nov</month>
+ <month type="12">dec</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">januar</month>
+ <month type="2">februar</month>
+ <month type="3">mart</month>
+ <month type="4">april</month>
+ <month type="5">maj</month>
+ <month type="6">jun</month>
+ <month type="7">jul</month>
+ <month type="8">avgust</month>
+ <month type="9">septembar</month>
+ <month type="10">oktobar</month>
+ <month type="11">novembar</month>
+ <month type="12">decembar</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">j</month>
+ <month type="2">f</month>
+ <month type="3">m</month>
+ <month type="4">a</month>
+ <month type="5">m</month>
+ <month type="6">j</month>
+ <month type="7">j</month>
+ <month type="8">a</month>
+ <month type="9">s</month>
+ <month type="10">o</month>
+ <month type="11">n</month>
+ <month type="12">d</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">ned</day>
+ <day type="mon">pon</day>
+ <day type="tue">uto</day>
+ <day type="wed">sre</day>
+ <day type="thu">Äet</day>
+ <day type="fri">pet</day>
+ <day type="sat">sub</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">nedelja</day>
+ <day type="mon">ponedeljak</day>
+ <day type="tue">utorak</day>
+ <day type="wed">sreda</day>
+ <day type="thu">Äetvrtak</day>
+ <day type="fri">petak</day>
+ <day type="sat">subota</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">n</day>
+ <day type="mon">p</day>
+ <day type="tue">u</day>
+ <day type="wed">s</day>
+ <day type="thu">Ä</day>
+ <day type="fri">p</day>
+ <day type="sat">s</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">K1</quarter>
+ <quarter type="2">K2</quarter>
+ <quarter type="3">K3</quarter>
+ <quarter type="4">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="provisional">Prvi kvartal</quarter>
+ <quarter type="2" draft="provisional">Drugi kvartal</quarter>
+ <quarter type="3" draft="provisional">Treći kvartal</quarter>
+ <quarter type="4" draft="provisional">ÄŒetvrti kvartal</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraNames>
+ <era type="0" draft="provisional">Pre nove ere</era>
+ <era type="1" draft="provisional">Nove ere</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">p. n. e.</era>
+ <era type="1">n. e.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, dd. MMMM yyyy.</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>EEEE, d.MM.yyyy.</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="yyMMdd" draft="provisional">dd.MM.yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Južni pol</exemplarCity>
+ </zone>
+ <zone type="Europe/Sarajevo">
+ <long>
+ <standard>Srednje Evropsko Vrijeme</standard>
+ </long>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity>Kinšasa</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity>Lumumbaši</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity>Å angaj</exemplarCity>
+ </zone>
+ <zone type="Europe/Belgrade">
+ <long>
+ <standard>Centralno Evropsko Vreme</standard>
+ <daylight>Centralno Evropsko Letnje Vreme</daylight>
+ </long>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moskva</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>Krasnojarsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>KamÄatka</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity>Anadir</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>Užgorod</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>Kijev</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>Zaporožje</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Taškent</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ATS">
+ <displayName>Austrijski Å¡iling</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>Australijski dolar</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>Konvertibilna marka</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Belgijski franak</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Brazilski Real</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>Kanadski dolar</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Å vajcarski franak</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>Kineski Juan Renminbi</displayName>
+ <symbol>U</symbol>
+ </currency>
+ <currency type="CSD">
+ <displayName>Srpski Dinar</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>NemaÄka marka</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName>Danska kruna</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Å panska pezeta</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>EVRO</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>Finska marka</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Francuski franak</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Funta sterlinga</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Drahma</displayName>
+ </currency>
+ <currency type="HRD">
+ <displayName>Hrvatski dinar</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Kuna</displayName>
+ </currency>
+ <currency type="IEP">
+ <displayName>Irska funta</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Indijski Rupi</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>Italijanska lira</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>Jen</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>Kuvajtski dinar</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Luksemburški franak</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Holandski gulden</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Norveška kruna</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Portugalski eskudo</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>Ruska rublja</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Ruska rublja (1991-1998)</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>Å vedska kruna</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Tolar</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>AmeriÄki dolar</displayName>
+ </currency>
+ <currency type="YUN">
+ <symbol>Din</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>da:d</yesstr>
+ <nostr>ne:n</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/sr_Latn_BA.xml b/libs/Zend/Locale/Data/sr_Latn_BA.xml
new file mode 100755
index 0000000000..3f80de92c9
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_Latn_BA.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.19 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="sr"/>
+ <script type="Latn"/>
+ <territory type="BA"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="sh" draft="provisional">srpski</language>
+ </languages>
+ </localeDisplayNames>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="6">juni</month>
+ <month type="7">juli</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="wed">sri</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="wed">srijeda</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <dateFormats>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd. MMMM yyyy.</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy-MM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yy-MM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>HH 'Äasova', mm 'minuta', ss 'sekundi'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>HH:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>HH:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd. MMMM</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">yyyy-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy.</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="provisional">#,##0.00 km</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="BAM">
+ <displayName>Konvertibilna Marka</displayName>
+ <symbol>KM.</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/sr_Latn_CS.xml b/libs/Zend/Locale/Data/sr_Latn_CS.xml
new file mode 100755
index 0000000000..e7192ea84d
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_Latn_CS.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.23 $"/>
+ <generation date="$Date: 2006/10/26 21:31:13 $"/>
+ <language type="sr"/>
+ <script type="Latn"/>
+ <territory type="CS"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sr_Latn_ME.xml b/libs/Zend/Locale/Data/sr_Latn_ME.xml
new file mode 100755
index 0000000000..6290af911e
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_Latn_ME.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.1 $"/>
+ <generation date="$Date: 2006/10/26 21:31:13 $"/>
+ <language type="sr"/>
+ <script type="Latn"/>
+ <territory type="ME"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sr_Latn_RS.xml b/libs/Zend/Locale/Data/sr_Latn_RS.xml
new file mode 100755
index 0000000000..17013182b4
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_Latn_RS.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.1 $"/>
+ <generation date="$Date: 2006/10/26 21:31:13 $"/>
+ <language type="sr"/>
+ <script type="Latn"/>
+ <territory type="RS"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sr_Latn_YU.xml b/libs/Zend/Locale/Data/sr_Latn_YU.xml
new file mode 100755
index 0000000000..4f44b5f416
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_Latn_YU.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.23 $"/>
+ <generation date="$Date: 2006/10/28 00:22:48 $"/>
+ <language type="sr"/>
+ <script type="Latn"/>
+ <territory type="YU"/>
+ </identity>
+ <alias source="sr_Latn_RS" path="//ldml"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sr_ME.xml b/libs/Zend/Locale/Data/sr_ME.xml
new file mode 100755
index 0000000000..4642f7c160
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_ME.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.1 $"/>
+ <generation date="$Date: 2006/10/26 21:31:13 $"/>
+ <language type="sr"/>
+ <territory type="ME"/>
+ </identity>
+ <alias source="sr_Cyrl_ME" path="//ldml" draft="unconfirmed"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sr_RS.xml b/libs/Zend/Locale/Data/sr_RS.xml
new file mode 100755
index 0000000000..779a285133
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_RS.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.1 $"/>
+ <generation date="$Date: 2006/10/26 21:31:13 $"/>
+ <language type="sr"/>
+ <territory type="RS"/>
+ </identity>
+ <alias source="sr_Cyrl_RS" path="//ldml" draft="unconfirmed"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sr_YU.xml b/libs/Zend/Locale/Data/sr_YU.xml
new file mode 100755
index 0000000000..c5ff5421eb
--- /dev/null
+++ b/libs/Zend/Locale/Data/sr_YU.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/10/28 00:22:48 $"/>
+ <language type="sr"/>
+ <territory type="YU"/>
+ </identity>
+ <alias source="sr_Cyrl_RS" path="//ldml"/>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ss.xml b/libs/Zend/Locale/Data/ss.xml
new file mode 100755
index 0000000000..0c5719085f
--- /dev/null
+++ b/libs/Zend/Locale/Data/ss.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.11 $"/>
+ <generation date="$Date: 2006/06/28 01:56:26 $"/>
+ <language type="ss"/>
+ </identity>
+ <characters>
+ <exemplarCharacters>[a-z]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Bhi</month>
+ <month type="2" draft="unconfirmed">Van</month>
+ <month type="3" draft="unconfirmed">Vol</month>
+ <month type="4" draft="unconfirmed">Mab</month>
+ <month type="5" draft="unconfirmed">Nkh</month>
+ <month type="6" draft="unconfirmed">Nhl</month>
+ <month type="7" draft="unconfirmed">Kho</month>
+ <month type="8" draft="unconfirmed">Ngc</month>
+ <month type="9" draft="unconfirmed">Nyo</month>
+ <month type="10" draft="unconfirmed">Mph</month>
+ <month type="11" draft="unconfirmed">Lwe</month>
+ <month type="12" draft="unconfirmed">Ngo</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Bhimbidvwane</month>
+ <month type="2" draft="unconfirmed">iNdlovana</month>
+ <month type="3" draft="unconfirmed">iNdlovu-lenkhulu</month>
+ <month type="4" draft="unconfirmed">Mabasa</month>
+ <month type="5" draft="unconfirmed">iNkhwekhweti</month>
+ <month type="6" draft="unconfirmed">iNhlaba</month>
+ <month type="7" draft="unconfirmed">Kholwane</month>
+ <month type="8" draft="unconfirmed">iNgci</month>
+ <month type="9" draft="unconfirmed">iNyoni</month>
+ <month type="10" draft="unconfirmed">iMphala</month>
+ <month type="11" draft="unconfirmed">Lweti</month>
+ <month type="12" draft="unconfirmed">iNgongoni</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Son</day>
+ <day type="mon" draft="unconfirmed">Mso</day>
+ <day type="tue" draft="unconfirmed">Bil</day>
+ <day type="wed" draft="unconfirmed">Tsa</day>
+ <day type="thu" draft="unconfirmed">Ne</day>
+ <day type="fri" draft="unconfirmed">Hla</day>
+ <day type="sat" draft="unconfirmed">Mgc</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Lisontfo</day>
+ <day type="mon" draft="unconfirmed">uMsombuluko</day>
+ <day type="tue" draft="unconfirmed">Lesibili</day>
+ <day type="wed" draft="unconfirmed">Lesitsatfu</day>
+ <day type="thu" draft="unconfirmed">Lesine</day>
+ <day type="fri" draft="unconfirmed">Lesihlanu</day>
+ <day type="sat" draft="unconfirmed">uMgcibelo</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ZAR">
+ <symbol draft="unconfirmed">R</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ss_ZA.xml b/libs/Zend/Locale/Data/ss_ZA.xml
new file mode 100755
index 0000000000..64e70914c8
--- /dev/null
+++ b/libs/Zend/Locale/Data/ss_ZA.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="ss"/>
+ <territory type="ZA"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/st.xml b/libs/Zend/Locale/Data/st.xml
new file mode 100755
index 0000000000..969252b5a7
--- /dev/null
+++ b/libs/Zend/Locale/Data/st.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.10 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="st"/>
+ </identity>
+ <characters>
+ <exemplarCharacters>[a-z]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Phe</month>
+ <month type="2" draft="unconfirmed">Kol</month>
+ <month type="3" draft="unconfirmed">Ube</month>
+ <month type="4" draft="unconfirmed">Mme</month>
+ <month type="5" draft="unconfirmed">Mot</month>
+ <month type="6" draft="unconfirmed">Jan</month>
+ <month type="7" draft="unconfirmed">Upu</month>
+ <month type="8" draft="unconfirmed">Pha</month>
+ <month type="9" draft="unconfirmed">Leo</month>
+ <month type="10" draft="unconfirmed">Mph</month>
+ <month type="11" draft="unconfirmed">Pun</month>
+ <month type="12" draft="unconfirmed">Tsh</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Phesekgong</month>
+ <month type="2" draft="unconfirmed">Hlakola</month>
+ <month type="3" draft="unconfirmed">Hlakubele</month>
+ <month type="4" draft="unconfirmed">Mmese</month>
+ <month type="5" draft="unconfirmed">Motsheanong</month>
+ <month type="6" draft="unconfirmed">Phupjane</month>
+ <month type="7" draft="unconfirmed">Phupu</month>
+ <month type="8" draft="unconfirmed">Phata</month>
+ <month type="9" draft="unconfirmed">Leotshe</month>
+ <month type="10" draft="unconfirmed">Mphalane</month>
+ <month type="11" draft="unconfirmed">Pundungwane</month>
+ <month type="12" draft="unconfirmed">Tshitwe</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Son</day>
+ <day type="mon" draft="unconfirmed">Mma</day>
+ <day type="tue" draft="unconfirmed">Bed</day>
+ <day type="wed" draft="unconfirmed">Rar</day>
+ <day type="thu" draft="unconfirmed">Ne</day>
+ <day type="fri" draft="unconfirmed">Hla</day>
+ <day type="sat" draft="unconfirmed">Moq</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Sontaha</day>
+ <day type="mon" draft="unconfirmed">Mmantaha</day>
+ <day type="tue" draft="unconfirmed">Labobedi</day>
+ <day type="wed" draft="unconfirmed">Laboraru</day>
+ <day type="thu" draft="unconfirmed">Labone</day>
+ <day type="fri" draft="unconfirmed">Labohlane</day>
+ <day type="sat" draft="unconfirmed">Moqebelo</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ZAR">
+ <symbol draft="unconfirmed">R</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/st_ZA.xml b/libs/Zend/Locale/Data/st_ZA.xml
new file mode 100755
index 0000000000..437daf6186
--- /dev/null
+++ b/libs/Zend/Locale/Data/st_ZA.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="st"/>
+ <territory type="ZA"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/supplementalData.xml b/libs/Zend/Locale/Data/supplementalData.xml
new file mode 100755
index 0000000000..b3eb122acc
--- /dev/null
+++ b/libs/Zend/Locale/Data/supplementalData.xml
@@ -0,0 +1,1726 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE supplementalData SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldmlSupplemental.dtd">
+<supplementalData version="1.4">
+ <version number="$Revision: 1.86 $"/>
+ <generation date="$Date: 2006/11/01 21:17:19 $"/>
+ <currencyData>
+ <fractions>
+ <info iso4217="ADP" digits="0" rounding="0"/>
+ <info iso4217="BHD" digits="3" rounding="0"/>
+ <info iso4217="BIF" digits="0" rounding="0"/>
+ <info iso4217="BYR" digits="0" rounding="0"/>
+ <info iso4217="CHF" digits="2" rounding="5"/>
+ <info iso4217="CLF" digits="0" rounding="0"/>
+ <info iso4217="CLP" digits="0" rounding="0"/>
+ <info iso4217="DEFAULT" digits="2" rounding="0"/>
+ <info iso4217="DJF" digits="0" rounding="0"/>
+ <info iso4217="ESP" digits="0" rounding="0"/>
+ <info iso4217="GNF" digits="0" rounding="0"/>
+ <info iso4217="IQD" digits="3" rounding="0"/>
+ <info iso4217="ITL" digits="0" rounding="0"/>
+ <info iso4217="JOD" digits="3" rounding="0"/>
+ <info iso4217="JPY" digits="0" rounding="0"/>
+ <info iso4217="KMF" digits="0" rounding="0"/>
+ <info iso4217="KRW" digits="0" rounding="0"/>
+ <info iso4217="KWD" digits="3" rounding="0"/>
+ <info iso4217="LUF" digits="0" rounding="0"/>
+ <info iso4217="LYD" digits="3" rounding="0"/>
+ <info iso4217="MGA" digits="0" rounding="0"/>
+ <info iso4217="MGF" digits="0" rounding="0"/>
+ <info iso4217="OMR" digits="3" rounding="0"/>
+ <info iso4217="PYG" digits="0" rounding="0"/>
+ <info iso4217="RWF" digits="0" rounding="0"/>
+ <info iso4217="TND" digits="3" rounding="0"/>
+ <info iso4217="TRL" digits="0" rounding="0"/>
+ <info iso4217="VUV" digits="0" rounding="0"/>
+ <info iso4217="XAF" digits="0" rounding="0"/>
+ <info iso4217="XOF" digits="0" rounding="0"/>
+ <info iso4217="XPF" digits="0" rounding="0"/>
+ </fractions>
+ <region iso3166="AD">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="ESP" from="1873" to="2002-02-28"/>
+ <currency iso4217="FRF" from="1960-01-01" to="2002-02-17"/>
+ <currency iso4217="ADP" from="1936" to="2001-12-31"/>
+ </region>
+ <region iso3166="AE">
+ <currency iso4217="AED" from="1973-05-19"/>
+ </region>
+ <region iso3166="AF">
+ <currency iso4217="AFN" from="2002-10-07"/>
+ <currency iso4217="AFA" from="1927-03-14" to="2002-12-31"/>
+ </region>
+ <region iso3166="AG">
+ <currency iso4217="XCD" from="1965-10-06"/>
+ </region>
+ <region iso3166="AI">
+ <currency iso4217="XCD" from="1965-10-06"/>
+ </region>
+ <region iso3166="AL">
+ <currency iso4217="ALL" from="1965-08-16"/>
+ </region>
+ <region iso3166="AM">
+ <currency iso4217="AMD" from="1993-11-22"/>
+ <currency iso4217="RUR" from="1991-12-25" to="1993-11-22"/>
+ <currency iso4217="SUR" from="1961-01-01" to="1991-12-25"/>
+ </region>
+ <region iso3166="AN">
+ <currency iso4217="ANG" from="1940-05-10"/>
+ </region>
+ <region iso3166="AO">
+ <currency iso4217="AOA" from="1999-12-13"/>
+ <currency iso4217="AOR" from="1995-07-01" to="2000-02"/>
+ <currency iso4217="AON" from="1990-09-25" to="2000-02"/>
+ <currency iso4217="AOK" from="1977-01-08" to="1991-03"/>
+ </region>
+ <region iso3166="AQ">
+ <currency iso4217="XXX"/>
+ </region>
+ <region iso3166="AR">
+ <currency iso4217="ARS" from="1992-01-01"/>
+ <currency iso4217="ARA" from="1985-06-14" to="1992-01-01"/>
+ <currency iso4217="ARP" from="1983-06-01" to="1985-06-14"/>
+ </region>
+ <region iso3166="AS">
+ <currency iso4217="USD" from="1904-07-16"/>
+ </region>
+ <region iso3166="AT">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="ATS" from="1947-12-04" to="2002-02-28"/>
+ </region>
+ <region iso3166="AU">
+ <currency iso4217="AUD" from="1966-02-14"/>
+ </region>
+ <region iso3166="AW">
+ <currency iso4217="AWG" from="1986-01-01"/>
+ <currency iso4217="ANG" from="1940-05-10" to="1986-01-01"/>
+ </region>
+ <region iso3166="AX">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ </region>
+ <region iso3166="AZ">
+ <currency iso4217="AZN" from="2006-01-01"/>
+ <currency iso4217="AZM" from="1993-11-22" to="2006-12-31"/>
+ <currency iso4217="RUR" from="1991-12-25" to="1994-01-01"/>
+ <currency iso4217="SUR" from="1961-01-01" to="1991-12-25"/>
+ </region>
+ <region iso3166="BA">
+ <currency iso4217="BAM" from="1995-01-01"/>
+ <currency iso4217="BAD" from="1992-07-01" to="1997-07"/>
+ <currency iso4217="YUN" from="1990-01-01" to="1992-07-01"/>
+ <currency iso4217="YUD" from="1966-01-01" to="1990-01-01"/>
+ </region>
+ <region iso3166="BB">
+ <currency iso4217="BBD" from="1973-12-03"/>
+ <currency iso4217="XCD" from="1965-10-06" to="1973-12-03"/>
+ </region>
+ <region iso3166="BD">
+ <currency iso4217="BDT" from="1972-01-01"/>
+ <currency iso4217="PKR" from="1948-04-01" to="1972-01-01"/>
+ <currency iso4217="INR" from="1835-08-17" to="1948-04-01"/>
+ </region>
+ <region iso3166="BE">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="BEF" from="1831-02-07" to="2002-02-28"/>
+ <currency iso4217="NLG" from="1816-12-15" to="1831-02-07"/>
+ </region>
+ <region iso3166="BF">
+ <currency iso4217="XOF" from="1984-08-04"/>
+ </region>
+ <region iso3166="BG">
+ <currency iso4217="BGN" from="1999-07-05"/>
+ <currency iso4217="BGL" from="1962-01-01" to="1999-07-05"/>
+ </region>
+ <region iso3166="BH">
+ <currency iso4217="BHD" from="1965-10-16"/>
+ </region>
+ <region iso3166="BI">
+ <currency iso4217="BIF" from="1964-05-19"/>
+ </region>
+ <region iso3166="BJ">
+ <currency iso4217="XOF" from="1975-11-30"/>
+ </region>
+ <region iso3166="BM">
+ <currency iso4217="BMD" from="1970-02-06"/>
+ </region>
+ <region iso3166="BN">
+ <currency iso4217="BND" from="1967-06-12"/>
+ <currency iso4217="MYR" from="1963-09-16" to="1967-06-12"/>
+ </region>
+ <region iso3166="BO">
+ <currency iso4217="BOB" from="1987-01-01"/>
+ <currency iso4217="BOP" from="1963-01-01" to="1986-12-31"/>
+ </region>
+ <region iso3166="BR">
+ <currency iso4217="BRL" from="1994-07-01"/>
+ <currency iso4217="BRR" from="1993-08-01" to="1994-07-01"/>
+ <currency iso4217="BRE" from="1990-03-16" to="1993-08-01"/>
+ <currency iso4217="BRN" from="1989-01-15" to="1990-03-16"/>
+ <currency iso4217="BRC" from="1986-02-28" to="1989-01-15"/>
+ <currency iso4217="BRB" from="1967-02-13" to="1986-02-28"/>
+ </region>
+ <region iso3166="BS">
+ <currency iso4217="BSD" from="1966-05-25"/>
+ </region>
+ <region iso3166="BT">
+ <currency iso4217="INR" from="1907"/>
+ <currency iso4217="BTN" from="1974-04-16"/>
+ </region>
+ <region iso3166="BV">
+ <currency iso4217="NOK" from="1905-06-07"/>
+ </region>
+ <region iso3166="BW">
+ <currency iso4217="BWP" from="1976-08-23"/>
+ <currency iso4217="ZAR" from="1961-02-14" to="1976-08-23"/>
+ </region>
+ <region iso3166="BY">
+ <currency iso4217="BYR" from="2000-01-01"/>
+ <currency iso4217="BYB" from="1994-08" to="2000-12-31"/>
+ <currency iso4217="RUR" from="1991-12-25" to="1994-11-08"/>
+ <currency iso4217="SUR" from="1961-01-01" to="1991-12-25"/>
+ </region>
+ <region iso3166="BZ">
+ <currency iso4217="BZD" from="1974-01-01"/>
+ </region>
+ <region iso3166="CA">
+ <currency iso4217="CAD" from="1858-01-01"/>
+ </region>
+ <region iso3166="CC">
+ <currency iso4217="AUD" from="1966-02-14"/>
+ </region>
+ <region iso3166="CD">
+ <currency iso4217="CDF" from="1998-07"/>
+ <currency iso4217="ZRN" from="1993-11-01" to="1998-07"/>
+ <currency iso4217="ZRZ" from="1971-10-27" to="1993-11-01"/>
+ </region>
+ <region iso3166="CF">
+ <currency iso4217="XAF" from="1993-01-01"/>
+ </region>
+ <region iso3166="CG">
+ <currency iso4217="XAF" from="1993"/>
+ </region>
+ <region iso3166="CH">
+ <currency iso4217="CHF" from="1799-03-17"/>
+ </region>
+ <region iso3166="CI">
+ <currency iso4217="XOF" from="1958-12-04"/>
+ </region>
+ <region iso3166="CK">
+ <currency iso4217="NZD" from="1967-7-10"/>
+ </region>
+ <region iso3166="CL">
+ <currency iso4217="CLP" from="1975-09-29"/>
+ </region>
+ <region iso3166="CM">
+ <currency iso4217="XAF" from="1973-04-01"/>
+ </region>
+ <region iso3166="CN">
+ <currency iso4217="CNY" from="1953-03-01"/>
+ </region>
+ <region iso3166="CO">
+ <currency iso4217="COP" from="1905"/>
+ </region>
+ <region iso3166="CR">
+ <currency iso4217="CRC" from="1896-10-26"/>
+ </region>
+ <region iso3166="CS">
+ <currency iso4217="EUR" from="2003-02-04" to="2006-06-03"/>
+ <currency iso4217="CSD" from="2002-05-15" to="2006-06-03"/>
+ <currency iso4217="YUM" from="1994-01-24" to="2002-05-15"/>
+ </region>
+ <region iso3166="CU">
+ <currency iso4217="CUP" from="1859-01-01"/>
+ <currency iso4217="USD" from="1899" to="1959"/>
+ </region>
+ <region iso3166="CV">
+ <currency iso4217="CVE" from="1914-01-01"/>
+ <currency iso4217="PTE" from="1911-05-22" to="1975-07-05"/>
+ </region>
+ <region iso3166="CX">
+ <currency iso4217="AUD" from="1966-02-14"/>
+ </region>
+ <region iso3166="CY">
+ <currency iso4217="CYP" from="1914-09-10"/>
+ </region>
+ <region iso3166="CZ">
+ <currency iso4217="CZK" from="1993-01-01"/>
+ <currency iso4217="CSK" from="1953-06-01" to="1993-03"/>
+ </region>
+ <region iso3166="DE">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="DEM" from="1948-06-20" to="2002-02-28"/>
+ </region>
+ <region iso3166="DJ">
+ <currency iso4217="DJF" from="1977-06-27"/>
+ </region>
+ <region iso3166="DK">
+ <currency iso4217="DKK" from="1873-05-27"/>
+ </region>
+ <region iso3166="DM">
+ <currency iso4217="XCD" from="1965-10-06"/>
+ </region>
+ <region iso3166="DO">
+ <currency iso4217="DOP" from="1947-10"/>
+ <currency iso4217="USD" from="1905-06-21" to="1947-10"/>
+ </region>
+ <region iso3166="DZ">
+ <currency iso4217="DZD" from="1964-04-01"/>
+ </region>
+ <region iso3166="EC">
+ <currency iso4217="USD" from="2000-10-02"/>
+ <currency iso4217="ECS" from="1884-04-01" to="2000-10-02"/>
+ </region>
+ <region iso3166="EE">
+ <currency iso4217="EEK" from="1992-06-21"/>
+ <currency iso4217="SUR" from="1961-1-1" to="1992-06-20"/>
+ </region>
+ <region iso3166="EG">
+ <currency iso4217="EGP" from="1885-11-14"/>
+ </region>
+ <region iso3166="EH">
+ <currency iso4217="MAD" from="1976-02-26"/>
+ </region>
+ <region iso3166="ER">
+ <currency iso4217="ERN" from="1997-11-08"/>
+ </region>
+ <region iso3166="ES">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="ESP" from="1868-10-19" to="2002-02-28"/>
+ </region>
+ <region iso3166="ET">
+ <currency iso4217="ETB" from="1976-09-15"/>
+ </region>
+ <region iso3166="FI">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="FIM" from="1963-01-01" to="2002-02-28"/>
+ </region>
+ <region iso3166="FJ">
+ <currency iso4217="FJD" from="1969-01-13"/>
+ </region>
+ <region iso3166="FK">
+ <currency iso4217="FKP" from="1901"/>
+ </region>
+ <region iso3166="FM">
+ <currency iso4217="USD" from="1944"/>
+ <currency iso4217="JPY" from="1914-10-03" to="1944"/>
+ </region>
+ <region iso3166="FO">
+ <currency iso4217="DKK" from="1948"/>
+ </region>
+ <region iso3166="FR">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="FRF" from="1960-01-01" to="2002-02-17"/>
+ </region>
+ <region iso3166="GA">
+ <currency iso4217="XAF" from="1993-01-01"/>
+ </region>
+ <region iso3166="GB">
+ <currency iso4217="GBP" from="1694-07-27"/>
+ </region>
+ <region iso3166="GD">
+ <currency iso4217="XCD" from="1967-02-27"/>
+ </region>
+ <region iso3166="GE">
+ <currency iso4217="GEL" from="1995-09-23"/>
+ <currency iso4217="GEK" from="1993-04-05" to="1995-09-25"/>
+ <currency iso4217="RUR" from="1991-12-25" to="1993-06-11"/>
+ <currency iso4217="SUR" from="1961-01-01" to="1991-12-25"/>
+ </region>
+ <region iso3166="GF">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="FRF" from="1960-01-01" to="2002-02-17"/>
+ </region>
+ <region iso3166="GG">
+ <currency iso4217="GBP" from="1830"/>
+ </region>
+ <region iso3166="GH">
+ <currency iso4217="GHC" from="1979-03-09"/>
+ </region>
+ <region iso3166="GI">
+ <currency iso4217="GIP" from="1713"/>
+ </region>
+ <region iso3166="GL">
+ <currency iso4217="DKK" from="1873-05-27"/>
+ </region>
+ <region iso3166="GM">
+ <currency iso4217="GMD" from="1971-07-01"/>
+ </region>
+ <region iso3166="GN">
+ <currency iso4217="GNF" from="1986-01-06"/>
+ <currency iso4217="GNS" from="1972-10-02" to="1986-01-06"/>
+ </region>
+ <region iso3166="GP">
+ <currency iso4217="EUR" from="1999"/>
+ <currency iso4217="FRF" from="1960-01-01" to="2002-02-17"/>
+ </region>
+ <region iso3166="GQ">
+ <currency iso4217="XAF" from="1993-01-01"/>
+ <currency iso4217="GQE" from="1975-07-07" to="1986-06"/>
+ </region>
+ <region iso3166="GR">
+ <currency iso4217="EUR" from="2001-01-01"/>
+ <currency iso4217="GRD" from="1954-05-01" to="2002-02-28"/>
+ </region>
+ <region iso3166="GS">
+ <currency iso4217="GBP" from="1908"/>
+ </region>
+ <region iso3166="GT">
+ <currency iso4217="GTQ" from="1925-05-27"/>
+ </region>
+ <region iso3166="GU">
+ <currency iso4217="USD" from="1944-08-21"/>
+ </region>
+ <region iso3166="GW">
+ <currency iso4217="GWP" from="1976-02-28"/>
+ <currency iso4217="XOF" from="1997-01-01"/>
+ <currency iso4217="GWE" from="1914-01-01" to="1976-02-28"/>
+ </region>
+ <region iso3166="GY">
+ <currency iso4217="GYD" from="1966-05-26"/>
+ </region>
+ <region iso3166="HK">
+ <currency iso4217="HKD" from="1895-02-02"/>
+ </region>
+ <region iso3166="HM">
+ <currency iso4217="AUD" from="1967-02-16"/>
+ </region>
+ <region iso3166="HN">
+ <currency iso4217="HNL" from="1926-04-03"/>
+ </region>
+ <region iso3166="HR">
+ <currency iso4217="HRK" from="1994-05-30"/>
+ <currency iso4217="HRD" from="1991-12-23" to="1995-01"/>
+ <currency iso4217="YUN" from="1990-01-01" to="1991-12-23"/>
+ <currency iso4217="YUD" from="1966-01-01" to="1990-01-01"/>
+ </region>
+ <region iso3166="HT">
+ <currency iso4217="HTG" from="1872-08-26"/>
+ <currency iso4217="USD" from="1915"/>
+ </region>
+ <region iso3166="HU">
+ <currency iso4217="HUF" from="1946-07-23"/>
+ </region>
+ <region iso3166="ID">
+ <currency iso4217="IDR" from="1965-12-13"/>
+ </region>
+ <region iso3166="IE">
+ <currency iso4217="EUR" from="1999"/>
+ <currency iso4217="IEP" from="1922" to="2002-02-09"/>
+ <currency iso4217="GBP" from="1800" to="1922"/>
+ </region>
+ <region iso3166="IL">
+ <currency iso4217="ILS" from="1985-09-04"/>
+ <currency iso4217="ILP" from="1948-08-16" to="1980-02-22"/>
+ </region>
+ <region iso3166="IM">
+ <currency iso4217="GBP" from="1840-01-03"/>
+ </region>
+ <region iso3166="IN">
+ <currency iso4217="INR" from="1835-08-17"/>
+ </region>
+ <region iso3166="IO">
+ <currency iso4217="USD" from="1965-11-08"/>
+ <currency iso4217="GBP" from="1965-11-08"/>
+ </region>
+ <region iso3166="IQ">
+ <currency iso4217="IQD" from="1931-04-19"/>
+ <currency iso4217="EGP" from="1920-11-11" to="1931-04-19"/>
+ <currency iso4217="INR" from="1920-11-11" to="1931-04-19"/>
+ </region>
+ <region iso3166="IR">
+ <currency iso4217="IRR" from="1932-05-13"/>
+ </region>
+ <region iso3166="IS">
+ <currency iso4217="ISK" from="1981-01-01"/>
+ <currency iso4217="DKK" from="1873-05-27" to="1918-12-01"/>
+ </region>
+ <region iso3166="IT">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="ITL" from="1862-8-24" to="2002-02-28"/>
+ </region>
+ <region iso3166="JE">
+ <currency iso4217="GBP" from="1837"/>
+ </region>
+ <region iso3166="JM">
+ <currency iso4217="JMD" from="1969-09-08"/>
+ </region>
+ <region iso3166="JO">
+ <currency iso4217="JOD" from="1950-07-01"/>
+ </region>
+ <region iso3166="JP">
+ <currency iso4217="JPY" from="1871-06"/>
+ </region>
+ <region iso3166="KE">
+ <currency iso4217="KES" from="1966-09-14"/>
+ </region>
+ <region iso3166="KG">
+ <currency iso4217="KGS" from="1993-05-10"/>
+ <currency iso4217="RUR" from="1991-12-25" to="1993-05-10"/>
+ <currency iso4217="SUR" from="1961-01-01" to="1991-12-25"/>
+ </region>
+ <region iso3166="KH">
+ <currency iso4217="KHR" from="1980-03-20"/>
+ </region>
+ <region iso3166="KI">
+ <currency iso4217="AUD" from="1966-02-14"/>
+ </region>
+ <region iso3166="KM">
+ <currency iso4217="KMF" from="1975-07-06"/>
+ </region>
+ <region iso3166="KN">
+ <currency iso4217="XCD" from="1965-10-06"/>
+ </region>
+ <region iso3166="KP">
+ <currency iso4217="KPW" from="1959-04-17"/>
+ </region>
+ <region iso3166="KR">
+ <currency iso4217="KRW" from="1962-06-10"/>
+ </region>
+ <region iso3166="KW">
+ <currency iso4217="KWD" from="1961-04-01"/>
+ </region>
+ <region iso3166="KY">
+ <currency iso4217="KYD" from="1971"/>
+ <currency iso4217="JMD" from="1969-09-08" to="1971"/>
+ </region>
+ <region iso3166="KZ">
+ <currency iso4217="KZT" from="1993-11-05"/>
+ </region>
+ <region iso3166="LA">
+ <currency iso4217="LAK" from="1979-12-10"/>
+ </region>
+ <region iso3166="LB">
+ <currency iso4217="LBP" from="1948-02-02"/>
+ </region>
+ <region iso3166="LC">
+ <currency iso4217="XCD" from="1965-10-06"/>
+ </region>
+ <region iso3166="LI">
+ <currency iso4217="CHF" from="1921-02"/>
+ </region>
+ <region iso3166="LK">
+ <currency iso4217="LKR" from="1978-05-22"/>
+ </region>
+ <region iso3166="LR">
+ <currency iso4217="LRD" from="1944-01-01"/>
+ </region>
+ <region iso3166="LS">
+ <currency iso4217="ZAR" from="1961-02-14"/>
+ <currency iso4217="LSL" from="1980-01-22"/>
+ </region>
+ <region iso3166="LT">
+ <currency iso4217="LTL" from="1993-06-25"/>
+ <currency iso4217="LTT" from="1992-10-1" to="1993-06-25"/>
+ <currency iso4217="SUR" from="1961-1-1" to="1992-10-01"/>
+ </region>
+ <region iso3166="LU">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="LUF" from="1944-09-4" to="2002-02-28"/>
+ </region>
+ <region iso3166="LV">
+ <currency iso4217="LVL" from="1993-06-28"/>
+ <currency iso4217="LVR" from="1992-05-07" to="1993-10-17"/>
+ <currency iso4217="SUR" from="1961-01-01" to="1992-07-20"/>
+ </region>
+ <region iso3166="LY">
+ <currency iso4217="LYD" from="1971-09-01"/>
+ </region>
+ <region iso3166="MA">
+ <currency iso4217="MAD" from="1959-10-17"/>
+ </region>
+ <region iso3166="MC">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="FRF" from="1960-01-01" to="2002-02-17"/>
+ </region>
+ <region iso3166="MD">
+ <currency iso4217="MDL" from="1993-11-29"/>
+ </region>
+ <region iso3166="ME">
+ <currency iso4217="EUR" from="2002-01-01"/>
+ <currency iso4217="DEM" from="1999-10-02" to="2002-05-15"/>
+ <currency iso4217="YUM" from="1994-01-24" to="2002-05-15"/>
+ </region>
+ <region iso3166="MG">
+ <currency iso4217="MGA" from="1983-11-01"/>
+ <currency iso4217="MGF" from="1963-07-01" to="2004-12-31"/>
+ </region>
+ <region iso3166="MH">
+ <currency iso4217="USD" from="1944"/>
+ </region>
+ <region iso3166="MK">
+ <currency iso4217="MKD" from="1993-05-20"/>
+ </region>
+ <region iso3166="ML">
+ <currency iso4217="XOF" from="1984-06-01"/>
+ <currency iso4217="MLF" from="1962-07-02" to="1984-08-31"/>
+ <currency iso4217="XOF" from="1958-11-24" to="1962-07-02"/>
+ </region>
+ <region iso3166="MM">
+ <currency iso4217="MMK" from="1989-06-18"/>
+ <currency iso4217="BUK" from="1952-07-01" to="1989-06-18"/>
+ </region>
+ <region iso3166="MN">
+ <currency iso4217="MNT" from="1915-03"/>
+ </region>
+ <region iso3166="MO">
+ <currency iso4217="MOP" from="1901"/>
+ </region>
+ <region iso3166="MP">
+ <currency iso4217="USD" from="1944"/>
+ </region>
+ <region iso3166="MQ">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="FRF" from="1960-01-01" to="2002-02-17"/>
+ </region>
+ <region iso3166="MR">
+ <currency iso4217="MRO" from="1973-06-29"/>
+ <currency iso4217="XOF" from="1958-11-28" to="1973-06-29"/>
+ </region>
+ <region iso3166="MS">
+ <currency iso4217="XCD" from="1967-02-27"/>
+ </region>
+ <region iso3166="MT">
+ <currency iso4217="MTL" from="1968-06-07"/>
+ <currency iso4217="MTP" from="1914-08-13" to="1968-06-07"/>
+ </region>
+ <region iso3166="MU">
+ <currency iso4217="MUR" from="1934-04-01"/>
+ </region>
+ <region iso3166="MV">
+ <currency iso4217="MVR" from="1981-07-01"/>
+ </region>
+ <region iso3166="MW">
+ <currency iso4217="MWK" from="1971-02-15"/>
+ </region>
+ <region iso3166="MX">
+ <currency iso4217="MXN" from="1993-01-01"/>
+ <currency iso4217="MXP" from="1822" to="1992-12-31"/>
+ </region>
+ <region iso3166="MY">
+ <currency iso4217="MYR" from="1963-9-16"/>
+ </region>
+ <region iso3166="MZ">
+ <currency iso4217="MZN" from="2006-07-01"/>
+ <currency iso4217="MZM" from="1980-06-16" to="2006-12-31"/>
+ <currency iso4217="MZE" from="1975-06-25" to="1980-06-16"/>
+ </region>
+ <region iso3166="NA">
+ <currency iso4217="ZAR" from="1961-02-14"/>
+ <currency iso4217="NAD" from="1993"/>
+ </region>
+ <region iso3166="NC">
+ <currency iso4217="XPF" from="1985"/>
+ </region>
+ <region iso3166="NE">
+ <currency iso4217="XOF" from="1958-12-19"/>
+ </region>
+ <region iso3166="NF">
+ <currency iso4217="AUD" from="1966-02-14"/>
+ </region>
+ <region iso3166="NG">
+ <currency iso4217="NGN" from="1973-01-01"/>
+ </region>
+ <region iso3166="NI">
+ <currency iso4217="NIO" from="1991-04-30"/>
+ <currency iso4217="NIC" from="1988-02-15" to="1991-04-30"/>
+ </region>
+ <region iso3166="NL">
+ <currency iso4217="EUR" from="1999-1-1"/>
+ <currency iso4217="NLG" from="1813" to="2002-02-28"/>
+ </region>
+ <region iso3166="NO">
+ <currency iso4217="NOK" from="1905-06-07"/>
+ <currency iso4217="SEK" from="1873-5-27" to="1905-06-07"/>
+ </region>
+ <region iso3166="NP">
+ <currency iso4217="NPR" from="1933"/>
+ <currency iso4217="INR" from="1870" to="1966-10-17"/>
+ </region>
+ <region iso3166="NR">
+ <currency iso4217="AUD" from="1966-02-14"/>
+ </region>
+ <region iso3166="NU">
+ <currency iso4217="NZD" from="1967-07-10"/>
+ </region>
+ <region iso3166="NZ">
+ <currency iso4217="NZD" from="1967-07-10"/>
+ </region>
+ <region iso3166="OM">
+ <currency iso4217="OMR" from="1972-11-11"/>
+ </region>
+ <region iso3166="PA">
+ <currency iso4217="PAB" from="1903-11-04"/>
+ <currency iso4217="USD" from="1903-11-18"/>
+ </region>
+ <region iso3166="PE">
+ <currency iso4217="PEN" from="1991-07-01"/>
+ <currency iso4217="PEI" from="1985-02-01" to="1991-07-01"/>
+ <currency iso4217="PES" from="1863-02-14" to="1985-02-01"/>
+ </region>
+ <region iso3166="PF">
+ <currency iso4217="XPF" from="1945-12-26"/>
+ </region>
+ <region iso3166="PG">
+ <currency iso4217="PGK" from="1975-09-16"/>
+ <currency iso4217="AUD" from="1966-02-14" to="1975-09-16"/>
+ </region>
+ <region iso3166="PH">
+ <currency iso4217="PHP" from="1946-07-04"/>
+ </region>
+ <region iso3166="PK">
+ <currency iso4217="PKR" from="1948-04-01"/>
+ <currency iso4217="INR" from="1835-08-17" to="1947-08-15"/>
+ </region>
+ <region iso3166="PL">
+ <currency iso4217="PLN" from="1995-01-01"/>
+ <currency iso4217="PLZ" from="1950-10-28" to="1994-12-31"/>
+ </region>
+ <region iso3166="PM">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="FRF" from="1972-12-21" to="2002-02-17"/>
+ </region>
+ <region iso3166="PN">
+ <currency iso4217="NZD" from="1969-01-13"/>
+ </region>
+ <region iso3166="PR">
+ <currency iso4217="USD" from="1898-12-10"/>
+ <currency iso4217="ESP" from="1800" to="1898-12-10"/>
+ </region>
+ <region iso3166="PS">
+ <currency iso4217="JOD" from="1996-02-12"/>
+ <currency iso4217="ILS" from="1985-09-04"/>
+ <currency iso4217="ILP" from="1967-06" to="1980-02-22"/>
+ <currency iso4217="JOD" from="1950-07-01" to="1967-06"/>
+ </region>
+ <region iso3166="PT">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="PTE" from="1911-05-22" to="2002-02-28"/>
+ </region>
+ <region iso3166="PW">
+ <currency iso4217="USD" from="1944"/>
+ </region>
+ <region iso3166="PY">
+ <currency iso4217="PYG" from="1943-11"/>
+ </region>
+ <region iso3166="QA">
+ <currency iso4217="QAR" from="1973-05-19"/>
+ </region>
+ <region iso3166="RE">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="FRF" from="1975-01-01" to="2002-02-17"/>
+ </region>
+ <region iso3166="RO">
+ <currency iso4217="RON" from="2005-07-01"/>
+ <currency iso4217="ROL" from="1952-01-28" to="2006-12-31"/>
+ </region>
+ <region iso3166="RS">
+ <currency iso4217="RSD" from="2006-10-25"/>
+ <currency iso4217="CSD" from="2002-05-15" to="2006-10-25"/>
+ <currency iso4217="YUM" from="1994-01-24" to="2002-05-15"/>
+ </region>
+ <region iso3166="RU">
+ <currency iso4217="RUB" from="1999-01-01"/>
+ <currency iso4217="RUR" from="1991-12-25" to="1998-12-31"/>
+ </region>
+ <region iso3166="RW">
+ <currency iso4217="RWF" from="1964-05-19"/>
+ </region>
+ <region iso3166="SA">
+ <currency iso4217="SAR" from="1952-10-22"/>
+ </region>
+ <region iso3166="SB">
+ <currency iso4217="SBD" from="1977-10-24"/>
+ <currency iso4217="AUD" from="1966-02-14" to="1978-06-30"/>
+ </region>
+ <region iso3166="SC">
+ <currency iso4217="SCR" from="1903-11"/>
+ </region>
+ <region iso3166="SD">
+ <currency iso4217="SDD" from="1992"/>
+ <currency iso4217="SDP" from="1957-04-08" to="1998-06"/>
+ <currency iso4217="EGP" from="1889-01-19" to="1958-01-01"/>
+ <currency iso4217="GBP" from="1889-01-19" to="1958-01-01"/>
+ </region>
+ <region iso3166="SE">
+ <currency iso4217="SEK" from="1873-5-27"/>
+ </region>
+ <region iso3166="SG">
+ <currency iso4217="SGD" from="1967-06-12"/>
+ <currency iso4217="MYR" from="1963-09-16" to="1967-06-12"/>
+ </region>
+ <region iso3166="SH">
+ <currency iso4217="SHP" from="1917-02-15"/>
+ </region>
+ <region iso3166="SI">
+ <currency iso4217="EUR" from="2007-01-01"/>
+ <currency iso4217="SIT" from="1992-10-07" to="2007-01-14"/>
+ </region>
+ <region iso3166="SJ">
+ <currency iso4217="NOK" from="1905-06-07"/>
+ </region>
+ <region iso3166="SK">
+ <currency iso4217="SKK" from="1992-12-31"/>
+ <currency iso4217="CSK" from="1953-06-01" to="1992-12-31"/>
+ </region>
+ <region iso3166="SL">
+ <currency iso4217="SLL" from="1964-08-04"/>
+ <currency iso4217="GBP" from="1808-11-30" to="1966-02-04"/>
+ </region>
+ <region iso3166="SM">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="ITL" from="1865-12-23" to="2001-02-28"/>
+ </region>
+ <region iso3166="SN">
+ <currency iso4217="XOF" from="1959-04-04"/>
+ </region>
+ <region iso3166="SO">
+ <currency iso4217="SOS" from="1960-07-01"/>
+ </region>
+ <region iso3166="SR">
+ <currency iso4217="SRD" from="2004-01-01"/>
+ <currency iso4217="SRG" from="1940-05-10" to="2003-12-31"/>
+ <currency iso4217="NLG" from="1815-11-20" to="1940-05-10"/>
+ </region>
+ <region iso3166="ST">
+ <currency iso4217="STD" from="1977-09-08"/>
+ </region>
+ <region iso3166="SV">
+ <currency iso4217="SVC" from="1919-11-11"/>
+ <currency iso4217="USD" from="2001-01-01"/>
+ </region>
+ <region iso3166="SY">
+ <currency iso4217="SYP" from="1948-01-01"/>
+ </region>
+ <region iso3166="SZ">
+ <currency iso4217="SZL" from="1974-09-06"/>
+ </region>
+ <region iso3166="TC">
+ <currency iso4217="USD" from="1969-09-08"/>
+ </region>
+ <region iso3166="TD">
+ <currency iso4217="XAF" from="1993-01-01"/>
+ </region>
+ <region iso3166="TF">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="FRF" from="1959-01-01" to="2002-02-17"/>
+ </region>
+ <region iso3166="TG">
+ <currency iso4217="XOF" from="1958-11-28"/>
+ </region>
+ <region iso3166="TH">
+ <currency iso4217="THB" from="1928-04-15"/>
+ </region>
+ <region iso3166="TJ">
+ <currency iso4217="TJS" from="2000-10-26"/>
+ <currency iso4217="TJR" from="1995-05-10" to="2000-10-25"/>
+ </region>
+ <region iso3166="TK">
+ <currency iso4217="NZD" from="1967-07-10"/>
+ </region>
+ <region iso3166="TL">
+ <currency iso4217="USD" from="1999-10-20"/>
+ <currency iso4217="TPE" from="1959-01-02" to="2002-05-20"/>
+ <currency iso4217="IDR" from="1975-12-07" to="2002-05-20"/>
+ </region>
+ <region iso3166="TM">
+ <currency iso4217="TMM" from="1993-11-01"/>
+ <currency iso4217="RUR" from="1991-12-25" to="1993-11-01"/>
+ <currency iso4217="SUR" from="1961-01-01" to="1991-12-25"/>
+ </region>
+ <region iso3166="TN">
+ <currency iso4217="TND" from="1958-11-01"/>
+ </region>
+ <region iso3166="TO">
+ <currency iso4217="TOP" from="1966-02-14"/>
+ </region>
+ <region iso3166="TR">
+ <currency iso4217="TRY" from="2005-01-01"/>
+ <currency iso4217="TRL" from="1922-11-01" to="2005-12-31"/>
+ </region>
+ <region iso3166="TT">
+ <currency iso4217="TTD" from="1964"/>
+ </region>
+ <region iso3166="TV">
+ <currency iso4217="AUD" from="1966-02-14"/>
+ </region>
+ <region iso3166="TW">
+ <currency iso4217="TWD" from="1949-06-15"/>
+ </region>
+ <region iso3166="TZ">
+ <currency iso4217="TZS" from="1966-06-14"/>
+ </region>
+ <region iso3166="UA">
+ <currency iso4217="UAH" from="1996-09-02"/>
+ <currency iso4217="UAK" from="1992-11-13" to="1993-10-17"/>
+ <currency iso4217="RUR" from="1991-12-25" to="1992-11-13"/>
+ <currency iso4217="SUR" from="1961-1-1" to="1991-12-25"/>
+ </region>
+ <region iso3166="UG">
+ <currency iso4217="UGX" from="1987-05-15"/>
+ <currency iso4217="UGS" from="1966-08-15" to="1987-05-15"/>
+ </region>
+ <region iso3166="UM">
+ <currency iso4217="USD" from="1944"/>
+ </region>
+ <region iso3166="US">
+ <currency iso4217="USD" from="1792"/>
+ </region>
+ <region iso3166="UY">
+ <currency iso4217="UYU" from="1993-03-01"/>
+ <currency iso4217="UYP" from="1975-07-01" to="1993-03-01"/>
+ </region>
+ <region iso3166="UZ">
+ <currency iso4217="UZS" from="1994-07-01"/>
+ </region>
+ <region iso3166="VA">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="ITL" from="1870-10-19" to="2002-02-28"/>
+ </region>
+ <region iso3166="VC">
+ <currency iso4217="XCD" from="1965-10-06"/>
+ </region>
+ <region iso3166="VE">
+ <currency iso4217="VEB" from="1871-05-11"/>
+ </region>
+ <region iso3166="VG">
+ <currency iso4217="USD" from="1833"/>
+ <currency iso4217="GBP" from="1833" to="1959"/>
+ </region>
+ <region iso3166="VI">
+ <currency iso4217="USD" from="1837"/>
+ </region>
+ <region iso3166="VN">
+ <currency iso4217="VND" from="1985-09-14"/>
+ </region>
+ <region iso3166="VU">
+ <currency iso4217="VUV" from="1981-01-01"/>
+ </region>
+ <region iso3166="WF">
+ <currency iso4217="XPF" from="1961-07-30"/>
+ </region>
+ <region iso3166="WS">
+ <currency iso4217="WST" from="1967-07-10"/>
+ </region>
+ <region iso3166="YE">
+ <currency iso4217="YER" from="1990-05-22"/>
+ </region>
+ <region iso3166="YT">
+ <currency iso4217="EUR" from="1999-01-01"/>
+ <currency iso4217="FRF" from="1976-02-23" to="2002-02-17"/>
+ <currency iso4217="KMF" from="1975-01-01" to="1976-02-23"/>
+ </region>
+ <region iso3166="ZA">
+ <currency iso4217="ZAR" from="1961-02-14"/>
+ </region>
+ <region iso3166="ZM">
+ <currency iso4217="ZMK" from="1968-01-16"/>
+ </region>
+ <region iso3166="ZW">
+ <currency iso4217="ZWD" from="1980-04-18"/>
+ </region>
+ </currencyData>
+ <territoryContainment>
+ <group type="001" contains="002 009 019 142 150"/>
+ <group type="003" contains="021 029 013"/>
+ <group type="419" contains="029 013 005"/>
+ <group type="011" contains="BF BJ CI CV GH GM GN GW LR ML MR NE NG SH SL SN TG"/>
+ <group type="013" contains="BZ CR GT HN MX NI PA SV"/>
+ <group type="014" contains="BI DJ ER ET KE KM MG MU MW MZ RE RW SC SO TZ UG YT ZM ZW"/>
+ <group type="142" contains="030 035 143 145 034 062"/>
+ <group type="143" contains="TM TJ KG KZ UZ"/>
+ <group type="145" contains="AE AM AZ BH CY GE IL IQ JO KW LB OM PS QA SA NT SY TR YE YD"/>
+ <group type="015" contains="DZ EG EH LY MA SD TN"/>
+ <group type="150" contains="039 151 154 155 QU"/>
+ <group type="151" contains="BG BY CZ HU MD PL RO RU SU SK UA"/>
+ <group type="154" contains="GG IM JE AX DK EE FI FO GB IE IM IS LT LV NO SE SJ"/>
+ <group type="830" contains="GG JE"/>
+ <group type="155" contains="AT BE CH DE DD FR FX LI LU MC NL"/>
+ <group type="017" contains="AO CD ZR CF CG CM GA GQ ST TD"/>
+ <group type="172" contains="AM AZ BY GE KG KZ MD RU TJ TM UA UZ"/>
+ <group type="018" contains="BW LS NA SZ ZA"/>
+ <group type="019" contains="005 013 021 029 003 419"/>
+ <group type="002" contains="011 014 015 017 018"/>
+ <group type="021" contains="BM CA GL PM US"/>
+ <group type="029" contains="AG AI AN AW BB BS CU DM DO GD GP HT JM KN KY LC MQ MS PR TC TT VC VG VI"/>
+ <group type="003" contains="013 021 029"/>
+ <group type="030" contains="CN HK JP KP KR MN MO TW"/>
+ <group type="035" contains="BN ID KH LA MM BU MY PH SG TH TL TP VN"/>
+ <group type="039" contains="AD AL BA ES GI GR HR IT ME MK MT CS RS PT SI SM VA YU"/>
+ <group type="419" contains="005 013 029"/>
+ <group type="005" contains="AR BO BR CL CO EC FK GF GY PE PY SR UY VE"/>
+ <group type="053" contains="AU NF NZ"/>
+ <group type="054" contains="FJ NC PG SB VU"/>
+ <group type="057" contains="FM GU KI MH MP NR PW"/>
+ <group type="061" contains="AS CK NU PF PN TK TO TV WF WS"/>
+ <group type="062" contains="034 143"/>
+ <group type="034" contains="AF BD BT IN IR LK MV NP PK"/>
+ <group type="009" contains="053 054 057 061 QO"/>
+ <group type="QO" contains="AQ BV CC CX GS HM IO TF UM"/>
+ <group type="QU" contains="AT BE CY CZ DE DK EE ES FI FR GB GR HU IE IT LT LU LV MT NL PL PT SE SI SK"/>
+ </territoryContainment>
+ <languageData>
+ <language type="aa" scripts="Latn" territories="DJ ER ET"/>
+ <language type="ab" scripts="Cyrl" territories="GE" alt="secondary"/>
+ <language type="ab" scripts="Cyrl" territories="TR" alt="secondary"/>
+ <language type="af" scripts="Latn" territories="NA ZA"/>
+ <language type="ak" scripts="Latn" territories="GH"/>
+ <language type="am" scripts="Ethi" territories="ET"/>
+ <language type="ar" scripts="Arab" territories="AE BH DJ DZ EG EH ER IL IQ JO KM KW LB LY MA MR OM PS QA SA SD SY TD TN YE"/>
+ <language type="ar" scripts="Arab" territories="IR" alt="secondary"/>
+ <language type="as" scripts="Beng" territories="BD IN"/>
+ <language type="ay" scripts="Latn" territories="BO PE"/>
+ <language type="az" scripts="Arab Cyrl Latn" territories="AZ IR"/>
+ <language type="az" scripts="Arab Cyrl Latn" territories="GE TR" alt="secondary"/>
+ <language type="bal" scripts="Arab Latn" territories="AF IR OM" alt="secondary"/>
+ <language type="bal" scripts="Arab Latn" territories="PK"/>
+ <language type="be" scripts="Cyrl" territories="BY"/>
+ <language type="bg" scripts="Cyrl" territories="BG"/>
+ <language type="bn" scripts="Beng" territories="BD IN"/>
+ <language type="bo" scripts="Tibt" territories="CN IN NP" alt="secondary"/>
+ <language type="bs" scripts="Latn" territories="BA"/>
+ <language type="bs" scripts="Latn" territories="HR ME RS" alt="secondary"/>
+ <language type="byn" scripts="Ethi" territories="ER"/>
+ <language type="ca" scripts="Latn" territories="AD ES"/>
+ <language type="cch" scripts="Latn" territories="NG"/>
+ <language type="cch" scripts="Latn" territories="NG"/>
+ <language type="ch" scripts="Latn" territories="GU MP"/>
+ <language type="chr" scripts="Latn Cher" territories="US" alt="secondary"/>
+ <language type="cop" scripts="Copt Arab" territories="EG"/>
+ <language type="cop" scripts="Copt Arab" territories="US" alt="secondary"/>
+ <language type="cpe" scripts="Latn" territories="SL"/>
+ <language type="cr" scripts="Cans Latn" territories="CA" alt="secondary"/>
+ <language type="cs" scripts="Latn" territories="CZ"/>
+ <language type="cy" scripts="Latn" territories="GB"/>
+ <language type="da" scripts="Latn" territories="DK GL"/>
+ <language type="de" scripts="Latn" territories="AT BE CH DE LI LU NA"/>
+ <language type="de" scripts="Latn" territories="IT" alt="secondary"/>
+ <language type="dgr" territories="CA" alt="secondary"/>
+ <language type="dv" scripts="Thaa" territories="MV"/>
+ <language type="dz" scripts="Tibt" territories="BT"/>
+ <language type="ee" scripts="Latn" territories="GH TG"/>
+ <language type="el" scripts="Grek" territories="CY GR"/>
+ <language type="en" scripts="Latn" territories="AG AI AS AU AW BB BM BS BW BZ CA CC CK CM CX DM ER FJ FK FM GB GD GH GI GM GY HK IE IN IO JM KE KI KN KY LC LR LS MH MP MS MT MW NA NF NG NR NU NZ PG PH PK PN PW RW SB SG SH SL SZ TC TK TO TT TZ UG UM US VC VG VI ZA ZM ZW"/>
+ <language type="eo" scripts="Latn" />
+ <language type="eo" scripts="Latn"/>
+ <language type="es" scripts="Latn" territories="AR BO CL CO CR CU DO EC ES GI GQ GT HN MX NI PA PE PR PY SV US UY VE"/>
+ <language type="et" scripts="Latn" territories="EE"/>
+ <language type="eu" scripts="Latn" territories="ES"/>
+ <language type="fa" scripts="Arab" territories="AF IR"/>
+ <language type="fi" scripts="Latn" territories="FI SE"/>
+ <language type="fil" scripts="Latn" territories="PH"/>
+ <language type="fiu" scripts="Latn" territories="FI SE" alt="secondary"/>
+ <language type="fj" scripts="Latn" territories="FJ"/>
+ <language type="fo" scripts="Latn" territories="FO"/>
+ <language type="fr" scripts="Latn" territories="BE BF BI BJ CA CD CF CG CH CI CM DJ FR GA GF GN GP GQ HT KM LU MC MG ML MQ MR MU NC NE PF PM RE RW SC SN TD TF TG VU WF YT"/>
+ <language type="fr" scripts="Latn" territories="IT US" alt="secondary"/>
+ <language type="fur" scripts="Latn" territories="IT"/>
+ <language type="fy" scripts="Latn" territories="DE NL" alt="secondary"/>
+ <language type="ga" scripts="Latn" territories="GB" alt="secondary"/>
+ <language type="ga" scripts="Latn" territories="IE"/>
+ <language type="gaa" scripts="Latn" territories="GH"/>
+ <language type="gd" scripts="Latn" territories="GB"/>
+ <language type="gez" scripts="Ethi" territories="ER ET"/>
+ <language type="gl" scripts="Latn" territories="ES"/>
+ <language type="gn" scripts="Latn" territories="AR BO" alt="secondary"/>
+ <language type="gn" scripts="Latn" territories="PY"/>
+ <language type="gsw" scripts="Latn" territories="CH"/>
+ <language type="gu" scripts="Gujr" territories="IN"/>
+ <language type="gv" scripts="Latn" territories="GB"/>
+ <language type="ha" scripts="Arab Latn" territories="NE NG"/>
+ <language type="haw" scripts="Latn" territories="US" alt="secondary"/>
+ <language type="he" scripts="Hebr" territories="IL"/>
+ <language type="hi" scripts="Deva" territories="IN FJ"/>
+ <language type="ho" scripts="Latn" territories="PG"/>
+ <language type="hr" scripts="Latn" territories="BA HR"/>
+ <language type="hr" scripts="Latn" territories="ME RS" alt="secondary"/>
+ <language type="ht" scripts="Latn" territories="HT"/>
+ <language type="hu" scripts="Latn" territories="HU"/>
+ <language type="hu" scripts="Latn" territories="SI SK HR RO RS" alt="secondary"/>
+ <language type="hy" scripts="Armn" territories="AM"/>
+ <language type="hy" scripts="Armn" territories="AZ GE IR" alt="secondary"/>
+ <language type="ia" scripts="Latn" />
+ <language type="id" scripts="Latn" territories="ID"/>
+ <language type="ig" scripts="Latn" territories="NG"/>
+ <language type="is" scripts="Latn" territories="IS"/>
+ <language type="it" scripts="Latn" territories="CH IT SM VA"/>
+ <language type="it" scripts="Latn" territories="HR SI" alt="secondary"/>
+ <language type="iu" scripts="Cans Cyrl Latn" territories="CA GL US RU" alt="secondary"/>
+ <language type="iu" scripts="Cans" />
+ <language type="ja" scripts="Hani Hira Kana" territories="GU JP PW"/>
+ <language type="ka" scripts="Geor" territories="GE"/>
+ <language type="kaj" scripts="Latn" territories="NG"/>
+ <language type="kaj" scripts="Latn" territories="NG"/>
+ <language type="kam" scripts="Latn" territories="KE"/>
+ <language type="kcg" scripts="Latn" territories="NG"/>
+ <language type="kcg" scripts="Latn" territories="NG"/>
+ <language type="kfo" scripts="Latn" territories="NG"/>
+ <language type="kfo" scripts="Latn" territories="NG"/>
+ <language type="kk" scripts="Cyrl" territories="KZ"/>
+ <language type="kl" scripts="Latn" territories="GL"/>
+ <language type="km" scripts="Khmr" territories="KH"/>
+ <language type="kn" scripts="Knda" territories="IN"/>
+ <language type="ko" scripts="Hang Hani" territories="KP KR"/>
+ <language type="kok" scripts="Deva" territories="IN"/>
+ <language type="kpe" scripts="Latn" territories="GN LR"/>
+ <language type="ks" scripts="Arab Deva" territories="IN"/>
+ <language type="ku" scripts="Arab Latn Cyrl" territories="IQ IR TR"/>
+ <language type="ku" scripts="Arab Latn Cyrl" territories="SY" alt="secondary"/>
+ <language type="kw" scripts="Latn" territories="GB" alt="secondary"/>
+ <language type="ky" scripts="Arab Cyrl" territories="CN" alt="secondary"/>
+ <language type="ky" scripts="Arab Cyrl" territories="KG"/>
+ <language type="la" scripts="Latn" territories="VA"/>
+ <language type="lb" scripts="Latn" territories="LU"/>
+ <language type="ln" scripts="Latn" territories="CD" alt="secondary"/>
+ <language type="ln" scripts="Latn" territories="CG" />
+ <language type="lo" scripts="Laoo" territories="LA"/>
+ <language type="lt" scripts="Latn" territories="LT"/>
+ <language type="lv" scripts="Latn" territories="LV"/>
+ <language type="mai" scripts="Deva" territories="IN"/>
+ <language type="men" scripts="Latn" territories="GN LR SL"/>
+ <language type="mg" scripts="Latn" territories="MG"/>
+ <language type="mh" scripts="Latn" territories="MH NR"/>
+ <language type="mi" scripts="Latn" territories="CK NZ" alt="secondary"/>
+ <language type="mk" scripts="Cyrl" territories="MK"/>
+ <language type="ml" scripts="Mlym" territories="IN"/>
+ <language type="mn" scripts="Cyrl Mong" territories="MN"/>
+ <language type="mni" territories="IN"/>
+ <language type="mo" scripts="Latn Cyrl" territories="MD"/>
+ <language type="mr" scripts="Deva" territories="IN"/>
+ <language type="ms" scripts="Arab Latn" territories="BN CC CX MY SG"/>
+ <language type="mt" scripts="Latn" territories="MT"/>
+ <language type="my" scripts="Mymr" territories="MM"/>
+ <language type="na" scripts="Latn" territories="NR"/>
+ <language type="nb" scripts="Latn" territories="NO SJ"/>
+ <language type="nd" scripts="Latn" territories="ZA"/>
+ <language type="ne" scripts="Deva" territories="NP"/>
+ <language type="niu" scripts="Latn" territories="NU"/>
+ <language type="nl" scripts="Latn" territories="AN AW BE NL SR"/>
+ <language type="nn" scripts="Latn" territories="NO SJ"/>
+ <language type="no" scripts="Latn" territories="NO SJ"/>
+ <language type="nr" scripts="Latn" territories="ZA"/>
+ <language type="nso" scripts="Latn" territories="ZA"/>
+ <language type="ny" scripts="Latn" territories="MW"/>
+ <language type="ny" scripts="Latn" territories="MZ ZM" alt="secondary"/>
+ <language type="oc" scripts="Latn" territories="ES" alt="secondary"/>
+ <language type="om" scripts="Latn" territories="ET KE"/>
+ <language type="or" scripts="Orya" territories="IN"/>
+ <language type="os" scripts="Latn" territories="GE RU" alt="secondary"/>
+ <language type="pa" scripts="Arab Guru" territories="IN PK"/>
+ <language type="pau" territories="PW"/>
+ <language type="pl" scripts="Latn" territories="PL"/>
+ <language type="ps" scripts="Arab" territories="AF PK"/>
+ <language type="pt" scripts="Latn" territories="AO BR CV GW MO MZ PT ST TL"/>
+ <language type="qu" scripts="Latn" territories="BO PE"/>
+ <language type="rm" scripts="Latn" territories="CH" alt="secondary"/>
+ <language type="rn" scripts="Latn" territories="BI"/>
+ <language type="ro" scripts="Latn" territories="RS" alt="secondary"/>
+ <language type="ro" scripts="Latn" territories="RO"/>
+ <language type="ru" scripts="Cyrl" territories="BY GE KG KZ RU SJ UA"/>
+ <language type="ru" scripts="Cyrl" territories="MD" alt="secondary"/>
+ <language type="rw" scripts="Latn" territories="RW"/>
+ <language type="sa" scripts="Deva" territories="IN"/>
+ <language type="sd" scripts="Deva Arab" territories="IN PK"/>
+ <language type="se" scripts="Latn" territories="FI NO SE"/>
+ <language type="sg" scripts="Latn" territories="CF"/>
+ <language type="sh" scripts="Latn" territories="BA HR ME RS" alt="secondary"/>
+ <language type="si" scripts="Sinh" territories="LK"/>
+ <language type="sk" scripts="Latn" territories="RS" alt="secondary"/>
+ <language type="sk" scripts="Latn" territories="SK"/>
+ <language type="sl" scripts="Latn" territories="SI"/>
+ <language type="sm" scripts="Latn" territories="AS WS"/>
+ <language type="sma" scripts="Latn" territories="NO SE"/>
+ <language type="smj" scripts="Latn" territories="NO SE"/>
+ <language type="smn" scripts="Latn" territories="FI"/>
+ <language type="sms" scripts="Latn" territories="FI"/>
+ <language type="smi" scripts="Latn" territories="FI NO SE"/>
+ <language type="so" scripts="Latn" territories="DJ SO"/>
+ <language type="so" scripts="Latn" territories="ET KE" alt="secondary"/>
+ <language type="son" scripts="Latn" territories="BJ ML NE" alt="secondary"/>
+ <language type="sq" scripts="Latn" territories="AL MK ME RS"/>
+ <language type="sid" scripts="Latn" territories="ET"/>
+ <language type="sr" scripts="Cyrl Latn" territories="BA ME RS"/>
+ <language type="sr" scripts="Cyrl Latn" territories="HR" alt="secondary"/>
+ <language type="ss" scripts="Latn" territories="SZ ZA"/>
+ <language type="st" scripts="Latn" territories="LS ZA"/>
+ <language type="sv" scripts="Latn" territories="AX FI SE"/>
+ <language type="sw" scripts="Latn" territories="KE TZ YT"/>
+ <language type="syr" scripts="Syrc" territories="SY"/>
+ <language type="ta" scripts="Taml" territories="IN LK SG"/>
+ <language type="te" scripts="Telu" territories="IN"/>
+ <language type="tem" scripts="Latn" territories="SL"/>
+ <language type="tet" scripts="Latn" territories="TL"/>
+ <language type="tg" scripts="Arab Cyrl Latn" territories="TJ"/>
+ <language type="th" scripts="Thai" territories="TH"/>
+ <language type="ti" scripts="Ethi" territories="ER ET"/>
+ <language type="tig" scripts="Ethi" territories="ER"/>
+ <language type="tk" scripts="Arab Cyrl Latn" territories="AF IR" alt="secondary"/>
+ <language type="tk" scripts="Arab Cyrl Latn" territories="TM"/>
+ <language type="tkl" scripts="Latn" territories="TK"/>
+ <language type="tl" scripts="Latn" territories="GU PH"/>
+ <language type="tmh" scripts="Latn" territories="ML NE" alt="secondary"/>
+ <language type="tn" scripts="Latn" territories="BW ZA"/>
+ <language type="to" scripts="Latn" territories="TO"/>
+ <language type="tpi" scripts="Latn" territories="PG"/>
+ <language type="tr" scripts="Arab Latn" territories="CY TR"/>
+ <language type="ts" scripts="Latn" territories="ZA"/>
+ <language type="tt" scripts="Cyrl" territories="RU"/>
+ <language type="tvl" scripts="Latn" territories="TV"/>
+ <language type="uk" scripts="Cyrl" territories="MD" alt="secondary"/>
+ <language type="uk" scripts="Cyrl" territories="UA"/>
+ <language type="ur" scripts="Arab" territories="IN PK"/>
+ <language type="uz" scripts="Arab Cyrl Latn" territories="AF" alt="secondary"/>
+ <language type="uz" scripts="Arab Cyrl Latn" territories="UZ"/>
+ <language type="ug" scripts="Arab" territories="CN"/>
+ <language type="ve" scripts="Latn" territories="ZA"/>
+ <language type="vi" scripts="Latn" territories="VN"/>
+ <language type="wal" scripts="Ethi" territories="ET"/>
+ <language type="wo" scripts="Latn" territories="GM MR SN"/>
+ <language type="xh" scripts="Latn" territories="LS ZA"/>
+ <language type="yi" scripts="Hebr"/>
+ <language type="yo" scripts="Latn" territories="NG"/>
+ <language type="zh" scripts="Bopo Hani Hans Hant" territories="CN CX HK MO SG TW"/>
+ <language type="zu" scripts="Latn" territories="LS ZA"/>
+ </languageData>
+ <calendarData>
+ <calendar type="japanese" territories="JP"/>
+ <calendar type="islamic-civil" territories="AE BH DJ DZ EG EH ER IL IQ JO KM KW LB LY MA MR OM PS QA SA SD SY TD TN YE AF IR"/>
+ <calendar type="islamic" territories="AE BH DJ DZ EG EH ER IL IQ JO KM KW LB LY MA MR OM PS QA SA SD SY TD TN YE AF IR"/>
+ <calendar type="chinese" territories="CN CX HK MO SG TW"/>
+ <calendar type="hebrew" territories="IL"/>
+ <calendar type="buddhist" territories="TH"/>
+ <calendar type="coptic" territories="EG"/>
+ <calendar type="persian" territories="AF IR"/>
+ <calendar type="ethiopic" territories="ET"/>
+ </calendarData>
+ <weekData>
+ <minDays count="1" territories="001" />
+ <minDays count="4" territories="AT BE CA CH DE DK FI FR IT LI LT LU MC MT NL NO SE SK" />
+ <minDays count="4" territories="CD" draft="true" />
+
+ <firstDay day="mon" territories="001" />
+ <firstDay day="fri" territories="MV" />
+ <firstDay day="sat" territories="AE AF BH DJ DZ EG ER ET IQ IR JO KE KW LB LY MA OM QA SA SD SO TN YE" />
+ <firstDay day="sun" territories="AS AU AZ BW CA CN FO GE GL GU HK IE IL IS JM JP KG KR LA MH MN MO MP MT NZ PH PK SG TH TT TW UM US UZ VI ZA ZW" />
+ <firstDay day="sun" territories="ET MW NG TJ" draft="true" />
+ <firstDay day="sun" territories="GB" draft="true" alt="variant" references="Shorter Oxford Dictionary (5th edition, 2002)"/>
+ <firstDay day="thu" territories="SY" />
+
+ <weekendStart day="sat" territories="001"/>
+ <weekendStart day="fri" territories="EG IL SY"/>
+ <weekendStart day="sun" territories="IN"/>
+ <weekendStart day="thu" territories="AE BH DZ IQ JO KW LB LY MA OM QA SA SD TN YE AF IR"/>
+
+ <weekendEnd day="sun" territories="001"/>
+ <weekendEnd day="fri" territories="AE BH DZ IQ JO KW LB LY MA OM QA SA SD TN YE AF IR"/>
+ <weekendEnd day="sat" territories="EG IL SY"/>
+ </weekData>
+
+ <measurementData>
+ <measurementSystem type="metric" territories="001"/>
+ <measurementSystem type="US" territories="US"/>
+ <paperSize type="A4" territories="001"/>
+ <paperSize type="US-Letter" territories="US"/>
+ </measurementData>
+ <timezoneData>
+ <mapTimezones type="windows">
+ <mapZone other="Dateline" type="Etc/GMT+12"/>
+ <mapZone other="Samoa" type="Pacific/Apia"/>
+ <mapZone other="Hawaiian" type="Pacific/Honolulu"/>
+ <mapZone other="Alaskan" type="America/Anchorage"/>
+ <mapZone other="Pacific" type="America/Los_Angeles"/>
+ <mapZone other="US Mountain" type="America/Phoenix"/>
+ <mapZone other="Mountain" type="America/Denver"/>
+ <mapZone other="Mexico Standard Time 2" type="America/Chihuahua"/>
+ <mapZone other="Central America" type="America/Managua"/>
+ <mapZone other="Canada Central" type="America/Regina"/>
+ <mapZone other="Mexico" type="America/Mexico_City"/>
+ <mapZone other="Central" type="America/Chicago"/>
+ <mapZone other="US Eastern" type="America/Indianapolis"/>
+ <mapZone other="SA Pacific" type="America/Bogota"/>
+ <mapZone other="Eastern" type="America/New_York"/>
+ <mapZone other="SA Western" type="America/Caracas"/>
+ <mapZone other="Pacific SA" type="America/Santiago"/>
+ <mapZone other="Atlantic" type="America/Halifax"/>
+ <mapZone other="Newfoundland" type="America/St_Johns"/>
+ <mapZone other="SA Eastern" type="America/Buenos_Aires"/>
+ <mapZone other="Greenland" type="America/Godthab"/>
+ <mapZone other="E. South America" type="America/Sao_Paulo"/>
+ <mapZone other="Mid-Atlantic" type="America/Noronha"/>
+ <mapZone other="Cape Verde" type="Atlantic/Cape_Verde"/>
+ <mapZone other="Azores" type="Atlantic/Azores"/>
+ <mapZone other="Greenwich" type="Africa/Casablanca"/>
+ <mapZone other="GMT" type="Europe/London"/>
+ <mapZone other="W. Central Africa" type="Africa/Lagos"/>
+ <mapZone other="W. Europe" type="Europe/Berlin"/>
+ <mapZone other="Romance" type="Europe/Paris"/>
+ <mapZone other="Central European" type="Europe/Sarajevo"/>
+ <mapZone other="Central Europe" type="Europe/Belgrade"/>
+ <mapZone other="South Africa" type="Africa/Johannesburg"/>
+ <mapZone other="Israel" type="Asia/Jerusalem"/>
+ <mapZone other="GTB" type="Europe/Istanbul"/>
+ <mapZone other="FLE" type="Europe/Helsinki"/>
+ <mapZone other="Egypt" type="Africa/Cairo"/>
+ <mapZone other="E. Europe" type="Europe/Bucharest"/>
+ <mapZone other="E. Africa" type="Africa/Nairobi"/>
+ <mapZone other="Arab" type="Asia/Riyadh"/>
+ <mapZone other="Russian" type="Europe/Moscow"/>
+ <mapZone other="Arabic" type="Asia/Baghdad"/>
+ <mapZone other="Iran" type="Asia/Tehran"/>
+ <mapZone other="Arabian" type="Asia/Muscat"/>
+ <mapZone other="Caucasus" type="Asia/Tbilisi"/>
+ <mapZone other="Afghanistan" type="Asia/Kabul"/>
+ <mapZone other="West Asia" type="Asia/Karachi"/>
+ <mapZone other="Ekaterinburg" type="Asia/Yekaterinburg"/>
+ <mapZone other="India" type="Asia/Calcutta"/>
+ <mapZone other="Nepal" type="Asia/Katmandu"/>
+ <mapZone other="Sri Lanka" type="Asia/Colombo"/>
+ <mapZone other="Central Asia" type="Asia/Dhaka"/>
+ <mapZone other="N. Central Asia" type="Asia/Novosibirsk"/>
+ <mapZone other="Myanmar" type="Asia/Rangoon"/>
+ <mapZone other="SE Asia" type="Asia/Bangkok"/>
+ <mapZone other="North Asia" type="Asia/Krasnoyarsk"/>
+ <mapZone other="W. Australia" type="Australia/Perth"/>
+ <mapZone other="Taipei" type="Asia/Taipei"/>
+ <mapZone other="Singapore" type="Asia/Singapore"/>
+ <mapZone other="China" type="Asia/Shanghai"/>
+ <mapZone other="North Asia East" type="Asia/Irkutsk"/>
+ <mapZone other="Tokyo" type="Asia/Tokyo"/>
+ <mapZone other="Korea" type="Asia/Seoul"/>
+ <mapZone other="Yakutsk" type="Asia/Yakutsk"/>
+ <mapZone other="AUS Central" type="Australia/Darwin"/>
+ <mapZone other="Cen. Australia" type="Australia/Adelaide"/>
+ <mapZone other="West Pacific" type="Pacific/Guam"/>
+ <mapZone other="E. Australia" type="Australia/Brisbane"/>
+ <mapZone other="Vladivostok" type="Asia/Vladivostok"/>
+ <mapZone other="Tasmania" type="Australia/Hobart"/>
+ <mapZone other="AUS Eastern" type="Australia/Sydney"/>
+ <mapZone other="Central Pacific" type="Asia/Magadan"/>
+ <mapZone other="Fiji" type="Pacific/Fiji"/>
+ <mapZone other="New Zealand" type="Pacific/Auckland"/>
+ <mapZone other="Tonga" type="Pacific/Tongatapu"/>
+ </mapTimezones>
+ <zoneFormatting multizone="001 AQ AR AU BR CA CD CL CN EC ES FM GL ID KI KZ MH MN MX MY NZ PF PT RU SJ UA UM US UZ" tzidVersion="2006n">
+ <zoneItem type="Africa/Abidjan" territory="CI"/>
+ <zoneItem type="Africa/Accra" territory="GH"/>
+ <zoneItem type="Africa/Addis_Ababa" territory="ET"/>
+ <zoneItem type="Africa/Algiers" territory="DZ"/>
+ <zoneItem type="Africa/Asmera" territory="ER"/>
+ <zoneItem type="Africa/Bamako" territory="ML" aliases="Africa/Timbuktu"/>
+ <zoneItem type="Africa/Bangui" territory="CF"/>
+ <zoneItem type="Africa/Banjul" territory="GM"/>
+ <zoneItem type="Africa/Bissau" territory="GW"/>
+ <zoneItem type="Africa/Blantyre" territory="MW"/>
+ <zoneItem type="Africa/Brazzaville" territory="CG"/>
+ <zoneItem type="Africa/Bujumbura" territory="BI"/>
+ <zoneItem type="Africa/Cairo" territory="EG" aliases="Egypt"/>
+ <zoneItem type="Africa/Casablanca" territory="MA"/>
+ <zoneItem type="Africa/Ceuta" territory="ES"/>
+ <zoneItem type="Africa/Conakry" territory="GN"/>
+ <zoneItem type="Africa/Dakar" territory="SN"/>
+ <zoneItem type="Africa/Dar_es_Salaam" territory="TZ"/>
+ <zoneItem type="Africa/Djibouti" territory="DJ"/>
+ <zoneItem type="Africa/Douala" territory="CM"/>
+ <zoneItem type="Africa/El_Aaiun" territory="EH"/>
+ <zoneItem type="Africa/Freetown" territory="SL"/>
+ <zoneItem type="Africa/Gaborone" territory="BW"/>
+ <zoneItem type="Africa/Harare" territory="ZW"/>
+ <zoneItem type="Africa/Johannesburg" territory="ZA"/>
+ <zoneItem type="Africa/Kampala" territory="UG"/>
+ <zoneItem type="Africa/Khartoum" territory="SD"/>
+ <zoneItem type="Africa/Kigali" territory="RW"/>
+ <zoneItem type="Africa/Kinshasa" territory="CD"/>
+ <zoneItem type="Africa/Lagos" territory="NG"/>
+ <zoneItem type="Africa/Libreville" territory="GA"/>
+ <zoneItem type="Africa/Lome" territory="TG"/>
+ <zoneItem type="Africa/Luanda" territory="AO"/>
+ <zoneItem type="Africa/Lubumbashi" territory="CD"/>
+ <zoneItem type="Africa/Lusaka" territory="ZM"/>
+ <zoneItem type="Africa/Malabo" territory="GQ"/>
+ <zoneItem type="Africa/Maputo" territory="MZ"/>
+ <zoneItem type="Africa/Maseru" territory="LS"/>
+ <zoneItem type="Africa/Mbabane" territory="SZ"/>
+ <zoneItem type="Africa/Mogadishu" territory="SO"/>
+ <zoneItem type="Africa/Monrovia" territory="LR"/>
+ <zoneItem type="Africa/Nairobi" territory="KE"/>
+ <zoneItem type="Africa/Ndjamena" territory="TD"/>
+ <zoneItem type="Africa/Niamey" territory="NE"/>
+ <zoneItem type="Africa/Nouakchott" territory="MR"/>
+ <zoneItem type="Africa/Ouagadougou" territory="BF"/>
+ <zoneItem type="Africa/Porto-Novo" territory="BJ"/>
+ <zoneItem type="Africa/Sao_Tome" territory="ST"/>
+ <zoneItem type="Africa/Tripoli" territory="LY" aliases="Libya"/>
+ <zoneItem type="Africa/Tunis" territory="TN"/>
+ <zoneItem type="Africa/Windhoek" territory="NA"/>
+ <zoneItem type="America/Adak" territory="US" aliases="America/Atka US/Aleutian"/>
+ <zoneItem type="America/Anchorage" territory="US" aliases="SystemV/YST9YDT US/Alaska"/>
+ <zoneItem type="America/Anguilla" territory="AI"/>
+ <zoneItem type="America/Antigua" territory="AG"/>
+ <zoneItem type="America/Araguaina" territory="BR"/>
+ <zoneItem type="America/Argentina/La_Rioja" territory="AR"/>
+ <zoneItem type="America/Argentina/Rio_Gallegos" territory="AR"/>
+ <zoneItem type="America/Argentina/San_Juan" territory="AR"/>
+ <zoneItem type="America/Argentina/Tucuman" territory="AR"/>
+ <zoneItem type="America/Argentina/Ushuaia" territory="AR"/>
+ <zoneItem type="America/Aruba" territory="AW"/>
+ <zoneItem type="America/Asuncion" territory="PY"/>
+ <zoneItem type="America/Bahia" territory="BR"/>
+ <zoneItem type="America/Barbados" territory="BB"/>
+ <zoneItem type="America/Belem" territory="BR"/>
+ <zoneItem type="America/Belize" territory="BZ"/>
+ <zoneItem type="America/Blanc-Sablon" territory="CA"/>
+ <zoneItem type="America/Boa_Vista" territory="BR"/>
+ <zoneItem type="America/Bogota" territory="CO"/>
+ <zoneItem type="America/Boise" territory="US"/>
+ <zoneItem type="America/Buenos_Aires" territory="AR" aliases="America/Argentina/Buenos_Aires"/>
+ <zoneItem type="America/Cambridge_Bay" territory="CA"/>
+ <zoneItem type="America/Campo_Grande" territory="BR"/>
+ <zoneItem type="America/Cancun" territory="MX"/>
+ <zoneItem type="America/Caracas" territory="VE"/>
+ <zoneItem type="America/Catamarca" territory="AR" aliases="America/Argentina/Catamarca America/Argentina/ComodRivadavia"/>
+ <zoneItem type="America/Cayenne" territory="GF"/>
+ <zoneItem type="America/Cayman" territory="KY"/>
+ <zoneItem type="America/Chicago" territory="US" aliases="CST6CDT SystemV/CST6CDT US/Central"/>
+ <zoneItem type="America/Chihuahua" territory="MX"/>
+ <zoneItem type="America/Coral_Harbour" territory="CA" aliases="America/Atikokan"/>
+ <zoneItem type="America/Cordoba" territory="AR" aliases="America/Argentina/Cordoba America/Rosario"/>
+ <zoneItem type="America/Costa_Rica" territory="CR"/>
+ <zoneItem type="America/Cuiaba" territory="BR"/>
+ <zoneItem type="America/Curacao" territory="AN"/>
+ <zoneItem type="America/Danmarkshavn" territory="GL"/>
+ <zoneItem type="America/Dawson" territory="CA"/>
+ <zoneItem type="America/Dawson_Creek" territory="CA"/>
+ <zoneItem type="America/Denver" territory="US" aliases="MST7MDT SystemV/MST7MDT US/Mountain"/>
+ <zoneItem type="America/Detroit" territory="US" aliases="US/Michigan"/>
+ <zoneItem type="America/Dominica" territory="DM"/>
+ <zoneItem type="America/Edmonton" territory="CA" aliases="Canada/Mountain"/>
+ <zoneItem type="America/Eirunepe" territory="BR"/>
+ <zoneItem type="America/El_Salvador" territory="SV"/>
+ <zoneItem type="America/Fortaleza" territory="BR"/>
+ <zoneItem type="America/Glace_Bay" territory="CA"/>
+ <zoneItem type="America/Godthab" territory="GL"/>
+ <zoneItem type="America/Goose_Bay" territory="CA"/>
+ <zoneItem type="America/Grand_Turk" territory="TC"/>
+ <zoneItem type="America/Grenada" territory="GD"/>
+ <zoneItem type="America/Guadeloupe" territory="GP"/>
+ <zoneItem type="America/Guatemala" territory="GT"/>
+ <zoneItem type="America/Guayaquil" territory="EC"/>
+ <zoneItem type="America/Guyana" territory="GY"/>
+ <zoneItem type="America/Halifax" territory="CA" aliases="Canada/Atlantic SystemV/AST4ADT"/>
+ <zoneItem type="America/Havana" territory="CU" aliases="Cuba"/>
+ <zoneItem type="America/Hermosillo" territory="MX"/>
+ <zoneItem type="America/Indiana/Knox" territory="US" aliases="America/Knox_IN US/Indiana-Starke"/>
+ <zoneItem type="America/Indiana/Marengo" territory="US"/>
+ <zoneItem type="America/Indiana/Petersburg" territory="US"/>
+ <zoneItem type="America/Indiana/Vevay" territory="US"/>
+ <zoneItem type="America/Indiana/Vincennes" territory="US"/>
+ <zoneItem type="America/Indianapolis" territory="US" aliases="America/Fort_Wayne America/Indiana/Indianapolis EST SystemV/EST5 US/East-Indiana"/>
+ <zoneItem type="America/Inuvik" territory="CA"/>
+ <zoneItem type="America/Iqaluit" territory="CA"/>
+ <zoneItem type="America/Jamaica" territory="JM" aliases="Jamaica"/>
+ <zoneItem type="America/Jujuy" territory="AR" aliases="America/Argentina/Jujuy"/>
+ <zoneItem type="America/Juneau" territory="US"/>
+ <zoneItem type="America/Kentucky/Monticello" territory="US"/>
+ <zoneItem type="America/La_Paz" territory="BO"/>
+ <zoneItem type="America/Lima" territory="PE"/>
+ <zoneItem type="America/Los_Angeles" territory="US" aliases="PST8PDT SystemV/PST8PDT US/Pacific US/Pacific-New"/>
+ <zoneItem type="America/Louisville" territory="US" aliases="America/Kentucky/Louisville"/>
+ <zoneItem type="America/Maceio" territory="BR"/>
+ <zoneItem type="America/Managua" territory="NI"/>
+ <zoneItem type="America/Manaus" territory="BR" aliases="Brazil/West"/>
+ <zoneItem type="America/Martinique" territory="MQ"/>
+ <zoneItem type="America/Mazatlan" territory="MX" aliases="Mexico/BajaSur"/>
+ <zoneItem type="America/Mendoza" territory="AR" aliases="America/Argentina/Mendoza"/>
+ <zoneItem type="America/Menominee" territory="US"/>
+ <zoneItem type="America/Merida" territory="MX"/>
+ <zoneItem type="America/Mexico_City" territory="MX" aliases="Mexico/General"/>
+ <zoneItem type="America/Miquelon" territory="PM"/>
+ <zoneItem type="America/Moncton" territory="CA"/>
+ <zoneItem type="America/Monterrey" territory="MX"/>
+ <zoneItem type="America/Montevideo" territory="UY"/>
+ <zoneItem type="America/Montreal" territory="CA"/>
+ <zoneItem type="America/Montserrat" territory="MS"/>
+ <zoneItem type="America/Nassau" territory="BS"/>
+ <zoneItem type="America/New_York" territory="US" aliases="EST5EDT SystemV/EST5EDT US/Eastern"/>
+ <zoneItem type="America/Nipigon" territory="CA"/>
+ <zoneItem type="America/Nome" territory="US"/>
+ <zoneItem type="America/Noronha" territory="BR" aliases="Brazil/DeNoronha"/>
+ <zoneItem type="America/North_Dakota/Center" territory="US"/>
+ <zoneItem type="America/North_Dakota/New_Salem" territory="US"/>
+ <zoneItem type="America/Panama" territory="PA"/>
+ <zoneItem type="America/Pangnirtung" territory="CA"/>
+ <zoneItem type="America/Paramaribo" territory="SR"/>
+ <zoneItem type="America/Phoenix" territory="US" aliases="MST SystemV/MST7 US/Arizona"/>
+ <zoneItem type="America/Port_of_Spain" territory="TT"/>
+ <zoneItem type="America/Port-au-Prince" territory="HT"/>
+ <zoneItem type="America/Porto_Velho" territory="BR"/>
+ <zoneItem type="America/Puerto_Rico" territory="PR" aliases="SystemV/AST4"/>
+ <zoneItem type="America/Rainy_River" territory="CA"/>
+ <zoneItem type="America/Rankin_Inlet" territory="CA"/>
+ <zoneItem type="America/Recife" territory="BR"/>
+ <zoneItem type="America/Regina" territory="CA" aliases="Canada/East-Saskatchewan Canada/Saskatchewan SystemV/CST6"/>
+ <zoneItem type="America/Rio_Branco" territory="BR" aliases="America/Porto_Acre Brazil/Acre"/>
+ <zoneItem type="America/Santiago" territory="CL" aliases="Chile/Continental"/>
+ <zoneItem type="America/Santo_Domingo" territory="DO"/>
+ <zoneItem type="America/Sao_Paulo" territory="BR" aliases="Brazil/East"/>
+ <zoneItem type="America/Scoresbysund" territory="GL"/>
+ <zoneItem type="America/Shiprock" territory="US" aliases="Navajo"/>
+ <zoneItem type="America/St_Johns" territory="CA" aliases="Canada/Newfoundland"/>
+ <zoneItem type="America/St_Kitts" territory="KN"/>
+ <zoneItem type="America/St_Lucia" territory="LC"/>
+ <zoneItem type="America/St_Thomas" territory="VI" aliases="America/Virgin"/>
+ <zoneItem type="America/St_Vincent" territory="VC"/>
+ <zoneItem type="America/Swift_Current" territory="CA"/>
+ <zoneItem type="America/Tegucigalpa" territory="HN"/>
+ <zoneItem type="America/Thule" territory="GL"/>
+ <zoneItem type="America/Thunder_Bay" territory="CA"/>
+ <zoneItem type="America/Tijuana" territory="MX" aliases="America/Ensenada Mexico/BajaNorte"/>
+ <zoneItem type="America/Toronto" territory="CA" aliases="Canada/Eastern"/>
+ <zoneItem type="America/Tortola" territory="VG"/>
+ <zoneItem type="America/Vancouver" territory="CA" aliases="Canada/Pacific"/>
+ <zoneItem type="America/Whitehorse" territory="CA" aliases="Canada/Yukon"/>
+ <zoneItem type="America/Winnipeg" territory="CA" aliases="Canada/Central"/>
+ <zoneItem type="America/Yakutat" territory="US"/>
+ <zoneItem type="America/Yellowknife" territory="CA"/>
+ <zoneItem type="Antarctica/Casey" territory="AQ"/>
+ <zoneItem type="Antarctica/Davis" territory="AQ"/>
+ <zoneItem type="Antarctica/DumontDUrville" territory="AQ"/>
+ <zoneItem type="Antarctica/Mawson" territory="AQ"/>
+ <zoneItem type="Antarctica/McMurdo" territory="AQ"/>
+ <zoneItem type="Antarctica/Palmer" territory="AQ"/>
+ <zoneItem type="Antarctica/Rothera" territory="AQ"/>
+ <zoneItem type="Antarctica/South_Pole" territory="AQ"/>
+ <zoneItem type="Antarctica/Syowa" territory="AQ"/>
+ <zoneItem type="Antarctica/Vostok" territory="AQ"/>
+ <zoneItem type="Arctic/Longyearbyen" territory="SJ"/>
+ <zoneItem type="Asia/Aden" territory="YE"/>
+ <zoneItem type="Asia/Almaty" territory="KZ"/>
+ <zoneItem type="Asia/Amman" territory="JO"/>
+ <zoneItem type="Asia/Anadyr" territory="RU"/>
+ <zoneItem type="Asia/Aqtau" territory="KZ"/>
+ <zoneItem type="Asia/Aqtobe" territory="KZ"/>
+ <zoneItem type="Asia/Ashgabat" territory="TM" aliases="Asia/Ashkhabad"/>
+ <zoneItem type="Asia/Baghdad" territory="IQ"/>
+ <zoneItem type="Asia/Bahrain" territory="BH"/>
+ <zoneItem type="Asia/Baku" territory="AZ"/>
+ <zoneItem type="Asia/Bangkok" territory="TH"/>
+ <zoneItem type="Asia/Beirut" territory="LB"/>
+ <zoneItem type="Asia/Bishkek" territory="KG"/>
+ <zoneItem type="Asia/Brunei" territory="BN"/>
+ <zoneItem type="Asia/Calcutta" territory="IN"/>
+ <zoneItem type="Asia/Choibalsan" territory="MN"/>
+ <zoneItem type="Asia/Chongqing" territory="CN" aliases="Asia/Chungking"/>
+ <zoneItem type="Asia/Colombo" territory="LK"/>
+ <zoneItem type="Asia/Damascus" territory="SY"/>
+ <zoneItem type="Asia/Dhaka" territory="BD" aliases="Asia/Dacca"/>
+ <zoneItem type="Asia/Dili" territory="TL"/>
+ <zoneItem type="Asia/Dubai" territory="AE"/>
+ <zoneItem type="Asia/Dushanbe" territory="TJ"/>
+ <zoneItem type="Asia/Gaza" territory="PS"/>
+ <zoneItem type="Asia/Harbin" territory="CN"/>
+ <zoneItem type="Asia/Hong_Kong" territory="HK" aliases="Hongkong"/>
+ <zoneItem type="Asia/Hovd" territory="MN"/>
+ <zoneItem type="Asia/Irkutsk" territory="RU"/>
+ <zoneItem type="Asia/Jakarta" territory="ID"/>
+ <zoneItem type="Asia/Jayapura" territory="ID"/>
+ <zoneItem type="Asia/Jerusalem" territory="IL" aliases="Asia/Tel_Aviv Israel"/>
+ <zoneItem type="Asia/Kabul" territory="AF"/>
+ <zoneItem type="Asia/Kamchatka" territory="RU"/>
+ <zoneItem type="Asia/Karachi" territory="PK"/>
+ <zoneItem type="Asia/Kashgar" territory="CN"/>
+ <zoneItem type="Asia/Katmandu" territory="NP"/>
+ <zoneItem type="Asia/Krasnoyarsk" territory="RU"/>
+ <zoneItem type="Asia/Kuala_Lumpur" territory="MY"/>
+ <zoneItem type="Asia/Kuching" territory="MY"/>
+ <zoneItem type="Asia/Kuwait" territory="KW"/>
+ <zoneItem type="Asia/Macau" territory="MO" aliases="Asia/Macao"/>
+ <zoneItem type="Asia/Magadan" territory="RU"/>
+ <zoneItem type="Asia/Makassar" territory="ID" aliases="Asia/Ujung_Pandang"/>
+ <zoneItem type="Asia/Manila" territory="PH"/>
+ <zoneItem type="Asia/Muscat" territory="OM"/>
+ <zoneItem type="Asia/Nicosia" territory="CY" aliases="Europe/Nicosia"/>
+ <zoneItem type="Asia/Novosibirsk" territory="RU"/>
+ <zoneItem type="Asia/Omsk" territory="RU"/>
+ <zoneItem type="Asia/Oral" territory="KZ"/>
+ <zoneItem type="Asia/Phnom_Penh" territory="KH"/>
+ <zoneItem type="Asia/Pontianak" territory="ID"/>
+ <zoneItem type="Asia/Pyongyang" territory="KP"/>
+ <zoneItem type="Asia/Qatar" territory="QA"/>
+ <zoneItem type="Asia/Qyzylorda" territory="KZ"/>
+ <zoneItem type="Asia/Rangoon" territory="MM"/>
+ <zoneItem type="Asia/Riyadh" territory="SA"/>
+ <zoneItem type="Asia/Saigon" territory="VN"/>
+ <zoneItem type="Asia/Sakhalin" territory="RU"/>
+ <zoneItem type="Asia/Samarkand" territory="UZ"/>
+ <zoneItem type="Asia/Seoul" territory="KR" aliases="ROK"/>
+ <zoneItem type="Asia/Shanghai" territory="CN" aliases="PRC"/>
+ <zoneItem type="Asia/Singapore" territory="SG" aliases="Singapore"/>
+ <zoneItem type="Asia/Taipei" territory="TW" aliases="ROC"/>
+ <zoneItem type="Asia/Tashkent" territory="UZ"/>
+ <zoneItem type="Asia/Tbilisi" territory="GE"/>
+ <zoneItem type="Asia/Tehran" territory="IR" aliases="Iran"/>
+ <zoneItem type="Asia/Thimphu" territory="BT" aliases="Asia/Thimbu"/>
+ <zoneItem type="Asia/Tokyo" territory="JP" aliases="Japan"/>
+ <zoneItem type="Asia/Ulaanbaatar" territory="MN" aliases="Asia/Ulan_Bator"/>
+ <zoneItem type="Asia/Urumqi" territory="CN"/>
+ <zoneItem type="Asia/Vientiane" territory="LA"/>
+ <zoneItem type="Asia/Vladivostok" territory="RU"/>
+ <zoneItem type="Asia/Yakutsk" territory="RU"/>
+ <zoneItem type="Asia/Yekaterinburg" territory="RU"/>
+ <zoneItem type="Asia/Yerevan" territory="AM"/>
+ <zoneItem type="Atlantic/Azores" territory="PT"/>
+ <zoneItem type="Atlantic/Bermuda" territory="BM"/>
+ <zoneItem type="Atlantic/Canary" territory="ES"/>
+ <zoneItem type="Atlantic/Cape_Verde" territory="CV"/>
+ <zoneItem type="Atlantic/Faeroe" territory="FO"/>
+ <zoneItem type="Atlantic/Jan_Mayen" territory="SJ"/>
+ <zoneItem type="Atlantic/Madeira" territory="PT"/>
+ <zoneItem type="Atlantic/Reykjavik" territory="IS" aliases="Iceland"/>
+ <zoneItem type="Atlantic/South_Georgia" territory="GS"/>
+ <zoneItem type="Atlantic/St_Helena" territory="SH"/>
+ <zoneItem type="Atlantic/Stanley" territory="FK"/>
+ <zoneItem type="Australia/Adelaide" territory="AU" aliases="Australia/South"/>
+ <zoneItem type="Australia/Brisbane" territory="AU" aliases="Australia/Queensland"/>
+ <zoneItem type="Australia/Broken_Hill" territory="AU" aliases="Australia/Yancowinna"/>
+ <zoneItem type="Australia/Currie" territory="AU"/>
+ <zoneItem type="Australia/Darwin" territory="AU" aliases="Australia/North"/>
+ <zoneItem type="Australia/Hobart" territory="AU" aliases="Australia/Tasmania"/>
+ <zoneItem type="Australia/Lindeman" territory="AU"/>
+ <zoneItem type="Australia/Lord_Howe" territory="AU" aliases="Australia/LHI"/>
+ <zoneItem type="Australia/Melbourne" territory="AU" aliases="Australia/Victoria"/>
+ <zoneItem type="Australia/Perth" territory="AU" aliases="Australia/West"/>
+ <zoneItem type="Australia/Sydney" territory="AU" aliases="Australia/ACT Australia/Canberra Australia/NSW"/>
+ <zoneItem type="Etc/GMT" territory="001" aliases="Etc/GMT+0 Etc/GMT-0 Etc/GMT0 Etc/Greenwich Etc/UCT Etc/UTC Etc/Universal Etc/Zulu GMT GMT+0 GMT-0 GMT0 Greenwich UCT UTC Universal Zulu"/>
+ <zoneItem type="Etc/GMT-1" territory="001"/>
+ <zoneItem type="Etc/GMT-2" territory="001"/>
+ <zoneItem type="Etc/GMT-3" territory="001"/>
+ <zoneItem type="Etc/GMT-4" territory="001"/>
+ <zoneItem type="Etc/GMT-5" territory="001"/>
+ <zoneItem type="Etc/GMT-6" territory="001"/>
+ <zoneItem type="Etc/GMT-7" territory="001"/>
+ <zoneItem type="Etc/GMT-8" territory="001"/>
+ <zoneItem type="Etc/GMT-9" territory="001"/>
+ <zoneItem type="Etc/GMT-10" territory="001"/>
+ <zoneItem type="Etc/GMT-11" territory="001"/>
+ <zoneItem type="Etc/GMT-12" territory="001"/>
+ <zoneItem type="Etc/GMT-13" territory="001"/>
+ <zoneItem type="Etc/GMT-14" territory="001"/>
+ <zoneItem type="Etc/GMT+1" territory="001"/>
+ <zoneItem type="Etc/GMT+2" territory="001"/>
+ <zoneItem type="Etc/GMT+3" territory="001"/>
+ <zoneItem type="Etc/GMT+4" territory="001"/>
+ <zoneItem type="Etc/GMT+5" territory="001"/>
+ <zoneItem type="Etc/GMT+6" territory="001"/>
+ <zoneItem type="Etc/GMT+7" territory="001"/>
+ <zoneItem type="Etc/GMT+8" territory="001"/>
+ <zoneItem type="Etc/GMT+9" territory="001"/>
+ <zoneItem type="Etc/GMT+10" territory="001"/>
+ <zoneItem type="Etc/GMT+11" territory="001"/>
+ <zoneItem type="Etc/GMT+12" territory="001"/>
+ <zoneItem type="Etc/Unknown" territory="001"/>
+ <zoneItem type="Europe/Amsterdam" territory="NL"/>
+ <zoneItem type="Europe/Andorra" territory="AD"/>
+ <zoneItem type="Europe/Athens" territory="GR"/>
+ <zoneItem type="Europe/Belgrade" territory="RS"/>
+ <zoneItem type="Europe/Berlin" territory="DE"/>
+ <zoneItem type="Europe/Bratislava" territory="SK"/>
+ <zoneItem type="Europe/Brussels" territory="BE"/>
+ <zoneItem type="Europe/Bucharest" territory="RO"/>
+ <zoneItem type="Europe/Budapest" territory="HU"/>
+ <zoneItem type="Europe/Chisinau" territory="MD" aliases="Europe/Tiraspol"/>
+ <zoneItem type="Europe/Copenhagen" territory="DK"/>
+ <zoneItem type="Europe/Dublin" territory="IE" aliases="Eire"/>
+ <zoneItem type="Europe/Gibraltar" territory="GI"/>
+ <zoneItem type="Europe/Guernsey" territory="GG"/>
+ <zoneItem type="Europe/Helsinki" territory="FI"/>
+ <zoneItem type="Europe/Isle_of_Man" territory="IM"/>
+ <zoneItem type="Europe/Istanbul" territory="TR" aliases="Asia/Istanbul Turkey"/>
+ <zoneItem type="Europe/Jersey" territory="JE"/>
+ <zoneItem type="Europe/Kaliningrad" territory="RU"/>
+ <zoneItem type="Europe/Kiev" territory="UA"/>
+ <zoneItem type="Europe/Lisbon" territory="PT" aliases="Portugal"/>
+ <zoneItem type="Europe/Ljubljana" territory="SI"/>
+ <zoneItem type="Europe/London" territory="GB" aliases="Europe/Belfast GB GB-Eire"/>
+ <zoneItem type="Europe/Luxembourg" territory="LU"/>
+ <zoneItem type="Europe/Madrid" territory="ES"/>
+ <zoneItem type="Europe/Malta" territory="MT"/>
+ <zoneItem type="Europe/Mariehamn" territory="AX"/>
+ <zoneItem type="Europe/Minsk" territory="BY"/>
+ <zoneItem type="Europe/Monaco" territory="MC"/>
+ <zoneItem type="Europe/Moscow" territory="RU" aliases="W-SU"/>
+ <zoneItem type="Europe/Oslo" territory="NO"/>
+ <zoneItem type="Europe/Paris" territory="FR"/>
+ <zoneItem type="Europe/Podgorica" territory="ME"/>
+ <zoneItem type="Europe/Prague" territory="CZ"/>
+ <zoneItem type="Europe/Riga" territory="LV"/>
+ <zoneItem type="Europe/Rome" territory="IT"/>
+ <zoneItem type="Europe/Samara" territory="RU"/>
+ <zoneItem type="Europe/San_Marino" territory="SM"/>
+ <zoneItem type="Europe/Sarajevo" territory="BA"/>
+ <zoneItem type="Europe/Simferopol" territory="UA"/>
+ <zoneItem type="Europe/Skopje" territory="MK"/>
+ <zoneItem type="Europe/Sofia" territory="BG"/>
+ <zoneItem type="Europe/Stockholm" territory="SE"/>
+ <zoneItem type="Europe/Tallinn" territory="EE"/>
+ <zoneItem type="Europe/Tirane" territory="AL"/>
+ <zoneItem type="Europe/Uzhgorod" territory="UA"/>
+ <zoneItem type="Europe/Vaduz" territory="LI"/>
+ <zoneItem type="Europe/Vatican" territory="VA"/>
+ <zoneItem type="Europe/Vienna" territory="AT"/>
+ <zoneItem type="Europe/Vilnius" territory="LT"/>
+ <zoneItem type="Europe/Volgograd" territory="RU"/>
+ <zoneItem type="Europe/Warsaw" territory="PL" aliases="Poland"/>
+ <zoneItem type="Europe/Zagreb" territory="HR"/>
+ <zoneItem type="Europe/Zaporozhye" territory="UA"/>
+ <zoneItem type="Europe/Zurich" territory="CH"/>
+ <zoneItem type="Indian/Antananarivo" territory="MG"/>
+ <zoneItem type="Indian/Chagos" territory="IO"/>
+ <zoneItem type="Indian/Christmas" territory="CX"/>
+ <zoneItem type="Indian/Cocos" territory="CC"/>
+ <zoneItem type="Indian/Comoro" territory="KM"/>
+ <zoneItem type="Indian/Kerguelen" territory="TF"/>
+ <zoneItem type="Indian/Mahe" territory="SC"/>
+ <zoneItem type="Indian/Maldives" territory="MV"/>
+ <zoneItem type="Indian/Mauritius" territory="MU"/>
+ <zoneItem type="Indian/Mayotte" territory="YT"/>
+ <zoneItem type="Indian/Reunion" territory="RE"/>
+ <zoneItem type="Pacific/Apia" territory="WS"/>
+ <zoneItem type="Pacific/Auckland" territory="NZ" aliases="NZ"/>
+ <zoneItem type="Pacific/Chatham" territory="NZ" aliases="NZ-CHAT"/>
+ <zoneItem type="Pacific/Easter" territory="CL" aliases="Chile/EasterIsland"/>
+ <zoneItem type="Pacific/Efate" territory="VU"/>
+ <zoneItem type="Pacific/Enderbury" territory="KI"/>
+ <zoneItem type="Pacific/Fakaofo" territory="TK"/>
+ <zoneItem type="Pacific/Fiji" territory="FJ"/>
+ <zoneItem type="Pacific/Funafuti" territory="TV"/>
+ <zoneItem type="Pacific/Galapagos" territory="EC"/>
+ <zoneItem type="Pacific/Gambier" territory="PF" aliases="SystemV/YST9"/>
+ <zoneItem type="Pacific/Guadalcanal" territory="SB"/>
+ <zoneItem type="Pacific/Guam" territory="GU"/>
+ <zoneItem type="Pacific/Honolulu" territory="US" aliases="HST SystemV/HST10 US/Hawaii"/>
+ <zoneItem type="Pacific/Johnston" territory="UM"/>
+ <zoneItem type="Pacific/Kiritimati" territory="KI"/>
+ <zoneItem type="Pacific/Kosrae" territory="FM"/>
+ <zoneItem type="Pacific/Kwajalein" territory="MH" aliases="Kwajalein"/>
+ <zoneItem type="Pacific/Majuro" territory="MH"/>
+ <zoneItem type="Pacific/Marquesas" territory="PF"/>
+ <zoneItem type="Pacific/Midway" territory="UM"/>
+ <zoneItem type="Pacific/Nauru" territory="NR"/>
+ <zoneItem type="Pacific/Niue" territory="NU"/>
+ <zoneItem type="Pacific/Norfolk" territory="NF"/>
+ <zoneItem type="Pacific/Noumea" territory="NC"/>
+ <zoneItem type="Pacific/Pago_Pago" territory="AS" aliases="Pacific/Samoa US/Samoa"/>
+ <zoneItem type="Pacific/Palau" territory="PW"/>
+ <zoneItem type="Pacific/Pitcairn" territory="PN" aliases="SystemV/PST8"/>
+ <zoneItem type="Pacific/Ponape" territory="FM"/>
+ <zoneItem type="Pacific/Port_Moresby" territory="PG"/>
+ <zoneItem type="Pacific/Rarotonga" territory="CK"/>
+ <zoneItem type="Pacific/Saipan" territory="MP"/>
+ <zoneItem type="Pacific/Tahiti" territory="PF"/>
+ <zoneItem type="Pacific/Tarawa" territory="KI"/>
+ <zoneItem type="Pacific/Tongatapu" territory="TO"/>
+ <zoneItem type="Pacific/Truk" territory="FM" aliases="Pacific/Yap"/>
+ <zoneItem type="Pacific/Wake" territory="UM"/>
+ <zoneItem type="Pacific/Wallis" territory="WF"/>
+ </zoneFormatting>
+ </timezoneData>
+</supplementalData>
diff --git a/libs/Zend/Locale/Data/sv.xml b/libs/Zend/Locale/Data/sv.xml
new file mode 100755
index 0000000000..0fd07d9e06
--- /dev/null
+++ b/libs/Zend/Locale/Data/sv.xml
@@ -0,0 +1,2248 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.85 $"/>
+ <generation date="$Date: 2006/10/26 22:46:09 $"/>
+ <language type="sv"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">afar</language>
+ <language type="ab">abchasiska</language>
+ <language type="ace">achinesiska</language>
+ <language type="ach">acoli</language>
+ <language type="ada">adangme</language>
+ <language type="ady">adygeiska</language>
+ <language type="ae">avestiska</language>
+ <language type="af">afrikaans</language>
+ <language type="afa">afro-asiatiskt språk (annat)</language>
+ <language type="afh">afrihili</language>
+ <language type="ain">ainu</language>
+ <language type="ak">akan</language>
+ <language type="akk">akkadiska</language>
+ <language type="ale">aleutiska</language>
+ <language type="alg">algonkinskt språk (annat)</language>
+ <language type="alt">sydaltaiska</language>
+ <language type="am">amhariska</language>
+ <language type="an">aragonesiska</language>
+ <language type="ang">fornengelska (ca 450-1100)</language>
+ <language type="ang" alt="proposed-u219-1" draft="unconfirmed">fornengelska (c:a 450-1100)</language>
+ <language type="apa">apachespråk</language>
+ <language type="ar">arabiska</language>
+ <language type="arc">arameiska</language>
+ <language type="arn">araukanska</language>
+ <language type="arp">arapaho</language>
+ <language type="art">konstgjort språk (annat)</language>
+ <language type="arw">arawakiska</language>
+ <language type="as">assamesiska</language>
+ <language type="ast">asturiska</language>
+ <language type="ath">athapaskiskt språk (annat)</language>
+ <language type="aus">australiskt språk</language>
+ <language type="av">avariskt språk</language>
+ <language type="awa">awadhi</language>
+ <language type="ay">aymara</language>
+ <language type="az">azerbajdzjanska</language>
+ <language type="ba">basjkiriska</language>
+ <language type="bad">banda</language>
+ <language type="bai">bamilekespråk</language>
+ <language type="bal">baluchi</language>
+ <language type="ban">balinesiska</language>
+ <language type="bas">basa (bantuspråk)</language>
+ <language type="bat">baltiskt språk (annat)</language>
+ <language type="be">vitryska</language>
+ <language type="bej">beyja</language>
+ <language type="bem">bemba</language>
+ <language type="ber">berberspråk (annat)</language>
+ <language type="bg">bulgariska</language>
+ <language type="bh">bihari</language>
+ <language type="bho">bhojpuri</language>
+ <language type="bi">bislama</language>
+ <language type="bik">bikol</language>
+ <language type="bin">bini</language>
+ <language type="bla">siksika</language>
+ <language type="bm">bambara</language>
+ <language type="bn">bengali</language>
+ <language type="bnt">bantuspråk</language>
+ <language type="bo">tibetanska</language>
+ <language type="br">bretonska</language>
+ <language type="bra">braj</language>
+ <language type="bs">bosniska</language>
+ <language type="btk">batak</language>
+ <language type="bua">burjätiska</language>
+ <language type="bua" alt="proposed-u219-1" draft="unconfirmed">burjatiska språket</language>
+ <language type="bug">buginesiska</language>
+ <language type="byn">blin</language>
+ <language type="ca">katalanska</language>
+ <language type="cad">caddo</language>
+ <language type="cai">centralamerikanskt indianspråk (annat)</language>
+ <language type="car">karibiska</language>
+ <language type="cau">kaukasiskt språk (annat)</language>
+ <language type="ce">tjetjenska</language>
+ <language type="ceb">cebuano</language>
+ <language type="cel">keltiskt språk (annat)</language>
+ <language type="ch">chamorro</language>
+ <language type="chb">chibcha</language>
+ <language type="chg">chagatai</language>
+ <language type="chk">chuukesiska</language>
+ <language type="chk" alt="proposed-u219-1" draft="provisional">truk</language>
+ <language type="chm">mari; tjeremissiska</language>
+ <language type="chn">chinook</language>
+ <language type="cho">choctaw</language>
+ <language type="chp">chipewyan</language>
+ <language type="chr">cherokesiska</language>
+ <language type="chy">cheyenne</language>
+ <language type="cmc">chamispråk</language>
+ <language type="co">korsikanska</language>
+ <language type="cop">koptiska</language>
+ <language type="cpe">kreolspråk och pidgin, engelskbaserade (annat)</language>
+ <language type="cpf">kreolspråk och pidgin, franskbaserade (annat)</language>
+ <language type="cpp">kreolspråk och pidgin, portugisiskbaserade (annat)</language>
+ <language type="cr">cree</language>
+ <language type="crh">krimturkiska; krimtatariska</language>
+ <language type="crp">kreolspråk och pidgin (annat)</language>
+ <language type="crp" alt="proposed-u219-1" draft="unconfirmed">kreolspråk (annat)</language>
+ <language type="cs">tjeckiska</language>
+ <language type="csb">kasjubiska</language>
+ <language type="cu">kyrkslaviska</language>
+ <language type="cu" alt="proposed-u219-1" draft="unconfirmed">fornkyrkoslaviska</language>
+ <language type="cus">kusjitiskt språk (annat)</language>
+ <language type="cv">tjuvasjiska</language>
+ <language type="cy">walesiska</language>
+ <language type="da">danska</language>
+ <language type="dak">dakota</language>
+ <language type="dar">darginska</language>
+ <language type="day">dajakiska</language>
+ <language type="de">tyska</language>
+ <language type="del">delaware</language>
+ <language type="den">dene; slavej</language>
+ <language type="dgr">dogrib</language>
+ <language type="din">dinka</language>
+ <language type="doi">dogri</language>
+ <language type="dra">dravidiskt språk (annat)</language>
+ <language type="dsb">lågsorbiska</language>
+ <language type="dua">duala</language>
+ <language type="dum">medelnederländska (ca 1050-1350)</language>
+ <language type="dv">divehi</language>
+ <language type="dyu">dyula</language>
+ <language type="dz">bhutanesiska</language>
+ <language type="ee">ewe</language>
+ <language type="efi">efik</language>
+ <language type="egy">fornegyptiska</language>
+ <language type="eka">ekajuk</language>
+ <language type="el">grekiska</language>
+ <language type="elx">elamitiska</language>
+ <language type="en">engelska</language>
+ <language type="enm">medelengelska (1100-1500)</language>
+ <language type="eo">esperanto</language>
+ <language type="es">spanska</language>
+ <language type="et">estniska</language>
+ <language type="eu">baskiska</language>
+ <language type="ewo">ewondo</language>
+ <language type="fa">persiska</language>
+ <language type="fan">fang</language>
+ <language type="fat">fanti</language>
+ <language type="ff">fulani</language>
+ <language type="fi">finska</language>
+ <language type="fil">filippinska</language>
+ <language type="fiu">finsk-ugriskt språk (annat)</language>
+ <language type="fj">fidjianska</language>
+ <language type="fo">färöiska</language>
+ <language type="fon">fonspråket</language>
+ <language type="fr">franska</language>
+ <language type="frm">medelfranska (ca 1400-1600)</language>
+ <language type="fro">fornfranska (842- ca 1400)</language>
+ <language type="fro" alt="proposed-u219-1" draft="unconfirmed">fornfranska (c:a 842-1400)</language>
+ <language type="fur">friulianska</language>
+ <language type="fy">västfrisiska</language>
+ <language type="ga" draft="provisional">iriska</language>
+ <language type="gaa">gã</language>
+ <language type="gay">gayo</language>
+ <language type="gba">gbaya</language>
+ <language type="gd">höglandsskotska</language>
+ <language type="gem">germanskt språk (annat)</language>
+ <language type="gez">etiopiska</language>
+ <language type="gil">gilbertesiska; kiribati</language>
+ <language type="gl">galiciska</language>
+ <language type="gmh">medelhögtyska (ca 1050-1500)</language>
+ <language type="gn">guaraní</language>
+ <language type="goh" draft="provisional">fornhögtyska (ca 750-1050)</language>
+ <language type="gon">gondi</language>
+ <language type="gor">gorontalo</language>
+ <language type="got">gotiska</language>
+ <language type="grb">grebo</language>
+ <language type="grc">forngrekiska (till 1453)</language>
+ <language type="gu">gujarati</language>
+ <language type="gv">manx</language>
+ <language type="gwi">gwichin</language>
+ <language type="ha">haussa</language>
+ <language type="hai">haida</language>
+ <language type="haw">hawaiiska</language>
+ <language type="he">hebreiska</language>
+ <language type="hi">hindi</language>
+ <language type="hil">hiligaynon</language>
+ <language type="him">himachali</language>
+ <language type="hit">hettitiskt språk</language>
+ <language type="hmn">hmonspråk</language>
+ <language type="ho">hirimotu</language>
+ <language type="hr">kroatiska</language>
+ <language type="hsb">högsorbiska</language>
+ <language type="ht">haitiska</language>
+ <language type="hu">ungerska</language>
+ <language type="hup">hupa</language>
+ <language type="hy">armeniska</language>
+ <language type="hz">herero</language>
+ <language type="ia">interlingua</language>
+ <language type="iba">ibanska</language>
+ <language type="id">indonesiska</language>
+ <language type="ie">interlingue</language>
+ <language type="ig">ibo</language>
+ <language type="ii">szezuan i</language>
+ <language type="ijo">ijospråket</language>
+ <language type="ik">inupiak</language>
+ <language type="ilo">iloko</language>
+ <language type="inc">indiskt språk (annat)</language>
+ <language type="ine">indo-europeiskt språk (annat)</language>
+ <language type="inh">ingusjiska</language>
+ <language type="io">ido</language>
+ <language type="ira">iranska</language>
+ <language type="iro">irokesiskt språk</language>
+ <language type="is">isländska</language>
+ <language type="it">italienska</language>
+ <language type="iu">inuktitut</language>
+ <language type="ja">japanska</language>
+ <language type="jbo">lojban</language>
+ <language type="jpr">judisk persiska</language>
+ <language type="jrb">judisk arabiska</language>
+ <language type="jv">javanesiska</language>
+ <language type="ka">georgiska</language>
+ <language type="kaa">karakalpakiska</language>
+ <language type="kab">kabyliska</language>
+ <language type="kac">kachin</language>
+ <language type="kam">kamba</language>
+ <language type="kar">karenska</language>
+ <language type="kaw">kawi</language>
+ <language type="kbd">kabardinska</language>
+ <language type="kg">kikongo</language>
+ <language type="kha">khasi</language>
+ <language type="khi">khoisanspråk (annat)</language>
+ <language type="kho">khotanesiska</language>
+ <language type="ki">kikuyu</language>
+ <language type="kj">kuanyama</language>
+ <language type="kk">kazakstanska</language>
+ <language type="kl">grönländska</language>
+ <language type="km">kambodjanska; khmeriska</language>
+ <language type="kmb">kimbundu</language>
+ <language type="kn">kanaresiska; kannada</language>
+ <language type="ko">koreanska</language>
+ <language type="kok">konkani</language>
+ <language type="kos">kosreanska</language>
+ <language type="kpe">kpelle</language>
+ <language type="kr">kanuri</language>
+ <language type="krc">karachay-balkar</language>
+ <language type="kro">kru</language>
+ <language type="kru">kurukh</language>
+ <language type="ks">kashmiriska</language>
+ <language type="ku">kurdiska</language>
+ <language type="kum">kumykiska</language>
+ <language type="kut">kutenaj</language>
+ <language type="kv">kome</language>
+ <language type="kw">korniska</language>
+ <language type="ky">kirgisiska</language>
+ <language type="la">latin</language>
+ <language type="lad">ladino</language>
+ <language type="lah">lahnda</language>
+ <language type="lam">lamba</language>
+ <language type="lb">luxemburgiska</language>
+ <language type="lez">lezghien</language>
+ <language type="lg">luganda</language>
+ <language type="li">limburgiska</language>
+ <language type="ln">lingala</language>
+ <language type="lo">laotiska</language>
+ <language type="lol">lolo; mongo</language>
+ <language type="loz">lozi</language>
+ <language type="lt">litauiska</language>
+ <language type="lu">luba-katanga</language>
+ <language type="lua">luba-lulua</language>
+ <language type="lui" draft="unconfirmed">luiseno</language>
+ <language type="lun">lunda</language>
+ <language type="luo" draft="provisional">doluo</language>
+ <language type="lus">lushai</language>
+ <language type="lv">lettiska</language>
+ <language type="mad">maduresiska</language>
+ <language type="mag">magahi</language>
+ <language type="mai">maithili</language>
+ <language type="mak">makasar</language>
+ <language type="man">mande</language>
+ <language type="map">austronesiskt språk</language>
+ <language type="mas">massajiska</language>
+ <language type="mdf">moksja</language>
+ <language type="mdr">mandar</language>
+ <language type="men">mende</language>
+ <language type="mg">malagassiska</language>
+ <language type="mga">medeliriska (900-1200)</language>
+ <language type="mh">marshalliska</language>
+ <language type="mi">maori</language>
+ <language type="mic">mic-mac</language>
+ <language type="min">minangkabau</language>
+ <language type="mis">blandade språk</language>
+ <language type="mis" alt="proposed-u219-1" draft="provisional">annat språk</language>
+ <language type="mk">makedonska</language>
+ <language type="mkh">mon-khmeriskt språk (annat)</language>
+ <language type="ml">malayalam</language>
+ <language type="mn">mongoliska</language>
+ <language type="mnc">manchuriska</language>
+ <language type="mni">manipuri</language>
+ <language type="mno">manobospråk</language>
+ <language type="mo">moldaviska</language>
+ <language type="moh">mohawk</language>
+ <language type="mos">mossi</language>
+ <language type="mr">marathi</language>
+ <language type="ms">malajiska</language>
+ <language type="mt">maltesiska</language>
+ <language type="mul">flera språk</language>
+ <language type="mun">mundaspråk</language>
+ <language type="mus">muskogee</language>
+ <language type="mwl">mirandesiska</language>
+ <language type="mwr">marwari</language>
+ <language type="my">burmesiska</language>
+ <language type="myn">mayaspråk</language>
+ <language type="myv">erjya</language>
+ <language type="na">nauru</language>
+ <language type="nah">nahuatl; aztekiska</language>
+ <language type="nai">nordamerikanskt indianspråk (annat)</language>
+ <language type="nap">napolitanska</language>
+ <language type="nb">norska (bokmål)</language>
+ <language type="nd" draft="provisional">nordndebele</language>
+ <language type="nds">lågtyska; lågsaxiska</language>
+ <language type="ne">nepalesiska</language>
+ <language type="new">newariska</language>
+ <language type="ng">ndonga</language>
+ <language type="nia">nias</language>
+ <language type="nic">kordofanspråk (annat)</language>
+ <language type="nic" alt="proposed-u219-1" draft="provisional">Niger-Kongospråk (annat)</language>
+ <language type="niu">niueanska</language>
+ <language type="nl" draft="provisional">holländska</language>
+ <language type="nn">nynorska</language>
+ <language type="no">norska</language>
+ <language type="nog">nogai</language>
+ <language type="non">fornnordiska</language>
+ <language type="nr" draft="provisional">sydndebele</language>
+ <language type="nso">nordsotho</language>
+ <language type="nub">nubiskt språk</language>
+ <language type="nv">navaho</language>
+ <language type="nwc">klassisk newariska</language>
+ <language type="ny">nyanja</language>
+ <language type="nym">nyamwezi</language>
+ <language type="nyn">nyankole</language>
+ <language type="nyo">nyoro</language>
+ <language type="nzi">nzima</language>
+ <language type="oc">provensalska (efter 1500); occitanska</language>
+ <language type="oj">odjibwa; chippewa</language>
+ <language type="om">oromo</language>
+ <language type="or">oriya</language>
+ <language type="os">ossetiska</language>
+ <language type="osa">osage</language>
+ <language type="ota">ottomanska</language>
+ <language type="oto">otomispråk</language>
+ <language type="pa">punjabi</language>
+ <language type="paa">papuanskt språk (annat)</language>
+ <language type="pag">pangasinan</language>
+ <language type="pal">pahlavi; medelpersiska</language>
+ <language type="pam">pampanga</language>
+ <language type="pap">papiamento</language>
+ <language type="pau">palau</language>
+ <language type="peo">fornpersiska (ca 600-400 f.Kr.)</language>
+ <language type="peo" alt="proposed-u219-1" draft="unconfirmed">fornpersiska (c:a 600-400 f.Kr.)</language>
+ <language type="phi">filippinskt språk (annat)</language>
+ <language type="phn">kananeiska; feniciska</language>
+ <language type="pi">pali</language>
+ <language type="pl">polska</language>
+ <language type="pon">ponape</language>
+ <language type="pra">prakritspråk</language>
+ <language type="pro">fornprovensalska (till 1500)</language>
+ <language type="ps">pashto; afghanska</language>
+ <language type="pt">portugisiska</language>
+ <language type="qu">quechua</language>
+ <language type="raj">rajasthani</language>
+ <language type="rap">rapanui</language>
+ <language type="rar">rarotonganska</language>
+ <language type="rm" draft="provisional">rätoromanska</language>
+ <language type="rn">rundi</language>
+ <language type="ro">rumänska</language>
+ <language type="roa">romanskt språk (annat)</language>
+ <language type="rom">romani</language>
+ <language type="root" draft="provisional">rot</language>
+ <language type="ru">ryska</language>
+ <language type="rup">arumänska</language>
+ <language type="rw">rwanda; kinjarwanda</language>
+ <language type="sa">sanskrit</language>
+ <language type="sad">sandawe</language>
+ <language type="sah">jakutiska</language>
+ <language type="sai">sydamerikanskt indianspråk (annat)</language>
+ <language type="sal">salikiskt språk</language>
+ <language type="sam">samaritanska</language>
+ <language type="sas">sasak</language>
+ <language type="sat">santali</language>
+ <language type="sc">sardiska</language>
+ <language type="scn">sicilianska</language>
+ <language type="sco">skotska</language>
+ <language type="sd">sindhi</language>
+ <language type="se" draft="provisional">nordsamiska</language>
+ <language type="sel">selkup</language>
+ <language type="sem">semitiskt språk (annat)</language>
+ <language type="sg">sango</language>
+ <language type="sga">forniriska (till 900)</language>
+ <language type="sgn">teckenspråk</language>
+ <language type="sh" draft="provisional"/>
+ <language type="shn">shan</language>
+ <language type="si">singalesiska</language>
+ <language type="sid">sidamo</language>
+ <language type="sio" draft="provisional">sioux-språk</language>
+ <language type="sit">sinotibetanskt språk (annat)</language>
+ <language type="sit" alt="proposed-u219-2" draft="unconfirmed">sino-tibetanskt språk (annat)</language>
+ <language type="sk">slovakiska</language>
+ <language type="sl">slovenska</language>
+ <language type="sla">slaviskt språk (annat)</language>
+ <language type="sm">samoanska</language>
+ <language type="sma">sydsamiska</language>
+ <language type="smi">samiskt språk (annat)</language>
+ <language type="smj">lulesamiska</language>
+ <language type="smn">enaresamiska</language>
+ <language type="sms">skoltsamiska</language>
+ <language type="sn">shona; manshona</language>
+ <language type="snk">soninke</language>
+ <language type="so">somaliska</language>
+ <language type="sog">sogdiska</language>
+ <language type="son">songhai</language>
+ <language type="sq">albanska</language>
+ <language type="sr">serbiska</language>
+ <language type="srn">sranan tongo</language>
+ <language type="srr">serer</language>
+ <language type="ss">swati</language>
+ <language type="ssa">nilosahariskt (annat)</language>
+ <language type="ssa" alt="proposed-u219-1" draft="provisional">nilo-sahariskt språk (annat)</language>
+ <language type="st" draft="provisional">sydsotho</language>
+ <language type="su">sundanesiska</language>
+ <language type="suk">sukuma</language>
+ <language type="sus">susu</language>
+ <language type="sux">sumeriska</language>
+ <language type="sv">svenska</language>
+ <language type="sw">swahili</language>
+ <language type="syr">syriska</language>
+ <language type="ta">tamil</language>
+ <language type="tai">thaispråk (annat)</language>
+ <language type="te">telugiska</language>
+ <language type="tem">temne</language>
+ <language type="ter">tereno</language>
+ <language type="tet">tetum</language>
+ <language type="tg">tadzjikiska</language>
+ <language type="th">thailändska</language>
+ <language type="ti">tigrinja</language>
+ <language type="tig">tigré</language>
+ <language type="tiv">tivi</language>
+ <language type="tk">turkmeniska</language>
+ <language type="tkl">tokelauiska</language>
+ <language type="tl">tagalog</language>
+ <language type="tlh">klingonska</language>
+ <language type="tli">tlingit</language>
+ <language type="tmh">tamashek</language>
+ <language type="tn">tswana</language>
+ <language type="to">tonganska</language>
+ <language type="tog">tonganska (Nyasa)</language>
+ <language type="tpi">tok pisin</language>
+ <language type="tr">turkiska</language>
+ <language type="ts">tsonga</language>
+ <language type="tsi">tsimshian</language>
+ <language type="tt">tatariska</language>
+ <language type="tum">tumbuka</language>
+ <language type="tup">tupíspråk</language>
+ <language type="tut">altaiskt språk (annat)</language>
+ <language type="tvl">tuvaluanska</language>
+ <language type="tw">twi</language>
+ <language type="ty">tahitiska</language>
+ <language type="tyv">tuviniska</language>
+ <language type="udm">udmurtiska</language>
+ <language type="ug">uiguriska</language>
+ <language type="uga">ugaritiska</language>
+ <language type="uk">ukrainska</language>
+ <language type="umb">umbundu</language>
+ <language type="und">obestämt språk</language>
+ <language type="ur">urdu</language>
+ <language type="uz">uzbekiska</language>
+ <language type="vai">vaj</language>
+ <language type="ve">venda</language>
+ <language type="vi">vietnamesiska</language>
+ <language type="vo">volapük</language>
+ <language type="vo" alt="proposed-u219-1" draft="provisional">volapyk</language>
+ <language type="vot">votiska</language>
+ <language type="wa">vallonska</language>
+ <language type="wak">wakusjiskt språk</language>
+ <language type="wal">walamo</language>
+ <language type="war">waray</language>
+ <language type="was">washo</language>
+ <language type="wen">sorbiskt språk</language>
+ <language type="wo">wolof</language>
+ <language type="xal">kalmuckiska</language>
+ <language type="xh">xhosa</language>
+ <language type="yao">kiyao</language>
+ <language type="yap">japetiska</language>
+ <language type="yi">jiddisch</language>
+ <language type="yo">yoruba</language>
+ <language type="ypk">yupiskt språk</language>
+ <language type="ypk" alt="proposed-u219-2" draft="unconfirmed">eskimåspråk</language>
+ <language type="za">zhuang</language>
+ <language type="zap">zapotek</language>
+ <language type="zen">zenaga</language>
+ <language type="zh">kinesiska</language>
+ <language type="znd">zandé</language>
+ <language type="zu">zulu</language>
+ <language type="zun" draft="unconfirmed">zuni</language>
+ </languages>
+ <scripts>
+ <script type="Arab">arabiska</script>
+ <script type="Armn">armeniska</script>
+ <script type="Bali">balinesiska</script>
+ <script type="Batk">batak</script>
+ <script type="Beng">bengaliska</script>
+ <script type="Blis">blissymboler</script>
+ <script type="Bopo">bopomofo</script>
+ <script type="Brah">brami</script>
+ <script type="Brai">blindskrift</script>
+ <script type="Bugi">buginesiska</script>
+ <script type="Buhd">buhid</script>
+ <script type="Cans">kanadensiska stavelsetecken</script>
+ <script type="Cham">cham</script>
+ <script type="Cher">cherokee</script>
+ <script type="Cirt">cirt</script>
+ <script type="Copt">koptiska</script>
+ <script type="Cprt">cypriotiska</script>
+ <script type="Cyrl">kyrilliska</script>
+ <script type="Cyrs">kyrilliska (fornkyrkoslavisk variant)</script>
+ <script type="Deva">devanagari</script>
+ <script type="Dsrt">deseret</script>
+ <script type="Egyd">demotiska</script>
+ <script type="Egyh">hieratiska</script>
+ <script type="Egyp">egyptiska hieroglyfer</script>
+ <script type="Ethi">etiopiska</script>
+ <script type="Geok">kutsuri</script>
+ <script type="Geor">georgiska</script>
+ <script type="Glag">glagolitiska</script>
+ <script type="Goth">gotiska</script>
+ <script type="Grek">grekiska</script>
+ <script type="Gujr">gujarati</script>
+ <script type="Guru">gurmukhi</script>
+ <script type="Hang">hangul</script>
+ <script type="Hani">han</script>
+ <script type="Hano">hanunå</script>
+ <script type="Hans">förenklad han</script>
+ <script type="Hant">traditionell han</script>
+ <script type="Hebr">hebreiska</script>
+ <script type="Hira">hiragana</script>
+ <script type="Hmng">pahaw mong</script>
+ <script type="Hrkt">katakana/hiragana</script>
+ <script type="Hung">fornungerska</script>
+ <script type="Inds">indus</script>
+ <script type="Ital">fornitaliska</script>
+ <script type="Java">javanska</script>
+ <script type="Kali">kaya li</script>
+ <script type="Kana">katakana</script>
+ <script type="Khar">kharoshti</script>
+ <script type="Khmr">khmeriska</script>
+ <script type="Knda">kanaresiska</script>
+ <script type="Laoo">laotiska</script>
+ <script type="Latf">latinska (frakturvariant)</script>
+ <script type="Latg">latinska (gaelisk variant)</script>
+ <script type="Latn">latinska</script>
+ <script type="Lepc">rong</script>
+ <script type="Limb">limbu</script>
+ <script type="Lina">linjär A</script>
+ <script type="Linb" draft="provisional">linjär B</script>
+ <script type="Mand">mandaéiska</script>
+ <script type="Maya">mayahieroglyfer</script>
+ <script type="Mero">meriotiska</script>
+ <script type="Mlym">malayalam</script>
+ <script type="Mong">mongoliska</script>
+ <script type="Mymr">burmesiska</script>
+ <script type="Nkoo">n'kå</script>
+ <script type="Ogam">ogham</script>
+ <script type="Orkh">orkon</script>
+ <script type="Orya">oriya</script>
+ <script type="Osma">osmanska</script>
+ <script type="Perm">permiska</script>
+ <script type="Phag">phags-pa</script>
+ <script type="Phnx">fenisiska</script>
+ <script type="Plrd">Pollardtecken</script>
+ <script type="Qaai">ärvda</script>
+ <script type="Roro">rongo-rongo</script>
+ <script type="Runr">runor</script>
+ <script type="Sara">sarati</script>
+ <script type="Shaw">shawiska</script>
+ <script type="Sinh">singalesiska</script>
+ <script type="Sylo">syloti nagri</script>
+ <script type="Syrc">syriska</script>
+ <script type="Syre">syriska (estrangelovariant)</script>
+ <script type="Syrj">syriska (västlig variant)</script>
+ <script type="Syrn">syriska (östlig variant)</script>
+ <script type="Tagb">tagbanwa</script>
+ <script type="Tale">tai le</script>
+ <script type="Talu">tai lue</script>
+ <script type="Taml" draft="provisional">tamilska</script>
+ <script type="Telu">telugu</script>
+ <script type="Teng">tengwar</script>
+ <script type="Tfng">tifinagh</script>
+ <script type="Tglg">tagalog</script>
+ <script type="Thaa">taana</script>
+ <script type="Thai">thailändska</script>
+ <script type="Tibt">tibetanska</script>
+ <script type="Ugar">ugaritiska</script>
+ <script type="Vaii">vaj</script>
+ <script type="Visp">synligt tal</script>
+ <script type="Xpeo">fornpersiska</script>
+ <script type="Xsux">sumeo-akkadiska</script>
+ <script type="Yiii">yi</script>
+ <script type="Zxxx">oskrivet språk</script>
+ <script type="Zyyy">gemensamma</script>
+ <script type="Zzzz">okodat skript</script>
+ </scripts>
+ <territories>
+ <territory type="001">världen</territory>
+ <territory type="002">Afrika</territory>
+ <territory type="005">Sydamerika</territory>
+ <territory type="005" alt="proposed-u219-2" draft="unconfirmed">sydamerika</territory>
+ <territory type="009">Oceanien</territory>
+ <territory type="011">Västafrika</territory>
+ <territory type="011" alt="proposed-u219-1" draft="unconfirmed">västafrika</territory>
+ <territory type="013">Centralamerika</territory>
+ <territory type="013" alt="proposed-u219-1" draft="unconfirmed">centralamerika</territory>
+ <territory type="014">Östafrika</territory>
+ <territory type="014" alt="proposed-u219-1" draft="unconfirmed">östafrika</territory>
+ <territory type="015">Nordafrika</territory>
+ <territory type="015" alt="proposed-u219-1" draft="unconfirmed">nordafrika</territory>
+ <territory type="017">Centralafrika</territory>
+ <territory type="017" alt="proposed-u219-1" draft="unconfirmed">centralafrika</territory>
+ <territory type="018">Södra Afrika</territory>
+ <territory type="018" alt="proposed-u219-1" draft="unconfirmed">södra Afrika</territory>
+ <territory type="019">Nord- och Sydamerika</territory>
+ <territory type="019" alt="proposed-u219-2" draft="unconfirmed">nord- och latinamerika</territory>
+ <territory type="021">Nordamerika</territory>
+ <territory type="021" alt="proposed-u219-1" draft="unconfirmed">nordamerika</territory>
+ <territory type="029">Karibien</territory>
+ <territory type="030">Ostasien</territory>
+ <territory type="030" alt="proposed-u219-2" draft="unconfirmed">östasien</territory>
+ <territory type="034">Södra Asien</territory>
+ <territory type="034" alt="proposed-u219-2" draft="unconfirmed">södra Asien</territory>
+ <territory type="035">Sydostasien</territory>
+ <territory type="035" alt="proposed-u219-2" draft="unconfirmed">sydöstasien</territory>
+ <territory type="039">Sydeuropa</territory>
+ <territory type="039" alt="proposed-u219-1" draft="unconfirmed">sydeuropa</territory>
+ <territory type="053">Australien och Nya Zeeland</territory>
+ <territory type="054">Melanesien</territory>
+ <territory type="057">Mikronesiska öarna</territory>
+ <territory type="061">Polynesien</territory>
+ <territory type="062" draft="provisional"/>
+ <territory type="062" alt="proposed-u219-1" draft="unconfirmed">södra centralasien</territory>
+ <territory type="142">Asien</territory>
+ <territory type="143">Centralasien</territory>
+ <territory type="143" alt="proposed-u219-2" draft="unconfirmed">centralasien</territory>
+ <territory type="145">Västasien</territory>
+ <territory type="145" alt="proposed-u219-1" draft="unconfirmed">västasien</territory>
+ <territory type="150">Europa</territory>
+ <territory type="151">Östeuropa</territory>
+ <territory type="151" alt="proposed-u219-1" draft="unconfirmed">östeuropa</territory>
+ <territory type="154">Nordeuropa</territory>
+ <territory type="154" alt="proposed-u219-1" draft="unconfirmed">nordeuropa</territory>
+ <territory type="155">Västeuropa</territory>
+ <territory type="155" alt="proposed-u219-1" draft="unconfirmed">västeuropa</territory>
+ <territory type="172">Samväldet av oberoende stater</territory>
+ <territory type="419">Latinamerika och Karibien</territory>
+ <territory type="830">Kanalöarna</territory>
+ <territory type="IM">Isle of Man</territory>
+ <territory type="AD">Andorra</territory>
+ <territory type="AE">Förenade Arabemiraten</territory>
+ <territory type="AF" references="R1">Afghanistan</territory>
+ <territory type="AG">Antigua och Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Albanien</territory>
+ <territory type="AM">Armenien</territory>
+ <territory type="AN">Nederländska Antillerna</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktis</territory>
+ <territory type="AR">Argentina</territory>
+ <territory type="AS">Amerikanska Samoa</territory>
+ <territory type="AT">Österrike</territory>
+ <territory type="AU">Australien</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Ã…land</territory>
+ <territory type="AZ">Azerbajdzjan</territory>
+ <territory type="BA">Bosnien och Hercegovina</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">Bangladesh</territory>
+ <territory type="BE">Belgien</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgarien</territory>
+ <territory type="BH">Bahrain</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei</territory>
+ <territory type="BO">Bolivia</territory>
+ <territory type="BR">Brasilien</territory>
+ <territory type="BS">Bahamas</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BV">Bouvetön</territory>
+ <territory type="BW">Botswana</territory>
+ <territory type="BY">Vitryssland</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Kokosöarna (Keelingöarna)</territory>
+ <territory type="CD" draft="provisional">Kongo-Kinshasa</territory>
+ <territory type="CF">Centralafrikanska republiken</territory>
+ <territory type="CG" draft="provisional">Kongo-Brazzaville</territory>
+ <territory type="CH">Schweiz</territory>
+ <territory type="CI">Elfenbenskusten</territory>
+ <territory type="CK">Cooköarna</territory>
+ <territory type="CL">Chile</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Kina</territory>
+ <territory type="CO">Colombia</territory>
+ <territory type="CR">Costa Rica</territory>
+ <territory type="CS">Serbien och Montenegro</territory>
+ <territory type="CU">Kuba</territory>
+ <territory type="CV">Kap Verde</territory>
+ <territory type="CX">Julön</territory>
+ <territory type="CY">Cypern</territory>
+ <territory type="CZ">Tjeckien</territory>
+ <territory type="DE">Tyskland</territory>
+ <territory type="DJ">Djibouti</territory>
+ <territory type="DK">Danmark</territory>
+ <territory type="DM">Dominica</territory>
+ <territory type="DO">Dominikanska republiken</territory>
+ <territory type="DZ">Algeriet</territory>
+ <territory type="EC">Ecuador</territory>
+ <territory type="EE">Estland</territory>
+ <territory type="EG">Egypten</territory>
+ <territory type="EH" draft="provisional">Västsahara</territory>
+ <territory type="ER">Eritrea</territory>
+ <territory type="ES">Spanien</territory>
+ <territory type="ET">Etiopien</territory>
+ <territory type="FI">Finland</territory>
+ <territory type="FJ">Fiji</territory>
+ <territory type="FK">Falklandsöarna</territory>
+ <territory type="FM">Mikronesien</territory>
+ <territory type="FM" alt="proposed-u219-1" draft="unconfirmed">Mikronesiska federationen</territory>
+ <territory type="FO">Färöarna</territory>
+ <territory type="FR">Frankrike</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Storbritannien</territory>
+ <territory type="GD">Grenada</territory>
+ <territory type="GE">Georgien</territory>
+ <territory type="GF">Franska Guyana</territory>
+ <territory type="GH">Ghana</territory>
+ <territory type="GI">Gibraltar</territory>
+ <territory type="GL">Grönland</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Guinea</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Ekvatorialguinea</territory>
+ <territory type="GR">Grekland</territory>
+ <territory type="GS">Sydgeorgien och Södra Sandwichöarna</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Guinea-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Hongkong (S.A.R. Kina)</territory>
+ <territory type="HK" alt="proposed-u219-1" draft="unconfirmed">Hong Kong</territory>
+ <territory type="HM">Heard- och McDonaldöarna</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Kroatien</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Ungern</territory>
+ <territory type="ID">Indonesien</territory>
+ <territory type="IE">Irland</territory>
+ <territory type="IL">Israel</territory>
+ <territory type="IN">Indien</territory>
+ <territory type="IO">Brittiska Indiska oceanöarna</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IR">Iran</territory>
+ <territory type="IS">Island</territory>
+ <territory type="IT">Italien</territory>
+ <territory type="JM">Jamaica</territory>
+ <territory type="JO">Jordanien</territory>
+ <territory type="JP">Japan</territory>
+ <territory type="KE">Kenya</territory>
+ <territory type="KG">Kirgizistan</territory>
+ <territory type="KH">Kambodja</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komorerna</territory>
+ <territory type="KN">S:t Kitts och Nevis</territory>
+ <territory type="KP">Nordkorea</territory>
+ <territory type="KR">Sydkorea</territory>
+ <territory type="KW">Kuwait</territory>
+ <territory type="KY">Caymanöarna</territory>
+ <territory type="KZ">Kazakstan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Libanon</territory>
+ <territory type="LC">S:t Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberia</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Litauen</territory>
+ <territory type="LU">Luxemburg</territory>
+ <territory type="LV">Lettland</territory>
+ <territory type="LY">Libyen</territory>
+ <territory type="MA">Marocko</territory>
+ <territory type="MC">Monaco</territory>
+ <territory type="MD">Moldavien</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshallöarna</territory>
+ <territory type="MK">Makedonien</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MM" alt="proposed-u219-1" draft="unconfirmed">Burma</territory>
+ <territory type="MN">Mongoliet</territory>
+ <territory type="MO">Macao (S.A.R. Kina)</territory>
+ <territory type="MO" alt="proposed-u219-1" draft="unconfirmed">Macao</territory>
+ <territory type="MP">Nordmarianerna</territory>
+ <territory type="MQ">Martinique</territory>
+ <territory type="MR">Mauretanien</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Maldiverna</territory>
+ <territory type="MW">Malawi</territory>
+ <territory type="MX">Mexiko</territory>
+ <territory type="MY">Malaysia</territory>
+ <territory type="MZ">Moçambique</territory>
+ <territory type="NA">Namibia</territory>
+ <territory type="NC">Nya Kaledonien</territory>
+ <territory type="NE">Niger</territory>
+ <territory type="NF">Norfolkön</territory>
+ <territory type="NG">Nigeria</territory>
+ <territory type="NI">Nicaragua</territory>
+ <territory type="NL">Nederländerna</territory>
+ <territory type="NO">Norge</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru</territory>
+ <territory type="NU">Niue</territory>
+ <territory type="NZ">Nya Zeeland</territory>
+ <territory type="OM">Oman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Franska Polynesien</territory>
+ <territory type="PG">Papua Nya Guinea</territory>
+ <territory type="PH">Filippinerna</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Polen</territory>
+ <territory type="PM">S:t Pierre och Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Puerto Rico</territory>
+ <territory type="PS">Palestinska territoriet</territory>
+ <territory type="PT">Portugal</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Qatar</territory>
+ <territory type="QO">Yttre öar i Oceanien</territory>
+ <territory type="RE">Réunion</territory>
+ <territory type="RO">Rumänien</territory>
+ <territory type="RU">Ryssland</territory>
+ <territory type="RW">Rwanda</territory>
+ <territory type="SA">Saudiarabien</territory>
+ <territory type="SB">Salomonöarna</territory>
+ <territory type="SC">Seychellerna</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">Sverige</territory>
+ <territory type="SG">Singapore</territory>
+ <territory type="SH">S:t Helena</territory>
+ <territory type="SI">Slovenien</territory>
+ <territory type="SJ">Svalbard och Jan Mayen</territory>
+ <territory type="SK">Slovakien</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somalia</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">São Tomé och Príncipe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Syrien</territory>
+ <territory type="SZ">Swaziland</territory>
+ <territory type="TC">Turks- och Caicosöarna</territory>
+ <territory type="TD">Tchad</territory>
+ <territory type="TF">Franska Sydterritorierna</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Thailand</territory>
+ <territory type="TJ">Tadzjikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">Östtimor</territory>
+ <territory type="TM">Turkmenistan</territory>
+ <territory type="TN">Tunisien</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Turkiet</territory>
+ <territory type="TT">Trinidad och Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Taiwan</territory>
+ <territory type="TZ">Tanzania</territory>
+ <territory type="UA">Ukraina</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM" references="R2">USAs yttre öar</territory>
+ <territory type="US" references="R3">USA</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Uzbekistan</territory>
+ <territory type="VA">Vatikanstaten</territory>
+ <territory type="VC">S:t Vincent och Grenadinerna</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">Brittiska Jungfruöarna</territory>
+ <territory type="VI">Amerikanska Jungfruöarna</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis- och Futunaöarna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Jemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Sydafrika</territory>
+ <territory type="ZM">Zambia</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ <variants>
+ <variant type="1901">traditionell tysk ortografi</variant>
+ <variant type="1901" alt="proposed-u219-3" draft="unconfirmed">1901 års stavning</variant>
+ <variant type="1996">1996 års reformerad tysk ortografi</variant>
+ <variant type="1996" alt="proposed-u219-2" draft="unconfirmed">1996 års stavning</variant>
+ <variant type="NEDIS">natisonsk dialekt</variant>
+ <variant type="POLYTONI">polytonisk ortografi</variant>
+ <variant type="POLYTONI" alt="proposed-u219-2" draft="unconfirmed">polytonisk stavning</variant>
+ <variant type="REVISED">reformerad stavning</variant>
+ <variant type="ROZAJ">resisk dialekt</variant>
+ <variant type="SAAHO">saho</variant>
+ <variant type="SAAHO" alt="proposed-u219-2" draft="unconfirmed">saho-dialekt</variant>
+ </variants>
+ <keys>
+ <key type="calendar">kalender</key>
+ <key type="collation">sorteringsordning</key>
+ <key type="currency">valuta</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">traditionell kinesiska i big5-ordning</type>
+ <type type="buddhist" key="calendar">buddistisk kalender</type>
+ <type type="chinese" key="calendar">kinesisk kalender</type>
+ <type type="direct" key="collation">direkt ordning</type>
+ <type type="gb2312han" key="collation">förenklad kinesiska i gb2312-ordning</type>
+ <type type="gregorian" key="calendar">gregoriansk kalender</type>
+ <type type="hebrew" key="calendar">hebreisk kalender</type>
+ <type type="islamic" key="calendar">islamisk kalender</type>
+ <type type="islamic-civil" key="calendar">islamisk civil kalender</type>
+ <type type="japanese" key="calendar">japansk kalender</type>
+ <type type="phonebook" key="collation">telefonkatalogsordning</type>
+ <type type="pinyin" key="collation">kinesiska i pinyin-ordning</type>
+ <type type="stroke" key="collation">kinesiska i streck-ordning</type>
+ <type type="traditional" key="collation">kinesiska i traditionell ordning</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US" draft="unconfirmed">imperiska enheter</measurementSystemName>
+ <measurementSystemName type="metric" draft="provisional">SI-enheter</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-v x-z å ä ö]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[à ã ç é ë í ñ ó w ÿ ü]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" alt="proposed-u219-3" draft="unconfirmed">[ã ç ë í ñ ó w ü ô]</exemplarCharacters>
+ <exemplarCharacters alt="proposed-u219-2" draft="unconfirmed">[a à b-e é f-v x-z å ä ö]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>â€</quotationStart>
+ <alternateQuotationStart>’</alternateQuotationStart>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">jan</month>
+ <month type="2">feb</month>
+ <month type="3">mar</month>
+ <month type="4">apr</month>
+ <month type="5">maj</month>
+ <month type="6">jun</month>
+ <month type="7">jul</month>
+ <month type="8">aug</month>
+ <month type="9">sep</month>
+ <month type="10">okt</month>
+ <month type="11">nov</month>
+ <month type="12">dec</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">januari</month>
+ <month type="2">februari</month>
+ <month type="3">mars</month>
+ <month type="4">april</month>
+ <month type="5">maj</month>
+ <month type="6">juni</month>
+ <month type="7">juli</month>
+ <month type="8">augusti</month>
+ <month type="9">september</month>
+ <month type="10">oktober</month>
+ <month type="11">november</month>
+ <month type="12">december</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">J</month>
+ <month type="2">F</month>
+ <month type="3">M</month>
+ <month type="4">A</month>
+ <month type="5">M</month>
+ <month type="6">J</month>
+ <month type="7">J</month>
+ <month type="8">A</month>
+ <month type="9">S</month>
+ <month type="10">O</month>
+ <month type="11">N</month>
+ <month type="12">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">sö</day>
+ <day type="sun" references="R4" alt="proposed" draft="provisional">sön</day>
+ <day type="mon">må</day>
+ <day type="mon" references="R4" alt="proposed" draft="provisional">mån</day>
+ <day type="tue">ti</day>
+ <day type="tue" references="R4" alt="proposed" draft="provisional">tis</day>
+ <day type="wed">on</day>
+ <day type="wed" references="R4" alt="proposed" draft="provisional">ons</day>
+ <day type="thu">to</day>
+ <day type="thu" references="R4" alt="proposed" draft="provisional">tors</day>
+ <day type="fri">fr</day>
+ <day type="fri" references="R4" alt="proposed" draft="provisional">fre</day>
+ <day type="sat">lö</day>
+ <day type="sat" references="R4" alt="proposed" draft="provisional">lör</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">söndag</day>
+ <day type="mon">måndag</day>
+ <day type="tue">tisdag</day>
+ <day type="wed">onsdag</day>
+ <day type="thu">torsdag</day>
+ <day type="fri">fredag</day>
+ <day type="sat">lördag</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">S</day>
+ <day type="mon">M</day>
+ <day type="tue">T</day>
+ <day type="wed">O</day>
+ <day type="thu">T</day>
+ <day type="fri">F</day>
+ <day type="sat">L</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">K1</quarter>
+ <quarter type="2">K2</quarter>
+ <quarter type="3">K3</quarter>
+ <quarter type="4">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1:a kvartalet</quarter>
+ <quarter type="2">2:a kvartalet</quarter>
+ <quarter type="3">3:e kvartalet</quarter>
+ <quarter type="4">4:e kvartalet</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am draft="unconfirmed">fm</am>
+ <pm draft="unconfirmed">em</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">f.Kr.</era>
+ <era type="1">e.Kr.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="provisional">EEEE'en den' d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern references="R3">EEEE d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern references="R3">d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yyyy-MM-dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>'kl. 'HH.mm.ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>HH.mm.ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>HH.mm.ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>HH.mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMd" draft="provisional">d MMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">MM-dd</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm.ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">yyyy-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMMM" draft="provisional">MMM yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyQQQQ" draft="provisional">QQQQ',' yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName>era</displayName>
+ </field>
+ <field type="year">
+ <displayName>Ã¥r</displayName>
+ </field>
+ <field type="month">
+ <displayName>månad</displayName>
+ </field>
+ <field type="week">
+ <displayName>vecka</displayName>
+ </field>
+ <field type="day">
+ <displayName>dag</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>veckodag</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName>dagsperiod</displayName>
+ </field>
+ <field type="hour">
+ <displayName>timme</displayName>
+ </field>
+ <field type="minute">
+ <displayName>minut</displayName>
+ </field>
+ <field type="second">
+ <displayName>sekund</displayName>
+ </field>
+ <field type="zone">
+ <displayName>tidszon</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HH.mm;-HH.mm</hourFormat>
+ <hourFormat alt="proposed-u219-1" draft="unconfirmed">+HH:mm;−HH:mm</hourFormat>
+ <zone type="America/Argentina/ComodRivadavia">
+ <exemplarCity>Comod. Rivadavia</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Sydpolen</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity>Dumont d'Urville</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Rio_Gallegos">
+ <exemplarCity draft="provisional">Argentina/Rio Gallegos</exemplarCity>
+ </zone>
+ <zone type="America/Belem">
+ <exemplarCity>Brasilien/Belem</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>Brasilien/São Paulo</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <standard>Atlantic, normaltid</standard>
+ <standard alt="proposed-u219-1" draft="provisional">USA/Halifax, normaltid</standard>
+ <daylight>Atlantic, sommartid</daylight>
+ <daylight alt="proposed-u219-1" draft="provisional">USA/Halifax, sommartid</daylight>
+ </long>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <standard>Newfoundland, normaltid</standard>
+ <daylight>Newfoundland, sommartid</daylight>
+ </long>
+ <short>
+ <standard>CNT</standard>
+ <daylight>CDT</daylight>
+ </short>
+ <exemplarCity>St. Johns</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>Påskön</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <standard>Kina, normaltid</standard>
+ <daylight>Kina, normaltid</daylight>
+ </long>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>Kanarieöarna</exemplarCity>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <standard>Centraleuropa, normaltid</standard>
+ <daylight>Centraleuropa, sommartid</daylight>
+ </long>
+ <short>
+ <standard>CET</standard>
+ <daylight>CEST</daylight>
+ </short>
+ <exemplarCity>Paris</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity>Godthåb</exemplarCity>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <standard>Israel, normaltid</standard>
+ <daylight>Israel, sommartid</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IDT</daylight>
+ </short>
+ <exemplarCity>Jerusalem</exemplarCity>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <standard>Japan, normaltid</standard>
+ <daylight>Japan, normaltid</daylight>
+ </long>
+ <short>
+ <standard>JST</standard>
+ <daylight>JST</daylight>
+ </short>
+ <exemplarCity>Tokyo</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity>Alma-Ata</exemplarCity>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <standard>Greenwichtid</standard>
+ <standard alt="proposed-u219-1" draft="provisional">Afrika/Casablanca, sommartid</standard>
+ <daylight>Greenwichtid</daylight>
+ <daylight alt="proposed-u219-1" draft="provisional">Afrika/Casablanca, normaltid</daylight>
+ </long>
+ <short>
+ <standard>GMT</standard>
+ <daylight>GMT</daylight>
+ </short>
+ <exemplarCity>Casablanca</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>Ulan Bator</exemplarCity>
+ </zone>
+ <zone type="Asia/Choibalsan">
+ <exemplarCity>Tjoibalsan</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>Azorerna</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lissabon</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>Östeuropa, normaltid</standard>
+ <daylight>Östeuropa, sommartid</daylight>
+ </long>
+ <short>
+ <standard>EET</standard>
+ <daylight>EEST</daylight>
+ </short>
+ <exemplarCity>Bukarest</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moskva</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>Jekaterinburg</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>Krasnojarsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>Jakutsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>Sachalin</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>Kamtjatka</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity>Anadir</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>Uzjgorod</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>Zaporozjzja</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <standard>Hawaii, normaltid</standard>
+ <daylight>Hawaii, normaltid</daylight>
+ <daylight alt="proposed-u219-1" draft="provisional">Hawaii, sommartid</daylight>
+ </long>
+ <short>
+ <standard>HST</standard>
+ <daylight>HST</daylight>
+ </short>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <standard>Alaska, normaltid</standard>
+ <daylight>Alaska, sommartid</daylight>
+ </long>
+ <exemplarCity>Alaska/Anchorage</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <standard>Pacific, normaltid</standard>
+ <standard alt="proposed-u219-1" draft="provisional">USA/Los Angeles, normaltid</standard>
+ <daylight>Pacific, sommartid</daylight>
+ <daylight alt="proposed-u219-1" draft="provisional">USA/Los Angeles, sommarid</daylight>
+ </long>
+ <short>
+ <standard>PST</standard>
+ <daylight>PDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Phoenix">
+ <long>
+ <standard>Mountain, normaltid</standard>
+ <standard alt="proposed-u219-1" draft="provisional">USA/Phoenix, normaltid</standard>
+ <daylight>Mountain, sommartid</daylight>
+ <daylight alt="proposed-u219-1" draft="provisional">USA/Phoenix, sommartid</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MST</daylight>
+ </short>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <standard alt="proposed-u219-1" draft="provisional">USA/Denver, normaltid</standard>
+ <daylight alt="proposed-u219-1" draft="provisional">USA/Denver, sommartid</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity>North Dakota</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <standard>Central, normaltid</standard>
+ <standard alt="proposed-u219-1" draft="provisional">USA/Chicago, normaltid</standard>
+ <daylight>Central, sommartid</daylight>
+ <daylight alt="proposed-u219-1" draft="provisional">USA/Chicago, sommartid</daylight>
+ </long>
+ </zone>
+ <zone type="America/Indianapolis">
+ <long>
+ <standard alt="proposed-u219-1" draft="provisional">USA/Indanapolis, normaltid</standard>
+ <daylight alt="proposed-u219-1" draft="provisional">USA/Indianapolis, normaltid</daylight>
+ </long>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <standard>Eastern, normaltid</standard>
+ <standard alt="proposed-u219-1" draft="provisional">USA/New York, normaltid</standard>
+ <daylight>Eastern, sommartid</daylight>
+ <daylight alt="proposed-u219-1" draft="provisional">USA/New York, sommatid</daylight>
+ </long>
+ <short>
+ <standard>EST</standard>
+ <daylight>EDT</daylight>
+ </short>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Tasjkent</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ <minusSign draft="provisional">−</minusSign>
+ <nan draft="provisional">¤¤¤</nan>
+ </symbols>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##0 %</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="provisional">#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Andorransk peseta</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>Förenade arabemiratens dirham</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName>Albansk lek</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>Armenisk dram</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>Nederländsk antillisk gulden</displayName>
+ <symbol>NA f.</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>Angolansk kwanza</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Angolansk kwanza (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>Angolansk ny kwanza (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>Angolansk kwanza – Reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>Argentinsk austral</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Argentinsk peso (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Argentinsk peso</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>Österrikisk schilling</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>Australisk dollar</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>Aruba-florin</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>Azerbajdzjansk manat</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName references="R5">Bosnisk-hercegovinsk dinar</displayName>
+ <symbol references="R5">BAD</symbol>
+ </currency>
+ <currency type="BAM">
+ <displayName references="R5">Konvertibel bosnisk-hercegovinsk mark</displayName>
+ <symbol references="R5">KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>Barbadisk dollar</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>Bangladeshisk taka</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>Belgisk franc (konvertibel)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Belgisk franc</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>Belgisk franc (finansiell)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>Bulgarisk hård lev</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>Bulgarisk ny lev</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>Bahrainsk dinar</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>Burundisk franc</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>Bermuda-dollar</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>Bruneisk dollar</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>Boliviansk peso</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Boliviansk mvdol</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>Brasiliansk cruzeiro novo (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>Brasiliansk cruzado</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>Brasiliansk cruzeiro (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Brasiliansk real</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRN">
+ <displayName>Brasiliansk cruzado novo</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>Brasiliansk cruzeiro</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>Bahamansk dollar</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>Bhutanesisk ngultrum</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>Burmesisk kyat</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>Botswansk pula</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>Vitrysk ny rubel (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>Vitrysk rubel</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>Belizisk dollar</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>Kanadensisk dollar</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>Kongolesisk franc congolais</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>Schweizisk franc</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CLF">
+ <displayName>Chilensk unidad de fomento</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Chilensk peso</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>Kinesisk yuan renminbi</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>Colombiansk peso</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="CRC">
+ <displayName>Costarikansk colón</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSK">
+ <displayName>Tjeckisk hård koruna</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Kubansk peso</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Kapverdisk escudo</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>Cypriotiskt pund</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>Tjeckisk koruna</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>Östtysk mark</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Tysk mark</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Djiboutisk franc</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>Dansk krona</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>Dominikansk peso</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>Algerisk dinar</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>Ecuadoriansk sucre</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>Ecuadoriansk Unidad de Valor Constante (UVC)</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>Estnisk krona</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>Egyptiskt pund</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Eritreansk nakfa</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>Spansk peseta</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>Etiopisk birr</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>Finsk mark</displayName>
+ <symbol>mk</symbol>
+ </currency>
+ <currency type="FJD">
+ <displayName>Fijiansk dollar</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>Falklandsöarnas pund</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Fransk franc</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Brittiskt pund sterling</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>Georgisk kupon larit</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>Georgisk lari</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>Ghanansk cedi</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>Gibraltiskt pund</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>Gambisk dalasi</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Guineansk franc</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>Guineansk syli</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Ekvatorialguineansk ekwele guineana</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Grekisk drachma</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Guatemalansk quetzal</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>Portugisiska Guinea-escudo</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Guinea-Bissau-peso</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>Guyanansk dollar</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>Hongkong-dollar</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>Hoduransk lempira</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>Kroatisk dinar</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Kroatisk kuna</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>Haitisk gourde</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Ungersk forint</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>Indonesisk rupiah</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>Irländskt pund</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>Israeliskt pund</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Israelisk ny shekel</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Indisk rupie</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>Irakisk dinar</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>Iransk rial</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>Isländsk krona</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>Italiensk lira</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>Jamaicansk dollar</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>Jordansk dinar</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>Japansk yen</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>Kenyansk shilling</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>Kirgizistansk som</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>Kambodjansk riel</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>Komorisk franc</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>Nordkoreansk won</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Sydkoreansk won</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>Kuwaitisk dinar</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName references="R5">Cayman-dollar</displayName>
+ <symbol references="R5">KYD</symbol>
+ </currency>
+ <currency type="KZT">
+ <displayName>Kazakisk tenge</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>Laotisk kip</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>Libanesiskt pund</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>Srilankesisk rupie</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>Liberisk dollar</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Lesothisk loti</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LTL">
+ <displayName>Lettisk lita</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Lettisk talonas</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Luxemburgsk franc</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Lettisk lats</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>Lettisk rubel</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>Libysk dinar</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>Marockansk dirham</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>Marockansk franc</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>Moldavisk leu</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>Madagaskisk ariary</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Madagaskisk franc</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>Makedonisk denar</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>Malisk franc</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Myanmarisk kyat</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>Mongolisk tugrik</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Macaoisk pataca</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Mauretansk ouguiya</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>Maltesisk lira</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>Maltesiskt pund</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>Mauritisk rupie</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>Maldivisk rufiyaa</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Malawisk kwacha</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>Mexikansk peso</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>Mexikansk silverpeso (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>Mexikansk Unidad de Inversion (UDI)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Malaysisk ringgit</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>Moçambikisk escudo</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Moçambikisk metical</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>Namibisk dollar</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>Nigeriansk naira</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>Nicaraguansk córdoba</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>Nicaraguansk córdoba oro</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Nederländsk gulden</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Norsk krona</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>Nepalesisk rupie</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>Nyzeeländsk dollar</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>Omansk rial</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>Panamansk balboa</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>Peruansk inti</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>Peruansk sol nuevo</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>Peruansk sol</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Papuansk kina</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>Filippinsk peso</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>Pakistansk rupie</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>Polsk zloty</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Polsk zloty (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Portugisisk escudo</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>Paraguaysk guarani</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>Qatarisk rial</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="ROL">
+ <displayName>Rumänsk leu</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>Rysk rubel</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Rysk rubel (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>Rwandisk franc</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>Saudisk riyal</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>Salomon-dollar</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>Seychellisk rupie</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>Sudanesisk dinar</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>Sudanesiskt pund</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>Svensk krona</displayName>
+ <symbol>kr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>Singaporiansk dollar</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>S:t Helena-pund</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Slovensk tolar</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Slovakisk koruna</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>Sierraleonsk leone</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>Somalisk shilling</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRG">
+ <displayName>Surinamesisk gulden</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>São Tomé och Príncipe-dobra</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>Sovjetisk rubel</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>Salvadoransk colón</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>Syriskt pund</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>Swaziländsk lilangeni</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>Thailändsk baht</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>Tadzjikisk rubel</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Tadzjikisk somoni</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Turkmensk manat</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>Tunisisk dinar</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>Tongansk paʻanga</displayName>
+ <symbol>T$</symbol>
+ </currency>
+ <currency type="TPE">
+ <displayName>Timoriansk escudo</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Turkisk lira</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName>Ny turkisk lira</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Trinidadisk dollar</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>Taiwanesisk ny dollar</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>Tanzanisk shilling</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>Ukrainsk hryvnia</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Ukrainsk karbovanetz</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Ugandisk shilling (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Ugandisk shilling</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>US-dollar</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>US-dollar (nästa dag)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>US-dollar (samma dag)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>Uruguayansk peso (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>Uruguayansk peso uruguayo</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>Uzbekisk sum</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Venezuelansk bolivar</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>Vietnamesisk dong</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>Vanuatisk vatu</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>Västsamoansk tala</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>CFA Franc BEAC</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>Östkaribisk dollar</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XFO">
+ <displayName>Fransk guldfranc</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>French UIC-Franc</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>CFA Franc BCEAO</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>CFP-franc</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="YDD">
+ <displayName>Jemenitisk dinar</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Jemenitisk rial</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>Jugoslavisk hård dinar</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>Dinar (Serbien och Montenegro)</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>Jugoslavisk konvertibel dinar</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>Sydafrikansk rand (finansiell)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Sydafrikansk rand</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Zambisk kwacha</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Zairisk ny zaire</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Zairisk zaire</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Zimbabwisk dollar</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>ja:j</yesstr>
+ <nostr>nej:n</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="R1">Utrikes namnbok</reference>
+ <reference type="R2">Landskoder på Internet</reference>
+ <reference type="R3">Svenska skrivregler</reference>
+ <reference type="R4">Svenska språknämnden</reference>
+ <reference type="R5">Länder och valutor</reference>
+ <reference type="RP1" uri="http://www.kb.se/">Kungliga bibliotekets protokoll över ämnesord</reference>
+ <reference type="RP2" uri="http://www.libris.kb.se/tjanster/katalogisering/formathandbok/sprakkoder.htm">LIBRIS språkkoder</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/sv_FI.xml b/libs/Zend/Locale/Data/sv_FI.xml
new file mode 100755
index 0000000000..2d4804e25c
--- /dev/null
+++ b/libs/Zend/Locale/Data/sv_FI.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="sv"/>
+ <territory type="FI"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="hebrew">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">tishrí</month>
+ <month type="2">heshván</month>
+ <month type="3">kislév</month>
+ <month type="4">tevét</month>
+ <month type="5">shevát</month>
+ <month type="6">adár</month>
+ <month type="7">adár II</month>
+ <month type="8">nisán</month>
+ <month type="9">ijjár</month>
+ <month type="10">siván</month>
+ <month type="11">tammúz</month>
+ <month type="12">ab</month>
+ <month type="13">elúl</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">tishrí</month>
+ <month type="2">heshván</month>
+ <month type="3">kislév</month>
+ <month type="4">tevét</month>
+ <month type="5">shevát</month>
+ <month type="6">adár</month>
+ <month type="7">adár II</month>
+ <month type="8">nisán</month>
+ <month type="9">ijjár</month>
+ <month type="10">siván</month>
+ <month type="11">tammúz</month>
+ <month type="12">ab</month>
+ <month type="13">elúl</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="islamic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">muharram</month>
+ <month type="2">safar</month>
+ <month type="3">rabi’ al-awwal</month>
+ <month type="4">rabi’ al-akhir</month>
+ <month type="5">jumada-l-ula</month>
+ <month type="6">jumada-l-akhira</month>
+ <month type="7">rajab</month>
+ <month type="8">sha’ban</month>
+ <month type="9">ramadan</month>
+ <month type="10">shawwal</month>
+ <month type="11">dhu-l-ga’da</month>
+ <month type="12">dhu-l-hijja</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">muharram</month>
+ <month type="2">safar</month>
+ <month type="3">rabi’ al-awwal</month>
+ <month type="4">rabi’ al-akhir</month>
+ <month type="5">jumada-l-ula</month>
+ <month type="6">jumada-l-akhira</month>
+ <month type="7">rajab</month>
+ <month type="8">sha’ban</month>
+ <month type="9">ramadan</month>
+ <month type="10">shawwal</month>
+ <month type="11">dhu-l-ga’da</month>
+ <month type="12">dhu-l-hijja</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="islamic-civil">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1">muharram</month>
+ <month type="2">safar</month>
+ <month type="3">rabi’ al-awwal</month>
+ <month type="4">rabi’ al-akhir</month>
+ <month type="5">jumada-l-ula</month>
+ <month type="6">jumada-l-akhira</month>
+ <month type="7">rajab</month>
+ <month type="8">sha’ban</month>
+ <month type="9">ramadan</month>
+ <month type="10">shawwal</month>
+ <month type="11">dhu-l-ga’da</month>
+ <month type="12">dhu-l-hijja</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ </calendars>
+ </dates>
+ <references>
+ <reference type="RP1">Finlands Statskalender 2006</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sv_SE.xml b/libs/Zend/Locale/Data/sv_SE.xml
new file mode 100755
index 0000000000..8cfe65fc80
--- /dev/null
+++ b/libs/Zend/Locale/Data/sv_SE.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.44 $"/>
+ <generation date="$Date: 2006/07/11 19:27:38 $"/>
+ <language type="sv"/>
+ <territory type="SE"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="afa">afroasiatiskt (annat)</language>
+ <language type="cpe">kreol- och pidginspråk, engelskbaserade (övriga)</language>
+ <language type="cpf">kreol- och pidginspråk, franskbaserade (övriga)</language>
+ <language type="cpp">kreol- och pidginspråk, portugisiskbaserade (övriga)</language>
+ <language type="crh">krimturkiska, krimtatariska</language>
+ <language type="crp">kreol- och pidginspråk (annat)</language>
+ <language type="enm">medelengelska (ca 1100-1500)</language>
+ <language type="gil">gilbertesiska, kiribati</language>
+ <language type="gn">guarani</language>
+ <language type="iro">irokesiska språk</language>
+ <language type="khi">khoisanska (annat)</language>
+ <language type="km">kambodjanska, khmeriska</language>
+ <language type="kn">kanaresiska, kannada</language>
+ <language type="lol">lolo, mongo</language>
+ <language type="mga">medeliriska (ca 900-1200)</language>
+ <language type="nah">nahuatl, aztekiska</language>
+ <language type="nds">lågtyska, lågsaxiska</language>
+ <language type="oc">provensalska (efter 1500), occitanska</language>
+ <language type="oj">odjibwa, chippewa</language>
+ <language type="phn">kananeiska, feniciska</language>
+ <language type="ps">pashto, afghanska</language>
+ <language type="rw">rwanda, kinjarwanda</language>
+ <language type="sit">sinotibetanskt (annat)</language>
+ <language type="smi">samiska språk (övriga)</language>
+ <language type="sn">shona, manshona</language>
+ </languages>
+ <territories>
+ <territory type="UM">USA:s yttre öar</territory>
+ </territories>
+ <types>
+ <type type="stroke" key="collation">streckordning</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US">Tumsystem</measurementSystemName>
+ <measurementSystemName type="metric">Metriskt system</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <delimiters>
+ <quotationStart>’</quotationStart>
+ <quotationEnd>’</quotationEnd>
+ <alternateQuotationStart>â€</alternateQuotationStart>
+ <alternateQuotationEnd>â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>EEE d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMEEEd" draft="provisional">EEE d MMMM</dateFormatItem>
+ <dateFormatItem id="MMd" draft="provisional">d/MM</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh.mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh.mm.ss a</dateFormatItem>
+ <dateFormatItem id="yyyyQQQQ" draft="provisional">QQQQ yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="dayperiod">
+ <displayName>tidsvisning</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern references="R3">#,##0 %</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/sw.xml b/libs/Zend/Locale/Data/sw.xml
new file mode 100755
index 0000000000..bfa9d8abc1
--- /dev/null
+++ b/libs/Zend/Locale/Data/sw.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.47 $"/>
+ <generation date="$Date: 2006/07/07 21:00:33 $"/>
+ <language type="sw"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="de">kijerumani</language>
+ <language type="en">kiingereza</language>
+ <language type="es">kihispania</language>
+ <language type="fr">kifaransa</language>
+ <language type="it">kiitaliano</language>
+ <language type="ja">kijapani</language>
+ <language type="pt">kireno</language>
+ <language type="ru">kirusi</language>
+ <language type="sw">Kiswahili</language>
+ <language type="zh">kichina</language>
+ </languages>
+ <territories>
+ <territory type="AE">Muugano wa Falme za Nchi za Kiarabu</territory>
+ <territory type="AG">Antigua na Barbuda</territory>
+ <territory type="AR">Ajentina</territory>
+ <territory type="BA">Bosnia na Herzegowina</territory>
+ <territory type="BE">Ubelgiji</territory>
+ <territory type="BR">Brazili</territory>
+ <territory type="BS">Visiwa vya Bahama</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CF">Jamhuri ya Afrika ya Kati</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">Uswisi</territory>
+ <territory type="CI">Pwani ya Pembe</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Uchina</territory>
+ <territory type="CO">Kolombia</territory>
+ <territory type="CS">Serbiya da Montenegro</territory>
+ <territory type="CV">Rasi Verde</territory>
+ <territory type="CZ">Jamhuri ya Czech</territory>
+ <territory type="DE">Udachi</territory>
+ <territory type="DJ">Jibuti</territory>
+ <territory type="DK">Udenmarki</territory>
+ <territory type="DM">Dominika</territory>
+ <territory type="DO">Jamhuri ya Dominikan</territory>
+ <territory type="EC">Ekvado</territory>
+ <territory type="EG">Misri</territory>
+ <territory type="ES">Uhispania</territory>
+ <territory type="ET">Uhabeshi</territory>
+ <territory type="FR">Ufaransa</territory>
+ <territory type="GB">Uingereza</territory>
+ <territory type="GQ">Guinea ya Ikweta</territory>
+ <territory type="HR">Kroatia</territory>
+ <territory type="HU">Hungaria</territory>
+ <territory type="IL">Uyahudi</territory>
+ <territory type="IN">Uhindi</territory>
+ <territory type="IQ">Iraki</territory>
+ <territory type="IR">Uajemi</territory>
+ <territory type="IS">Barafu</territory>
+ <territory type="IT">Uitaliani</territory>
+ <territory type="JM">Jamaika</territory>
+ <territory type="JP">Ujapani</territory>
+ <territory type="KE">Kenya</territory>
+ <territory type="KH">Kampuchea</territory>
+ <territory type="KM">Visiwa vya Komoro</territory>
+ <territory type="KN">Saint Kitts na Nevis</territory>
+ <territory type="KP">Korea ya Kaskazini</territory>
+ <territory type="KR">Korea ya Kusini</territory>
+ <territory type="LU">Luksemburg</territory>
+ <territory type="MA">Moroko</territory>
+ <territory type="MC">Monako</territory>
+ <territory type="MH">Visiwa vya Marshall</territory>
+ <territory type="MX">Meksiko</territory>
+ <territory type="MY">Malasya</territory>
+ <territory type="MZ">Msumbiji</territory>
+ <territory type="NI">Nikaragua</territory>
+ <territory type="NL">Uholanzi</territory>
+ <territory type="NO">Unorwe</territory>
+ <territory type="NP">Nepali</territory>
+ <territory type="PG">Papua Guinea Mpya</territory>
+ <territory type="PH">Filipino</territory>
+ <territory type="PT">Ureno</territory>
+ <territory type="PY">Paragwai</territory>
+ <territory type="RU">Urusi</territory>
+ <territory type="SA">Arabuni Saudi</territory>
+ <territory type="SB">Visiwa vya Solomon</territory>
+ <territory type="SC">Visiwa vya Shelisheli</territory>
+ <territory type="SE">Uswidi</territory>
+ <territory type="SO">Somali</territory>
+ <territory type="ST">Sao Tome na Principe</territory>
+ <territory type="TD">Chadi</territory>
+ <territory type="TL">Timor ya Mashariki</territory>
+ <territory type="TR">Uturuki</territory>
+ <territory type="TT">Trinidad na Tobago</territory>
+ <territory type="TZ">Tanzania</territory>
+ <territory type="US">Muungano wa Nchi za Amerika</territory>
+ <territory type="UY">Urugwai</territory>
+ <territory type="VA">Vatikano</territory>
+ <territory type="VC">Saint Vincent na Grenadines</territory>
+ <territory type="YE">Yemeni</territory>
+ <territory type="ZA">Afrika ya Kusini</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-d {dh} e-n {ng} {ng'} {ny} o p r s {sh} t {th} u-w y z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Jan</month>
+ <month type="2">Feb</month>
+ <month type="3" draft="unconfirmed">Mar</month>
+ <month type="4">Apr</month>
+ <month type="5">Mei</month>
+ <month type="6">Jun</month>
+ <month type="7">Jul</month>
+ <month type="8">Ago</month>
+ <month type="9">Sep</month>
+ <month type="10">Okt</month>
+ <month type="11">Nov</month>
+ <month type="12">Des</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Januari</month>
+ <month type="2">Februari</month>
+ <month type="3">Machi</month>
+ <month type="4">Aprili</month>
+ <month type="5">Mei</month>
+ <month type="6">Juni</month>
+ <month type="7">Julai</month>
+ <month type="8">Agosti</month>
+ <month type="9">Septemba</month>
+ <month type="10">Oktoba</month>
+ <month type="11">Novemba</month>
+ <month type="12">Desemba</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Jpi</day>
+ <day type="mon">Jtt</day>
+ <day type="tue">Jnn</day>
+ <day type="wed">Jtn</day>
+ <day type="thu">Alh</day>
+ <day type="fri" draft="unconfirmed">Iju</day>
+ <day type="sat" draft="unconfirmed">Jmo</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Jumapili</day>
+ <day type="mon">Jumatatu</day>
+ <day type="tue">Jumanne</day>
+ <day type="wed">Jumatano</day>
+ <day type="thu">Alhamisi</day>
+ <day type="fri">Ijumaa</day>
+ <day type="sat">Jumamosi</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">R1</quarter>
+ <quarter type="2" draft="unconfirmed">R2</quarter>
+ <quarter type="3" draft="unconfirmed">R3</quarter>
+ <quarter type="4" draft="unconfirmed">R4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">robo ya kwanza</quarter>
+ <quarter type="2" draft="unconfirmed">robo ya pili</quarter>
+ <quarter type="3" draft="unconfirmed">robo ya tatu</quarter>
+ <quarter type="4" draft="unconfirmed">robo ya nne</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">Kabla ya Kristo</era>
+ <era type="1" draft="unconfirmed">Baada ya Kristo</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">KK</era>
+ <era type="1">BK</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Africa/Nairobi">
+ <long>
+ <standard>Saa za Africa Mashariki</standard>
+ <daylight>Saa za Africa Mashariki</daylight>
+ </long>
+ <short>
+ <standard>EAT</standard>
+ <daylight>EAT</daylight>
+ </short>
+ <exemplarCity>Nairobi</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="KES">
+ <symbol>KSh</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName draft="unconfirmed">Shilingi ya Tanzania</displayName>
+ <symbol>TSh</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/sw_KE.xml b/libs/Zend/Locale/Data/sw_KE.xml
new file mode 100755
index 0000000000..85caff0c27
--- /dev/null
+++ b/libs/Zend/Locale/Data/sw_KE.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="sw"/>
+ <territory type="KE"/>
+ </identity>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/sw_TZ.xml b/libs/Zend/Locale/Data/sw_TZ.xml
new file mode 100755
index 0000000000..0274b0250d
--- /dev/null
+++ b/libs/Zend/Locale/Data/sw_TZ.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.42 $"/>
+ <generation date="$Date: 2006/06/27 18:46:54 $"/>
+ <language type="sw"/>
+ <territory type="TZ"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/syr.xml b/libs/Zend/Locale/Data/syr.xml
new file mode 100755
index 0000000000..c6928b6a73
--- /dev/null
+++ b/libs/Zend/Locale/Data/syr.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.27 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="syr"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="syr" draft="unconfirmed">ܣܘܪÜÜÜ</language>
+ </languages>
+ <territories>
+ <territory type="SY" draft="unconfirmed">ܣܘܪÜÜÜ</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[Ü‘ Ü°-ÝŠ ܃-܉ Ü Ü‚ Ü€ ÜŠ-Ü Ü Ü’-Ü” Ü– Ü• Ü—-ܬ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u070F\u200C \u200D Ü­-ܯ Ý-Ý]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Üܟܢ ÜÜ’</month>
+ <month type="2" draft="unconfirmed">Ü«Ü’Ü›</month>
+ <month type="3" draft="unconfirmed">Üܕܪ</month>
+ <month type="4" draft="unconfirmed">Ü¢Üܣܢ</month>
+ <month type="5" draft="unconfirmed">ÜÜܪ</month>
+ <month type="6" draft="unconfirmed">ܚܙÜܪܢ</month>
+ <month type="7" draft="unconfirmed">ܬܡܘܙ</month>
+ <month type="8" draft="unconfirmed">ÜÜ’</month>
+ <month type="9" draft="unconfirmed">ÜÜܠܘܠ</month>
+ <month type="10" draft="unconfirmed">Üܬܫ ÜÜ</month>
+ <month type="11" draft="unconfirmed">Üܬܫ ÜÜ’</month>
+ <month type="12" draft="unconfirmed">Üܟܢ ÜÜ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="SYP">
+ <symbol draft="unconfirmed">Ù„.س.â€</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/syr_SY.xml b/libs/Zend/Locale/Data/syr_SY.xml
new file mode 100755
index 0000000000..e1ac865cd6
--- /dev/null
+++ b/libs/Zend/Locale/Data/syr_SY.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.31 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="syr"/>
+ <territory type="SY"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd MMMM, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd MMMM, yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM, yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern draft="unconfirmed">#,##0.###;#,##0.###-</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤ #,##0.00;¤ #,##0.00-</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ta.xml b/libs/Zend/Locale/Data/ta.xml
new file mode 100755
index 0000000000..11791c8370
--- /dev/null
+++ b/libs/Zend/Locale/Data/ta.xml
@@ -0,0 +1,454 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.52 $"/>
+ <generation date="$Date: 2006/06/28 06:03:59 $"/>
+ <language type="ta"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">அபாரà¯</language>
+ <language type="ab">அபà¯à®•à®¾à®¸à®¿à®©à¯</language>
+ <language type="af">ஆபà¯à®°à®¿à®•à®©à¯à®¸à¯</language>
+ <language type="am">à®…à®®à¯à®¹à®¾à®°à®¿à®•à¯</language>
+ <language type="ar">அரபà¯</language>
+ <language type="as">அஸà¯à®¸à®¾à®®à®¿</language>
+ <language type="ay">அயமரா</language>
+ <language type="az">அசரà¯à®ªà®¾à®¯à¯à®œà®¾à®©à®¿</language>
+ <language type="ba">பாஷà¯à®•à®¿à®°à¯0</language>
+ <language type="be">பைலோரà¯à®·à¯à®©à¯</language>
+ <language type="bg">பலà¯à®•à¯‡à®°à®¿à®¯à®©à¯</language>
+ <language type="bh">பிஹாரி</language>
+ <language type="bi">பிஸà¯à®²à®¾à®®à®¾</language>
+ <language type="bn">வஙà¯à®•à®¾à®³à®®à¯</language>
+ <language type="bo">திபெதà¯à®¤à¯</language>
+ <language type="br">பிரிடனà¯</language>
+ <language type="ca">காடலானà¯</language>
+ <language type="co">காரà¯à®šà®¿à®¯à®©à¯</language>
+ <language type="cs">செகà¯</language>
+ <language type="cy">வெலà¯à®·à¯</language>
+ <language type="da">டானிஷà¯</language>
+ <language type="de">ஜெரà¯à®®à®©à¯</language>
+ <language type="dz">பà¯à®Ÿà®¾à®©à®¿</language>
+ <language type="el">கிரேகà¯à®•à®®à¯</language>
+ <language type="en">ஆஙà¯à®•à®¿à®²à®®à¯</language>
+ <language type="eo">எஸà¯à®ªà®°à¯‡à®©à¯à®Ÿà¯‹</language>
+ <language type="es">ஸà¯à®ªà¯‡à®©à®¿à®·à¯</language>
+ <language type="et">எஸà¯à®Ÿà¯‹à®©à®¿à®¯à®©à¯</language>
+ <language type="eu">பஸà¯à®•à¯</language>
+ <language type="fa">பரà¯à®¸à®¿à®¯à®©à¯</language>
+ <language type="fi">பினà¯à®©à®¿à®·à¯</language>
+ <language type="fj">பிஜி</language>
+ <language type="fo">பைரோஸி</language>
+ <language type="fr">பிரெஞà¯à®šà¯</language>
+ <language type="fy">பிரிஷியனà¯</language>
+ <language type="ga">à®à®°à®¿à®·à¯</language>
+ <language type="gd">ஸà¯à®•à®¾à®Ÿà¯à®¸à¯ காலெகà¯</language>
+ <language type="gl">கெலிஸியனà¯</language>
+ <language type="gn">கà¯à®°à®¾à®©à®¿</language>
+ <language type="gu">கà¯à®œà®°à®¾à®¤à¯à®¤à®¿</language>
+ <language type="ha">ஹொஸா</language>
+ <language type="he">ஹà¯à®ªà¯à®°à¯</language>
+ <language type="hi">இநà¯à®¤à®¿</language>
+ <language type="hr">கரோஷியனà¯</language>
+ <language type="hu">ஹஙà¯à®•à¯‡à®°à®¿à®¯à®©à¯</language>
+ <language type="hy">ஆரà¯à®®à¯‡à®©à®¿à®¯à®©à¯</language>
+ <language type="ia">இனà¯à®Ÿà®°à¯à®²à®¿à®™à¯à®•à¯à®µà®¾ [ia]</language>
+ <language type="id">இநà¯à®¤à¯‹à®©à¯‡à®·à®¿à®¯à®©à¯</language>
+ <language type="ie">இனà¯à®Ÿà®°à¯à®²à®¿à®™à¯à®•à¯à®µà®¾</language>
+ <language type="ik">இனà¯à®ªà¯†à®•à¯</language>
+ <language type="is">à®à®¸à¯à®²à¯†à®©à¯à®Ÿà®¿à®•à¯</language>
+ <language type="it">இதà¯à®¤à®¾à®²à®¿à®¯à®©à¯</language>
+ <language type="iu">இனà¯à®•à®¿à®Ÿà®Ÿà¯</language>
+ <language type="ja">ஜபà¯à®ªà®¾à®©à¯€à®¸à¯</language>
+ <language type="jv">ஜாவானீஸà¯</language>
+ <language type="ka">கனà¯à®©à®Ÿà®®à¯</language>
+ <language type="kk">கசாகà¯</language>
+ <language type="kl">கிரினà¯à®²à¯†à®©à¯à®Ÿà®¿à®•à¯</language>
+ <language type="km">கமà¯à®ªà¯‹à®Ÿà®¿à®¯à®©à¯</language>
+ <language type="kn">கனà¯à®©à®Ÿà®¾</language>
+ <language type="ko">கொரியனà¯</language>
+ <language type="kok">கொஙà¯à®•à®©à®¿</language>
+ <language type="ks">காஷà¯à®®à®¿à®°à®¿</language>
+ <language type="ku">கà¯à®°à¯à®¤à®¿à®·à¯</language>
+ <language type="ky">கிரà¯à®•à®¿à®·à¯</language>
+ <language type="la">லாதினà¯</language>
+ <language type="ln">லிஙà¯à®•à®¾à®²à®¾</language>
+ <language type="lo">லோதà¯à®¤à®¿à®¯à®©à¯</language>
+ <language type="lt">லà¯à®¤à¯à®¤à¯‡à®©à®¿à®¯à®©à¯</language>
+ <language type="lv">லேடà¯à®µà®¿à®¯à®©à¯ (லேடà¯à®Ÿà®¿à®·à¯)</language>
+ <language type="mg">மலகெஸி</language>
+ <language type="mi">மோரி</language>
+ <language type="mk">மெகà¯à®•à®Ÿà¯‹à®©à®¿à®¯à®©à¯</language>
+ <language type="ml">மலையாளமà¯</language>
+ <language type="mn">மஙà¯à®•à¯‹à®²à®¿à®¯à®©à¯</language>
+ <language type="mo">மோலà¯à®Ÿà¯‡à®µà®¿à®¯à®©à¯</language>
+ <language type="mr">மராதà¯à®¤à®¿</language>
+ <language type="ms">மலாயà¯</language>
+ <language type="mt">மாலà¯à®Ÿà®¿à®¸à¯</language>
+ <language type="my">பரà¯à®®à®¿à®¸à¯</language>
+ <language type="na">நாரூ</language>
+ <language type="ne">நேபà¯à®ªà®¾à®²à®¿</language>
+ <language type="nl">டசà¯à®šà¯</language>
+ <language type="no">நாரà¯à®µà¯‡à®•à®¿à®¯à®©à¯</language>
+ <language type="oc">ஆகிடியனà¯</language>
+ <language type="om">ஒரோம (அபனà¯)</language>
+ <language type="or">ஒரியா</language>
+ <language type="pa">பஞà¯à®šà®¾à®ªà®¿</language>
+ <language type="pl">போலிஷà¯</language>
+ <language type="ps">பேஷà¯à®Ÿà¯‹ (பà¯à®·à¯à®Ÿà¯‹)</language>
+ <language type="pt">போரà¯à®¤à¯à®¤à¯à®•à¯€à®¸à¯</language>
+ <language type="qu">கியà¯à®šà®¾</language>
+ <language type="rm">ரைடà¯à®Ÿà¯‹-ரோமெனà¯à®¸à¯</language>
+ <language type="rn">கிரà¯à®¨à¯à®¤à®¿</language>
+ <language type="ro">ரோமேனியனà¯</language>
+ <language type="ru">ரஷியனà¯</language>
+ <language type="rw">கினà¯à®¯à®°à¯à®µà¯†à®©à¯à®Ÿà®¾</language>
+ <language type="sa">சமஸà¯à®•à®¿à®°à¯à®¤à®®à¯</language>
+ <language type="sd">சிநà¯à®¤à®¿</language>
+ <language type="sg">செனà¯à®•à¯à®°à¯‹</language>
+ <language type="sh">செரà¯à®ªà¯‹-கà¯à®°à¯‹à®·à®¿à®¯à®©à¯</language>
+ <language type="si">சிஙà¯à®•à®³à®®à¯</language>
+ <language type="sk">ஸà¯à®²à¯‹à®µà¯†à®•à¯</language>
+ <language type="sl">ஸà¯à®²à¯‹à®µà®¿à®©à¯‡à®¯à®¿à®©à¯</language>
+ <language type="sm">ஸெமோனà¯</language>
+ <language type="sn">ஷோனா</language>
+ <language type="so">சோமாலி</language>
+ <language type="sq">அலà¯à®ªà¯†à®©à®¿à®¯à®©à¯</language>
+ <language type="sr">சரà¯à®ªà®¿à®¯à®©à¯</language>
+ <language type="ss">ஷிஸà¯à®µà®¾à®¤à®¿</language>
+ <language type="st">ஷெஸà¯à®¸à¯‹à®¤à¯‹</language>
+ <language type="su">சà¯à®Ÿà®¾à®©à¯€à®¸à¯</language>
+ <language type="sv">ஷீவிடிஸà¯</language>
+ <language type="sw">சà¯à®µà®¾à®¹à®¿à®²à®¿</language>
+ <language type="ta">தமிழà¯</language>
+ <language type="te">தெலà¯à®™à¯à®•à¯</language>
+ <language type="tg">தாஜிகà¯</language>
+ <language type="th">தாயà¯</language>
+ <language type="ti">டிகà¯à®°à®¿à®©à¯à®¯à®¾</language>
+ <language type="tk">டரà¯à®•à¯à®®à¯†à®©à¯</language>
+ <language type="tl">டாகாலோகà¯</language>
+ <language type="tn">ஸெடà¯à®¸à¯à®µà®¾à®©à®¾</language>
+ <language type="to">டோஙà¯à®•à®¾</language>
+ <language type="tr">டரà¯à®•à®¿à®·à¯</language>
+ <language type="ts">ஸோஙà¯à®•à®¾</language>
+ <language type="tt">டாடரà¯</language>
+ <language type="tw">தà¯à®¤à®¿à®µà®¿</language>
+ <language type="ug">யà¯à®•à¯à®°à¯</language>
+ <language type="uk">உகà¯à®°à¯‡à®©à®¿à®¯à®©à¯</language>
+ <language type="ur">உரà¯à®¤à¯</language>
+ <language type="uz">உஸà¯à®ªà¯†à®•à¯</language>
+ <language type="vi">வியடà¯à®¨à®¾à®®à®¿à®¸à¯</language>
+ <language type="vo">ஒலபà¯à®•à¯</language>
+ <language type="wo">ஒலோபà¯</language>
+ <language type="xh">ஹோஷா</language>
+ <language type="yi">ஈதà¯à®¤à®¿à®·</language>
+ <language type="yo">யோரà¯à®ªà¯à®ªà®¾</language>
+ <language type="za">ஜà¯à®µà®¾à®™à¯</language>
+ <language type="zh">சீனமà¯</language>
+ <language type="zu">ஜூலூ</language>
+ </languages>
+ <territories>
+ <territory type="AD">அனà¯à®Ÿà¯‹à®°à®¾</territory>
+ <territory type="AE">à®à®•à¯à®•à®¿à®¯ அரப௠கூடà¯à®Ÿà®¾à®Ÿà¯à®šà®¿</territory>
+ <territory type="AF">ஆபà¯à®•à®¾à®©à®¿à®¸à¯à®¤à®¾à®©à¯</territory>
+ <territory type="AG">ஆனà¯à®Ÿà®¿à®•à¯à®µà®¾ பாரà¯à®ªà¯à®Ÿà®¾</territory>
+ <territory type="AL">அலà¯à®ªà¯‡à®©à®¿à®¯à®¾</territory>
+ <territory type="AM">ஆரà¯à®®à¯€à®©à®¿à®¯à®¾</territory>
+ <territory type="AO">à®…à®™à¯à®•à¯‹à®²à®¾</territory>
+ <territory type="AR">à®…à®°à¯à®œà¯†à®£à¯à®Ÿà®¿à®©à®¾</territory>
+ <territory type="AT">ஆஸà¯à®¤à®¿à®°à®¿à®¯à®¾</territory>
+ <territory type="AU">ஆஸà¯à®¤à®¿à®°à¯‡à®²à®¿à®¯à®¾</territory>
+ <territory type="AZ">அஜரà¯à®ªà¯ˆà®œà®¾à®©à¯</territory>
+ <territory type="BA">போஸà¯à®©à®¿à®¯à®¾ ஹெரà¯à®¸à®¿à®•à¯‹à®µà®¿à®©à®¾</territory>
+ <territory type="BB">பாரà¯à®ªà®Ÿà¯‹à®¸à¯</territory>
+ <territory type="BD">பஙà¯à®•à®³à®¾à®¤à¯‡à®·à¯</territory>
+ <territory type="BE">பெலà¯à®œà®¿à®¯à®®à¯</territory>
+ <territory type="BF">பரà¯à®•à®¿à®©à¯‹ பாஸோ</territory>
+ <territory type="BG">பலà¯à®•à¯‡à®°à®¿à®¯à®¾</territory>
+ <territory type="BH">பஹà¯à®°à¯ˆà®©à¯</territory>
+ <territory type="BI">பà¯à®°à¯à®£à¯à®Ÿà®¿</territory>
+ <territory type="BJ">பெனினà¯</territory>
+ <territory type="BN">பà¯à®°à¯‚னேயà¯</territory>
+ <territory type="BO">பொலிவியா</territory>
+ <territory type="BR">பிரேஸிலà¯</territory>
+ <territory type="BS">பஹாமாஸà¯</territory>
+ <territory type="BT">பூடானà¯</territory>
+ <territory type="BW">போடà¯à®¸à¯à®µà®¾à®©à®¾</territory>
+ <territory type="BY">பெலாரூஸà¯</territory>
+ <territory type="BZ">பெலிஸà¯</territory>
+ <territory type="CA">கனடா</territory>
+ <territory type="CF">மதà¯à®¤à®¿à®¯ ஆபà¯à®°à®¿à®•à¯à®•à®•à¯ கà¯à®Ÿà®¿à®¯à®°à®šà¯</territory>
+ <territory type="CG">காஙà¯à®•à¯‹</territory>
+ <territory type="CH">ஸà¯à®µà®¿à®Ÿà¯à®šà®°à¯à®²à®¾à®¨à¯à®¤à¯</territory>
+ <territory type="CI">à®à®µà®°à®¿ கோஸà¯à®Ÿà¯</territory>
+ <territory type="CL">சிலி</territory>
+ <territory type="CM">கேமரூனà¯</territory>
+ <territory type="CN">சீன</territory>
+ <territory type="CO">கொலமà¯à®ªà®¿à®¯à®¾</territory>
+ <territory type="CR">கோஸà¯à®Ÿà®¾à®°à®¿à®•à®¾</territory>
+ <territory type="CU">கியூபா</territory>
+ <territory type="CV">கேப௠வெரà¯à®Ÿà¯‡</territory>
+ <territory type="CY">சைபà¯à®°à®¸à¯</territory>
+ <territory type="CZ">செக௠கà¯à®Ÿà®¿à®¯à®°à®šà¯</territory>
+ <territory type="DE">ஜெரà¯à®®à®©à¯</territory>
+ <territory type="DJ">ஜிபௌடி</territory>
+ <territory type="DK">டெனà¯à®®à®¾à®°à¯à®•à¯</territory>
+ <territory type="DM">டொமினிகா</territory>
+ <territory type="DO">டொமினிகன௠கà¯à®Ÿà®¿à®¯à®°à®šà¯</territory>
+ <territory type="DZ">அலà¯à®œà¯€à®°à®¿à®¯à®¾</territory>
+ <territory type="EC">ஈகà¯à®µà®Ÿà®¾à®°à¯</territory>
+ <territory type="EE">எஸà¯à®Ÿà¯‹à®©à®¿à®¯à®¾</territory>
+ <territory type="EG">எகிபà¯à®¤à¯</territory>
+ <territory type="ES">ஸà¯à®ªà¯†à®¯à®¿à®©à¯</territory>
+ <territory type="ET">எதியோபà¯à®ªà®¿à®¯à®¾</territory>
+ <territory type="FI">பினà¯à®²à®¾à®¨à¯à®¤à¯</territory>
+ <territory type="FJ">பிஜி</territory>
+ <territory type="FR">பிரானà¯à®¸à¯</territory>
+ <territory type="GA">காபோனà¯</territory>
+ <territory type="GB">பிரிடிஷ௠கூடà¯à®Ÿà®°à®šà¯</territory>
+ <territory type="GD">கிரனெடா</territory>
+ <territory type="GE">ஜாரà¯à®œà®¿à®¯à®¾</territory>
+ <territory type="GH">கானா</territory>
+ <territory type="GM">காமà¯à®ªà®¿à®¯à®¾</territory>
+ <territory type="GN">கினி</territory>
+ <territory type="GQ">ஈகà¯à®•à¯à®µà®¿à®Ÿà¯‹à®°à®¿à®¯à®²à¯ கினி</territory>
+ <territory type="GR">கிரீஸà¯</territory>
+ <territory type="GT">கà¯à®µà®¾à®¤à¯à®¤à®¾à®®à®¾à®²à®¾</territory>
+ <territory type="GW">கினி-பிஸà¯à®¸à®¾à®µà¯</territory>
+ <territory type="GY">கயானா</territory>
+ <territory type="HN">ஹாணà¯à®Ÿà¯à®°à®¾à®¸à¯</territory>
+ <territory type="HR">கà¯à®°à¯‹à®šà®¿à®¯à®¾</territory>
+ <territory type="HT">ஹெயà¯à®¤à®¿</territory>
+ <territory type="HU">ஹஙà¯à®•à¯‡à®°à®¿</territory>
+ <territory type="ID">இநà¯à®¤à¯‹à®©à¯‡à®·à®¿à®¯à®¾</territory>
+ <territory type="IE">அயரà¯à®²à®¾à®¨à¯à®¤à¯</territory>
+ <territory type="IL">இஸà¯à®°à¯‡à®²à¯</territory>
+ <territory type="IN">இநà¯à®¤à®¿à®¯à®¾</territory>
+ <territory type="IQ">இராகà¯</territory>
+ <territory type="IR">ஈரானà¯</territory>
+ <territory type="IS">à®à®¸à¯à®²à®¾à®¨à¯à®¤à¯</territory>
+ <territory type="IT">இதà¯à®¤à®¾à®²à®¿</territory>
+ <territory type="JM">ஜமாயà¯à®•à¯à®•à®¾</territory>
+ <territory type="JO">ஜொரà¯à®Ÿà®¾à®©à¯</territory>
+ <territory type="JP">ஜபà¯à®ªà®¾à®©à¯</territory>
+ <territory type="KE">கெனà¯à®¯à®¾</territory>
+ <territory type="KG">கிரà¯à®•à®¿à®¸à¯à®¤à®¾à®©à¯</territory>
+ <territory type="KH">கமà¯à®ªà¯‹à®Ÿà®¿à®¯à®¾</territory>
+ <territory type="KI">கிரிபடி</territory>
+ <territory type="KM">கோமரோஸà¯</territory>
+ <territory type="KP">வட கொரியா</territory>
+ <territory type="KR">தென௠கொரியா</territory>
+ <territory type="KW">கà¯à®µà¯ˆà®¤à¯à®¤à¯</territory>
+ <territory type="KZ">கஜகஸà¯à®¤à®¾à®©à¯</territory>
+ <territory type="LA">லாவோஸà¯</territory>
+ <territory type="LB">லெபனானà¯</territory>
+ <territory type="LI">லிசà¯à®Ÿà¯†à®£à¯à®¸à¯à®Ÿà¯€à®©à¯</territory>
+ <territory type="LK">இலஙà¯à®•à¯ˆ</territory>
+ <territory type="LR">லைபீரியா</territory>
+ <territory type="LS">லெசோதோ</territory>
+ <territory type="LT">லிதà¯à®µà¯‡à®©à®¿à®¯à®¾</territory>
+ <territory type="LU">லகà¯à®¸à¯à®šà®®à¯à®ªà®°à¯à®•à¯</territory>
+ <territory type="LV">லாடà¯à®µà®¿à®¯à®¾</territory>
+ <territory type="LY">லிபà¯à®¯à®¾</territory>
+ <territory type="MA">மொரோகà¯à®•à¯‹</territory>
+ <territory type="MC">மொனாகà¯à®•à¯‹</territory>
+ <territory type="MD">மாலà¯à®Ÿà¯‹à®µà®¾</territory>
+ <territory type="MK">மசெடோணியா</territory>
+ <territory type="ML">மாலீ</territory>
+ <territory type="MM">மியானà¯à®®à®¾à®°à¯</territory>
+ <territory type="MN">மஙà¯à®•à¯‹à®²à®¿à®¯à®¾</territory>
+ <territory type="MT">மாலà¯à®Ÿà®¾</territory>
+ <territory type="MV">மாலதà¯à®¤à¯€à®µà¯</territory>
+ <territory type="MW">மலாவீ</territory>
+ <territory type="MX">மெகà¯à®šà®¿à®•à¯‹</territory>
+ <territory type="MY">மலேஷியா</territory>
+ <territory type="NA">னாமீபியா</territory>
+ <territory type="NI">நிகாராகà¯à®µà®¾</territory>
+ <territory type="NL">நெதரà¯à®²à®¾à®¨à¯à®¤à¯</territory>
+ <territory type="NO">நாரà¯à®µà¯‡</territory>
+ <territory type="NP">நேபாளமà¯</territory>
+ <territory type="NR">நௌரà¯</territory>
+ <territory type="NZ">நியூசிலாநà¯à®¤à¯</territory>
+ <territory type="OM">ஓமானà¯</territory>
+ <territory type="PA">பணாமா</territory>
+ <territory type="PE">பெரà¯</territory>
+ <territory type="PG">பாபà¯à®ªà¯à®µà®¾-நியூகினி</territory>
+ <territory type="PH">பிலிபà¯à®ªà¯ˆà®©à¯à®¸à¯</territory>
+ <territory type="PK">பாகிஸà¯à®¤à®¾à®©à¯</territory>
+ <territory type="PL">போலநà¯à®¤à¯</territory>
+ <territory type="PT">போரà¯à®šà¯à®šà¯à®•à¯à®•à®²à¯</territory>
+ <territory type="PY">பாரகà¯à®µà¯‡</territory>
+ <territory type="QA">காடாரà¯</territory>
+ <territory type="RO">à®°à¯à®®à¯‡à®©à®¿à®¯à®¾</territory>
+ <territory type="RU">à®°à®·à¯à®¯à®¾</territory>
+ <territory type="SA">சவூதி அரேபியா</territory>
+ <territory type="SB">சாலமன௠தீவà¯à®•à®³à¯</territory>
+ <territory type="SE">ஸà¯à®µà¯€à®Ÿà®©à¯</territory>
+ <territory type="SG">சிஙà¯à®•à®ªà¯à®ªà¯‚à®°à¯</territory>
+ <territory type="SI">ஸà¯à®²à¯‹à®µà¯‡à®©à®¿à®¯à®¾</territory>
+ <territory type="SK">ஸà¯à®²à¯‹à®µà®¾à®•à®¿à®¯à®¾</territory>
+ <territory type="SM">சானà¯à®®à¯†à®°à®¿à®©à¯‹</territory>
+ <territory type="SR">சூரினாமà¯</territory>
+ <territory type="SV">எல௠சாலà¯à®µà®Ÿà®¾à®°à¯</territory>
+ <territory type="SY">சிரியா</territory>
+ <territory type="TD">சாடà¯</territory>
+ <territory type="TH">தாயà¯à®²à®¾à®¨à¯à®¤à¯</territory>
+ <territory type="TJ">தாஜிகிஸà¯à®¤à®¾à®©à¯</territory>
+ <territory type="TM">தà¯à®°à¯à®•à¯à®®à¯†à®©à®¿à®¸à¯à®¤à®¾à®©à¯</territory>
+ <territory type="TN">தà¯à®©à®¿à®šà®¿à®¯à®¾</territory>
+ <territory type="TO">தொஙà¯à®•à®¾</territory>
+ <territory type="TR">தà¯à®°à¯à®•à¯à®•à®¿</territory>
+ <territory type="TT">திரினிடாட௠தொபாகோ</territory>
+ <territory type="TV">தà¯à®µà®¾à®²à¯‚</territory>
+ <territory type="TW">தைவானà¯</territory>
+ <territory type="UA">உகà¯à®°à¯ˆà®©à¯</territory>
+ <territory type="US">à®à®•à¯à®•à®¿à®¯ அமெரிகà¯à®•à®¾ கà¯à®Ÿà®¿à®¯à®°à®šà¯</territory>
+ <territory type="UY">உரà¯à®•à¯à®µà¯‡</territory>
+ <territory type="UZ">உஸà¯à®ªà¯†à®•à®¿à®¸à¯à®¤à®¾à®©à¯</territory>
+ <territory type="VA">வாடிகனà¯</territory>
+ <territory type="VE">வெனஜà¯à®µà¯‡à®²à®¾</territory>
+ <territory type="VN">வியடà¯à®¨à®¾à®®à¯</territory>
+ <territory type="VU">வனà¯à®µà®¾à®Ÿà¯à®Ÿà¯</territory>
+ <territory type="WS">சமோவா</territory>
+ <territory type="YE">யேமனà¯</territory>
+ <territory type="ZA">தென௠ஆபà¯à®°à®¿à®•à¯à®•à®¾</territory>
+ <territory type="ZW">ஜிமà¯à®ªà®¾à®ªà¯à®µà¯‡</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters references="RP1">[ஃ à®…-ஊ எ-à® à®’-க à®™ ச ஜ ஞ ட ண த ந-ப à®®-வ à®·-ஹ ா-ூ ெ-ை ொ-à¯]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">ஜன.</month>
+ <month type="2">பிபà¯.</month>
+ <month type="3">மாரà¯.</month>
+ <month type="4">à®à®ªà¯.</month>
+ <month type="5">மே</month>
+ <month type="6">ஜூனà¯</month>
+ <month type="7">ஜூலை</month>
+ <month type="8">ஆக.</month>
+ <month type="9">செபà¯.</month>
+ <month type="10">அகà¯.</month>
+ <month type="11">நவ.</month>
+ <month type="12">டிச.</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">ஜனவரி</month>
+ <month type="2">பிபà¯à®°à®µà®°à®¿</month>
+ <month type="3">மாரà¯à®šà¯</month>
+ <month type="4">à®à®ªà¯à®°à®²à¯</month>
+ <month type="5">மே</month>
+ <month type="6">ஜூனà¯</month>
+ <month type="7">ஜூலை</month>
+ <month type="8">ஆகஸà¯à®Ÿà¯</month>
+ <month type="9">செபà¯à®Ÿà®®à¯à®ªà®°à¯</month>
+ <month type="10">அகà¯à®Ÿà¯‹à®ªà®°à¯</month>
+ <month type="11">நவமà¯à®ªà®°à¯</month>
+ <month type="12">டிசமà¯à®ªà®°à¯</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">ஞா</day>
+ <day type="mon">தி</day>
+ <day type="tue">செ</day>
+ <day type="wed">பà¯</day>
+ <day type="thu">வி</day>
+ <day type="fri">வெ</day>
+ <day type="sat">ச</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">ஞாயிறà¯</day>
+ <day type="mon">திஙà¯à®•à®³à¯</day>
+ <day type="tue">செவà¯à®µà®¾à®¯à¯</day>
+ <day type="wed">பà¯à®¤à®©à¯</day>
+ <day type="thu">வியாழனà¯</day>
+ <day type="fri">வெளà¯à®³à®¿</day>
+ <day type="sat">சனி</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">வநà¯à®¨à¯§ 1</quarter>
+ <quarter type="2" draft="unconfirmed">ரெஂட௨ 2</quarter>
+ <quarter type="3" draft="unconfirmed">மூடà¯à¯© 3</quarter>
+ <quarter type="4" draft="unconfirmed">நாலà¯à¯ª 4</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>காலை</am>
+ <pm>மாலை</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">வரà¯à®·à³.</era>
+ <era type="1" draft="unconfirmed">ஸநà¯.</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">கிமà¯</era>
+ <era type="1">கிபி</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Asia/Calcutta">
+ <long>
+ <standard>இநà¯à®¤à®¿à®¯ நேரபà¯à®ªà®Ÿà®¿</standard>
+ <daylight>இநà¯à®¤à®¿à®¯ நேரபà¯à®ªà®Ÿà®¿</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IST</daylight>
+ </short>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="INR">
+ <symbol>ரூ</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">ஆமà¯</yesstr>
+ <nostr draft="unconfirmed">இலà¯à®²à¯ˆ</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1">Unicode Standard 4.0</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ta_IN.xml b/libs/Zend/Locale/Data/ta_IN.xml
new file mode 100755
index 0000000000..3716241c92
--- /dev/null
+++ b/libs/Zend/Locale/Data/ta_IN.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.47 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ta"/>
+ <territory type="IN"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">'</quotationStart>
+ <quotationEnd draft="unconfirmed">'</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">&quot;</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">&quot;</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d-M-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>
diff --git a/libs/Zend/Locale/Data/te.xml b/libs/Zend/Locale/Data/te.xml
new file mode 100755
index 0000000000..12208b714c
--- /dev/null
+++ b/libs/Zend/Locale/Data/te.xml
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.52 $"/>
+ <generation date="$Date: 2006/06/24 23:27:01 $"/>
+ <language type="te"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar">అరబికà±</language>
+ <language type="de">ఙరà±à°®à°¨à±</language>
+ <language type="en">ఆంగà±à°²à°‚</language>
+ <language type="es">à°¸à±à°ªà°¾à°¨à°¿à°·à±</language>
+ <language type="fr">à°«à±à°°à±†à°‚à°šà±</language>
+ <language type="hi">హిందీ</language>
+ <language type="it">ఇటాలియనౠభాష</language>
+ <language type="ja">జపానౠభాష</language>
+ <language type="pt">పొరà±à°šà±à°—లౠభాష</language>
+ <language type="ru">à°°à°·à±à°¯à°¨à± భాష</language>
+ <language type="te">తెలà±à°—à±</language>
+ <language type="zh">చైనా భాష</language>
+ </languages>
+ <scripts>
+ <script type="Arab">à°…à°°à°¬à±à°¬à°¿ లిపి</script>
+ <script type="Cyrl">సిరిలికౠలిపి</script>
+ <script type="Hans">సరళమైన చైనా లిపి</script>
+ <script type="Hant">à°ªà±à°°à°¾à°šà±€à°¨ చైనా లిపి</script>
+ <script type="Latn">లాటినà±</script>
+ <script type="Telu">తెలà±à°—à±</script>
+ </scripts>
+ <territories>
+ <territory type="BR">à°¬à±à°°à°œà°¿à°²à±</territory>
+ <territory type="CN">చైనా</territory>
+ <territory type="DE">ఙరà±à°®à°¨à°¿</territory>
+ <territory type="FR">à°«à±à°°à°¾à°¨à±à°¸à±â€Œ</territory>
+ <territory type="GB">à°¬à±à°°à°¿à°Ÿà°¨à±</territory>
+ <territory type="IN">భారత దేళం</territory>
+ <territory type="IT">ఇటలి</territory>
+ <territory type="JP">జపాసà±</territory>
+ <territory type="RU">à°°à°·à±à°¯</territory>
+ <territory type="US">à°à°•à±à°¯ రాషà±à°Ÿà±à°° అమెరిక</territory>
+ </territories>
+ <variants>
+ <variant type="1901">à°ªà±à°°à°¾à°šà±€à°¨ ఙరà±à°®à°¨ వరà±à°£à°•à±à°°à°®à°‚</variant>
+ <variant type="1996">1996 ఙరà±à°®à°¨ వరà±à°£à°•à±à°°à°®à°‚</variant>
+ <variant type="REVISED">సవరించబడిన వరà±à°£à°•à±à°°à°®à°‚</variant>
+ </variants>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[à°…-à°‹ à±  à°Œ ౡ à°Ž-à° à°’-à°¨ à°ª-à°³ à°µ-à°¹ à°-à°ƒ à± à°¾-ౄ ె-ై ొ-ౌ ౕ à±–]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D ౦-౯]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">జనవరి</month>
+ <month type="2">à°«à°¿à°¬à±à°°à°µà°°à°¿</month>
+ <month type="3">మారà±à°šà°¿</month>
+ <month type="4">à°à°ªà±à°°à°¿à°²à±</month>
+ <month type="5">మే</month>
+ <month type="6">జూనà±</month>
+ <month type="7">జూలై</month>
+ <month type="8">ఆగసà±à°Ÿà±</month>
+ <month type="9">సెపà±à°Ÿà±†à°‚బరà±</month>
+ <month type="10">à°…à°•à±à°Ÿà±‹à°¬à°°à±</month>
+ <month type="11">నవంబరà±</month>
+ <month type="12">డిసెంబరà±</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">జనవరి</month>
+ <month type="2">à°«à°¿à°¬à±à°°à°µà°°à°¿</month>
+ <month type="3">మారà±à°šà°¿</month>
+ <month type="4">à°à°ªà±à°°à°¿à°²à±</month>
+ <month type="5">మే</month>
+ <month type="6">జూనà±</month>
+ <month type="7">జూలై</month>
+ <month type="8">ఆగసà±à°Ÿà±</month>
+ <month type="9">సెపà±à°Ÿà±†à°‚బరà±</month>
+ <month type="10">à°…à°•à±à°Ÿà±‹à°¬à°°à±</month>
+ <month type="11">నవంబరà±</month>
+ <month type="12">డిసెంబరà±</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">జ</month>
+ <month type="2" draft="unconfirmed">à°«à°¿</month>
+ <month type="3" draft="unconfirmed">à°®</month>
+ <month type="4" draft="unconfirmed">à°Ž</month>
+ <month type="5" draft="unconfirmed">మె</month>
+ <month type="6" draft="unconfirmed">à°œà±</month>
+ <month type="7" draft="unconfirmed">à°œà±</month>
+ <month type="8">à°†</month>
+ <month type="9" draft="unconfirmed">సె</month>
+ <month type="10" draft="unconfirmed">à°…</month>
+ <month type="11" draft="unconfirmed">à°¨</month>
+ <month type="12" draft="unconfirmed">à°¡à°¿</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">ఆది</day>
+ <day type="mon">సోమ</day>
+ <day type="tue">మంగళ</day>
+ <day type="wed">à°¬à±à°§</day>
+ <day type="thu">à°—à±à°°à±</day>
+ <day type="fri">à°¶à±à°•à±à°°</day>
+ <day type="sat">శని</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">ఆదివారం</day>
+ <day type="mon">సోమవారం</day>
+ <day type="tue">మంగళవారం</day>
+ <day type="wed">à°¬à±à°§à°µà°¾à°°à°‚</day>
+ <day type="thu">à°—à±à°°à±à°µà°¾à°°à°‚</day>
+ <day type="fri">à°¶à±à°•à±à°°à°µà°¾à°°à°‚</day>
+ <day type="sat">శనివారం</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">à°†</day>
+ <day type="tue" draft="unconfirmed">సొ</day>
+ <day type="wed" draft="unconfirmed">à°­à±</day>
+ <day type="thu" draft="unconfirmed">à°—à±</day>
+ <day type="fri" draft="unconfirmed">à°¶à±</day>
+ <day type="sat" draft="unconfirmed">à°¶</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1">à°’à°•à°Ÿà°¿ 1</quarter>
+ <quarter type="2">రెండౠ2</quarter>
+ <quarter type="3">మూడౠ3</quarter>
+ <quarter type="4">నాలà±à°—à± 4</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>పూరà±à°µà°¾à°¹à±à°¨à°‚</am>
+ <pm>అపరాహà±à°¨à°‚</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">ఈసాపూరà±à°µ.</era>
+ <era type="1" draft="unconfirmed">సనà±.</era>
+ </eraNames>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <nativeZeroDigit>౦</nativeZeroDigit>
+ </symbols>
+ <currencies>
+ <currency type="BRL">
+ <displayName>à°¬à±à°°à°œà°¿à°²à± దేశ రియాలà±</displayName>
+ <symbol>à°°à°¿$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>చైనా దేశ à°¯à±à°µà°¾à°¨à± రెనà±â€Œà°®à°¿à°¨à±â€Œà°¬à°¿</displayName>
+ <symbol>à°¯à±</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>à°¯à±à°°à±Š</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>à°¬à±à°¿à°Ÿà°¿à°·à± పౌనà±à°¡ à°¸à±à°Ÿà±†à°°à±à°²à°¿à°—à±</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>రూపాయి</displayName>
+ <symbol>రూ.</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>జపానౠదేశ యెసà±</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>à°°à°·à±à°¯ దేశ రూబలà±</displayName>
+ <symbol>రూబలà±</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>à°à°•à±à°¯ రాషà±à°Ÿà±à°° అమెరిక డాలరà±</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">అవనà±</yesstr>
+ <nostr draft="unconfirmed">కాదà±</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/te_IN.xml b/libs/Zend/Locale/Data/te_IN.xml
new file mode 100755
index 0000000000..6805258923
--- /dev/null
+++ b/libs/Zend/Locale/Data/te_IN.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.46 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="te"/>
+ <territory type="IN"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">'</quotationStart>
+ <quotationEnd draft="unconfirmed">'</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">&quot;</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">&quot;</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd-MM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern>#,##,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern>#,##,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤ #,##,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/tg.xml b/libs/Zend/Locale/Data/tg.xml
new file mode 100755
index 0000000000..48710096ec
--- /dev/null
+++ b/libs/Zend/Locale/Data/tg.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.11 $"/>
+ <generation date="$Date: 2006/06/28 01:23:33 $"/>
+ <language type="tg"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="de" references="RP1">ÐемиÑÓ£</language>
+ <language type="en" references="RP1">ÐнглиÑÓ£</language>
+ <language type="fr" references="RP1">ФаронÑавӣ</language>
+ <language type="zh" references="RP1">Чинӣ</language>
+ </languages>
+ <scripts>
+ <script type="Arab">Ðрабӣ</script>
+ </scripts>
+ <territories>
+ <territory type="AF">ÐфғониÑтан</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[а-г Ò“ д е Ñ‘ ж-и Ó£ й к Ò› л-у Ó¯ Ñ„ Ñ… Ò³ ч Ò· ш ÑŠ Ñ-Ñ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[ц щ ы ь]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">«</quotationStart>
+ <quotationEnd draft="unconfirmed">»</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">«</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">„</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Янв</month>
+ <month type="2" draft="unconfirmed">Фев</month>
+ <month type="3" draft="unconfirmed">Мар</month>
+ <month type="4" draft="unconfirmed">Ðпр</month>
+ <month type="5" draft="unconfirmed">Май</month>
+ <month type="6" draft="unconfirmed">Июн</month>
+ <month type="7" draft="unconfirmed">Июл</month>
+ <month type="8" draft="unconfirmed">Ðвг</month>
+ <month type="9" draft="unconfirmed">Сен</month>
+ <month type="10" draft="unconfirmed">Окт</month>
+ <month type="11" draft="unconfirmed">ÐоÑ</month>
+ <month type="12" draft="unconfirmed">Дек</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Январ</month>
+ <month type="2" draft="unconfirmed">Феврал</month>
+ <month type="3" draft="unconfirmed">Март</month>
+ <month type="4" draft="unconfirmed">Ðпрел</month>
+ <month type="5" draft="unconfirmed">Май</month>
+ <month type="6" draft="unconfirmed">Июн</month>
+ <month type="7" draft="unconfirmed">Июл</month>
+ <month type="8" draft="unconfirmed">ÐвгуÑÑ‚</month>
+ <month type="9" draft="unconfirmed">СентÑбр</month>
+ <month type="10" draft="unconfirmed">ОктÑбр</month>
+ <month type="11" draft="unconfirmed">ÐоÑбр</month>
+ <month type="12" draft="unconfirmed">Декабр</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Яшб</day>
+ <day type="mon" draft="unconfirmed">Дшб</day>
+ <day type="tue" draft="unconfirmed">Сшб</day>
+ <day type="wed" draft="unconfirmed">Чшб</day>
+ <day type="thu" draft="unconfirmed">Пшб</day>
+ <day type="fri" draft="unconfirmed">Ҷмъ</day>
+ <day type="sat" draft="unconfirmed">Шнб</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Якшанбе</day>
+ <day type="mon" draft="unconfirmed">Душанбе</day>
+ <day type="tue" draft="unconfirmed">Сешанбе</day>
+ <day type="wed" draft="unconfirmed">Чоршанбе</day>
+ <day type="thu" draft="unconfirmed">Панҷшанбе</day>
+ <day type="fri" draft="unconfirmed">Ҷумъа</day>
+ <day type="sat" draft="unconfirmed">Шанбе</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">пе. чо.</am>
+ <pm draft="unconfirmed">па. чо.</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">Пеш аз милод</era>
+ <era type="1" draft="unconfirmed">ПаМ</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">ПеМ</era>
+ <era type="1" draft="unconfirmed">ПаМ</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="TJS">
+ <displayName draft="unconfirmed">Сомонӣ</displayName>
+ <symbol draft="unconfirmed">Ñом</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1">Фарҳанги ÐнглиÑÓ£-Тоҷикӣ (Ҷамшедов &amp; Розӣ)</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/tg_TJ.xml b/libs/Zend/Locale/Data/tg_TJ.xml
new file mode 100755
index 0000000000..544eb65d29
--- /dev/null
+++ b/libs/Zend/Locale/Data/tg_TJ.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="tg"/>
+ <territory type="TJ"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/th.xml b/libs/Zend/Locale/Data/th.xml
new file mode 100755
index 0000000000..a44cfa1b55
--- /dev/null
+++ b/libs/Zend/Locale/Data/th.xml
@@ -0,0 +1,2504 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.75 $"/>
+ <generation date="$Date: 2006/10/26 22:46:09 $"/>
+ <language type="th"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">อาฟา</language>
+ <language type="ab">à¹à¸­à¸šà¸à¸²à¹€à¸‹à¸µà¸¢</language>
+ <language type="ace">อาเจะห์</language>
+ <language type="ach">อาโคลิ</language>
+ <language type="ada">อาดางมี</language>
+ <language type="ady">อะดีเà¸à¸¢à¸²</language>
+ <language type="af">à¹à¸­à¸Ÿà¸£à¸´à¸à¸±à¸™</language>
+ <language type="afa">อาฟโร-เอเชียติà¸</language>
+ <language type="afh">อาฟริฮิลิ</language>
+ <language type="ain">ไอนุ</language>
+ <language type="ak">อาคาน</language>
+ <language type="akk">อัคคาเดียน</language>
+ <language type="ale">อลิอุต</language>
+ <language type="alg">ภาษาอาลงเควียน</language>
+ <language type="alt">อัลไตใต้</language>
+ <language type="am">อัมฮาริค</language>
+ <language type="an">อาราโà¸à¸™à¸´à¸ª</language>
+ <language type="ang">อังà¸à¸¤à¸©à¹‚บราณ (ค.ศ.450-1100)</language>
+ <language type="apa">ภาษาอาปาเช่</language>
+ <language type="ar" draft="provisional">อารบิà¸</language>
+ <language type="arc">อารามาอิค</language>
+ <language type="arn">อาราคาเนียน</language>
+ <language type="arp">อาราพาโฮ</language>
+ <language type="art">ภาษาประดิษà¸à¹Œ (อื่นๆ)</language>
+ <language type="arw">อาราวัà¸</language>
+ <language type="as">อัสสัมมิส</language>
+ <language type="ast">อัสเตอเรียน</language>
+ <language type="ath">ภาษาอาธาพาสà¸à¸²à¸™</language>
+ <language type="aus">ภาษาออสเตรเลีย</language>
+ <language type="av">อาวาริà¸</language>
+ <language type="awa">อาวาดิ</language>
+ <language type="ay">ไอมารา</language>
+ <language type="az">อาเซอร์ไบจานี</language>
+ <language type="ba">บาสช์à¸à¸µà¸£à¹Œ</language>
+ <language type="bad">บันดา</language>
+ <language type="bai">ภาษาบามิเลค</language>
+ <language type="bal">บาลูชิ</language>
+ <language type="ban">บาหลี</language>
+ <language type="bas">บาสา</language>
+ <language type="bat">บัลทิภ(อื่นๆ)</language>
+ <language type="be">บายโลรัสเซีย</language>
+ <language type="bej">เบจา</language>
+ <language type="bem">เบมบา</language>
+ <language type="ber">เบอร์เบอร์</language>
+ <language type="bg">บัลà¹à¸à¹€à¸£à¸µà¸¢</language>
+ <language type="bh">บิฮารี</language>
+ <language type="bho">โบจพูริ</language>
+ <language type="bi">บิสลามา</language>
+ <language type="bik">บิà¸à¸¥</language>
+ <language type="bin">บินิ</language>
+ <language type="bla">สิà¸à¸ªà¸´à¸à¸²</language>
+ <language type="bm">บามบารา</language>
+ <language type="bn" draft="provisional">เบงà¸à¸²à¸¥à¸µ</language>
+ <language type="bnt">บันทุ</language>
+ <language type="bo">ทิเบต</language>
+ <language type="br">บรีทัน</language>
+ <language type="bra">บราจ</language>
+ <language type="bs">บอสเนีย</language>
+ <language type="btk">บาทัค</language>
+ <language type="bua">บูเรียต</language>
+ <language type="bug">บูà¸à¸µà¸™à¸´à¸ª</language>
+ <language type="byn">บลิน</language>
+ <language type="ca">à¹à¸„ตาà¹à¸¥à¸™</language>
+ <language type="cad">คัดโด</language>
+ <language type="cai">อินเดียอเมริà¸à¸²à¸à¸¥à¸²à¸‡(อื่นๆ)</language>
+ <language type="car">คาริบ</language>
+ <language type="cau">คอเคเซียน (อื่นๆ)</language>
+ <language type="ce">เชเชิน</language>
+ <language type="ceb">เคบัวโน</language>
+ <language type="cel">เซลติà¸</language>
+ <language type="chb">ชิบชา</language>
+ <language type="chg">ชาà¸à¸²à¹„ท</language>
+ <language type="chk">ชูà¸à¸´à¸ª</language>
+ <language type="chm">มาริ</language>
+ <language type="chn">ชินุคจาร์à¸à¸­à¸™</language>
+ <language type="cho">ชอà¸à¸—าว</language>
+ <language type="chp">ชิเพวยัน</language>
+ <language type="chr">เชอโรà¸à¸µ</language>
+ <language type="chy">เชเยน</language>
+ <language type="cmc">ภาษาชามิà¸</language>
+ <language type="co">คอร์ซิà¸à¸²</language>
+ <language type="cop">คอปทิà¸</language>
+ <language type="cpe">ครีโอเลสà¹à¸¥à¸°à¸žà¸´à¸à¸à¸´à¸™à¸ªà¹Œà¸—ี่มาจาà¸à¸­à¸±à¸‡à¸à¸¤à¸©à¸­à¸·à¹ˆà¸™à¹†</language>
+ <language type="cpf">ครีโอเลสà¹à¸¥à¸°à¸žà¸´à¸à¸à¸´à¸™à¸ªà¹Œà¸—ี่มาจาà¸à¸à¸£à¸±à¹ˆà¸‡à¹€à¸¨à¸ªà¸­à¸·à¹ˆà¸™à¹†</language>
+ <language type="cpp">ครีโอเลสà¹à¸¥à¸°à¸žà¸´à¸à¸à¸´à¸™à¸ªà¹Œà¸—ี่มาจาà¸à¹‚ปรตุเà¸à¸ªà¸­à¸·à¹ˆà¸™à¹†</language>
+ <language type="cr">ครี</language>
+ <language type="crh">ครีมีนเตอร์à¸à¸µ</language>
+ <language type="crp">ครีโอเลสà¹à¸¥à¸°à¸žà¸´à¸à¸à¸´à¸™à¸ªà¹Œ (อื่นๆ)</language>
+ <language type="cs" references="RP3">เช็à¸</language>
+ <language type="csb">คาซูเบียน</language>
+ <language type="cu">เชอร์ชสลาวิà¸</language>
+ <language type="cus">คูชิทิภ(อื่นๆ)</language>
+ <language type="cv">ชูวาส</language>
+ <language type="cy">เวลส์</language>
+ <language type="da">เดนมาร์à¸</language>
+ <language type="dak">ดาโà¸à¸—า</language>
+ <language type="dar">ดาร์จวา</language>
+ <language type="day">ดายัà¸</language>
+ <language type="de">เยอรมัน</language>
+ <language type="del">เดลาวารี</language>
+ <language type="den">สลาฟ</language>
+ <language type="dgr">ดอจริบ</language>
+ <language type="din">ดินà¸à¸²</language>
+ <language type="doi">ดอจริ</language>
+ <language type="dra">ดราวิเดียน (อื่นๆ)</language>
+ <language type="dua">ดัวลา</language>
+ <language type="dum">ดัทช์à¸à¸¥à¸²à¸‡</language>
+ <language type="dv">ดิเวฮิ</language>
+ <language type="dyu">ดิวลา</language>
+ <language type="dz">ดซองคา</language>
+ <language type="ee">อีเว</language>
+ <language type="efi">อีฟิà¸</language>
+ <language type="egy">อียิปต์โบราณ</language>
+ <language type="eka">อีà¸à¸²à¸ˆà¸±à¸</language>
+ <language type="el">à¸à¸£à¸µà¸</language>
+ <language type="elx">อีลามิท</language>
+ <language type="en">อังà¸à¸¤à¸©</language>
+ <language type="enm">อังà¸à¸¤à¸©à¸à¸¥à¸²à¸‡</language>
+ <language type="eo">เอสเปอรันโต</language>
+ <language type="es">สเปน</language>
+ <language type="et">เอสโตเนีย</language>
+ <language type="eu">à¹à¸šà¸ªà¸à¹Œ</language>
+ <language type="ewo">อีวานโด</language>
+ <language type="fa">เปอร์เซีย</language>
+ <language type="fan">ฟาง</language>
+ <language type="fat">ฟันทิ</language>
+ <language type="ff">ฟูลาฮ์</language>
+ <language type="fi">ฟิน</language>
+ <language type="fil">ฟิลิปปินส์</language>
+ <language type="fiu">ฟินโน-อัà¸à¹€à¸£à¸µà¸¢à¸™</language>
+ <language type="fj">ฟิจิ</language>
+ <language type="fo">ฟาโรส</language>
+ <language type="fon">ฟอน</language>
+ <language type="fr">à¸à¸£à¸±à¹ˆà¸‡à¹€à¸¨à¸ª</language>
+ <language type="frm">à¸à¸£à¸±à¹ˆà¸‡à¹€à¸¨à¸ªà¸à¸¥à¸²à¸‡</language>
+ <language type="fro">à¸à¸£à¸±à¹ˆà¸‡à¹€à¸¨à¸ªà¹‚บราณ</language>
+ <language type="fur">เฟรียเลียน</language>
+ <language type="fy">ฟรีสà¹à¸¥à¸™à¸”์</language>
+ <language type="ga">ไอริช</language>
+ <language type="gaa">à¸à¸²</language>
+ <language type="gay">à¸à¸²à¹‚ย</language>
+ <language type="gba">à¸à¸šà¸²à¸¢à¸²</language>
+ <language type="gd">สà¸à¹‡à¸­à¸•à¸ªà¹Œà¹€à¸à¸¥à¸´à¸„</language>
+ <language type="gem">เยอรมัน (อื่นๆ)</language>
+ <language type="gez">à¸à¸µà¸‹</language>
+ <language type="gil">à¸à¸´à¸¥à¹€à¸šà¸­à¸£à¹Œà¸—ิส</language>
+ <language type="gl">à¸à¸°à¸¥à¸µà¹€à¸Šà¸µà¸¢</language>
+ <language type="gmh">เยอรมันสูงà¸à¸¥à¸²à¸‡</language>
+ <language type="gn">à¸à¸±à¸§à¸£à¸²à¸™à¸µ</language>
+ <language type="goh">เยอรมันสูงโบราณ</language>
+ <language type="gon">à¸à¸­à¸™à¸”ิ</language>
+ <language type="gor">à¸à¸­à¸£à¸­à¸™à¸—าโล</language>
+ <language type="got">โà¸à¸˜à¸´à¸</language>
+ <language type="grb">à¸à¸£à¸µà¹‚บ</language>
+ <language type="grc">à¸à¸£à¸µà¸à¹‚บราณ</language>
+ <language type="gu">à¸à¸¹à¸ˆà¸²à¸£à¸²à¸•à¸´</language>
+ <language type="gv">มานซ์</language>
+ <language type="gwi">à¸à¸§à¸´à¸Šà¸­à¸´à¸™</language>
+ <language type="ha">โฮซา</language>
+ <language type="hai">ไฮดา</language>
+ <language type="haw">ฮาวาย</language>
+ <language type="he">ฮิบรู</language>
+ <language type="hi">ฮินดี</language>
+ <language type="hil">ไฮลิเà¸à¸™à¸­à¸™</language>
+ <language type="him">ฮิมาชาลิ</language>
+ <language type="hit">ฮิตทิต</language>
+ <language type="hmn">ฮมอง</language>
+ <language type="ho">ฮิริโมทุ</language>
+ <language type="hr">โครเอเทีย</language>
+ <language type="hsb">ซอร์เบียนบน</language>
+ <language type="ht">ไฮเทียน</language>
+ <language type="hu">ฮังà¸à¸²à¸£à¸µ</language>
+ <language type="hup">ฮูพา</language>
+ <language type="hy">อาร์มีเนีย</language>
+ <language type="hz">เฮียร์โร</language>
+ <language type="ia" references="RP2">ภาษาà¸à¸¥à¸²à¸‡à¸—ี่ใช้ในà¸à¸²à¸£à¸ªà¸·à¹ˆà¸­à¸ªà¸²à¸£à¸£à¸°à¸«à¸§à¹ˆà¸²à¸‡à¸›à¸£à¸°à¹€à¸—ศ</language>
+ <language type="iba">อิบาน</language>
+ <language type="id">อินโดนีเชีย</language>
+ <language type="ie">อินเตอร์ลิงค์</language>
+ <language type="ig">อิà¸à¹‚บ</language>
+ <language type="ii">สิชวนยิ</language>
+ <language type="ijo">อิโจ</language>
+ <language type="ik">ไอนูเปียà¸</language>
+ <language type="ilo">อิโลโà¸</language>
+ <language type="inc">อินดิภ(อื่นๆ)</language>
+ <language type="ine">อินโดยูโรเปียน (อื่นๆ)</language>
+ <language type="inh">อินà¸à¸¸à¸ª</language>
+ <language type="io">อิโด</language>
+ <language type="ira">อิหร่าน</language>
+ <language type="iro">ภาษาอิโรà¸à¸±à¸§à¹€à¸­à¸µà¸¢à¸™</language>
+ <language type="is">ไอซ์à¹à¸¥à¸™à¸”์ดิค</language>
+ <language type="it">อิตาลี</language>
+ <language type="iu">ไอนุà¸à¸•à¸´à¸•à¸±à¸—</language>
+ <language type="ja">à¸à¸µà¹ˆà¸›à¸¸à¹ˆà¸™</language>
+ <language type="jbo">โลจบัน</language>
+ <language type="jpr">จูดี-เปอร์เซีย</language>
+ <language type="jrb">จูดี-อาราบิà¸</language>
+ <language type="jv">ชวา</language>
+ <language type="ka">จอร์เจียน</language>
+ <language type="kaa">à¸à¸²à¸£à¸²-à¸à¸²à¸¥à¸žà¸²à¸</language>
+ <language type="kab">à¸à¸²à¹„บล</language>
+ <language type="kac" references="RP3">à¸à¸°à¸‰à¸´à¹ˆà¸™</language>
+ <language type="kam">à¸à¸²à¸¡à¸šà¸²</language>
+ <language type="kar" references="RP3">à¸à¸°à¹€à¸«à¸£à¸µà¹ˆà¸¢à¸‡</language>
+ <language type="kaw">à¸à¸²à¸§à¸´</language>
+ <language type="kbd">à¸à¸²à¸šà¸²à¸£à¹Œà¹€à¸”ียน</language>
+ <language type="kg">คองโà¸</language>
+ <language type="kha">คาสิ</language>
+ <language type="khi">คอยสัน (อื่นๆ)</language>
+ <language type="kho">คอทานิส</language>
+ <language type="ki">à¸à¸´à¸à¸¸à¸¢à¸¸</language>
+ <language type="kj">à¸à¸§à¸™à¸¢à¸²à¸¡à¸²</language>
+ <language type="kk">คาซัค</language>
+ <language type="kl">à¸à¸£à¸µà¸™à¹à¸¥à¸™à¸”์ดิค</language>
+ <language type="km">เขมร</language>
+ <language type="kmb">à¸à¸´à¸¡à¸šà¸±à¸™à¸”ุ</language>
+ <language type="kn">à¸à¸²à¸™à¸²à¸”า</language>
+ <language type="ko">เà¸à¸²à¸«à¸¥à¸µ</language>
+ <language type="kok">à¸à¸­à¸™à¸à¸²à¸™à¸´</language>
+ <language type="kos">à¸à¸­à¸ªà¸£à¸²à¹€à¸­à¸µà¸¢à¸™</language>
+ <language type="kpe">à¸à¹€à¸›à¸¥à¸¥à¹Œ</language>
+ <language type="kr">à¸à¸²à¸™à¸¸à¸£à¸´</language>
+ <language type="krc">à¸à¸²à¸£à¸²à¸Šà¸²à¸¢-บัลà¸à¸²à¸£à¹Œ</language>
+ <language type="kro">à¸à¸£à¸¸</language>
+ <language type="kru">à¸à¸¸à¸£à¸¸à¸</language>
+ <language type="ks">คัชมีรี</language>
+ <language type="ku">เคิด</language>
+ <language type="kum">à¸à¸¸à¸¡à¸´à¸</language>
+ <language type="kut">à¸à¸¸à¹€à¸—ไน</language>
+ <language type="kv">โà¸à¸¡à¸´</language>
+ <language type="kw">คอร์นิส</language>
+ <language type="ky">เคอร์à¸à¸´à¸‹</language>
+ <language type="la">ละติน</language>
+ <language type="lad">ลาดิโน</language>
+ <language type="lah">ลาฮ์นดา</language>
+ <language type="lam">ลามบา</language>
+ <language type="lb">ลัà¸à¹€à¸‹à¸¡à¹€à¸šà¸´à¸£à¹Œà¸</language>
+ <language type="lez">เลซเà¸à¸µà¸¢à¸™</language>
+ <language type="lg">à¸à¸²à¸™à¸”า</language>
+ <language type="li">ลิมเบิร์à¸</language>
+ <language type="ln">ลิงà¸à¸²à¸¥à¸²</language>
+ <language type="lo">ลาว</language>
+ <language type="lol">มองโà¸</language>
+ <language type="loz">โลซิ</language>
+ <language type="lt">ลิธัวเนีย</language>
+ <language type="lu">ลูà¸à¸²-à¸à¸²à¸—ันà¸à¸²</language>
+ <language type="lua">ลูบา-ลูลัว</language>
+ <language type="lui">ลุยเซโน</language>
+ <language type="lun">ลันดา</language>
+ <language type="luo">ลัว</language>
+ <language type="lus">ลูไช</language>
+ <language type="lv">à¹à¸¥à¸•à¹€à¸§à¸µà¸¢ (เลททิสช์)</language>
+ <language type="mad">มาดูริส</language>
+ <language type="mag">มาà¸à¸²à¸®à¸´</language>
+ <language type="mai">มัยธิลิ</language>
+ <language type="mak">มาà¸à¸²à¸‹à¸²à¸£à¹Œ</language>
+ <language type="man">à¹à¸¡à¸™à¸”ินโà¸</language>
+ <language type="map">ออสโทรนีเซีย</language>
+ <language type="mas">มาไซ</language>
+ <language type="mdf">มอà¸à¸Šà¸²</language>
+ <language type="mdr">มานดาร์</language>
+ <language type="men">เมนเด</language>
+ <language type="mg">มาลาà¸à¸²à¸‹à¸µ</language>
+ <language type="mga">ไอริชà¸à¸¥à¸²à¸‡</language>
+ <language type="mh">มาร์à¹à¸Šà¸¥à¸¥à¸´à¸ª</language>
+ <language type="mi">เมารี</language>
+ <language type="mic">มิà¸à¹à¸¡à¸</language>
+ <language type="min">มินางà¸à¸²à¹€à¸šà¸²</language>
+ <language type="mis">ภาษาอื่นๆ</language>
+ <language type="mk">à¹à¸¡à¸‹à¸µà¹‚ดเนีย</language>
+ <language type="mkh">มอà¸-เขมร (อื่นๆ)</language>
+ <language type="ml">มาลายาลัม</language>
+ <language type="mn">มองโà¸à¸¥</language>
+ <language type="mnc" references="RP2" draft="provisional">ชาวà¹à¸¡à¸™à¸ˆà¸¹à¹€à¸£à¸µà¸¢</language>
+ <language type="mni">มานิพูริ</language>
+ <language type="mno">ภาษามาโนโบ</language>
+ <language type="mo">โมดาเวีย</language>
+ <language type="moh">โมฮอว์à¸</language>
+ <language type="mos">มอสสิ</language>
+ <language type="mr">มาราที</language>
+ <language type="ms">มลายู</language>
+ <language type="mt">มอลตา</language>
+ <language type="mul">หลายภาษา</language>
+ <language type="mun">ภาษามันดา</language>
+ <language type="mus">ครีà¸</language>
+ <language type="mwl">มิรันà¸à¸´à¸ª</language>
+ <language type="mwr">มาร์วาริ</language>
+ <language type="my">พม่า</language>
+ <language type="myn">ภาษามายัน</language>
+ <language type="myv">อิร์ซยา</language>
+ <language type="na">นอรู</language>
+ <language type="nah">นาฮวตล์</language>
+ <language type="nai">อเมริà¸à¸²à¸­à¸´à¸™à¹€à¸”ียนเหนือ</language>
+ <language type="nap">นีโพลิทัน</language>
+ <language type="nb">นอร์เวย์บอà¸à¸¡à¸­à¸¥</language>
+ <language type="nd">เอ็นเดเบเลเหนือ</language>
+ <language type="nds">เยอรมันต่ำ; à¹à¸‹à¸à¸‹à¸­à¸™à¸•à¹ˆà¸³</language>
+ <language type="ne">เนปาล</language>
+ <language type="new">เนวาริ</language>
+ <language type="ng">ดองà¸à¸²</language>
+ <language type="nia">เนีส</language>
+ <language type="nic">ไนเà¸à¸­à¸£à¹Œ-à¸à¸­à¸£à¹Œà¹‚ดฟาเนียน (อื่นๆ)</language>
+ <language type="niu">ไนอีน</language>
+ <language type="nl">ฮอลันดา</language>
+ <language type="nn">นอร์เวย์ไนนอรส์à¸</language>
+ <language type="no">นอร์เวย์</language>
+ <language type="nog">โนไà¸</language>
+ <language type="non">นอร์ส</language>
+ <language type="nso">โซโธเหนือ</language>
+ <language type="nub">ภาษานูเบียน</language>
+ <language type="nv">นาวาโจ</language>
+ <language type="nwc">เนวาริคลาสสิà¸</language>
+ <language type="ny">เนียนจา; ชิเชวา; เชวา</language>
+ <language type="nym">เนียมเวซิ</language>
+ <language type="nyn">เนียโà¸à¹€à¸¥</language>
+ <language type="nyo">เนียโร</language>
+ <language type="nzi">นซิมา</language>
+ <language type="oc">ออà¸à¸‹à¸´à¸—ัน</language>
+ <language type="oj">โอจิบวา</language>
+ <language type="om">โอโรโม (อาฟาน)</language>
+ <language type="or">โอริยา</language>
+ <language type="os">ออสเซทิà¸</language>
+ <language type="osa">โอซาเà¸</language>
+ <language type="ota">ออตโทà¹à¸¡à¸™à¹€à¸•à¸­à¸£à¹Œà¸à¸µà¸ª</language>
+ <language type="oto">ภาษาโอโทเมียน</language>
+ <language type="pa">ปัà¸à¸ˆà¸²à¸›</language>
+ <language type="paa">ปาปัว (อื่นๆ)</language>
+ <language type="pag">พันà¸à¸²à¸‹à¸´à¸™à¸±à¸™</language>
+ <language type="pal">พาฮลาวิ</language>
+ <language type="pam">พามพานà¸à¸²</language>
+ <language type="pap">พาเพียเมนโท</language>
+ <language type="pau">พาลาอวน</language>
+ <language type="peo">เปอร์เซียโบราณ</language>
+ <language type="phi" references="RP3">ฟิลิปปินส์ (อื่นๆ)</language>
+ <language type="phn">โฟนิเชียน</language>
+ <language type="pi">บาลี</language>
+ <language type="pl">โปà¹à¸¥à¸™à¸”์</language>
+ <language type="pon">โพฮ์นเพเอียน</language>
+ <language type="pra">ภาษาพราà¸à¸£à¸´à¸•</language>
+ <language type="pro">โพรเวนคอลโบราณ</language>
+ <language type="ps">พาสช์โต (พุสช์โต)</language>
+ <language type="pt">โปรตุเà¸à¸ª</language>
+ <language type="qu">คิวชัว</language>
+ <language type="raj">ราจาสธานิ</language>
+ <language type="rap">ราพานุย</language>
+ <language type="rar">ราโรท็องà¸à¸±à¸™</language>
+ <language type="rm">เรโต-โรà¹à¸¡à¸™à¸‹à¹Œ</language>
+ <language type="rn">คิรันดี</language>
+ <language type="ro">โรมัน</language>
+ <language type="roa">โรมานซ์ (อื่นๆ)</language>
+ <language type="rom">โรมานี</language>
+ <language type="root">ราà¸</language>
+ <language type="ru">รัสเซีย</language>
+ <language type="rup">อาโรมาเนียน</language>
+ <language type="rw">คินยาวันดา</language>
+ <language type="sa">สันสà¸à¸¤à¸•</language>
+ <language type="sad">ซันดาเว</language>
+ <language type="sah">ยาà¸à¸¸à¸•</language>
+ <language type="sai">อเมริà¸à¸²à¸­à¸´à¸™à¹€à¸”ียนใต้ (อื่นๆ)</language>
+ <language type="sal">ภาษาซาลิชัน</language>
+ <language type="sam">ซามาริทันอารามาอิà¸</language>
+ <language type="sas">ซาซัà¸</language>
+ <language type="sat">ซันทาลิ</language>
+ <language type="sc">ซาร์ดิเนียน</language>
+ <language type="scn">ซิซิเลียน</language>
+ <language type="sco">สà¸à¸­à¸•à¸ªà¹Œ</language>
+ <language type="sd">ซินดิ</language>
+ <language type="se">ซามิเหนือ</language>
+ <language type="sel">เซลà¸à¸¸à¸›</language>
+ <language type="sem">เซมิทิภ(อื่นๆ)</language>
+ <language type="sg">สันโค</language>
+ <language type="sga">ไอริชโบราณ</language>
+ <language type="sgn">ภาษาสัà¸à¸à¸²à¸“</language>
+ <language type="sh">เซอร์โบ-โครเอเทียน</language>
+ <language type="shn">ชาน</language>
+ <language type="si">สิงหล</language>
+ <language type="sid">ซิดาโม</language>
+ <language type="sio">ภาษาซิอวน</language>
+ <language type="sit">ซิโน-ทิเบต (อื่นๆ)</language>
+ <language type="sk">สโลวัค</language>
+ <language type="sl">สโลเวเนีย</language>
+ <language type="sla">สลาวิภ(อื่นๆ)</language>
+ <language type="sm">ซามัว</language>
+ <language type="sma">ซามิใต้</language>
+ <language type="smi">ภาษาซามิ (อื่นๆ)</language>
+ <language type="smj">ลูลซามิ</language>
+ <language type="smn">อินาริซามิ</language>
+ <language type="sms">สà¸à¸­à¸¥à¸•à¸‹à¸²à¸¡à¸´</language>
+ <language type="sn">โซนา</language>
+ <language type="snk">โซนินเà¸</language>
+ <language type="so">โซมาลี</language>
+ <language type="sog">ซอจเดียน</language>
+ <language type="son">ซองไฮ</language>
+ <language type="sq">à¹à¸­à¸¥à¹€à¸šà¹€à¸™à¸µà¸¢</language>
+ <language type="sr">เซอร์เบีย</language>
+ <language type="srn">ซรานานทองโà¸</language>
+ <language type="srr">เซเรอร์</language>
+ <language type="ss">ซีสวาติ</language>
+ <language type="ssa">นิโล-ซาฮารัน (อื่นๆ)</language>
+ <language type="st">เซโสโท</language>
+ <language type="su">ซันดานีส</language>
+ <language type="suk">ซุà¸à¸¸à¸¡à¸²</language>
+ <language type="sus">ซุซุ</language>
+ <language type="sux">สุเมเรียน</language>
+ <language type="sv">สวีเดน</language>
+ <language type="sw">ซวาฮิรี</language>
+ <language type="syr">ไซเรียà¸</language>
+ <language type="ta">ทมิฬ</language>
+ <language type="tai">ไท (อื่นๆ)</language>
+ <language type="te">ทิลูà¸à¸¹</language>
+ <language type="tem">ทิมเน</language>
+ <language type="ter">เทอเรอโน</language>
+ <language type="tet">เททุม</language>
+ <language type="tg">ทาจิค</language>
+ <language type="th">ไทย</language>
+ <language type="ti">ทิà¸à¸£à¸´à¸™à¸¢à¸²</language>
+ <language type="tig">ทิจเร</language>
+ <language type="tiv">ทิฟ</language>
+ <language type="tk">เติร์à¸à¹€à¸¡à¸™</language>
+ <language type="tkl">โทเคลัว</language>
+ <language type="tl">ตาà¸à¸²à¸¥à¹‡à¸­à¸</language>
+ <language type="tlh">คลินà¸à¸­à¸™</language>
+ <language type="tli">ทลิงà¸à¸´à¸•</language>
+ <language type="tmh">ทามาเชà¸</language>
+ <language type="tn">เซตสวานา</language>
+ <language type="to">ทองà¸à¹‰à¸²</language>
+ <language type="tog">ท็องà¸à¸² (ไนซา)</language>
+ <language type="tpi">ท็อà¸à¸žà¸´à¸‹à¸´à¸™</language>
+ <language type="tr">ตุรà¸à¸µ</language>
+ <language type="ts">ซองà¸à¸²</language>
+ <language type="tsi">ซิมเชียน</language>
+ <language type="tt">ตาด</language>
+ <language type="tum">ทุมบุà¸à¸²</language>
+ <language type="tup">ภาษาทุพิ</language>
+ <language type="tut">อัลทาอิภ(อื่นๆ)</language>
+ <language type="tvl">ทูวาลู</language>
+ <language type="tw">ทวี</language>
+ <language type="ty">ทาฮิเทียน</language>
+ <language type="tyv">ทูวิเนียน</language>
+ <language type="udm">อัดมาร์ต</language>
+ <language type="ug">อุยà¸à¸±à¸§</language>
+ <language type="uga">อูà¸à¸²à¸£à¸´à¸—ิà¸</language>
+ <language type="uk">ยูเครน</language>
+ <language type="umb">อัมบันดู</language>
+ <language type="und">ไม่ระบุ</language>
+ <language type="ur">อิรดู</language>
+ <language type="uz">อุสเบค</language>
+ <language type="vai">ไว</language>
+ <language type="ve">เวนดา</language>
+ <language type="vi">เวียดนาม</language>
+ <language type="vo">โวลาพุà¸</language>
+ <language type="vot">โวทิà¸</language>
+ <language type="wa">วอลลูน</language>
+ <language type="wak">ภาษาวาà¸à¸²à¸Šà¸²à¸™</language>
+ <language type="wal">วาลาโม</language>
+ <language type="war">วาเรย์</language>
+ <language type="was">วาโช</language>
+ <language type="wen">ภาษาซอร์เบียน</language>
+ <language type="wo">วูลอฟ</language>
+ <language type="xal">à¸à¸²à¸¥à¸¡à¸´à¸</language>
+ <language type="xh">โซสา</language>
+ <language type="yao">เย้า</language>
+ <language type="yap">ยาเพส</language>
+ <language type="yi">ยีดิช</language>
+ <language type="yo">โยรูบา</language>
+ <language type="ypk">ภาษายูพิà¸</language>
+ <language type="za">จวง</language>
+ <language type="zap">ซาโปเทà¸</language>
+ <language type="zen">เซนาà¸à¸²</language>
+ <language type="zh">จีน</language>
+ <language type="znd">ซานเด</language>
+ <language type="zu">ซูลู</language>
+ <language type="zun">ซูนิ</language>
+ </languages>
+ <scripts>
+ <script type="Arab">อารบิà¸</script>
+ <script type="Armn">อาร์เมเนียน</script>
+ <script type="Bali">บาหลี</script>
+ <script type="Batk">บาทัà¸</script>
+ <script type="Beng">เบงà¸à¸²à¸¥à¸´</script>
+ <script type="Blis">บลิสซิมโบลส์</script>
+ <script type="Bopo">โบโพโมโฟ</script>
+ <script type="Brah">บรามี</script>
+ <script type="Brai">ไบรลเล</script>
+ <script type="Bugi">บูà¸à¸´à¸™à¸´à¸ª</script>
+ <script type="Buhd">บูฮิด</script>
+ <script type="Cans">สัà¸à¸¥à¸±à¸à¸©à¸“์ชนเผ่าพื้นเมืองà¹à¸„นาดา</script>
+ <script type="Cham">ชาม</script>
+ <script type="Cher">เชโรà¸à¸µ</script>
+ <script type="Cirt">เซิร์ต</script>
+ <script type="Copt">คอปติà¸</script>
+ <script type="Cprt">ไซพริออต</script>
+ <script type="Cyrl">ไซริลลริà¸</script>
+ <script type="Cyrs">ไซริลลิภ(ภาษาเà¸à¹ˆà¸²à¸ªà¹‚ลวาเนีย)</script>
+ <script type="Deva">เทวนาครี</script>
+ <script type="Dsrt">ดีซีเรต</script>
+ <script type="Egyd">ดีโมติà¸à¸­à¸µà¸¢à¸´à¸›à¸•à¹Œ</script>
+ <script type="Egyh">เฮียราติà¸à¸­à¸µà¸¢à¸´à¸›à¸•à¹Œ</script>
+ <script type="Egyp">เฮียโรà¸à¸¥à¸´à¸Ÿà¸ªà¹Œà¸­à¸µà¸¢à¸´à¸›à¸•à¹Œ</script>
+ <script type="Ethi">เอธิโอเปีย</script>
+ <script type="Geok">คัตซูรี (อาซอมทัฟรูลีà¹à¸¥à¸°à¸™à¸¹à¸ªà¸„ูรี)</script>
+ <script type="Geor" draft="provisional">จอร์เจีย</script>
+ <script type="Glag">à¸à¸¥à¸²à¹‚à¸à¸¥à¸´à¸•à¸´à¸</script>
+ <script type="Goth">โà¸à¸—ิà¸</script>
+ <script type="Grek">à¸à¸£à¸µà¸</script>
+ <script type="Gujr">à¸à¸¹à¸ˆà¸²à¸£à¸²à¸—ิ</script>
+ <script type="Guru">เà¸à¸­à¸£à¹Œà¸¡à¸¹à¸„ิ</script>
+ <script type="Hang">ฮันà¸à¸¹à¸¥</script>
+ <script type="Hani">ฮัน</script>
+ <script type="Hano">ฮานูนู</script>
+ <script type="Hans">ฮันปรับปรุง</script>
+ <script type="Hant">ฮันดั้งเดิม</script>
+ <script type="Hebr">ฮิบรู</script>
+ <script type="Hira">ฮิรางานะ</script>
+ <script type="Hmng">พาฮาวมอง</script>
+ <script type="Hrkt">à¸à¸²à¸•à¸°à¸‡à¸²à¸™à¸°à¸«à¸£à¸·à¸­à¸®à¸´à¸£à¸²à¸‡à¸²à¸™à¸°</script>
+ <script type="Hung">ฮังà¸à¸²à¸£à¸µà¹€à¸à¹ˆà¸²</script>
+ <script type="Inds">อินดัส (ฮารัปพัน)</script>
+ <script type="Ital">อิตาลีเà¸à¹ˆà¸²</script>
+ <script type="Java">จาวานีส</script>
+ <script type="Kali">à¸à¸²à¸¢à¸²à¸¥à¸µ</script>
+ <script type="Kana">à¸à¸²à¸•à¸°à¸à¸²à¸™à¸°</script>
+ <script type="Khar">คาโรสติ</script>
+ <script type="Khmr">เขมร</script>
+ <script type="Knda">à¸à¸²à¸™à¸™à¸²à¸”า</script>
+ <script type="Laoo">ลาว</script>
+ <script type="Latf">ลาติน (ฟรังเตอร์)</script>
+ <script type="Latg">ลาติน (à¹à¸à¸¥à¸´à¸)</script>
+ <script type="Latn">ลาติน</script>
+ <script type="Lepc">เลปชา (รอง)</script>
+ <script type="Limb">ลิมบู</script>
+ <script type="Lina">ลีเนียร์เอ</script>
+ <script type="Linb">ลีเนียร์บี</script>
+ <script type="Mand">à¹à¸¡à¸™à¹à¸”น</script>
+ <script type="Maya">มายันฮีโรà¸à¸¥à¸´à¸Ÿà¸ªà¹Œ</script>
+ <script type="Mero">เมโรติà¸</script>
+ <script type="Mlym">มะละยาลัม</script>
+ <script type="Mong">มองโà¸à¹€à¸¥à¸µà¸¢</script>
+ <script type="Mymr">พม่า</script>
+ <script type="Nkoo">เอ็นโà¸</script>
+ <script type="Ogam">โอà¸à¸²à¸¡</script>
+ <script type="Orkh">ออร์คอน</script>
+ <script type="Orya">ออริยา</script>
+ <script type="Osma">ออสมันยา</script>
+ <script type="Perm">เปอร์มิà¸à¹€à¸à¹ˆà¸²</script>
+ <script type="Phag">ฟาà¸à¸ªà¹Œ-พา</script>
+ <script type="Phnx">โฟนิเชียน</script>
+ <script type="Plrd">โพลลาร์ดโฟเนติà¸</script>
+ <script type="Qaai">อินเฮอริต</script>
+ <script type="Roro">รองโà¸à¸£à¸­à¸‡à¹‚à¸</script>
+ <script type="Runr">รูนิà¸</script>
+ <script type="Sara">ซาราทิ</script>
+ <script type="Shaw">ซาเวียน</script>
+ <script type="Sinh">ซินฮาลา</script>
+ <script type="Sylo">ไซโลทินาà¸à¸£à¸µ</script>
+ <script type="Syrc" draft="provisional">ไซเรียà¸</script>
+ <script type="Syre" draft="provisional">ไซเรียภ(เอสทรางเà¸à¹‚ล)</script>
+ <script type="Syrj" draft="provisional">ไซเรียภ(ตะวันตà¸)</script>
+ <script type="Syrn" draft="provisional">ไซเรียภ(ตะวันออà¸)</script>
+ <script type="Tagb">ทัà¸à¸šà¸±à¸™à¸§à¸²</script>
+ <script type="Tale">ไทเล</script>
+ <script type="Talu">ไทเลใหม่</script>
+ <script type="Taml">ทมิฬ</script>
+ <script type="Telu">เทลูà¸à¸¹</script>
+ <script type="Teng">เทงวอร์</script>
+ <script type="Tfng">ทิฟินา (เบอร์เบอร์)</script>
+ <script type="Tglg">ตาà¸à¸²à¸¥à¹‡à¸­à¸</script>
+ <script type="Thaa">ทานา</script>
+ <script type="Thai">ไทย</script>
+ <script type="Tibt">ทิเบต</script>
+ <script type="Ugar">อูà¸à¸²à¸£à¸´à¸•à¸´à¸</script>
+ <script type="Vaii">ไว</script>
+ <script type="Visp" draft="provisional">คำพูดที่มองเห็นได้</script>
+ <script type="Xpeo">เปอร์เซียเà¸à¹ˆà¸²</script>
+ <script type="Xsux">ซูเมโร-อัà¸à¸„าเดียนคูนิฟอร์ม</script>
+ <script type="Yiii" draft="provisional">ยิ</script>
+ <script type="Zxxx">รหัสสำหรับภาษาที่ไม่มีภาษาเขียน</script>
+ <script type="Zyyy">สามัà¸</script>
+ <script type="Zzzz">รหัสสำหรับสคริปต์ที่ไม่มีรหัส</script>
+ </scripts>
+ <territories>
+ <territory type="001">โลà¸</territory>
+ <territory type="002">à¹à¸­à¸Ÿà¸£à¸´à¸à¸²</territory>
+ <territory type="005">อเมริà¸à¸²à¹ƒà¸•à¹‰</territory>
+ <territory type="009">โอเชียเนีย</territory>
+ <territory type="011">à¹à¸­à¸Ÿà¸£à¸´à¸à¸²à¸•à¸°à¸§à¸±à¸™à¸•à¸</territory>
+ <territory type="013">อเมริà¸à¸²à¸à¸¥à¸²à¸‡</territory>
+ <territory type="014">à¹à¸­à¸Ÿà¸£à¸´à¸à¸²à¸•à¸°à¸§à¸±à¸™à¸­à¸­à¸</territory>
+ <territory type="015">à¹à¸­à¸Ÿà¸£à¸´à¸à¸²à¹€à¸«à¸™à¸·à¸­</territory>
+ <territory type="017">à¹à¸­à¸Ÿà¸£à¸´à¸à¸²à¸à¸¥à¸²à¸‡</territory>
+ <territory type="018">à¹à¸­à¸Ÿà¸£à¸´à¸à¸²à¹ƒà¸•à¹‰ [018]</territory>
+ <territory type="019">อเมริà¸à¸²</territory>
+ <territory type="021">อเมริà¸à¸²à¹€à¸«à¸™à¸·à¸­</territory>
+ <territory type="029">à¹à¸„ริเบียน</territory>
+ <territory type="030">เอเชียตะวันออà¸</territory>
+ <territory type="034">เอเชียใต้</territory>
+ <territory type="035">เอเชียตะวันออà¸à¹€à¸‰à¸µà¸¢à¸‡à¹ƒà¸•à¹‰</territory>
+ <territory type="039">ยุโรปใต้</territory>
+ <territory type="053">ออสเตรเลียà¹à¸¥à¸°à¸™à¸´à¸§à¸‹à¸µà¹à¸¥à¸™à¸”์</territory>
+ <territory type="054">เมลานีเซีย</territory>
+ <territory type="057">ไมโครนีเซีย [057]</territory>
+ <territory type="061">โปลินีเซีย</territory>
+ <territory type="062">เอเชียà¸à¸¥à¸²à¸‡à¸•à¸­à¸™à¹ƒà¸•à¹‰</territory>
+ <territory type="142">เอเชีย</territory>
+ <territory type="143">เอเชียà¸à¸¥à¸²à¸‡</territory>
+ <territory type="145">เอเชียตะวันตà¸</territory>
+ <territory type="150">ยุโรป</territory>
+ <territory type="151">ยุโรปตะวันออà¸</territory>
+ <territory type="154">ยุโรปเหนือ</territory>
+ <territory type="155">ยุโรปตะวันตà¸</territory>
+ <territory type="172">เครือรัà¸à¸­à¸´à¸ªà¸£à¸°</territory>
+ <territory type="419">ละตินอเมริà¸à¸²à¹à¸¥à¸°à¸„าริบเบียน</territory>
+ <territory type="830">หมู่เà¸à¸²à¸°à¹à¸Šà¸™à¹€à¸™à¸¥</territory>
+ <territory type="IM">เà¸à¸²à¸°à¹à¸¡à¸™</territory>
+ <territory type="AD">อันดอร์รา</territory>
+ <territory type="AE">สหรัà¸à¸­à¸²à¸«à¸£à¸±à¸šà¹€à¸­à¸¡à¸´à¹€à¸£à¸•à¸ªà¹Œ</territory>
+ <territory type="AF">อัฟà¸à¸²à¸™à¸´à¸ªà¸–าน</territory>
+ <territory type="AG">à¹à¸­à¸™à¸•à¸´à¸à¸²à¹à¸¥à¸°à¸šà¸²à¸£à¹Œà¸šà¸¹à¸”า</territory>
+ <territory type="AI">อันà¸à¸´à¸¥à¹ˆà¸²</territory>
+ <territory type="AL">à¹à¸­à¸¥à¹€à¸šà¹€à¸™à¸µà¸¢</territory>
+ <territory type="AM">อาร์เมเนีย</territory>
+ <territory type="AN">เนเฮอร์à¹à¸¥à¸™à¸”์à¹à¸­à¸™à¸—ิลลิส</territory>
+ <territory type="AO">à¹à¸­à¸‡à¹‚à¸à¸¥à¸²</territory>
+ <territory type="AQ">à¹à¸­à¸™à¸•à¸²à¸£à¹Œà¸à¸•à¸´à¸à¸²</territory>
+ <territory type="AR">อาร์เจนตินา</territory>
+ <territory type="AS">อเมริà¸à¸±à¸™à¸‹à¸²à¸¡à¸±à¸§</territory>
+ <territory type="AT">ออสเตรีย</territory>
+ <territory type="AU">ออสเตรเลีย</territory>
+ <territory type="AW">อารูบา</territory>
+ <territory type="AX">หมู่เà¸à¸²à¸°à¸­à¹à¸¥à¸™à¸”์</territory>
+ <territory type="AZ">อาเซอร์ไบจาน</territory>
+ <territory type="BA">บอสเนียà¹à¸¥à¸°à¹€à¸®à¸­à¸£à¹Œà¹€à¸‹à¹‚à¸à¸§à¸µà¸™à¸²</territory>
+ <territory type="BB">บาร์เบโดส</territory>
+ <territory type="BD">บังคลาเทศ</territory>
+ <territory type="BE">เบลเยียม</territory>
+ <territory type="BF">บูร์à¸à¸´à¸™à¸²à¸Ÿà¸²à¹‚ซ</territory>
+ <territory type="BG">บัลà¹à¸à¹€à¸£à¸µà¸¢</territory>
+ <territory type="BH">บาห์เรน</territory>
+ <territory type="BI">บุรุนดี</territory>
+ <territory type="BJ">เบนิน</territory>
+ <territory type="BM">เบอร์มิวด้า</territory>
+ <territory type="BN">บรูไน</territory>
+ <territory type="BO">โบลิเวีย</territory>
+ <territory type="BR">บราซิล</territory>
+ <territory type="BS">บาฮามาส</territory>
+ <territory type="BT">ภูà¸à¸²à¸™</territory>
+ <territory type="BV">เà¸à¸²à¸°à¸šà¸¹à¹€à¸§à¸•à¹Œ</territory>
+ <territory type="BW">บอตสวานา</territory>
+ <territory type="BY">เบลารุส</territory>
+ <territory type="BZ">เบลีช</territory>
+ <territory type="CA">à¹à¸„นาดา</territory>
+ <territory type="CC">หมู่เà¸à¸²à¸°à¹‚คโคส (คีลิง)</territory>
+ <territory type="CD">สาธารณรัà¸à¸›à¸£à¸°à¸Šà¸²à¸˜à¸´à¸›à¹„ตยคองโà¸</territory>
+ <territory type="CF">สาธารณรัà¸à¹à¸­à¸Ÿà¸£à¸´à¸à¸²à¸à¸¥à¸²à¸‡</territory>
+ <territory type="CG">คองโà¸</territory>
+ <territory type="CH">สวิตเซอร์à¹à¸¥à¸™à¸”์</territory>
+ <territory type="CI">โà¸à¸•à¸”ิวัวร์</territory>
+ <territory type="CK">หมู่เà¸à¸²à¸°à¸„ุà¸</territory>
+ <territory type="CL">ชิลี</territory>
+ <territory type="CM">à¹à¸„เมอรูน</territory>
+ <territory type="CN">จีน</territory>
+ <territory type="CO">โคลัมเบีย</territory>
+ <territory type="CR">คอสตาริà¸à¸²</territory>
+ <territory type="CS">เซอร์เบีย</territory>
+ <territory type="CU">คิวบา</territory>
+ <territory type="CV">เคปเวิร์ด</territory>
+ <territory type="CX">เà¸à¸²à¸°à¸„ริสมาสต์</territory>
+ <territory type="CY">ไซปรัส</territory>
+ <territory type="CZ">สาธารณรัà¸à¹€à¸Šà¹‡à¸</territory>
+ <territory type="DE">เยอรมนี</territory>
+ <territory type="DJ">จิบูตี</territory>
+ <territory type="DK">เดนมาร์à¸</territory>
+ <territory type="DM">โดมินิà¸à¸²</territory>
+ <territory type="DO">สาธารณรัà¸à¹‚ดมินิà¸à¸±à¸™</territory>
+ <territory type="DZ">à¹à¸­à¸¥à¸ˆà¸µà¹€à¸£à¸µà¸¢</territory>
+ <territory type="EC">เอà¸à¸§à¸²à¸”อร์</territory>
+ <territory type="EE">เอสโตเนีย</territory>
+ <territory type="EG">อียิปต์</territory>
+ <territory type="EH">ซาฮาราตะวันตà¸</territory>
+ <territory type="ER">เอริเทรีย</territory>
+ <territory type="ES">สเปน</territory>
+ <territory type="ET">เอธิโอเปีย</territory>
+ <territory type="FI">ฟินà¹à¸¥à¸™à¸”์</territory>
+ <territory type="FJ">ฟิจิ</territory>
+ <territory type="FK">หมู่เà¸à¸²à¸°à¸Ÿà¸­à¸¥à¹Œà¸„à¹à¸¥à¸™à¸”์</territory>
+ <territory type="FM">ไมโครนีเซีย</territory>
+ <territory type="FO">หมู่เà¸à¸²à¸°à¸Ÿà¸²à¹‚ร</territory>
+ <territory type="FR">à¸à¸£à¸±à¹ˆà¸‡à¹€à¸¨à¸ª</territory>
+ <territory type="GA">à¸à¸²à¸šà¸­à¸‡</territory>
+ <territory type="GB">สหราชอาณาจัà¸à¸£</territory>
+ <territory type="GD">เà¸à¸£à¸™à¸²à¸”า</territory>
+ <territory type="GE">จอร์เจีย</territory>
+ <territory type="GF">เฟรนช์à¸à¸µà¸­à¸²à¸™à¸²</territory>
+ <territory type="GH">à¸à¸²à¸™à¹ˆà¸²</territory>
+ <territory type="GI">ยิบรอลตาร์</territory>
+ <territory type="GL">à¸à¸£à¸µà¸™à¹à¸¥à¸™à¸”์</territory>
+ <territory type="GM">à¹à¸à¸¡à¹€à¸šà¸µà¸¢</territory>
+ <territory type="GN">à¸à¸´à¸™à¸µ</territory>
+ <territory type="GP">à¸à¸±à¸§à¹€à¸”อลูป</territory>
+ <territory type="GQ">อิเควทอเรียลà¸à¸´à¸™à¸µ</territory>
+ <territory type="GR">à¸à¸£à¸µà¸‹</territory>
+ <territory type="GS">เà¸à¸²à¸°à¹€à¸‹à¸²à¸—์จอร์เจียà¹à¸¥à¸°à¸«à¸¡à¸¹à¹ˆà¹€à¸à¸²à¸°à¹€à¸‹à¸²à¸—์à¹à¸‹à¸™à¸”์วิช</territory>
+ <territory type="GT">à¸à¸±à¸§à¹€à¸•à¸¡à¸²à¸¥à¸²</territory>
+ <territory type="GU">à¸à¸§à¸¡</territory>
+ <territory type="GW">à¸à¸´à¸™à¸µ-บิสเซา</territory>
+ <territory type="GY">à¸à¸²à¸¢à¸²à¸™à¸²</territory>
+ <territory type="HK">ฮ่องà¸à¸‡ เขตปà¸à¸„รองพิเศษประเทศจีน</territory>
+ <territory type="HM">เà¸à¸²à¸°à¹€à¸®à¸´à¸£à¹Œà¸”à¹à¸¥à¸°à¸«à¸¡à¸¹à¹ˆà¹€à¸à¸²à¸°à¹à¸¡à¸à¸”อนัลด์</territory>
+ <territory type="HN">ฮอนดูรัส</territory>
+ <territory type="HR">โครเอเชีย</territory>
+ <territory type="HT">เฮติ</territory>
+ <territory type="HU">ฮังà¸à¸²à¸£à¸µ</territory>
+ <territory type="ID">อินโดนีเซีย</territory>
+ <territory type="IE">ไอร์à¹à¸¥à¸™à¸”์</territory>
+ <territory type="IL">อิสราเอล</territory>
+ <territory type="IN">อินเดีย</territory>
+ <territory type="IO">บริติสอินเดียโอเชียนเทร์ริทอรี</territory>
+ <territory type="IQ">อิรัà¸</territory>
+ <territory type="IR">อิหร่าน</territory>
+ <territory type="IS">ไอซ์à¹à¸¥à¸™à¸”์</territory>
+ <territory type="IT">อิตาลี</territory>
+ <territory type="JM">จาเมà¸à¸²</territory>
+ <territory type="JO">จอร์à¹à¸”น</territory>
+ <territory type="JP">à¸à¸µà¹ˆà¸›à¸¸à¹ˆà¸™</territory>
+ <territory type="KE">เคนยา</territory>
+ <territory type="KG">คีร์à¸à¸´à¸‹à¸ªà¸–าน</territory>
+ <territory type="KH">à¸à¸±à¸¡à¸žà¸¹à¸Šà¸²</territory>
+ <territory type="KI">คิริบาส</territory>
+ <territory type="KM">คอโมโรส</territory>
+ <territory type="KN">เซนต์คิตส์à¹à¸¥à¸°à¹€à¸™à¸§à¸´à¸ª</territory>
+ <territory type="KP">เà¸à¸²à¸«à¸¥à¸µà¹€à¸«à¸™à¸·à¸­</territory>
+ <territory type="KR">เà¸à¸²à¸«à¸¥à¸µà¹ƒà¸•à¹‰</territory>
+ <territory type="KW">คูเวต</territory>
+ <territory type="KY">หมู่เà¸à¸²à¸°à¹€à¸„ย์à¹à¸¡à¸™</territory>
+ <territory type="KZ">คาซัคสถาน</territory>
+ <territory type="LA">ลาว</territory>
+ <territory type="LB">เลบานอน</territory>
+ <territory type="LC">เซนต์ลูเซีย</territory>
+ <territory type="LI">ลิà¸à¹€à¸•à¸™à¸ªà¹„ตน์</territory>
+ <territory type="LK">ศรีลังà¸à¸²</territory>
+ <territory type="LR">ไลบีเรีย</territory>
+ <territory type="LS">เลโซโท</territory>
+ <territory type="LT">ลิทัวเนีย</territory>
+ <territory type="LU">ลัà¸à¹€à¸‹à¸¡à¹€à¸šà¸´à¸£à¹Œà¸</territory>
+ <territory type="LV">ลัตเวีย</territory>
+ <territory type="LY">ลิเบีย</territory>
+ <territory type="MA">โมร็อà¸à¹‚à¸</territory>
+ <territory type="MC">โมนาโà¸</territory>
+ <territory type="MD">มอลโดวา</territory>
+ <territory type="MG">มาดาà¸à¸±à¸ªà¸à¸²à¸£à¹Œ</territory>
+ <territory type="MH">หมู่เà¸à¸²à¸°à¸¡à¸²à¸£à¹Œà¹à¸Šà¸¥</territory>
+ <territory type="MK">มาซิโดเนีย</territory>
+ <territory type="ML">มาลี</territory>
+ <territory type="MM">พม่า</territory>
+ <territory type="MN">มองโà¸à¹€à¸¥à¸µà¸¢</territory>
+ <territory type="MO">มาเà¸à¹Šà¸² เขตปà¸à¸„รองพิเศษประเทศจีน</territory>
+ <territory type="MP">หมู่เà¸à¸²à¸°à¸™à¸­à¸£à¹Œà¸—เทิร์นมาเรียนา</territory>
+ <territory type="MQ">มาร์ตินีà¸</territory>
+ <territory type="MR">มอริเตเนีย</territory>
+ <territory type="MS">มอนต์เซร์à¹à¸£à¹‡à¸•</territory>
+ <territory type="MT">มอลตา</territory>
+ <territory type="MU">มอริเชียส</territory>
+ <territory type="MV">มัลดีฟส์</territory>
+ <territory type="MW">มาลาวี</territory>
+ <territory type="MX">เม็à¸à¸‹à¸´à¹‚à¸</territory>
+ <territory type="MY">มาเลเซีย</territory>
+ <territory type="MZ">โมà¹à¸‹à¸¡à¸šà¸´à¸„</territory>
+ <territory type="NA">นามิเบีย</territory>
+ <territory type="NC">นิวà¹à¸„ลีโดเนีย</territory>
+ <territory type="NE">ไนเจอร์</territory>
+ <territory type="NF">เà¸à¸²à¸°à¸™à¸­à¸£à¹Œà¸Ÿà¸­à¸¥à¹Œà¸</territory>
+ <territory type="NG">ไนจีเรีย</territory>
+ <territory type="NI">นิคาราà¸à¸±à¸§</territory>
+ <territory type="NL">เนเธอร์à¹à¸¥à¸™à¸”์</territory>
+ <territory type="NO">นอร์เวย์</territory>
+ <territory type="NP">เนปาล</territory>
+ <territory type="NR">นาอูรู</territory>
+ <territory type="NU">นียู</territory>
+ <territory type="NZ">นิวซีà¹à¸¥à¸™à¸”์</territory>
+ <territory type="OM">โอมาน</territory>
+ <territory type="PA">ปานามา</territory>
+ <territory type="PE">เปรู</territory>
+ <territory type="PF">เฟรนช์โพลีนีเซีย</territory>
+ <territory type="PG">ปาปัวนิวà¸à¸´à¸™à¸µ</territory>
+ <territory type="PH">ฟิลิปปินส์</territory>
+ <territory type="PK">ปาà¸à¸µà¸ªà¸–าน</territory>
+ <territory type="PL">โปà¹à¸¥à¸™à¸”์</territory>
+ <territory type="PM">à¹à¸‹à¸‡à¸›à¸µà¹à¸¢à¸£à¹Œà¹à¸¥à¸°à¸¡à¸µà¹€à¸à¸­à¸¥à¸‡</territory>
+ <territory type="PN">พิตà¹à¸„ร์น</territory>
+ <territory type="PR">เปอร์โตริโà¸</territory>
+ <territory type="PS">ปาเลซติเนียนเทร์ริทอรี</territory>
+ <territory type="PT">โปรตุเà¸à¸ª</territory>
+ <territory type="PW">ปาเลา</territory>
+ <territory type="PY">ปาราà¸à¸§à¸±à¸¢</territory>
+ <territory type="QA">à¸à¸²à¸•à¸²à¸£à¹Œ</territory>
+ <territory type="QO">เอาต์ไลอิงโอเชียเนีย</territory>
+ <territory type="RE">เรอูเนียง</territory>
+ <territory type="RO">โรมาเนีย</territory>
+ <territory type="RU">รัสเซีย</territory>
+ <territory type="RW">รวันดา</territory>
+ <territory type="SA">ซาอุดีอาระเบีย</territory>
+ <territory type="SB">หมู่เà¸à¸²à¸°à¹‚ซโลมอน</territory>
+ <territory type="SC">เซเชลส์</territory>
+ <territory type="SD">ซูดาน</territory>
+ <territory type="SE">สวีเดน</territory>
+ <territory type="SG">สิงคโปร์</territory>
+ <territory type="SH">เซนต์เฮเลนา</territory>
+ <territory type="SI">สโลวีเนีย</territory>
+ <territory type="SJ">สฟาลบาร์à¹à¸¥à¸°à¹à¸ˆà¸™à¸¡à¸²à¹€à¸¢à¸™</territory>
+ <territory type="SK">สโลวาเà¸à¸µà¸¢</territory>
+ <territory type="SL">เซียร์ราลีโอน</territory>
+ <territory type="SM">ซานมารีโน</territory>
+ <territory type="SN">เซเนà¸à¸±à¸¥</territory>
+ <territory type="SO">โซมาเลีย</territory>
+ <territory type="SR">สุรินัม</territory>
+ <territory type="ST">เซาโตเมà¹à¸¥à¸°à¸›à¸£à¸´à¸™à¸‹à¸´à¹€à¸›</territory>
+ <territory type="SV">เอลซัลวาดอร์</territory>
+ <territory type="SY">ซีเรีย</territory>
+ <territory type="SZ">สวาซิà¹à¸¥à¸™à¸”์</territory>
+ <territory type="TC">หมู่เà¸à¸²à¸°à¹€à¸•à¸´à¸à¸ªà¹Œà¹à¸¥à¸°à¸«à¸¡à¸¹à¹ˆà¹€à¸à¸²à¸°à¹€à¸„คอส</territory>
+ <territory type="TD">ชาด</territory>
+ <territory type="TF">อาณาเขตทางใต้ของà¸à¸£à¸±à¹ˆà¸‡à¹€à¸¨à¸ª</territory>
+ <territory type="TG">โตโà¸</territory>
+ <territory type="TH">ประเทศไทย</territory>
+ <territory type="TJ">ทาจิà¸à¸´à¸ªà¸–าน</territory>
+ <territory type="TK">โทà¸à¸´à¹‚ล</territory>
+ <territory type="TL">ติมอร์ตะวันออà¸</territory>
+ <territory type="TM">เติร์à¸à¹€à¸¡à¸™à¸´à¸ªà¸–าน</territory>
+ <territory type="TN">ตูนิเซีย</territory>
+ <territory type="TO">ตองà¸à¸²</territory>
+ <territory type="TR">ตุรà¸à¸µ</territory>
+ <territory type="TT">ตรินิà¹à¸”ดà¹à¸¥à¸°à¹‚ตเบโà¸</territory>
+ <territory type="TV">ตูวาลู</territory>
+ <territory type="TW">ไต้หวัน</territory>
+ <territory type="TZ">ทานซาเนีย</territory>
+ <territory type="UA">ยูเครน</territory>
+ <territory type="UG">อูà¸à¸²à¸™à¸”า</territory>
+ <territory type="UM">หมู่เà¸à¸²à¸°à¸ªà¸«à¸£à¸±à¸à¹„มเนอร์เอาต์ไลอิง</territory>
+ <territory type="US">สหรัà¸à¸­à¹€à¸¡à¸£à¸´à¸à¸²</territory>
+ <territory type="UY">อุรุà¸à¸§à¸±à¸¢</territory>
+ <territory type="UZ">อุซเบà¸à¸´à¸ªà¸–าน</territory>
+ <territory type="VA">วาติà¸à¸±à¸™</territory>
+ <territory type="VC">เซนต์วินเซนต์à¹à¸¥à¸°à¹€à¸à¸£à¸™à¸²à¸”ีนส์</territory>
+ <territory type="VE">เวเนซุเอลา</territory>
+ <territory type="VG">บริทิชเวอร์จินไอส์à¹à¸¥à¸™à¸”์</territory>
+ <territory type="VI">ยูเอสเวอร์จินไอส์à¹à¸¥à¸™à¸”์</territory>
+ <territory type="VN">เวียดนาม</territory>
+ <territory type="VU">วานูอาตู</territory>
+ <territory type="WF">วาลลิสà¹à¸¥à¸°à¸Ÿà¸¸à¸•à¸¹à¸™à¸²</territory>
+ <territory type="WS">ซามัว</territory>
+ <territory type="YE">เยเมน</territory>
+ <territory type="YT">มายอต</territory>
+ <territory type="ZA">à¹à¸­à¸Ÿà¸£à¸´à¸à¸²à¹ƒà¸•à¹‰</territory>
+ <territory type="ZM">à¹à¸‹à¸¡à¹€à¸šà¸µà¸¢</territory>
+ <territory type="ZW">ซิมบาบเว</territory>
+ </territories>
+ <variants>
+ <variant type="1901">เยอรมันออร์โธà¸à¸£à¸²à¸Ÿà¸µà¸”ั้งเดิม</variant>
+ <variant type="1996">เยอรมันออร์โธà¸à¸£à¸²à¸Ÿà¸µà¸›à¸µ 1996</variant>
+ <variant type="NEDIS">ภาษาพื้นเมืองนาทิโซเน</variant>
+ <variant type="POLYTONI">โพลีโทนิà¸</variant>
+ <variant type="REVISED">ออร์โธà¸à¸£à¸²à¸Ÿà¸´à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡</variant>
+ <variant type="ROZAJ">เรเซียน</variant>
+ <variant type="SAAHO">ซาโฮ</variant>
+ </variants>
+ <keys>
+ <key type="calendar">ปà¸à¸´à¸—ิน</key>
+ <key type="collation" draft="provisional">ส่วนต่าง</key>
+ <key type="currency">เงินตรา</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">จีนดั้งเดิม</type>
+ <type type="buddhist" key="calendar">ปà¸à¸´à¸—ินพุทธ</type>
+ <type type="chinese" key="calendar">ปà¸à¸´à¸—ินจีน</type>
+ <type type="direct" key="collation">ลำดับตรง</type>
+ <type type="gb2312han" key="collation">จีนปรับปรุงใหม่</type>
+ <type type="gregorian" key="calendar">ปà¸à¸´à¸—ินเà¸à¸£à¸à¸­à¹€à¸£à¸µà¸¢à¸™</type>
+ <type type="hebrew" key="calendar">ปà¸à¸´à¸—ินฮิบรู</type>
+ <type type="islamic" key="calendar">ปà¸à¸´à¸—ินอิสลาม</type>
+ <type type="islamic-civil" key="calendar">ปà¸à¸´à¸—ินอิสลามซีวิล</type>
+ <type type="japanese" key="calendar">ปà¸à¸´à¸—ินà¸à¸µà¹ˆà¸›à¸¸à¹ˆà¸™</type>
+ <type type="phonebook" key="collation">ลำดับสมุดโทรศัพท์</type>
+ <type type="pinyin" key="collation">ลำดับพินยิน</type>
+ <type type="stroke" key="collation">ลำดับà¸à¸²à¸£à¸¥à¸²à¸à¹€à¸ªà¹‰à¸™</type>
+ <type type="traditional" key="collation">ดั้งเดิม</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[ฯ ๆ ๎ ็-๠à¸-ฮ ะ-ฺ เ-ๅ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200B]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <default choice="gregorian"/>
+ <calendar type="buddhist">
+ <eras>
+ <eraAbbr>
+ <era type="0">พ.ศ.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE'ที่ 'd MMMM G yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d/M/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H' นาฬิà¸à¸² 'm' นาที 'ss' วินาที'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H' นาฬิà¸à¸² 'm' นาที'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <dateTimeFormatLength>
+ <dateTimeFormat>
+ <pattern>{1}, {0}</pattern>
+ </dateTimeFormat>
+ </dateTimeFormatLength>
+ </dateTimeFormats>
+ </calendar>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">ม.ค.</month>
+ <month type="2">à¸.พ.</month>
+ <month type="3">มี.ค.</month>
+ <month type="4">เม.ย.</month>
+ <month type="5">พ.ค.</month>
+ <month type="6">มิ.ย.</month>
+ <month type="7">à¸.ค.</month>
+ <month type="8">ส.ค.</month>
+ <month type="9">à¸.ย.</month>
+ <month type="10">ต.ค.</month>
+ <month type="11">พ.ย.</month>
+ <month type="12">ธ.ค.</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">มà¸à¸£à¸²à¸„ม</month>
+ <month type="2">à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ</month>
+ <month type="3">มีนาคม</month>
+ <month type="4">เมษายน</month>
+ <month type="5">พฤษภาคม</month>
+ <month type="6">มิถุนายน</month>
+ <month type="7">à¸à¸£à¸à¸Žà¸²à¸„ม</month>
+ <month type="8">สิงหาคม</month>
+ <month type="9">à¸à¸±à¸™à¸¢à¸²à¸¢à¸™</month>
+ <month type="10">ตุลาคม</month>
+ <month type="11">พฤศจิà¸à¸²à¸¢à¸™</month>
+ <month type="12">ธันวาคม</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">ม.ค.</month>
+ <month type="2">à¸.พ.</month>
+ <month type="3">มี.ค.</month>
+ <month type="4">เม.ย.</month>
+ <month type="5">พ.ค.</month>
+ <month type="6">มิ.ย.</month>
+ <month type="7">à¸.ค.</month>
+ <month type="8">ส.ค.</month>
+ <month type="9">à¸.ย.</month>
+ <month type="10">ต.ค.</month>
+ <month type="11">พ.ย.</month>
+ <month type="12">ธ.ค.</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">อา.</day>
+ <day type="mon">จ.</day>
+ <day type="tue">อ.</day>
+ <day type="wed">พ.</day>
+ <day type="thu">พฤ.</day>
+ <day type="fri">ศ.</day>
+ <day type="sat">ส.</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">วันอาทิตย์</day>
+ <day type="sun" alt="proposed-u153-1" draft="unconfirmed">อาทิตย์</day>
+ <day type="mon">วันจันทร์</day>
+ <day type="mon" alt="proposed-u153-1" draft="unconfirmed">จันทร์</day>
+ <day type="tue">วันอังคาร</day>
+ <day type="tue" alt="proposed-u153-1" draft="unconfirmed">อังคาร</day>
+ <day type="wed">วันพุธ</day>
+ <day type="wed" alt="proposed-u153-1" draft="unconfirmed">พุธ</day>
+ <day type="thu">วันพฤหัสบดี</day>
+ <day type="thu" alt="proposed-u153-1" draft="unconfirmed">พฤหัสบดี</day>
+ <day type="fri">วันศุà¸à¸£à¹Œ</day>
+ <day type="fri" alt="proposed-u153-1" draft="unconfirmed">ศุà¸à¸£à¹Œ</day>
+ <day type="sat">วันเสาร์</day>
+ <day type="sat" alt="proposed-u153-1" draft="unconfirmed">เสาร์</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">อ</day>
+ <day type="mon">จ</day>
+ <day type="tue">อ</day>
+ <day type="wed">พ</day>
+ <day type="thu">พ</day>
+ <day type="fri">ศ</day>
+ <day type="sat">ส</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1">ไตรมาส 1</quarter>
+ <quarter type="2">ไตรมาส 2</quarter>
+ <quarter type="3">ไตรมาส 3</quarter>
+ <quarter type="4">ไตรมาส 4</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraNames>
+ <era type="0">ปีà¸à¹ˆà¸­à¸™à¸„ริสต์ศัà¸à¸£à¸²à¸Šà¸—ี่</era>
+ <era type="1">คริสต์ศัà¸à¸£à¸²à¸Š</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">ปีà¸à¹ˆà¸­à¸™ ค.ศ. ที่</era>
+ <era type="1">ค.ศ.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE'ที่ 'd MMMM G yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>d/M/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>H' นาฬิà¸à¸² 'm' นาที 'ss' วินาที'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H' นาฬิà¸à¸² 'm' นาที'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <dateTimeFormatLength>
+ <dateTimeFormat>
+ <pattern>{1}, {0}</pattern>
+ </dateTimeFormat>
+ </dateTimeFormatLength>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">d/M</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">M/yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName>สมัย</displayName>
+ </field>
+ <field type="year">
+ <displayName>ปี</displayName>
+ </field>
+ <field type="month">
+ <displayName>เดือน</displayName>
+ </field>
+ <field type="week">
+ <displayName>สัปดาห์</displayName>
+ </field>
+ <field type="day">
+ <displayName>วัน</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>วันในสัปดาห์</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName>ช่วงวัน</displayName>
+ </field>
+ <field type="hour">
+ <displayName>ชั่วโมง</displayName>
+ </field>
+ <field type="minute">
+ <displayName>นาที</displayName>
+ </field>
+ <field type="second">
+ <displayName>วินาที</displayName>
+ </field>
+ <field type="zone">
+ <displayName>เขต</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HHmm;-HHmm</hourFormat>
+ <zone type="America/Argentina/ComodRivadavia">
+ <exemplarCity>โคมอดริวาดาเวีย</exemplarCity>
+ </zone>
+ <zone type="Europe/Belfast">
+ <exemplarCity>เบลฟัสต์</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Rothera">
+ <exemplarCity>โรเทรา</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Palmer">
+ <exemplarCity>พาล์เมอร์</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>ขั้วโลà¸à¹ƒà¸•à¹‰</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Syowa">
+ <exemplarCity>เซียวา</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Mawson">
+ <exemplarCity>มาว์ซัน</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Davis">
+ <exemplarCity>เดวิส</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Vostok">
+ <exemplarCity>วอสทอà¸</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Casey">
+ <exemplarCity>เคเซย์</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity>ดูมอนต์ดียูร์วิลล์</exemplarCity>
+ </zone>
+ <zone type="Antarctica/McMurdo">
+ <exemplarCity>à¹à¸¡à¸„มูร์ดู</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Rio_Gallegos">
+ <exemplarCity>ริโอà¸à¸²à¸¥à¹€à¸¥à¸à¸­à¸ª</exemplarCity>
+ </zone>
+ <zone type="America/Mendoza">
+ <exemplarCity>เมนดูซา</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/San_Juan">
+ <exemplarCity>ซานจวน</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Ushuaia">
+ <exemplarCity>อูชูเอีย</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/La_Rioja">
+ <exemplarCity>ลาริโอจา</exemplarCity>
+ </zone>
+ <zone type="America/Catamarca">
+ <exemplarCity>คาตามาร์à¸à¸²</exemplarCity>
+ </zone>
+ <zone type="America/Jujuy">
+ <exemplarCity>จูจิว</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Tucuman">
+ <exemplarCity>ทูคูà¹à¸¡à¸™</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity>คอร์โดบา</exemplarCity>
+ </zone>
+ <zone type="America/Buenos_Aires">
+ <exemplarCity>บัวโนสไอเรส</exemplarCity>
+ </zone>
+ <zone type="Australia/Perth">
+ <exemplarCity>เพิิร์ท</exemplarCity>
+ </zone>
+ <zone type="Australia/Darwin">
+ <exemplarCity>ดาร์วิน</exemplarCity>
+ </zone>
+ <zone type="Australia/Adelaide">
+ <exemplarCity>à¹à¸­à¸”ิเลด</exemplarCity>
+ </zone>
+ <zone type="Australia/Broken_Hill">
+ <exemplarCity>โบรà¸à¹€à¸„นฮิว</exemplarCity>
+ </zone>
+ <zone type="Australia/Currie">
+ <exemplarCity>คูร์รี</exemplarCity>
+ </zone>
+ <zone type="Australia/Melbourne">
+ <exemplarCity>เมลเบิร์น</exemplarCity>
+ </zone>
+ <zone type="Australia/Hobart">
+ <exemplarCity>โฮบาร์ต</exemplarCity>
+ </zone>
+ <zone type="Australia/Lindeman">
+ <exemplarCity>ลินดีà¹à¸¡à¸™</exemplarCity>
+ </zone>
+ <zone type="Australia/Sydney">
+ <exemplarCity>ซิดนีย์</exemplarCity>
+ </zone>
+ <zone type="Australia/Brisbane">
+ <exemplarCity>บริสเบน</exemplarCity>
+ </zone>
+ <zone type="Australia/Lord_Howe">
+ <exemplarCity>ลอร์ดโฮวี</exemplarCity>
+ </zone>
+ <zone type="America/Eirunepe">
+ <exemplarCity>เอรูเนเป</exemplarCity>
+ </zone>
+ <zone type="America/Rio_Branco">
+ <exemplarCity>ริโอบรังโà¸</exemplarCity>
+ </zone>
+ <zone type="America/Porto_Velho">
+ <exemplarCity references="RP3">ปอร์ตูเวลโย</exemplarCity>
+ </zone>
+ <zone type="America/Boa_Vista">
+ <exemplarCity>บัววีชตา</exemplarCity>
+ </zone>
+ <zone type="America/Manaus">
+ <exemplarCity>มาเนาส์</exemplarCity>
+ </zone>
+ <zone type="America/Cuiaba">
+ <exemplarCity>à¸à¸¸à¸¢à¸²à¸šà¸²</exemplarCity>
+ </zone>
+ <zone type="America/Campo_Grande">
+ <exemplarCity>à¸à¸±à¸¡à¸›à¸¹à¸à¸£à¸±à¸¡à¸”ี</exemplarCity>
+ </zone>
+ <zone type="America/Belem">
+ <exemplarCity>เบเลง</exemplarCity>
+ </zone>
+ <zone type="America/Araguaina">
+ <exemplarCity>อาราà¸à¸±à¸§à¸™à¸²</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>เซาเปาลู</exemplarCity>
+ </zone>
+ <zone type="America/Bahia">
+ <exemplarCity references="RP3">บาเยีย</exemplarCity>
+ </zone>
+ <zone type="America/Fortaleza">
+ <exemplarCity>ฟอร์ตาเลซา</exemplarCity>
+ </zone>
+ <zone type="America/Maceio">
+ <exemplarCity>มาเซโอ</exemplarCity>
+ </zone>
+ <zone type="America/Recife">
+ <exemplarCity>เรซีเฟ</exemplarCity>
+ </zone>
+ <zone type="America/Noronha">
+ <exemplarCity>โนรอนฮา</exemplarCity>
+ </zone>
+ <zone type="America/Dawson">
+ <exemplarCity>ดอว์สัน</exemplarCity>
+ </zone>
+ <zone type="America/Whitehorse">
+ <exemplarCity>ไวต์ฮอร์ส</exemplarCity>
+ </zone>
+ <zone type="America/Vancouver">
+ <exemplarCity>à¹à¸§à¸™à¸„ูเวอร์</exemplarCity>
+ </zone>
+ <zone type="America/Dawson_Creek">
+ <exemplarCity>ดอว์สัน ครีà¸</exemplarCity>
+ </zone>
+ <zone type="America/Yellowknife">
+ <exemplarCity>เยลโลว์ไนฟ์</exemplarCity>
+ </zone>
+ <zone type="America/Inuvik">
+ <exemplarCity>อินูวิà¸</exemplarCity>
+ </zone>
+ <zone type="America/Edmonton">
+ <exemplarCity>เอดมันตัน</exemplarCity>
+ </zone>
+ <zone type="America/Swift_Current">
+ <exemplarCity>สวิฟต์เคอร์เรนต์</exemplarCity>
+ </zone>
+ <zone type="America/Cambridge_Bay">
+ <exemplarCity>อ่าวà¹à¸„มบริดจ์</exemplarCity>
+ </zone>
+ <zone type="America/Regina">
+ <exemplarCity>ริไจนา</exemplarCity>
+ </zone>
+ <zone type="America/Winnipeg">
+ <exemplarCity>วินนิเพà¸</exemplarCity>
+ </zone>
+ <zone type="America/Rainy_River">
+ <exemplarCity>เรนนี่ริเวอร์</exemplarCity>
+ </zone>
+ <zone type="America/Rankin_Inlet">
+ <exemplarCity>à¹à¸£à¸‡à¸à¸´à¸™à¸­à¸´à¸™à¹€à¸¥à¹‡à¸•</exemplarCity>
+ </zone>
+ <zone type="America/Thunder_Bay">
+ <exemplarCity>ทันเดอร์เบย์</exemplarCity>
+ </zone>
+ <zone type="America/Nipigon">
+ <exemplarCity>นิปิà¸à¸­à¸™</exemplarCity>
+ </zone>
+ <zone type="America/Coral_Harbour">
+ <exemplarCity>โครัลฮาร์เบอร์</exemplarCity>
+ </zone>
+ <zone type="America/Toronto">
+ <exemplarCity>โทรอนโต</exemplarCity>
+ </zone>
+ <zone type="America/Montreal">
+ <exemplarCity>มอนทริออล</exemplarCity>
+ </zone>
+ <zone type="America/Iqaluit">
+ <exemplarCity>อีà¸à¸§à¸²à¸¥à¸´à¸•</exemplarCity>
+ </zone>
+ <zone type="America/Pangnirtung">
+ <exemplarCity>พางนีทัง</exemplarCity>
+ </zone>
+ <zone type="America/Moncton">
+ <exemplarCity>มองตัน</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <exemplarCity>à¹à¸®à¸¥à¸´à¹à¸Ÿà¸à¸‹à¹Œ</exemplarCity>
+ </zone>
+ <zone type="America/Goose_Bay">
+ <exemplarCity>à¸à¸¹à¸ªà¹€à¸šà¸¢à¹Œ</exemplarCity>
+ </zone>
+ <zone type="America/Glace_Bay">
+ <exemplarCity>อ่าวà¹à¸à¸¥à¸‹</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <exemplarCity>เซนต์จอนส์</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity references="RP3">à¸à¸´à¸™à¸Šà¸²à¸‹à¸²</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity>ลูบัมบาชิ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>อีสเตอร์</exemplarCity>
+ </zone>
+ <zone type="America/Santiago">
+ <exemplarCity references="RP3">ซันติอาโà¸</exemplarCity>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity>à¸à¸±à¸Šà¸à¸²à¸£à¹Œ</exemplarCity>
+ </zone>
+ <zone type="Asia/Urumqi">
+ <exemplarCity>อุรุมชี</exemplarCity>
+ </zone>
+ <zone type="Asia/Chongqing">
+ <exemplarCity>ฉงชิ่ง</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity>เซี่ยงไฮ้</exemplarCity>
+ </zone>
+ <zone type="Asia/Harbin">
+ <exemplarCity>ฮาร์บิน</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity>à¸à¸²à¸¥à¸²à¸›à¸²à¸à¸­à¸ª</exemplarCity>
+ </zone>
+ <zone type="America/Guayaquil">
+ <exemplarCity>à¸à¸±à¸§à¸¢à¸²à¸à¸´à¸¥</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>คานารี</exemplarCity>
+ </zone>
+ <zone type="Africa/Ceuta">
+ <exemplarCity references="RP3">เซวตา</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity>มาดริด</exemplarCity>
+ </zone>
+ <zone type="Pacific/Truk">
+ <exemplarCity>ทรัà¸</exemplarCity>
+ </zone>
+ <zone type="Pacific/Ponape">
+ <exemplarCity>โพนาป</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kosrae">
+ <exemplarCity>คอสà¹à¸£</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>ลอนดอน</exemplarCity>
+ </zone>
+ <zone type="America/Thule">
+ <exemplarCity>ทูเล</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity>à¸à¸­à¸”à¹à¸˜à¸š</exemplarCity>
+ </zone>
+ <zone type="America/Scoresbysund">
+ <exemplarCity>สà¸à¸­à¹€à¸£à¸ªà¹„บซันด์</exemplarCity>
+ </zone>
+ <zone type="America/Danmarkshavn">
+ <exemplarCity>ดันมาร์à¸à¸Šà¸²à¸Ÿà¸™à¹Œ</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity>จาà¸à¸²à¸£à¹Œà¸•à¸²</exemplarCity>
+ </zone>
+ <zone type="Asia/Pontianak">
+ <exemplarCity>พอนเทียนัà¸</exemplarCity>
+ </zone>
+ <zone type="Asia/Makassar">
+ <exemplarCity>มาà¸à¸±à¸ªà¸‹à¸²à¸£à¹Œ</exemplarCity>
+ </zone>
+ <zone type="Asia/Jayapura">
+ <exemplarCity>จายาพูรา</exemplarCity>
+ </zone>
+ <zone type="Pacific/Enderbury">
+ <exemplarCity>เอ็นเดอร์บูรี</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kiritimati">
+ <exemplarCity>คิริทิมาตี</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tarawa">
+ <exemplarCity>ทาราวา</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtau">
+ <exemplarCity>อัคทัว</exemplarCity>
+ </zone>
+ <zone type="Asia/Oral">
+ <exemplarCity>ออรัล</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtobe">
+ <exemplarCity>อัคโทบี</exemplarCity>
+ </zone>
+ <zone type="Asia/Qyzylorda">
+ <exemplarCity>ไคซีลอร์ดา</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity>อัลมาตี</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kwajalein">
+ <exemplarCity>ควจาเลน</exemplarCity>
+ </zone>
+ <zone type="Pacific/Majuro">
+ <exemplarCity>มาจูโร</exemplarCity>
+ </zone>
+ <zone type="Asia/Hovd">
+ <exemplarCity>ฮอฟด์</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity references="RP3">อูลานบาตอร์</exemplarCity>
+ </zone>
+ <zone type="Asia/Choibalsan">
+ <exemplarCity>โชบาลซาน</exemplarCity>
+ </zone>
+ <zone type="America/Tijuana">
+ <exemplarCity>ทิฮัวนา</exemplarCity>
+ </zone>
+ <zone type="America/Hermosillo">
+ <exemplarCity>เอร์โมซีโย</exemplarCity>
+ </zone>
+ <zone type="America/Mazatlan">
+ <exemplarCity>มาซาทลาน</exemplarCity>
+ </zone>
+ <zone type="America/Chihuahua">
+ <exemplarCity>ชีวาวา</exemplarCity>
+ </zone>
+ <zone type="America/Monterrey">
+ <exemplarCity>มอนเตร์เรย์</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>เม็à¸à¸‹à¸´à¹‚à¸à¸‹à¸´à¸•à¸µ</exemplarCity>
+ </zone>
+ <zone type="America/Merida">
+ <exemplarCity>เมรีดา</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>à¹à¸„นคุน</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuala_Lumpur">
+ <exemplarCity>à¸à¸±à¸§à¸¥à¸²à¸¥à¸±à¸¡à¹€à¸›à¸­à¸£à¹Œ</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuching">
+ <exemplarCity>à¸à¸¹à¸Šà¸´à¸‡</exemplarCity>
+ </zone>
+ <zone type="Pacific/Chatham">
+ <exemplarCity>à¹à¸Šà¹à¸˜à¸¡</exemplarCity>
+ </zone>
+ <zone type="Pacific/Auckland">
+ <exemplarCity>โอคà¹à¸¥à¸™à¸”์</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity>ทาฮิติ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Marquesas">
+ <exemplarCity>มาร์คิวซัส</exemplarCity>
+ </zone>
+ <zone type="Pacific/Gambier">
+ <exemplarCity>à¹à¸à¸¡à¹€à¸šà¸­à¸£à¹Œ</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>อาซอเรส</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Madeira">
+ <exemplarCity>มาเดรา</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>ลิสบอน</exemplarCity>
+ </zone>
+ <zone type="Europe/Kaliningrad">
+ <exemplarCity>คาลินิงà¸à¸£à¸²à¸”</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>มอสโค</exemplarCity>
+ </zone>
+ <zone type="Europe/Samara">
+ <exemplarCity>ซามารา</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>ยีคาเตอรินเบิร์à¸</exemplarCity>
+ </zone>
+ <zone type="Asia/Omsk">
+ <exemplarCity>โอมสà¸à¹Œ</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity>โนโวซิบิร์สà¸à¹Œ</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>ครัสโนยาร์สà¸à¹Œ</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>ยาคุตสค์</exemplarCity>
+ </zone>
+ <zone type="Asia/Vladivostok">
+ <exemplarCity>วลาดิโวสต็อà¸</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>ซาคาลิน</exemplarCity>
+ </zone>
+ <zone type="Asia/Magadan">
+ <exemplarCity references="RP3">มาà¸à¸²à¸”าน</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>คามชัตà¸à¸²</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity>อานาดีร์</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Jan_Mayen">
+ <exemplarCity>à¹à¸ˆà¸™à¸¡à¸²à¹€à¸¢à¸™</exemplarCity>
+ </zone>
+ <zone type="Arctic/Longyearbyen">
+ <exemplarCity>ลองเยียร์เบียน</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>อัซโà¸à¸£à¹‡à¸­à¸”</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>à¸à¸µà¸Ÿ</exemplarCity>
+ </zone>
+ <zone type="Europe/Simferopol">
+ <exemplarCity>ซิมเฟอโรโปล</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>ซาโปโรซี</exemplarCity>
+ </zone>
+ <zone type="Pacific/Midway">
+ <exemplarCity>มิดเวย์</exemplarCity>
+ </zone>
+ <zone type="Pacific/Johnston">
+ <exemplarCity>จอห์นสตัน</exemplarCity>
+ </zone>
+ <zone type="Pacific/Wake">
+ <exemplarCity>เวà¸</exemplarCity>
+ </zone>
+ <zone type="America/Adak">
+ <exemplarCity>เอดัà¸</exemplarCity>
+ </zone>
+ <zone type="America/Nome">
+ <exemplarCity>นอม</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <exemplarCity>โฮโนลูลู</exemplarCity>
+ </zone>
+ <zone type="America/Anchorage">
+ <exemplarCity>à¹à¸­à¸™à¸Šà¸­à¹€à¸£à¸ˆ</exemplarCity>
+ </zone>
+ <zone type="America/Yakutat">
+ <exemplarCity>ยาà¸à¸¹à¸—ัต</exemplarCity>
+ </zone>
+ <zone type="America/Juneau">
+ <exemplarCity references="RP3">จูโน</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <exemplarCity>ลอสà¹à¸­à¸‡à¹€à¸ˆà¸¥à¸´à¸ª</exemplarCity>
+ </zone>
+ <zone type="America/Boise">
+ <exemplarCity>บอยซี</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <exemplarCity>ฟีนิà¸à¸‹à¹Œ</exemplarCity>
+ </zone>
+ <zone type="America/Shiprock">
+ <exemplarCity>ชิปร็อà¸</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <exemplarCity>เดนเวอร์</exemplarCity>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity>เซนเตอร์</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <exemplarCity>ชิคาโà¸</exemplarCity>
+ </zone>
+ <zone type="America/Menominee">
+ <exemplarCity>เมโนมินี</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vincennes">
+ <exemplarCity>วินเซนเนส</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Petersburg">
+ <exemplarCity>ปีเตอร์สเบิร์à¸</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Knox">
+ <exemplarCity>นอà¸à¸‹à¹Œ</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Marengo">
+ <exemplarCity>มาเรงโà¸</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <exemplarCity>อินเดียà¹à¸™à¹‚พลิส</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vevay">
+ <exemplarCity>วีเวย์</exemplarCity>
+ </zone>
+ <zone type="America/Kentucky/Monticello">
+ <exemplarCity>มอนติเซลโล</exemplarCity>
+ </zone>
+ <zone type="America/Detroit">
+ <exemplarCity>ดีทรอยต์</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <exemplarCity>นิวยอร์à¸</exemplarCity>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity>ซามาร์à¸à¸²à¸™à¸”์</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>ทาชเคนต์</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ADP">
+ <displayName>เปเซตาอันดอร์รา</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>ดีà¹à¸£à¸«à¹Œà¸¡à¸ªà¸«à¸£à¸±à¸à¸­à¸²à¸«à¸£à¸±à¸šà¹€à¸­à¸¡à¸´à¹€à¸£à¸•à¸ªà¹Œ</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>อัฟà¸à¸²à¸™à¸µ (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>อัฟà¸à¸²à¸™à¸µ</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName>เลà¸à¸­à¸±à¸¥à¸šà¸²à¹€à¸™à¸µà¸¢</displayName>
+ </currency>
+ <currency type="AMD">
+ <displayName>ดรัมอาเมเนีย</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName>à¹à¸­à¸™à¸—ิลลันà¸à¸´à¸¥à¹€à¸”อร์เนเธอร์à¹à¸¥à¸™à¸”์</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName>à¸à¸§à¸²à¸™à¸‹à¸²à¹à¸­à¸‡à¹‚à¸à¸¥à¸²</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>à¸à¸§à¸²à¸™à¸‹à¸²à¹à¸­à¸‡à¹‚à¸à¸¥à¸² (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>นิวà¸à¸§à¸²à¸™à¸‹à¸²à¹à¸­à¸‡à¹‚à¸à¸¥à¸² (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>à¸à¸§à¸²à¸™à¸‹à¸²à¸£à¸µà¸ˆà¸±à¸ªà¸—าโดà¹à¸­à¸‡à¹‚à¸à¸¥à¸² (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>ออสตรัลอาเจนตินา</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>เปโซอาร์เจนติน่า (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>เปโซอาร์เจนติน่า</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>ชิลลิงออสเตรีย</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>เหรียà¸à¸­à¸­à¸ªà¹€à¸•à¸£à¹€à¸¥à¸µà¸¢</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>à¸à¸´à¸¥à¹€à¸”อร์อารูบา</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>มานัตอาเซอร์ไบจัน</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>ดีนาร์บอสเนีย-เฮอร์เซโà¸à¸§à¸µà¸™à¸²</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>มาร​์à¸à¸šà¸­à¸ªà¹€à¸™à¸µà¸¢-เฮอร์เซโà¸à¸§à¸µà¸™à¸²</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName>ดอลลาร์บาร์เบดอส</displayName>
+ </currency>
+ <currency type="BDT">
+ <displayName>ตาà¸à¸²à¸šà¸±à¸‡à¸à¸¥à¸²à¹€à¸—ศ</displayName>
+ </currency>
+ <currency type="BEC">
+ <displayName>ฟรังà¸à¹Œà¹€à¸šà¸¥à¹€à¸¢à¸µà¸¢à¸¡ (เปลี่ยนà¹à¸›à¸¥à¸‡à¹„ด้)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>ฟรังà¸à¹Œà¹€à¸šà¸¥à¹€à¸¢à¸µà¸¢à¸¡</displayName>
+ </currency>
+ <currency type="BEL">
+ <displayName>ฟรังà¸à¹Œà¹€à¸šà¸¥à¹€à¸¢à¸µà¸¢à¸¡ (à¸à¸²à¸£à¹€à¸‡à¸´à¸™)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>ฮาร์ดลีฟบัลà¹à¸à¹€à¸£à¸µà¸¢</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName>นิวลีฟบัลà¹à¸à¹€à¸£à¸µà¸¢</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>ดีนาร์บาห์เรน</displayName>
+ </currency>
+ <currency type="BIF">
+ <displayName>ฟรังà¸à¹Œà¸šà¸¸à¸£à¸¸à¸™à¸”ี</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName>ดอลลาร์เบอร์มิวดา</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName>ดอลลาร์บรูไน</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>โบลิเวียโน</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>เปโซโบลิเวีย</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>มฟดอลโบลิเวีย</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>ครูเซโรโนโวบราซิล (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>ครูซาโดบราซิล</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>ครูเซโรบราซิล (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>รีล</displayName>
+ </currency>
+ <currency type="BRN">
+ <displayName>ครูซาโดโนโวบราซิล</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>ครูเซโรบราซิล</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>ดอลลาร์บาฮามาส</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>à¸à¸±à¸¥à¸—รัมภูà¸à¸²à¸™</displayName>
+ </currency>
+ <currency type="BUK">
+ <displayName>จัคพม่า [BUK]</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>พูลาบอตสวานา</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>นิวรูเบิลเบลารัสเซีย (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>รูเบิลเบลารัสเซีย</displayName>
+ </currency>
+ <currency type="BZD">
+ <displayName>ดอลลาร์เบลีซ</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>เหรียà¸à¸„านาดา</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>ฟรังà¸à¹Œà¸„องโà¸</displayName>
+ </currency>
+ <currency type="CHE">
+ <displayName>ยูโรดับเบิลยูไออาร์</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>ฟรังà¸à¹Œà¸ªà¸§à¸´à¸ª</displayName>
+ </currency>
+ <currency type="CHW">
+ <displayName>ฟรังà¸à¹Œà¸”ับเบิลยูไออาร์</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>ฟูเมนโตชิลี</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>เปโซชิลี</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>หยวนเหรินเหมินบี้</displayName>
+ <symbol>ï¿¥</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>เปโซโคลัมเบีย</displayName>
+ </currency>
+ <currency type="COU">
+ <displayName>วาเลอร์รีล</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>โคลอนคอสตาริà¸à¸²</displayName>
+ </currency>
+ <currency type="CSD">
+ <displayName>ไดนาร์เซอร์เบีย</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>ฮาร์ดโครูนาเช็à¸à¹‚à¸à¸ªà¹‚ลวัà¸</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>เปโซคิวบา</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>เคปเวอร์เดอร์เอสคูโด</displayName>
+ </currency>
+ <currency type="CYP">
+ <displayName>ปอนด์ไซปรัส</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName>โครูนาสาธารณรัà¸à¹€à¸Šà¹‡à¸</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>ออสต์มาร์à¸à¹€à¸¢à¸­à¸£à¸¡à¸±à¸™à¸•à¸°à¸§à¸±à¸™à¸­à¸­à¸</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>มาร์à¸à¹€à¸¢à¸­à¸£à¸¡à¸™à¸µ</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>ฟรังà¸à¹Œà¸ˆà¸´à¸šà¸¹à¸•à¸µ</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName>โครนเดนมาร์à¸</displayName>
+ </currency>
+ <currency type="DOP">
+ <displayName>เปโซโดมินิà¸à¸²</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName>ดีนาร์à¹à¸­à¸¥à¸ˆà¸µà¹€à¸£à¸µà¸¢</displayName>
+ </currency>
+ <currency type="ECS">
+ <displayName>ซูเà¸à¸£à¹€à¸­à¸à¸§à¸²à¸”อร์</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>วาเลอร์คอนสà¹à¸•à¸™à¸•à¹Œà¹€à¸­à¸à¸§à¸²à¸”อร์</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>ครูนเอสโตเนีย</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>ปอนด์อียิปต์</displayName>
+ </currency>
+ <currency type="EQE">
+ <displayName>เอ็à¸à¹€à¸§à¹€à¸¥</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>นาà¸à¸Ÿà¸²à¹€à¸­à¸£à¸´à¹€à¸—รีย</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName>เปเซตาสเปน (บัà¸à¸Šà¸µ)</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName>เปเซตาสเปน (บัà¸à¸Šà¸µà¸—ี่เปลี่ยนà¹à¸›à¸¥à¸‡à¹„ด้)</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>เปเซตาสเปน</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>เบอรร์เอธิโอเปีย</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>ยูโร</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>มาร์à¸à¸à¸²à¸Ÿà¸´à¸™à¹à¸¥à¸™à¸”์</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>เหรียà¸à¸Ÿà¸´à¸ˆà¸´</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>ปอนด์เà¸à¸²à¸°à¸Ÿà¸­à¸¥à¹Œà¸à¹à¸¥à¸™à¸”์</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>เหรียà¸à¸à¸£à¸±à¹ˆà¸‡à¹€à¸¨à¸ª</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>ปอนด์สเตอร์ลิงอังà¸à¸¤à¸©</displayName>
+ <symbol>\u00A3</symbol>
+ </currency>
+ <currency type="GEK">
+ <displayName>คูปอนลาริตจอร์เจีย</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>ลารีจอร์เจีย</displayName>
+ </currency>
+ <currency type="GHC">
+ <displayName>เซดีà¸à¸²à¸™à¸²</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>ปอนด์ยิบรอลตาร์</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>ดาลาซีà¹à¸à¸¡à¹€à¸šà¸µà¸¢</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>ฟรังà¸à¹Œà¸à¸´à¸™à¸µ</displayName>
+ </currency>
+ <currency type="GNS">
+ <displayName>ไซลีà¸à¸´à¸™à¸µ</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>เอ็à¸à¹€à¸§à¹€à¸¥à¸à¸´à¸™à¸µà¸™à¸²à¸­à¸´à¹€à¸„วทอเรียลà¸à¸´à¸™à¸µ</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>ดรัชมาà¸à¸£à¸µà¸</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>เควตซัลà¸à¸±à¸§à¹€à¸•à¸¡à¸²à¸¥à¸²</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>เปโซà¸à¸µà¸™à¸µà¸šà¸´à¸ªà¹€à¸‹à¸²</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>ดอลลาร์à¸à¸²à¸¢à¸­à¸²à¸™à¸²</displayName>
+ </currency>
+ <currency type="HKD">
+ <displayName>เหรียà¸à¸®à¹ˆà¸­à¸‡à¸à¸‡</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>เลมปิราฮอดูรัส</displayName>
+ </currency>
+ <currency type="HRD">
+ <displayName>ดีนาร์โครเอเชีย</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>คูนาโครเอเชีย</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>à¸à¸­à¸£à¹Œà¸”เฮติ</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>ฟอรินต์ฮังà¸à¸²à¸£à¸µ</displayName>
+ </currency>
+ <currency type="IDR">
+ <displayName>รูเปียอินโดนีเซีย</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>ปอนด์ไอริช</displayName>
+ <symbol>IR\u00A3</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>ปอนด์อิสราเอล</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>เชเà¸à¸¥à¸­à¸´à¸ªà¸£à¸²à¹€à¸­à¸¥</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>รูปีอินเดีย</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>ดีนาร์อิรัà¸</displayName>
+ </currency>
+ <currency type="IRR">
+ <displayName>เรียลอิหร่าน</displayName>
+ </currency>
+ <currency type="ISK">
+ <displayName>โครนาไอซ์à¹à¸¥à¸™à¸”์</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>ลีราอิตาลี</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>ดอลลาร์จาเมà¸à¸²</displayName>
+ </currency>
+ <currency type="JOD">
+ <displayName>ดีนาร์จอร์à¹à¸”น</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>เยน</displayName>
+ <symbol draft="unconfirmed">\u00A5</symbol>
+ </currency>
+ <currency type="KES">
+ <displayName>ชิลลิ่งเคนยา</displayName>
+ </currency>
+ <currency type="KGS">
+ <displayName>ซอมคีร์à¸à¸µà¸‹à¸ªà¸–าน</displayName>
+ </currency>
+ <currency type="KHR">
+ <displayName>เรียลà¸à¸±à¸¡à¸žà¸¹à¸Šà¸²</displayName>
+ </currency>
+ <currency type="KMF">
+ <displayName>ฟรังà¸à¹Œà¸„อโมโรส</displayName>
+ </currency>
+ <currency type="KPW">
+ <displayName>วอนเà¸à¸²à¸«à¸¥à¸µà¹€à¸«à¸™à¸·à¸­</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>วอนเà¸à¸²à¸«à¸¥à¸µà¹ƒà¸•à¹‰</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>ดีนาร์คูเวต</displayName>
+ </currency>
+ <currency type="KYD">
+ <displayName>ดอลลาร์หมู่เà¸à¸²à¸°à¹€à¸„ย์à¹à¸¡à¸™</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>เทนจ์คาซัคสถาน</displayName>
+ </currency>
+ <currency type="LAK">
+ <displayName>à¸à¸µà¸šà¸¥à¸²à¸§</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>ปอนด์เลบานอน</displayName>
+ </currency>
+ <currency type="LKR">
+ <displayName>รูปีศรีลังà¸à¸²</displayName>
+ </currency>
+ <currency type="LRD">
+ <displayName>ดอลลาร์ไลบีเรีย</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>โลตีเลโซโท</displayName>
+ </currency>
+ <currency type="LSM">
+ <displayName>มาโลตี</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>ลีตาลิทัวเนีย</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>ทาโลนัสลิทัวเนีย</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName>ฟรังà¸à¹Œà¸¥à¸±à¸à¹€à¸‹à¸¡à¹€à¸šà¸´à¸£à¹Œà¸ [LUC]</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>ฟรังà¸à¹Œà¸¥à¸±à¸à¹€à¸‹à¸¡à¹€à¸šà¸´à¸£à¹Œà¸</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName>ฟรังà¸à¹Œà¸¥à¸±à¸à¹€à¸‹à¸¡à¹€à¸šà¸´à¸£à¹Œà¸ [LUL]</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>ลัตส์ลัตเวีย</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>รูเบิลลัตเวีย</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>ดีนาร์ลิเบีย</displayName>
+ </currency>
+ <currency type="MAD">
+ <displayName>ดีà¹à¸£à¸«à¹Œà¸¡à¹‚มร็อà¸à¹‚à¸</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>ฟรังà¸à¹Œà¹‚มร็อà¸à¹‚à¸</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>ลิวมอลโดวาน</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>อาเรียรีมาดาà¸à¸±à¸ªà¸à¸²à¸£à¹Œ</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>ฟรังà¸à¹Œà¸¡à¸²à¸”าà¸à¸±à¸ªà¸à¸²à¸£à¹Œ</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>ดีนาร์มาซิโดเนีย</displayName>
+ </currency>
+ <currency type="MLF">
+ <displayName>ฟรังà¸à¹Œà¸¡à¸²à¸¥à¸µ</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>จัคพม่า</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>ตูà¸à¸£à¸´à¸à¸¡à¸­à¸‡à¹‚à¸à¹€à¸¥à¸µà¸¢</displayName>
+ </currency>
+ <currency type="MOP">
+ <displayName>ปาตาà¸à¸²à¸¡à¸²à¹€à¸à¹Šà¸²</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>ออà¸à¸´à¸§à¸¢à¸²à¸¡à¸­à¸£à¸´à¹€à¸•à¹€à¸™à¸µà¸¢</displayName>
+ </currency>
+ <currency type="MTL">
+ <displayName>ลีรามอลตา</displayName>
+ </currency>
+ <currency type="MTP">
+ <displayName>ปอนด์มอลตา</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>รูปีมอริเชียส</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>รูฟิยาเà¸à¸²à¸°à¸¡à¸±à¸¥à¸”ีฟส์</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>à¸à¸§à¸²à¸Šà¸²à¸¡à¸²à¸¥à¸²à¸§à¸µ</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName>เปโซà¹à¸¡à¹‡à¸à¸‹à¸´à¹‚à¸</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>ซิลเวอรืเม็à¸à¸‹à¸´à¹‚ภ(1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>อินเวอร์เซียนเม็à¸à¸‹à¸´à¹‚à¸</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>ริงà¸à¸´à¸•à¸¡à¸²à¹€à¸¥à¹€à¸‹à¸µà¸¢</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>เอสคูโดโมซัมบิà¸</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>เมทิคัลโมซัมบิà¸</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName>ดอลลาร์นามิเบีย</displayName>
+ </currency>
+ <currency type="NGN">
+ <displayName>ไนราไนจีเรีย</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>คอร์โดบานิà¸à¸²à¸£à¸²à¸à¸±à¸§</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>คอร์โดบาโอโรนิà¸à¸²à¸£à¸²à¸à¸±à¸§</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>à¸à¸´à¸¥à¹€à¸”อร์เนเธอร์à¹à¸¥à¸™à¸”์</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>โครนนอร์เวย์</displayName>
+ </currency>
+ <currency type="NPR">
+ <displayName>รูปีเนปาล</displayName>
+ </currency>
+ <currency type="NZD">
+ <displayName>เหรียà¸à¸™à¸´à¸§à¸‹à¸µà¹à¸¥à¸™à¸”์</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>เรียลโอมาน</displayName>
+ </currency>
+ <currency type="PAB">
+ <displayName>บัลบัวปานามา</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>อินตีเปรู</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>ซอลนูโวเปรู</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>ซอลเปรู</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>à¸à¸µà¸™à¸²à¸›à¸²à¸›à¸±à¸§à¸™à¸´à¸§à¸à¸µà¸™à¸µ</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>เปโซฟิลิปปินส์</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>รูปีปาà¸à¸µà¸ªà¸–าน</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>ซลอตีโปà¹à¸¥à¸™à¸”์</displayName>
+ </currency>
+ <currency type="PLZ">
+ <displayName>ซลอตีโปà¹à¸¥à¸™à¸”์ [PLZ]</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>เอสคูโดโปรตุเà¸à¸ª</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>à¸à¸±à¸§à¸£à¸²à¸™à¸µà¸›à¸²à¸£à¸²à¸à¸§à¸±à¸¢</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>เรียลà¸à¸²à¸•à¸²à¸£à¹Œ</displayName>
+ </currency>
+ <currency type="RHD">
+ <displayName>ดอลลาร์โรดีเซีย</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>ลิวโรมาเนียเà¸à¹ˆà¸²</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>รูเบิลรัสเซีย</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>รูเบิลรัสเซีย (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>ฟรังà¸à¹Œà¸£à¸§à¸±à¸™à¸”า</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>เรียลซาอุดิอาระเบีย</displayName>
+ </currency>
+ <currency type="SBD">
+ <displayName>ดอลลาร์เà¸à¸²à¸°à¹‚ซโลมอน</displayName>
+ </currency>
+ <currency type="SCR">
+ <displayName>รูปีเซเชลส์</displayName>
+ </currency>
+ <currency type="SDD">
+ <displayName>ดีนาร์ซูดาน</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>ปอนด์ซูดาน</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>โครนาสวีเดน</displayName>
+ </currency>
+ <currency type="SGD">
+ <displayName>เหรียà¸à¸ªà¸´à¸‡à¸„โปร์</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>ปอนด์เซนต์เฮเลนา</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>ทอลาร์สโลวีเนีย</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>โครูนาสโลวัà¸</displayName>
+ </currency>
+ <currency type="SLL">
+ <displayName>ลีโอนเซียร์ราลีโอน</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>ชิลลิงโซมาเลีย</displayName>
+ </currency>
+ <currency type="SRD">
+ <displayName>ดอลลาร์สุรินัม</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>à¸à¸´à¸¥à¹€à¸”อร์สุรินัม</displayName>
+ </currency>
+ <currency type="STD">
+ <displayName>ดอบราเซาตูเมà¹à¸¥à¸°à¸›à¸£à¸´à¸™à¸‹à¸´à¸›à¸µ</displayName>
+ </currency>
+ <currency type="SUR">
+ <displayName>รูเบิลโซเวียต</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>โคลอนเอลซัลวาดอร์</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>ปอนด์ซีเรีย</displayName>
+ </currency>
+ <currency type="SZL">
+ <displayName>ลิลันà¸à¸µà¸™à¸µà¸ªà¸§à¸²à¸‹à¸´à¹à¸¥à¸™à¸”์</displayName>
+ </currency>
+ <currency type="THB">
+ <displayName>บาท</displayName>
+ <symbol>฿</symbol>
+ </currency>
+ <currency type="TJR">
+ <displayName>รูเบิลทาจิà¸à¸´à¸ªà¸–าน</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>โซโมนีทาจิà¸à¸´à¸ªà¸–าน</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>มานัตเติร์à¸à¹€à¸¡à¸™à¸´à¸ªà¸–าน</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>ดีนาร์ตูนิเซีย</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>ปาอังà¸à¸²à¸•à¸­à¸‡à¸à¸²</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>เอสคูโดติมอร์</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>ลีราตุรà¸à¸µ</displayName>
+ </currency>
+ <currency type="TRY">
+ <displayName>ตุรà¸à¸µ ลีร่า ใหม่</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>ดอลลาร์ตรินิà¹à¸”ดà¹à¸¥à¸°à¹‚ตเบโà¸</displayName>
+ </currency>
+ <currency type="TWD">
+ <displayName>ดอลลาร์ไต้หวัน</displayName>
+ </currency>
+ <currency type="TZS">
+ <displayName>ชิลลิงà¹à¸—นซาเนีย</displayName>
+ </currency>
+ <currency type="UAH">
+ <displayName>ฮรีฟเนียยูเครน</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>คาร์โบวาเนตซ์ยูเครน</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>ซิลลิ่งอูà¸à¸±à¸™à¸”า (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>ชิลลิงยูà¸à¸±à¸™à¸”า</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>ดอร์ล่าร์สหรัà¸</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>เหรียà¸à¸ªà¸«à¸£à¸±à¸ (วันถัดไป)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>เหรียà¸à¸ªà¸«à¸£à¸±à¸ (วันเดียวà¸à¸±à¸™)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>เปโซอุรุà¸à¸§à¸±à¸¢ (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>เปโซอุรุà¸à¸§à¸±à¸¢</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName>ซัมอุซเบà¸à¸´à¸ªà¸–าน</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>โบลิวาร์เวเนซุเอลา</displayName>
+ </currency>
+ <currency type="VND">
+ <displayName>ดองเวียดนาม</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>วาตูวานูอาตู</displayName>
+ </currency>
+ <currency type="WST">
+ <displayName>ทาลาซามัวตะวันตà¸</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName>เงิน</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>ทอง</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>หน่วยคอมโพสิตยุโรป</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>หน่วยโมเนทารียุโรป</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>หน่วยบัà¸à¸Šà¸µà¸¢à¸¸à¹‚รป [XBC]</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>หน่วยบัà¸à¸Šà¸µà¸¢à¸¸à¹‚รป [XBD]</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>ดอลลาร์à¹à¸„ริบเบียนตะวันออà¸</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>หน่วยเงินตรายุโรป</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>ฟรังà¸à¹Œà¸—องà¸à¸£à¸±à¹ˆà¸‡à¹€à¸¨à¸ª</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName>พัลลาดีม</displayName>
+ </currency>
+ <currency type="XPT">
+ <displayName>à¹à¸žà¸¥à¸•à¸´à¸™à¸±à¸¡</displayName>
+ </currency>
+ <currency type="XTS">
+ <displayName>รหัสทดสอบเงินตรา</displayName>
+ </currency>
+ <currency type="XXX">
+ <displayName>ไม่มีหน่วยเงินตรา</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>ดีนาร์เยเมน</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>เรียลเยเมน</displayName>
+ </currency>
+ <currency type="YUD">
+ <displayName>ฮารืดดีนาร์ยูโà¸à¸ªà¸¥à¸²à¹€à¸§à¸µà¸¢</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>โนวิย์ดีนาร์ยูโà¸à¸ªà¸¥à¸²à¹€à¸§à¸µà¸¢</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>ดีนาร์ยูโà¸à¸ªà¸¥à¸²à¹€à¸§à¸µà¸¢</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>à¹à¸£à¸™à¸”์à¹à¸­à¸Ÿà¸£à¸´à¸à¸²à¹ƒà¸•à¹‰ (à¸à¸²à¸£à¹€à¸‡à¸´à¸™)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>à¹à¸£à¸™à¸”์à¹à¸­à¸Ÿà¸£à¸´à¸à¸²à¹ƒà¸•à¹‰</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName>à¸à¸§à¸²à¸Šà¸²à¹à¸‹à¸¡à¹€à¸šà¸µà¸¢</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>นิวà¹à¸‹à¸£à¹Œà¸„องโà¸</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>à¹à¸‹à¸£à¹Œà¸„องโà¸</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>ดอลลาร์ซิมบับเว</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>ใช่</yesstr>
+ <nostr>ไม่</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1">New Model English-Thai Dictionary ISBN:974-08-6456-2</reference>
+ <reference type="RP2" uri="http://lexitron.nectec.or.th">Lexitron English Thai Dictionary website</reference>
+ <reference type="RP3" uri="http://www.royin.go.th/upload/246/FileUpload/419_1494.pdf">The Royal Institute's Country, Region and Capital name list</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/th_TH.xml b/libs/Zend/Locale/Data/th_TH.xml
new file mode 100755
index 0000000000..44cdc543f2
--- /dev/null
+++ b/libs/Zend/Locale/Data/th_TH.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/28 01:56:26 $"/>
+ <language type="th"/>
+ <territory type="TH"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ae">อาเวสทาน</language>
+ <language type="ch">ชามอร์โร</language>
+ <language type="dsb">ซอร์เบียนต่ำ</language>
+ <language type="dz" draft="provisional">ดซองขา</language>
+ <language type="eka">อีà¸à¸²à¸ˆà¸¸à¸</language>
+ <language type="ewo">อีวันโด</language>
+ <language type="fat">ฟันติ</language>
+ <language type="grb">เà¸à¸£à¹‚บ</language>
+ <language type="hz">เฮเรโร</language>
+ <language type="ii">ชิชวนยี่</language>
+ <language type="inh">อิงà¸à¸¸à¸Š</language>
+ <language type="mk">มาซิโดเนีย</language>
+ <language type="mwl">มิรันดีส</language>
+ <language type="nap">เนียโพลิà¹à¸—น</language>
+ <language type="nr">เอ็นเดเบเลใต้</language>
+ <language type="phi" draft="provisional">ฟิลิปปินส์ [PHI]</language>
+ <language type="ro">โรมาเนีย</language>
+ <language type="ss">สวาติ</language>
+ <language type="ter">เทเรโน</language>
+ <language type="tk">เติร์à¸</language>
+ <language type="tn">สวานา</language>
+ <language type="ty">ตาฮิเตียน</language>
+ <language type="ur">อูรดู</language>
+ </languages>
+ <scripts>
+ <script type="Geor">จอร์เจียน</script>
+ <script type="Hung">ฮังà¸à¸²à¸£à¸µà¹‚บราณ</script>
+ <script type="Ital">อิตาลีโบราณ</script>
+ <script type="Mlym">มาลายาลัม</script>
+ </scripts>
+ <territories>
+ <territory type="AN">เนเธอร์à¹à¸¥à¸™à¸”์à¹à¸­à¸™à¸—ิลลิส</territory>
+ </territories>
+ <keys>
+ <key type="collation">ตรวจเทียบ</key>
+ </keys>
+ </localeDisplayNames>
+ <delimiters>
+ <quotationStart>'</quotationStart>
+ <quotationEnd>'</quotationEnd>
+ <alternateQuotationStart>&quot;</alternateQuotationStart>
+ <alternateQuotationEnd>&quot;</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;¤-#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ti.xml b/libs/Zend/Locale/Data/ti.xml
new file mode 100755
index 0000000000..12bc0a381d
--- /dev/null
+++ b/libs/Zend/Locale/Data/ti.xml
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.43 $"/>
+ <generation date="$Date: 2006/06/28 01:56:26 $"/>
+ <language type="ti"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <alias source="am"/>
+ </languages>
+ <scripts>
+ <script type="Ethi" draft="unconfirmed">áŠá‹°áˆ</script>
+ <script type="Latn" draft="unconfirmed">ላቲን</script>
+ </scripts>
+ <territories>
+ <alias source="am"/>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[០ᡠá£-á§ á¢ á  á¨ áŽ-᎙ á²-á¼ á©-ᱠሀ-ሠⶀ áˆ-ሟ ᎀ-ᎃ ⶠሠ-ሯ ⶂ ሰ-ሷ ⶃ ሸ-ሿ ⶄ ቀ-ቈ ቊ-በá‰-ቖ ቘ ቚ-በበ-ቧ ᎄ-ᎇ ⶅ ቨ-ቷ ⶆ ቸ-ቿ ⶇ ኀ-ኈ ኊ-አáŠ-ኗ ⶈ ኘ-ኟ ⶉ አ-ኧ ⶊ ከ-ኰ ኲ-ኵ ኸ-ኾ á‹€ á‹‚-á‹… ወ-á‹– ዘ-á‹Ÿ ⶋ á‹ -á‹· ⶌ ዸ-á‹¿ ⶠጀ-ጇ ⶎ ገ-ጠጒ-ጕ ጘ-ጟ ⶓ-ⶖ ጠ-ጧ ⶠጨ-ጯ ⶠጰ-ጷ ⶑ ጸ-á ᎈ-ᎋ á-ᗠᎌ-Ꭰⶒ á˜-ᚠⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ â·€-â·† â·ˆ-â·Ž â·-â·– â·˜-â·ž]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">ጃንዩ</month>
+ <month type="2">áŒá‰¥áˆ©</month>
+ <month type="3">ማርች</month>
+ <month type="4">ኤá•áˆ¨</month>
+ <month type="5">ሜይ</month>
+ <month type="6">áŒáŠ•</month>
+ <month type="7">áŒáˆ‹á‹­</month>
+ <month type="8">ኦገስ</month>
+ <month type="9">ሴá•á‰´</month>
+ <month type="10">ኦክተ</month>
+ <month type="11">ኖቬáˆ</month>
+ <month type="12">ዲሴáˆ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">ጃንዩወሪ</month>
+ <month type="2">áŒá‰¥áˆ©á‹ˆáˆª</month>
+ <month type="3">ማርች</month>
+ <month type="4">ኤá•áˆ¨áˆ</month>
+ <month type="5">ሜይ</month>
+ <month type="6">áŒáŠ•</month>
+ <month type="7">áŒáˆ‹á‹­</month>
+ <month type="8">ኦገስት</month>
+ <month type="9">ሴá•á‰´áˆá‰ áˆ­</month>
+ <month type="10">ኦክተá‹á‰ áˆ­</month>
+ <month type="11">ኖቬáˆá‰ áˆ­</month>
+ <month type="12">ዲሴáˆá‰ áˆ­</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">ጃ</month>
+ <month type="2" draft="unconfirmed">áŒ</month>
+ <month type="3" draft="unconfirmed">ማ</month>
+ <month type="4" draft="unconfirmed">ኤ</month>
+ <month type="5" draft="unconfirmed">ሜ</month>
+ <month type="6" draft="unconfirmed">áŒ</month>
+ <month type="7" draft="unconfirmed">áŒ</month>
+ <month type="8" draft="unconfirmed">ኦ</month>
+ <month type="9" draft="unconfirmed">ሴ</month>
+ <month type="10" draft="unconfirmed">ኦ</month>
+ <month type="11" draft="unconfirmed">ኖ</month>
+ <month type="12" draft="unconfirmed">ዲ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">ሰንበ</day>
+ <day type="mon">ሰኑይ</day>
+ <day type="tue">ሠሉስ</day>
+ <day type="wed">ረቡዕ</day>
+ <day type="thu">ኃሙስ</day>
+ <day type="fri">ዓርቢ</day>
+ <day type="sat">ቀዳáˆ</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">ሰንበት</day>
+ <day type="mon">ሰኑይ</day>
+ <day type="tue">ሠሉስ</day>
+ <day type="wed">ረቡዕ</day>
+ <day type="thu">ኃሙስ</day>
+ <day type="fri">ዓርቢ</day>
+ <day type="sat">ቀዳáˆ</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">ሰ</day>
+ <day type="mon" draft="unconfirmed">ሰ</day>
+ <day type="tue" draft="unconfirmed">ሠ</day>
+ <day type="wed" draft="unconfirmed">ረ</day>
+ <day type="thu" draft="unconfirmed">ኃ</day>
+ <day type="fri" draft="unconfirmed">á‹“</day>
+ <day type="sat" draft="unconfirmed">ቀ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am>ንጉሆ ሰዓተ</am>
+ <pm>ድሕር ሰዓት</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">á‹“/á‹“</era>
+ <era type="1">á‹“/áˆ</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">የብራዚሠሪáˆ</displayName>
+ <symbol draft="unconfirmed">R$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="unconfirmed">የቻይና ዩአን ረንሚንቢ</displayName>
+ <symbol draft="unconfirmed">Y</symbol>
+ </currency>
+ <currency type="ETB">
+ <displayName draft="unconfirmed">የኢትዮጵያ ብር</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="unconfirmed">አá‹áˆ®</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">የእንáŒáˆŠá‹ á“á‹áŠ•á‹µ ስተርሊንáŒ</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">የሕንድ ሩá’</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="unconfirmed">የጃá“ን የን</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">የራሻ ሩብáˆ</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">የአሜሪካን ዶላር</displayName>
+ <symbol draft="unconfirmed">USD</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ti_ER.xml b/libs/Zend/Locale/Data/ti_ER.xml
new file mode 100755
index 0000000000..8e6626f608
--- /dev/null
+++ b/libs/Zend/Locale/Data/ti_ER.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="ti"/>
+ <territory type="ER"/>
+ </identity>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[០ᡠá£-á§ á¢ á  á¨ á²-á¼ á©-ᱠሀ-ሆ ለ-ሟ ረ-ቆ ቈ ቊ-በá‰-ቖ ቘ ቚ-በበ-ኆ ኈ ኊ-አáŠ-ኮ ኰ ኲ-ኵ ኸ-ኾ á‹€ á‹‚-á‹… ወ-á‹Ž á‹-á‹– ዘ-á‹® á‹°-á‹· ጀ-ጎ ጠጒ-ጕ ጠ-ጯ ጸ-ጿ áˆ-á—]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" draft="unconfirmed">[áŽ-᎙ ሇ ⶀ ᎀ-ᎃ ⶠሠ-ሧ ⶂ-ⶄ ቇ ᎄ-ᎇ ⶅ-ⶇ ኇ ⶈ-ⶊ ኯ ዠⶋ ዯ ⶌ ዸ-á‹¿ ⶠⶎ ጠጘ-ጟ ⶓ-ⶖ â¶-ⶑ á€-ᇠᎈ-Ꭰⶒ á˜-ᚠⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ â·€-â·† â·ˆ-â·Ž â·-â·– â·˜-â·ž]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">ጥሪ</month>
+ <month type="2">ለካቲ</month>
+ <month type="3">መጋቢ</month>
+ <month type="4">ሚያá‹</month>
+ <month type="5">áŒáŠ•á‰¦</month>
+ <month type="6">ሰáŠ</month>
+ <month type="7">ሓáˆáˆˆ</month>
+ <month type="8">áŠáˆ“ሰ</month>
+ <month type="9">መስከ</month>
+ <month type="10">ጥቅáˆ</month>
+ <month type="11">ሕዳር</month>
+ <month type="12">ታሕሳ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">ጥሪ</month>
+ <month type="2">ለካቲት</month>
+ <month type="3">መጋቢት</month>
+ <month type="4">ሚያá‹á‹«</month>
+ <month type="5">áŒáŠ•á‰¦á‰µ</month>
+ <month type="6">ሰáŠ</month>
+ <month type="7">ሓáˆáˆˆ</month>
+ <month type="8">áŠáˆ“ሰ</month>
+ <month type="9">መስከረáˆ</month>
+ <month type="10">ጥቅáˆá‰²</month>
+ <month type="11">ሕዳር</month>
+ <month type="12">ታሕሳስ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="tue">ሰሉስ</day>
+ <day type="thu">ሓሙስ</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="tue">ሰሉስ</day>
+ <day type="thu">ሓሙስ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEEá¡ dd MMMM መዓáˆá‰² yyyy G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ERN">
+ <symbol>$</symbol>
+ </currency>
+ <currency type="USD">
+ <symbol>US$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ti_ET.xml b/libs/Zend/Locale/Data/ti_ET.xml
new file mode 100755
index 0000000000..1dded41bdb
--- /dev/null
+++ b/libs/Zend/Locale/Data/ti_ET.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.41 $"/>
+ <generation date="$Date: 2006/06/28 01:56:26 $"/>
+ <language type="ti"/>
+ <territory type="ET"/>
+ </identity>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[០ᡠá£-á§ á¢ á  á¨ á²-á¼ á©-ᱠሀ-ሆ ለ-ቆ ቈ ቊ-በá‰-ቖ ቘ ቚ-በበ-ኆ ኈ ኊ-አáŠ-ኮ ኰ ኲ-ኵ ኸ-ኾ á‹€ á‹‚-á‹… ወ-á‹Ž á‹-á‹– ዘ-á‹® á‹°-á‹· ጀ-ጎ ጠጒ-ጕ ጠ-á—]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" draft="unconfirmed">[áŽ-᎙ ሇ ⶀ ᎀ-ᎃ â¶-ⶄ ቇ ᎄ-ᎇ ⶅ-ⶇ ኇ ⶈ-ⶊ ኯ ዠⶋ ዯ ⶌ ዸ-á‹¿ ⶠⶎ ጠጘ-ጟ ⶓ-ⶖ â¶-ⶑ ᇠᎈ-Ꭰⶒ á˜-ᚠⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ â·€-â·† â·ˆ-â·Ž â·-â·– â·˜-â·ž]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEEᣠdd MMMM መዓáˆá‰² yyyy G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ETB">
+ <symbol draft="unconfirmed">$</symbol>
+ </currency>
+ <currency type="USD">
+ <symbol>US$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/tig.xml b/libs/Zend/Locale/Data/tig.xml
new file mode 100755
index 0000000000..1242d1b6d2
--- /dev/null
+++ b/libs/Zend/Locale/Data/tig.xml
@@ -0,0 +1,426 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.40 $"/>
+ <generation date="$Date: 2006/06/28 01:56:26 $"/>
+ <language type="tig"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa" draft="unconfirmed">አá‹áˆ­áŠ›</language>
+ <language type="ab" draft="unconfirmed">አብáˆá‹šáŠ›</language>
+ <language type="af" draft="unconfirmed">አáሪቃንስኛ</language>
+ <language type="am" draft="unconfirmed">አáˆáˆáˆ¨áŠ›</language>
+ <language type="ar" draft="unconfirmed">á‹áˆ­á‰¢áŠ›</language>
+ <language type="as" draft="unconfirmed">አሳሜዛዊ</language>
+ <language type="ay" draft="unconfirmed">አያማርኛ</language>
+ <language type="az" draft="unconfirmed">አዜርባይጃንኛ</language>
+ <language type="ba" draft="unconfirmed">ባስኪርኛ</language>
+ <language type="be" draft="unconfirmed">ቤላራሻኛ</language>
+ <language type="bg" draft="unconfirmed">ቡáˆáŒ‹áˆªáŠ›</language>
+ <language type="bh" draft="unconfirmed">ቢሃሪ</language>
+ <language type="bi" draft="unconfirmed">ቢስላáˆáŠ›</language>
+ <language type="bn" draft="unconfirmed">በንጋሊኛ</language>
+ <language type="bo" draft="unconfirmed">ትበትንኛ</language>
+ <language type="br" draft="unconfirmed">ብሬቶንኛ</language>
+ <language type="byn" draft="unconfirmed">ብሊን</language>
+ <language type="ca" draft="unconfirmed">ካታላንኛ</language>
+ <language type="co" draft="unconfirmed">ኮርሲካኛ</language>
+ <language type="cs" draft="unconfirmed">ቼክኛ</language>
+ <language type="cy" draft="unconfirmed">ወáˆáˆ½</language>
+ <language type="da" draft="unconfirmed">ዴኒሽ</language>
+ <language type="de" draft="unconfirmed">ጀርመን</language>
+ <language type="dz" draft="unconfirmed">ድዞንáŒáŠ»áŠ›</language>
+ <language type="el" draft="unconfirmed">áŒáˆªáŠ­áŠ›</language>
+ <language type="en" draft="unconfirmed">እንáŒáˆŠá‹áŠ›</language>
+ <language type="eo" draft="unconfirmed">ኤስáራንቶ</language>
+ <language type="es" draft="unconfirmed">ስá“ኒሽ</language>
+ <language type="et" draft="unconfirmed">ኤስቶኒአን</language>
+ <language type="eu" draft="unconfirmed">ባስክኛ</language>
+ <language type="fa" draft="unconfirmed">áርሲያኛ</language>
+ <language type="fi" draft="unconfirmed">áŠáŠ’ሽ</language>
+ <language type="fj" draft="unconfirmed">áŠáŒ‚ኛ</language>
+ <language type="fo" draft="unconfirmed">á‹áˆ®áŠ›</language>
+ <language type="fr" draft="unconfirmed">áˆáˆ¨áŠ•áˆ³á‹­áŠ›</language>
+ <language type="fy" draft="unconfirmed">áሪስኛ</language>
+ <language type="ga" draft="unconfirmed">አይሪሽ</language>
+ <language type="gd" draft="unconfirmed">እስኮትስ ጌáˆáŠ­áŠ›</language>
+ <language type="gez" draft="unconfirmed">áŒá‹•á‹áŠ›</language>
+ <language type="gl" draft="unconfirmed">ጋለጋኛ</language>
+ <language type="gn" draft="unconfirmed">ጓራኒኛ</language>
+ <language type="gu" draft="unconfirmed">ጉጃርቲኛ</language>
+ <language type="ha" draft="unconfirmed">ሃá‹áˆ³áŠ›</language>
+ <language type="he" draft="unconfirmed">ዕብራስጥ</language>
+ <language type="hi" draft="unconfirmed">áˆáŠ•á‹µáŠ›</language>
+ <language type="hr" draft="unconfirmed">ክሮሽያንኛ</language>
+ <language type="hu" draft="unconfirmed">ሀንጋሪኛ</language>
+ <language type="hy" draft="unconfirmed">አርመናዊ</language>
+ <language type="ia" draft="unconfirmed">ኢንቴርሊንጓ</language>
+ <language type="id" draft="unconfirmed">እንዶኒሲኛ</language>
+ <language type="ie" draft="unconfirmed">እንተርሊንáŒá‹ˆ</language>
+ <language type="ik" draft="unconfirmed">እኑá’ያቅኛ</language>
+ <language type="is" draft="unconfirmed">አይስላንድኛ</language>
+ <language type="it" draft="unconfirmed">ጣሊያንኛ</language>
+ <language type="iu" draft="unconfirmed">እኑክቲቱትኛ</language>
+ <language type="ja" draft="unconfirmed">ጃá“ንኛ</language>
+ <language type="jv" draft="unconfirmed">ጃቫንኛ</language>
+ <language type="ka" draft="unconfirmed">ጊዮርጊያን</language>
+ <language type="kk" draft="unconfirmed">ካዛክኛ</language>
+ <language type="kl" draft="unconfirmed">ካላሊሱትኛ</language>
+ <language type="km" draft="unconfirmed">ክመርኛ</language>
+ <language type="kn" draft="unconfirmed">ካናዳኛ</language>
+ <language type="ko" draft="unconfirmed">ኮሪያኛ</language>
+ <language type="ks" draft="unconfirmed">ካሽሚርኛ</language>
+ <language type="ku" draft="unconfirmed">ኩርድሽኛ</language>
+ <language type="ky" draft="unconfirmed">ኪርጊá‹áŠ›</language>
+ <language type="la" draft="unconfirmed">ላቲንኛ</language>
+ <language type="ln" draft="unconfirmed">ሊንጋላኛ</language>
+ <language type="lo" draft="unconfirmed">ላá‹áˆµáŠ›</language>
+ <language type="lt" draft="unconfirmed">ሊቱአኒያን</language>
+ <language type="lv" draft="unconfirmed">ላትቪያን</language>
+ <language type="mg" draft="unconfirmed">ማላጋስኛ</language>
+ <language type="mi" draft="unconfirmed">ማዮሪኛ</language>
+ <language type="mk" draft="unconfirmed">ማከዶኒኛ</language>
+ <language type="ml" draft="unconfirmed">ማላያላáˆáŠ›</language>
+ <language type="mn" draft="unconfirmed">ሞንጎላዊኛ</language>
+ <language type="mo" draft="unconfirmed">ሞáˆá‹³á‰«á‹ŠáŠ“</language>
+ <language type="mr" draft="unconfirmed">ማራዚኛ</language>
+ <language type="ms" draft="unconfirmed">ማላይኛ</language>
+ <language type="mt" draft="unconfirmed">ማáˆá‰²áˆµáŠ›</language>
+ <language type="my" draft="unconfirmed">ቡርማኛ</language>
+ <language type="na" draft="unconfirmed">ናኡሩ</language>
+ <language type="ne" draft="unconfirmed">ኔá“ሊኛ</language>
+ <language type="nl" draft="unconfirmed">ደች</language>
+ <language type="no" draft="unconfirmed">ኖርዌጂያን</language>
+ <language type="oc" draft="unconfirmed">ኦኪታንኛ</language>
+ <language type="om" draft="unconfirmed">ኦሮáˆáŠ›</language>
+ <language type="or" draft="unconfirmed">ኦሪያኛ</language>
+ <language type="pa" draft="unconfirmed">á“ንጃቢኛ</language>
+ <language type="pl" draft="unconfirmed">á–ሊሽ</language>
+ <language type="ps" draft="unconfirmed">á‘ሽቶኛ</language>
+ <language type="pt" draft="unconfirmed">á–ርቱጋሊኛ</language>
+ <language type="qu" draft="unconfirmed">ኵቿኛ</language>
+ <language type="rm" draft="unconfirmed">ሮማንስ</language>
+ <language type="rn" draft="unconfirmed">ሩንዲኛ</language>
+ <language type="ro" draft="unconfirmed">ሮማኒያን</language>
+ <language type="ru" draft="unconfirmed">ራሽኛ</language>
+ <language type="rw" draft="unconfirmed">ኪንያርዋንድኛ</language>
+ <language type="sa" draft="unconfirmed">ሳንስክሪትኛ</language>
+ <language type="sd" draft="unconfirmed">ሲንድሂኛ</language>
+ <language type="sg" draft="unconfirmed">ሳንጎኛ</language>
+ <language type="si" draft="unconfirmed">ስንሃáˆáŠ›</language>
+ <language type="sid" draft="unconfirmed">ሲዳáˆáŠ›</language>
+ <language type="sk" draft="unconfirmed">ስሎቫክኛ</language>
+ <language type="sl" draft="unconfirmed">ስሎቪኛ</language>
+ <language type="sm" draft="unconfirmed">ሳሞአኛ</language>
+ <language type="sn" draft="unconfirmed">ሾናኛ</language>
+ <language type="so" draft="unconfirmed">ሱማáˆáŠ›</language>
+ <language type="sq" draft="unconfirmed">áˆá‰¤áŠ’ኛ</language>
+ <language type="sr" draft="unconfirmed">ሰርቢኛ</language>
+ <language type="ss" draft="unconfirmed">ስዋቲኛ</language>
+ <language type="st" draft="unconfirmed">ሶዞኛ</language>
+ <language type="su" draft="unconfirmed">ሱዳንኛ</language>
+ <language type="sv" draft="unconfirmed">ስዊድንኛ</language>
+ <language type="sw" draft="unconfirmed">ስዋሂሊኛ</language>
+ <language type="ta" draft="unconfirmed">ታሚáˆáŠ›</language>
+ <language type="te" draft="unconfirmed">ተሉጉኛ</language>
+ <language type="tg" draft="unconfirmed">ታጂኪኛ</language>
+ <language type="th" draft="unconfirmed">ታይኛ</language>
+ <language type="ti" draft="unconfirmed">ትáŒáˆ­áŠ›</language>
+ <language type="tig" draft="unconfirmed">ትáŒáˆ¨</language>
+ <language type="tk" draft="unconfirmed">ቱርክመንኛ</language>
+ <language type="tl" draft="unconfirmed">ታጋሎገኛ</language>
+ <language type="tn" draft="unconfirmed">ጽዋናዊኛ</language>
+ <language type="to" draft="unconfirmed">ቶንጋ</language>
+ <language type="tr" draft="unconfirmed">ቱርክኛ</language>
+ <language type="ts" draft="unconfirmed">ጾንጋኛ</language>
+ <language type="tt" draft="unconfirmed">ታታርኛ</language>
+ <language type="tw" draft="unconfirmed">ትዊኛ</language>
+ <language type="ug" draft="unconfirmed">ኡዊáŒáˆáˆ­áŠ›</language>
+ <language type="uk" draft="unconfirmed">ዩክረኒኛ</language>
+ <language type="ur" draft="unconfirmed">ኡርዱኛ</language>
+ <language type="uz" draft="unconfirmed">ኡá‹á‰ áŠ­áŠ›</language>
+ <language type="vi" draft="unconfirmed">ቪትናáˆáŠ›</language>
+ <language type="vo" draft="unconfirmed">ቮላá‘ክኛ</language>
+ <language type="wo" draft="unconfirmed">ዎሎáኛ</language>
+ <language type="xh" draft="unconfirmed">ዞሳኛ</language>
+ <language type="yi" draft="unconfirmed">ይዲሻዊኛ</language>
+ <language type="yo" draft="unconfirmed">ዮሩባዊኛ</language>
+ <language type="za" draft="unconfirmed">ዡዋንáŒáŠ›</language>
+ <language type="zh" draft="unconfirmed">ቻይንኛ</language>
+ <language type="zu" draft="unconfirmed">ዙሉኛ</language>
+ </languages>
+ <scripts>
+ <script type="Latn" draft="unconfirmed">ላቲን</script>
+ </scripts>
+ <territories>
+ <territory type="AD" draft="unconfirmed">አንዶራ</territory>
+ <territory type="AE" draft="unconfirmed">የተባበሩት አረብ ኤáˆáˆ¬á‰µáˆµ</territory>
+ <territory type="AL" draft="unconfirmed">አáˆá‰£áŠ’á‹«</territory>
+ <territory type="AM" draft="unconfirmed">አርሜኒያ</territory>
+ <territory type="AN" draft="unconfirmed">ኔዘርላንድስ አንቲáˆáˆµ</territory>
+ <territory type="AR" draft="unconfirmed">አርጀንቲና</territory>
+ <territory type="AT" draft="unconfirmed">ኦስትሪያ</territory>
+ <territory type="AU" draft="unconfirmed">አá‹áˆµá‰µáˆ¬áˆŠá‹«</territory>
+ <territory type="AZ" draft="unconfirmed">አዘርባጃን</territory>
+ <territory type="BA" draft="unconfirmed">ቦስኒያ እና ሄርዞጎቪኒያ</territory>
+ <territory type="BB" draft="unconfirmed">ባርቤዶስ</territory>
+ <territory type="BE" draft="unconfirmed">ቤáˆáŒ„áˆ</territory>
+ <territory type="BG" draft="unconfirmed">ቡáˆáŒŒáˆªá‹«</territory>
+ <territory type="BH" draft="unconfirmed">ባህሬን</territory>
+ <territory type="BM" draft="unconfirmed">ቤርሙዳ</territory>
+ <territory type="BO" draft="unconfirmed">ቦሊቪያ</territory>
+ <territory type="BR" draft="unconfirmed">ብራዚáˆ</territory>
+ <territory type="BT" draft="unconfirmed">ቡህታን</territory>
+ <territory type="BY" draft="unconfirmed">ቤላሩስ</territory>
+ <territory type="BZ" draft="unconfirmed">ቤሊዘ</territory>
+ <territory type="CD" draft="unconfirmed">ኮንጎ</territory>
+ <territory type="CF" draft="unconfirmed">የመካከለኛዠአáሪካ ሪáብሊክ</territory>
+ <territory type="CH" draft="unconfirmed">ስዊዘርላንድ</territory>
+ <territory type="CL" draft="unconfirmed">ቺሊ</territory>
+ <territory type="CM" draft="unconfirmed">ካሜሩን</territory>
+ <territory type="CN" draft="unconfirmed">ቻይና</territory>
+ <territory type="CO" draft="unconfirmed">ኮሎáˆá‰¢á‹«</territory>
+ <territory type="CS" draft="unconfirmed">ሰርቢያ</territory>
+ <territory type="CV" draft="unconfirmed">ኬᕠቬርዴ</territory>
+ <territory type="CY" draft="unconfirmed">ሳይá•áˆ¨áˆµ</territory>
+ <territory type="CZ" draft="unconfirmed">ቼክ ሪá‘ብሊክ</territory>
+ <territory type="DE" draft="unconfirmed">ጀርመን</territory>
+ <territory type="DK" draft="unconfirmed">ዴንማርክ</territory>
+ <territory type="DM" draft="unconfirmed">ዶሚኒካ</territory>
+ <territory type="DO" draft="unconfirmed">ዶሚኒክ ሪá‘ብሊክ</territory>
+ <territory type="DZ" draft="unconfirmed">አáˆáŒ„ሪያ</territory>
+ <territory type="EC" draft="unconfirmed">ኢኳዶር</territory>
+ <territory type="EE" draft="unconfirmed">ኤስቶኒያ</territory>
+ <territory type="EG" draft="unconfirmed">áŒá‰¥áŒ½</territory>
+ <territory type="EH" draft="unconfirmed">áˆá‹•áˆ«á‰£á‹Š ሳህራ</territory>
+ <territory type="ER" draft="unconfirmed">ኤርትራ</territory>
+ <territory type="ES" draft="unconfirmed">ስá”ን</territory>
+ <territory type="ET" draft="unconfirmed">ኢትዮጵያ</territory>
+ <territory type="FI" draft="unconfirmed">áŠáŠ•áˆ‹áŠ•á‹µ</territory>
+ <territory type="FJ" draft="unconfirmed">áŠáŒ‚</territory>
+ <territory type="FM" draft="unconfirmed">ሚክሮኔዢያ</territory>
+ <territory type="FR" draft="unconfirmed">áˆáˆ¨áŠ•áˆ³á‹­</territory>
+ <territory type="GB" draft="unconfirmed">እንáŒáˆŠá‹</territory>
+ <territory type="GE" draft="unconfirmed">ጆርጂያ</territory>
+ <territory type="GF" draft="unconfirmed">የáˆáˆ¨áŠ•áˆ³á‹­ ጉዊአና</territory>
+ <territory type="GM" draft="unconfirmed">ጋáˆá‰¢á‹«</territory>
+ <territory type="GN" draft="unconfirmed">ጊኒ</territory>
+ <territory type="GQ" draft="unconfirmed">ኢኳቶሪያሠጊኒ</territory>
+ <territory type="GR" draft="unconfirmed">áŒáˆªáŠ­</territory>
+ <territory type="GW" draft="unconfirmed">ቢሳዎ</territory>
+ <territory type="GY" draft="unconfirmed">ጉያና</territory>
+ <territory type="HK" draft="unconfirmed">ሆንጠኮንáŒ</territory>
+ <territory type="HR" draft="unconfirmed">ክሮኤሽያ</territory>
+ <territory type="HT" draft="unconfirmed">ሀይቲ</territory>
+ <territory type="HU" draft="unconfirmed">ሀንጋሪ</territory>
+ <territory type="ID" draft="unconfirmed">ኢንዶኔዢያ</territory>
+ <territory type="IE" draft="unconfirmed">አየርላንድ</territory>
+ <territory type="IL" draft="unconfirmed">እስራኤáˆ</territory>
+ <territory type="IN" draft="unconfirmed">ህንድ</territory>
+ <territory type="IQ" draft="unconfirmed">ኢራቅ</territory>
+ <territory type="IS" draft="unconfirmed">አይስላንድ</territory>
+ <territory type="IT" draft="unconfirmed">ጣሊያን</territory>
+ <territory type="JM" draft="unconfirmed">ጃማይካ</territory>
+ <territory type="JO" draft="unconfirmed">ጆርዳን</territory>
+ <territory type="JP" draft="unconfirmed">ጃá“ን</territory>
+ <territory type="KH" draft="unconfirmed">ካáˆá‰¦á‹²á‹«</territory>
+ <territory type="KM" draft="unconfirmed">ኮሞሮስ</territory>
+ <territory type="KP" draft="unconfirmed">ደቡብ ኮሪያ</territory>
+ <territory type="KR" draft="unconfirmed">ሰሜን ኮሪያ</territory>
+ <territory type="KW" draft="unconfirmed">ክዌት</territory>
+ <territory type="LB" draft="unconfirmed">ሊባኖስ</territory>
+ <territory type="LT" draft="unconfirmed">ሊቱዌኒያ</territory>
+ <territory type="LV" draft="unconfirmed">ላትቪያ</territory>
+ <territory type="LY" draft="unconfirmed">ሊቢያ</territory>
+ <territory type="MA" draft="unconfirmed">ሞሮኮ</territory>
+ <territory type="MD" draft="unconfirmed">ሞáˆá‹¶á‰«</territory>
+ <territory type="MK" draft="unconfirmed">ማከዶኒያ</territory>
+ <territory type="MN" draft="unconfirmed">ሞንጎሊያ</territory>
+ <territory type="MO" draft="unconfirmed">ማካዎ</territory>
+ <territory type="MR" draft="unconfirmed">ሞሪቴኒያ</territory>
+ <territory type="MT" draft="unconfirmed">ማáˆá‰³</territory>
+ <territory type="MU" draft="unconfirmed">ማሩሸስ</territory>
+ <territory type="MX" draft="unconfirmed">ሜክሲኮ</territory>
+ <territory type="MY" draft="unconfirmed">ማሌዢያ</territory>
+ <territory type="NA" draft="unconfirmed">ናሚቢያ</territory>
+ <territory type="NC" draft="unconfirmed">ኒዠካሌዶኒያ</territory>
+ <territory type="NG" draft="unconfirmed">ናይጄሪያ</territory>
+ <territory type="NL" draft="unconfirmed">ኔዘርላንድ</territory>
+ <territory type="NO" draft="unconfirmed">ኖርዌ</territory>
+ <territory type="NP" draft="unconfirmed">ኔá“áˆ</territory>
+ <territory type="NZ" draft="unconfirmed">ኒዠዚላንድ</territory>
+ <territory type="PE" draft="unconfirmed">á”ሩ</territory>
+ <territory type="PF" draft="unconfirmed">የáˆáˆ¨áŠ•áˆ³á‹­ á–ሊኔዢያ</territory>
+ <territory type="PG" draft="unconfirmed">á“á‘á‹‹ ኒዠጊኒ</territory>
+ <territory type="PL" draft="unconfirmed">á–ላንድ</territory>
+ <territory type="PR" draft="unconfirmed">á–ርታ ሪኮ</territory>
+ <territory type="RO" draft="unconfirmed">ሮሜኒያ</territory>
+ <territory type="RU" draft="unconfirmed">ራሺያ</territory>
+ <territory type="SA" draft="unconfirmed">ሳá‹á‹µáŠ áˆ¨á‰¢á‹«</territory>
+ <territory type="SD" draft="unconfirmed">ሱዳን</territory>
+ <territory type="SE" draft="unconfirmed">ስዊድን</territory>
+ <territory type="SG" draft="unconfirmed">ሲንጋá–ር</territory>
+ <territory type="SI" draft="unconfirmed">ስሎቬኒያ</territory>
+ <territory type="SK" draft="unconfirmed">ስሎቫኪያ</territory>
+ <territory type="SN" draft="unconfirmed">ሴኔጋáˆ</territory>
+ <territory type="SO" draft="unconfirmed">ሱማሌ</territory>
+ <territory type="SY" draft="unconfirmed">ሲሪያ</territory>
+ <territory type="TD" draft="unconfirmed">ቻድ</territory>
+ <territory type="TF" draft="unconfirmed">የáˆáˆ¨áŠ•áˆ³á‹­ ደቡባዊ áŒá‹›á‰¶á‰½</territory>
+ <territory type="TH" draft="unconfirmed">ታይላንድ</territory>
+ <territory type="TJ" draft="unconfirmed">ታጃኪስታን</territory>
+ <territory type="TL" draft="unconfirmed">áˆáˆµáˆ«á‰… ቲሞር</territory>
+ <territory type="TN" draft="unconfirmed">ቱኒዚያ</territory>
+ <territory type="TR" draft="unconfirmed">ቱርክ</territory>
+ <territory type="TT" draft="unconfirmed">ትሪኒዳድ እና ቶባጎ</territory>
+ <territory type="TZ" draft="unconfirmed">ታንዛኒያ</territory>
+ <territory type="UG" draft="unconfirmed">ዩጋንዳ</territory>
+ <territory type="US" draft="unconfirmed">አሜሪካ</territory>
+ <territory type="UZ" draft="unconfirmed">á‹©á‹á‰ áŠªáˆµá‰³áŠ•</territory>
+ <territory type="VE" draft="unconfirmed">ቬንዙዌላ</territory>
+ <territory type="VG" draft="unconfirmed">የእንáŒáˆŠá‹ ድንáŒáˆ ደሴቶች</territory>
+ <territory type="VI" draft="unconfirmed">የአሜሪካ ቨርጂን ደሴቶች</territory>
+ <territory type="YE" draft="unconfirmed">የመን</territory>
+ <territory type="ZA" draft="unconfirmed">ደቡብ አáሪካ</territory>
+ <territory type="ZM" draft="unconfirmed">á‹›áˆá‰¢á‹«</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[០ᡠá£-á§ á¢ á  á¨ áŽ-᎙ á²-á¼ á©-ᱠሀ-ሠⶀ áˆ-ሟ ᎀ-ᎃ ⶠሠ-ሯ ⶂ ሰ-ሷ ⶃ ሸ-ሿ ⶄ ቀ-ቈ ቊ-በá‰-ቖ ቘ ቚ-በበ-ቧ ᎄ-ᎇ ⶅ ቨ-ቷ ⶆ ቸ-ቿ ⶇ ኀ-ኈ ኊ-አáŠ-ኗ ⶈ ኘ-ኟ ⶉ አ-ኧ ⶊ ከ-ኰ ኲ-ኵ ኸ-ኾ á‹€ á‹‚-á‹… ወ-á‹– ዘ-á‹Ÿ ⶋ á‹ -á‹· ⶌ ዸ-á‹¿ ⶠጀ-ጇ ⶎ ገ-ጠጒ-ጕ ጘ-ጟ ⶓ-ⶖ ጠ-ጧ ⶠጨ-ጯ ⶠጰ-ጷ ⶑ ጸ-á ᎈ-ᎋ á-ᗠᎌ-Ꭰⶒ á˜-ᚠⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ â·€-â·† â·ˆ-â·Ž â·-â·– â·˜-â·ž]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">ጃንዩ</month>
+ <month type="2" draft="unconfirmed">áŒá‰¥áˆ©</month>
+ <month type="3" draft="unconfirmed">ማርች</month>
+ <month type="4" draft="unconfirmed">ኤá•áˆ¨</month>
+ <month type="5" draft="unconfirmed">ሜይ</month>
+ <month type="6" draft="unconfirmed">áŒáŠ•</month>
+ <month type="7" draft="unconfirmed">áŒáˆ‹á‹­</month>
+ <month type="8" draft="unconfirmed">ኦገስ</month>
+ <month type="9" draft="unconfirmed">ሴá•á‰´</month>
+ <month type="10" draft="unconfirmed">ኦክተ</month>
+ <month type="11" draft="unconfirmed">ኖቬáˆ</month>
+ <month type="12" draft="unconfirmed">ዲሴáˆ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">ጃንዩወሪ</month>
+ <month type="2" draft="unconfirmed">áŒá‰¥áˆ©á‹ˆáˆª</month>
+ <month type="3" draft="unconfirmed">ማርች</month>
+ <month type="4" draft="unconfirmed">ኤá•áˆ¨áˆ</month>
+ <month type="5" draft="unconfirmed">ሜይ</month>
+ <month type="6" draft="unconfirmed">áŒáŠ•</month>
+ <month type="7" draft="unconfirmed">áŒáˆ‹á‹­</month>
+ <month type="8" draft="unconfirmed">ኦገስት</month>
+ <month type="9" draft="unconfirmed">ሴá•á‰´áˆá‰ áˆ­</month>
+ <month type="10" draft="unconfirmed">ኦክተá‹á‰ áˆ­</month>
+ <month type="11" draft="unconfirmed">ኖቬáˆá‰ áˆ­</month>
+ <month type="12" draft="unconfirmed">ዲሴáˆá‰ áˆ­</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">ጃ</month>
+ <month type="2" draft="unconfirmed">áŒ</month>
+ <month type="3" draft="unconfirmed">ማ</month>
+ <month type="4" draft="unconfirmed">ኤ</month>
+ <month type="5" draft="unconfirmed">ሜ</month>
+ <month type="6" draft="unconfirmed">áŒ</month>
+ <month type="7" draft="unconfirmed">áŒ</month>
+ <month type="8" draft="unconfirmed">ኦ</month>
+ <month type="9" draft="unconfirmed">ሴ</month>
+ <month type="10" draft="unconfirmed">ኦ</month>
+ <month type="11" draft="unconfirmed">ኖ</month>
+ <month type="12" draft="unconfirmed">ዲ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">ሰ/ዓ</day>
+ <day type="mon" draft="unconfirmed">ሰኖ</day>
+ <day type="tue" draft="unconfirmed">ታላሸ</day>
+ <day type="wed" draft="unconfirmed">ኣረር</day>
+ <day type="thu" draft="unconfirmed">ከሚሽ</day>
+ <day type="fri" draft="unconfirmed">ጅáˆá‹“</day>
+ <day type="sat" draft="unconfirmed">ሰ/ን</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">ሰንበት ዓባይ</day>
+ <day type="mon" draft="unconfirmed">ሰኖ</day>
+ <day type="tue" draft="unconfirmed">ታላሸኖ</day>
+ <day type="wed" draft="unconfirmed">ኣረርባዓ</day>
+ <day type="thu" draft="unconfirmed">ከሚሽ</day>
+ <day type="fri" draft="unconfirmed">ጅáˆá‹“ት</day>
+ <day type="sat" draft="unconfirmed">ሰንበት ንኢሽ</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">ሰ</day>
+ <day type="mon" draft="unconfirmed">ሰ</day>
+ <day type="tue" draft="unconfirmed">ታ</day>
+ <day type="wed" draft="unconfirmed">ኣ</day>
+ <day type="thu" draft="unconfirmed">ከ</day>
+ <day type="fri" draft="unconfirmed">ጅ</day>
+ <day type="sat" draft="unconfirmed">ሰ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">ቀደሠሰርáˆá‹•áˆ</am>
+ <pm draft="unconfirmed">ሓቆ ስርáˆá‹•áˆ</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">á‹“/á‹“</era>
+ <era type="1" draft="unconfirmed">á‹“/áˆ</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">የብራዚሠሪáˆ</displayName>
+ <symbol draft="unconfirmed">R$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="unconfirmed">የቻይና ዩአን ረንሚንቢ</displayName>
+ <symbol draft="unconfirmed">Y</symbol>
+ </currency>
+ <currency type="ERN">
+ <symbol draft="unconfirmed">$</symbol>
+ </currency>
+ <currency type="ETB">
+ <displayName draft="unconfirmed">የኢትዮጵያ ብር</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="unconfirmed">አá‹áˆ®</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">የእንáŒáˆŠá‹ á“á‹áŠ•á‹µ ስተርሊንáŒ</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">የሕንድ ሩá’</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="unconfirmed">የጃá“ን የን</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">የራሻ ሩብáˆ</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">የአሜሪካን ዶላር</displayName>
+ <symbol draft="unconfirmed">US$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/tig_ER.xml b/libs/Zend/Locale/Data/tig_ER.xml
new file mode 100755
index 0000000000..6e720b4498
--- /dev/null
+++ b/libs/Zend/Locale/Data/tig_ER.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.27 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="tig"/>
+ <territory type="ER"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEEᡠdd MMMM ዮሠyyyy G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MMM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/tn.xml b/libs/Zend/Locale/Data/tn.xml
new file mode 100755
index 0000000000..dfe7db0974
--- /dev/null
+++ b/libs/Zend/Locale/Data/tn.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.12 $"/>
+ <generation date="$Date: 2006/06/28 01:23:34 $"/>
+ <language type="tn"/>
+ </identity>
+ <characters>
+ <exemplarCharacters references="RP1">[a b d e ê f-o ô p r-u w y]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" references="RP3">[c q v x z]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Fer</month>
+ <month type="2" draft="unconfirmed">Tlh</month>
+ <month type="3" draft="unconfirmed">Mop</month>
+ <month type="4" draft="unconfirmed">Mor</month>
+ <month type="5" draft="unconfirmed">Mot</month>
+ <month type="6" draft="unconfirmed">See</month>
+ <month type="7" draft="unconfirmed">Phu</month>
+ <month type="8" draft="unconfirmed">Pha</month>
+ <month type="9" draft="unconfirmed">Lwe</month>
+ <month type="10" draft="unconfirmed">Dip</month>
+ <month type="11" draft="unconfirmed">Ngw</month>
+ <month type="12" draft="unconfirmed">Sed</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Ferikgong</month>
+ <month type="2" draft="unconfirmed">Tlhakole</month>
+ <month type="3" draft="unconfirmed">Mopitlo</month>
+ <month type="4" draft="unconfirmed">Moranang</month>
+ <month type="5" draft="unconfirmed">Motsheganang</month>
+ <month type="6" draft="unconfirmed">Seetebosigo</month>
+ <month type="7" draft="unconfirmed">Phukwi</month>
+ <month type="8" draft="unconfirmed">Phatwe</month>
+ <month type="9" draft="unconfirmed">Lwetse</month>
+ <month type="10" draft="unconfirmed">Diphalane</month>
+ <month type="11" draft="unconfirmed">Ngwanatsele</month>
+ <month type="12" draft="unconfirmed">Sedimonthole</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Tsh</day>
+ <day type="mon" draft="unconfirmed">Mos</day>
+ <day type="tue" draft="unconfirmed">Bed</day>
+ <day type="wed" draft="unconfirmed">Rar</day>
+ <day type="thu" draft="unconfirmed">Ne</day>
+ <day type="fri" draft="unconfirmed">Tla</day>
+ <day type="sat" draft="unconfirmed">Mat</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Tshipi</day>
+ <day type="mon" draft="unconfirmed">Mosopulogo</day>
+ <day type="tue" draft="unconfirmed">Labobedi</day>
+ <day type="wed" draft="unconfirmed">Laboraro</day>
+ <day type="thu" draft="unconfirmed">Labone</day>
+ <day type="fri" draft="unconfirmed">Labotlhano</day>
+ <day type="sat" draft="unconfirmed">Matlhatso</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ZAR">
+ <symbol draft="unconfirmed">R</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1" uri="http://www.ideography.co.uk/library/pdf/charsets.pdf">Character Sets for African Languages</reference>
+ <reference type="RP2" uri="http://www.eki.ee/letter/chardata.cgi?lang=tn+Tswana&amp;script=latin">Letter Database (non-ASCII-range) - Tswana</reference>
+ <reference type="RP3" uri="http://developer.mimer.com/charts/tswana.htm">Mimer Collation Charts - Tswana</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/tn_ZA.xml b/libs/Zend/Locale/Data/tn_ZA.xml
new file mode 100755
index 0000000000..50d49b7f92
--- /dev/null
+++ b/libs/Zend/Locale/Data/tn_ZA.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="tn"/>
+ <territory type="ZA"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/tr.xml b/libs/Zend/Locale/Data/tr.xml
new file mode 100755
index 0000000000..40870053db
--- /dev/null
+++ b/libs/Zend/Locale/Data/tr.xml
@@ -0,0 +1,2009 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.72 $"/>
+ <generation date="$Date: 2006/10/26 22:46:09 $"/>
+ <language type="tr"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">Afar</language>
+ <language type="ab">Abazca</language>
+ <language type="ady">Adige</language>
+ <language type="af">Afrikaan Dili</language>
+ <language type="afa">Afro Asya Dilleri (DiÄŸer)</language>
+ <language type="akk">Akad Dili</language>
+ <language type="alg">Algonquian Dilleri</language>
+ <language type="alt" draft="provisional">Güney Altay</language>
+ <language type="am">Amharik</language>
+ <language type="ang">Eski Ä°ngilizce (450-1100)</language>
+ <language type="apa">Apaçi Dilleri</language>
+ <language type="ar">Arapça</language>
+ <language type="arc">Aramice</language>
+ <language type="art">Yapay (DiÄŸer)</language>
+ <language type="ath">Athapascan Dilleri</language>
+ <language type="ath" alt="proposed-u51-1" draft="provisional">AtabaÅŸkan Dilleri</language>
+ <language type="aus">Avustralya Dilleri</language>
+ <language type="av">Avar Dili</language>
+ <language type="ay">Aymara</language>
+ <language type="az">Azerice</language>
+ <language type="ba">Başkırt Dili</language>
+ <language type="bai">Bamileke Dilleri</language>
+ <language type="ban">Bali Dili</language>
+ <language type="bat">Baltık (Diğer)</language>
+ <language type="be">Beyaz Rusça</language>
+ <language type="ber">Berberi</language>
+ <language type="bg">Bulgarca</language>
+ <language type="bh">Bihari</language>
+ <language type="bi">Bislama</language>
+ <language type="bn">Bengal Dili</language>
+ <language type="bo">Tibetçe</language>
+ <language type="br">Breton Dili</language>
+ <language type="bs">Bosna Dili</language>
+ <language type="bua" draft="provisional">Buryat</language>
+ <language type="ca">Katalan Dili</language>
+ <language type="cad">Caddo</language>
+ <language type="cai">Orta Amerika Yerlileri (DiÄŸer)</language>
+ <language type="cau">Kafkasça (Diğer)</language>
+ <language type="ce">Çeçence</language>
+ <language type="cel">Keltçe (Diğer)</language>
+ <language type="chg">Çağatay Dili</language>
+ <language type="chr">Çeroki</language>
+ <language type="chy">Çeyen</language>
+ <language type="cmc">Chamic Dilleri</language>
+ <language type="co">Korsika Dili</language>
+ <language type="cop">Kiptice</language>
+ <language type="cpe">Creoles ve Pidgins, İngilizce tabanlı (Diğer)</language>
+ <language type="cpf">Creoles ve Pidgins, Fransızca tabanlı (Diğer)</language>
+ <language type="cpp">Creoles ve Pidgins, Portekizce tabanlı (Diğer)</language>
+ <language type="crh">Kırım Türkçesi; Kırım Tatarcası</language>
+ <language type="crp">Creoles ve Pidgins (DiÄŸer)</language>
+ <language type="cs">Çekçe</language>
+ <language type="cu">Kilise Slavcası</language>
+ <language type="cus">Cushitic (DiÄŸer)</language>
+ <language type="cus" alt="proposed-u51-1" draft="provisional">Kushi (DiÄŸer)</language>
+ <language type="cv">Çuvaş</language>
+ <language type="cy">Gal Dili</language>
+ <language type="da">Danca</language>
+ <language type="de">Almanca</language>
+ <language type="dra">Dravidian (DiÄŸer)</language>
+ <language type="dsb">Aşağı Sorbça</language>
+ <language type="dum">Felemenkçe (1050-1350)</language>
+ <language type="dz">Bhutan Dili</language>
+ <language type="ee">Ewe</language>
+ <language type="egy">Mısır Dili (Eski)</language>
+ <language type="el">Yunanca</language>
+ <language type="elx">Elam</language>
+ <language type="en">Ä°ngilizce</language>
+ <language type="enm">Ä°ngilizce (1100-1500)</language>
+ <language type="eo">Esperanto</language>
+ <language type="es">Ä°spanyolca</language>
+ <language type="et">Estonya Dili</language>
+ <language type="eu">Bask Dili</language>
+ <language type="fa">Farsça</language>
+ <language type="fi">Fince</language>
+ <language type="fiu">Finno - Ugrian (DiÄŸer)</language>
+ <language type="fj">Fiji Dili</language>
+ <language type="fo">Faroe Dili</language>
+ <language type="fr">Fransızca</language>
+ <language type="frm">Fransızca (1400-1600)</language>
+ <language type="fro">Fransızca (842-1400)</language>
+ <language type="fy">Frizye Dili</language>
+ <language type="ga">Ä°rlanda Dili</language>
+ <language type="gd">İskoç Gal Dili</language>
+ <language type="gem">Almanca tabanlı (Diğer)</language>
+ <language type="gl">Galiçya Dili</language>
+ <language type="gmh">Almanca (1050-1500)</language>
+ <language type="gn">Guarani</language>
+ <language type="goh">Almanca (750-1050)</language>
+ <language type="grc">Antik Yunan (1453'e kadar)</language>
+ <language type="gu">Gujarati</language>
+ <language type="gv" draft="provisional">Manx</language>
+ <language type="ha">Hausa</language>
+ <language type="haw">Hawaii Dili</language>
+ <language type="he">Ä°branice</language>
+ <language type="hi">Hint Dili</language>
+ <language type="hit">Hititçe</language>
+ <language type="hr">Hırvatça</language>
+ <language type="hsb">Yukarı Sorbça</language>
+ <language type="ht">Haiti Dili</language>
+ <language type="hu">Macarca</language>
+ <language type="hy">Ermenice</language>
+ <language type="ia">Interlingua</language>
+ <language type="id">Endonezya Dili</language>
+ <language type="ie">Interlingue</language>
+ <language type="ik">Inupiak</language>
+ <language type="inc">Hintçe (Diğer)</language>
+ <language type="ine">Hint-Avrupa (DiÄŸer)</language>
+ <language type="inh">Ä°nguÅŸ Dili</language>
+ <language type="io">Ido</language>
+ <language type="ira">Ä°ran Dili</language>
+ <language type="iro">Iroquoian Dilleri</language>
+ <language type="is">Ä°zlandaca</language>
+ <language type="it">Ä°talyanca</language>
+ <language type="iu">Inuktitut</language>
+ <language type="ja">Japonca</language>
+ <language type="jv">Java Dili</language>
+ <language type="ka">Gürcüce</language>
+ <language type="khi">Khoisan (DiÄŸer)</language>
+ <language type="kk">Kazak Dili</language>
+ <language type="kl">Grönland Dili</language>
+ <language type="km">Kamboçya Dili</language>
+ <language type="kn">Kannada</language>
+ <language type="ko">Korece</language>
+ <language type="krc">Karaçay-Balkar</language>
+ <language type="ks">KeÅŸmirce</language>
+ <language type="ku">Kürtçe</language>
+ <language type="kum">Kumukça</language>
+ <language type="ky">Kırgızca</language>
+ <language type="la">Latince</language>
+ <language type="lb">Lüksemburg Dili</language>
+ <language type="ln">Lingala</language>
+ <language type="lo">Laos Dili</language>
+ <language type="lt">Litvanya Dili</language>
+ <language type="lv">Letonya Dili</language>
+ <language type="mad">Madura Dili</language>
+ <language type="map" draft="provisional">Avustronezya Dili</language>
+ <language type="mg">Malaga Dili</language>
+ <language type="mga">Ä°rlanda Dili (900-1200)</language>
+ <language type="mh">Marshall Adaları Dili</language>
+ <language type="mi">Maori</language>
+ <language type="mis">Çeşitli Diller</language>
+ <language type="mk">Makedonca</language>
+ <language type="mkh">Mon-Khmer (DiÄŸer)</language>
+ <language type="ml">Malayalam</language>
+ <language type="mn">MoÄŸol Dili</language>
+ <language type="mnc">Mançurya Dili</language>
+ <language type="mno">Manobo Dilleri</language>
+ <language type="mo">Moldavya Dili</language>
+ <language type="mr">Marathi</language>
+ <language type="ms">Malay</language>
+ <language type="mt">Malta Dili</language>
+ <language type="mul">Birden Fazla Diller</language>
+ <language type="mun">Munda Dilleri</language>
+ <language type="my">Birmanya Dili</language>
+ <language type="myn" draft="provisional">Maya Dilleri</language>
+ <language type="na">Nauru</language>
+ <language type="nai">Kuzey Amerika Yerlileri Dili (DiÄŸer)</language>
+ <language type="nb">Norveç Kitap Dili</language>
+ <language type="nd">Kuzey Ndebele</language>
+ <language type="nds">Aşağı Almanca; Aşağı Sakson</language>
+ <language type="ne">Nepal Dili</language>
+ <language type="nic">Nijer - Kordofanian (DiÄŸer)</language>
+ <language type="nl">Hollanda Dili</language>
+ <language type="nn">Norveççe Nynorsk</language>
+ <language type="no">Norveççe</language>
+ <language type="nog" draft="provisional">Nogay Dili</language>
+ <language type="nr">Güney Ndebele</language>
+ <language type="nub">Nubian Dilleri</language>
+ <language type="nv" draft="provisional">Navaho Dili</language>
+ <language type="oc">Occitan (1500 sonrası); Provençal</language>
+ <language type="oj">Ojibwa</language>
+ <language type="om">Oromo (Afan)</language>
+ <language type="or">Oriya</language>
+ <language type="os">Oset</language>
+ <language type="osa">Osage</language>
+ <language type="ota">Osmanlıca (1500-1928)</language>
+ <language type="oto">Osmanlı Dilleri</language>
+ <language type="pa">Pencap Dili</language>
+ <language type="paa">Papua Dili (DiÄŸer)</language>
+ <language type="pal" draft="provisional">Pehlevi</language>
+ <language type="pau">Palau Dili</language>
+ <language type="peo">Eski Farsça (600-400 M.Ö.)</language>
+ <language type="phi">Filipinler Dili (DiÄŸer)</language>
+ <language type="pl">Polonya Dili</language>
+ <language type="pra">Prakrit Dilleri</language>
+ <language type="pro">Eski Provençal (1500'e kadar)</language>
+ <language type="ps">PeÅŸtun Dili</language>
+ <language type="pt">Portekizce</language>
+ <language type="qu">Quechua</language>
+ <language type="rm">Rhaeto-Roman Dili</language>
+ <language type="rn">Kirundi</language>
+ <language type="ro">Romence</language>
+ <language type="roa">Roman Dili (DiÄŸer)</language>
+ <language type="rom">Romanca</language>
+ <language type="ru">Rusça</language>
+ <language type="rw">Kinyarwanda</language>
+ <language type="sa">Sanskritçe</language>
+ <language type="sai">Güney Amerika Yerlileri Dili (Diğer)</language>
+ <language type="sal">Salishan Dilleri</language>
+ <language type="sam" draft="provisional">Samaritan Aramcası</language>
+ <language type="sc">Sardunya Dili</language>
+ <language type="scn" draft="provisional">Sicilya Dili</language>
+ <language type="sco">İskoç</language>
+ <language type="sd">Sindhi</language>
+ <language type="se">Kuzey Sami</language>
+ <language type="sem">Sami (DiÄŸer)</language>
+ <language type="sg">Sangho</language>
+ <language type="sga">Eski Ä°rlandaca (900'e kadar)</language>
+ <language type="sgn">Ä°ÅŸaret Dilleri</language>
+ <language type="sh">Sırp-Hırvat Dili</language>
+ <language type="si">Sinhal Dili</language>
+ <language type="sio">Siu Dilleri</language>
+ <language type="sit">Çin-Tibet (Diğer)</language>
+ <language type="sk">Slovakça</language>
+ <language type="sl">Slovence</language>
+ <language type="sla">Slav Dilleri (DiÄŸer)</language>
+ <language type="sm">Samoa Dili</language>
+ <language type="sma">Güney Sami</language>
+ <language type="smi">Sami Dilleri (DiÄŸer)</language>
+ <language type="smj">Lule Sami</language>
+ <language type="smn">Inari Sami</language>
+ <language type="sms">Skolt Sami</language>
+ <language type="sn">Shona</language>
+ <language type="so">Somali Dili</language>
+ <language type="sq">Arnavutça</language>
+ <language type="sr">Sırpça</language>
+ <language type="ss">Siswati</language>
+ <language type="ssa">Nil-Sahara (DiÄŸer)</language>
+ <language type="st">Sesotho</language>
+ <language type="su">Sudan Dili</language>
+ <language type="sux">Sümer</language>
+ <language type="sv">İsveççe</language>
+ <language type="sw">Swahili</language>
+ <language type="syr">Süryanice</language>
+ <language type="ta">Tamil</language>
+ <language type="tai">Tay Dili (DiÄŸer)</language>
+ <language type="te">Telugu</language>
+ <language type="tg">Tacik Dili</language>
+ <language type="th">Tay Dili</language>
+ <language type="ti">Tigrinya</language>
+ <language type="tk">Türkmence</language>
+ <language type="tl">Tagalog</language>
+ <language type="tn">Setswana</language>
+ <language type="to">Tonga (Tonga Adaları)</language>
+ <language type="tr">Türkçe</language>
+ <language type="ts">Tsonga</language>
+ <language type="tt">Tatarca</language>
+ <language type="tup">Tupi dilleri</language>
+ <language type="tut">Altay Dilleri (DiÄŸer)</language>
+ <language type="tw">Twi</language>
+ <language type="ty">Tahiti Dili</language>
+ <language type="tyv" draft="provisional">Tuva Dili</language>
+ <language type="ug">Uygurca</language>
+ <language type="uga" draft="provisional">Ugarit Dili</language>
+ <language type="uk">Ukraynaca</language>
+ <language type="und" draft="provisional">Belirsiz</language>
+ <language type="ur">Urduca</language>
+ <language type="uz">Özbekçe</language>
+ <language type="vi">Vietnam Dili</language>
+ <language type="vo">Volapuk</language>
+ <language type="wak">Wakashan Dilleri</language>
+ <language type="wen">Sorb Dilleri</language>
+ <language type="wo">Wolof</language>
+ <language type="xal">Kalmık</language>
+ <language type="xh">Xhosa</language>
+ <language type="yi">YiddiÅŸ</language>
+ <language type="yo">Yoruba</language>
+ <language type="ypk">Yupik Dilleri</language>
+ <language type="za">Zhuang</language>
+ <language type="zap" draft="provisional">Zapotek Dili</language>
+ <language type="zh">Çince</language>
+ <language type="zu">Zulu</language>
+ </languages>
+ <scripts>
+ <script type="Arab">Arapça</script>
+ <script type="Armn">Ermenice</script>
+ <script type="Beng">Bengal</script>
+ <script type="Blis" draft="provisional">Blis Sembolleri</script>
+ <script type="Cher">Çeroki</script>
+ <script type="Copt" draft="provisional">Koptik</script>
+ <script type="Cprt">Kıbrıs</script>
+ <script type="Cyrl">Kiril</script>
+ <script type="Cyrs" draft="provisional">Kiril (Eski Kilise Slavcası varyantı)</script>
+ <script type="Egyd" draft="provisional">Mısır Yazısı - Demotik</script>
+ <script type="Egyh" draft="provisional">Mısır Yazısı - Hieratik</script>
+ <script type="Egyp" draft="provisional">Mısır Yazısı - Hiyeroglif</script>
+ <script type="Ethi">Etiyopya</script>
+ <script type="Geor">Gürcüce</script>
+ <script type="Goth">Gotik</script>
+ <script type="Grek">Yunan</script>
+ <script type="Hani">Hun</script>
+ <script type="Hani" alt="proposed-u51-1" draft="provisional">Han</script>
+ <script type="Hans">Basit Han</script>
+ <script type="Hant">Geleneksel Han</script>
+ <script type="Hebr">Ä°branice</script>
+ <script type="Hung" draft="provisional">Eski Macarca</script>
+ <script type="Laoo">Laos</script>
+ <script type="Maya" draft="provisional">Maya Hiyeroglifleri</script>
+ <script type="Mong">MoÄŸolca</script>
+ <script type="Orkh" draft="provisional">Orhun</script>
+ <script type="Phnx" draft="provisional">Fonetik</script>
+ <script type="Plrd" draft="provisional">Pollard Fonetik</script>
+ <script type="Sinh">Sinhal</script>
+ <script type="Syrc">Süryanice</script>
+ <script type="Syre" draft="provisional">Süryanice (Estrangela varyantı)</script>
+ <script type="Syrj" draft="provisional">Süryanice (Batı varyantı)</script>
+ <script type="Syrn" draft="provisional">Süryanice (Doğu varyantı)</script>
+ <script type="Thai">Tayca</script>
+ <script type="Tibt">Tibetçe</script>
+ <script type="Ugar" draft="provisional">Çivi Yazısı</script>
+ <script type="Visp" draft="provisional">Görülebilir Konuşma</script>
+ <script type="Xpeo" draft="provisional">Eski Farsça</script>
+ <script type="Xsux" draft="provisional">Sümer-Akad Çivi Yazısı</script>
+ <script type="Zyyy">Ortak</script>
+ </scripts>
+ <territories>
+ <territory type="001">Dünya</territory>
+ <territory type="002">Afrika</territory>
+ <territory type="005">Güney Amerika</territory>
+ <territory type="009">Okyanusya</territory>
+ <territory type="011">Batı Afrika</territory>
+ <territory type="013">Orta Amerika</territory>
+ <territory type="014">DoÄŸu Afrika</territory>
+ <territory type="015">Kuzey Afrika</territory>
+ <territory type="017">Orta Afrika</territory>
+ <territory type="018">Güney Afrika [018]</territory>
+ <territory type="018" alt="proposed-u51-2" draft="provisional">Afrika'nın Güneyi</territory>
+ <territory type="019">Amerika</territory>
+ <territory type="021">Kuzey Amerika</territory>
+ <territory type="029">Karayipler</territory>
+ <territory type="030">DoÄŸu Asya</territory>
+ <territory type="034" draft="provisional">Güney Asya</territory>
+ <territory type="035">Güney Doğu Asya</territory>
+ <territory type="039">Güney Avrupa</territory>
+ <territory type="053">Avustralya ve Yeni Zelanda</territory>
+ <territory type="054">Melanezya</territory>
+ <territory type="057">Mikronezya</territory>
+ <territory type="061">Polinezya</territory>
+ <territory type="062">Güney Orta Asya</territory>
+ <territory type="142">Asya</territory>
+ <territory type="143" draft="provisional">Orta Asya</territory>
+ <territory type="145">Batı Asya</territory>
+ <territory type="150">Avrupa</territory>
+ <territory type="151">DoÄŸu Avrupa</territory>
+ <territory type="154">Kuzey Avrupa</territory>
+ <territory type="155">Batı Avrupa</territory>
+ <territory type="172" draft="provisional">Bağımsız Devletler Topluluğu</territory>
+ <territory type="419" draft="provisional">Latin Amerika ve Karayipler</territory>
+ <territory type="830">Kanal Adaları</territory>
+ <territory type="IM">Man Adası</territory>
+ <territory type="AD">Andora</territory>
+ <territory type="AE">BirleÅŸik Arap Emirlikleri</territory>
+ <territory type="AF">Afganistan</territory>
+ <territory type="AG">Antigua ve Barbuda</territory>
+ <territory type="AI">Anguilla</territory>
+ <territory type="AL">Arnavutluk</territory>
+ <territory type="AM">Ermenistan</territory>
+ <territory type="AN">Hollanda Antilleri</territory>
+ <territory type="AO">Angola</territory>
+ <territory type="AQ">Antarktika</territory>
+ <territory type="AR">Arjantin</territory>
+ <territory type="AS">Amerikan Samoası</territory>
+ <territory type="AT">Avusturya</territory>
+ <territory type="AU">Avustralya</territory>
+ <territory type="AW">Aruba</territory>
+ <territory type="AX">Aland Adaları</territory>
+ <territory type="AZ">Azerbaycan</territory>
+ <territory type="BA">Bosna Hersek</territory>
+ <territory type="BB">Barbados</territory>
+ <territory type="BD">BangladeÅŸ</territory>
+ <territory type="BE">Belçika</territory>
+ <territory type="BF">Burkina Faso</territory>
+ <territory type="BG">Bulgaristan</territory>
+ <territory type="BH">Bahreyn</territory>
+ <territory type="BI">Burundi</territory>
+ <territory type="BJ">Benin</territory>
+ <territory type="BM">Bermuda</territory>
+ <territory type="BN">Brunei</territory>
+ <territory type="BO">Bolivya</territory>
+ <territory type="BR">Brezilya</territory>
+ <territory type="BS">Bahamalar</territory>
+ <territory type="BT">Bhutan</territory>
+ <territory type="BV">Bouvet Adası</territory>
+ <territory type="BW">Botsvana</territory>
+ <territory type="BY">Beyaz Rusya</territory>
+ <territory type="BZ">Belize</territory>
+ <territory type="CA">Kanada</territory>
+ <territory type="CC">Cocos (Keeling) Adaları</territory>
+ <territory type="CD">Kongo Demokratik Cumhuriyeti</territory>
+ <territory type="CF">Orta Afrika Cumhuriyeti</territory>
+ <territory type="CG">Kongo</territory>
+ <territory type="CH">İsviçre</territory>
+ <territory type="CI">FildiÅŸi Sahilleri</territory>
+ <territory type="CK">Cook Adaları</territory>
+ <territory type="CL">Åžili</territory>
+ <territory type="CM">Kamerun</territory>
+ <territory type="CN">Çin</territory>
+ <territory type="CO">Kolombiya</territory>
+ <territory type="CR">Kosta Rika</territory>
+ <territory type="CS">Sırbistan-Karadağ</territory>
+ <territory type="CU">Küba</territory>
+ <territory type="CV">Cape Verde</territory>
+ <territory type="CX">Christmas Adası</territory>
+ <territory type="CY">Kıbrıs</territory>
+ <territory type="CZ">Çek Cumhuriyeti</territory>
+ <territory type="DE">Almanya</territory>
+ <territory type="DJ">Cibuti</territory>
+ <territory type="DK">Danimarka</territory>
+ <territory type="DM">Dominik</territory>
+ <territory type="DO">Dominik Cumhuriyeti</territory>
+ <territory type="DZ">Cezayir</territory>
+ <territory type="EC">Ekvator</territory>
+ <territory type="EE">Estonya</territory>
+ <territory type="EG">Mısır</territory>
+ <territory type="EH">Batı Sahara</territory>
+ <territory type="ER">Eritre</territory>
+ <territory type="ES">Ä°spanya</territory>
+ <territory type="ET">Etiyopya</territory>
+ <territory type="FI">Finlandiya</territory>
+ <territory type="FJ">Fiji</territory>
+ <territory type="FK">Falkland Adaları (Malvinalar)</territory>
+ <territory type="FM">Mikronezya Federal Eyaletleri</territory>
+ <territory type="FO">Faroe Adaları</territory>
+ <territory type="FR">Fransa</territory>
+ <territory type="GA">Gabon</territory>
+ <territory type="GB">Birleşik Krallık</territory>
+ <territory type="GD">Granada</territory>
+ <territory type="GE">Gürcistan</territory>
+ <territory type="GF">Fransız Guyanası</territory>
+ <territory type="GH">Gana</territory>
+ <territory type="GI">Cebelitarık</territory>
+ <territory type="GL">Grönland</territory>
+ <territory type="GM">Gambia</territory>
+ <territory type="GN">Gine</territory>
+ <territory type="GP">Guadeloupe</territory>
+ <territory type="GQ">Ekvator Ginesi</territory>
+ <territory type="GR">Yunanistan</territory>
+ <territory type="GS">Güney Georgia ve Güney Sandwich Adaları</territory>
+ <territory type="GT">Guatemala</territory>
+ <territory type="GU">Guam</territory>
+ <territory type="GW">Gine-Bissau</territory>
+ <territory type="GY">Guyana</territory>
+ <territory type="HK">Hong Kong SAR - Çin</territory>
+ <territory type="HM">Heard Adası ve McDonald Adaları</territory>
+ <territory type="HN">Honduras</territory>
+ <territory type="HR">Hırvatistan</territory>
+ <territory type="HT">Haiti</territory>
+ <territory type="HU">Macaristan</territory>
+ <territory type="ID">Endonezya</territory>
+ <territory type="IE">Ä°rlanda</territory>
+ <territory type="IL">Ä°srail</territory>
+ <territory type="IN">Hindistan</territory>
+ <territory type="IO">Hint Okyanusu İngiliz Bölgesi</territory>
+ <territory type="IQ">Irak</territory>
+ <territory type="IR">Ä°ran</territory>
+ <territory type="IS">Ä°zlanda</territory>
+ <territory type="IT">Ä°talya</territory>
+ <territory type="JM">Jamaika</territory>
+ <territory type="JO">Ürdün</territory>
+ <territory type="JP">Japonya</territory>
+ <territory type="KE">Kenya</territory>
+ <territory type="KG">Kırgızistan</territory>
+ <territory type="KH">Kamboçya</territory>
+ <territory type="KI">Kiribati</territory>
+ <territory type="KM">Komorlar</territory>
+ <territory type="KN">Saint Kittler ve Neviler</territory>
+ <territory type="KP">Kuzey Kore</territory>
+ <territory type="KR">Güney Kore</territory>
+ <territory type="KW">Kuveyt</territory>
+ <territory type="KY">Kayman Adaları</territory>
+ <territory type="KZ">Kazakistan</territory>
+ <territory type="LA">Laos</territory>
+ <territory type="LB">Lübnan</territory>
+ <territory type="LC">Saint Lucia</territory>
+ <territory type="LI">Liechtenstein</territory>
+ <territory type="LK">Sri Lanka</territory>
+ <territory type="LR">Liberya</territory>
+ <territory type="LS">Lesotho</territory>
+ <territory type="LT">Litvanya</territory>
+ <territory type="LU">Lüksemburg</territory>
+ <territory type="LV">Letonya</territory>
+ <territory type="LY">Libya</territory>
+ <territory type="MA">Fas</territory>
+ <territory type="MC">Monako</territory>
+ <territory type="MD">Moldovya Cumhuriyeti</territory>
+ <territory type="MG">Madagaskar</territory>
+ <territory type="MH">Marshall Adaları</territory>
+ <territory type="MK">Makedonya Cumhuriyeti</territory>
+ <territory type="ML">Mali</territory>
+ <territory type="MM">Myanmar</territory>
+ <territory type="MN">MoÄŸolistan</territory>
+ <territory type="MO">Makao S.A.R. Çin</territory>
+ <territory type="MP">Kuzey Mariana Adaları</territory>
+ <territory type="MQ">Martinik</territory>
+ <territory type="MR">Moritanya</territory>
+ <territory type="MS">Montserrat</territory>
+ <territory type="MT">Malta</territory>
+ <territory type="MU">Mauritius</territory>
+ <territory type="MV">Maldivler</territory>
+ <territory type="MW">Malavi</territory>
+ <territory type="MX">Meksika</territory>
+ <territory type="MY">Malezya</territory>
+ <territory type="MZ">Mozambik</territory>
+ <territory type="NA">Namibya</territory>
+ <territory type="NC">Yeni Kaledonya</territory>
+ <territory type="NE">Nijer</territory>
+ <territory type="NF">Norfolk Adası</territory>
+ <territory type="NG">Nijerya</territory>
+ <territory type="NI">Nikaragua</territory>
+ <territory type="NL">Hollanda</territory>
+ <territory type="NO">Norveç</territory>
+ <territory type="NP">Nepal</territory>
+ <territory type="NR">Nauru Adası</territory>
+ <territory type="NU">Niue Adaları</territory>
+ <territory type="NZ">Yeni Zelanda</territory>
+ <territory type="OM">Umman</territory>
+ <territory type="PA">Panama</territory>
+ <territory type="PE">Peru</territory>
+ <territory type="PF">Fransız Polinezyası</territory>
+ <territory type="PG">Papua Yeni Gine</territory>
+ <territory type="PH">Filipinler</territory>
+ <territory type="PK">Pakistan</territory>
+ <territory type="PL">Polonya</territory>
+ <territory type="PM">Saint Pierre ve Miquelon</territory>
+ <territory type="PN">Pitcairn</territory>
+ <territory type="PR">Porto Riko</territory>
+ <territory type="PS">Filistin Bölgesi</territory>
+ <territory type="PT">Portekiz</territory>
+ <territory type="PW">Palau</territory>
+ <territory type="PY">Paraguay</territory>
+ <territory type="QA">Katar</territory>
+ <territory type="QO">Uzak Okyanusya</territory>
+ <territory type="RE">Reunion</territory>
+ <territory type="RO">Romanya</territory>
+ <territory type="RU">Rusya Federasyonu</territory>
+ <territory type="RW">Ruanda</territory>
+ <territory type="SA">Suudi Arabistan</territory>
+ <territory type="SB">Solomon Adaları</territory>
+ <territory type="SC">SeyÅŸeller</territory>
+ <territory type="SD">Sudan</territory>
+ <territory type="SE">İsveç</territory>
+ <territory type="SG">Singapur</territory>
+ <territory type="SH">Saint Helena</territory>
+ <territory type="SI">Slovenya</territory>
+ <territory type="SJ">Svalbard ve Jan Mayen</territory>
+ <territory type="SK">Slovakya</territory>
+ <territory type="SL">Sierra Leone</territory>
+ <territory type="SM">San Marino</territory>
+ <territory type="SN">Senegal</territory>
+ <territory type="SO">Somali</territory>
+ <territory type="SR">Surinam</territory>
+ <territory type="ST">Sao Tome ve Principe</territory>
+ <territory type="SV">El Salvador</territory>
+ <territory type="SY">Suriye</territory>
+ <territory type="SZ">Svaziland</territory>
+ <territory type="TC">Turks ve Caicos Adaları</territory>
+ <territory type="TD">Çad</territory>
+ <territory type="TF">Fransız Güney Bölgeleri</territory>
+ <territory type="TG">Togo</territory>
+ <territory type="TH">Tayland</territory>
+ <territory type="TJ">Tacikistan</territory>
+ <territory type="TK">Tokelau</territory>
+ <territory type="TL">DoÄŸu Timor</territory>
+ <territory type="TM">Türkmenistan</territory>
+ <territory type="TN">Tunus</territory>
+ <territory type="TO">Tonga</territory>
+ <territory type="TR">Türkiye</territory>
+ <territory type="TT">Trinidad ve Tobago</territory>
+ <territory type="TV">Tuvalu</territory>
+ <territory type="TW">Tayvan</territory>
+ <territory type="TZ">Tanzanya</territory>
+ <territory type="UA">Ukrayna</territory>
+ <territory type="UG">Uganda</territory>
+ <territory type="UM">Amerika Birleşik Devletleri Küçük Dış Adaları</territory>
+ <territory type="US">Amerika BirleÅŸik Devletleri</territory>
+ <territory type="UY">Uruguay</territory>
+ <territory type="UZ">Özbekistan</territory>
+ <territory type="VA">Kutsal Devlet (Vatikan Åžehir Devleti)</territory>
+ <territory type="VC">Saint Vincent ve Grenadinler</territory>
+ <territory type="VE">Venezuela</territory>
+ <territory type="VG">İngiliz Virgin Adaları</territory>
+ <territory type="VI">ABD Virgin Adaları</territory>
+ <territory type="VN">Vietnam</territory>
+ <territory type="VU">Vanuatu</territory>
+ <territory type="WF">Wallis ve Futuna</territory>
+ <territory type="WS">Samoa</territory>
+ <territory type="YE">Yemen</territory>
+ <territory type="YT">Mayotte</territory>
+ <territory type="ZA">Güney Afrika</territory>
+ <territory type="ZM">Zambiya</territory>
+ <territory type="ZW">Zimbabwe</territory>
+ </territories>
+ <variants>
+ <variant type="1901" draft="provisional">Geleneksel Alman Yazım Kuralları</variant>
+ <variant type="1996" draft="provisional">1996 Alman Yazım Kuralları</variant>
+ <variant type="POLYTONI" draft="provisional">Politonik</variant>
+ <variant type="REVISED" draft="provisional">Gözden Geçirilmiş Yazım Kuralları</variant>
+ </variants>
+ <keys>
+ <key type="calendar">Takvim</key>
+ <key type="collation">Sıralama</key>
+ <key type="currency">Para Birimi</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation" draft="provisional">Geleneksel Çince (Big5)</type>
+ <type type="buddhist" key="calendar">Budist Takvimi</type>
+ <type type="chinese" key="calendar">Çin Takvimi</type>
+ <type type="direct" key="collation">Düz Sıralama</type>
+ <type type="gb2312han" key="collation" draft="provisional">Basitleştirilmiş Çince (GB2312)</type>
+ <type type="gregorian" key="calendar">Miladi Takvim</type>
+ <type type="hebrew" key="calendar">Yahudi Takvimi</type>
+ <type type="islamic" key="calendar">Hicri Takvim</type>
+ <type type="islamic-civil" key="calendar">Arap Takvimi</type>
+ <type type="japanese" key="calendar">Japon Takvimi</type>
+ <type type="phonebook" key="collation">Telefon Defteri Sıralaması</type>
+ <type type="pinyin" key="collation">Pinyin Sıralaması</type>
+ <type type="stroke" key="collation">Stroke Sıralaması</type>
+ <type type="traditional" key="collation">Geleneksel</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US" draft="provisional">ABD</measurementSystemName>
+ <measurementSystemName type="metric" draft="provisional">Metrik</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a-c ç d-g ğ h ı i İ j-o ö p r s ş t u ü v y z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[á à ă â Ã¥ ä Ä Ã¦ é è Ä• ê ë Ä“ í ì Ä­ î ï Ä« ñ ó ò Šô ø Å Å“ q ß ú ù Å­ û Å« w x ÿ]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Oca</month>
+ <month type="2">Åžub</month>
+ <month type="3">Mar</month>
+ <month type="4">Nis</month>
+ <month type="5">May</month>
+ <month type="6">Haz</month>
+ <month type="7">Tem</month>
+ <month type="8">AÄŸu</month>
+ <month type="9">Eyl</month>
+ <month type="10">Eki</month>
+ <month type="11">Kas</month>
+ <month type="12">Ara</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Ocak</month>
+ <month type="2">Åžubat</month>
+ <month type="3">Mart</month>
+ <month type="4">Nisan</month>
+ <month type="5">Mayıs</month>
+ <month type="6">Haziran</month>
+ <month type="7">Temmuz</month>
+ <month type="8">AÄŸustos</month>
+ <month type="9">Eylül</month>
+ <month type="10">Ekim</month>
+ <month type="11">Kasım</month>
+ <month type="12">Aralık</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">O</month>
+ <month type="2">Åž</month>
+ <month type="3">M</month>
+ <month type="4">N</month>
+ <month type="5">M</month>
+ <month type="6">H</month>
+ <month type="7">T</month>
+ <month type="8">A</month>
+ <month type="9">E</month>
+ <month type="10">E</month>
+ <month type="11">K</month>
+ <month type="12">A</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Paz</day>
+ <day type="mon">Pzt</day>
+ <day type="tue">Sal</day>
+ <day type="wed">Çar</day>
+ <day type="thu">Per</day>
+ <day type="fri">Cum</day>
+ <day type="sat">Cmt</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Pazar</day>
+ <day type="mon">Pazartesi</day>
+ <day type="tue">Salı</day>
+ <day type="wed">Çarşamba</day>
+ <day type="thu">PerÅŸembe</day>
+ <day type="fri">Cuma</day>
+ <day type="sat">Cumartesi</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">P</day>
+ <day type="mon">P</day>
+ <day type="tue">S</day>
+ <day type="wed">Ç</day>
+ <day type="thu">P</day>
+ <day type="fri">C</day>
+ <day type="sat">C</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="provisional">Ç1</quarter>
+ <quarter type="2" draft="provisional">Ç2</quarter>
+ <quarter type="3" draft="provisional">Ç3</quarter>
+ <quarter type="4" draft="provisional">Ç4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1. çeyrek</quarter>
+ <quarter type="2">2. çeyrek</quarter>
+ <quarter type="3">3. çeyrek</quarter>
+ <quarter type="4">4. çeyrek</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraAbbr>
+ <era type="0">MÖ</era>
+ <era type="1">MS</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>dd MMMM yyyy EEEE</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMMM yyyy EEEE</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd.MMM.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd.MM.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="provisional">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="provisional">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="provisional">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="provisional">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="provisional">QQQQ yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName draft="provisional">Miladi Dönem</displayName>
+ </field>
+ <field type="year">
+ <displayName draft="provisional">Yıl</displayName>
+ </field>
+ <field type="month">
+ <displayName draft="provisional">Ay</displayName>
+ </field>
+ <field type="week">
+ <displayName draft="provisional">Hafta</displayName>
+ </field>
+ <field type="day">
+ <displayName draft="provisional">Gün</displayName>
+ </field>
+ <field type="weekday">
+ <displayName draft="provisional">Haftanın Günü</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName draft="provisional">Günün Bölümü</displayName>
+ </field>
+ <field type="hour">
+ <displayName draft="provisional">Saat</displayName>
+ </field>
+ <field type="minute">
+ <displayName draft="provisional">Dakika</displayName>
+ </field>
+ <field type="second">
+ <displayName draft="provisional">Saniye</displayName>
+ </field>
+ <field type="zone">
+ <displayName draft="provisional">Saat Dilimi</displayName>
+ </field>
+ </fields>
+ </calendar>
+ <calendar type="hebrew">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="provisional">TiÅŸri</month>
+ <month type="2" draft="provisional">HeÅŸvan</month>
+ <month type="5" draft="provisional">Åževat</month>
+ <month type="6" draft="provisional">Veadar</month>
+ <month type="9" draft="provisional">Ä°yar</month>
+ <month type="13" draft="provisional">Ellul</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="provisional">TiÅŸri</month>
+ <month type="2" draft="provisional">HeÅŸvan</month>
+ <month type="5" draft="provisional">Åževat</month>
+ <month type="6" draft="provisional">Veadar</month>
+ <month type="9" draft="provisional">Ä°yar</month>
+ <month type="13" draft="provisional">Ellul</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="islamic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="provisional">Muharrem</month>
+ <month type="2" draft="provisional">Safer</month>
+ <month type="3" draft="provisional">Rebiülevvel</month>
+ <month type="4" draft="provisional">Rebiülahir</month>
+ <month type="5" draft="provisional">Cemaziyelevvel</month>
+ <month type="6" draft="provisional">Cemaziyelahir</month>
+ <month type="7" draft="provisional">Recep</month>
+ <month type="8" draft="provisional">Åžaban</month>
+ <month type="9" draft="provisional">Ramazan</month>
+ <month type="10" draft="provisional">Åževval</month>
+ <month type="11" draft="provisional">Zilkade</month>
+ <month type="12" draft="provisional">Zilhicce</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="provisional">Muharrem</month>
+ <month type="2" draft="provisional">Safer</month>
+ <month type="3" draft="provisional">Rebiülevvel</month>
+ <month type="4" draft="provisional">Rebiülahir</month>
+ <month type="5" draft="provisional">Cemaziyelevvel</month>
+ <month type="6" draft="provisional">Cemaziyelahir</month>
+ <month type="7" draft="provisional">Recep</month>
+ <month type="8" draft="provisional">Åžaban</month>
+ <month type="9" draft="provisional">Ramazan</month>
+ <month type="10" draft="provisional">Åževval</month>
+ <month type="11" draft="provisional">Zilkade</month>
+ <month type="12" draft="provisional">Zilhicce</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="islamic-civil">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1" draft="provisional">Muharrem</month>
+ <month type="2" draft="provisional">Safer</month>
+ <month type="3" draft="provisional">Rebiülevvel</month>
+ <month type="4" draft="provisional">Rebiülahir</month>
+ <month type="5" draft="provisional">Cemaziyelevvel</month>
+ <month type="6" draft="provisional">Cemaziyelahir</month>
+ <month type="7" draft="provisional">Recep</month>
+ <month type="8" draft="provisional">Åžaban</month>
+ <month type="9" draft="provisional">Ramazan</month>
+ <month type="10" draft="provisional">Åževval</month>
+ <month type="11" draft="provisional">Zilkade</month>
+ <month type="12" draft="provisional">Zilhicce</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="persian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="provisional">Ferwerdin</month>
+ <month type="2" draft="provisional">OrdibeheÅŸt</month>
+ <month type="3" draft="provisional">Hordâd</month>
+ <month type="5" draft="provisional">Mordâd</month>
+ <month type="6" draft="provisional">Åžehrivar</month>
+ <month type="8" draft="provisional">Âbân</month>
+ <month type="9" draft="provisional">Âzar</month>
+ <month type="10" draft="provisional">Daî</month>
+ <month type="11" draft="provisional">Behman</month>
+ <month type="12" draft="provisional">Ä°sfand</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="provisional">Ferwerdin</month>
+ <month type="2" draft="provisional">OrdibeheÅŸt</month>
+ <month type="3" draft="provisional">Hordâd</month>
+ <month type="5" draft="provisional">Mordâd</month>
+ <month type="6" draft="provisional">Åžehrivar</month>
+ <month type="8" draft="provisional">Âbân</month>
+ <month type="9" draft="provisional">Âzar</month>
+ <month type="10" draft="provisional">Daî</month>
+ <month type="11" draft="provisional">Behman</month>
+ <month type="12" draft="provisional">Ä°sfand</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Güney Kutbu</exemplarCity>
+ </zone>
+ <zone type="Australia/Melbourne">
+ <exemplarCity>Melborn</exemplarCity>
+ </zone>
+ <zone type="Australia/Sydney">
+ <exemplarCity>Sidney</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <standard>Atlantik Standart Saati</standard>
+ <daylight>Atlantik Yaz Saati</daylight>
+ </long>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <standard>Newfoundland Standart Saati</standard>
+ <daylight>Newfoundland Yaz Saati</daylight>
+ </long>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity>KinÅŸasa</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity>LubumbaÅŸi</exemplarCity>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity>KaÅŸgar</exemplarCity>
+ </zone>
+ <zone type="Asia/Urumqi">
+ <exemplarCity>Urumçi</exemplarCity>
+ </zone>
+ <zone type="Asia/Chongqing">
+ <exemplarCity>Çunking</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <standard>Çin Standart Saati</standard>
+ <daylight>Çin Standart Saati</daylight>
+ <daylight alt="proposed-u51-1" draft="provisional">Çin Yaz Saati</daylight>
+ </long>
+ <exemplarCity>Åžangay</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>Kanarya</exemplarCity>
+ </zone>
+ <zone type="Africa/Ceuta">
+ <exemplarCity>Septe</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>Londra</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity>Cakarta</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtau">
+ <exemplarCity>Şevçenko</exemplarCity>
+ </zone>
+ <zone type="Asia/Oral">
+ <exemplarCity>Uralsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtobe">
+ <exemplarCity>Aktyubinsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Qyzylorda">
+ <exemplarCity>Kızıl-Orda</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity>Almatı</exemplarCity>
+ </zone>
+ <zone type="Asia/Hovd">
+ <exemplarCity>Kobdo</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>Ulanbator</exemplarCity>
+ </zone>
+ <zone type="Asia/Choibalsan">
+ <exemplarCity>Çoybalsan</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>Meksiko City</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>Kankun</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuching">
+ <exemplarCity>Kuçing</exemplarCity>
+ </zone>
+ <zone type="Pacific/Marquesas">
+ <exemplarCity>Markiz</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>Azor Adaları</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>Lizbon</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>Moskova</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity draft="provisional">Ä°rkutsk</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity draft="provisional">Sahalin</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>Kamçatka</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity draft="provisional">Anadır</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity draft="provisional">Ujgorod</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity draft="provisional">Zaporojye</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <standard>Hawaii Standart Saati</standard>
+ <daylight>Hawaii Standart Saati</daylight>
+ <daylight alt="proposed-u51-1" draft="provisional">Hawaii Yaz Saati</daylight>
+ </long>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <standard>Alaska Standart Saati</standard>
+ <daylight>Alaska Yaz Saati</daylight>
+ </long>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <standard>Pasifik Standart Saati</standard>
+ <daylight>Pasifik Yaz Saati</daylight>
+ </long>
+ </zone>
+ <zone type="America/Phoenix">
+ <long>
+ <standard>ABD Sıradağlar Standart Saati</standard>
+ <daylight>ABD Sıradağlar Standart Saati</daylight>
+ <daylight alt="proposed-u51-2" draft="provisional">ABD Sıradağlar (Phoenix) Yaz Saati</daylight>
+ </long>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <standard>ABD Sıradağlar Standart Saati</standard>
+ <daylight>ABD Sıradağlar Yaz Saati</daylight>
+ </long>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <standard>Merkezi Standart Saati</standard>
+ <daylight>Merkezi Yaz Saati</daylight>
+ </long>
+ <exemplarCity>Åžikago</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <long>
+ <standard>DoÄŸu Standart Saati</standard>
+ <daylight alt="proposed-u51-2" draft="provisional">DoÄŸu (Indianapolis) Yaz Saati</daylight>
+ </long>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <standard>DoÄŸu Standart Saati</standard>
+ <daylight>DoÄŸu Yaz Saati</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity>Semerkand</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>TaÅŸkent</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern draft="provisional">% #,##0</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="provisional">#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ADP">
+ <displayName>Andora Pezetası</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>BirleÅŸik Arap Emirlikleri Dirhemi</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>Afganistan Afganisi (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>Afganistan Afganisi</displayName>
+ <symbol>Af</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>Arnavutluk Leki</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>Ermenistan Dramı</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>Hollanda Antilleri Guldeni</displayName>
+ <symbol>NA f.</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>Angola Kvanzası</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>Angola Kvanzası (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>Yeni Angola Kvanzası (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>Angola Kvanzası Reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>Arjantin Australi</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>Arjantin Pezosu (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>Arjantin Pezosu</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>Avusturya Åžilini</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>Avustralya Doları</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>Aruba Florini</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>Azerbaycan Manatı</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>Bosna Hersek Dinarı</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>Konvertibl Bosna Hersek Markı</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>Barbados Doları</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>Bangladeş Takası</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>Belçika Frangı (konvertibl)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>Belçika Frangı</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>Belçika Frangı (finansal)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>Bulgar Levası (Hard)</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>Yeni Bulgar Levası</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>Bahreyn Dinarı</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>Burundi Frangı</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>Bermuda Doları</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>Brunei Doları</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>Bolivya Bolivyanosu</displayName>
+ <symbol>Bs</symbol>
+ </currency>
+ <currency type="BOP">
+ <displayName>Bolivya Pezosu</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>Bolivya Mvdol</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>Yeni Brezilya Kruzeirosu (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>Brezilya Kruzadosu</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>Brezilya Kruzeirosu (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>Brezilya Reali</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRN">
+ <displayName>Yeni Brezilya Kruzadosu</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>Brezilya Kruzeirosu</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>Bahama Doları</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>Bhutan Ngultrumu</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>Burma Kyatı</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>Botsvana Pulası</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>Yeni Beyaz Rusya Rublesi (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>Beyaz Rusya Rublesi</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>Belize Doları</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>Kanada Doları</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>Kongo Frangı</displayName>
+ </currency>
+ <currency type="CHE">
+ <displayName draft="provisional">WIR Euro</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>İsviçre Frangı</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CHW">
+ <displayName draft="provisional">WIR Frangı</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>Åžili Unidades de Fomento</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>Åžili Pezosu</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>Çin Yuanı Renminbi</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>Kolombiya Pezosu</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="CRC">
+ <displayName>Kosta Rika Kolonu</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSD">
+ <displayName draft="provisional">Sırbistan Dinarı</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>Çekoslavak Korunası (Hard)</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>Küba Pezosu</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>Cape Verde Esküdosu</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>Güney Kıbrıs Lirası</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>Çek Cumhuriyeti Korunası</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>Doğu Alman Markı</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Alman Markı</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Cibuti Frangı</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>Danimarka Kronu</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>Dominik Pezosu</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>Cezayir Dinarı</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>Ekvator Sukresi</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>Ekvator Unidad de Valor Constante (UVC)</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>Estonya Krunu</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>Mısır Lirası</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>Eritre Nakfası</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName draft="provisional">İspanyol Pezetası (A hesabı)</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName draft="provisional">İspanyol Pezetası (konvertibl hesap)</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>İspanyol Pezetası</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>Etiyopya Birri</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>Euro</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>Fin Markkası</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>Fiji Doları</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>Falkland Adaları Lirası</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Fransız Frangı</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>Ä°ngiliz Sterlini</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>Gürcistan Kupon Larisi</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>Gürcistan Larisi</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>Gana Sedisi</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>Cebelitarık Lirası</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>Gambiya Dalasisi</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>Gine Frangı</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>Gine Syli</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Ekvator Ginesi Ekuelesi</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Yunan Drahmisi</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>Guatemala Ketzali</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>Portekiz Ginesi Esküdosu</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>Gine-Bissau Pezosu</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>Guyana Doları</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>Hong Kong Doları</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>Honduras Lempirası</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>Hırvat Dinarı</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>Hırvat Kunası</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>Haiti Gurdu</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>Macar Forinti</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>Endonezya Rupiahı</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>İrlanda Lirası</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>İsrail Lirası</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>Yeni Ä°srail Åžekeli</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>Hindistan Rupisi</displayName>
+ <symbol>INR</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>Irak Dinarı</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>Ä°ran Riyali</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>Ä°zlanda Kronu</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>Ä°talyan Lireti</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>Jamaika Doları</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>Ürdün Dinarı</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>Japon Yeni</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>Kenya Åžilini</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>Kırgız Somu</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>Kamboçya Rieli</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>Komorlar Frangı</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>Kuzey Kore Wonu</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Güney Kore Wonu</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>Kuveyt Dinarı</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>Kayman Adaları Doları</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>Kazakistan Tengesi</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>Laos Kipi</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>Lübnan Lirası</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>Sri Lanka Rupisi</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>Liberya Doları</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>Lesotho Lotisi</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LTL">
+ <displayName>Litvanya Litası</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>Litvanya Talonu</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName draft="provisional">Konvertibl Lüksemburg Frangı</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>Lüksemburg Frangı</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName draft="provisional">Mali Lüksemburg Frangı</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>Letonya Latı</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>Letonya Rublesi</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>Libya Dinarı</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>Fas Dirhemi</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>Fas Frangı</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>Moldova Leyi</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>Madagaskar Ariary</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>Madagaskar Frangı</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>Makedonya Dinarı</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>Mali Frangı</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>Myanmar Kyatı</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>MoÄŸol Tugriki</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Makao Patacası</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>Moritanya Ouguiyası</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>Malta Lirası</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName alt="proposed-u51-1" draft="provisional">Malta Sterlingi</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>Mauritius Rupisi</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>Maldiv Adaları Rufiyaa</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Malavi Kvaçası</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>Meksika Pezosu</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>Gümüş Meksika Pezosu (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>Meksika Unidad de Inversion (UDI)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>Malezya Ringiti</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>Mozambik Esküdosu</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Mozambik Meticalı</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>Namibya Doları</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>Nijerya Nairası</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>Nikaragua Kordobası</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>Nikaragua Kordobası (Oro)</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>Hollanda Florini</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Norveç Kronu</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>Nepal Rupisi</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName>Yeni Zelanda Doları</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>Umman Riyali</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>Panama Balboası</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>Peru Ä°nti</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>Yeni Peru Solu</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>Peru Solu</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Papua Yeni Gine Kinası</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>Filipinler Pezosu</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>Pakistan Rupisi</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>Polonya Zlotisi</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>Polonya Zlotisi (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>Portekiz Esküdosu</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>Paraguay Guaranisi</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>Katar Riyali</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="RHD">
+ <displayName draft="provisional">Rodezya Doları</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>Romen Leyi</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RUB">
+ <displayName>Rus Rublesi</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>Rus Rublesi (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>Ruanda Frangı</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>Suudi Arabistan Riyali</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>Solomon Adaları Doları</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>SeyÅŸeller Rupisi</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>Sudan Dinarı</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>Sudan Lirası</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>İsveç Kronu</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>Singapur Doları</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>Saint Helena Lirası</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>Slovenya Toları</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Slovak Korunası</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>Sierra Leone Leonesi</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>Somali Åžilini</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRD">
+ <displayName draft="provisional">Surinam Doları</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>Surinam Guldeni</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>Sao Tome ve Principe Dobrası</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>Sovyet Rublesi</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>El Salvador Kolonu</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>Suriye Lirası</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>Swaziland Lilangenisi</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>Tayland Bahtı</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>Tacikistan Rublesi</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Tacikistan Somonisi</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>Türkmenistan Manatı</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>Tunus Dinarı</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>Tonga Paʻangası</displayName>
+ <symbol>T$</symbol>
+ </currency>
+ <currency type="TPE">
+ <displayName>Timor Esküdosu</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Türk Lirası</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName>Yeni Türk Lirası</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Trinidad ve Tobago Doları</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>Yeni Tayvan Doları</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>Tanzanya Åžilini</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>Ukrayna Grivnası</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>Ukrayna Karbovanetz</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>Uganda Åžilini (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>Uganda Åžilini</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>ABD Doları</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>ABD Doları (Ertesi gün)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>ABD Doları (Aynı gün)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>Uruguay Pezosu (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>Uruguay Pezosu (Uruguayo)</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>Özbekistan Sumu</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>Venezuela Bolivarı</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>Vietnam Dongu</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>Vanuatu Vatusu</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>Batı Samoa Talası</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>CFA Frangı BEAC</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName draft="provisional">Gümüş</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>Altın</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>BirleÅŸik Avrupa Birimi</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName draft="provisional">Avrupa Para Birimi (EMU)</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>Avrupa Hesap Birimi (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>Avrupa Hesap Birimi (XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>Doğu Karayip Doları</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>Özel Çekme Hakkı (SDR)</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>Avrupa Para Birimi</displayName>
+ <displayName alt="proposed-u51-1" draft="provisional">Avrupa Para Birimi (ECU)</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>Fransız Altın Frangı</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>Fransız UIC-Frangı</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>CFA Frangı BCEAO</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName draft="provisional">Paladyum</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>CFP Frangı</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="XPT">
+ <displayName draft="provisional">Platin</displayName>
+ </currency>
+ <currency type="XRE">
+ <displayName draft="provisional">RINET Fonları</displayName>
+ </currency>
+ <currency type="XTS">
+ <displayName draft="provisional">Test Para Birimi Kodu</displayName>
+ </currency>
+ <currency type="XXX">
+ <displayName draft="provisional">Para Birimi Yok</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>Yemen Dinarı</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>Yemen Riyali</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>Yugoslav Dinarı (Hard)</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>Yeni Yugoslav Dinarı</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>Konvertibl Yugoslav Dinarı</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>Güney Afrika Randı (finansal)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>Güney Afrika Randı</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Zambiya Kvaçası</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>Yeni Zaire Zairesi</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>Zaire Zairesi</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>Zimbabwe Doları</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>evet:e</yesstr>
+ <nostr>hayır:hayir:h</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/tr_TR.xml b/libs/Zend/Locale/Data/tr_TR.xml
new file mode 100755
index 0000000000..ba6f030a25
--- /dev/null
+++ b/libs/Zend/Locale/Data/tr_TR.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.39 $"/>
+ <generation date="$Date: 2006/06/28 01:23:34 $"/>
+ <language type="tr"/>
+ <territory type="TR"/>
+ </identity>
+ <delimiters>
+ <quotationStart>‘</quotationStart>
+ <quotationStart alt="proposed-u51-1" draft="provisional">“</quotationStart>
+ <quotationEnd>’</quotationEnd>
+ <quotationEnd alt="proposed-u51-1" draft="provisional">â€</quotationEnd>
+ <alternateQuotationStart>“</alternateQuotationStart>
+ <alternateQuotationStart alt="proposed-u51-1" draft="provisional">‘</alternateQuotationStart>
+ <alternateQuotationEnd>â€</alternateQuotationEnd>
+ <alternateQuotationEnd alt="proposed-u51-1" draft="provisional">’</alternateQuotationEnd>
+ </delimiters>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ts.xml b/libs/Zend/Locale/Data/ts.xml
new file mode 100755
index 0000000000..1d177a0c89
--- /dev/null
+++ b/libs/Zend/Locale/Data/ts.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.11 $"/>
+ <generation date="$Date: 2006/06/28 02:08:34 $"/>
+ <language type="ts"/>
+ </identity>
+ <characters>
+ <exemplarCharacters>[a-z]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Sun</month>
+ <month type="2" draft="unconfirmed">Yan</month>
+ <month type="3" draft="unconfirmed">Kul</month>
+ <month type="4" draft="unconfirmed">Dzi</month>
+ <month type="5" draft="unconfirmed">Mud</month>
+ <month type="6" draft="unconfirmed">Kho</month>
+ <month type="7" draft="unconfirmed">Maw</month>
+ <month type="8" draft="unconfirmed">Mha</month>
+ <month type="9" draft="unconfirmed">Ndz</month>
+ <month type="10" draft="unconfirmed">Nhl</month>
+ <month type="11" draft="unconfirmed">Huk</month>
+ <month type="12" draft="unconfirmed">N'w</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Sunguti</month>
+ <month type="2" draft="unconfirmed">Nyenyenyani</month>
+ <month type="3" draft="unconfirmed">Nyenyankulu</month>
+ <month type="4" draft="unconfirmed">Dzivamisoko</month>
+ <month type="5" draft="unconfirmed">Mudyaxihi</month>
+ <month type="6" draft="unconfirmed">Khotavuxika</month>
+ <month type="7" draft="unconfirmed">Mawuwani</month>
+ <month type="8" draft="unconfirmed">Mhawuri</month>
+ <month type="9" draft="unconfirmed">Ndzhati</month>
+ <month type="10" draft="unconfirmed">Nhlangula</month>
+ <month type="11" draft="unconfirmed">Hukuri</month>
+ <month type="12" draft="unconfirmed">N'wendzamhala</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Son</day>
+ <day type="mon" draft="unconfirmed">Mus</day>
+ <day type="tue" draft="unconfirmed">Bir</day>
+ <day type="wed" draft="unconfirmed">Har</day>
+ <day type="thu" draft="unconfirmed">Ne</day>
+ <day type="fri" draft="unconfirmed">Tlh</day>
+ <day type="sat" draft="unconfirmed">Mug</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Sonto</day>
+ <day type="mon" draft="unconfirmed">Musumbhunuku</day>
+ <day type="tue" draft="unconfirmed">Ravumbirhi</day>
+ <day type="wed" draft="unconfirmed">Ravunharhu</day>
+ <day type="thu" draft="unconfirmed">Ravumune</day>
+ <day type="fri" draft="unconfirmed">Ravuntlhanu</day>
+ <day type="sat" draft="unconfirmed">Mugqivela</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">K1</quarter>
+ <quarter type="2" draft="unconfirmed">K2</quarter>
+ <quarter type="3" draft="unconfirmed">K3</quarter>
+ <quarter type="4" draft="unconfirmed">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">Kotara yo sungula</quarter>
+ <quarter type="2" draft="unconfirmed">Kotara ya vumbirhi</quarter>
+ <quarter type="3" draft="unconfirmed">Kotara ya vunharhu</quarter>
+ <quarter type="4" draft="unconfirmed">Kotara ya vumune</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ZAR">
+ <symbol draft="unconfirmed">R</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ts_ZA.xml b/libs/Zend/Locale/Data/ts_ZA.xml
new file mode 100755
index 0000000000..099ee0f031
--- /dev/null
+++ b/libs/Zend/Locale/Data/ts_ZA.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="ts"/>
+ <territory type="ZA"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/tt.xml b/libs/Zend/Locale/Data/tt.xml
new file mode 100755
index 0000000000..4839c72420
--- /dev/null
+++ b/libs/Zend/Locale/Data/tt.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.26 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="tt"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="tt" draft="unconfirmed">Татар</language>
+ </languages>
+ <territories>
+ <territory type="RU" draft="unconfirmed">РоÑÑиÑ</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[а Ó™ б-е Ñ‘ ж Ò— з-о Ó© п-у Ò¯ Ñ„ Ñ… Ò» ц-Ñ]</exemplarCharacters>
+ </characters>
+ <numbers>
+ <symbols>
+ <decimal draft="unconfirmed">,</decimal>
+ <group draft="unconfirmed"> </group>
+ </symbols>
+ <currencies>
+ <currency type="RUR">
+ <symbol draft="unconfirmed">Ñ€.</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/tt_RU.xml b/libs/Zend/Locale/Data/tt_RU.xml
new file mode 100755
index 0000000000..872c1b8d7a
--- /dev/null
+++ b/libs/Zend/Locale/Data/tt_RU.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.30 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="tt"/>
+ <territory type="RU"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd.MM.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd.MM.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="Hmm" draft="provisional">H:mm</dateFormatItem>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd.MM</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM.yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">#,##0.00¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/uk.xml b/libs/Zend/Locale/Data/uk.xml
new file mode 100755
index 0000000000..9e2d2a5f2c
--- /dev/null
+++ b/libs/Zend/Locale/Data/uk.xml
@@ -0,0 +1,2982 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.75 $"/>
+ <generation date="$Date: 2006/10/26 22:46:09 $"/>
+ <language type="uk"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">ÐфарÑька</language>
+ <language type="ab">Ðбхазька</language>
+ <language type="ace" references="RP4">ÐчехÑька</language>
+ <language type="ach" references="RP4" draft="provisional">Ðчолі</language>
+ <language type="ada" references="RP4">Ðдангме</language>
+ <language type="ady" references="RP4">ÐдигейÑька</language>
+ <language type="ae" references="RP4" draft="provisional">ÐвеÑтійÑька</language>
+ <language type="af">ÐфриканÑ</language>
+ <language type="af" references="RP4" alt="proposed-u174-1" draft="provisional">ÐфрикаанÑ</language>
+ <language type="afa" references="RP4" draft="provisional">Ðфро-азійÑькі мови (інші)</language>
+ <language type="afh" references="RP4">Ðфрихілі</language>
+ <language type="ain" draft="provisional">ÐйнÑька</language>
+ <language type="ak" references="RP4" draft="provisional">Ðкан</language>
+ <language type="akk" references="RP4" draft="provisional">ÐккадÑька</language>
+ <language type="ale" references="RP4" draft="provisional">ÐлеутÑька</language>
+ <language type="alg" draft="provisional">ÐлгонкінÑькі мови</language>
+ <language type="alt" references="RP4" draft="provisional">ПівденноалтайÑька</language>
+ <language type="am">Ðмхарік</language>
+ <language type="am" references="RP4" alt="proposed-u174-1" draft="provisional">ÐмхарÑька</language>
+ <language type="an" draft="provisional">ÐрагонÑька</language>
+ <language type="ang" references="RP4" draft="provisional">ДавньоанглійÑька</language>
+ <language type="apa" references="RP4" draft="provisional">Ðпачі мови</language>
+ <language type="ar">ÐрабÑька</language>
+ <language type="arc" draft="provisional">ÐрамейÑька</language>
+ <language type="arn" draft="provisional">ÐрауканÑька</language>
+ <language type="arp" references="RP4" draft="provisional">Ðрапахо</language>
+ <language type="art" references="RP4" draft="provisional">Штучні мови (інші)</language>
+ <language type="arw" references="RP4" draft="provisional">ÐравакÑька</language>
+ <language type="as">ÐÑÑамÑька</language>
+ <language type="ast" draft="provisional">ÐÑтурÑька</language>
+ <language type="ath" references="RP4" draft="provisional">ÐтапаÑкÑькі мови (інші)</language>
+ <language type="aus" references="RP4" draft="provisional">ÐвÑтралійÑькі мови</language>
+ <language type="av" references="RP4" draft="provisional">ÐварÑька</language>
+ <language type="awa" references="RP4" draft="provisional">Ðвадхі</language>
+ <language type="ay">Ðймара</language>
+ <language type="az">ÐзербайджанÑька</language>
+ <language type="ba">БашкирÑька</language>
+ <language type="bad" references="RP4" draft="provisional">Банда</language>
+ <language type="bai" references="RP4" draft="provisional">Бамілеке мови</language>
+ <language type="bal" references="RP4" draft="provisional">Балучі</language>
+ <language type="ban" references="RP4" draft="provisional">БалійÑька</language>
+ <language type="bas" references="RP4" draft="provisional">БаÑа</language>
+ <language type="bat" references="RP4" draft="provisional">БалтійÑькі мови (інші)</language>
+ <language type="be">БілоруÑька</language>
+ <language type="bej" references="RP4" draft="provisional">Беджа</language>
+ <language type="bem" references="RP4" draft="provisional">Бемба</language>
+ <language type="ber" references="RP4" draft="provisional">БерберÑька</language>
+ <language type="bg">БолгарÑька</language>
+ <language type="bh">БіхарійÑька</language>
+ <language type="bh" references="RP4" alt="proposed-u174-1" draft="provisional">Біхарі</language>
+ <language type="bho" references="RP4" draft="provisional">Бходжпурі</language>
+ <language type="bi">БіÑламійÑька</language>
+ <language type="bi" references="RP4" alt="proposed-u174-1" draft="provisional">БіÑлама</language>
+ <language type="bik" references="RP4" draft="provisional">БікольÑька</language>
+ <language type="bin" references="RP4" draft="provisional">Біні</language>
+ <language type="bla" draft="provisional">СікÑіка</language>
+ <language type="bm" references="RP4" draft="provisional">Бамбара</language>
+ <language type="bn">БенгальÑька</language>
+ <language type="bnt" references="RP4" draft="provisional">Банту мови (інші)</language>
+ <language type="bo">ТибетÑька</language>
+ <language type="br">БретонÑька</language>
+ <language type="bra" references="RP4" draft="provisional">Брадж</language>
+ <language type="bs" references="RP4" draft="provisional">БоÑнійÑька</language>
+ <language type="btk" references="RP4" draft="provisional">Батак</language>
+ <language type="bua" references="RP4" draft="provisional">БурÑÑ‚Ñька</language>
+ <language type="bug" references="RP4" draft="provisional">БугійÑька</language>
+ <language type="byn" draft="provisional">Блін</language>
+ <language type="ca">КаталонÑька</language>
+ <language type="cad" references="RP4" draft="provisional">Каддо</language>
+ <language type="cai" references="RP4" draft="provisional">ЦентральноамериканÑьких індіанців мови (інші)</language>
+ <language type="car" references="RP4" draft="provisional">КарібÑька</language>
+ <language type="cau" references="RP4" draft="provisional">Іберокавказькі мови (інші)</language>
+ <language type="ce" references="RP4" draft="provisional">ЧеченÑька</language>
+ <language type="ceb" draft="provisional">СебуанÑька</language>
+ <language type="cel" references="RP4" draft="provisional">КельтÑькі мови (інші)</language>
+ <language type="ch" references="RP4" draft="provisional">Чаморро</language>
+ <language type="chb" references="RP4" draft="provisional">Чібча</language>
+ <language type="chg" references="RP4" draft="provisional">ЧагатайÑька</language>
+ <language type="chk" references="RP4" draft="provisional">ЧукÑька</language>
+ <language type="chm" references="RP4" draft="provisional">МарійÑька</language>
+ <language type="chn" references="RP4" draft="provisional">Чинук, жаргон</language>
+ <language type="cho" references="RP4" draft="provisional">Чокто</language>
+ <language type="chp" references="RP4" draft="provisional">Чіпев’Ñн</language>
+ <language type="chr" references="RP4" draft="provisional">Черокі</language>
+ <language type="chy" references="RP4" draft="provisional">Чейєнн</language>
+ <language type="cmc" references="RP4" draft="provisional">ХамітÑькі мови</language>
+ <language type="co">КорÑиканÑька</language>
+ <language type="cop" references="RP4" draft="provisional">КоптÑька</language>
+ <language type="cpe" references="RP4" draft="provisional">Ðнгло-креольÑькі та піджінізовані англійÑькі мови (інші)</language>
+ <language type="cpf" references="RP4" draft="provisional">Франко-креольÑькі та піджінізовані франкофонні мови (інші)</language>
+ <language type="cpp" references="RP4" draft="provisional">ПортугальÑько-креольÑькі та піджінізовані португальÑькі мови (інші)</language>
+ <language type="cr" references="RP4" draft="provisional">Крі</language>
+ <language type="crh" references="RP4" draft="provisional">КримÑькотатарÑька</language>
+ <language type="crp" references="RP4" draft="provisional">КреольÑькі та піджінізовані мови (інші)</language>
+ <language type="cs">ЧеÑька</language>
+ <language type="csb" references="RP4" draft="provisional">КашубÑька</language>
+ <language type="cu" references="RP4" draft="provisional">ЦерковноÑлов’ÑнÑька</language>
+ <language type="cus" references="RP4" draft="provisional">КушітÑькі мови (інші)</language>
+ <language type="cv" references="RP4" draft="provisional">ЧуваÑька</language>
+ <language type="cy">ВаллійÑька</language>
+ <language type="da">ДатÑька</language>
+ <language type="da" references="RP4" alt="proposed-u174-1" draft="provisional">ДанÑька</language>
+ <language type="dak" references="RP4" draft="provisional">Дакота</language>
+ <language type="dar" draft="provisional">ДаргінÑька</language>
+ <language type="day" references="RP4" draft="provisional">ДаÑк</language>
+ <language type="de">Ðімецька</language>
+ <language type="del" references="RP4" draft="provisional">ДелаварÑька</language>
+ <language type="den" references="RP4" draft="provisional">Слейв</language>
+ <language type="dgr" references="RP4" draft="provisional">ДогрибÑька</language>
+ <language type="din" references="RP4" draft="provisional">Дінка</language>
+ <language type="doi" references="RP4" draft="provisional">Догрі</language>
+ <language type="dra" references="RP4" draft="provisional">ДравідійÑькі мови (інші)</language>
+ <language type="dsb" draft="provisional">Ðижньолужицька</language>
+ <language type="dua" references="RP4" draft="provisional">Дуала</language>
+ <language type="dum" references="RP4" draft="provisional">СередньонідерландÑька</language>
+ <language type="dv" references="RP4" draft="provisional">Дівехі</language>
+ <language type="dyu" references="RP4" draft="provisional">Діула</language>
+ <language type="dz">Дзонг-ке</language>
+ <language type="dz" references="RP4" alt="proposed-u174-1" draft="provisional">Дзонгха</language>
+ <language type="ee" references="RP4" draft="provisional">Еве</language>
+ <language type="efi" references="RP4" draft="provisional">Ефік</language>
+ <language type="egy" draft="provisional">ДавньоєгипетÑька</language>
+ <language type="eka" draft="provisional">Екаджук</language>
+ <language type="el">Грецька</language>
+ <language type="elx" references="RP4" draft="provisional">ЕламÑька</language>
+ <language type="en">ÐнглійÑька</language>
+ <language type="enm" references="RP4" draft="provisional">СередньоанглійÑька</language>
+ <language type="eo">ЕÑперанто</language>
+ <language type="es">ІÑпанÑька</language>
+ <language type="et">ЕÑтонÑька</language>
+ <language type="eu">БаÑків</language>
+ <language type="ewo" references="RP4" draft="provisional">Евондо</language>
+ <language type="fa">ПерÑька</language>
+ <language type="fan" references="RP4" draft="provisional">Фанг</language>
+ <language type="fat" references="RP4" draft="provisional">Фанті</language>
+ <language type="ff" references="RP4" draft="provisional">Фула</language>
+ <language type="fi">ФінÑька</language>
+ <language type="fil" draft="provisional">ФіліппінÑька</language>
+ <language type="fiu" references="RP4" draft="provisional">Фінно-угорÑькі мови (інші)</language>
+ <language type="fj">Фіджі</language>
+ <language type="fo">ФарерÑька</language>
+ <language type="fon" references="RP4" draft="provisional">Фон</language>
+ <language type="fr">Французька</language>
+ <language type="frm" references="RP4" draft="provisional">Середньофранцузька</language>
+ <language type="fro" references="RP4" draft="provisional">Давньофранцузька</language>
+ <language type="fur" references="RP4" draft="provisional">ФріульÑька</language>
+ <language type="fy">Фризька</language>
+ <language type="ga">ІрландÑька</language>
+ <language type="gaa" references="RP4" draft="provisional">Га</language>
+ <language type="gay" references="RP4" draft="provisional">Гайо</language>
+ <language type="gba" references="RP4" draft="provisional">ГбайÑ</language>
+ <language type="gd">ГаельÑька</language>
+ <language type="gem" references="RP4" draft="provisional">ГерманÑькі мови (інші)</language>
+ <language type="gez" references="RP4" draft="provisional">Гєез</language>
+ <language type="gil" references="RP4" draft="provisional">ГільбертÑька</language>
+ <language type="gl">ГаліÑійÑька</language>
+ <language type="gmh" references="RP4" draft="provisional">Середньоверхньонімецька</language>
+ <language type="gn">Гуарані</language>
+ <language type="goh" references="RP4" draft="provisional">Давньоверхньонімецька</language>
+ <language type="gon" references="RP4" draft="provisional">Гонді</language>
+ <language type="gor" references="RP4" draft="provisional">Горонтало</language>
+ <language type="got" references="RP4" draft="provisional">ГотÑька</language>
+ <language type="grb" references="RP4" draft="provisional">Гребо</language>
+ <language type="grc" references="RP4" draft="provisional">Давньогрецька</language>
+ <language type="gu">ГуÑраті</language>
+ <language type="gu" references="RP4" alt="proposed-u174-1" draft="provisional">Гуджараті</language>
+ <language type="gv" references="RP4" draft="provisional">МенкÑька</language>
+ <language type="gwi" references="RP4" draft="provisional">Кучін</language>
+ <language type="ha">ХауÑа</language>
+ <language type="hai" references="RP4" draft="provisional">Хайда</language>
+ <language type="haw" references="RP4" draft="provisional">ГавайÑька</language>
+ <language type="he">Іврит</language>
+ <language type="hi">Гінді</language>
+ <language type="hil" references="RP4" draft="provisional">Хілігайнон</language>
+ <language type="him" references="RP4" draft="provisional">Хімачалі</language>
+ <language type="hit" references="RP4" draft="provisional">Хітіті</language>
+ <language type="hmn" references="RP4" draft="provisional">Хмонг</language>
+ <language type="ho" references="RP4" draft="provisional">Хірі-моту</language>
+ <language type="hr">ХорватÑька</language>
+ <language type="hsb" draft="provisional">Верхньолужицька</language>
+ <language type="ht" draft="provisional">ГаїтÑнÑька</language>
+ <language type="hu">УгорÑька</language>
+ <language type="hup" references="RP4" draft="provisional">Хупа</language>
+ <language type="hy">ВірменÑька</language>
+ <language type="hz" references="RP4" draft="provisional">Гереро</language>
+ <language type="ia">Інтерлінгва</language>
+ <language type="iba" references="RP4" draft="provisional">ІбанÑька</language>
+ <language type="id">ІндонезійÑька</language>
+ <language type="ie">Інтерлінгве</language>
+ <language type="ig" references="RP4" draft="provisional">Ігбо</language>
+ <language type="ii" references="RP4" draft="provisional">Сичуань</language>
+ <language type="ijo" references="RP4" draft="provisional">Іджо</language>
+ <language type="ik">Інупіак</language>
+ <language type="ik" references="RP4" alt="proposed-u174-1" draft="provisional">Інуп’Ñк</language>
+ <language type="ilo" references="RP4" draft="provisional">ІлоканÑька</language>
+ <language type="inc" references="RP4" draft="provisional">ІндійÑькі мови (інші)</language>
+ <language type="ine" references="RP4" draft="provisional">ІндоєвропейÑькі мови (інші)</language>
+ <language type="inh" draft="provisional">ІнгуÑька</language>
+ <language type="io" draft="provisional">Ідо</language>
+ <language type="ira" draft="provisional">ІранÑька</language>
+ <language type="iro" references="RP4" draft="provisional">Ірокезькі мови (інші)</language>
+ <language type="is">ІÑландÑька</language>
+ <language type="it">ІталійÑька</language>
+ <language type="iu" references="RP4" draft="provisional">Інуктітут</language>
+ <language type="ja">ЯпонÑька</language>
+ <language type="jbo" draft="provisional">Ложбан</language>
+ <language type="jpr" references="RP4" draft="provisional">Іудео-перÑька</language>
+ <language type="jrb" references="RP4" draft="provisional">Іудео-арабÑька</language>
+ <language type="jv">ЯванÑька</language>
+ <language type="ka">ГрузинÑька</language>
+ <language type="kaa" references="RP4" draft="provisional">Каракалпацька</language>
+ <language type="kab" references="RP4" draft="provisional">КабильÑька</language>
+ <language type="kac" references="RP4" draft="provisional">Качін</language>
+ <language type="kam" references="RP4" draft="provisional">Камба</language>
+ <language type="kar" references="RP4" draft="provisional">КаренÑька</language>
+ <language type="kaw" references="RP4" draft="provisional">Каві</language>
+ <language type="kbd" draft="provisional">КабардинÑька</language>
+ <language type="kg" references="RP4" draft="provisional">Конґолезька</language>
+ <language type="kha" references="RP4" draft="provisional">КхаÑÑ–</language>
+ <language type="khi" references="RP4" draft="provisional">КойÑанÑькі мови (інші)</language>
+ <language type="kho" references="RP4" draft="provisional">ХотаноÑакÑька</language>
+ <language type="ki" references="RP4" draft="provisional">Кікуйю</language>
+ <language type="kj" references="RP4" draft="provisional">Кунама</language>
+ <language type="kk">КазахÑька</language>
+ <language type="kl">КалаалліÑут</language>
+ <language type="km">КхмерÑька</language>
+ <language type="kmb" references="RP4" draft="provisional">Кімбунду</language>
+ <language type="kn">Каннада</language>
+ <language type="kn" references="RP4" alt="proposed-u174-1" draft="provisional">Каннада</language>
+ <language type="ko">КорейÑька</language>
+ <language type="kok" references="RP4" draft="provisional">Конкані</language>
+ <language type="kos" references="RP4" draft="provisional">КоÑрае</language>
+ <language type="kpe" references="RP4" draft="provisional">Кпеллє</language>
+ <language type="kr" references="RP4" draft="provisional">Канурі</language>
+ <language type="krc" draft="provisional">Карачаєво-балкарÑька</language>
+ <language type="kro" references="RP4" draft="provisional">Кру</language>
+ <language type="kru" references="RP4" draft="provisional">Курукх</language>
+ <language type="ks">КашмірÑька</language>
+ <language type="ku">КурдÑька</language>
+ <language type="kum" draft="provisional">Кумицька</language>
+ <language type="kut" references="RP4" draft="provisional">Кутенаї</language>
+ <language type="kv" references="RP4" draft="provisional">Комі</language>
+ <language type="kw" references="RP4" draft="provisional">КорнійÑька</language>
+ <language type="ky">Киргизька</language>
+ <language type="la">ЛатинÑька</language>
+ <language type="lad" references="RP4" draft="provisional">Ладіно</language>
+ <language type="lah" references="RP4" draft="provisional">Лахнда</language>
+ <language type="lam" references="RP4" draft="provisional">Ламба</language>
+ <language type="lb" draft="provisional">ЛюкÑембурґÑька</language>
+ <language type="lez" references="RP4" draft="provisional">ЛезгінÑька</language>
+ <language type="lg" references="RP4" draft="provisional">Ганда</language>
+ <language type="li" draft="provisional">ЛімбургійÑька</language>
+ <language type="ln">Лінгала</language>
+ <language type="lo">ЛаоÑька</language>
+ <language type="lol" references="RP4" draft="provisional">Монго</language>
+ <language type="loz" references="RP4" draft="provisional">Лозі</language>
+ <language type="lt">ЛитовÑька</language>
+ <language type="lu" references="RP4" draft="provisional">Луба-катанга</language>
+ <language type="lua" references="RP4" draft="provisional">Луба-лулуа</language>
+ <language type="lui" references="RP4" draft="provisional">ЛуїÑеньо</language>
+ <language type="lun" references="RP4" draft="provisional">Лунда</language>
+ <language type="luo" references="RP4" draft="provisional">Луо</language>
+ <language type="lus" references="RP4" draft="provisional">Лушей</language>
+ <language type="lv">ЛатвійÑька</language>
+ <language type="lv" references="RP4" alt="proposed-u174-1" draft="provisional">ЛатиÑька</language>
+ <language type="mad" references="RP4" draft="provisional">МадурÑька</language>
+ <language type="mag" references="RP4" draft="provisional">Магадхі</language>
+ <language type="mai" references="RP4" draft="provisional">Майтхілі</language>
+ <language type="mak" references="RP4" draft="provisional">МакаÑарÑька</language>
+ <language type="man" references="RP4" draft="provisional">Мандінго</language>
+ <language type="map" references="RP4" draft="provisional">ÐвÑтронезійÑькі мови (інші)</language>
+ <language type="mas" references="RP4" draft="provisional">МаÑаї</language>
+ <language type="mdf" draft="provisional">Мокша</language>
+ <language type="mdr" references="RP4" draft="provisional">МандарÑька</language>
+ <language type="men" references="RP4" draft="provisional">Менде</language>
+ <language type="mg">МалагаÑійÑька</language>
+ <language type="mga" references="RP4" draft="provisional">СередньоірландÑька</language>
+ <language type="mh" draft="provisional">МаршалльÑька</language>
+ <language type="mi">Маорі</language>
+ <language type="mic" references="RP4" draft="provisional">Мікмак</language>
+ <language type="min" references="RP4" draft="provisional">Мінангкабау</language>
+ <language type="mis" draft="provisional">Інші мови</language>
+ <language type="mk">МакедонÑька</language>
+ <language type="mkh" references="RP4" draft="provisional">Мон-кхмерÑькі мови (інші)</language>
+ <language type="ml">МалайÑлам</language>
+ <language type="mn">МонгольÑька</language>
+ <language type="mnc" draft="provisional">МанчжурÑька</language>
+ <language type="mni" references="RP4" draft="provisional">Маніпурі</language>
+ <language type="mno" references="RP4" draft="provisional">Манобо мови</language>
+ <language type="mo">МолдавÑька</language>
+ <language type="moh" references="RP4" draft="provisional">Магавк</language>
+ <language type="mos" draft="provisional">МоÑÑÑ–</language>
+ <language type="mr">Маратхі</language>
+ <language type="ms">МалайÑька</language>
+ <language type="mt">МальтійÑька</language>
+ <language type="mul" draft="provisional">Декілька мов</language>
+ <language type="mun" references="RP4" draft="provisional">Мунда мови (інші)</language>
+ <language type="mus" references="RP4" draft="provisional">Крік</language>
+ <language type="mwl" draft="provisional">МірандÑька</language>
+ <language type="mwr" references="RP4" draft="provisional">Марварі</language>
+ <language type="my">БірманÑька</language>
+ <language type="myn" references="RP4" draft="provisional">ÐœÐ°Ð¹Ñ Ð¼Ð¾Ð²Ð¸</language>
+ <language type="myv" draft="provisional">ЕрзÑ</language>
+ <language type="na">Ðауру</language>
+ <language type="nah" references="RP4" draft="provisional">Ðахуатль</language>
+ <language type="nai" references="RP4" draft="provisional">ПівнічноамериканÑьких індіанців мови (інші)</language>
+ <language type="nap" references="RP4" draft="provisional">ÐеаполітанÑька</language>
+ <language type="nb" references="RP4" draft="provisional">Ðорвезька букмол</language>
+ <language type="nd" references="RP4" draft="provisional">Ðдебелє, північна</language>
+ <language type="nds" references="RP4" draft="provisional">Ðижньонімецька</language>
+ <language type="ne">ÐепальÑька</language>
+ <language type="new" references="RP4" draft="provisional">Ðеварі</language>
+ <language type="ng" references="RP4" draft="provisional">Ðдонга</language>
+ <language type="nia" references="RP4" draft="provisional">ÐіаÑька</language>
+ <language type="nic" references="RP4" draft="provisional">Ðіґеро-кордофанÑькі мови (інші)</language>
+ <language type="niu" references="RP4" draft="provisional">Ðіуе</language>
+ <language type="nl">ГолландÑька</language>
+ <language type="nn" references="RP4" draft="provisional">Ðорвезька нюнорÑьк</language>
+ <language type="no">Ðорвезька</language>
+ <language type="nog" references="RP4" draft="provisional">ÐогайÑька</language>
+ <language type="non" references="RP4" draft="provisional">Давньонорвезька</language>
+ <language type="nr" references="RP4" draft="provisional">Ðдебелє, південна</language>
+ <language type="nso" references="RP4" draft="provisional">Сото, північна</language>
+ <language type="nub" draft="provisional">ÐубійÑькі мови</language>
+ <language type="nv" references="RP4" draft="provisional">Ðавахо</language>
+ <language type="nwc" draft="provisional">ÐеварÑька клаÑична</language>
+ <language type="ny" references="RP4" draft="provisional">ÐÑŒÑнджа</language>
+ <language type="nym" references="RP4" draft="provisional">ÐÑŒÑмвезі</language>
+ <language type="nyn" draft="provisional">ÐÑŒÑнколе</language>
+ <language type="nyo" references="RP4" draft="provisional">Ðьоро</language>
+ <language type="nzi" references="RP4" draft="provisional">Ðзіма</language>
+ <language type="oc">Окитан</language>
+ <language type="oc" references="RP4" alt="proposed-u174-1" draft="provisional">ОкÑитанÑька</language>
+ <language type="oj" references="RP4" draft="provisional">Оджібва</language>
+ <language type="om">Оромо</language>
+ <language type="or">ОріÑ</language>
+ <language type="os" references="RP4" draft="provisional">ОÑетинÑька</language>
+ <language type="osa" draft="provisional">ОÑейдж</language>
+ <language type="ota" draft="provisional">ОÑманÑька</language>
+ <language type="oto" references="RP4" draft="provisional">Отомі мови</language>
+ <language type="pa">Панджабі</language>
+ <language type="paa" references="RP4" draft="provisional">ПапуаÑькі мови (інші)</language>
+ <language type="pag" references="RP4" draft="provisional">ПангаÑінанÑька</language>
+ <language type="pal" references="RP4" draft="provisional">Пехлеві</language>
+ <language type="pam" references="RP4" draft="provisional">Пампанга</language>
+ <language type="pap" references="RP4" draft="provisional">Пап’Ñменто</language>
+ <language type="pau" references="RP4" draft="provisional">ПалауанÑька</language>
+ <language type="peo" references="RP4" draft="provisional">ДавньоперÑька</language>
+ <language type="phi" references="RP4" draft="provisional">ФіліппінÑькі мови (інші)</language>
+ <language type="phn" references="RP4" draft="provisional">ФінікійÑько-пунічна</language>
+ <language type="pi" references="RP4" draft="provisional">Палі</language>
+ <language type="pl">ПольÑька</language>
+ <language type="pon" references="RP4" draft="provisional">Понапе</language>
+ <language type="pra" references="RP4" draft="provisional">Пракріті мови</language>
+ <language type="pro" draft="provisional">ДавньопрованÑальÑька</language>
+ <language type="ps">Пашто</language>
+ <language type="ps" references="RP4" alt="proposed-u174-1" draft="provisional">Пушту</language>
+ <language type="pt">ПортугальÑька</language>
+ <language type="pt" references="RP4" alt="proposed-u174-1" draft="provisional">ПортуґальÑька</language>
+ <language type="qu">Кечуа</language>
+ <language type="raj" draft="provisional">РаджаÑтхані</language>
+ <language type="rap" references="RP4" draft="provisional">Рапануї</language>
+ <language type="rar" references="RP4" draft="provisional">Раротонга</language>
+ <language type="rm">РетророманÑькі діалекти</language>
+ <language type="rm" alt="proposed-u174-1" draft="provisional">РетороманÑька</language>
+ <language type="rn">КірундійÑька</language>
+ <language type="rn" references="RP4" alt="proposed-u174-1" draft="provisional">Рунді</language>
+ <language type="ro">РумунÑька</language>
+ <language type="roa" references="RP4" draft="provisional">РоманÑькі мови (інші)</language>
+ <language type="rom" references="RP4" draft="provisional">ЦиганÑька</language>
+ <language type="root" draft="provisional">Корінь</language>
+ <language type="ru">РоÑійÑька</language>
+ <language type="rup" references="RP4" draft="provisional">ÐрумунÑька</language>
+ <language type="rw">Кінаруанда</language>
+ <language type="rw" references="RP4" alt="proposed-u174-1" draft="provisional">КіньÑруанда</language>
+ <language type="sa">СанÑкрит</language>
+ <language type="sad" references="RP4" draft="provisional">Сандаве</language>
+ <language type="sah" references="RP4" draft="provisional">ЯкутÑька</language>
+ <language type="sai" references="RP4" draft="provisional">ПівденноамериканÑьких індіанців мови (інші)</language>
+ <language type="sal" references="RP4" draft="provisional">СалішÑькі мови</language>
+ <language type="sam" references="RP4" draft="provisional">СамаритÑнÑька арамейÑька</language>
+ <language type="sas" references="RP4" draft="provisional">СаÑакÑька</language>
+ <language type="sat" references="RP4" draft="provisional">СантальÑька</language>
+ <language type="sc" draft="provisional">СардинÑька</language>
+ <language type="scn" references="RP4" draft="provisional">СицилійÑька</language>
+ <language type="sco" references="RP4" draft="provisional">ШотландÑька</language>
+ <language type="sd">Сіндтхі</language>
+ <language type="sd" references="RP4" alt="proposed-u174-1" draft="provisional">Сіндхі</language>
+ <language type="se" references="RP4" draft="provisional">СаамÑька, північна</language>
+ <language type="sel" references="RP4" draft="provisional">СелькупÑька</language>
+ <language type="sem" references="RP4" draft="provisional">СемітÑькі мови (інші)</language>
+ <language type="sg">Сангро</language>
+ <language type="sg" references="RP4" alt="proposed-u174-1" draft="provisional">Санго</language>
+ <language type="sga" references="RP4" draft="provisional">ДавньоірландÑька</language>
+ <language type="sgn" references="RP4" draft="provisional">Знакові мови</language>
+ <language type="sh">СербÑько-хорватÑька</language>
+ <language type="shn" references="RP4" draft="provisional">ШанÑька</language>
+ <language type="si">СингальÑька</language>
+ <language type="sid" references="RP4" draft="provisional">Сідамо</language>
+ <language type="sio" references="RP4" draft="provisional">Сіу мови (інші)</language>
+ <language type="sit" references="RP4" draft="provisional">КитайÑько-тибетÑькі мови (інші)</language>
+ <language type="sk">Словацька</language>
+ <language type="sl">СловенÑька</language>
+ <language type="sla" references="RP4" draft="provisional">Слов’ÑнÑькі мови (інші)</language>
+ <language type="sm">СамоанÑька</language>
+ <language type="sma" draft="provisional">СаамÑька, південна</language>
+ <language type="smi" references="RP4" draft="provisional">СаамÑькі мови (інші)</language>
+ <language type="smj" draft="provisional">СаамÑька луле</language>
+ <language type="smn" draft="provisional">СаамÑька інарі</language>
+ <language type="sms" draft="provisional">СаамÑька Ñкольт</language>
+ <language type="sn">Шона</language>
+ <language type="sn" references="RP4" alt="proposed-u174-1" draft="provisional">Шона</language>
+ <language type="snk" references="RP4" draft="provisional">Сонінке</language>
+ <language type="so">Сомалі</language>
+ <language type="sog" references="RP4" draft="provisional">СогдійÑька</language>
+ <language type="son" references="RP4" draft="provisional">Сонгай</language>
+ <language type="sq">ÐлбанÑька</language>
+ <language type="sr">СербÑька</language>
+ <language type="srn" draft="provisional">СуринамÑька</language>
+ <language type="srr" references="RP4" draft="provisional">Серер</language>
+ <language type="ss">СіÑваті</language>
+ <language type="ss" references="RP4" alt="proposed-u174-1" draft="provisional">Свазі</language>
+ <language type="ssa" references="RP4" draft="provisional">Ðіло-ÑахарÑькі мови (інші)</language>
+ <language type="st">Сото, південний діалект</language>
+ <language type="st" references="RP4" alt="proposed-u174-1" draft="provisional">Сото, південна</language>
+ <language type="su">СуданÑька</language>
+ <language type="su" references="RP4" alt="proposed-u174-1" draft="provisional">СунданÑька</language>
+ <language type="suk" draft="provisional">Сукума</language>
+ <language type="sus" references="RP4" draft="provisional">СуÑу</language>
+ <language type="sux" references="RP4" draft="provisional">ШумерÑька</language>
+ <language type="sv">ШведÑька</language>
+ <language type="sw">Суахілі</language>
+ <language type="syr" references="RP4" draft="provisional">ДавньоÑирійÑька</language>
+ <language type="ta">ТамільÑька</language>
+ <language type="tai" references="RP4" draft="provisional">ТайÑькі мови (інші)</language>
+ <language type="te">Телугу</language>
+ <language type="tem" references="RP4" draft="provisional">Темне</language>
+ <language type="ter" references="RP4" draft="provisional">Терено</language>
+ <language type="tet" references="RP4" draft="provisional">Тетум</language>
+ <language type="tg">Таджицька</language>
+ <language type="th">ТайÑька</language>
+ <language type="ti">Тигріні</language>
+ <language type="ti" references="RP4" alt="proposed-u174-1" draft="provisional">ТигріньÑ</language>
+ <language type="tig" references="RP4" draft="provisional">Тигре</language>
+ <language type="tiv" references="RP4" draft="provisional">Тів</language>
+ <language type="tk">ТуркменÑька</language>
+ <language type="tkl" references="RP4" draft="provisional">Токелау</language>
+ <language type="tl">ТагальÑька</language>
+ <language type="tlh" draft="provisional">Клінгон</language>
+ <language type="tli" references="RP4" draft="provisional">Тлінгіт</language>
+ <language type="tmh" references="RP4" draft="provisional">Тамашек</language>
+ <language type="tn">СетÑванÑька</language>
+ <language type="tn" references="RP4" alt="proposed-u174-1" draft="provisional">ТÑвана</language>
+ <language type="to">Тонга (оÑтрови Тонга)</language>
+ <language type="to" references="RP4" alt="proposed-u174-1" draft="provisional">Тонґа (мова мешканців оÑтровів Тонга)</language>
+ <language type="tog" references="RP4" draft="provisional">Тонґа (ÐÑŒÑÑа)</language>
+ <language type="tpi" references="RP4" draft="provisional">Ток-піÑін</language>
+ <language type="tr">Турецька</language>
+ <language type="ts">ТÑонго</language>
+ <language type="ts" references="RP4" alt="proposed-u174-1" draft="provisional">ТÑонга</language>
+ <language type="tsi" draft="provisional">Цимшиан</language>
+ <language type="tt">ТатарÑька</language>
+ <language type="tum" draft="provisional">Тумбука</language>
+ <language type="tup" draft="provisional">Тупі</language>
+ <language type="tut" references="RP4" draft="provisional">ÐлтайÑькі мови (інші)</language>
+ <language type="tvl" references="RP4" draft="provisional">Тувалу</language>
+ <language type="tw">Тві</language>
+ <language type="ty" references="RP4" draft="provisional">ТаїтÑнÑька</language>
+ <language type="tyv" references="RP4" draft="provisional">ТувинÑька</language>
+ <language type="udm" draft="provisional">УдмуртÑька</language>
+ <language type="ug">УйгурÑька</language>
+ <language type="uga" references="RP4" draft="provisional">УгаритÑька</language>
+ <language type="uk">УкраїнÑька</language>
+ <language type="umb" references="RP4" draft="provisional">Умбунду</language>
+ <language type="und" references="RP4" draft="provisional">Ðевизначена</language>
+ <language type="ur">Урду</language>
+ <language type="uz">Узбецька</language>
+ <language type="vai" references="RP4" draft="provisional">Ваї</language>
+ <language type="ve" references="RP4" draft="provisional">Венда</language>
+ <language type="vi">ВʼєтнамÑька</language>
+ <language type="vo">Волапак</language>
+ <language type="vo" references="RP4" alt="proposed-u174-1" draft="provisional">Волап’юк</language>
+ <language type="vot" references="RP4" draft="provisional">ВодÑька</language>
+ <language type="wa" draft="provisional">ВаллонÑька</language>
+ <language type="wak" references="RP4" draft="provisional">ВакашÑькі мови</language>
+ <language type="wal" references="RP4" draft="provisional">Валамо</language>
+ <language type="war" references="RP4" draft="provisional">Варай</language>
+ <language type="was" references="RP4" draft="provisional">Вашо</language>
+ <language type="wen" references="RP4" draft="provisional">Лужицькі мови</language>
+ <language type="wo">Волоф</language>
+ <language type="xal" draft="provisional">Калмицька</language>
+ <language type="xh">КхоÑа</language>
+ <language type="yao" references="RP4" draft="provisional">Яо</language>
+ <language type="yap" references="RP4" draft="provisional">Яп</language>
+ <language type="yi">Ідиш</language>
+ <language type="yo">Йоруба</language>
+ <language type="ypk" references="RP4" draft="provisional">Юпік мови</language>
+ <language type="za">Зуанг</language>
+ <language type="za" references="RP4" alt="proposed-u174-1" draft="provisional">Чжуан</language>
+ <language type="zap" references="RP4" draft="provisional">СапотекÑька</language>
+ <language type="zen" references="RP4" draft="provisional">Зенага</language>
+ <language type="zh">КитайÑька</language>
+ <language type="znd" references="RP4" draft="provisional">Занде</language>
+ <language type="zu">ЗулуÑька</language>
+ <language type="zun" references="RP4" draft="provisional">Зуньї</language>
+ </languages>
+ <scripts>
+ <script type="Arab">ÐрабÑький</script>
+ <script type="Armn">ВірменÑький</script>
+ <script type="Bali" draft="provisional">БалійÑький</script>
+ <script type="Batk" draft="provisional">Батак</script>
+ <script type="Beng">БенгальÑький</script>
+ <script type="Blis" draft="provisional">Символи БліÑÑа</script>
+ <script type="Bopo">Бопомофо</script>
+ <script type="Brah" draft="provisional">Брахмі</script>
+ <script type="Brai">БрайлÑ</script>
+ <script type="Brai" alt="proposed-u174-1" draft="provisional">Шрифт БрайлÑ</script>
+ <script type="Bugi" draft="provisional">БуґійÑький</script>
+ <script type="Buhd">Бухід</script>
+ <script type="Cans">Уніфіковані Ñимволи канадÑьких туземців</script>
+ <script type="Cans" alt="proposed-u174-1" draft="provisional">Уніфіковані Ñимволи канадÑьких тубільців</script>
+ <script type="Cham" draft="provisional">ХамітÑький</script>
+ <script type="Cher">Черокі</script>
+ <script type="Cirt" draft="provisional">Кирт</script>
+ <script type="Copt">КоптÑький</script>
+ <script type="Cprt">КіпрÑький</script>
+ <script type="Cyrl">Кириличний</script>
+ <script type="Cyrs" draft="provisional">СтароÑлов'ÑнÑький</script>
+ <script type="Deva">Деванагарі</script>
+ <script type="Dsrt">Дезерет</script>
+ <script type="Egyd" draft="provisional">ЄгипетÑький демотичний</script>
+ <script type="Egyh" draft="provisional">ЄгипетÑький ієратичний</script>
+ <script type="Egyp" draft="provisional">ЄгипетÑький ієрогліфічний</script>
+ <script type="Ethi">ЕфіопÑький</script>
+ <script type="Geok" draft="provisional">КхутÑурі (ÐÑомтаврулі та ÐуÑкхурі)</script>
+ <script type="Geor">ГрузинÑький</script>
+ <script type="Glag" draft="provisional">Глаголичний</script>
+ <script type="Goth">ГотÑький</script>
+ <script type="Goth" references="RP4" alt="proposed-u174-1" draft="provisional">Готичний</script>
+ <script type="Grek">Грецький</script>
+ <script type="Gujr">ГуÑраті</script>
+ <script type="Gujr" references="RP4" alt="proposed-u174-1" draft="provisional">Гуджараті</script>
+ <script type="Guru">Гурмукхі</script>
+ <script type="Guru" references="RP4" alt="proposed-u174-1" draft="provisional">Гурмухі</script>
+ <script type="Hang">Хангул</script>
+ <script type="Hani" draft="provisional">КитайÑький</script>
+ <script type="Hano">Хануну</script>
+ <script type="Hans" draft="provisional">КитайÑький Ñпрощений</script>
+ <script type="Hant" draft="provisional">КитайÑький традиційний</script>
+ <script type="Hebr">ЄврейÑький</script>
+ <script type="Hebr" references="RP4" alt="proposed-u174-1" draft="provisional">Іврит</script>
+ <script type="Hira">Хірагана</script>
+ <script type="Hmng" draft="provisional">Пахау хмонг</script>
+ <script type="Hrkt" draft="provisional">Катакана чи хірагана</script>
+ <script type="Hung" draft="provisional">ДавньоугорÑький</script>
+ <script type="Inds" draft="provisional">ХарапÑький</script>
+ <script type="Ital">ДавньоіталійÑький</script>
+ <script type="Java" draft="provisional">ЯванÑький</script>
+ <script type="Kali" draft="provisional">ÐšÐ°Ñ Ð›Ñ–</script>
+ <script type="Kana">Катакана</script>
+ <script type="Khar" draft="provisional">Кхароштхі</script>
+ <script type="Khmr">КхмерÑький</script>
+ <script type="Knda">Каннада</script>
+ <script type="Laoo">ЛаоÑький</script>
+ <script type="Latf" draft="provisional">ЛатинÑький (фрактурний)</script>
+ <script type="Latg" draft="provisional">ЛатинÑький (гельÑький)</script>
+ <script type="Latn">ЛатинÑький</script>
+ <script type="Lepc" draft="provisional">Лепча (ронг)</script>
+ <script type="Limb">Limbu</script>
+ <script type="Limb" alt="proposed-u174-1" draft="provisional">Лімбу</script>
+ <script type="Lina" draft="provisional">Лінійний Ð</script>
+ <script type="Linb">Лінійний В</script>
+ <script type="Mand" draft="provisional">МандейÑький</script>
+ <script type="Maya" draft="provisional">ÐœÐ°Ð¹Ñ Ñ–Ñ”Ñ€Ð¾Ð³Ð»Ñ–Ñ„Ñ–Ñ‡Ð½Ð¸Ð¹</script>
+ <script type="Mero" draft="provisional">МероїтÑький</script>
+ <script type="Mlym">МалайÑлам</script>
+ <script type="Mong">МонгольÑький</script>
+ <script type="Mymr">МʼÑнмар</script>
+ <script type="Nkoo" draft="provisional">Манде</script>
+ <script type="Ogam">ДавньоірландÑький</script>
+ <script type="Ogam" alt="proposed-u174-1" draft="provisional">Огамічний</script>
+ <script type="Orkh" draft="provisional">ОрхонÑький</script>
+ <script type="Orya">ОріÑ</script>
+ <script type="Osma">ОÑманÑький</script>
+ <script type="Perm" draft="provisional">ДавньопермÑький</script>
+ <script type="Phag" draft="provisional">ПхагÑ-па (баÑыпа)</script>
+ <script type="Phnx" draft="provisional">ФінікійÑький</script>
+ <script type="Plrd" draft="provisional">ПиÑемніÑÑ‚ÑŒ Полларда</script>
+ <script type="Qaai">УÑпадкований</script>
+ <script type="Roro" draft="provisional">Ронго-ронго</script>
+ <script type="Runr">Руни</script>
+ <script type="Runr" alt="proposed-u174-1" draft="provisional">Рунічний</script>
+ <script type="Sara" draft="provisional">Сараті</script>
+ <script type="Shaw">Шоу</script>
+ <script type="Sinh">СингальÑький</script>
+ <script type="Sylo" draft="provisional">Сілоті нагрі</script>
+ <script type="Syrc">СирійÑький</script>
+ <script type="Syrc" alt="proposed-u174-1" draft="provisional">ДавньоÑирійÑький</script>
+ <script type="Syre" draft="provisional">ДавньоÑирійÑький еÑтрангело</script>
+ <script type="Syrj" draft="provisional">ДавньоÑирійÑький західний</script>
+ <script type="Syrn" draft="provisional">ДавньоÑирійÑький Ñхідний</script>
+ <script type="Tagb">Тагбанва</script>
+ <script type="Tale">Тай-лі</script>
+ <script type="Talu" draft="provisional">ТайÑький луе</script>
+ <script type="Taml">ТамільÑький</script>
+ <script type="Telu">Телугу</script>
+ <script type="Teng" draft="provisional">Тенгвар</script>
+ <script type="Tfng" draft="provisional">Тифінаг</script>
+ <script type="Tglg">ТагальÑький</script>
+ <script type="Thaa">Таана</script>
+ <script type="Thai">ТайÑький</script>
+ <script type="Tibt">ТибетÑький</script>
+ <script type="Ugar" draft="provisional">УгаритÑький</script>
+ <script type="Vaii" draft="provisional">Ваї</script>
+ <script type="Visp" draft="provisional">Фонетична транÑÐºÑ€Ð¸Ð¿Ñ†Ñ–Ñ Ð‘ÐµÐ»Ð»Ð°</script>
+ <script type="Xpeo" draft="provisional">ДавньоперÑький</script>
+ <script type="Xsux" draft="provisional">Шумеро-аккадÑький клінопиÑ</script>
+ <script type="Yiii">Йї</script>
+ <script type="Yiii" alt="proposed-u174-1" draft="provisional">Лоло (І)</script>
+ <script type="Zxxx" draft="provisional">Код Ð´Ð»Ñ Ð±ÐµÐ·Ð¿Ð¸Ñемних мов</script>
+ <script type="Zyyy">Ðевизначений</script>
+ <script type="Zzzz" draft="provisional">Код Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ð´Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ пиÑьма</script>
+ </scripts>
+ <territories>
+ <territory type="001">Світ</territory>
+ <territory type="002">Ðфрика</territory>
+ <territory type="005">Південна Ðмерика</territory>
+ <territory type="009">ОкеаніÑ</territory>
+ <territory type="011">Західна Ðфрика</territory>
+ <territory type="013">Центральна Ðмерика</territory>
+ <territory type="014">Східна Ðфрика</territory>
+ <territory type="015">Північна Ðфрика</territory>
+ <territory type="017">Центральна Ðфрика</territory>
+ <territory type="018">Південна Ðфрика</territory>
+ <territory type="019">Ðмерики</territory>
+ <territory type="021">Північна Ðмерика</territory>
+ <territory type="029">Кариби</territory>
+ <territory type="029" alt="proposed-u174-1" draft="provisional">КарибÑький баÑейн</territory>
+ <territory type="030">Східна ÐзіÑ</territory>
+ <territory type="034" draft="provisional">Південна ÐзіÑ</territory>
+ <territory type="035">Південно-Східна ÐзіÑ</territory>
+ <territory type="039">Південна Європа</territory>
+ <territory type="053">ÐвÑÑ‚Ñ€Ð°Ð»Ñ–Ñ Ñ‚Ð° Ðова ЗеландіÑ</territory>
+ <territory type="054">МеланезіÑ</territory>
+ <territory type="061">ПолінезіÑ</territory>
+ <territory type="062">Південно-Центральна ÐзіÑ</territory>
+ <territory type="142">ÐзіÑ</territory>
+ <territory type="143" draft="provisional">Центральна ÐзіÑ</territory>
+ <territory type="145">Західна ÐзіÑ</territory>
+ <territory type="150">Європа</territory>
+ <territory type="151">Східна Європа</territory>
+ <territory type="154">Північна Європа</territory>
+ <territory type="155">Західна Європа</territory>
+ <territory type="172" draft="provisional">СпівдружніÑÑ‚ÑŒ Ðезалежних Держав</territory>
+ <territory type="419" draft="provisional">ЛатинÑька Ðмерика Ñ– КарибÑький баÑейн</territory>
+ <territory type="830" references="RP1" draft="provisional">ÐормандÑькі оÑтрови</territory>
+ <territory type="IM">ОÑтрів Мен</territory>
+ <territory type="AD">Ðндорра</territory>
+ <territory type="AE">Обʼєднані ÐрабÑькі Емірати</territory>
+ <territory type="AF">ÐфганіÑтан</territory>
+ <territory type="AG">Ðнтигуа Ñ– Барбуда</territory>
+ <territory type="AG" alt="proposed-u174-1" draft="provisional">Ðнтиґуа Ñ– Барбуда</territory>
+ <territory type="AI">ÐнгільÑ</territory>
+ <territory type="AI" alt="proposed-u174-1" draft="provisional">ÐнґільÑ</territory>
+ <territory type="AL">ÐлбаніÑ</territory>
+ <territory type="AM">ВірменіÑ</territory>
+ <territory type="AN">ÐідерландÑькі ÐнтільÑькі ОÑтрови</territory>
+ <territory type="AN" alt="proposed-u174-1" draft="provisional">ÐідерландÑькі ÐнтильÑькі ОÑтрови</territory>
+ <territory type="AO">Ðнгола</territory>
+ <territory type="AO" alt="proposed-u174-1" draft="provisional">Ðнґола</territory>
+ <territory type="AQ">Ðнтарктика</territory>
+ <territory type="AQ" alt="proposed-u174-1" draft="provisional">Ðнтарктида</territory>
+ <territory type="AR">Ðргентина</territory>
+ <territory type="AS">ÐмериканÑьке Самоа</territory>
+ <territory type="AT">ÐвÑтріÑ</territory>
+ <territory type="AU">ÐвÑтраліÑ</territory>
+ <territory type="AW">Ðруба</territory>
+ <territory type="AX">ÐландÑькі оÑтрови</territory>
+ <territory type="AZ">Ðзербайджан</territory>
+ <territory type="BA">БоÑÐ½Ñ–Ñ Ñ– Герцоговина</territory>
+ <territory type="BA" alt="proposed-u174-1" draft="provisional">БоÑÐ½Ñ–Ñ Ñ– Герцеговина</territory>
+ <territory type="BB">БарбадоÑ</territory>
+ <territory type="BD">Бангладеш</territory>
+ <territory type="BD" alt="proposed-u174-1" draft="provisional">Банґладеш</territory>
+ <territory type="BE">БельгіÑ</territory>
+ <territory type="BE" alt="proposed-u174-1" draft="provisional">БельґіÑ</territory>
+ <territory type="BF">Буркіна-ФаÑо</territory>
+ <territory type="BG">БолгаріÑ</territory>
+ <territory type="BH">Бахрейн</territory>
+ <territory type="BI">Бурунді</territory>
+ <territory type="BJ">Бенін</territory>
+ <territory type="BM">Бермуди</territory>
+ <territory type="BN">Бруней</territory>
+ <territory type="BN" alt="proposed-u174-1" draft="provisional">Бруней-ДаруÑÑалам</territory>
+ <territory type="BO">БолівіÑ</territory>
+ <territory type="BR">БразиліÑ</territory>
+ <territory type="BR" alt="proposed-u174-1" draft="provisional">БразіліÑ</territory>
+ <territory type="BS">Багами</territory>
+ <territory type="BT">Бутан</territory>
+ <territory type="BV">Буве, оÑтрів</territory>
+ <territory type="BV" alt="proposed-u174-1" draft="provisional">ОÑтрів Буве</territory>
+ <territory type="BW">БотÑвана</territory>
+ <territory type="BY">БілоруÑÑŒ</territory>
+ <territory type="BZ">Беліз</territory>
+ <territory type="CA">Канада</territory>
+ <territory type="CC">КокоÑові оÑтрови</territory>
+ <territory type="CC" alt="proposed-u174-1" draft="provisional">КокоÑові (Кілінґ) оÑтрови</territory>
+ <territory type="CD">Конго, Демократична РеÑпубліка</territory>
+ <territory type="CD" alt="proposed-u174-1" draft="provisional">Демократична РеÑпубліка Конґо</territory>
+ <territory type="CF">Центрально-ÐфриканÑька РеÑпубліка</territory>
+ <territory type="CF" alt="proposed-u174-1" draft="provisional">ЦентральноафриканÑька РеÑпубліка</territory>
+ <territory type="CG">Конго</territory>
+ <territory type="CG" alt="proposed-u174-1" draft="provisional">Конґо</territory>
+ <territory type="CH">ШвейцаріÑ</territory>
+ <territory type="CI">Кот-д’Івуар</territory>
+ <territory type="CK">ОÑтрови Кука</territory>
+ <territory type="CL">Чилі</territory>
+ <territory type="CL" alt="proposed-u174-1" draft="provisional">Чілі</territory>
+ <territory type="CM">Камерун</territory>
+ <territory type="CN">Китай</territory>
+ <territory type="CO">КолумбіÑ</territory>
+ <territory type="CR">КоÑта-Рика</territory>
+ <territory type="CS" draft="provisional">Ð¡ÐµÑ€Ð±Ñ–Ñ Ñ– ЧорногоріÑ</territory>
+ <territory type="CU">Куба</territory>
+ <territory type="CV">Кабо-Верде</territory>
+ <territory type="CX">ОÑтрів Різдва</territory>
+ <territory type="CY">Кіпр</territory>
+ <territory type="CZ">ЧеÑька реÑпубліка</territory>
+ <territory type="DE">Ðімеччина</territory>
+ <territory type="DJ">Джібуті</territory>
+ <territory type="DK">ДаніÑ</territory>
+ <territory type="DM">Домінік</territory>
+ <territory type="DM" alt="proposed-u174-1" draft="provisional">Домініка</territory>
+ <territory type="DO">ДомініканÑька РеÑпубліка</territory>
+ <territory type="DZ">Ðлжир</territory>
+ <territory type="EC">Еквадор</territory>
+ <territory type="EE">ЕÑтоніÑ</territory>
+ <territory type="EG">Єгипет</territory>
+ <territory type="EH">Західна Сахара</territory>
+ <territory type="ER">ЕритреÑ</territory>
+ <territory type="ER" alt="proposed-u174-1" draft="provisional">ЕрітреÑ</territory>
+ <territory type="ES">ІÑпаніÑ</territory>
+ <territory type="ET">ЕфіопіÑ</territory>
+ <territory type="FI">ФінлÑндіÑ</territory>
+ <territory type="FJ">Фіджі</territory>
+ <territory type="FK">ФолклендÑькі ОÑтрови (Мальвіни)</territory>
+ <territory type="FK" alt="proposed-u174-1" draft="provisional">ФолклендÑькі ОÑтрови (МальвінÑькі)</territory>
+ <territory type="FM">МікронезіÑ</territory>
+ <territory type="FM" alt="variant" draft="provisional">МікронезіÑ, Федеративні Штати</territory>
+ <territory type="FO">ФарерÑькі оÑтрови</territory>
+ <territory type="FR">ФранціÑ</territory>
+ <territory type="GA">Габон</territory>
+ <territory type="GA" alt="proposed-u174-1" draft="provisional">Òабон</territory>
+ <territory type="GB">ВеликобританіÑ</territory>
+ <territory type="GB" alt="proposed-u174-1" draft="provisional">Сполучене КоролівÑтво</territory>
+ <territory type="GD">Гренада</territory>
+ <territory type="GD" alt="proposed-u174-1" draft="provisional">Òренада</territory>
+ <territory type="GE">ГрузіÑ</territory>
+ <territory type="GF">Французька Гвіана</territory>
+ <territory type="GF" alt="proposed-u174-1" draft="provisional">Французька Òвіана</territory>
+ <territory type="GH">Гана</territory>
+ <territory type="GI">Гібралтар</territory>
+ <territory type="GI" alt="proposed-u174-1" draft="provisional">Òібралтар</territory>
+ <territory type="GL">ГренландіÑ</territory>
+ <territory type="GL" alt="proposed-u174-1" draft="provisional">ÒренландіÑ</territory>
+ <territory type="GM">ГамбіÑ</territory>
+ <territory type="GM" alt="proposed-u174-1" draft="provisional">ÒамбіÑ</territory>
+ <territory type="GN">ГвінеÑ</territory>
+ <territory type="GN" alt="proposed-u174-1" draft="provisional">ÒвінеÑ</territory>
+ <territory type="GP">Гваделупа</territory>
+ <territory type="GP" alt="proposed-u174-1" draft="provisional">Òваделупа</territory>
+ <territory type="GQ">Екваторіальна ГвінеÑ</territory>
+ <territory type="GQ" alt="proposed-u174-1" draft="provisional">Екваторіальна ÒвінеÑ</territory>
+ <territory type="GR">ГреціÑ</territory>
+ <territory type="GS">Південна Ð”Ð¶Ð¾Ñ€Ð´Ð¶Ñ–Ñ Ñ‚Ð° Південні Сандвічеві ОÑтрови</territory>
+ <territory type="GT">Гватемала</territory>
+ <territory type="GT" alt="proposed-u174-1" draft="provisional">Òватемала</territory>
+ <territory type="GU">Гуам</territory>
+ <territory type="GU" alt="proposed-u174-1" draft="provisional">Òуам</territory>
+ <territory type="GW">ГвінеÑ-БіÑÑау</territory>
+ <territory type="GW" alt="proposed-u174-1" draft="provisional">ÒвінеÑ-БіÑау</territory>
+ <territory type="GY">Гайана</territory>
+ <territory type="GY" alt="proposed-u174-1" draft="provisional">Òайана</territory>
+ <territory type="HK">Гонконг, С.Ð.Р. Китаю</territory>
+ <territory type="HK" alt="proposed-u174-1" draft="provisional">Гонконґ, О.Ð.Р. Китаю</territory>
+ <territory type="HM">ОÑтрови Херд Ñ– Мак-Дональд</territory>
+ <territory type="HM" alt="proposed-u174-1" draft="provisional">ОÑтрів Херд Ñ– оÑтрови Мак-Дональд</territory>
+ <territory type="HN">ГондураÑ</territory>
+ <territory type="HR">ХорватіÑ</territory>
+ <territory type="HT">Гаїті</territory>
+ <territory type="HU">Угорщина</territory>
+ <territory type="ID">ІндонезіÑ</territory>
+ <territory type="IE">ІрландіÑ</territory>
+ <territory type="IL">Ізраїль</territory>
+ <territory type="IN">ІндіÑ</territory>
+ <territory type="IO">БританÑькі території ІндійÑького океану</territory>
+ <territory type="IO" alt="proposed-u174-1" draft="provisional">БританÑька Ñ‚ÐµÑ€Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ Ð² ІндійÑькому океані</territory>
+ <territory type="IQ">Ірак</territory>
+ <territory type="IR">Іран</territory>
+ <territory type="IR" alt="proposed-u174-1" draft="provisional">Іран, ІÑламÑька РеÑпубліка</territory>
+ <territory type="IS">ІÑландіÑ</territory>
+ <territory type="IT">ІталіÑ</territory>
+ <territory type="JM">Ямайка</territory>
+ <territory type="JO">ЙорданіÑ</territory>
+ <territory type="JP">ЯпоніÑ</territory>
+ <territory type="KE">КеніÑ</territory>
+ <territory type="KG">КиргизÑтан</territory>
+ <territory type="KH">Камбоджа</territory>
+ <territory type="KI">Кірибаті</territory>
+ <territory type="KI" alt="proposed-u174-1" draft="provisional">Кірібаті</territory>
+ <territory type="KM">КоморÑькі ОÑтрови</territory>
+ <territory type="KM" alt="proposed-u174-1" draft="provisional">Комори</territory>
+ <territory type="KN">Сент-ÐšÑ–Ñ‚Ñ Ñ– ÐевіÑ</territory>
+ <territory type="KP">Північна КореÑ</territory>
+ <territory type="KP" alt="proposed-u174-1" draft="provisional">КорейÑька Ðародно-Демократична РеÑпубліка</territory>
+ <territory type="KR">Південна КореÑ</territory>
+ <territory type="KR" alt="proposed-u174-1" draft="provisional">КореÑ, РеÑпубліка</territory>
+ <territory type="KW">Кувейт</territory>
+ <territory type="KY">Кайманові оÑтрови</territory>
+ <territory type="KY" alt="proposed-u174-1" draft="provisional">ОÑтрови Кайман</territory>
+ <territory type="KZ">КазахÑтан</territory>
+ <territory type="LA">ЛаоÑ</territory>
+ <territory type="LA" alt="proposed-u174-1" draft="provisional">ЛаоÑька Ðародно-Демократична РеÑпубліка</territory>
+ <territory type="LB">Ліван</territory>
+ <territory type="LC">Сент-ЛюÑÑ–Ñ</territory>
+ <territory type="LI">Ліхтенштейн</territory>
+ <territory type="LK">Шрі-Ланка</territory>
+ <territory type="LR">ЛіберіÑ</territory>
+ <territory type="LS">ЛеÑото</territory>
+ <territory type="LT">Литва</territory>
+ <territory type="LU">ЛюкÑембург</territory>
+ <territory type="LU" references="RP1" alt="proposed-u174-1" draft="provisional">ЛюкÑембурґ</territory>
+ <territory type="LV">ЛатвіÑ</territory>
+ <territory type="LY">ЛівіÑ</territory>
+ <territory type="LY" references="RP1" alt="proposed-u174-1" draft="provisional">ЛівійÑька ÐрабÑька ДжамахіріÑ</territory>
+ <territory type="MA">Марокко</territory>
+ <territory type="MC">Монако</territory>
+ <territory type="MD">Молдова</territory>
+ <territory type="MG">МадагаÑкар</territory>
+ <territory type="MG" references="RP1" alt="proposed-u174-2" draft="provisional">МадаґаÑкар</territory>
+ <territory type="MH">Маршаллові ОÑтрови</territory>
+ <territory type="MK">МакедоніÑ</territory>
+ <territory type="MK" references="RP1" alt="proposed-u174-1" draft="provisional">МакедоніÑ, ÐºÐ¾Ð»Ð¸ÑˆÐ½Ñ Ð®Ð³Ð¾ÑлавÑька РеÑпубліка</territory>
+ <territory type="ML">Малі</territory>
+ <territory type="MM">МʼÑнма</territory>
+ <territory type="MN">МонголіÑ</territory>
+ <territory type="MO">Макао, С.Ð.Р. Китаю</territory>
+ <territory type="MO" references="RP2" alt="proposed-u174-1" draft="provisional">Макао, О.Ð.Р. Китаю</territory>
+ <territory type="MP">Північні МаріанÑькі ОÑтрови</territory>
+ <territory type="MQ">Мартиніка</territory>
+ <territory type="MQ" references="RP1" alt="proposed-u174-1" draft="provisional">Мартініка</territory>
+ <territory type="MR">МавританіÑ</territory>
+ <territory type="MS">МонÑеррат</territory>
+ <territory type="MS" references="RP1" alt="proposed-u174-1" draft="provisional">МонтÑеррат</territory>
+ <territory type="MT">Мальта</territory>
+ <territory type="MU">Маврикій</territory>
+ <territory type="MV">Мальдіви</territory>
+ <territory type="MW">Малаві</territory>
+ <territory type="MX">МекÑика</territory>
+ <territory type="MY">МалайзіÑ</territory>
+ <territory type="MZ">Мозамбік</territory>
+ <territory type="NA">ÐамібіÑ</territory>
+ <territory type="NC">Ðова КаледоніÑ</territory>
+ <territory type="NE">Ðігер</territory>
+ <territory type="NE" references="RP1" alt="proposed-u174-1" draft="provisional">Ðіґер</territory>
+ <territory type="NF">ОÑтрів Ðорфолк</territory>
+ <territory type="NG">ÐігеріÑ</territory>
+ <territory type="NG" references="RP1" alt="proposed-u174-1" draft="provisional">ÐіґеріÑ</territory>
+ <territory type="NI">Ðікарагуа</territory>
+ <territory type="NI" alt="proposed-u174-1" draft="provisional">Ðікараґуа</territory>
+ <territory type="NL">Ðідерланди</territory>
+ <territory type="NO">ÐорвегіÑ</territory>
+ <territory type="NO" references="RP1" alt="proposed-u174-1" draft="provisional">ÐорвеґіÑ</territory>
+ <territory type="NP">Ðепал</territory>
+ <territory type="NR">Ðауру</territory>
+ <territory type="NU">ÐÑ–Ñ</territory>
+ <territory type="NU" references="RP1" alt="proposed-u174-1" draft="provisional">Ðіуе</territory>
+ <territory type="NZ">Ðова ЗеландіÑ</territory>
+ <territory type="OM">Оман</territory>
+ <territory type="PA">Панама</territory>
+ <territory type="PE">Перу</territory>
+ <territory type="PF">Французька ПолінезіÑ</territory>
+ <territory type="PG">Папуа Ðова ГвінеÑ</territory>
+ <territory type="PG" references="RP1" alt="proposed-u174-1" draft="provisional">Папуа-Ðова ÒвінеÑ</territory>
+ <territory type="PH">Філіппіни</territory>
+ <territory type="PK">ПакиÑтан</territory>
+ <territory type="PL">Польща</territory>
+ <territory type="PM">Сен-Пʼєр і Мікелон</territory>
+ <territory type="PN">Піткерн</territory>
+ <territory type="PR">Пуерто-Ріко</territory>
+ <territory type="PR" references="RP1" alt="proposed-u174-1" draft="provisional">Пуерто-Рико</territory>
+ <territory type="PS">ПалеÑтина</territory>
+ <territory type="PS" references="RP2" alt="proposed-u174-1" draft="provisional">ПалеÑтинÑька територіÑ</territory>
+ <territory type="PT">ПортугаліÑ</territory>
+ <territory type="PT" references="RP1" alt="proposed-u174-1" draft="provisional">ПортуґаліÑ</territory>
+ <territory type="PW">Палау</territory>
+ <territory type="PY">Парагвай</territory>
+ <territory type="PY" references="RP1" alt="proposed-u174-1" draft="provisional">Параґвай</territory>
+ <territory type="QA">Катар</territory>
+ <territory type="QO">Інша ОкеаніÑ</territory>
+ <territory type="RE">Реюньйон</territory>
+ <territory type="RO">РумуніÑ</territory>
+ <territory type="RU">РоÑÑ–Ñ</territory>
+ <territory type="RU" references="RP1" alt="proposed-u174-1" draft="provisional">РоÑійÑька ФедераціÑ</territory>
+ <territory type="RW">Руанда</territory>
+ <territory type="SA">СаудівÑька ÐравіÑ</territory>
+ <territory type="SB">Соломонові ОÑтрови</territory>
+ <territory type="SC">Сейшели</territory>
+ <territory type="SD">Судан</territory>
+ <territory type="SE">ШвеціÑ</territory>
+ <territory type="SG">Сінгапур</territory>
+ <territory type="SG" references="RP1" alt="proposed-u174-1" draft="provisional">Сінґапур</territory>
+ <territory type="SH">Св. Єлена</territory>
+ <territory type="SH" references="RP1" alt="proposed-u174-1" draft="provisional">ОÑтрів СвÑтої Єлени</territory>
+ <territory type="SI">СловеніÑ</territory>
+ <territory type="SJ">Свалбард Ñ– Ян Майєн, оÑтрови</territory>
+ <territory type="SJ" references="RP1" alt="proposed-u174-1" draft="provisional">ОÑтрови Свальбард та Ян-Маєн</territory>
+ <territory type="SK">СловакіÑ</territory>
+ <territory type="SK" references="RP1" alt="proposed-u174-1" draft="provisional">Словаччина</territory>
+ <territory type="SL">Сьєрра-Леоне</territory>
+ <territory type="SM">Сан-Маріно</territory>
+ <territory type="SM" references="RP1" alt="proposed-u174-1" draft="provisional">Сан-Марино</territory>
+ <territory type="SN">Сенегал</territory>
+ <territory type="SN" references="RP1" alt="proposed-u174-1" draft="provisional">Сенеґал</territory>
+ <territory type="SO">Сомалі</territory>
+ <territory type="SR">Суринам</territory>
+ <territory type="SR" references="RP1" alt="proposed-u174-1" draft="provisional">Сурінам</territory>
+ <territory type="ST">Сан-Томе Ñ– ПрінÑіпі</territory>
+ <territory type="SV">Сальвадор</territory>
+ <territory type="SY">СирійÑька ÐрабÑька РеÑпубліка</territory>
+ <territory type="SZ">Свазіленд</territory>
+ <territory type="TC">Ð¢ÐµÑ€ÐºÑ Ñ– КайкоÑ</territory>
+ <territory type="TC" references="RP1" alt="proposed-u174-1" draft="provisional">Ð¢ÐµÑ€ÐºÑ Ñ– КайкоÑ, оÑтрови</territory>
+ <territory type="TD">Чад</territory>
+ <territory type="TF">Французькі Південні Території</territory>
+ <territory type="TG">Того</territory>
+ <territory type="TG" references="RP1" alt="proposed-u174-1" draft="provisional">Тоґо</territory>
+ <territory type="TH">Таїланд</territory>
+ <territory type="TJ">ТаджикиÑтан</territory>
+ <territory type="TK">Токелау</territory>
+ <territory type="TL">Східний Тимор</territory>
+ <territory type="TL" references="RP2" alt="proposed-u174-1" draft="provisional">Тімор-Лешті</territory>
+ <territory type="TM">ТуркмениÑтан</territory>
+ <territory type="TM" references="RP1" alt="proposed-u174-1" draft="provisional">ТуркменіÑтан</territory>
+ <territory type="TN">ТуніÑ</territory>
+ <territory type="TO">Тонга</territory>
+ <territory type="TO" references="RP1" alt="proposed-u174-1" draft="provisional">Тонґа</territory>
+ <territory type="TR">Туреччина</territory>
+ <territory type="TT">Тринідад і Тобаго</territory>
+ <territory type="TT" references="RP1" alt="proposed-u174-1" draft="provisional">Тринідад і Тобаґо</territory>
+ <territory type="TV">Тувалу</territory>
+ <territory type="TW">Тайвань</territory>
+ <territory type="TW" references="RP1" alt="proposed-u174-1" draft="provisional">Тайвань, Ð¿Ñ€Ð¾Ð²Ñ–Ð½Ñ†Ñ–Ñ ÐšÐ¸Ñ‚Ð°ÑŽ</territory>
+ <territory type="TZ">ТанзаніÑ, Обʼєднана РеÑпубліка</territory>
+ <territory type="TZ" references="RP1" alt="proposed-u174-1" draft="provisional">Обʼєднана РеÑпубліка ТанзаніÑ</territory>
+ <territory type="UA">Україна</territory>
+ <territory type="UG">Уганда</territory>
+ <territory type="UG" alt="proposed-u174-1" draft="provisional">Уґанда</territory>
+ <territory type="UM">Віддалені ОÑтрови СШÐ</territory>
+ <territory type="UM" references="RP1" alt="proposed-u174-1" draft="provisional">Малі Віддалені ОÑтрови Сполучених Штатів</territory>
+ <territory type="US">СШÐ</territory>
+ <territory type="US" references="RP1" alt="proposed-u174-1" draft="provisional">Сполучені Штати Ðмерики</territory>
+ <territory type="UY">Уругвай</territory>
+ <territory type="UY" references="RP1" alt="proposed-u174-1" draft="provisional">Уруґвай</territory>
+ <territory type="UZ">УзбекиÑтан</territory>
+ <territory type="VA">Ватикан</territory>
+ <territory type="VA" references="RP1" alt="proposed-u174-1" draft="provisional">ПапÑький ПреÑтол</territory>
+ <territory type="VC">Сент-ВінÑент Ñ– Гренадини</territory>
+ <territory type="VC" references="RP1" alt="proposed-u174-1" draft="provisional">Сент-ВінÑент Ñ– Òренадіни</territory>
+ <territory type="VE">ВенеÑуела</territory>
+ <territory type="VG">ВіргінÑькі оÑтрови (БританіÑ)</territory>
+ <territory type="VG" references="RP1" alt="proposed-u174-1" draft="provisional">ВірґінÑькі оÑтрови, БританÑькі</territory>
+ <territory type="VI">ВіргінÑькі оÑтрови (СШÐ)</territory>
+ <territory type="VI" references="RP1" alt="proposed-u174-1" draft="provisional">ВірґінÑькі оÑтрови (СШÐ)</territory>
+ <territory type="VN">Вʼєтнам</territory>
+ <territory type="VU">Вануату</territory>
+ <territory type="WF">Ð’Ð°Ð»Ð»Ñ–Ñ Ñ– Футуна, оÑтрови</territory>
+ <territory type="WF" references="RP1" alt="proposed-u174-1" draft="provisional">Ð£Ð¾Ð»Ð»Ñ–Ñ Ñ– Футуна</territory>
+ <territory type="WS">Самоа</territory>
+ <territory type="YE">Ємен</territory>
+ <territory type="YT">Майот</territory>
+ <territory type="YT" references="RP1" alt="proposed-u174-1" draft="provisional">Майотта</territory>
+ <territory type="ZA">ПÐР</territory>
+ <territory type="ZA" references="RP1" alt="proposed-u174-2" draft="provisional">ПівденноафриканÑька РеÑпубліка</territory>
+ <territory type="ZM">ЗамбіÑ</territory>
+ <territory type="ZW">Зімбабве</territory>
+ </territories>
+ <variants>
+ <variant type="1901" draft="provisional">Традиційна німецька орфографіÑ</variant>
+ <variant type="1996" draft="provisional">Ðова німецька Ð¾Ñ€Ñ„Ð¾Ð³Ñ€Ð°Ñ„Ñ–Ñ (з 1996 Ñ€.)</variant>
+ <variant type="NEDIS" draft="provisional">ÐатіÑонÑький діалект</variant>
+ <variant type="POLYTONI" draft="provisional">Політонічний</variant>
+ <variant type="REVISED" draft="provisional">Ðова орфографіÑ</variant>
+ <variant type="ROZAJ" draft="provisional">РезьÑнÑький діалект</variant>
+ <variant type="SAAHO" draft="provisional">Сахо</variant>
+ </variants>
+ <keys>
+ <key type="calendar">Календар</key>
+ <key type="collation">СортуваннÑ</key>
+ <key type="currency">Валюта</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation" draft="provisional">КитайÑький традиційний</type>
+ <type type="buddhist" key="calendar">БуддійÑький календар</type>
+ <type type="chinese" key="calendar">КитайÑький календар</type>
+ <type type="direct" key="collation">ПрÑмий порÑдок</type>
+ <type type="gb2312han" key="collation" draft="provisional">КитайÑький Ñпрощений</type>
+ <type type="gregorian" key="calendar">ГригоріанÑький календар</type>
+ <type type="hebrew" key="calendar">ЄврейÑький календар</type>
+ <type type="islamic" key="calendar">МуÑульманÑький календар</type>
+ <type type="islamic-civil" key="calendar">МуÑульманÑький друкований календар</type>
+ <type type="islamic-civil" key="calendar" alt="proposed-u174-1" draft="provisional">МуÑульманÑький ÑвітÑький календар</type>
+ <type type="japanese" key="calendar">ЯпонÑький календар</type>
+ <type type="phonebook" key="collation">Телефонна книга</type>
+ <type type="pinyin" key="collation">ПорÑдок Pinyin</type>
+ <type type="pinyin" key="collation" alt="proposed-u174-1" draft="provisional">ПорÑдок піньїн</type>
+ <type type="stroke" key="collation">Штриховий порÑдок</type>
+ <type type="stroke" key="collation" alt="proposed-u174-1" draft="provisional">ПорÑдок ключів</type>
+ <type type="traditional" key="collation">Традиційний</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US" draft="provisional">СШÐ</measurementSystemName>
+ <measurementSystemName type="metric" draft="provisional">Метрична</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[ʼ а-г Ò‘ д е Ñ” ж-и Ñ– Ñ— й-щ ÑŒ ÑŽ Ñ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[i v x]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="provisional">«</quotationStart>
+ <quotationEnd draft="provisional">»</quotationEnd>
+ <alternateQuotationStart draft="provisional">„</alternateQuotationStart>
+ <alternateQuotationEnd draft="provisional">“</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="coptic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="provisional">Тот</month>
+ <month type="2" draft="provisional">Бабе</month>
+ <month type="3" draft="provisional">Хатур</month>
+ <month type="4" draft="provisional">Кіхак</month>
+ <month type="5" draft="provisional">Тобе</month>
+ <month type="6" draft="provisional">Ðмшир</month>
+ <month type="7" draft="provisional">Барамхат</month>
+ <month type="8" draft="provisional">Бармуда</month>
+ <month type="9" draft="provisional">БашнаÑ</month>
+ <month type="10" draft="provisional">Бауна</month>
+ <month type="11" draft="provisional">Ðбіб</month>
+ <month type="12" draft="provisional">МиÑра</month>
+ <month type="13" draft="provisional">ÐаÑÑ–</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="provisional">Тот</month>
+ <month type="2" draft="provisional">Бабе</month>
+ <month type="3" draft="provisional">Хатур</month>
+ <month type="4" draft="provisional">Кіхак</month>
+ <month type="5" draft="provisional">Тобе</month>
+ <month type="6" draft="provisional">Ðмшир</month>
+ <month type="7" draft="provisional">Барамхат</month>
+ <month type="8" draft="provisional">Бармуда</month>
+ <month type="9" draft="provisional">БашнаÑ</month>
+ <month type="10" draft="provisional">Бауна</month>
+ <month type="11" draft="provisional">Ðбіб</month>
+ <month type="12" draft="provisional">МиÑра</month>
+ <month type="13" draft="provisional">ÐаÑÑ–</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">Січ</month>
+ <month type="1" alt="proposed-u73-1" draft="provisional">Ñіч.</month>
+ <month type="2">Лют</month>
+ <month type="2" alt="proposed-u73-1" draft="provisional">лют.</month>
+ <month type="3">Бер</month>
+ <month type="3" alt="proposed-u73-1" draft="provisional">бер.</month>
+ <month type="4">Кві</month>
+ <month type="4" alt="proposed-u73-1" draft="provisional">квіт.</month>
+ <month type="5">Тра</month>
+ <month type="5" alt="proposed-u73-1" draft="provisional">трав.</month>
+ <month type="6">Чер</month>
+ <month type="6" alt="proposed-u73-1" draft="provisional">черв.</month>
+ <month type="7">Лип</month>
+ <month type="7" alt="proposed-u73-1" draft="provisional">лип.</month>
+ <month type="8">Сер</month>
+ <month type="8" alt="proposed-u73-1" draft="provisional">Ñерп.</month>
+ <month type="9">Вер</month>
+ <month type="9" alt="proposed-u73-1" draft="provisional">вер.</month>
+ <month type="10">Жов</month>
+ <month type="10" alt="proposed-u73-1" draft="provisional">жовт.</month>
+ <month type="11">ЛиÑ</month>
+ <month type="11" alt="proposed-u73-1" draft="provisional">лиÑÑ‚.</month>
+ <month type="12">Гру</month>
+ <month type="12" alt="proposed-u73-1" draft="provisional">груд.</month>
+ </monthWidth>
+ <monthWidth type="narrow">
+ <month type="1">С</month>
+ <month type="2">Л</month>
+ <month type="3">Б</month>
+ <month type="4">К</month>
+ <month type="5">Т</month>
+ <month type="6">Ч</month>
+ <month type="7">Л</month>
+ <month type="8">С</month>
+ <month type="9">Ð’</month>
+ <month type="10">Ж</month>
+ <month type="11">Л</month>
+ <month type="12">Г</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">ÑічнÑ</month>
+ <month type="2">лютого</month>
+ <month type="3">березнÑ</month>
+ <month type="4">квітнÑ</month>
+ <month type="5">травнÑ</month>
+ <month type="6">червнÑ</month>
+ <month type="7">липнÑ</month>
+ <month type="8">ÑерпнÑ</month>
+ <month type="9">вереÑнÑ</month>
+ <month type="10">жовтнÑ</month>
+ <month type="11">лиÑтопада</month>
+ <month type="12">груднÑ</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="abbreviated">
+ <month type="1">Січ</month>
+ <month type="2">Лют</month>
+ <month type="3">Бер</month>
+ <month type="4">Кві</month>
+ <month type="5">Тра</month>
+ <month type="6">Чер</month>
+ <month type="7">Лип</month>
+ <month type="8">Сер</month>
+ <month type="9">Вер</month>
+ <month type="10">Жов</month>
+ <month type="11">ЛиÑ</month>
+ <month type="12">Гру</month>
+ </monthWidth>
+ <monthWidth type="narrow">
+ <month type="1">С</month>
+ <month type="2">Л</month>
+ <month type="3">Б</month>
+ <month type="4">К</month>
+ <month type="5">Т</month>
+ <month type="6">Ч</month>
+ <month type="7">Л</month>
+ <month type="8">С</month>
+ <month type="9">Ð’</month>
+ <month type="10">Ж</month>
+ <month type="11">Л</month>
+ <month type="12">Г</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">Січень</month>
+ <month type="2">Лютий</month>
+ <month type="3">Березень</month>
+ <month type="4">Квітень</month>
+ <month type="5">Травень</month>
+ <month type="6">Червень</month>
+ <month type="7">Липень</month>
+ <month type="8">Серпень</month>
+ <month type="9">ВереÑень</month>
+ <month type="10">Жовтень</month>
+ <month type="11">ЛиÑтопад</month>
+ <month type="12">Грудень</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">Ðд</day>
+ <day type="mon">Пн</day>
+ <day type="tue">Ð’Ñ‚</day>
+ <day type="wed">Ср</day>
+ <day type="thu">Чт</day>
+ <day type="fri">Пт</day>
+ <day type="sat">Сб</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">ÐеділÑ</day>
+ <day type="mon">Понеділок</day>
+ <day type="tue">Вівторок</day>
+ <day type="wed">Середа</day>
+ <day type="thu">Четвер</day>
+ <day type="fri">ПʼÑтницÑ</day>
+ <day type="sat">Субота</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">Ð</day>
+ <day type="mon">П</day>
+ <day type="tue">Ð’</day>
+ <day type="wed">С</day>
+ <day type="thu">Ч</day>
+ <day type="fri">П</day>
+ <day type="sat">С</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1" references="RP6" draft="provisional">I квартал</quarter>
+ <quarter type="2" references="RP6" draft="provisional">II квартал</quarter>
+ <quarter type="3" references="RP6" draft="provisional">III квартал</quarter>
+ <quarter type="4" references="RP6" draft="provisional">IV квартал</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am draft="provisional">дп</am>
+ <pm draft="provisional">пп</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">до н.е.</era>
+ <era type="0" alt="proposed-u73-1" draft="provisional">до н. е.</era>
+ <era type="1">н.е.</era>
+ <era type="1" alt="proposed-u73-1" draft="provisional">н. е.</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, d MMMM yyyy 'Ñ€.'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>d MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd.MM.yy</pattern>
+ <pattern alt="proposed-u73-1" draft="provisional">dd.MM.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd.MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM.yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ <dateFormatItem id="yyyyQQQQ" draft="provisional">QQQQ yyyy 'Ñ€.'</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="year">
+ <displayName draft="provisional">Рік</displayName>
+ </field>
+ <field type="month">
+ <displayName draft="provisional">МіÑÑць</displayName>
+ </field>
+ <field type="week">
+ <displayName draft="provisional">Тиждень</displayName>
+ </field>
+ <field type="day">
+ <displayName draft="provisional">День</displayName>
+ </field>
+ <field type="weekday">
+ <displayName draft="provisional">День тижнÑ</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName draft="provisional">ЧаÑтина доби</displayName>
+ </field>
+ <field type="hour">
+ <displayName draft="provisional">Година</displayName>
+ </field>
+ <field type="minute">
+ <displayName draft="provisional">Хвилина</displayName>
+ </field>
+ <field type="second">
+ <displayName draft="provisional">Секунда</displayName>
+ </field>
+ </fields>
+ </calendar>
+ <calendar type="hebrew">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" references="RP7" draft="provisional">Тішри</month>
+ <month type="2" references="RP7" draft="provisional">Марчешван</month>
+ <month type="3" references="RP7" draft="provisional">ЧиÑльов</month>
+ <month type="4" references="RP7" draft="provisional">Тебет</month>
+ <month type="5" references="RP7" draft="provisional">Шеват</month>
+ <month type="6" references="RP7" draft="provisional">Ðдар â… </month>
+ <month type="7" references="RP7" draft="provisional">Ðдар</month>
+ <month type="8" references="RP7" draft="provisional">ÐÑ–Ñан</month>
+ <month type="10" references="RP7" draft="provisional">Сиван</month>
+ <month type="11" references="RP7" draft="provisional">Таммуз</month>
+ <month type="12" references="RP7" draft="provisional">Ðб</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" references="RP7" draft="provisional">Тішри</month>
+ <month type="2" references="RP7" draft="provisional">Марчешван</month>
+ <month type="3" references="RP7" draft="provisional">ЧиÑльов</month>
+ <month type="4" references="RP7" draft="provisional">Тебет</month>
+ <month type="5" references="RP7" draft="provisional">Шеват</month>
+ <month type="6" references="RP7" draft="provisional">Ðдар â… </month>
+ <month type="7" references="RP7" draft="provisional">Ðдар</month>
+ <month type="8" references="RP7" draft="provisional">ÐÑ–Ñан</month>
+ <month type="9" references="RP7" draft="provisional">Іар</month>
+ <month type="10" references="RP7" draft="provisional">Сиван</month>
+ <month type="11" references="RP7" draft="provisional">Таммуз</month>
+ <month type="12" references="RP7" draft="provisional">Ðб</month>
+ <month type="13" references="RP7" draft="provisional">Елул</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="islamic">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1" draft="provisional">Мухаррам</month>
+ <month type="2" draft="provisional">Сафар</month>
+ <month type="3" draft="provisional">Рабі I</month>
+ <month type="4" draft="provisional">Рабі II</month>
+ <month type="5" draft="provisional">Джумада I</month>
+ <month type="6" draft="provisional">Джумада II</month>
+ <month type="7" draft="provisional">Раджаб</month>
+ <month type="8" draft="provisional">Шаабан</month>
+ <month type="9" draft="provisional">Рамадан</month>
+ <month type="10" draft="provisional">Даввал</month>
+ <month type="11" draft="provisional">Зу-ль-каада</month>
+ <month type="12" draft="provisional">Зу-ль-хіджа</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ <calendar type="persian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="wide">
+ <month type="1" draft="provisional">Фарвардін</month>
+ <month type="2" draft="provisional">Ордібехешт</month>
+ <month type="3" draft="provisional">Хордад</month>
+ <month type="4" draft="provisional">Тір</month>
+ <month type="5" draft="provisional">Мордад</month>
+ <month type="6" draft="provisional">Шахрівер</month>
+ <month type="7" draft="provisional">Мехр</month>
+ <month type="8" draft="provisional">Ðбан</month>
+ <month type="9" draft="provisional">Ðзер</month>
+ <month type="10" draft="provisional">Дей</month>
+ <month type="11" draft="provisional">Бахман</month>
+ <month type="12" draft="provisional">ЕÑфанд</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HHmm;-HHmm</hourFormat>
+ <zone type="Africa/Timbuktu">
+ <exemplarCity>Тимбукту</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/ComodRivadavia">
+ <exemplarCity>Комодоро-РивадавіÑ</exemplarCity>
+ </zone>
+ <zone type="Europe/Belfast">
+ <exemplarCity>БелфаÑÑ‚</exemplarCity>
+ </zone>
+ <zone type="Pacific/Yap">
+ <exemplarCity>Яп</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Rothera">
+ <exemplarCity>Ротера</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Palmer">
+ <exemplarCity>Палмер</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>Південний полюÑ</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Syowa">
+ <exemplarCity>Сьова</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Mawson">
+ <exemplarCity>МоуÑон</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Davis">
+ <exemplarCity>ДейвіÑ</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Vostok">
+ <exemplarCity>ВоÑток</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Casey">
+ <exemplarCity>КейÑÑ–</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity>Дюмон-д'Юрвіль</exemplarCity>
+ </zone>
+ <zone type="Antarctica/McMurdo">
+ <exemplarCity>Мак-Мердо</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Rio_Gallegos">
+ <exemplarCity>Ріо-ÒалеґоÑ</exemplarCity>
+ </zone>
+ <zone type="America/Mendoza">
+ <exemplarCity>МендоÑа</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/San_Juan">
+ <exemplarCity>Сан-Хуан</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Ushuaia">
+ <exemplarCity>УшуаÑ</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/La_Rioja">
+ <exemplarCity>Ла-Ріоха</exemplarCity>
+ </zone>
+ <zone type="America/Catamarca">
+ <exemplarCity>Катамарка</exemplarCity>
+ </zone>
+ <zone type="America/Jujuy">
+ <exemplarCity>Жужуй</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Tucuman">
+ <exemplarCity>Тукуман</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity>Кордоба</exemplarCity>
+ </zone>
+ <zone type="America/Buenos_Aires">
+ <exemplarCity>БуеноÑ-ÐйреÑ</exemplarCity>
+ </zone>
+ <zone type="Australia/Perth">
+ <exemplarCity>Перт</exemplarCity>
+ </zone>
+ <zone type="Australia/Darwin">
+ <exemplarCity>Дарвін</exemplarCity>
+ </zone>
+ <zone type="Australia/Adelaide">
+ <exemplarCity>Ðделаїда</exemplarCity>
+ </zone>
+ <zone type="Australia/Broken_Hill">
+ <exemplarCity>Брокен-Гіл</exemplarCity>
+ </zone>
+ <zone type="Australia/Currie">
+ <exemplarCity draft="provisional">Каррі</exemplarCity>
+ </zone>
+ <zone type="Australia/Melbourne">
+ <exemplarCity>Мельбурн</exemplarCity>
+ </zone>
+ <zone type="Australia/Hobart">
+ <exemplarCity>Хобарт</exemplarCity>
+ </zone>
+ <zone type="Australia/Lindeman">
+ <exemplarCity>Ліндеман</exemplarCity>
+ </zone>
+ <zone type="Australia/Sydney">
+ <exemplarCity>Сідней</exemplarCity>
+ </zone>
+ <zone type="Australia/Brisbane">
+ <exemplarCity>БриÑбен</exemplarCity>
+ </zone>
+ <zone type="Australia/Lord_Howe">
+ <exemplarCity>Лорд-Хау</exemplarCity>
+ </zone>
+ <zone type="America/Eirunepe">
+ <exemplarCity>Ейрунепе</exemplarCity>
+ </zone>
+ <zone type="America/Rio_Branco">
+ <exemplarCity>Ріо-Бранко</exemplarCity>
+ </zone>
+ <zone type="America/Porto_Velho">
+ <exemplarCity>Порто-Велью</exemplarCity>
+ </zone>
+ <zone type="America/Boa_Vista">
+ <exemplarCity>Боа-Ð’Ñ–Ñта</exemplarCity>
+ </zone>
+ <zone type="America/Manaus">
+ <exemplarCity>МанауÑ</exemplarCity>
+ </zone>
+ <zone type="America/Cuiaba">
+ <exemplarCity>КуÑба</exemplarCity>
+ </zone>
+ <zone type="America/Campo_Grande">
+ <exemplarCity>Кампу-Гранді</exemplarCity>
+ </zone>
+ <zone type="America/Belem">
+ <exemplarCity>Белен</exemplarCity>
+ </zone>
+ <zone type="America/Araguaina">
+ <exemplarCity>Ðрагуайна</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>Сан-Паулу</exemplarCity>
+ </zone>
+ <zone type="America/Bahia">
+ <exemplarCity>БайÑ</exemplarCity>
+ </zone>
+ <zone type="America/Fortaleza">
+ <exemplarCity>Форталеза</exemplarCity>
+ </zone>
+ <zone type="America/Maceio">
+ <exemplarCity>МаÑейо</exemplarCity>
+ </zone>
+ <zone type="America/Recife">
+ <exemplarCity>РеÑÑ–Ñ„Ñ–</exemplarCity>
+ </zone>
+ <zone type="America/Noronha">
+ <exemplarCity>ÐороньÑ</exemplarCity>
+ </zone>
+ <zone type="America/Dawson">
+ <exemplarCity>ДоуÑон</exemplarCity>
+ </zone>
+ <zone type="America/Whitehorse">
+ <exemplarCity>ВайтгорÑ</exemplarCity>
+ </zone>
+ <zone type="America/Vancouver">
+ <exemplarCity>Ванкувер</exemplarCity>
+ </zone>
+ <zone type="America/Dawson_Creek">
+ <exemplarCity>ДоуÑон-Крік</exemplarCity>
+ </zone>
+ <zone type="America/Yellowknife">
+ <exemplarCity>Єллоунайф</exemplarCity>
+ </zone>
+ <zone type="America/Inuvik">
+ <exemplarCity>Інувік</exemplarCity>
+ </zone>
+ <zone type="America/Edmonton">
+ <exemplarCity>Едмонтон</exemplarCity>
+ </zone>
+ <zone type="America/Swift_Current">
+ <exemplarCity>Свіфт-Каррент</exemplarCity>
+ </zone>
+ <zone type="America/Cambridge_Bay">
+ <exemplarCity draft="provisional">Кембридж-Бей</exemplarCity>
+ </zone>
+ <zone type="America/Regina">
+ <exemplarCity>Реджайна</exemplarCity>
+ </zone>
+ <zone type="America/Winnipeg">
+ <exemplarCity>Вінніпеґ</exemplarCity>
+ </zone>
+ <zone type="America/Rainy_River">
+ <exemplarCity>Рейні-Рівер</exemplarCity>
+ </zone>
+ <zone type="America/Rankin_Inlet">
+ <exemplarCity>Ренкін-Інлет</exemplarCity>
+ </zone>
+ <zone type="America/Thunder_Bay">
+ <exemplarCity>Тандер-Бей</exemplarCity>
+ </zone>
+ <zone type="America/Nipigon">
+ <exemplarCity>Ðіпігон</exemplarCity>
+ </zone>
+ <zone type="America/Coral_Harbour">
+ <exemplarCity draft="provisional">Корал-Харбор</exemplarCity>
+ </zone>
+ <zone type="America/Toronto">
+ <exemplarCity>Торонто</exemplarCity>
+ </zone>
+ <zone type="America/Montreal">
+ <exemplarCity>Монреаль</exemplarCity>
+ </zone>
+ <zone type="America/Iqaluit">
+ <exemplarCity>Ікалуіт</exemplarCity>
+ </zone>
+ <zone type="America/Pangnirtung">
+ <exemplarCity>Панґніртунґ</exemplarCity>
+ </zone>
+ <zone type="America/Moncton">
+ <exemplarCity draft="provisional">Монктон</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <exemplarCity>ГаліфакÑ</exemplarCity>
+ </zone>
+ <zone type="America/Goose_Bay">
+ <exemplarCity>Гуз-Бей</exemplarCity>
+ </zone>
+ <zone type="America/Glace_Bay">
+ <exemplarCity>ГлейÑ-Бей</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <exemplarCity>Сент-ДжонÑ</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity>КіншаÑа</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity>Лубумбаші</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>ПаÑхи, оÑтрів</exemplarCity>
+ </zone>
+ <zone type="America/Santiago">
+ <exemplarCity>СантьÑго</exemplarCity>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity>Кашгар</exemplarCity>
+ </zone>
+ <zone type="Asia/Urumqi">
+ <exemplarCity>Урумчі</exemplarCity>
+ </zone>
+ <zone type="Asia/Chongqing">
+ <exemplarCity>Чунцин</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <exemplarCity>Шанхай</exemplarCity>
+ </zone>
+ <zone type="Asia/Harbin">
+ <exemplarCity>Харбін</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity>ÒалапагоÑ</exemplarCity>
+ </zone>
+ <zone type="America/Guayaquil">
+ <exemplarCity>ГуаÑкіль</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>Канари</exemplarCity>
+ </zone>
+ <zone type="Africa/Ceuta">
+ <exemplarCity>Сеута</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity>Мадрид</exemplarCity>
+ </zone>
+ <zone type="Pacific/Truk">
+ <exemplarCity>Трук</exemplarCity>
+ </zone>
+ <zone type="Pacific/Ponape">
+ <exemplarCity>Понапе</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kosrae">
+ <exemplarCity>КоÑрае</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>Лондон</exemplarCity>
+ </zone>
+ <zone type="America/Thule">
+ <exemplarCity>Туле</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity>Готхоб</exemplarCity>
+ </zone>
+ <zone type="America/Scoresbysund">
+ <exemplarCity>СкорÑбиÑун</exemplarCity>
+ </zone>
+ <zone type="America/Danmarkshavn">
+ <exemplarCity>ДенмаркÑхавн</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity>Джакарта</exemplarCity>
+ </zone>
+ <zone type="Asia/Pontianak">
+ <exemplarCity>Понтіанак</exemplarCity>
+ </zone>
+ <zone type="Asia/Makassar">
+ <exemplarCity>МакаÑар</exemplarCity>
+ </zone>
+ <zone type="Asia/Jayapura">
+ <exemplarCity>Джайпур</exemplarCity>
+ </zone>
+ <zone type="Pacific/Enderbury">
+ <exemplarCity>Ендербері</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kiritimati">
+ <exemplarCity>Кіритиматі</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tarawa">
+ <exemplarCity>Тарава</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtau">
+ <exemplarCity>Ðктау</exemplarCity>
+ </zone>
+ <zone type="Asia/Oral">
+ <exemplarCity>Орал</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtobe">
+ <exemplarCity>Ðктобе</exemplarCity>
+ </zone>
+ <zone type="Asia/Qyzylorda">
+ <exemplarCity>Кзил-Орда</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity>Ðлмати</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kwajalein">
+ <exemplarCity>Кваджалейн</exemplarCity>
+ </zone>
+ <zone type="Pacific/Majuro">
+ <exemplarCity>Маджуро</exemplarCity>
+ </zone>
+ <zone type="Africa/Bamako">
+ <exemplarCity>Бамако</exemplarCity>
+ </zone>
+ <zone type="Asia/Hovd">
+ <exemplarCity>Говд</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>Улан-Батор</exemplarCity>
+ </zone>
+ <zone type="Asia/Choibalsan">
+ <exemplarCity>ЧойбалÑан</exemplarCity>
+ </zone>
+ <zone type="America/Tijuana">
+ <exemplarCity>Тіхуана</exemplarCity>
+ </zone>
+ <zone type="America/Hermosillo">
+ <exemplarCity>ЕрмоÑільйо</exemplarCity>
+ </zone>
+ <zone type="America/Mazatlan">
+ <exemplarCity>МаÑатлан</exemplarCity>
+ </zone>
+ <zone type="America/Chihuahua">
+ <exemplarCity>Чіуауа</exemplarCity>
+ </zone>
+ <zone type="America/Monterrey">
+ <exemplarCity>Монтерей</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>Мехіко</exemplarCity>
+ </zone>
+ <zone type="America/Merida">
+ <exemplarCity>Меріда</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>Канкун</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuala_Lumpur">
+ <exemplarCity>Куала-Лумпур</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuching">
+ <exemplarCity>Кучінґ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Chatham">
+ <exemplarCity>Чатем</exemplarCity>
+ </zone>
+ <zone type="Pacific/Auckland">
+ <exemplarCity>Окленд</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity>Таїті</exemplarCity>
+ </zone>
+ <zone type="Pacific/Marquesas">
+ <exemplarCity draft="provisional">Маркизькі о-ви</exemplarCity>
+ </zone>
+ <zone type="Pacific/Gambier">
+ <exemplarCity>Гамбер</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>ÐзорÑькі о-ви</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Madeira">
+ <exemplarCity>Мадейра</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>ЛіÑабон</exemplarCity>
+ </zone>
+ <zone type="Europe/Kaliningrad">
+ <exemplarCity>Калінінград</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>МоÑква</exemplarCity>
+ </zone>
+ <zone type="Europe/Samara">
+ <exemplarCity>Самара</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>Єкатеринбург</exemplarCity>
+ </zone>
+ <zone type="Asia/Omsk">
+ <exemplarCity>ОмÑьк</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity>ÐовоÑибірÑьк</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>КраÑноÑÑ€Ñьк</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity>ІркутÑьк</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>ЯкутÑьк</exemplarCity>
+ </zone>
+ <zone type="Asia/Vladivostok">
+ <exemplarCity>ВладивоÑток</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>Сахалін</exemplarCity>
+ </zone>
+ <zone type="Asia/Magadan">
+ <exemplarCity>Магадан</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>Камчатка</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity>Ðнадир</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Jan_Mayen">
+ <exemplarCity>Ян-Майєн</exemplarCity>
+ </zone>
+ <zone type="Arctic/Longyearbyen">
+ <exemplarCity>Лонгербюйн</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>Ужгород</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>Київ</exemplarCity>
+ </zone>
+ <zone type="Europe/Simferopol">
+ <exemplarCity>Сімферополь</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>ЗапоріжжÑ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Midway">
+ <exemplarCity>Мідуей</exemplarCity>
+ </zone>
+ <zone type="Pacific/Johnston">
+ <exemplarCity>ДжонÑтон</exemplarCity>
+ </zone>
+ <zone type="Pacific/Wake">
+ <exemplarCity>Вейк</exemplarCity>
+ </zone>
+ <zone type="America/Adak">
+ <exemplarCity>Ðдак</exemplarCity>
+ </zone>
+ <zone type="America/Nome">
+ <exemplarCity>Ðом</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <exemplarCity>Гонолулу</exemplarCity>
+ </zone>
+ <zone type="America/Anchorage">
+ <exemplarCity draft="provisional">Ðнкоридж</exemplarCity>
+ </zone>
+ <zone type="America/Yakutat">
+ <exemplarCity>Якутат</exemplarCity>
+ </zone>
+ <zone type="America/Juneau">
+ <exemplarCity>Джуно</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <exemplarCity>ЛоÑ-ÐнджелеÑ</exemplarCity>
+ </zone>
+ <zone type="America/Boise">
+ <exemplarCity>БойÑе</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <exemplarCity>ФінікÑ</exemplarCity>
+ </zone>
+ <zone type="America/Shiprock">
+ <exemplarCity>Шипрок</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <exemplarCity>Денвер</exemplarCity>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity>Центр</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <exemplarCity>Чикаго</exemplarCity>
+ </zone>
+ <zone type="America/Menominee">
+ <exemplarCity>Меноміні</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vincennes">
+ <exemplarCity draft="provisional">ВінÑенÑ</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Petersburg">
+ <exemplarCity draft="provisional">Петербург</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Knox">
+ <exemplarCity>ÐокÑ</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Marengo">
+ <exemplarCity>Маренго</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <exemplarCity>ІндіанаполіÑ</exemplarCity>
+ </zone>
+ <zone type="America/Louisville">
+ <exemplarCity>ЛуїÑвілль</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vevay">
+ <exemplarCity>Вівей</exemplarCity>
+ </zone>
+ <zone type="America/Kentucky/Monticello">
+ <exemplarCity>Монтичелло</exemplarCity>
+ </zone>
+ <zone type="America/Detroit">
+ <exemplarCity>Детройт</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <exemplarCity>Ðью-Йорк</exemplarCity>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity>Самарканд</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>Ташкент</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group> </group>
+ </symbols>
+ <currencies>
+ <currency type="ADP">
+ <displayName>ÐндоррÑька пеÑета</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>Дирхем ОÐЕ</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>Ðфгані (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>Ðфгані</displayName>
+ <symbol>Af</symbol>
+ </currency>
+ <currency type="ALL">
+ <displayName>ÐлбанÑький лек</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Лек</displayName>
+ <symbol>lek</symbol>
+ </currency>
+ <currency type="AMD">
+ <displayName>ВірменÑький драм</displayName>
+ <symbol>dram</symbol>
+ </currency>
+ <currency type="ANG">
+ <displayName>Гульден ÐідерландÑьких Ðнтіл</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ÐідерландÑький ÐнтильÑький гульден</displayName>
+ <symbol>NA f.</symbol>
+ </currency>
+ <currency type="AOA">
+ <displayName>ÐнгольÑька кванза</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Кванза</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>ÐнгольÑька кванза (1977-1990)</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Кванза (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>ÐнгольÑька нова кванза (1990-2000)</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Ðова кванза (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName references="RP3" draft="provisional">Кванза реаджаÑтадо (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>ÐргентинÑький авÑтрал</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ÐуÑтрал</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>ÐргентинÑьке пеÑо (1983-1985)</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ÐргентинÑький пеÑо (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>ÐргентинÑьке пеÑо</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ÐргентинÑький пеÑо</displayName>
+ <symbol>Arg$</symbol>
+ </currency>
+ <currency type="ATS">
+ <displayName>ÐвÑтрійÑький шилінг</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Шилінґ</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>ÐвÑтралійÑький долар</displayName>
+ <symbol>$A</symbol>
+ </currency>
+ <currency type="AWG">
+ <displayName>ÐрубÑький гульден</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>ÐзербайджанÑький манат</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>Динар (БоÑÐ½Ñ–Ñ Ñ– Герцеговина)</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>Конвертована марка БоÑнії Ñ– Герцоговини</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Конвертована марка</displayName>
+ <symbol>KM</symbol>
+ </currency>
+ <currency type="BBD">
+ <displayName>БарбадоÑький долар</displayName>
+ <symbol>BDS$</symbol>
+ </currency>
+ <currency type="BDT">
+ <displayName>БангладеÑька така</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Така</displayName>
+ <symbol>Tk</symbol>
+ </currency>
+ <currency type="BEC">
+ <displayName>БельгійÑький франк (конвертований)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>БельгійÑький франк</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">БельґійÑький франк</displayName>
+ <symbol>BF</symbol>
+ </currency>
+ <currency type="BEL">
+ <displayName>БельгійÑький франк (фінанÑовий)</displayName>
+ <displayName references="RP3" alt="proposed-u174-2" draft="provisional">ФінанÑовий франк</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>БолгарÑький твердий лев</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Лев</displayName>
+ <symbol>lev</symbol>
+ </currency>
+ <currency type="BGN">
+ <displayName>БолгарÑький новий лев</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">БолгарÑький лев</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>БахрейнÑький динар</displayName>
+ <symbol>BD</symbol>
+ </currency>
+ <currency type="BIF">
+ <displayName>БурундійÑький франк</displayName>
+ <symbol>Fbu</symbol>
+ </currency>
+ <currency type="BMD">
+ <displayName>БермудÑький долар</displayName>
+ <symbol>Ber$</symbol>
+ </currency>
+ <currency type="BND">
+ <displayName>БрунейÑький доларr</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">БрунейÑький долар</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>Болівіано</displayName>
+ <symbol>Bs</symbol>
+ </currency>
+ <currency type="BOP">
+ <displayName>БолівійÑьке пеÑо</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ПеÑо</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>БолівійÑький мвдол</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Мвдол</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>БразильÑьке нове крузейро (1967-1986)</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Крузейро (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>БразильÑьке крузадо</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Крузадо</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>БразильÑьке крузейро (1990-1993)</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Крузейро (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>БразильÑький реал</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">БразільÑький ріал</displayName>
+ <symbol>R$</symbol>
+ </currency>
+ <currency type="BRN">
+ <displayName>БразильÑьке нове крузадо</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Ðовий крузадо</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>БразильÑьке крузейро</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Крузейро ріал</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>БагамÑький долар</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>БутанÑький нгултрум</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Ðґултрум</displayName>
+ <symbol>Nu</symbol>
+ </currency>
+ <currency type="BUK">
+ <displayName>БірманÑький кіат</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>БотÑванÑька пула</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Пула</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>БілоруÑький новий рубль (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>БілоруÑький рубль</displayName>
+ <symbol>Rbl</symbol>
+ </currency>
+ <currency type="BZD">
+ <displayName>Белізький долар</displayName>
+ <symbol>BZ$</symbol>
+ </currency>
+ <currency type="CAD">
+ <displayName>КанадÑький долар</displayName>
+ <symbol>Can$</symbol>
+ </currency>
+ <currency type="CDF">
+ <displayName>Конголезький франк</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Конґолезький франк</displayName>
+ </currency>
+ <currency type="CHE">
+ <displayName draft="provisional">Євро WIR</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>ШвейцарÑький франк</displayName>
+ <symbol>SwF</symbol>
+ </currency>
+ <currency type="CHW">
+ <displayName draft="provisional">Франк WIR</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>ЧилійÑький UF</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Ð®Ð½Ñ–Ð´Ð°Ð´ÐµÑ Ð´Ðµ фоменто</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>ЧилійÑьке пеÑо</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ЧілійÑький пеÑо</displayName>
+ <symbol>Ch$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName>КитайÑький юань</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Юань Женьміньбі</displayName>
+ <symbol>Y</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>КолумбійÑьке пеÑо</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">КолумбійÑький пеÑо</displayName>
+ <symbol>Col$</symbol>
+ </currency>
+ <currency type="COU">
+ <displayName references="RP3" draft="provisional">Юнідад де валор ріал</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>КоÑта-риканÑький колон</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">КоÑтариканÑький колон</displayName>
+ <symbol>C</symbol>
+ </currency>
+ <currency type="CSD">
+ <displayName references="RP3" draft="provisional">СербÑький динар</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>ЧехоÑловацька тверда крона</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Коруна</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>КубинÑьке пеÑо</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">КубинÑький пеÑо</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>ЕÑкудо Кабо-Верде</displayName>
+ <symbol>CVEsc</symbol>
+ </currency>
+ <currency type="CYP">
+ <displayName>КіпрÑький фунт</displayName>
+ <symbol>£C</symbol>
+ </currency>
+ <currency type="CZK">
+ <displayName>ЧеÑька крона</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName references="RP3" draft="provisional">Марка ÐДР</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>Ðімецька марка</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>Франк Джібуті</displayName>
+ <displayName alt="proposed-u174-2" draft="provisional">ДжибутійÑький франк</displayName>
+ <symbol>DF</symbol>
+ </currency>
+ <currency type="DKK">
+ <displayName>ДатÑька крона</displayName>
+ <symbol>DKr</symbol>
+ </currency>
+ <currency type="DOP">
+ <displayName>ДомініканÑьке пеÑо</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ДомініканÑький пеÑо</displayName>
+ <symbol>RD$</symbol>
+ </currency>
+ <currency type="DZD">
+ <displayName>ÐлжирÑький динар</displayName>
+ <symbol>DA</symbol>
+ </currency>
+ <currency type="ECS">
+ <displayName>ЕквадорÑьке Ñукре</displayName>
+ <displayName alt="proposed-u174-1" draft="provisional">ЕквадорÑький Ñукре</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>ЕквадорÑький UVС</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Юнідад де валор конÑтанте</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>ЕÑтонÑька крона</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Крона</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>ЄгипетÑький фунт</displayName>
+ </currency>
+ <currency type="EQE">
+ <displayName references="RP3" draft="provisional">Еквеле</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>ЕритрейÑька накфа</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Ðакфа</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName references="RP3" draft="provisional">ІÑпанÑька пеÑета (&quot;Ð&quot; рахунок)</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName references="RP3" draft="provisional">ІÑпанÑька пеÑета (конвертовані рахунки)</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>ІÑпанÑька пеÑета</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>ЕфіопÑький бир</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ЕфіопÑький бір</displayName>
+ <symbol>Br</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName>Євро</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>ФінлÑндÑька марка</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Марка</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>ФіджійÑький долар</displayName>
+ <symbol>F$</symbol>
+ </currency>
+ <currency type="FKP">
+ <displayName>ФолклендÑький фунт</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Фунт ФолклендÑьких оÑтровів</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>Французький франк</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>ÐнглійÑький фунт Ñтерлінгів</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Фунт Ñтерлінгів</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName references="RP3" draft="provisional">ГрузинÑький купон</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>ГрузинÑький ларі</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Ларі</displayName>
+ <symbol>lari</symbol>
+ </currency>
+ <currency type="GHC">
+ <displayName>ГанÑький Ñеді</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Седі</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>ГібралтарÑький фунт</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ÒібралтарÑький фунт</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>ГамбійÑька далаÑÑ–</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ДалаÑÑ–</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>ГвійнейÑький франк</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ÒвійнейÑький франк</displayName>
+ <symbol>GF</symbol>
+ </currency>
+ <currency type="GNS">
+ <displayName>ГвінейÑьке Ñілі</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Сілі</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>Еквеле (Екваторіальна ÒвінеÑ)</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>Грецька драхма</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Драхма</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>ГватемальÑький кетÑаль</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Кветзал</displayName>
+ <symbol>Q</symbol>
+ </currency>
+ <currency type="GWE">
+ <displayName>ЕÑкудо ПортугальÑької Гвінеї</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ÒвінейÑький еÑкудо</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>ПеÑо Гвінеї-БіÑау</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ПеÑо Òвінеї-БіÑау</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>ГайÑнÑький долар</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ÒайанÑький долар</displayName>
+ <symbol>G$</symbol>
+ </currency>
+ <currency type="HKD">
+ <displayName>ГонконгівÑький долар</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Долар Гонконґу</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>ГондураÑька лемпіра</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Лемпіра</displayName>
+ <symbol>L</symbol>
+ </currency>
+ <currency type="HRD">
+ <displayName>ХорватÑький динар</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>ХорватÑька куна</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>ГаїтÑнÑький гурд</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Òурд</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>УгорÑький форинт</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Форинт</displayName>
+ <symbol>Ft</symbol>
+ </currency>
+ <currency type="IDR">
+ <displayName>ІндонезійÑька рупіÑ</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">РупіÑ</displayName>
+ <symbol>Rp</symbol>
+ </currency>
+ <currency type="IEP">
+ <displayName>ІрландÑький фунт</displayName>
+ <symbol>IR£</symbol>
+ </currency>
+ <currency type="ILP">
+ <displayName>ІзраїльÑький фунт</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Фунт</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>ІзраїльÑький новий шекель</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Ðовий ізраїльÑький шекель</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>ІндійÑька рупіÑ</displayName>
+ <symbol>INR</symbol>
+ </currency>
+ <currency type="IQD">
+ <displayName>ІракÑький динар</displayName>
+ <symbol>ID</symbol>
+ </currency>
+ <currency type="IRR">
+ <displayName>ІранÑький ріал</displayName>
+ <symbol>RI</symbol>
+ </currency>
+ <currency type="ISK">
+ <displayName>ІÑландÑька крона</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>ІталійÑька ліра</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>ЯмайÑький долар</displayName>
+ <symbol>J$</symbol>
+ </currency>
+ <currency type="JOD">
+ <displayName>ЙорданÑький динар</displayName>
+ <symbol>JD</symbol>
+ </currency>
+ <currency type="JPY">
+ <displayName>ЯпонÑька єна</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Єна</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>КенійÑький шилінг</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">КенійÑький шилінґ</displayName>
+ <symbol>K Sh</symbol>
+ </currency>
+ <currency type="KGS">
+ <displayName>Киргизький Ñом</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Сом</displayName>
+ <symbol>som</symbol>
+ </currency>
+ <currency type="KHR">
+ <displayName>КамбоджійÑький рієль</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Ріел</displayName>
+ <symbol>CR</symbol>
+ </currency>
+ <currency type="KMF">
+ <displayName>КоморÑький франк</displayName>
+ <symbol>CF</symbol>
+ </currency>
+ <currency type="KPW">
+ <displayName>Вона Північної Кореї</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ПівнічнокорейÑький вон</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>Вона Південної Кореї</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Вон</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName>КувейтÑький динар</displayName>
+ <symbol>KD</symbol>
+ </currency>
+ <currency type="KYD">
+ <displayName>Долар Кайманових оÑтровів</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>КазахÑтанÑький тенге</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Тенґе</displayName>
+ <symbol>T</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName>ЛаоÑький кіп</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Кіп</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>ЛіванÑький фунт</displayName>
+ <symbol>LL</symbol>
+ </currency>
+ <currency type="LKR">
+ <displayName>Шрі-ланкійÑька рупіÑ</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Ð ÑƒÐ¿Ñ–Ñ Ð¨Ñ€Ñ–-Ланки</displayName>
+ <symbol>SL Re</symbol>
+ </currency>
+ <currency type="LRD">
+ <displayName>ЛіберійÑький долар</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>ЛеÑотÑький лоті</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Лоті</displayName>
+ <symbol>M</symbol>
+ </currency>
+ <currency type="LSM">
+ <displayName references="RP3" draft="provisional">Малоті</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>ЛитовÑький літ</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>ЛитовÑький талон</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Талон</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName>ЛюкÑембурґÑький франк (Конвертований)</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>ЛюкÑембурзький франк</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ЛюкÑембурґÑький франк</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName>ЛюкÑембурґÑький франк (ФінанÑовий)</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>ЛатвійÑький лат</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>ЛатвійÑький рубль</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>ЛівійÑький динар</displayName>
+ <symbol>LD</symbol>
+ </currency>
+ <currency type="MAD">
+ <displayName>МарокканÑький дирхем</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>МарокканÑький франк</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>МолдовÑький лей</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>МадагаÑкарÑький аріарі</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>МадагаÑкарÑький франк</displayName>
+ <displayName references="RP3" alt="proposed-u174-2" draft="provisional">МалаґаÑійÑький франк</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>МакедонÑький динар</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Денар</displayName>
+ <symbol>MDen</symbol>
+ </currency>
+ <currency type="MLF">
+ <displayName>МалійÑький франк</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>КʼÑÑ‚ МʼÑнми</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">К'ÑÑ‚</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>МонгольÑький тугрик</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Тугрик</displayName>
+ <symbol>Tug</symbol>
+ </currency>
+ <currency type="MOP">
+ <displayName>Макао патака</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Патака</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName>МавританÑька угіÑ</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ÐґвійÑ</displayName>
+ <symbol>UM</symbol>
+ </currency>
+ <currency type="MTL">
+ <displayName>МальтійÑька ліра</displayName>
+ <symbol>Lm</symbol>
+ </currency>
+ <currency type="MTP">
+ <displayName>МальтійÑький фунт</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>МаврикійÑька рупіÑ</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>МальдівÑька руфіÑ</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">РуфіÑ</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>Квача (Малаві)</displayName>
+ <symbol>MK</symbol>
+ </currency>
+ <currency type="MXN">
+ <displayName>МекÑиканÑьке пеÑо</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">МекÑиканÑький пеÑо</displayName>
+ <symbol>MEX$</symbol>
+ </currency>
+ <currency type="MXP">
+ <displayName>МекÑиканÑьке Ñрібне пеÑо (1861-1992)</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">МекÑиканÑький пеÑо (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>МекÑиканÑький UDI</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">МекÑиканÑький юнідад де інверÑіон</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>МалайзійÑький рингіт</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">МалайзійÑький ринґіт</displayName>
+ <symbol>RM</symbol>
+ </currency>
+ <currency type="MZE">
+ <displayName>Мозамбіцький еÑкудо</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>Мозамбіцький метикал</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Метикал</displayName>
+ <symbol>Mt</symbol>
+ </currency>
+ <currency type="NAD">
+ <displayName>ÐамібійÑький долар</displayName>
+ <symbol>N$</symbol>
+ </currency>
+ <currency type="NGN">
+ <displayName>ÐігерійÑька найра</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>ÐікарагуанÑька кордоба</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Кордоба</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>ÐікарагуанÑька кордоба оро</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Кордоба оро</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>ÐідерландÑький гульден</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>Ðорвезька крона</displayName>
+ <symbol>NKr</symbol>
+ </currency>
+ <currency type="NPR">
+ <displayName>ÐепальÑька рупіÑ</displayName>
+ <symbol>Nrs</symbol>
+ </currency>
+ <currency type="NZD">
+ <displayName draft="unconfirmed">ÐовозеландÑький доларr</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>ОманÑький ріал</displayName>
+ <symbol>RO</symbol>
+ </currency>
+ <currency type="PAB">
+ <displayName>ПанамÑька бальбоа</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Бальбоа</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>ПеруанÑький інті</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Інті</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>ПеруанÑький новий Ñол</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Ðовий Ñол</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>ПеруанÑький Ñол</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Сол</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>Кіна Папуа Ðової Гвінеї</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Кіна</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>ФіліппінÑьке пеÑо</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ФіліппінÑький пеÑо</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>ПакиÑтанÑька рупіÑ</displayName>
+ <symbol>Pra</symbol>
+ </currency>
+ <currency type="PLN">
+ <displayName>ПольÑький злотий</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Злотий</displayName>
+ <symbol>Zl</symbol>
+ </currency>
+ <currency type="PLZ">
+ <displayName>ПольÑький злотий (1950-1995)</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Злотий (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>ПортугальÑький еÑкудо</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ПортуґальÑький еÑкудо</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>ПарагвайÑький гуарані</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Òварані</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>КатарÑький ріал</displayName>
+ <symbol>QR</symbol>
+ </currency>
+ <currency type="RHD">
+ <displayName references="RP3" draft="provisional">РодезійÑький долар</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>РумунÑький лей</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Лей</displayName>
+ <symbol>leu</symbol>
+ </currency>
+ <currency type="RON">
+ <displayName draft="provisional">Ðовий лей</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>РоÑійÑький рубль</displayName>
+ <symbol>руб.</symbol>
+ </currency>
+ <currency type="RUR">
+ <displayName>РоÑійÑький рубль (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>РуандійÑький франк</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>СаудівÑький ріал</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">СаудівÑький ріÑл</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>Долар Соломонових ОÑтровів</displayName>
+ <symbol>SI$</symbol>
+ </currency>
+ <currency type="SCR">
+ <displayName>СейшельÑька рупіÑ</displayName>
+ <symbol>SR</symbol>
+ </currency>
+ <currency type="SDD">
+ <displayName>СуданÑький динар</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>СуданÑький фунт</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>ШведÑька крона</displayName>
+ <symbol>SKr</symbol>
+ </currency>
+ <currency type="SGD">
+ <displayName>СінгапурÑький долар</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">СінґапурÑький долар</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>Фунт СвÑтої Єлени</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>СловенÑький толар</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Толар</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>Словацька крона</displayName>
+ <symbol>Sk</symbol>
+ </currency>
+ <currency type="SLL">
+ <displayName>Леоне Сьєрра-Леоне</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Леоне</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>СомалійÑький шилінг</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">СомалійÑький шилінґ</displayName>
+ <symbol>So. Sh.</symbol>
+ </currency>
+ <currency type="SRD">
+ <displayName draft="provisional">СуринамÑький долар</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>СуринамÑький гульден</displayName>
+ <symbol>Sf</symbol>
+ </currency>
+ <currency type="STD">
+ <displayName>Добра Сан-Томе Ñ– ПрінÑіпі</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Добра</displayName>
+ <symbol>Db</symbol>
+ </currency>
+ <currency type="SUR">
+ <displayName>РадÑнÑький рубль</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Рубль</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>Ель-СальвадорÑький колон</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">СальвадорÑький колон</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>СирійÑький фунт</displayName>
+ <symbol>LS</symbol>
+ </currency>
+ <currency type="SZL">
+ <displayName>СвазілендÑькі лілангені</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Ліланджені</displayName>
+ <symbol>E</symbol>
+ </currency>
+ <currency type="THB">
+ <displayName>ТаїландÑький бат</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Бат</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>Таджицький рубль</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>Таджицький Ñомоні</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Сомоні</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>ТуркменÑький манат</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Манат</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>ТуніÑький динар</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>Паанга Тонго</displayName>
+ <displayName alt="proposed-u174-1" draft="provisional">Паанґа</displayName>
+ <symbol>T$</symbol>
+ </currency>
+ <currency type="TPE">
+ <displayName>ТіморÑький еÑкудо</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>Турецька ліра</displayName>
+ <symbol>TL</symbol>
+ </currency>
+ <currency type="TRY">
+ <displayName>Ðова турецька ліра</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>Долар Тринідаду і Тобаго</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Долар Тринідаду і Тобаґо</displayName>
+ <symbol>TT$</symbol>
+ </currency>
+ <currency type="TWD">
+ <displayName>Ðовий тайванÑький долар</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>ТанзанійÑький шилінг</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ТанзанійÑький шилінґ</displayName>
+ <symbol>T Sh</symbol>
+ </currency>
+ <currency type="UAH">
+ <displayName>УкраїнÑька гривнÑ</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ГривнÑ</displayName>
+ <symbol>грн.</symbol>
+ <symbol alt="proposed-u73-1" draft="provisional">â‚´</symbol>
+ </currency>
+ <currency type="UAK">
+ <displayName>УкраїнÑький карбованець</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Карбованець</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>УгандійÑький шилінг (1966-1987)</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">УґандійÑький шилінґ (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>УгандійÑький шилінг</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">УґандійÑький шилінґ</displayName>
+ <symbol>U Sh</symbol>
+ </currency>
+ <currency type="USD">
+ <displayName>Долар СШÐ</displayName>
+ </currency>
+ <currency type="USN">
+ <displayName references="RP3" draft="provisional">Долар СШР(наÑтупного днÑ)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName references="RP3" draft="provisional">Долар СШР(цього днÑ)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>УругвайÑьке пеÑо (1975-1993)</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">УруґвайÑький пеÑо (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>УругвайÑьке пеÑо</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">УруґвайÑький пеÑо</displayName>
+ <symbol>Ur$</symbol>
+ </currency>
+ <currency type="UZS">
+ <displayName>Узбецький Ñум</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>ВенеÑуельÑький болівар</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Болівар</displayName>
+ <symbol>Be</symbol>
+ </currency>
+ <currency type="VND">
+ <displayName>ВʼєтнамÑький донг</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Донг</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>ВануатÑька вату</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Вату</displayName>
+ <symbol>VT</symbol>
+ </currency>
+ <currency type="WST">
+ <displayName>Тала Західного Самоа</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Тала</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>Франк ЦентральноафриканÑького фінанÑового товариÑтва</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">КФРфранк BEAC</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName references="RP3" draft="provisional">Срібло</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>Золото</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName references="RP3" draft="provisional">ЄвропейÑька Ñкладена валютна одиницÑ</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>ЄвропейÑька грошова одиницÑ</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ÐžÐ´Ð¸Ð½Ð¸Ñ†Ñ Ð„Ð²Ñ€Ð¾Ð¿ÐµÐ¹Ñького валютного фонду</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>ЄвропейÑька розрахункова Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>ЄвропейÑька розрахункова Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ (XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>Долар Східних Кирибів</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">СхіднокарибÑький долар</displayName>
+ <symbol>EC$</symbol>
+ </currency>
+ <currency type="XDR">
+ <displayName>Спеціальні права запозиченнÑ</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">СДР (Спеціальні права запозиченнÑ)</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>ЄвропейÑька валютна одиницÑ</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>Французький золотий франк</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Золотий франк</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>Французький франк UIC</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">UIC-франк</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>Франк ЗахідноафриканÑького фінанÑового товариÑтва</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">КФРфранк BCEAO</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName references="RP3" draft="provisional">Паладій</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>Французький тихоокеанÑький франк</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">КФП франк</displayName>
+ <symbol>CFPF</symbol>
+ </currency>
+ <currency type="XPT">
+ <displayName references="RP3" draft="provisional">Платина</displayName>
+ </currency>
+ <currency type="XRE">
+ <displayName references="RP3" draft="provisional">Фонди RINET</displayName>
+ </currency>
+ <currency type="XXX">
+ <displayName references="RP3" draft="provisional">Безвалютні операції</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>ЄменÑький динар</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>ЄменÑький ріал</displayName>
+ <symbol>YRl</symbol>
+ </currency>
+ <currency type="YUD">
+ <displayName>ЮгоÑлавÑький твердий динар</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Ðовий югоÑлавÑький динар</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>ЮгоÑлавÑький новий динар</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ЮгоÑлавÑький динар</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>ЮгоÑлавÑький конвертований динар</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ЮгоÑлавÑький динар [YUN]</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>ПівденноафриканÑький ранд [ZAL]</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">ФінанÑовий ренд [ZAL]</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>ПівденноафриканÑький ранд</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Ренд</displayName>
+ <symbol>R</symbol>
+ </currency>
+ <currency type="ZMK">
+ <displayName>Квача (ЗамбіÑ)</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>ЗаїрÑький новий заїр</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Ðовий заїр</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>ЗаїрÑький заїр</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Заїр</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>ЗімбабвійÑький долар</displayName>
+ <displayName references="RP3" alt="proposed-u174-1" draft="provisional">Долар Зімбабве</displayName>
+ <symbol>Z$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr>так:т</yesstr>
+ <nostr>ні:н</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1" uri="http://www.ukrstat.gov.ua/klasf/Derj_n.DOC">&quot;ДСТУ ISO 3166-1-2000&quot; (КЛÐСИФІКÐЦІЯ ДЕРЖÐÐ’ СВІТУ / CLASSIFICATION OF COUNTRIES)</reference>
+ <reference type="RP2" uri="http://lsrv.leonorm.com.ua/PORTAL/P/NL_DOC/UA/200501/Nak264.htm">Ðаказ Державного Комітету СтатиÑтики України від 13 вереÑÐ½Ñ 2005 року N 264 &quot;Про внеÑÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ до КлаÑифікації держав Ñвіту&quot;</reference>
+ <reference type="RP3">ДСТУ ISO 4217-2002. Коди Ð´Ð»Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð²Ð°Ð»ÑŽÑ‚ Ñ– фондів (ISO 4217 Type Currency Code List), К. : ДержкомÑтат України, 2003</reference>
+ <reference type="RP4" uri="http://www.nbuv.gov.ua/books/2002/ukrmarc/dod-a.doc">ДСТУ ISO 639-94. Коди предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð·Ð² мов: альфа-3 коди / Codes for the representation of names of languages: alpha-3 codes (ISO 639-2)</reference>
+ <reference type="RP5" uri="http://www.vlada.kiev.ua/pravopys/pravXXI/79.html">ПорÑдкові чиÑлівники. Ð’Ñ–Ð´Ð¼Ñ–Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñдкових чиÑлівників.</reference>
+ <reference type="RP6" uri="http://www.staratel.com/iso/DocSys/Doc/DSTU4163_03/DSTU.htm">ДСТУ 4163-2003. Вимоги до Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð², К.: ДержÑпоживÑтандарт України, 2003</reference>
+ <reference type="RP7" uri="http://www.logon.org/ukrainian/S/P156.htm">ЄврейÑький календар</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/uk_UA.xml b/libs/Zend/Locale/Data/uk_UA.xml
new file mode 100755
index 0000000000..c19f477e47
--- /dev/null
+++ b/libs/Zend/Locale/Data/uk_UA.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="uk"/>
+ <territory type="UA"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ur.xml b/libs/Zend/Locale/Data/ur.xml
new file mode 100755
index 0000000000..b09d5a29f7
--- /dev/null
+++ b/libs/Zend/Locale/Data/ur.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.31 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="ur"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ur">اردو</language>
+ </languages>
+ <territories>
+ <territory type="IN">بھارت</territory>
+ <territory type="PK">پاکستان</territory>
+ </territories>
+ </localeDisplayNames>
+ <layout>
+ <orientation characters="right-to-left" draft="approved"/>
+ </layout>
+ <characters>
+ <exemplarCharacters>[ء-ؤ ئ-ب ٻ پ ة-ث ٹ ٺ ټ ٽ ج چ ح-ذ ڈ ر ز ڑ ژ س-غ ٠ق ک گ ل-ن ں ه ھ و ی ے]</exemplarCharacters>
+ </characters>
+ <numbers>
+ <currencies>
+ <currency type="PKR">
+ <symbol draft="unconfirmed">Rs</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ur_IN.xml b/libs/Zend/Locale/Data/ur_IN.xml
new file mode 100755
index 0000000000..e068a7f3b1
--- /dev/null
+++ b/libs/Zend/Locale/Data/ur_IN.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="ur"/>
+ <territory type="IN"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ur_PK.xml b/libs/Zend/Locale/Data/ur_PK.xml
new file mode 100755
index 0000000000..40f7259978
--- /dev/null
+++ b/libs/Zend/Locale/Data/ur_PK.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.27 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="ur"/>
+ <territory type="PK"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/uz.xml b/libs/Zend/Locale/Data/uz.xml
new file mode 100755
index 0000000000..aae4b791a3
--- /dev/null
+++ b/libs/Zend/Locale/Data/uz.xml
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.32 $"/>
+ <generation date="$Date: 2006/06/25 00:18:38 $"/>
+ <language type="uz"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar" draft="unconfirmed">Ðрабча</language>
+ <language type="de" draft="unconfirmed">Олмонча</language>
+ <language type="en" draft="unconfirmed">Инглизча</language>
+ <language type="es" draft="unconfirmed">ИÑпанча</language>
+ <language type="fr" draft="unconfirmed">Французча</language>
+ <language type="hi" draft="unconfirmed">Ҳиндча</language>
+ <language type="it" draft="unconfirmed">ИталÑнча</language>
+ <language type="ja" draft="unconfirmed">Японча</language>
+ <language type="pt" draft="unconfirmed">Португалча</language>
+ <language type="ru" draft="unconfirmed">РуÑча</language>
+ <language type="uz" draft="unconfirmed">Ўзбек</language>
+ <language type="zh" draft="unconfirmed">Хитойча</language>
+ </languages>
+ <scripts>
+ <script type="Arab" draft="unconfirmed">Ðраб</script>
+ <script type="Cyrl" draft="unconfirmed">Кирил</script>
+ <script type="Latn" draft="unconfirmed">Лотин</script>
+ </scripts>
+ <territories>
+ <territory type="AF" draft="unconfirmed">ÐфғониÑтон</territory>
+ <territory type="BR" draft="unconfirmed">БразилиÑ</territory>
+ <territory type="CN" draft="unconfirmed">Хитой</territory>
+ <territory type="DE" draft="unconfirmed">ОлмониÑ</territory>
+ <territory type="FR" draft="unconfirmed">ФранциÑ</territory>
+ <territory type="GB" draft="unconfirmed">Бирлашган Қироллик</territory>
+ <territory type="IN" draft="unconfirmed">ҲиндиÑтон</territory>
+ <territory type="IT" draft="unconfirmed">ИталиÑ</territory>
+ <territory type="JP" draft="unconfirmed">ЯпониÑ</territory>
+ <territory type="RU" draft="unconfirmed">РоÑÑиÑ</territory>
+ <territory type="US" draft="unconfirmed">Қўшма Штатлар</territory>
+ <territory type="UZ" draft="unconfirmed">ЎзбекиÑтон</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[а-г Ò“ д е Ñ‘ ж-к Ò› л-у Ñž Ñ„ Ñ… Ò³ ч ш ÑŠ Ñ-Ñ]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[ц щ ы ь]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Янв</month>
+ <month type="2" draft="unconfirmed">Фев</month>
+ <month type="3" draft="unconfirmed">Мар</month>
+ <month type="4" draft="unconfirmed">Ðпр</month>
+ <month type="5" draft="unconfirmed">Май</month>
+ <month type="6" draft="unconfirmed">Июн</month>
+ <month type="7" draft="unconfirmed">Июл</month>
+ <month type="8" draft="unconfirmed">Ðвг</month>
+ <month type="9" draft="unconfirmed">Сен</month>
+ <month type="10" draft="unconfirmed">Окт</month>
+ <month type="11" draft="unconfirmed">ÐоÑ</month>
+ <month type="12" draft="unconfirmed">Дек</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Муҳаррам</month>
+ <month type="2" draft="unconfirmed">Сафар</month>
+ <month type="3" draft="unconfirmed">Рабиул-аввал</month>
+ <month type="4" draft="unconfirmed">Рабиул-охир</month>
+ <month type="5" draft="unconfirmed">Жумодиул-уло</month>
+ <month type="6" draft="unconfirmed">Жумодиул-ухро</month>
+ <month type="7" draft="unconfirmed">Ражаб</month>
+ <month type="8" draft="unconfirmed">Шаъбон</month>
+ <month type="9" draft="unconfirmed">Рамазон</month>
+ <month type="10" draft="unconfirmed">Шаввол</month>
+ <month type="11" draft="unconfirmed">Зил-қаъда</month>
+ <month type="12" draft="unconfirmed">Зил-ҳижжа</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">Я</month>
+ <month type="2" draft="unconfirmed">Ф</month>
+ <month type="3" draft="unconfirmed">М</month>
+ <month type="4" draft="unconfirmed">Ð</month>
+ <month type="5" draft="unconfirmed">М</month>
+ <month type="6" draft="unconfirmed">И</month>
+ <month type="7" draft="unconfirmed">И</month>
+ <month type="8" draft="unconfirmed">Ð</month>
+ <month type="9" draft="unconfirmed">С</month>
+ <month type="10" draft="unconfirmed">О</month>
+ <month type="11" draft="unconfirmed">Ð</month>
+ <month type="12" draft="unconfirmed">Д</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Якш</day>
+ <day type="mon" draft="unconfirmed">Душ</day>
+ <day type="tue" draft="unconfirmed">Сеш</day>
+ <day type="wed" draft="unconfirmed">Чор</day>
+ <day type="thu" draft="unconfirmed">Пай</day>
+ <day type="fri" draft="unconfirmed">Жум</day>
+ <day type="sat" draft="unconfirmed">Шан</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Ñкшанба</day>
+ <day type="mon" draft="unconfirmed">душанба</day>
+ <day type="tue" draft="unconfirmed">Ñешанба</day>
+ <day type="wed" draft="unconfirmed">чоршанба</day>
+ <day type="thu" draft="unconfirmed">пайшанба</day>
+ <day type="fri" draft="unconfirmed">жума</day>
+ <day type="sat" draft="unconfirmed">шанба</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">Я</day>
+ <day type="mon" draft="unconfirmed">Д</day>
+ <day type="tue" draft="unconfirmed">С</day>
+ <day type="wed" draft="unconfirmed">Ч</day>
+ <day type="thu" draft="unconfirmed">П</day>
+ <day type="fri" draft="unconfirmed">Ж</day>
+ <day type="sat" draft="unconfirmed">Ш</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Asia/Kabul">
+ <long>
+ <standard draft="unconfirmed">اÙغانستان وقتی</standard>
+ <daylight draft="unconfirmed">اÙغانستان وقتی</daylight>
+ </long>
+ <short>
+ <standard draft="unconfirmed">AFT</standard>
+ <daylight draft="unconfirmed">AFT</daylight>
+ </short>
+ <exemplarCity>کابل</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal draft="unconfirmed">,</decimal>
+ <group draft="unconfirmed"> </group>
+ </symbols>
+ <currencies>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">Бразил реали</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="unconfirmed">Хитой юани</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="unconfirmed">Евро</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">Инглиз фунт Ñтерлинги</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">Ҳинд рупиÑÑи</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="unconfirmed">Япон йенаÑи</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">Ð ÑƒÑ Ñ€ÑƒÐ±Ð»Ð¸</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">ÐҚШ доллари</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName draft="unconfirmed">ЎзбекиÑтон Ñўм</displayName>
+ <symbol draft="unconfirmed">Ñўм</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/uz_AF.xml b/libs/Zend/Locale/Data/uz_AF.xml
new file mode 100755
index 0000000000..d60eb86049
--- /dev/null
+++ b/libs/Zend/Locale/Data/uz_AF.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.31 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="uz"/>
+ <territory type="AF"/>
+ </identity>
+ <alias source="uz_Arab_AF" path="//ldml" draft="unconfirmed"/>
+</ldml>
diff --git a/libs/Zend/Locale/Data/uz_Arab.xml b/libs/Zend/Locale/Data/uz_Arab.xml
new file mode 100755
index 0000000000..8ab036da92
--- /dev/null
+++ b/libs/Zend/Locale/Data/uz_Arab.xml
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.16 $"/>
+ <generation date="$Date: 2006/06/28 01:23:34 $"/>
+ <language type="uz"/>
+ <script type="Arab"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="fa">دری</language>
+ <language type="ps">پشتو</language>
+ <language type="uz">اۉزبÛÚ©</language>
+ </languages>
+ <territories>
+ <territory type="AF">اÙغانستان</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[Ù‹-Ù’ Ù” Ù° Ø¡-ؤ ئ-ب Ù¾ Ø©-Ø« Ù¼ ج Ú† Ø­ Ø® Ú Ú… د Ø° Ú‰ ر ز Ú“ Ú– Ú˜ س Ø´ Úš ص-غ Ù Ù‚ Ú© Ú« Ú¯ Ù„-Ù† Ú¼ Ù‡ Ùˆ Û‡ Û‰ ÙŠ ÛŒ Û Û]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[\u200C \u200D]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">جنو</month>
+ <month type="2" draft="unconfirmed">Ùبر</month>
+ <month type="3" draft="unconfirmed">مار</month>
+ <month type="4" draft="unconfirmed">اپر</month>
+ <month type="5" draft="unconfirmed">مـی</month>
+ <month type="6" draft="unconfirmed">جون</month>
+ <month type="7" draft="unconfirmed">جول</month>
+ <month type="8" draft="unconfirmed">اگس</month>
+ <month type="9" draft="unconfirmed">سپت</month>
+ <month type="10" draft="unconfirmed">اکت</month>
+ <month type="11" draft="unconfirmed">نوم</month>
+ <month type="12" draft="unconfirmed">دسم</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">جنوری</month>
+ <month type="2" draft="unconfirmed">Ùبروری</month>
+ <month type="3" draft="unconfirmed">مارچ</month>
+ <month type="4" draft="unconfirmed">اپریل</month>
+ <month type="5" draft="unconfirmed">می</month>
+ <month type="6" draft="unconfirmed">جون</month>
+ <month type="7" draft="unconfirmed">جولای</month>
+ <month type="8" draft="unconfirmed">اگست</month>
+ <month type="9" draft="unconfirmed">سپتمبر</month>
+ <month type="10" draft="unconfirmed">اکتوبر</month>
+ <month type="11" draft="unconfirmed">نومبر</month>
+ <month type="12" draft="unconfirmed">دسمبر</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">ی.</day>
+ <day type="mon" draft="unconfirmed">د.</day>
+ <day type="tue" draft="unconfirmed">س.</day>
+ <day type="wed" draft="unconfirmed">Ú†.</day>
+ <day type="thu" draft="unconfirmed">Ù¾.</day>
+ <day type="fri" draft="unconfirmed">ج.</day>
+ <day type="sat" draft="unconfirmed">Ø´.</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">یکشنبه</day>
+ <day type="mon" draft="unconfirmed">دوشنبه</day>
+ <day type="tue" draft="unconfirmed">سه‌شنبه</day>
+ <day type="wed" draft="unconfirmed">چهارشنبه</day>
+ <day type="thu" draft="unconfirmed">پنجشنبه</day>
+ <day type="fri" draft="unconfirmed">جمعه</day>
+ <day type="sat" draft="unconfirmed">شنبه</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">Ù‚.Ù….</era>
+ <era type="1" draft="unconfirmed">Ù….</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">yyyy نچی ییل d نچی MMMM EEEE کونی</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">d نچی MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">d MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">yyyy/M/d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">H:mm:ss (z)</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">H:mm:ss (z)</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMd" draft="provisional">d نچی MMMM</dateFormatItem>
+ <dateFormatItem id="Md" draft="provisional">M/d</dateFormatItem>
+ <dateFormatItem id="mmss" draft="provisional">mm:ss</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">yyyy/M</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>Ù«</decimal>
+ <group>Ù¬</group>
+ <percentSign>Ùª</percentSign>
+ <nativeZeroDigit>Û°</nativeZeroDigit>
+ <minusSign>−</minusSign>
+ <exponential>×۱۰^</exponential>
+ </symbols>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="AFN">
+ <displayName>اÙغانی</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/uz_Arab_AF.xml b/libs/Zend/Locale/Data/uz_Arab_AF.xml
new file mode 100755
index 0000000000..44ca21d104
--- /dev/null
+++ b/libs/Zend/Locale/Data/uz_Arab_AF.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.14 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="uz"/>
+ <script type="Arab"/>
+ <territory type="AF"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/uz_Cyrl.xml b/libs/Zend/Locale/Data/uz_Cyrl.xml
new file mode 100755
index 0000000000..e5ebd52567
--- /dev/null
+++ b/libs/Zend/Locale/Data/uz_Cyrl.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.14 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="uz"/>
+ <script type="Cyrl"/>
+ </identity>
+</ldml>
diff --git a/libs/Zend/Locale/Data/uz_Cyrl_UZ.xml b/libs/Zend/Locale/Data/uz_Cyrl_UZ.xml
new file mode 100755
index 0000000000..6f0588dff2
--- /dev/null
+++ b/libs/Zend/Locale/Data/uz_Cyrl_UZ.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.13 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="uz"/>
+ <script type="Cyrl"/>
+ <territory type="UZ"/>
+ </identity>
+</ldml>
diff --git a/libs/Zend/Locale/Data/uz_Latn.xml b/libs/Zend/Locale/Data/uz_Latn.xml
new file mode 100755
index 0000000000..328483d8bf
--- /dev/null
+++ b/libs/Zend/Locale/Data/uz_Latn.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.13 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="uz"/>
+ <script type="Latn"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar" draft="unconfirmed">Arabcha</language>
+ <language type="de" draft="unconfirmed">Olmoncha</language>
+ <language type="en" draft="unconfirmed">Inglizcha</language>
+ <language type="es" draft="unconfirmed">Ispancha</language>
+ <language type="fr" draft="unconfirmed">Frantsuzcha</language>
+ <language type="hi" draft="unconfirmed">Hindcha</language>
+ <language type="it" draft="unconfirmed">Italyancha</language>
+ <language type="ja" draft="unconfirmed">Yaponcha</language>
+ <language type="pt" draft="unconfirmed">Portugalcha</language>
+ <language type="ru" draft="unconfirmed">Ruscha</language>
+ <language type="uz" draft="unconfirmed">oʿzbek</language>
+ <language type="zh" draft="unconfirmed">Xitoycha</language>
+ </languages>
+ <scripts>
+ <script type="Cyrl" draft="unconfirmed">Kiril</script>
+ <script type="Latn" draft="unconfirmed">Lotin</script>
+ </scripts>
+ <territories>
+ <territory type="AF" draft="unconfirmed">Afgʿoniston</territory>
+ <territory type="BR" draft="unconfirmed">Braziliya</territory>
+ <territory type="CN" draft="unconfirmed">Xitoy</territory>
+ <territory type="DE" draft="unconfirmed">Olmoniya</territory>
+ <territory type="FR" draft="unconfirmed">Frantsiya</territory>
+ <territory type="GB" draft="unconfirmed">Birlashgan Qirollik</territory>
+ <territory type="IN" draft="unconfirmed">Hindiston</territory>
+ <territory type="IT" draft="unconfirmed">Italiya</territory>
+ <territory type="JP" draft="unconfirmed">Yaponiya</territory>
+ <territory type="RU" draft="unconfirmed">Rossiya</territory>
+ <territory type="US" draft="unconfirmed">Qo'shma Shtatlar</territory>
+ <territory type="UZ" draft="unconfirmed">OÊ¿zbekiston</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[a-v x-z Ê¿]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Yanv</month>
+ <month type="2" draft="unconfirmed">Fev</month>
+ <month type="3" draft="unconfirmed">Mar</month>
+ <month type="4" draft="unconfirmed">Apr</month>
+ <month type="5" draft="unconfirmed">May</month>
+ <month type="6" draft="unconfirmed">Iyun</month>
+ <month type="7" draft="unconfirmed">Iyul</month>
+ <month type="8" draft="unconfirmed">Avg</month>
+ <month type="9" draft="unconfirmed">Sen</month>
+ <month type="10" draft="unconfirmed">Okt</month>
+ <month type="11" draft="unconfirmed">Noya</month>
+ <month type="12" draft="unconfirmed">Dek</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Muharram</month>
+ <month type="2" draft="unconfirmed">Safar</month>
+ <month type="3" draft="unconfirmed">Rabiul-avval</month>
+ <month type="4" draft="unconfirmed">Rabiul-oxir</month>
+ <month type="5" draft="unconfirmed">Jumodiul-ulo</month>
+ <month type="6" draft="unconfirmed">Jumodiul-uxro</month>
+ <month type="7" draft="unconfirmed">Rajab</month>
+ <month type="8" draft="unconfirmed">Shaʿbon</month>
+ <month type="9" draft="unconfirmed">Ramazon</month>
+ <month type="10" draft="unconfirmed">Shavvol</month>
+ <month type="11" draft="unconfirmed">Zil-qaʿda</month>
+ <month type="12" draft="unconfirmed">Zil-hijja</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">Y</month>
+ <month type="2" draft="unconfirmed">F</month>
+ <month type="3" draft="unconfirmed">M</month>
+ <month type="4" draft="unconfirmed">A</month>
+ <month type="5" draft="unconfirmed">M</month>
+ <month type="6" draft="unconfirmed">I</month>
+ <month type="7" draft="unconfirmed">I</month>
+ <month type="8" draft="unconfirmed">A</month>
+ <month type="9" draft="unconfirmed">S</month>
+ <month type="10" draft="unconfirmed">O</month>
+ <month type="11" draft="unconfirmed">N</month>
+ <month type="12" draft="unconfirmed">D</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Yaksh</day>
+ <day type="mon" draft="unconfirmed">Dush</day>
+ <day type="tue" draft="unconfirmed">Sesh</day>
+ <day type="wed" draft="unconfirmed">Chor</day>
+ <day type="thu" draft="unconfirmed">Pay</day>
+ <day type="fri" draft="unconfirmed">Jum</day>
+ <day type="sat" draft="unconfirmed">Shan</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">yakshanba</day>
+ <day type="mon" draft="unconfirmed">dushanba</day>
+ <day type="tue" draft="unconfirmed">seshanba</day>
+ <day type="wed" draft="unconfirmed">chorshanba</day>
+ <day type="thu" draft="unconfirmed">payshanba</day>
+ <day type="fri" draft="unconfirmed">juma</day>
+ <day type="sat" draft="unconfirmed">shanba</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">Y</day>
+ <day type="mon" draft="unconfirmed">D</day>
+ <day type="tue" draft="unconfirmed">S</day>
+ <day type="wed" draft="unconfirmed">C</day>
+ <day type="thu" draft="unconfirmed">P</day>
+ <day type="fri" draft="unconfirmed">J</day>
+ <day type="sat" draft="unconfirmed">Sh</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">Brazil reali</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="unconfirmed">Xitoy yuani</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="unconfirmed">Evro</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">Ingliz funt sterlingi</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">Hind rupiyasi</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="unconfirmed">Yapon yenasi</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">Rus rubli</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">AQSH dollari</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName draft="unconfirmed">Oʿzbekiston soʿm</displayName>
+ <symbol draft="unconfirmed">soʿm</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/uz_Latn_UZ.xml b/libs/Zend/Locale/Data/uz_Latn_UZ.xml
new file mode 100755
index 0000000000..ea2649fe77
--- /dev/null
+++ b/libs/Zend/Locale/Data/uz_Latn_UZ.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.13 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="uz"/>
+ <script type="Latn"/>
+ <territory type="UZ"/>
+ </identity>
+</ldml>
diff --git a/libs/Zend/Locale/Data/uz_UZ.xml b/libs/Zend/Locale/Data/uz_UZ.xml
new file mode 100755
index 0000000000..c8337aac02
--- /dev/null
+++ b/libs/Zend/Locale/Data/uz_UZ.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.28 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="uz"/>
+ <territory type="UZ"/>
+ </identity>
+ <alias source="uz_Cyrl_UZ" path="//ldml" draft="unconfirmed"/>
+</ldml>
diff --git a/libs/Zend/Locale/Data/ve.xml b/libs/Zend/Locale/Data/ve.xml
new file mode 100755
index 0000000000..b5ae67777a
--- /dev/null
+++ b/libs/Zend/Locale/Data/ve.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.12 $"/>
+ <generation date="$Date: 2006/06/29 15:44:38 $"/>
+ <language type="ve"/>
+ </identity>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[a b d-i k l ḽ m n ṅ ṋ o p r-t ṱ u-z]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary" draft="unconfirmed">[c j q]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Pha</month>
+ <month type="2" draft="unconfirmed">Luh</month>
+ <month type="3" draft="unconfirmed">á¹°ha</month>
+ <month type="4" draft="unconfirmed">Lam</month>
+ <month type="5" draft="unconfirmed">Shu</month>
+ <month type="6" draft="unconfirmed">Lwi</month>
+ <month type="7" draft="unconfirmed">Lwa</month>
+ <month type="8" draft="unconfirmed">á¹°ha</month>
+ <month type="9" draft="unconfirmed">Khu</month>
+ <month type="10" draft="unconfirmed">Tsh</month>
+ <month type="11" draft="unconfirmed">Ḽar</month>
+ <month type="12" draft="unconfirmed">Nye</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Phando</month>
+ <month type="2" draft="unconfirmed">Luhuhi</month>
+ <month type="3" draft="unconfirmed">á¹°hafamuhwe</month>
+ <month type="4" draft="unconfirmed">Lambamai</month>
+ <month type="5" draft="unconfirmed">Shundunthule</month>
+ <month type="6" draft="unconfirmed">Fulwi</month>
+ <month type="7" draft="unconfirmed">Fulwana</month>
+ <month type="8" draft="unconfirmed">á¹°hangule</month>
+ <month type="9" draft="unconfirmed">Khubvumedzi</month>
+ <month type="10" draft="unconfirmed">Tshimedzi</month>
+ <month type="11" draft="unconfirmed">Ḽara</month>
+ <month type="12" draft="unconfirmed">Nyendavhusiku</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Swo</day>
+ <day type="mon" draft="unconfirmed">Mus</day>
+ <day type="tue" draft="unconfirmed">Vhi</day>
+ <day type="wed" draft="unconfirmed">Rar</day>
+ <day type="thu" draft="unconfirmed">Ṋa</day>
+ <day type="fri" draft="unconfirmed">á¹°an</day>
+ <day type="sat" draft="unconfirmed">Mug</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Swondaha</day>
+ <day type="mon" draft="unconfirmed">Musumbuluwo</day>
+ <day type="tue" draft="unconfirmed">Ḽavhuvhili</day>
+ <day type="wed" draft="unconfirmed">Ḽavhuraru</day>
+ <day type="thu" draft="unconfirmed">Ḽavhuṋa</day>
+ <day type="fri" draft="unconfirmed">Ḽavhuṱanu</day>
+ <day type="sat" draft="unconfirmed">Mugivhela</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">K1</quarter>
+ <quarter type="2" draft="unconfirmed">K2</quarter>
+ <quarter type="3" draft="unconfirmed">K3</quarter>
+ <quarter type="4" draft="unconfirmed">K4</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">Kotara ya u thoma</quarter>
+ <quarter type="2" draft="unconfirmed">Kotara ya vhuvhili</quarter>
+ <quarter type="3" draft="unconfirmed">Kotara ya vhuraru</quarter>
+ <quarter type="4" draft="unconfirmed">Kotara ya vhuṋa</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ZAR">
+ <symbol draft="unconfirmed">R</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/ve_ZA.xml b/libs/Zend/Locale/Data/ve_ZA.xml
new file mode 100755
index 0000000000..b94831f5d5
--- /dev/null
+++ b/libs/Zend/Locale/Data/ve_ZA.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="ve"/>
+ <territory type="ZA"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/vi.xml b/libs/Zend/Locale/Data/vi.xml
new file mode 100755
index 0000000000..97227e2e05
--- /dev/null
+++ b/libs/Zend/Locale/Data/vi.xml
@@ -0,0 +1,390 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.50 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="vi"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar">Tiếng A-rập</language>
+ <language type="az">Tiếng Ai-déc-bai-gian</language>
+ <language type="be">Tiếng Bê-la-rút</language>
+ <language type="bg">Tiếng Bun-ga-ri</language>
+ <language type="bo">Tiếng Tây Tạng</language>
+ <language type="ca">Tiếng Ca-ta-lăng</language>
+ <language type="cs">Tiếng Séc</language>
+ <language type="da">Tiếng Äan Mạch</language>
+ <language type="de">Tiếng Äức</language>
+ <language type="el">Tiếng Hy Lạp</language>
+ <language type="en">Tiếng Anh</language>
+ <language type="eo">Tiếng Quốc Tế Ngữ</language>
+ <language type="es">Tiếng Tây Ban Nha</language>
+ <language type="et">Tiếng E-xtô-ni-a</language>
+ <language type="fa">Tiếng Ba Tư</language>
+ <language type="fi">Tiếng Phần Lan</language>
+ <language type="fr">Tiếng Pháp</language>
+ <language type="ga">Tiếng Ai-len</language>
+ <language type="he">Tiếng Hê-brơ</language>
+ <language type="hi">Tiếng Hin-đi</language>
+ <language type="hr">Tiếng Crô-a-ti-a</language>
+ <language type="hu">Tiếng Hung-ga-ri</language>
+ <language type="hy">Tiếng Ãc-mê-ni</language>
+ <language type="ia">Tiếng Khoa Há»c Quốc Tế</language>
+ <language type="id">Tiếng In-đô-nê-xia</language>
+ <language type="is">Tiếng Ai-xơ-len</language>
+ <language type="it">Tiếng Ã</language>
+ <language type="ja">Tiếng Nhật</language>
+ <language type="jv">Tiếng Gia-va</language>
+ <language type="km">Tiếng Campuchia</language>
+ <language type="kn">Tiếng Kan-na-đa</language>
+ <language type="ko">Tiếng Hàn Quốc</language>
+ <language type="la">Tiếng La-tinh</language>
+ <language type="lo">Tiếng Lào</language>
+ <language type="lt">Tiếng Lít-va</language>
+ <language type="lv">Tiếng Lát-vi-a</language>
+ <language type="mk">Tiếng Ma-xê-đô-ni-a</language>
+ <language type="mn">Tiếng Mông Cổ</language>
+ <language type="ms">Tiếng Ma-lay-xi-a</language>
+ <language type="ne">Tiếng Nê-pan</language>
+ <language type="nl">Tiếng Hà Lan</language>
+ <language type="no">Tiếng Na Uy</language>
+ <language type="pl">Tiếng Ba Lan</language>
+ <language type="pt">Tiếng Bồ Äào Nha</language>
+ <language type="ro">Tiếng Ru-ma-ni</language>
+ <language type="ru">Tiếng Nga</language>
+ <language type="sa">Tiếng Phạn</language>
+ <language type="sk">Tiếng Xlô-vác</language>
+ <language type="sl">Tiếng Xlô-ven</language>
+ <language type="so">Tiếng Xô-ma-li</language>
+ <language type="sq">Tiếng An-ba-ni</language>
+ <language type="sr">Tiếng Séc-bi</language>
+ <language type="sv">Tiếng Thụy Äiển</language>
+ <language type="th">Tiếng Thái</language>
+ <language type="tr">Tiếng Thổ Nhĩ Kỳ</language>
+ <language type="uk">Tiếng U-crai-na</language>
+ <language type="uz">Tiếng U-dơ-bếch</language>
+ <language type="vi">Tiếng Việt</language>
+ <language type="yi">Tiếng Y-đit</language>
+ <language type="zh">Tiếng Trung Quốc</language>
+ </languages>
+ <territories>
+ <territory type="AE">Các Tiểu Vương quốc A-rập Thống nhất</territory>
+ <territory type="AF">Ãp-ga-ni-xtan</territory>
+ <territory type="AG">An-ti-gu-a và Ba-bu-đa</territory>
+ <territory type="AL">An-ba-ni</territory>
+ <territory type="AM">Ãc-mê-ni-a</territory>
+ <territory type="AO">Ăng-gô-la</territory>
+ <territory type="AR">Ãc-hen-ti-na</territory>
+ <territory type="AT">Ão</territory>
+ <territory type="AU">Úc</territory>
+ <territory type="AZ">Ai-déc-bai-gian</territory>
+ <territory type="BA">Bô-xni-a Héc-xê-gô-vi-na</territory>
+ <territory type="BB">Bác-ba-đốt</territory>
+ <territory type="BD">Băng-la-đét</territory>
+ <territory type="BE">Bỉ</territory>
+ <territory type="BF">Buốc-ki-na Pha-xô</territory>
+ <territory type="BG">Bun-ga-ri</territory>
+ <territory type="BH">Ba-ren</territory>
+ <territory type="BI">Bu-run-Ä‘i</territory>
+ <territory type="BJ">Bê-nanh</territory>
+ <territory type="BN">Bru-nây</territory>
+ <territory type="BO">Bô-li-vi-a</territory>
+ <territory type="BR">Bra-xin</territory>
+ <territory type="BS">Ba-ha-ma</territory>
+ <territory type="BW">Bốt-xoa-na</territory>
+ <territory type="BY">Bê-la-rút</territory>
+ <territory type="BZ">Bê-li-xê</territory>
+ <territory type="CA">Ca-na-Ä‘a</territory>
+ <territory type="CF">Cộng hòa Trung Phi</territory>
+ <territory type="CG">Công-gô</territory>
+ <territory type="CH">Thụy Sĩ</territory>
+ <territory type="CI">BỠBiển Ngà</territory>
+ <territory type="CL">Chi-lê</territory>
+ <territory type="CM">Ca-mơ-run</territory>
+ <territory type="CN">Trung Quốc</territory>
+ <territory type="CO">Cô-lôm-bi-a</territory>
+ <territory type="CR">Cốt-xta Ri-ca</territory>
+ <territory type="CS">Séc-bia</territory>
+ <territory type="CU">Cu Ba</territory>
+ <territory type="CV">Cáp-ve</territory>
+ <territory type="CY">Síp</territory>
+ <territory type="CZ">Cộng hòa Séc</territory>
+ <territory type="DE">Äức</territory>
+ <territory type="DJ">Gi-bu-ti</territory>
+ <territory type="DK">Äan Mạch</territory>
+ <territory type="DZ">An-giê-ri</territory>
+ <territory type="EC">Ê-cu-a-đo</territory>
+ <territory type="EE">E-xtô-ni-a</territory>
+ <territory type="EG">Ai Cập</territory>
+ <territory type="EH">Tây Sahara</territory>
+ <territory type="ER">Ê-ri-tơ-rê-a</territory>
+ <territory type="ES">Tây Ban Nha</territory>
+ <territory type="ET">Ê-ti-ô-pi-a</territory>
+ <territory type="FI">Phần Lan</territory>
+ <territory type="FJ">Phi-gi</territory>
+ <territory type="FM">Mi-crô-nê-xi-a</territory>
+ <territory type="FR">Pháp</territory>
+ <territory type="GA">Ga-bông</territory>
+ <territory type="GB">Vương quốc Anh</territory>
+ <territory type="GD">Grê-na-đa</territory>
+ <territory type="GE">Gru-di-a</territory>
+ <territory type="GH">Gha-na</territory>
+ <territory type="GM">Găm-bi-a</territory>
+ <territory type="GN">Ghi-nê</territory>
+ <territory type="GQ">Ghi-nê Xích-đạo</territory>
+ <territory type="GR">Hy Lạp</territory>
+ <territory type="GT">Goa-tê-ma-la</territory>
+ <territory type="GW">Ghi-nê Bít-xao</territory>
+ <territory type="GY">Guy-a-na</territory>
+ <territory type="HN">Hôn-đu-rát</territory>
+ <territory type="HR">Crô-a-ti-a</territory>
+ <territory type="HT">Ha-i-ti</territory>
+ <territory type="HU">Hung-ga-ri</territory>
+ <territory type="ID">Nam DÆ°Æ¡ng</territory>
+ <territory type="IE">Ai-len</territory>
+ <territory type="IL">I-xra-en</territory>
+ <territory type="IN">Ấn Äá»™</territory>
+ <territory type="IQ">I-rắc</territory>
+ <territory type="IR">I-ran</territory>
+ <territory type="IS">Ai-xơ-len</territory>
+ <territory type="IT">Ã</territory>
+ <territory type="JM">Ha-mai-ca</territory>
+ <territory type="JO">Gióc-đa-ni</territory>
+ <territory type="JP">Nhật Bản</territory>
+ <territory type="KE">Kê-ni-a</territory>
+ <territory type="KG">Cư-rơ-gư-xtan</territory>
+ <territory type="KH">Campuchia</territory>
+ <territory type="KI">Ki-ri-ba-ti</territory>
+ <territory type="KM">Cô-mô</territory>
+ <territory type="KN">Xan-kít và Nê-vi</territory>
+ <territory type="KP">Bắc Triá»u Tiên</territory>
+ <territory type="KR">Hàn Quốc</territory>
+ <territory type="KW">Cô-oét</territory>
+ <territory type="KZ">Ka-dắc-xtan</territory>
+ <territory type="LA">Lào</territory>
+ <territory type="LB">Li-băng</territory>
+ <territory type="LC">Xan Lu-xi</territory>
+ <territory type="LI">Lich-ten-xtên</territory>
+ <territory type="LK">Xri Lan-ca</territory>
+ <territory type="LR">Li-bê-ri-a</territory>
+ <territory type="LS">Lê-xô-thô</territory>
+ <territory type="LT">Li-tu-a-ni-a</territory>
+ <territory type="LU">Lúc-xăm-bua</territory>
+ <territory type="LV">Lát-vi-a</territory>
+ <territory type="LY">Li-bi</territory>
+ <territory type="MA">Ma-rốc</territory>
+ <territory type="MC">Mô-na-cô</territory>
+ <territory type="MD">Môn-đô-va</territory>
+ <territory type="MG">Ma-đa-gát-xca</territory>
+ <territory type="MH">Quần đảo Mác-san</territory>
+ <territory type="MK">Ma-xê-đô-ni-a</territory>
+ <territory type="ML">Ma-li</territory>
+ <territory type="MM">Mi-an-ma</territory>
+ <territory type="MN">Mông Cổ</territory>
+ <territory type="MR">Mô-ri-ta-ni</territory>
+ <territory type="MT">Man-ta</territory>
+ <territory type="MU">Mô-ri-xơ</territory>
+ <territory type="MV">Man-đi-vơ</territory>
+ <territory type="MW">Ma-la-uy</territory>
+ <territory type="MX">Mê-hi-cô</territory>
+ <territory type="MY">Ma-lay-xi-a</territory>
+ <territory type="MZ">Mô-dăm-bích</territory>
+ <territory type="NA">Nam-mi-bi-a</territory>
+ <territory type="NE">Ni-giê</territory>
+ <territory type="NG">Ni-giê-ri-a</territory>
+ <territory type="NI">Ni-ca-ra-goa</territory>
+ <territory type="NL">Hà Lan</territory>
+ <territory type="NO">Na Uy</territory>
+ <territory type="NP">Nê-pan</territory>
+ <territory type="NZ">Niu Di-lân</territory>
+ <territory type="OM">Ô-man</territory>
+ <territory type="PA">Pa-na-ma</territory>
+ <territory type="PE">Pê-ru</territory>
+ <territory type="PG">Pa-pu-a Niu Ghi-nê</territory>
+ <territory type="PH">Phi-lip-pin</territory>
+ <territory type="PK">Pa-ki-xtan</territory>
+ <territory type="PL">Ba Lan</territory>
+ <territory type="PT">Bồ Äào Nha</territory>
+ <territory type="PY">Pa-ra-goay</territory>
+ <territory type="QA">Ca-ta</territory>
+ <territory type="RO">Ru-ma-ni</territory>
+ <territory type="RU">Nga</territory>
+ <territory type="RW">Ru-an-Ä‘a</territory>
+ <territory type="SA">A-rập Xê-út</territory>
+ <territory type="SB">Quần đảo Xô-lô-mông</territory>
+ <territory type="SC">Xây-sen</territory>
+ <territory type="SD">Xu-đăng</territory>
+ <territory type="SE">Thụy Äiển</territory>
+ <territory type="SG">Xin-ga-po</territory>
+ <territory type="SI">Xlô-ven-ni-a</territory>
+ <territory type="SK">Xlô-va-ki-a</territory>
+ <territory type="SL">Xi-ê-ra Lê-ôn</territory>
+ <territory type="SM">Xan Ma-ri-nô</territory>
+ <territory type="SN">Xê-nê-gan</territory>
+ <territory type="SO">Xô-ma-li</territory>
+ <territory type="SR">Xu-ri-nam</territory>
+ <territory type="ST">Xao Tô-mê và Prin-xi-pê</territory>
+ <territory type="SV">En-san-va-Ä‘o</territory>
+ <territory type="SY">Xi-ri</territory>
+ <territory type="SZ">Xoa-di-len</territory>
+ <territory type="TD">Sát</territory>
+ <territory type="TG">Tô-gô</territory>
+ <territory type="TH">Thái Lan</territory>
+ <territory type="TJ">Tát-gi-ki-xtan</territory>
+ <territory type="TM">Tuốc-mê-ni-xtan</territory>
+ <territory type="TN">Tuy-ni-di</territory>
+ <territory type="TO">Tông-ga</territory>
+ <territory type="TR">Thổ Nhĩ Kỳ</territory>
+ <territory type="TT">Tri-ni-đát và Tô-ba-gô</territory>
+ <territory type="TV">Tu-va-lu</territory>
+ <territory type="TW">Äài Loan</territory>
+ <territory type="TZ">Tan-da-ni-a</territory>
+ <territory type="UA">U-crai-na</territory>
+ <territory type="UG">U-gan-Ä‘a</territory>
+ <territory type="US">Hoa Kỳ</territory>
+ <territory type="UY">U-ru-goay</territory>
+ <territory type="UZ">U-dơ-bê-ki-xtan</territory>
+ <territory type="VA">Va-ti-căng</territory>
+ <territory type="VC">Xan Vin-xen và Grê-na-din</territory>
+ <territory type="VE">Vê-nê-zu-ê-la</territory>
+ <territory type="VN">Việt Nam</territory>
+ <territory type="VU">Va-nu-a-tu</territory>
+ <territory type="WS">Xa-moa</territory>
+ <territory type="YE">Y-ê-men</territory>
+ <territory type="ZA">Nam Phi</territory>
+ <territory type="ZM">Dăm-bi-a</territory>
+ <territory type="ZW">Dim-ba-bu-ê</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[a à ả ã á ạ ă ằ ẳ ẵ ắ ặ â ầ ẩ ẫ ấ ậ b-d đ e è ẻ ẽ é ẹ ê Ỡể ễ ế ệ f-i ì ỉ ĩ í ị j-o ò Ỡõ ó Ỡô ồ ổ ỗ ố ộ ơ Ỡở ỡ ớ ợ p-u ù ủ ũ ú ụ ư ừ ử ữ ứ ự v-y ỳ ỷ ỹ ý ỵ z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">thg 1</month>
+ <month type="2">thg 2</month>
+ <month type="3">thg 3</month>
+ <month type="4">thg 4</month>
+ <month type="5">thg 5</month>
+ <month type="6">thg 6</month>
+ <month type="7">thg 7</month>
+ <month type="8">thg 8</month>
+ <month type="9">thg 9</month>
+ <month type="10">thg 10</month>
+ <month type="11">thg 11</month>
+ <month type="12">thg 12</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">tháng một</month>
+ <month type="2">tháng hai</month>
+ <month type="3">tháng ba</month>
+ <month type="4">tháng tư</month>
+ <month type="5">tháng năm</month>
+ <month type="6">tháng sáu</month>
+ <month type="7">tháng bảy</month>
+ <month type="8">tháng tám</month>
+ <month type="9">tháng chín</month>
+ <month type="10">tháng mÆ°á»i</month>
+ <month type="11">tháng mÆ°á»i má»™t</month>
+ <month type="12">tháng mÆ°á»i hai</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">CN</day>
+ <day type="mon">Th 2</day>
+ <day type="tue">Th 3</day>
+ <day type="wed">Th 4</day>
+ <day type="thu">Th 5</day>
+ <day type="fri">Th 6</day>
+ <day type="sat">Th 7</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">Chủ nhật</day>
+ <day type="mon">Thứ hai</day>
+ <day type="tue">Thứ ba</day>
+ <day type="wed">Thứ tư</day>
+ <day type="thu">Thứ năm</day>
+ <day type="fri">Thứ sáu</day>
+ <day type="sat">Thứ bảy</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am>SA</am>
+ <pm>CH</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0">tr. CN</era>
+ <era type="1">sau CN</era>
+ </eraAbbr>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>EEEE, 'ngày' dd MMMM 'năm' yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>'Ngày' dd 'tháng' M 'năm' yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <dateTimeFormats>
+ <dateTimeFormatLength>
+ <dateTimeFormat>
+ <pattern>{0} {1}</pattern>
+ </dateTimeFormat>
+ </dateTimeFormatLength>
+ <availableFormats>
+ <dateFormatItem id="MMdd" draft="provisional">dd-MM</dateFormatItem>
+ <dateFormatItem id="yyyyMM" draft="provisional">MM-yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal>,</decimal>
+ <group>.</group>
+ </symbols>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>#,##0.00 ¤</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="VND">
+ <displayName>đồng</displayName>
+ <symbol>Ä‘</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">Ñó:co:c</yesstr>
+ <nostr draft="unconfirmed">không:khong:k</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/libs/Zend/Locale/Data/vi_VN.xml b/libs/Zend/Locale/Data/vi_VN.xml
new file mode 100755
index 0000000000..82d9d8aa9f
--- /dev/null
+++ b/libs/Zend/Locale/Data/vi_VN.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.33 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="vi"/>
+ <territory type="VN"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/wal.xml b/libs/Zend/Locale/Data/wal.xml
new file mode 100755
index 0000000000..d33d85b02e
--- /dev/null
+++ b/libs/Zend/Locale/Data/wal.xml
@@ -0,0 +1,294 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/27 18:46:54 $"/>
+ <language type="wal"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ar" draft="unconfirmed">á‹áˆ­á‰¢áŠ›</language>
+ <language type="de" draft="unconfirmed">ጀርመን</language>
+ <language type="en" draft="unconfirmed">እንáŒáˆŠá‹áŠ›</language>
+ <language type="es" draft="unconfirmed">ስá“ኒሽ</language>
+ <language type="fr" draft="unconfirmed">áˆáˆ¨áŠ•áˆ³á‹­áŠ›</language>
+ <language type="hi" draft="unconfirmed">áˆáŠ•á‹µáŠ›</language>
+ <language type="it" draft="unconfirmed">ጣሊያንኛ</language>
+ <language type="ja" draft="unconfirmed">ጃá“ንኛ</language>
+ <language type="pt" draft="unconfirmed">á–ርቱጋሊኛ</language>
+ <language type="ru" draft="unconfirmed">ራሽኛ</language>
+ <language type="wal" draft="unconfirmed">ወላይታቱ</language>
+ <language type="zh" draft="unconfirmed">ቻይንኛ</language>
+ </languages>
+ <scripts>
+ <script type="Latn" draft="unconfirmed">ላቲን</script>
+ </scripts>
+ <territories>
+ <territory type="AD" draft="unconfirmed">አንዶራ</territory>
+ <territory type="AE" draft="unconfirmed">የተባበሩት አረብ ኤáˆáˆ¬á‰µáˆµ</territory>
+ <territory type="AL" draft="unconfirmed">አáˆá‰£áŠ’á‹«</territory>
+ <territory type="AM" draft="unconfirmed">አርሜኒያ</territory>
+ <territory type="AN" draft="unconfirmed">ኔዘርላንድስ አንቲáˆáˆµ</territory>
+ <territory type="AR" draft="unconfirmed">አርጀንቲና</territory>
+ <territory type="AT" draft="unconfirmed">ኦስትሪያ</territory>
+ <territory type="AU" draft="unconfirmed">አá‹áˆµá‰µáˆ¬áˆŠá‹«</territory>
+ <territory type="AZ" draft="unconfirmed">አዘርባጃን</territory>
+ <territory type="BA" draft="unconfirmed">ቦስኒያ እና ሄርዞጎቪኒያ</territory>
+ <territory type="BB" draft="unconfirmed">ባርቤዶስ</territory>
+ <territory type="BE" draft="unconfirmed">ቤáˆáŒ„áˆ</territory>
+ <territory type="BG" draft="unconfirmed">ቡáˆáŒŒáˆªá‹«</territory>
+ <territory type="BH" draft="unconfirmed">ባህሬን</territory>
+ <territory type="BM" draft="unconfirmed">ቤርሙዳ</territory>
+ <territory type="BO" draft="unconfirmed">ቦሊቪያ</territory>
+ <territory type="BR" draft="unconfirmed">ብራዚáˆ</territory>
+ <territory type="BT" draft="unconfirmed">ቡህታን</territory>
+ <territory type="BY" draft="unconfirmed">ቤላሩስ</territory>
+ <territory type="BZ" draft="unconfirmed">ቤሊዘ</territory>
+ <territory type="CD" draft="unconfirmed">ኮንጎ</territory>
+ <territory type="CF" draft="unconfirmed">የመካከለኛዠአáሪካ ሪáብሊክ</territory>
+ <territory type="CH" draft="unconfirmed">ስዊዘርላንድ</territory>
+ <territory type="CL" draft="unconfirmed">ቺሊ</territory>
+ <territory type="CM" draft="unconfirmed">ካሜሩን</territory>
+ <territory type="CN" draft="unconfirmed">ቻይና</territory>
+ <territory type="CO" draft="unconfirmed">ኮሎáˆá‰¢á‹«</territory>
+ <territory type="CS" draft="unconfirmed">ሰርቢያ</territory>
+ <territory type="CV" draft="unconfirmed">ኬᕠቬርዴ</territory>
+ <territory type="CY" draft="unconfirmed">ሳይá•áˆ¨áˆµ</territory>
+ <territory type="CZ" draft="unconfirmed">ቼክ ሪá‘ብሊክ</territory>
+ <territory type="DE" draft="unconfirmed">ጀርመን</territory>
+ <territory type="DK" draft="unconfirmed">ዴንማርክ</territory>
+ <territory type="DM" draft="unconfirmed">ዶሚኒካ</territory>
+ <territory type="DO" draft="unconfirmed">ዶሚኒክ ሪá‘ብሊክ</territory>
+ <territory type="DZ" draft="unconfirmed">አáˆáŒ„ሪያ</territory>
+ <territory type="EC" draft="unconfirmed">ኢኳዶር</territory>
+ <territory type="EE" draft="unconfirmed">ኤስቶኒያ</territory>
+ <territory type="EG" draft="unconfirmed">áŒá‰¥áŒ½</territory>
+ <territory type="EH" draft="unconfirmed">áˆá‹•áˆ«á‰£á‹Š ሳህራ</territory>
+ <territory type="ER" draft="unconfirmed">ኤርትራ</territory>
+ <territory type="ES" draft="unconfirmed">ስá”ን</territory>
+ <territory type="ET" draft="unconfirmed">ኢትዮጵያ</territory>
+ <territory type="FI" draft="unconfirmed">áŠáŠ•áˆ‹áŠ•á‹µ</territory>
+ <territory type="FJ" draft="unconfirmed">áŠáŒ‚</territory>
+ <territory type="FM" draft="unconfirmed">ሚክሮኔዢያ</territory>
+ <territory type="FR" draft="unconfirmed">áˆáˆ¨áŠ•áˆ³á‹­</territory>
+ <territory type="GB" draft="unconfirmed">እንáŒáˆŠá‹</territory>
+ <territory type="GE" draft="unconfirmed">ጆርጂያ</territory>
+ <territory type="GF" draft="unconfirmed">የáˆáˆ¨áŠ•áˆ³á‹­ ጉዊአና</territory>
+ <territory type="GM" draft="unconfirmed">ጋáˆá‰¢á‹«</territory>
+ <territory type="GN" draft="unconfirmed">ጊኒ</territory>
+ <territory type="GQ" draft="unconfirmed">ኢኳቶሪያሠጊኒ</territory>
+ <territory type="GR" draft="unconfirmed">áŒáˆªáŠ­</territory>
+ <territory type="GW" draft="unconfirmed">ቢሳዎ</territory>
+ <territory type="GY" draft="unconfirmed">ጉያና</territory>
+ <territory type="HK" draft="unconfirmed">ሆንጠኮንáŒ</territory>
+ <territory type="HR" draft="unconfirmed">ክሮኤሽያ</territory>
+ <territory type="HT" draft="unconfirmed">ሀይቲ</territory>
+ <territory type="HU" draft="unconfirmed">ሀንጋሪ</territory>
+ <territory type="ID" draft="unconfirmed">ኢንዶኔዢያ</territory>
+ <territory type="IE" draft="unconfirmed">አየርላንድ</territory>
+ <territory type="IL" draft="unconfirmed">እስራኤáˆ</territory>
+ <territory type="IN" draft="unconfirmed">ህንድ</territory>
+ <territory type="IQ" draft="unconfirmed">ኢራቅ</territory>
+ <territory type="IS" draft="unconfirmed">አይስላንድ</territory>
+ <territory type="IT" draft="unconfirmed">ጣሊያን</territory>
+ <territory type="JM" draft="unconfirmed">ጃማይካ</territory>
+ <territory type="JO" draft="unconfirmed">ጆርዳን</territory>
+ <territory type="JP" draft="unconfirmed">ጃá“ን</territory>
+ <territory type="KH" draft="unconfirmed">ካáˆá‰¦á‹²á‹«</territory>
+ <territory type="KM" draft="unconfirmed">ኮሞሮስ</territory>
+ <territory type="KP" draft="unconfirmed">ደቡብ ኮሪያ</territory>
+ <territory type="KR" draft="unconfirmed">ሰሜን ኮሪያ</territory>
+ <territory type="KW" draft="unconfirmed">ክዌት</territory>
+ <territory type="LB" draft="unconfirmed">ሊባኖስ</territory>
+ <territory type="LT" draft="unconfirmed">ሊቱዌኒያ</territory>
+ <territory type="LV" draft="unconfirmed">ላትቪያ</territory>
+ <territory type="LY" draft="unconfirmed">ሊቢያ</territory>
+ <territory type="MA" draft="unconfirmed">ሞሮኮ</territory>
+ <territory type="MD" draft="unconfirmed">ሞáˆá‹¶á‰«</territory>
+ <territory type="MK" draft="unconfirmed">ማከዶኒያ</territory>
+ <territory type="MN" draft="unconfirmed">ሞንጎሊያ</territory>
+ <territory type="MO" draft="unconfirmed">ማካዎ</territory>
+ <territory type="MR" draft="unconfirmed">ሞሪቴኒያ</territory>
+ <territory type="MT" draft="unconfirmed">ማáˆá‰³</territory>
+ <territory type="MU" draft="unconfirmed">ማሩሸስ</territory>
+ <territory type="MX" draft="unconfirmed">ሜክሲኮ</territory>
+ <territory type="MY" draft="unconfirmed">ማሌዢያ</territory>
+ <territory type="NA" draft="unconfirmed">ናሚቢያ</territory>
+ <territory type="NC" draft="unconfirmed">ኒዠካሌዶኒያ</territory>
+ <territory type="NG" draft="unconfirmed">ናይጄሪያ</territory>
+ <territory type="NL" draft="unconfirmed">ኔዘርላንድ</territory>
+ <territory type="NO" draft="unconfirmed">ኖርዌ</territory>
+ <territory type="NP" draft="unconfirmed">ኔá“áˆ</territory>
+ <territory type="NZ" draft="unconfirmed">ኒዠዚላንድ</territory>
+ <territory type="PE" draft="unconfirmed">á”ሩ</territory>
+ <territory type="PF" draft="unconfirmed">የáˆáˆ¨áŠ•áˆ³á‹­ á–ሊኔዢያ</territory>
+ <territory type="PG" draft="unconfirmed">á“á‘á‹‹ ኒዠጊኒ</territory>
+ <territory type="PL" draft="unconfirmed">á–ላንድ</territory>
+ <territory type="PR" draft="unconfirmed">á–ርታ ሪኮ</territory>
+ <territory type="RO" draft="unconfirmed">ሮሜኒያ</territory>
+ <territory type="RU" draft="unconfirmed">ራሺያ</territory>
+ <territory type="SA" draft="unconfirmed">ሳá‹á‹µáŠ áˆ¨á‰¢á‹«</territory>
+ <territory type="SD" draft="unconfirmed">ሱዳን</territory>
+ <territory type="SE" draft="unconfirmed">ስዊድን</territory>
+ <territory type="SG" draft="unconfirmed">ሲንጋá–ር</territory>
+ <territory type="SI" draft="unconfirmed">ስሎቬኒያ</territory>
+ <territory type="SK" draft="unconfirmed">ስሎቫኪያ</territory>
+ <territory type="SN" draft="unconfirmed">ሴኔጋáˆ</territory>
+ <territory type="SO" draft="unconfirmed">ሱማሌ</territory>
+ <territory type="SY" draft="unconfirmed">ሲሪያ</territory>
+ <territory type="TD" draft="unconfirmed">ቻድ</territory>
+ <territory type="TF" draft="unconfirmed">የáˆáˆ¨áŠ•áˆ³á‹­ ደቡባዊ áŒá‹›á‰¶á‰½</territory>
+ <territory type="TH" draft="unconfirmed">ታይላንድ</territory>
+ <territory type="TJ" draft="unconfirmed">ታጃኪስታን</territory>
+ <territory type="TL" draft="unconfirmed">áˆáˆµáˆ«á‰… ቲሞር</territory>
+ <territory type="TN" draft="unconfirmed">ቱኒዚያ</territory>
+ <territory type="TR" draft="unconfirmed">ቱርክ</territory>
+ <territory type="TT" draft="unconfirmed">ትሪኒዳድ እና ቶባጎ</territory>
+ <territory type="TZ" draft="unconfirmed">ታንዛኒያ</territory>
+ <territory type="UG" draft="unconfirmed">ዩጋንዳ</territory>
+ <territory type="US" draft="unconfirmed">አሜሪካ</territory>
+ <territory type="UZ" draft="unconfirmed">á‹©á‹á‰ áŠªáˆµá‰³áŠ•</territory>
+ <territory type="VE" draft="unconfirmed">ቬንዙዌላ</territory>
+ <territory type="VG" draft="unconfirmed">የእንáŒáˆŠá‹ ድንáŒáˆ ደሴቶች</territory>
+ <territory type="VI" draft="unconfirmed">የአሜሪካ ቨርጂን ደሴቶች</territory>
+ <territory type="YE" draft="unconfirmed">የመን</territory>
+ <territory type="ZA" draft="unconfirmed">ደቡብ አáሪካ</territory>
+ <territory type="ZM" draft="unconfirmed">á‹›áˆá‰¢á‹«</territory>
+ </territories>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters draft="unconfirmed">[០ᡠá£-á§ á¢ á  á¨ áŽ-᎙ á²-á¼ á©-ᱠሀ-ሠⶀ áˆ-ሟ ᎀ-ᎃ ⶠሠ-ሯ ⶂ ሰ-ሷ ⶃ ሸ-ሿ ⶄ ቀ-ቈ ቊ-በá‰-ቖ ቘ ቚ-በበ-ቧ ᎄ-ᎇ ⶅ ቨ-ቷ ⶆ ቸ-ቿ ⶇ ኀ-ኈ ኊ-አáŠ-ኗ ⶈ ኘ-ኟ ⶉ አ-ኧ ⶊ ከ-ኰ ኲ-ኵ ኸ-ኾ á‹€ á‹‚-á‹… ወ-á‹– ዘ-á‹Ÿ ⶋ á‹ -á‹· ⶌ ዸ-á‹¿ ⶠጀ-ጇ ⶎ ገ-ጠጒ-ጕ ጘ-ጟ ⶓ-ⶖ ጠ-ጧ ⶠጨ-ጯ ⶠጰ-ጷ ⶑ ጸ-á ᎈ-ᎋ á-ᗠᎌ-Ꭰⶒ á˜-ᚠⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ â·€-â·† â·ˆ-â·Ž â·-â·– â·˜-â·ž]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">ጃንዩ</month>
+ <month type="2" draft="unconfirmed">áŒá‰¥áˆ©</month>
+ <month type="3" draft="unconfirmed">ማርች</month>
+ <month type="4" draft="unconfirmed">ኤá•áˆ¨</month>
+ <month type="5" draft="unconfirmed">ሜይ</month>
+ <month type="6" draft="unconfirmed">áŒáŠ•</month>
+ <month type="7" draft="unconfirmed">áŒáˆ‹á‹­</month>
+ <month type="8" draft="unconfirmed">ኦገስ</month>
+ <month type="9" draft="unconfirmed">ሴá•á‰´</month>
+ <month type="10" draft="unconfirmed">ኦክተ</month>
+ <month type="11" draft="unconfirmed">ኖቬáˆ</month>
+ <month type="12" draft="unconfirmed">ዲሴáˆ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">ጃንዩወሪ</month>
+ <month type="2" draft="unconfirmed">áŒá‰¥áˆ©á‹ˆáˆª</month>
+ <month type="3" draft="unconfirmed">ማርች</month>
+ <month type="4" draft="unconfirmed">ኤá•áˆ¨áˆ</month>
+ <month type="5" draft="unconfirmed">ሜይ</month>
+ <month type="6" draft="unconfirmed">áŒáŠ•</month>
+ <month type="7" draft="unconfirmed">áŒáˆ‹á‹­</month>
+ <month type="8" draft="unconfirmed">ኦገስት</month>
+ <month type="9" draft="unconfirmed">ሴá•á‰´áˆá‰ áˆ­</month>
+ <month type="10" draft="unconfirmed">ኦክተá‹á‰ áˆ­</month>
+ <month type="11" draft="unconfirmed">ኖቬáˆá‰ áˆ­</month>
+ <month type="12" draft="unconfirmed">ዲሴáˆá‰ áˆ­</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="unconfirmed">ጃ</month>
+ <month type="2" draft="unconfirmed">áŒ</month>
+ <month type="3" draft="unconfirmed">ማ</month>
+ <month type="4" draft="unconfirmed">ኤ</month>
+ <month type="5" draft="unconfirmed">ሜ</month>
+ <month type="6" draft="unconfirmed">áŒ</month>
+ <month type="7" draft="unconfirmed">áŒ</month>
+ <month type="8" draft="unconfirmed">ኦ</month>
+ <month type="9" draft="unconfirmed">ሴ</month>
+ <month type="10" draft="unconfirmed">ኦ</month>
+ <month type="11" draft="unconfirmed">ኖ</month>
+ <month type="12" draft="unconfirmed">ዲ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">ወጋ</day>
+ <day type="mon" draft="unconfirmed">ሳይኖ</day>
+ <day type="tue" draft="unconfirmed">ማቆሳ</day>
+ <day type="wed" draft="unconfirmed">አሩዋ</day>
+ <day type="thu" draft="unconfirmed">ሃሙሳ</day>
+ <day type="fri" draft="unconfirmed">አርባ</day>
+ <day type="sat" draft="unconfirmed">ቄራ</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">ወጋ</day>
+ <day type="mon" draft="unconfirmed">ሳይኖ</day>
+ <day type="tue" draft="unconfirmed">ማቆሳኛ</day>
+ <day type="wed" draft="unconfirmed">አሩዋ</day>
+ <day type="thu" draft="unconfirmed">ሃሙሳ</day>
+ <day type="fri" draft="unconfirmed">አርባ</day>
+ <day type="sat" draft="unconfirmed">ቄራ</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="unconfirmed">ወ</day>
+ <day type="mon" draft="unconfirmed">ሳ</day>
+ <day type="tue" draft="unconfirmed">ማ</day>
+ <day type="wed" draft="unconfirmed">አ</day>
+ <day type="thu" draft="unconfirmed">ሃ</day>
+ <day type="fri" draft="unconfirmed">አ</day>
+ <day type="sat" draft="unconfirmed">ቄ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">ማለዶ</am>
+ <pm draft="unconfirmed">ቃማ</pm>
+ <eras>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">አዳ ዎዴ</era>
+ <era type="1" draft="unconfirmed">áŒáˆ®á‰°á‰³ ላይታ</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="BRL">
+ <displayName draft="unconfirmed">የብራዚሠሪáˆ</displayName>
+ <symbol draft="unconfirmed">R$</symbol>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="unconfirmed">የቻይና ዩአን ረንሚንቢ</displayName>
+ <symbol draft="unconfirmed">Y</symbol>
+ </currency>
+ <currency type="ETB">
+ <displayName draft="unconfirmed">የኢትዮጵያ ብር</displayName>
+ <symbol draft="unconfirmed">$</symbol>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="unconfirmed">አá‹áˆ®</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="unconfirmed">የእንáŒáˆŠá‹ á“á‹áŠ•á‹µ ስተርሊንáŒ</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="unconfirmed">የሕንድ ሩá’</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="unconfirmed">የጃá“ን የን</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="unconfirmed">የራሻ ሩብáˆ</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="unconfirmed">የአሜሪካን ዶላር</displayName>
+ <symbol draft="unconfirmed">US$</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/wal_ET.xml b/libs/Zend/Locale/Data/wal_ET.xml
new file mode 100755
index 0000000000..661118346d
--- /dev/null
+++ b/libs/Zend/Locale/Data/wal_ET.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.28 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="wal"/>
+ <territory type="ET"/>
+ </identity>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEEᥠdd MMMM ጋላሳ yyyy G</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd-MMM-yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm:ss a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="unconfirmed">h:mm a</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <group draft="unconfirmed">ወ</group>
+ </symbols>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="unconfirmed">¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/xh.xml b/libs/Zend/Locale/Data/xh.xml
new file mode 100755
index 0000000000..8b68cea527
--- /dev/null
+++ b/libs/Zend/Locale/Data/xh.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.11 $"/>
+ <generation date="$Date: 2006/06/28 01:23:34 $"/>
+ <language type="xh"/>
+ </identity>
+ <characters>
+ <exemplarCharacters>[a-z]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>‘</quotationStart>
+ <quotationEnd>’</quotationEnd>
+ <alternateQuotationStart>“</alternateQuotationStart>
+ <alternateQuotationEnd>â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Jan</month>
+ <month type="2" draft="unconfirmed">Feb</month>
+ <month type="3" draft="unconfirmed">Mat</month>
+ <month type="4" draft="unconfirmed">Epr</month>
+ <month type="5" draft="unconfirmed">Mey</month>
+ <month type="6" draft="unconfirmed">Jun</month>
+ <month type="7" draft="unconfirmed">Jul</month>
+ <month type="8" draft="unconfirmed">Aga</month>
+ <month type="9" draft="unconfirmed">Sep</month>
+ <month type="10" draft="unconfirmed">Okt</month>
+ <month type="11" draft="unconfirmed">Nov</month>
+ <month type="12" draft="unconfirmed">Dis</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Janyuwari</month>
+ <month type="2" draft="unconfirmed">Februwari</month>
+ <month type="3" draft="unconfirmed">Matshi</month>
+ <month type="4" draft="unconfirmed">Epreli</month>
+ <month type="5" draft="unconfirmed">Meyi</month>
+ <month type="6" draft="unconfirmed">Juni</month>
+ <month type="7" draft="unconfirmed">Julayi</month>
+ <month type="8" draft="unconfirmed">Agasti</month>
+ <month type="9" draft="unconfirmed">Septemba</month>
+ <month type="10" draft="unconfirmed">Okthoba</month>
+ <month type="11" draft="unconfirmed">Novemba</month>
+ <month type="12" draft="unconfirmed">Disemba</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Caw</day>
+ <day type="mon" draft="unconfirmed">Mvu</day>
+ <day type="tue" draft="unconfirmed">Bin</day>
+ <day type="wed" draft="unconfirmed">Tha</day>
+ <day type="thu" draft="unconfirmed">Sin</day>
+ <day type="fri" draft="unconfirmed">Hla</day>
+ <day type="sat" draft="unconfirmed">Mgq</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Cawe</day>
+ <day type="mon" draft="unconfirmed">Mvulo</day>
+ <day type="tue" draft="unconfirmed">Lwesibini</day>
+ <day type="wed" draft="unconfirmed">Lwesithathu</day>
+ <day type="thu" draft="unconfirmed">Lwesine</day>
+ <day type="fri" draft="unconfirmed">Lwesihlanu</day>
+ <day type="sat" draft="unconfirmed">Mgqibelo</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">1 unyangantathu</quarter>
+ <quarter type="2" draft="unconfirmed">2 unyangantathu</quarter>
+ <quarter type="3" draft="unconfirmed">3 unyangantathu</quarter>
+ <quarter type="4" draft="unconfirmed">4 unyangantathu</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">umnyaka wokuzalwa kukaYesu</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal draft="provisional">,</decimal>
+ </symbols>
+ <currencies>
+ <currency type="ZAR">
+ <symbol>R</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="provisional">yes:y:ewe:e</yesstr>
+ <nostr draft="provisional">no:n:hayi:h</nostr>
+ </messages>
+ </posix>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/xh_ZA.xml b/libs/Zend/Locale/Data/xh_ZA.xml
new file mode 100755
index 0000000000..0bb8384ef0
--- /dev/null
+++ b/libs/Zend/Locale/Data/xh_ZA.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="xh"/>
+ <territory type="ZA"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/yo.xml b/libs/Zend/Locale/Data/yo.xml
new file mode 100755
index 0000000000..b763e71e43
--- /dev/null
+++ b/libs/Zend/Locale/Data/yo.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.13 $"/>
+ <generation date="$Date: 2006/06/28 01:23:34 $"/>
+ <language type="yo"/>
+ </identity>
+ <characters>
+ <exemplarCharacters>[a á à b d e é è ẹ {ẹÌ} {ẹ̀} f g {gb} h i í ì j-o ó ò á» {á»Ì} {á»Ì€} p r s á¹£ t u ú ù w y]</exemplarCharacters>
+ <exemplarCharacters type="auxiliary">[c q v x z]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Sere</month>
+ <month type="2" draft="unconfirmed">Erele</month>
+ <month type="3" draft="unconfirmed">Erena</month>
+ <month type="4" draft="unconfirmed">Igbe</month>
+ <month type="5" draft="unconfirmed">Ebibi</month>
+ <month type="6" draft="unconfirmed">Okudu</month>
+ <month type="7" draft="unconfirmed">Agemo</month>
+ <month type="8" draft="unconfirmed">Ogun</month>
+ <month type="9" draft="unconfirmed">Owewe</month>
+ <month type="10" draft="unconfirmed">Owara</month>
+ <month type="11" draft="unconfirmed">Belu</month>
+ <month type="12" draft="unconfirmed">Ope</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Osukini</month>
+ <month type="2" draft="unconfirmed">Osukeji</month>
+ <month type="3" draft="unconfirmed">Osuketa</month>
+ <month type="4" draft="unconfirmed">Osukerin</month>
+ <month type="5" draft="unconfirmed">Osukarun</month>
+ <month type="6" draft="unconfirmed">Osukefa</month>
+ <month type="7" draft="unconfirmed">Osukeje</month>
+ <month type="8" draft="unconfirmed">Osukejo</month>
+ <month type="9" draft="unconfirmed">Osukesan</month>
+ <month type="10" draft="unconfirmed">Osukewa</month>
+ <month type="11" draft="unconfirmed">Osukokanla</month>
+ <month type="12" draft="unconfirmed">Osukejila</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Aiku</day>
+ <day type="mon" draft="unconfirmed">Aje</day>
+ <day type="tue" draft="unconfirmed">Isegun</day>
+ <day type="wed" draft="unconfirmed">Ojoru</day>
+ <day type="thu" draft="unconfirmed">Ojobo</day>
+ <day type="fri" draft="unconfirmed">Eti</day>
+ <day type="sat" draft="unconfirmed">Abameta</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Ojoaiku</day>
+ <day type="mon" draft="unconfirmed">Ojoaje</day>
+ <day type="tue" draft="unconfirmed">Ojoisegun</day>
+ <day type="wed" draft="unconfirmed">Ojoru</day>
+ <day type="thu" draft="unconfirmed">Ojobo</day>
+ <day type="fri" draft="unconfirmed">Ojoeti</day>
+ <day type="sat" draft="unconfirmed">Ojoabameta</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <am draft="unconfirmed">ARO</am>
+ <pm draft="unconfirmed">ALE</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">Saju Kristi</era>
+ <era type="1" draft="unconfirmed">Lehin Kristi</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">SK</era>
+ <era type="1" draft="unconfirmed">LK</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="NGN">
+ <displayName draft="unconfirmed">Naira</displayName>
+ <symbol draft="unconfirmed">₦</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1" uri="http://www.omniglot.com/writing/yoruba.htm">Omniglot on Yoruba</reference>
+ <reference type="RP2" uri="http://www.motherlandnigeria.com/languages.html">Nigerian languages - Yoruba</reference>
+ <reference type="RP3" uri="http://www.learnyoruba.com/orthography_1.htm">Learn Yoruba - orthography</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/yo_NG.xml b/libs/Zend/Locale/Data/yo_NG.xml
new file mode 100755
index 0000000000..c4ffde65ee
--- /dev/null
+++ b/libs/Zend/Locale/Data/yo_NG.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="yo"/>
+ <territory type="NG"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/zh.xml b/libs/Zend/Locale/Data/zh.xml
new file mode 100755
index 0000000000..7deb4df80f
--- /dev/null
+++ b/libs/Zend/Locale/Data/zh.xml
@@ -0,0 +1,2348 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.78 $"/>
+ <generation date="$Date: 2006/10/26 22:46:10 $"/>
+ <language type="zh"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa">阿法文</language>
+ <language type="ab">阿布哈西亚文</language>
+ <language type="ace">亚é½æ–‡</language>
+ <language type="ach">阿乔利文</language>
+ <language type="ada">阿当梅文</language>
+ <language type="ady">阿迪何文</language>
+ <language type="ae">阿维斯塔文</language>
+ <language type="af">å—éžè·å…°æ–‡</language>
+ <language type="afa">其他亚éžè¯­ç³»</language>
+ <language type="afh">阿弗里希利文</language>
+ <language type="ak">阿肯文</language>
+ <language type="akk">阿å¡å¾·æ–‡</language>
+ <language type="ale">阿留申群岛之土语</language>
+ <language type="alg">其他阿尔贡语系</language>
+ <language type="am">阿姆哈拉文</language>
+ <language type="ang">中å¤è‹±è¯­</language>
+ <language type="apa">阿帕切文</language>
+ <language type="ar">阿拉伯文</language>
+ <language type="arc">阿拉米文</language>
+ <language type="arn">阿劳åŽæ–‡</language>
+ <language type="arp">阿拉帕éœæ–‡</language>
+ <language type="art">其他人工语言</language>
+ <language type="arw">阿拉瓦克文</language>
+ <language type="as">阿è¨å§†æ–‡</language>
+ <language type="ast">阿斯图里亚æ€ç‰¹è¯­</language>
+ <language type="ath">其他阿撒巴斯å¡è¯­ç³»</language>
+ <language type="aus">澳大利亚语系</language>
+ <language type="av">阿瓦尔文</language>
+ <language type="awa">阿瓦乔文</language>
+ <language type="ay">艾马拉文</language>
+ <language type="az">阿塞拜疆文</language>
+ <language type="ba">巴什客尔文</language>
+ <language type="bad">ç­è¾¾æ–‡</language>
+ <language type="bai">巴米累克文</language>
+ <language type="bal">俾路支文</language>
+ <language type="ban">巴里文</language>
+ <language type="bas">å·´è¨æ–‡</language>
+ <language type="bat">波罗的海地区之语言</language>
+ <language type="be">白俄罗斯文</language>
+ <language type="bej">别札文</language>
+ <language type="bem">别姆巴文</language>
+ <language type="ber">北éžå›žæ•™åœŸæ—之语言</language>
+ <language type="bg">ä¿åŠ åˆ©äºšæ–‡</language>
+ <language type="bh">比哈尔文</language>
+ <language type="bho">åšæ°æ™®å°”æ–‡</language>
+ <language type="bi">比斯拉马文</language>
+ <language type="bik">毕库尔文</language>
+ <language type="bin">比尼文</language>
+ <language type="bla">å¸å…‹å¸å¡æ–‡</language>
+ <language type="bm">ç­å·´æ‹‰æ–‡</language>
+ <language type="bn">孟加拉文</language>
+ <language type="bnt">ç­å›¾æ–‡</language>
+ <language type="bnt" alt="proposed" draft="provisional">ç­å›¾è¯¸è¯­è¨€ (其他)</language>
+ <language type="bo">西è—æ–‡</language>
+ <language type="br">布里多尼文</language>
+ <language type="bra">布拉æ°æ–‡</language>
+ <language type="bs">波斯尼亚文</language>
+ <language type="btk">巴塔克文</language>
+ <language type="bua">布里亚特文</language>
+ <language type="bug">布å‰æ–‡</language>
+ <language type="byn">布林文</language>
+ <language type="ca">加泰罗尼亚文</language>
+ <language type="cad">å¡å¤šæ–‡</language>
+ <language type="cai">其他中美å°ç¬¬å®‰è¯­ç³»</language>
+ <language type="car">巴勒比文</language>
+ <language type="cau">其他高加索语系</language>
+ <language type="ce">车臣文</language>
+ <language type="ceb">宿务文</language>
+ <language type="cel">其他凯尔特语系</language>
+ <language type="ch">查莫罗文</language>
+ <language type="chb">契布å¡æ–‡</language>
+ <language type="chg">查加文</language>
+ <language type="chk">楚å¾å…‹æ–‡</language>
+ <language type="chm">马里文</language>
+ <language type="chn">契努克文</language>
+ <language type="cho">乔克托文</language>
+ <language type="chp">佩瓦扬文</language>
+ <language type="chr">彻罗基文</language>
+ <language type="chy">å¤å»¶æ–‡</language>
+ <language type="cmc">查米克文</language>
+ <language type="co">科西嘉文</language>
+ <language type="cop">科普特文</language>
+ <language type="cpe">ä¸çº¯ç²¹ä¹‹è‹±å›½æ–¹è¨€</language>
+ <language type="cpf">ä¸çº¯ç²¹ä¹‹æ³•å›½æ–¹è¨€</language>
+ <language type="cpp">ä¸çº¯ç²¹ä¹‹è‘¡å›½æ–¹è¨€</language>
+ <language type="cr">克里æ—æ–‡</language>
+ <language type="crh">克里米亚土耳其文;克里米亚塔塔文</language>
+ <language type="crp">克里奥尔语和皮钦文</language>
+ <language type="cs">æ·å…‹æ–‡</language>
+ <language type="csb">å¡èˆ’æ–‡</language>
+ <language type="cu">宗教斯拉夫文</language>
+ <language type="cus">其他库施特语系</language>
+ <language type="cv">楚瓦什文</language>
+ <language type="cy">å¨å°”士文</language>
+ <language type="da">丹麦文</language>
+ <language type="dak">达科他文</language>
+ <language type="dar">达尔格瓦文</language>
+ <language type="day">达雅克文</language>
+ <language type="de">å¾·æ–‡</language>
+ <language type="del">特拉瓦å°ç¬¬å®‰äººæ–‡</language>
+ <language type="den">å¸é›·å¤«æ–‡</language>
+ <language type="dgr">多格æ¥æ–‡ Dogrib</language>
+ <language type="dgr" alt="proposed" draft="provisional">多格里布语</language>
+ <language type="din">ä¸å¡æ–‡</language>
+ <language type="doi">多格æ¥æ–‡ Dogri</language>
+ <language type="doi" alt="proposed" draft="provisional">多格拉语</language>
+ <language type="dra">其他德拉维语系</language>
+ <language type="dsb">下塞尔维亚文</language>
+ <language type="dua">都阿拉文</language>
+ <language type="dum">中å¤è·å…°æ–‡</language>
+ <language type="dv">迪维希文</language>
+ <language type="dyu">迪尤拉文</language>
+ <language type="dz">ä¸ä¸¹æ–‡</language>
+ <language type="ee">幽文</language>
+ <language type="el">希腊文</language>
+ <language type="elx">艾拉米特文</language>
+ <language type="en">英文</language>
+ <language type="enm">中å¤è‹±æ–‡</language>
+ <language type="eo">世界文</language>
+ <language type="es">西ç­ç‰™æ–‡</language>
+ <language type="et">爱沙尼亚文</language>
+ <language type="eu">巴斯克文</language>
+ <language type="ewo">æ—ºæœæ–‡</language>
+ <language type="fa">波斯文</language>
+ <language type="fan">芳格文</language>
+ <language type="fat">芳蒂文</language>
+ <language type="ff">夫拉文</language>
+ <language type="fi">芬兰文</language>
+ <language type="fiu">芬匈文(其他)</language>
+ <language type="fj">æ–济文</language>
+ <language type="fo">法罗文</language>
+ <language type="fon">丰文</language>
+ <language type="fr">法文</language>
+ <language type="frm">中å¤æ³•æ–‡</language>
+ <language type="fro">å¤æ³•æ–‡</language>
+ <language type="fur">弗留利文</language>
+ <language type="fy">弗里斯兰文</language>
+ <language type="ga">爱尔兰文</language>
+ <language type="gaa">加文</language>
+ <language type="gay">迦约文</language>
+ <language type="gba">葛巴亚文</language>
+ <language type="gd">è‹æ ¼å…°- 盖尔文</language>
+ <language type="gez">å‰å…¹æ–‡</language>
+ <language type="gil">å‰å°”伯特斯文</language>
+ <language type="gl">加利西亚文</language>
+ <language type="gmh">中å¤é«˜åœ°å¾·æ–‡</language>
+ <language type="gn">瓜拉尼文</language>
+ <language type="goh">å¤ä»£é«˜åœ°å¾·æ–‡</language>
+ <language type="gon">å²—å¾·æ–‡</language>
+ <language type="gor">科洛涅达罗文</language>
+ <language type="got">哥达文</language>
+ <language type="grb">格列åšæ–‡</language>
+ <language type="grc">å¤å¸Œè…Šæ–‡</language>
+ <language type="gu">å¤åŠ æ‹‰ææ–‡</language>
+ <language type="gv">马æ©å²›æ–‡</language>
+ <language type="gwi">å‰ç»´å…‹ç´æ–‡</language>
+ <language type="ha">豪撒文</language>
+ <language type="hai">海达文</language>
+ <language type="haw">å¤å¨å¤·æ–‡</language>
+ <language type="he">希伯æ¥æ–‡</language>
+ <language type="hi">å°åœ°æ–‡</language>
+ <language type="hil">希利盖农文</language>
+ <language type="him">赫马查利文</language>
+ <language type="hit">西å°æ–‡</language>
+ <language type="hmn">赫蒙文</language>
+ <language type="ho">新里木托文</language>
+ <language type="hr">克罗地亚文</language>
+ <language type="hsb">上索布文</language>
+ <language type="hu">匈牙利文</language>
+ <language type="hup">胡帕文</language>
+ <language type="hy">亚美尼亚文</language>
+ <language type="hz">赫雷罗文</language>
+ <language type="ia">拉ä¸å›½é™…æ–‡ Interlingua</language>
+ <language type="ia" alt="proposed" draft="provisional">国际语A</language>
+ <language type="iba">伊ç­æ–‡</language>
+ <language type="id">å°åº¦å°¼è¥¿äºšæ–‡</language>
+ <language type="ie">拉ä¸å›½é™…æ–‡ Interlingue</language>
+ <language type="ie" alt="proposed" draft="provisional">国际语E</language>
+ <language type="ig">伊格åšæ–‡</language>
+ <language type="ii">å››å·è¯</language>
+ <language type="ijo">伊乔文</language>
+ <language type="ik">ä¾å¥´çš®ç»´å…‹æ–‡</language>
+ <language type="ilo">伊洛干诺文</language>
+ <language type="inc">å°åº¦æ–‡ï¼ˆå…¶ä»–)</language>
+ <language type="ine">其他å°æ¬§è¯­ç³»</language>
+ <language type="inh">å°å¤ä»€æ–‡</language>
+ <language type="io">爱德莪文(人工语言)</language>
+ <language type="ira">伊朗文</language>
+ <language type="iro">伊洛郭伊费文</language>
+ <language type="is">冰岛文</language>
+ <language type="it">æ„大利文</language>
+ <language type="iu">爱斯基摩文</language>
+ <language type="ja">日文</language>
+ <language type="jbo">æ´›å‰èˆ¬ï¼ˆäººå·¥è¯­è¨€ï¼‰</language>
+ <language type="jpr">犹太波斯语系</language>
+ <language type="jrb">犹太阿拉伯语系</language>
+ <language type="jv">爪哇文</language>
+ <language type="ka">æ ¼é²å‰äºšæ–‡</language>
+ <language type="kaa">å¡æ‹‰å¡å°”帕克文</language>
+ <language type="kab">å¡æ¯”尔文</language>
+ <language type="kac">å¡ç´æ–‡</language>
+ <language type="kam">å¡å§†å·´æ–‡</language>
+ <language type="kar">喀伦文</language>
+ <language type="kaw">å¡å¨æ–‡</language>
+ <language type="kbd">å¡å·´å°”达文</language>
+ <language type="kg">刚果文</language>
+ <language type="kha">å¡è¥¿æ–‡</language>
+ <language type="khi">其他科伊桑文</language>
+ <language type="kho">和田文</language>
+ <language type="ki">å‰åº“尤文</language>
+ <language type="kj">å…³çŠçŽ›æ–‡</language>
+ <language type="kk">哈è¨å…‹æ–‡</language>
+ <language type="kl">格陵兰文</language>
+ <language type="km">柬埔寨文</language>
+ <language type="kmb">金邦æœæ–‡</language>
+ <language type="kn">埃纳德文</language>
+ <language type="ko">韩文</language>
+ <language type="kok">刚å¡å°¼æ–‡</language>
+ <language type="kos">柯å¸ç‘žæ©æ–‡</language>
+ <language type="kpe">克佩列文</language>
+ <language type="kr">å¡åŠªé‡Œæ–‡</language>
+ <language type="krc">å¡æ‹‰æ°ä¼Š-å·´å°”å¡å°”语</language>
+ <language type="kro">å…‹é²æ–‡</language>
+ <language type="kru">库é²å…‹æ–‡</language>
+ <language type="ks">克什米尔文</language>
+ <language type="ku">库尔德文</language>
+ <language type="kum">库梅克文</language>
+ <language type="kut">库特内文</language>
+ <language type="kv">科米文</language>
+ <language type="kw">凯尔特文</language>
+ <language type="ky">å‰å°”å‰æ–¯æ–‡</language>
+ <language type="la">拉ä¸æ–‡</language>
+ <language type="lad">拉迪诺文</language>
+ <language type="lah">拉亨达文</language>
+ <language type="lam">å…°å·´æ–‡</language>
+ <language type="lb">å¢æ£®å ¡æ–‡</language>
+ <language type="lez">莱兹ä¾æ˜‚æ–‡</language>
+ <language type="lg">å¢å¹²è¾¾æ–‡</language>
+ <language type="li">淋布尔å‰æ–‡</language>
+ <language type="ln">林加拉文</language>
+ <language type="lo">è€æŒæ–‡</language>
+ <language type="lol">芒戈语</language>
+ <language type="loz">洛兹文</language>
+ <language type="lt">立陶宛文</language>
+ <language type="lu">é²å·´åŠ ä¸¹åŠ æ–‡</language>
+ <language type="lua">é²å·´é²ç“¦æ–‡</language>
+ <language type="lui">路易塞诺文</language>
+ <language type="lun">隆达文</language>
+ <language type="luo">å¢å¥¥æ–‡</language>
+ <language type="lus">å¢æ™’æ–‡</language>
+ <language type="lv">拉脫維亞文</language>
+ <language type="mad">马都拉文</language>
+ <language type="mag">马加伊文</language>
+ <language type="mai">迈蒂利文</language>
+ <language type="mak">望加锡文</language>
+ <language type="man">曼ä¸å“¥æ–‡</language>
+ <language type="map">马æ¥äºšçŽ»é‡Œå°¼è¥¿äºšè¯­ç³»</language>
+ <language type="mas">è¨ä¼Šè¯­</language>
+ <language type="mdf">莫克沙文</language>
+ <language type="mdr">曼达尔</language>
+ <language type="men">门迪文</language>
+ <language type="mg">马尔加什文</language>
+ <language type="mga">中å¤çˆ±å°”å…°æ–‡</language>
+ <language type="mh">马ç»å°”æ–‡</language>
+ <language type="mi">毛利文</language>
+ <language type="mic">米克马克文</language>
+ <language type="min">ç±³å—å¡ä¿æ–‡</language>
+ <language type="mis">å„ç§ä¸åŒè¯­è¨€</language>
+ <language type="mk">马其顿文</language>
+ <language type="mkh">其他蒙å‰è”‘æ–‡</language>
+ <language type="ml">马æ¥äºšæ‹‰å§†æ–‡</language>
+ <language type="mn">è’™å¤æ–‡</language>
+ <language type="mnc">满文</language>
+ <language type="mni">曼尼普里文</language>
+ <language type="mno">马诺åšæ±¡æ–‡</language>
+ <language type="mo">摩尔多瓦文</language>
+ <language type="moh">æ‘©éœå…‹æ–‡</language>
+ <language type="mos">莫西文</language>
+ <language type="mr">马拉地文</language>
+ <language type="ms">马æ¥æ–‡</language>
+ <language type="mt">马耳他文</language>
+ <language type="mul">多ç§è¯­è¨€</language>
+ <language type="mun">蒙达文</language>
+ <language type="mus">摩斯科格文</language>
+ <language type="mwr">马尔尼里文</language>
+ <language type="my">缅甸文</language>
+ <language type="myn">玛雅文</language>
+ <language type="myv">俄日亚文</language>
+ <language type="na">ç‘™é²æ–‡</language>
+ <language type="nah">纳瓦特尔文</language>
+ <language type="nai">其他北美å°ç¬¬å®‰è¯­ç³»</language>
+ <language type="nap">拿波里文</language>
+ <language type="nb">挪å¨åšå…‹é©¬å°”æ–‡</language>
+ <language type="nd">北æ©å¾·è´å‹’æ–‡</language>
+ <language type="nds">德国北部的德文;低地è¨å…‹é€Šæ–‡</language>
+ <language type="ne">尼泊尔文</language>
+ <language type="new">尼瓦尔文</language>
+ <language type="ng">æ©ä¸œåŠ æ–‡</language>
+ <language type="nia">尼尔å¸æ–‡</language>
+ <language type="nic">其他尼日尔刚果语系</language>
+ <language type="niu">纽埃文</language>
+ <language type="nl">è·å…°æ–‡</language>
+ <language type="nn">挪å¨å°¼è¯ºæ–¯å…‹æ–‡</language>
+ <language type="no">挪å¨æ–‡</language>
+ <language type="nog">诺盖文</language>
+ <language type="non">å¤è¯ºå°”斯文</language>
+ <language type="nr">å—部æ©å¾·è´å‹’æ–‡</language>
+ <language type="nso">北索托文</language>
+ <language type="nub">努比亚文</language>
+ <language type="nv">纳瓦éœæ–‡</language>
+ <language type="ny">尼昂加文;切瓦文;切瓦文</language>
+ <language type="nym">尼亚姆韦é½æ–‡</language>
+ <language type="nyn">尼昂科勒文</language>
+ <language type="nyo">尼约罗语æ—</language>
+ <language type="nzi">尼兹玛文</language>
+ <language type="oc">奥西å¦æ–‡</language>
+ <language type="oj">奥季布瓦文</language>
+ <language type="om">阿曼文</language>
+ <language type="or">欧里亚文</language>
+ <language type="os">奥塞ææ–‡</language>
+ <language type="osa">奥è¨å“²æ–‡</language>
+ <language type="ota">奥托曼土耳其文</language>
+ <language type="oto">奥托米语系</language>
+ <language type="pa">æ—é®æ™®æ–‡</language>
+ <language type="paa">其他巴布亚文</language>
+ <language type="pag">邦阿西å—æ–‡</language>
+ <language type="pal">帕拉维文</language>
+ <language type="pam">邦æ¿ç‰™æ–‡</language>
+ <language type="pap">帕皮亚内托文</language>
+ <language type="pau">帕劳文</language>
+ <language type="peo">å¤è€æ³¢æ–¯è¯­</language>
+ <language type="phi">其他è²å¾‹å®¾è¯­ç³»</language>
+ <language type="phn">腓利基文</language>
+ <language type="pi">帕利文</language>
+ <language type="pl">波兰文</language>
+ <language type="pon">波那è´æ–‡</language>
+ <language type="pra">å°åº¦å¤ä»£åŠä¸­ä¸–纪之中部åŠåŒ—部方言</language>
+ <language type="pro">普罗文斯文</language>
+ <language type="ps">普什图文</language>
+ <language type="pt">è‘¡è„牙文</language>
+ <language type="qu">盖丘亚文</language>
+ <language type="raj">拉贾斯å¦æ–‡</language>
+ <language type="rap">拉帕努文</language>
+ <language type="rar">拉罗汤加文</language>
+ <language type="rm">里托罗曼斯文</language>
+ <language type="rn">基隆迪文</language>
+ <language type="ro">罗马尼亚文</language>
+ <language type="roa">其他拉ä¸è¯­ç³»</language>
+ <language type="rom">å‰æ™®èµ›æ–‡</language>
+ <language type="ru">ä¿„æ–‡</language>
+ <language type="rw">å¢æ—ºè¾¾æ–‡</language>
+ <language type="sa">梵文</language>
+ <language type="sad">散达维文</language>
+ <language type="sah">雅库特文</language>
+ <language type="sai">其他å—美å°ç¬¬å®‰æ–‡</language>
+ <language type="sal">è¨åˆ©ä»€æ–‡</language>
+ <language type="sam">è¨çŽ›åˆ©äºšæ–‡</language>
+ <language type="sas">å¡žå¡žå¡æ–‡</language>
+ <language type="sat">桑嗒利文</language>
+ <language type="sc">è¨ä¸æ–‡</language>
+ <language type="sco">è‹æ ¼å…°æ–‡</language>
+ <language type="sd">信德语</language>
+ <language type="se">北è¨è¿·æ–‡</language>
+ <language type="sel">塞尔库普文</language>
+ <language type="sem">其他闪æ—语系</language>
+ <language type="sg">桑戈文</language>
+ <language type="sga">å¤çˆ±å°”å…°æ–‡</language>
+ <language type="sgn">手语</language>
+ <language type="sh">塞波尼斯-克罗地亚文</language>
+ <language type="shn">掸文</language>
+ <language type="si">僧伽罗文</language>
+ <language type="sid">悉达摩文</language>
+ <language type="sio">è‹è¯­è¯¸è¯­è¨€</language>
+ <language type="sit">其他汉è—语系</language>
+ <language type="sk">斯洛ä¼å…‹æ–‡</language>
+ <language type="sl">斯洛文尼亚文</language>
+ <language type="sla">其他斯拉夫语系</language>
+ <language type="sm">è¨æ‘©äºšæ–‡</language>
+ <language type="sma">å—è¨è¿·æ–‡</language>
+ <language type="smi">其他è¨è¿·æ–‡</language>
+ <language type="smj">å¢ä¹è¨è¿·æ–‡</language>
+ <language type="smn">ä¾çº³æ—¥è¨è¿·æ–‡</language>
+ <language type="sms">å¸å¯‡ç‰¹è¨è¿·æ–‡</language>
+ <language type="sn">塞内加尔文</language>
+ <language type="snk">索尼基文</language>
+ <language type="so">索马里文</language>
+ <language type="sog">索格迪亚文</language>
+ <language type="son">æ¡‘æµ·æ–‡</language>
+ <language type="sq">阿尔巴尼亚文</language>
+ <language type="sr">塞尔维亚文</language>
+ <language type="srr">谢列尔文</language>
+ <language type="ss">辛辛那ææ–‡</language>
+ <language type="ssa">其他尼罗è¨å“ˆå…°æ–‡</language>
+ <language type="st">塞索托文</language>
+ <language type="su">巽他语</language>
+ <language type="suk">è‹åº“马文</language>
+ <language type="sus">è‹è‹æ–‡</language>
+ <language type="sux">è‹é©¬æ–‡</language>
+ <language type="sv">瑞典文</language>
+ <language type="sw">斯瓦希里文</language>
+ <language type="syr">å™åˆ©äºšæ–‡</language>
+ <language type="ta">泰米尔文</language>
+ <language type="tai">其他泰文</language>
+ <language type="te">æ³°å¢å›ºæ–‡</language>
+ <language type="tem">体姆å‘æ–‡</language>
+ <language type="ter">特å–诺文</language>
+ <language type="tet">特图们文</language>
+ <language type="tg">å¡”å‰å…‹æ–‡</language>
+ <language type="th">æ³°æ–‡</language>
+ <language type="ti">æ格里尼亚文</language>
+ <language type="tig">æ格雷文</language>
+ <language type="tiv">蒂夫文</language>
+ <language type="tk">土库曼文</language>
+ <language type="tkl">陀克娄文</language>
+ <language type="tl">塔加路æ—æ–‡</language>
+ <language type="tli">特林å‰ç‰¹æ–‡</language>
+ <language type="tmh">塔玛åŽå…‹æ–‡</language>
+ <language type="tn">çªå°¼æ–¯æ–‡</language>
+ <language type="to">汤加文</language>
+ <language type="tog">汤加文(尼亚è¨åœ°åŒºï¼‰</language>
+ <language type="tpi">托克皮辛文</language>
+ <language type="tr">土耳其文</language>
+ <language type="ts">特æ¾åŠ æ–‡</language>
+ <language type="tsi">蒂姆西亚文</language>
+ <language type="tt">éž‘é¼æ–‡</language>
+ <language type="tum">通布å¡æ–‡</language>
+ <language type="tup">图匹文</language>
+ <language type="tut">其他阿尔泰语系</language>
+ <language type="tvl">图瓦å¢æ–‡</language>
+ <language type="tw">å°æ¹¾æ–‡</language>
+ <language type="ty">塔西ææ–‡</language>
+ <language type="tyv">图瓦文</language>
+ <language type="udm">乌德穆尔特文</language>
+ <language type="ug">ç»´å¾å°”æ–‡</language>
+ <language type="uga">乌加里特文</language>
+ <language type="uk">乌克兰文</language>
+ <language type="umb">姆崩æœæ–‡</language>
+ <language type="und">未定语ç§</language>
+ <language type="ur">乌尔都文</language>
+ <language type="uz">乌兹别克文</language>
+ <language type="vai">瓦伊文</language>
+ <language type="ve">文达文</language>
+ <language type="vi">越å—æ–‡</language>
+ <language type="vo">沃拉普克文</language>
+ <language type="vot">沃æå…‹æ–‡</language>
+ <language type="wa">è¯éš†æ–‡</language>
+ <language type="wak">瓦喀山文</language>
+ <language type="wal">瓦拉莫文</language>
+ <language type="war">佤瑞文</language>
+ <language type="was">瓦ç»æ–‡</language>
+ <language type="wen">索布诸语言</language>
+ <language type="wo">沃尔夫文</language>
+ <language type="xal">å¡å•¦è¿·å…‹æ–‡</language>
+ <language type="xh">科è¨è¯­</language>
+ <language type="yao">瑶æ—æ–‡</language>
+ <language type="yap">雅浦文</language>
+ <language type="yi">ä¾åœ°æ–‡</language>
+ <language type="yo">约é²å·´æ–‡</language>
+ <language type="ypk">喻皮克文</language>
+ <language type="za">è—æ–‡</language>
+ <language type="zap">è¨æ³¢è’‚å…‹æ–‡</language>
+ <language type="zen">泽纳加文</language>
+ <language type="zh">中文</language>
+ <language type="znd">赞德文</language>
+ <language type="zu">祖é²æ–‡</language>
+ <language type="zun">祖尼语</language>
+ </languages>
+ <scripts>
+ <script type="Arab">阿拉伯语</script>
+ <script type="Armn">亚美尼亚语</script>
+ <script type="Beng">孟加拉语</script>
+ <script type="Bopo">汉语拼音</script>
+ <script type="Brai">布拉耶语</script>
+ <script type="Buhd">布希德语</script>
+ <script type="Cans">加拿大土著统一符å·è¯­</script>
+ <script type="Cher">切罗基语</script>
+ <script type="Copt">克普特语</script>
+ <script type="Cprt">塞浦路斯语</script>
+ <script type="Cyrl">西里尔语</script>
+ <script type="Deva">梵文</script>
+ <script type="Dsrt">戴泽雷特语</script>
+ <script type="Ethi">埃塞俄比亚语</script>
+ <script type="Geor">乔治亚语</script>
+ <script type="Goth">哥特语</script>
+ <script type="Grek">希腊语</script>
+ <script type="Gujr">å¤å‰æ‹‰ç‰¹è¯­</script>
+ <script type="Guru">æžœé²ç©†å¥‡è¯­</script>
+ <script type="Hang">韩语</script>
+ <script type="Hani">汉语</script>
+ <script type="Hano">汉奴罗语</script>
+ <script type="Hans">简体汉语</script>
+ <script type="Hant">ç¹ä½“汉语</script>
+ <script type="Hebr">希伯æ¥è¯­</script>
+ <script type="Hira">å¹³å‡å</script>
+ <script type="Ital">å¤æ„大利语</script>
+ <script type="Kana">片å‡å</script>
+ <script type="Khmr">高棉语</script>
+ <script type="Knda">å¡çº³å¡”克语</script>
+ <script type="Laoo">è€æŒè¯­</script>
+ <script type="Latn">拉ä¸è¯­</script>
+ <script type="Limb">林布语</script>
+ <script type="Mlym">马拉亚拉姆语</script>
+ <script type="Mong">è’™å¤è¯­</script>
+ <script type="Mymr">缅甸</script>
+ <script type="Ogam">欧甘语</script>
+ <script type="Orya">奥里亚语</script>
+ <script type="Osma">奥斯曼亚语</script>
+ <script type="Runr">北欧语</script>
+ <script type="Shaw">è§ä¼¯çº³å¼è¯­</script>
+ <script type="Sinh">辛哈拉语</script>
+ <script type="Syrc">å™åˆ©äºšè¯­</script>
+ <script type="Tagb">塔格ç­ç“¦è¯­</script>
+ <script type="Tale">æ³°ä¹è¯­</script>
+ <script type="Taml">泰米尔语</script>
+ <script type="Telu">æ³°å¢å›ºè¯­</script>
+ <script type="Tglg">塔加路语</script>
+ <script type="Thaa">塔安娜语</script>
+ <script type="Thai">泰语</script>
+ <script type="Tibt">è—语</script>
+ <script type="Ugar">乌加里特语</script>
+ <script type="Yiii">å½è¯­</script>
+ </scripts>
+ <territories>
+ <territory type="001" draft="unconfirmed">世界</territory>
+ <territory type="002">éžæ´²</territory>
+ <territory type="005" draft="unconfirmed">å—美洲</territory>
+ <territory type="009" draft="unconfirmed">大洋洲</territory>
+ <territory type="011" draft="unconfirmed">西éž</territory>
+ <territory type="013">中美洲</territory>
+ <territory type="014">东éž</territory>
+ <territory type="015">北éž</territory>
+ <territory type="017">中éž</territory>
+ <territory type="018" draft="unconfirmed">éžæ´²å—部</territory>
+ <territory type="019">美洲</territory>
+ <territory type="021">北美洲</territory>
+ <territory type="029">加勒比海</territory>
+ <territory type="030">东亚</territory>
+ <territory type="035" draft="unconfirmed">东å—亚</territory>
+ <territory type="039" draft="unconfirmed">å—欧</territory>
+ <territory type="053">澳大利亚和新西兰</territory>
+ <territory type="054">美拉尼西亚</territory>
+ <territory type="057">密克罗尼西亚</territory>
+ <territory type="061" draft="unconfirmed">玻里尼西亚</territory>
+ <territory type="062" draft="unconfirmed">中å—亚</territory>
+ <territory type="142">亚洲</territory>
+ <territory type="145" draft="unconfirmed">西亚</territory>
+ <territory type="150">欧洲</territory>
+ <territory type="151">东欧</territory>
+ <territory type="154">北欧</territory>
+ <territory type="155" draft="unconfirmed">西欧</territory>
+ <territory type="830">海峡群岛</territory>
+ <territory type="IM">曼岛</territory>
+ <territory type="AD">安é“å°”</territory>
+ <territory type="AE">阿拉伯è”åˆé…‹é•¿å›½</territory>
+ <territory type="AF">阿富汗</territory>
+ <territory type="AG">安æ瓜和巴布达</territory>
+ <territory type="AI">安圭拉</territory>
+ <territory type="AL">阿尔巴尼亚</territory>
+ <territory type="AM">亚美尼亚</territory>
+ <territory type="AN">è·å±žå®‰çš„列斯群岛</territory>
+ <territory type="AO">安哥拉</territory>
+ <territory type="AQ">å—æžæ´²</territory>
+ <territory type="AR">阿根廷</territory>
+ <territory type="AS">美属è¨æ‘©äºš</territory>
+ <territory type="AT">奥地利</territory>
+ <territory type="AU">澳大利亚</territory>
+ <territory type="AW">阿é²å·´</territory>
+ <territory type="AX">奥兰群岛</territory>
+ <territory type="AZ">阿塞拜疆</territory>
+ <territory type="BA">波斯尼亚和黑山共和国</territory>
+ <territory type="BB">巴巴多斯</territory>
+ <territory type="BD">孟加拉国</territory>
+ <territory type="BE">比利时</territory>
+ <territory type="BF">布基纳法索</territory>
+ <territory type="BG">ä¿åŠ åˆ©äºš</territory>
+ <territory type="BH">å·´æž—</territory>
+ <territory type="BI">布隆迪</territory>
+ <territory type="BJ">è´å®</territory>
+ <territory type="BM">百慕大</territory>
+ <territory type="BN">文莱</territory>
+ <territory type="BO">玻利维亚</territory>
+ <territory type="BR">巴西</territory>
+ <territory type="BS">巴哈马</territory>
+ <territory type="BT">ä¸ä¸¹</territory>
+ <territory type="BV">布维特岛</territory>
+ <territory type="BW">åšèŒ¨ç“¦çº³</territory>
+ <territory type="BY">白俄罗斯</territory>
+ <territory type="BZ">伯利兹</territory>
+ <territory type="CA">加拿大</territory>
+ <territory type="CC">科科斯群岛</territory>
+ <territory type="CD">刚果民主共和国</territory>
+ <territory type="CF">中éžå…±å’Œå›½</territory>
+ <territory type="CG">刚果</territory>
+ <territory type="CH">瑞士</territory>
+ <territory type="CI">象牙海岸</territory>
+ <territory type="CK">库克群岛</territory>
+ <territory type="CL">智利</territory>
+ <territory type="CM">喀麦隆</territory>
+ <territory type="CN">中国</territory>
+ <territory type="CO">哥伦比亚</territory>
+ <territory type="CR">哥斯达黎加</territory>
+ <territory type="CS" draft="unconfirmed">塞尔维亚和黑山</territory>
+ <territory type="CU">å¤å·´</territory>
+ <territory type="CV">佛得角</territory>
+ <territory type="CX">圣诞岛</territory>
+ <territory type="CY">塞浦路斯</territory>
+ <territory type="CZ">æ·å…‹å…±å’Œå›½</territory>
+ <territory type="DE">德国</territory>
+ <territory type="DJ">å‰å¸ƒæ</territory>
+ <territory type="DK">丹麦</territory>
+ <territory type="DM">多米尼加岘</territory>
+ <territory type="DO">多米尼加共和国</territory>
+ <territory type="DZ">阿尔åŠåˆ©äºš</territory>
+ <territory type="EC">厄瓜多尔</territory>
+ <territory type="EE">爱沙尼亚</territory>
+ <territory type="EG">埃åŠ</territory>
+ <territory type="EH">西撒哈拉</territory>
+ <territory type="ER">厄立特里亚</territory>
+ <territory type="ES">西ç­ç‰™</territory>
+ <territory type="ET">埃塞俄比亚</territory>
+ <territory type="FI">芬兰</territory>
+ <territory type="FJ">æ–济</territory>
+ <territory type="FK">ç¦å…‹å…°ç¾¤å²›</territory>
+ <territory type="FM">密克罗尼西亚è”邦</territory>
+ <territory type="FO">法罗群岛</territory>
+ <territory type="FR">法国</territory>
+ <territory type="GA">加蓬</territory>
+ <territory type="GB">英国</territory>
+ <territory type="GD">格林纳达</territory>
+ <territory type="GE">æ ¼é²å‰äºš</territory>
+ <territory type="GF">法属圭亚那</territory>
+ <territory type="GH">加纳</territory>
+ <territory type="GI">直布罗陀</territory>
+ <territory type="GL">格陵兰</territory>
+ <territory type="GM">冈比亚</territory>
+ <territory type="GN">几内亚</territory>
+ <territory type="GP">瓜德罗普岛</territory>
+ <territory type="GQ">赤é“几内亚</territory>
+ <territory type="GR">希腊</territory>
+ <territory type="GS">å—ä½æ²»äºšå’Œå—三明治群岛</territory>
+ <territory type="GT">å±åœ°é©¬æ‹‰</territory>
+ <territory type="GU">关岛</territory>
+ <territory type="GW">几内亚比ç»</territory>
+ <territory type="GY">圭亚那</territory>
+ <territory type="HK">中国香港特别行政区</territory>
+ <territory type="HM">赫德与麦克å”纳群岛</territory>
+ <territory type="HN">洪都拉斯</territory>
+ <territory type="HR">克罗地亚</territory>
+ <territory type="HT">海地</territory>
+ <territory type="HU">匈牙利</territory>
+ <territory type="ID">å°åº¦å°¼è¥¿äºš</territory>
+ <territory type="IE">爱尔兰</territory>
+ <territory type="IL">以色列</territory>
+ <territory type="IN">å°åº¦</territory>
+ <territory type="IO">英属å°åº¦æ´‹é¢†åœ°</territory>
+ <territory type="IQ">伊拉克</territory>
+ <territory type="IR">伊朗</territory>
+ <territory type="IS">冰岛</territory>
+ <territory type="IT">æ„大利</territory>
+ <territory type="JM">牙买加</territory>
+ <territory type="JO">约旦</territory>
+ <territory type="JP">日本</territory>
+ <territory type="KE">肯尼亚</territory>
+ <territory type="KG">å‰å°”å‰å…‹æ–¯å¦</territory>
+ <territory type="KH">柬埔寨</territory>
+ <territory type="KI">基里巴斯</territory>
+ <territory type="KM">科摩罗</territory>
+ <territory type="KN">圣基茨和尼维斯</territory>
+ <territory type="KP">北æœé²œ</territory>
+ <territory type="KR">韩国</territory>
+ <territory type="KW">科å¨ç‰¹</territory>
+ <territory type="KY">开曼群岛</territory>
+ <territory type="KZ">哈è¨å…‹æ–¯å¦</territory>
+ <territory type="LA">è€æŒäººæ°‘民主共和国</territory>
+ <territory type="LB">黎巴嫩</territory>
+ <territory type="LC">圣å¢è¥¿äºš</territory>
+ <territory type="LI">列支敦士登</territory>
+ <territory type="LK">斯里兰å¡</territory>
+ <territory type="LR">利比里亚</territory>
+ <territory type="LS">莱索托</territory>
+ <territory type="LT">立陶宛</territory>
+ <territory type="LU">å¢æ£®å ¡</territory>
+ <territory type="LV">拉脱维亚</territory>
+ <territory type="LY">利比亚</territory>
+ <territory type="MA">摩洛哥</territory>
+ <territory type="MC">摩纳哥</territory>
+ <territory type="MD">摩尔多瓦共和国</territory>
+ <territory type="MG">马达加斯加</territory>
+ <territory type="MH">马ç»å°”群岛</territory>
+ <territory type="MK">马其顿王国</territory>
+ <territory type="ML">马里</territory>
+ <territory type="MM">缅甸</territory>
+ <territory type="MN">è’™å¤</territory>
+ <territory type="MO">中国澳门特别行政区</territory>
+ <territory type="MP">北马里亚纳群岛</territory>
+ <territory type="MQ">马æ尼克岛</territory>
+ <territory type="MR">毛里塔尼亚</territory>
+ <territory type="MS">蒙特塞拉群岛</territory>
+ <territory type="MT">马耳他</territory>
+ <territory type="MU">毛里求斯</territory>
+ <territory type="MV">马尔代夫</territory>
+ <territory type="MW">马拉维</territory>
+ <territory type="MX">墨西哥</territory>
+ <territory type="MY">马æ¥è¥¿äºš</territory>
+ <territory type="MZ">莫桑比克</territory>
+ <territory type="NA">纳米比亚</territory>
+ <territory type="NC">新喀里多尼亚</territory>
+ <territory type="NE">尼日尔</territory>
+ <territory type="NF">诺ç¦å…‹å²›</territory>
+ <territory type="NG">尼日利亚</territory>
+ <territory type="NI">尼加拉瓜</territory>
+ <territory type="NL">è·å…°</territory>
+ <territory type="NO">挪å¨</territory>
+ <territory type="NP">尼泊尔</territory>
+ <territory type="NR">ç‘™é²</territory>
+ <territory type="NU">纽埃</territory>
+ <territory type="NZ">新西兰</territory>
+ <territory type="OM">阿曼</territory>
+ <territory type="PA">巴拿马</territory>
+ <territory type="PE">秘é²</territory>
+ <territory type="PF">法属波利尼西亚</territory>
+ <territory type="PG">巴布亚新几内亚</territory>
+ <territory type="PH">è²å¾‹å®¾</territory>
+ <territory type="PK">巴基斯å¦</territory>
+ <territory type="PL">波兰</territory>
+ <territory type="PM">圣皮埃尔和密克隆</territory>
+ <territory type="PN">皮特凯æ©</territory>
+ <territory type="PR">波多黎å„</territory>
+ <territory type="PS">å·´å‹’æ–¯å¦é¢†åœŸ</territory>
+ <territory type="PT">è‘¡è„牙</territory>
+ <territory type="PW">帕劳</territory>
+ <territory type="PY">巴拉圭</territory>
+ <territory type="QA">å¡å¡”å°”</territory>
+ <territory type="QO" draft="unconfirmed">大洋洲边远群岛</territory>
+ <territory type="RE">留尼汪</territory>
+ <territory type="RO">罗马尼亚</territory>
+ <territory type="RU">ä¿„ç½—æ–¯è”邦</territory>
+ <territory type="RW">å¢æ—ºè¾¾</territory>
+ <territory type="SA">沙特阿拉伯</territory>
+ <territory type="SB">所罗门群岛</territory>
+ <territory type="SC">塞舌尔</territory>
+ <territory type="SD">è‹ä¸¹</territory>
+ <territory type="SE">ç‘žå…¸</territory>
+ <territory type="SG">新加å¡</territory>
+ <territory type="SH">圣赫勒拿</territory>
+ <territory type="SI">斯洛文尼亚</territory>
+ <territory type="SJ">斯瓦尔巴特和扬马延</territory>
+ <territory type="SK">斯洛ä¼å…‹</territory>
+ <territory type="SL">塞拉利昂</territory>
+ <territory type="SM">圣马力诺</territory>
+ <territory type="SN">塞内加尔</territory>
+ <territory type="SO">索马里</territory>
+ <territory type="SR">è‹é‡Œå—</territory>
+ <territory type="ST">圣多美和普林西比</territory>
+ <territory type="SV">è¨å°”瓦多</territory>
+ <territory type="SY">å™åˆ©äºš</territory>
+ <territory type="SZ">æ–¯å¨å£«å…°</territory>
+ <territory type="TC">特克斯和凯科斯群岛</territory>
+ <territory type="TD">ä¹å¾—</territory>
+ <territory type="TF">法属å—åŠçƒé¢†åœ°</territory>
+ <territory type="TG">多哥</territory>
+ <territory type="TH">泰国</territory>
+ <territory type="TJ">å¡”å‰å…‹æ–¯å¦</territory>
+ <territory type="TK">托克劳</territory>
+ <territory type="TL">东å¸æ±¶</territory>
+ <territory type="TM">土库曼斯å¦</territory>
+ <territory type="TN">çªå°¼æ–¯</territory>
+ <territory type="TO">汤加</territory>
+ <territory type="TR">土耳其</territory>
+ <territory type="TT">特立尼达和多巴哥</territory>
+ <territory type="TV">图瓦å¢</territory>
+ <territory type="TW">å°æ¹¾</territory>
+ <territory type="TZ">å¦æ¡‘尼亚</territory>
+ <territory type="UA">乌克兰</territory>
+ <territory type="UG">乌干达</territory>
+ <territory type="UM">美国边远å°å²›</territory>
+ <territory type="US">美国</territory>
+ <territory type="UY">乌拉圭</territory>
+ <territory type="UZ">乌兹别克斯å¦</territory>
+ <territory type="VA">梵蒂冈</territory>
+ <territory type="VC">圣文森特和格林纳ä¸æ–¯</territory>
+ <territory type="VE">委内瑞拉</territory>
+ <territory type="VG">英属维京群岛</territory>
+ <territory type="VI">美属维京群岛</territory>
+ <territory type="VN">越å—</territory>
+ <territory type="VU">瓦努阿图</territory>
+ <territory type="WF">瓦利斯和富图纳</territory>
+ <territory type="WS">è¨æ‘©äºš</territory>
+ <territory type="YE">也门</territory>
+ <territory type="YT">马约特</territory>
+ <territory type="ZA">å—éž</territory>
+ <territory type="ZM">赞比亚</territory>
+ <territory type="ZW">津巴布韦</territory>
+ </territories>
+ <variants>
+ <variant type="REVISED">已修订</variant>
+ </variants>
+ <keys>
+ <key type="calendar">日历</key>
+ <key type="collation">对照</key>
+ <key type="currency">è´§å¸</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation" draft="unconfirmed">ç¹ä½“中文(Big5)</type>
+ <type type="buddhist" key="calendar">佛教日历</type>
+ <type type="chinese" key="calendar">农历</type>
+ <type type="direct" key="collation">顺åº</type>
+ <type type="gb2312han" key="collation" draft="unconfirmed">简体中文(GB2312)</type>
+ <type type="gregorian" key="calendar">公历</type>
+ <type type="hebrew" key="calendar">希伯æ¥æ—¥åŽ†</type>
+ <type type="islamic" key="calendar">伊斯兰日历</type>
+ <type type="islamic-civil" key="calendar">伊斯兰希å‰æ¥åŽ†</type>
+ <type type="japanese" key="calendar">日本日历</type>
+ <type type="phonebook" key="collation">电è¯ç°¿é¡ºåº</type>
+ <type type="pinyin" key="collation">拼音顺åº</type>
+ <type type="stroke" key="collation">笔划顺åº</type>
+ <type type="traditional" key="collation">传统历法</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[阿 å•Š å“Ž å“€ 唉 埃 艾 爱 ç¢ å®‰ 岸 按 案 æš— 昂 傲 奥 æ¾³ å…« å·´ å­ å§ èŠ­ æ‹” 把 爸 ç½¢ 霸 白 百 æŸ æ‘† è´¥ æ‹œ ç­ èˆ¬ æ¬ æ¿ ç‰ˆ 办 åŠ ä¼´ 扮 邦 帮 榜 棒 磅 包 胞 å® é¥± ä¿ å ¡ 报 抱 æš´ 爆 æ¯ æ‚² 北 è´ å¤‡ 背 å€ è¢« 辈 奔 本 笨 å´© 逼 é¼» 比 å½¼ 俾 笔 å¸ å¿… 毕 é—­ æ• å¼Š 碧 å£ é¿ è‡‚ è¾¹ ç¼– æ‰ ä¾¿ å˜ é 辨 辩 æ ‡ 飙 表 别 宾 彬 滨 冰 å…µ 丙 饼 ç—… 拨 æ³¢ 玻 æ’­ 伯 泊 åš è–„ è¡¥ æ• ä¸ å¸ƒ æ­¥ 怖 部 ç°¿ 擦 猜 æ‰ æ è´¢ è£ é‡‡ 彩 踩 èœ è”¡ å‚ é¤ æ®‹ 惨 ç¿ æ²§ è‹ è— æ“ æ›¹ è‰ ä¾§ 测 ç­– 层 å‰ æ’ æŸ¥ 茶 察 å·® 拆 柴 禅 ç¼  é˜ æ˜Œ é•¿ å° å¸¸ 场 ç•… å”± 抄 超 æœ æ½® åµ è½¦ 扯 å½» å°˜ 臣 沉 陈 晨 称 è¶ æˆ å‘ˆ 承 诚 城 乘 程 秤 åƒ ç—´ æ±  è¿Ÿ æŒ åŒ™ å°º 齿 æ–¥ 赤 ç¿… å…… 冲 虫 å´‡ 抽 仇 æ„ ç­¹ 臭 出 åˆ é™¤ ç¡€ 储 楚 处 å· ç©¿ ä¼  船 串 窗 床 创 å¹ åž‚ 春 纯 è ¢ è¯ èŒ¨ æ…ˆ 辞 ç£ æ­¤ 次 刺 èµ ä»Ž 匆 èª ç²— 促 催 脆 ç²¹ ç¿  æ‘ å­˜ 寸 措 é”™ æ­ å—’ è¾¾ ç­” é¼ éž‘ 打 大 呆 代 带 å¾… 袋 戴 丹 å• æ‹… 胆 掸 æ—¦ 但 诞 å¼¹ æ·¡ 蛋 当 挡 æ¡£ 刀 导 å²› 倒 到 é“ å¾— å¾· çš„ ç¯ ç™» ç­‰ é‚“ 低 æ»´ 迪 æ•Œ 笛 底 抵 地 弟 å¸ é€’ 第 è’‚ å…¸ 点 电 甸 店 åŠ é’“ è°ƒ 掉 è·Œ 碟 è¶ ä¸ é¡¶ 订 定 丢 东 冬 懂 动 æ ‹ æ´ž 都 æ–— 豆 ç£ æ¯’ 读 独 赌 æœ è‚š 度 渡 端 短 段 æ–­ å † 队 对 å…‘ 敦 盾 é¡¿ 多 夺 朵 躲 å • ä¿„ 莪 é¹… é¢ åŽ„ æ¶ é„‚ æ© è€Œ å°” 耳 二 å‘ ä¹ ä¼ ç½š 法 番 ç¿» 凡 烦 ç¹ å è¿” 犯 æ³› 饭 è´© 梵 æ–¹ 芳 防 妨 房 仿 访 å½· 放 飞 éž å•¡ è² è‚¥ è…“ æ– åºŸ è´¹ 分 纷 芬 æ°› 粉 份 奋 丰 风 æž« å° ç–¯ å³° 锋 蜂 逢 凤 奉 ä½› 缶 å¦ å¤« 肤 å¼— ä¼ æœ æµ® 符 å¹… ç¦ åºœ è¾… è… çˆ¶ 付 妇 è´Ÿ 附 å¤ å‰¯ 富 赋 è…¹ 覆 ä¼½ 该 改 ç›– 概 å¹² 甘 æ•¢ æ„Ÿ 冈 刚 å²— 纲 缸 é’¢ 港 高 糕 æž ç¨¿ å‘Š 戈 å“¥ 割 æ­Œ é˜ é© æ ¼ è‘› éš” 个 å„ ç»™ æ ¹ è·Ÿ æ›´ å·¥ å…¬ 功 æ”» ä¾› æ­ å…± è´¡ 勾 沟 ç‹— è´­ ä¼° 姑 å­¤ å¤ è°· è‚¡ 骨 鼓 固 æ•… 顾 ç“œ 寡 ä¹– 怪 å…³ 观 官 冠 馆 管 è´¯ 惯 çŒ ç½ å…‰ 广 逛 å½’ 圭 龟 规 ç‘° 轨 鬼 è´µ 郭 é”… 国 æžœ 过 哈 å—¨ å­© æµ· 害 å« å‡½ 涵 寒 韩 罕 å–Š 汉 æ±— 憾 ç¿° 航 毫 豪 好 å· æµ© 耗 呵 å– åˆ ä½• å’Œ æ²³ æ ¸ è· ç›’ è´º 赫 鹤 黑 嘿 ç—• 很 ç‹  æ¨ äº¨ è¡¡ è½° 弘 红 å® æ´ª 虹 鸿 侯 åŽ åŽš 後 候 乎 呼 忽 ç‹ èƒ¡ æ¹– 糊 虎 唬 互 护 花 åŽ æ»‘ 化 划 ç”» è¯ æ€€ 欢 还 环 缓 å¹» 唤 æ¢ æ‚£ è’ çš‡ 凰 黄 ç…Œ 晃 ç° æ¢ æŒ¥ 辉 回 æ‚” 会 绘 惠 æ…§ æ˜ å©š 浑 é­‚ æ·· æ´» ç« ä¼™ 夥 或 è´§ 获 祸 惑 éœ ä¸Œ 击 圾 矶 积 基 绩 æ¿€ åŠ å‰ çº§ å³ æž æ€¥ ç–¾ 集 辑 ç± å‡  å·± 挤 计 è®° 纪 å¿Œ 技 é™… 剂 å­£ æ—¢ 济 继 寂 寄 加 夹 ä½³ 迦 家 嘉 甲 è´¾ 驾 架 å‡ å« å°– åš é—´ è‚© å…¼ 监 柬 æ¡ å‰ª 检 简 è§ ä»¶ 建 剑 è´± å¥ èˆ° æ¸ é”® ç®­ 江 å°† ç–† 讲 è’‹ é™ äº¤ 胶 焦 角 ç¼´ å« è¾ƒ æ•™ 阶 皆 接 è¡— 节 劫 æ° ç»“ æ· æˆª 羯 她 å§ è§£ 介 戒 ç•Œ 借 è—‰ 今 金 æ´¥ ç­‹ ä»… ç´§ è°¨ 锦 å°½ 劲 è¿‘ è¿› 晋 ç¦ äº¬ ç» æ™¶ ç› ç²¾ 井 景 è­¦ 径 ç«ž ç«Ÿ 敬 é– å¢ƒ é™ é•œ 究 ä¹ ä¹… é…’ æ—§ æ•‘ å°± å±… 拘 å±€ 举 å¥ å·¨ æ‹’ å…· 俱 剧 惧 è· èš å¨Ÿ æ å· å€¦ 觉 爵 军 å› å‡ ä¿Š å’– å–€ å¡ å¼€ 凯 刊 å ª åŽ ç  çœ‹ 康 抗 考 æ‹· 烤 é  æŸ¯ 科 颗 å¯ æ¸´ å…‹ 刻 客 课 肯 å‘ ç©º å­” æ 控 å£ æ‰£ 寇 å“­ 苦 库 裤 é…· 夸 å— å¿« 宽 款 ç‹‚ 框 äº æ„§ å¤ æ˜† å›° 扩 括 阔 垃 拉 啦 å–‡ è…Š æ¥ èŽ± èµ– å…° 岚 拦 æ  è“ ç¯® 览 懒 烂 滥 郎 狼 朗 浪 劳 牢 è€ ä¹ å‹’ é›· é•­ åž’ ç±» ç´¯ 冷 莉 ç’ƒ 黎 礼 æŽ é‡Œ å“© ç† åŠ› 历 厉 ç«‹ 丽 利 励 åœ ä¾‹ ç²’ 雳 ä¿© è¿ž 莲 è” å»‰ 脸 练 æ‹ è‰¯ æ¢ ä¸¤ 亮 è°… 辆 é‡ ç–— èŠ å»– 了 æ–™ å’§ 列 劣 烈 裂 é‚» æž— 临 æ·‹ ç³ éœ– å çµ çŽ² 凌 铃 陵 零 龄 领 令 å¦ æºœ 刘 æµ ç•™ 柳 å…­ å’¯ é¾™ 隆 娄 楼 æ¼ éœ² å¢ èŠ¦ 炉 é² é™† 鹿 è·¯ æ—… 律 虑 率 ä¹± ç•¥ 伦 è½® 论 ç½— 逻 æ´› 络 è½ å¦ˆ 麻 马 玛 ç  å— å˜› 埋 ä¹° 迈 麦 å– è›® 满 曼 æ…¢ 漫 å¿™ 芒 茫 毛 矛 茂 冒 帽 貌 么 玫 眉 梅 媒 æ¯ ç¾Ž 妹 é­… é—¨ é—· 们 盟 猛 è’™ å­Ÿ 梦 å’ª å¼¥ è¿· è°œ ç±³ 秘 密 蜜 眠 绵 棉 å… å‹‰ ç¼… é¢ å–µ è‹— æ 秒 妙 庙 ç­ è”‘ æ°‘ æ• å 明 鸣 é“­ 命 摸 模 æ‘© 磨 é­” 抹 末 莫 寞 æ¼  墨 默 è°‹ æŸ æ¯ ç‰¡ 姆 木 ç›® 牧 幕 æ…• æš® 穆 æ‹¿ 哪 内 é‚£ 纳 娜 乃 奶 奈 è€ ç”· å— éš¾ æ¼ è„‘ ç‘™ é—¹ å‘ å‘¢ å«© 能 å—¯ 妮 å°¼ æ³¥ ä½  æ‹Ÿ 逆 å¹´ 念 娘 鸟 涅 您 å® å‡ ç‰› 扭 纽 农 侬 浓 弄 奴 努 怒 女 æš– 挪 诺 å– å“¦ 欧 å¶ å•ª 爬 帕 怕 æ‹ æŽ’ 牌 æ´¾ 潘 盘 判 盼 庞 æ— èƒ– ç‚® è·‘ 泡 陪 培 èµ” 佩 é… å–· 朋 å½­ 棚 蓬 澎 碰 批 披 霹 çš® ç–² 匹 å± ç‰‡ å 篇 骗 漂 飘 票 拼 频 å“ å¹³ 评 凭 åª å± ç“¶ è å¡ é¢‡ 婆 è¿« ç ´ 扑 è© è‘¡ 埔 浦 æ™® è°± 七 妻 期 欺 é½ å…¶ 奇 骑 棋 çª æ—— ä¼ å²‚ èµ· 弃 æ±½ æ³£ 契 器 æ° æ´½ åƒ è¿ ç‰µ ç­¾ å‰ é’± ä¹¾ 潜 æµ… 欠 æ­‰ 枪 抢 æ‚„ 敲 ä¹” 侨 æ¡¥ 瞧 å·§ 翘 切 且 亲 ä¾µ é’¦ 秦 ç´ å‹¤ å¯ é’ è½» 倾 清 情 æ™´ æ“Ž 请 庆 ç©· 穹 丘 邱 秋 求 é…‹ çƒ åŒº 曲 驱 趋 å– åŽ» 趣 圈 å…¨ æƒ æ³‰ 拳 åŠ åˆ¸ 缺 群 然 燃 染 让 绕 惹 热 人 ä» å¿ è®¤ ä»» ä» æ—¥ è£ å®¹ 蓉 èž æŸ” 肉 如 å„’ æ± è¾± å…¥ 阮 软 ç‘ž è‹¥ åŒ å¼± æ’’ è¨ å¡ž èµ› 三 æ•£ æ¡‘ 丧 骚 扫 色 ç‘Ÿ 森 僧 æ€ æ²™ ç ‚ 莎 å‚» å•¥ ç…ž æ™’ å±± æ‰ çŠ é—ª 扇 å–„ 伤 商 èµ ä¸Š å°š 烧 ç¨ å°‘ ç» èˆŒ 蛇 èˆ åŽ è®¾ 社 å°„ 涉 æ‘„ 申 伸 身 æ·± 神 沈 审 甚 æ…Ž å‡ ç”Ÿ 声 牲 çœ åœ£ ç›› 剩 失 师 诗 æ–½ ç‹® å 什 石 æ—¶ 识 实 拾 食 å² ä½¿ 始 驶 士 æ° ä¸– 市 示 å¼ äº‹ 势 视 试 饰 室 是 é€ é‡Š 誓 收 手 守 首 寿 å— å…½ å”® 授 书 å” æž¢ 殊 æ·‘ ç– èˆ’ 输 熟 æš‘ ç½² é¼  属 术 æŸ è¿° æ ‘ æ•° 刷 è€ æ‘” 帅 åŒ çˆ½ è° æ°´ ç¡ é¡º 说 ç¡• ä¸ å¸ ç§ æ€ æ–¯ æ­» å›› ä¼¼ æ¾ å®‹ é€ æœ è‹ ç¨£ ä¿— 诉 ç´  速 宿 å¡‘ é…¸ ç®— 虽 éš å² ç¢Ž å­™ æŸ ç¼© 所 ç´¢ é” ä»– 它 å¡” è¸ èƒŽ å° æŠ¬ 太 æ€ æ³° è´ª æ‘Š å› è°ˆ 檀 å¦ å¹ æŽ¢ 汤 å” å ‚ ç³– 涛 逃 桃 陶 æ·˜ è„ è®¨ 套 特 ç–¼ è…¾ è—¤ 梯 踢 æ 题 体 替 天 æ·» ç”° 甜 å¡« 挑 æ¡ è·³ è´´ é“ åŽ… å»· 庭 åœ æŒº 通 åŒ ç«¥ 统 ç—› å· å¤´ 投 é€ çª å›¾ å¾’ 途 å±  土 å å…” 团 推 è…¿ 退 托 æ‹– 脱 陀 妥 哇 娃 挖 è›™ 瓦 佤 æ­ª 外 弯 æ¹¾ 丸 完 玩 顽 å®› 晚 碗 汪 亡 王 å¾€ 忘 æ—º 望 å± å¨ å¾® 为 韦 å›´ è¿ å”¯ ç»´ 伟 å°¾ 委 å« æœª ä½ å‘³ è°“ å–‚ æ…° 温 æ–‡ é—» 雯 å» ç¨³ é—® 汶 ç¿ æŒ å–” çª æˆ‘ 沃 æ¡ ä¹Œ 污 å‘œ å·« 屋 æ—  å¾ äº” åˆ ä¼ æ­¦ 舞 å‹¿ 务 物 误 æ‚Ÿ 雾 夕 å…® 西 å¸ å¸Œ æž æ¯ ç‰º 悉 惜 稀 溪 锡 嘻 ä¹  席 袭 æ´— å–œ æˆ ç³» 细 虾 ä¾  峡 下 å“ å¤ ä»™ å…ˆ 鲜 弦 è´¤ å«Œ 显 险 县 岘 现 é™ å®ª é™· 献 乡 相 香 ç®± 详 祥 ç¿” 享 å“ æƒ³ å‘ å·· 项 象 åƒ æ¶ˆ è§ é”€ å° æ™“ å­ æ•ˆ æ ¡ 笑 些 å 邪 èƒ æ–œ éž‹ 写 械 è°¢ 蟹 心 è¾› 欣 æ–° è–ª 馨 ä¿¡ å…´ 星 刑 è¡Œ å½¢ åž‹ 醒 姓 幸 性 å…„ 匈 胸 雄 熊 休 ä¿® 羞 秀 é¡» 需 å¾ è®¸ æ—­ åº å™ ç»ª ç»­ 轩 宣 玄 æ—‹ 选 å­¦ 雪 è¡€ å‹‹ 寻 å·¡ 询 循 è®­ 讯 è¿… 逊 压 å‘€ 鸭 牙 çŠ æ¶¯ é›… 亚 延 严 言 沿 ç‚Ž ç ” 掩 眼 æ¼” 厌 验 燕 央 扬 羊 阳 æ¨ æ´‹ ä»° å…» æ · 妖 è…° é‚€ 瑶 å’¬ è¯ è¦ è€€ 椰 爷 耶 也 野 业 å¶ é¡µ 夜 液 一 伊 è¡£ 医 ä¾ ä»ª 夷 宜 怡 å’¦ 移 é— ç–‘ å½ ä¹™ å·² 以 矣 èš å€š 椅 义 亿 忆 艺 è®® 亦 å½¹ 抑 译 易 益 è°Š 逸 æ„ æ¯… 翼 å›  阴 音 åŸ é“¶ 引 饮 éš å° åº” 英 樱 é¹° è¿Ž 盈 è¤ è¥ èµ¢ å½± 映 硬 å“Ÿ å”· æ‹¥ 庸 æ°¸ æ³³ 勇 用 忧 呦 å¹½ æ‚  å°¤ ç”± 犹 é‚® æ²¹ 游 å‹ æœ‰ åˆ å³ å¹¼ 佑 于 予 ä½™ æ–¼ é±¼ 愉 æ„š ç‘œ 与 宇 ç¾½ 雨 语 玉 育 狱 æµ´ 预 域 欲 å–» 裕 é‡ æ„ˆ 誉 å…ƒ 员 å›­ 原 圆 æ´ ç¼˜ æº è¿œ 怨 院 æ›° 约 月 å²³ è·ƒ 越 云 å… å­• è¿ æ‚ å“‰ è½½ å† åœ¨ å’± æš‚ 赞 é­ ç³Ÿ æ—© 造 则 æ‹© æ³½ è´£ è´¼ 怎 曾 增 èµ  渣 扎 札 ä¹ ç‚¸ æ–‹ 摘 寨 展 å  æˆ˜ ç«™ å¼  ç«  å½° 涨 掌 丈 å¸ éšœ æ‹› 昭 找 å¬ èµµ ç…§ é® æŠ˜ 哲 者 è¿™ è´ž é’ˆ 侦 ç 真 阵 振 镇 震 争 å¾ å¾µ æ•´ æ­£ è¯ éƒ‘ 政 之 支 èŠ æž çŸ¥ 织 执 ç›´ 值 èŒ æ¤ æ­¢ æ—¨ å€ çº¸ 指 至 å¿— 制 æ²» è´¨ 秩 致 智 ç½® 中 å¿  终 é’Ÿ 锺 ç§ ä»² ä¼— é‡ å·ž 舟 周 æ´² å®™ 骤 朱 ç  è¯¸ é“¢ 竹 é€ ä¸» ç…® ä½ åŠ© 注 é©» ç¥ è‘— 抓 爪 专 转 赚 装 壮 状 æ’ž 追 准 å“ æ‰ æ¡Œ ä»” å­œ å…¹ 姿 资 滋 å­ å§Š ç´« å­— 自 å®— 综 总 纵 èµ° å¥ ç§Ÿ 足 å’ æ— é˜» 组 祖 é’» 嘴 最 罪 醉 å°Š éµ æ˜¨ å·¦ ä½ ä½œ å 座 åš]</exemplarCharacters>
+ </characters>
+ <dates>
+ <localizedPatternChars>GanjkHmsSEDFwWxhKzAeugXZvcL</localizedPatternChars>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">一月</month>
+ <month type="2">二月</month>
+ <month type="3">三月</month>
+ <month type="4">四月</month>
+ <month type="5">五月</month>
+ <month type="6">六月</month>
+ <month type="7">七月</month>
+ <month type="8">八月</month>
+ <month type="9">ä¹æœˆ</month>
+ <month type="10">å月</month>
+ <month type="11">å一月</month>
+ <month type="12">å二月</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1">一月</month>
+ <month type="2">二月</month>
+ <month type="3">三月</month>
+ <month type="4">四月</month>
+ <month type="5">五月</month>
+ <month type="6">六月</month>
+ <month type="7">七月</month>
+ <month type="8">八月</month>
+ <month type="9">ä¹æœˆ</month>
+ <month type="10">å月</month>
+ <month type="11">å一月</month>
+ <month type="12">å二月</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1">1月</month>
+ <month type="2">2月</month>
+ <month type="3">3月</month>
+ <month type="4">4月</month>
+ <month type="5">5月</month>
+ <month type="6">6月</month>
+ <month type="7">7月</month>
+ <month type="8">8月</month>
+ <month type="9">9月</month>
+ <month type="10">10月</month>
+ <month type="11">11月</month>
+ <month type="12">12月</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun">周日</day>
+ <day type="mon">周一</day>
+ <day type="tue">周二</day>
+ <day type="wed">周三</day>
+ <day type="thu">周四</day>
+ <day type="fri">周五</day>
+ <day type="sat">周六</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun">星期日</day>
+ <day type="mon">星期一</day>
+ <day type="tue">星期二</day>
+ <day type="wed">星期三</day>
+ <day type="thu">星期四</day>
+ <day type="fri">星期五</day>
+ <day type="sat">星期六</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun">æ—¥</day>
+ <day type="mon">一</day>
+ <day type="tue">二</day>
+ <day type="wed">三</day>
+ <day type="thu">å››</day>
+ <day type="fri">五</day>
+ <day type="sat">å…­</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1" draft="unconfirmed">1å­£</quarter>
+ <quarter type="2" draft="unconfirmed">2å­£</quarter>
+ <quarter type="3" draft="unconfirmed">3å­£</quarter>
+ <quarter type="4" draft="unconfirmed">4å­£</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">第1季度</quarter>
+ <quarter type="2" draft="unconfirmed">第2季度</quarter>
+ <quarter type="3" draft="unconfirmed">第3季度</quarter>
+ <quarter type="4" draft="unconfirmed">第4季度</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am>上åˆ</am>
+ <pm>下åˆ</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">公元å‰</era>
+ <era type="1" draft="unconfirmed">公元</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0">公元å‰</era>
+ <era type="1">公元</era>
+ </eraAbbr>
+ </eras>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="Md" draft="provisional">M'月'd'日'</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">yyyy'年'M'月'</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HHmm;-HHmm</hourFormat>
+ <zone type="Africa/Timbuktu">
+ <exemplarCity>延巴克图</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/ComodRivadavia">
+ <exemplarCity>科摩罗(群岛)</exemplarCity>
+ </zone>
+ <zone type="Europe/Belfast">
+ <exemplarCity>è´å°”法斯特</exemplarCity>
+ </zone>
+ <zone type="Pacific/Yap">
+ <exemplarCity>雅浦岛</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Rothera">
+ <exemplarCity>罗瑟拉</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Palmer">
+ <exemplarCity>帕默</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>å—æž</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Syowa">
+ <exemplarCity draft="unconfirmed">昭和</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Mawson">
+ <exemplarCity>莫森</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Davis">
+ <exemplarCity>戴维斯</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Vostok">
+ <exemplarCity>东方站</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Casey">
+ <exemplarCity>凯西</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity draft="unconfirmed">æœè’™æœå¨å‹’</exemplarCity>
+ </zone>
+ <zone type="Antarctica/McMurdo">
+ <exemplarCity>马克默多</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Rio_Gallegos">
+ <exemplarCity>里奥加耶戈斯</exemplarCity>
+ </zone>
+ <zone type="America/Mendoza">
+ <exemplarCity>门多è¨</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/San_Juan">
+ <exemplarCity>圣胡安</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Ushuaia">
+ <exemplarCity>乌斯怀亚</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/La_Rioja">
+ <exemplarCity>拉里奥哈</exemplarCity>
+ </zone>
+ <zone type="America/Catamarca">
+ <exemplarCity>å¡å¡”马å¡</exemplarCity>
+ </zone>
+ <zone type="America/Jujuy">
+ <exemplarCity>胡胡伊</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Tucuman">
+ <exemplarCity>图库曼</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity>科尔多瓦</exemplarCity>
+ </zone>
+ <zone type="America/Buenos_Aires">
+ <exemplarCity>布宜诺斯艾利斯</exemplarCity>
+ </zone>
+ <zone type="Australia/Perth">
+ <exemplarCity>佩æ€</exemplarCity>
+ </zone>
+ <zone type="Australia/Darwin">
+ <exemplarCity>达尔文</exemplarCity>
+ </zone>
+ <zone type="Australia/Adelaide">
+ <exemplarCity>阿德莱德</exemplarCity>
+ </zone>
+ <zone type="Australia/Broken_Hill">
+ <exemplarCity>布罗肯希尔</exemplarCity>
+ </zone>
+ <zone type="Australia/Melbourne">
+ <exemplarCity>墨尔本</exemplarCity>
+ </zone>
+ <zone type="Australia/Hobart">
+ <exemplarCity>éœå·´ç‰¹</exemplarCity>
+ </zone>
+ <zone type="Australia/Lindeman">
+ <exemplarCity draft="unconfirmed">林德曼</exemplarCity>
+ </zone>
+ <zone type="Australia/Sydney">
+ <exemplarCity>悉尼</exemplarCity>
+ </zone>
+ <zone type="Australia/Brisbane">
+ <exemplarCity>布里斯ç­</exemplarCity>
+ </zone>
+ <zone type="Australia/Lord_Howe">
+ <exemplarCity>豪勋爵</exemplarCity>
+ </zone>
+ <zone type="America/Eirunepe">
+ <exemplarCity draft="unconfirmed">埃é²å†…佩</exemplarCity>
+ </zone>
+ <zone type="America/Rio_Branco">
+ <exemplarCity>里奥布郎库</exemplarCity>
+ </zone>
+ <zone type="America/Porto_Velho">
+ <exemplarCity>波多韦柳</exemplarCity>
+ </zone>
+ <zone type="America/Boa_Vista">
+ <exemplarCity>åšé˜¿ç»´æ–¯å¡”</exemplarCity>
+ </zone>
+ <zone type="America/Manaus">
+ <exemplarCity>马瑙斯</exemplarCity>
+ </zone>
+ <zone type="America/Cuiaba">
+ <exemplarCity>库亚巴</exemplarCity>
+ </zone>
+ <zone type="America/Campo_Grande">
+ <exemplarCity>大åŽæ™®</exemplarCity>
+ </zone>
+ <zone type="America/Belem">
+ <exemplarCity>è´ä¼¦</exemplarCity>
+ </zone>
+ <zone type="America/Araguaina">
+ <exemplarCity>阿拉瓜伊纳</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>圣ä¿ç½—</exemplarCity>
+ </zone>
+ <zone type="America/Bahia">
+ <exemplarCity>巴伊亚</exemplarCity>
+ </zone>
+ <zone type="America/Fortaleza">
+ <exemplarCity>ç¦å¡”é›·è¨</exemplarCity>
+ </zone>
+ <zone type="America/Maceio">
+ <exemplarCity>马塞约</exemplarCity>
+ </zone>
+ <zone type="America/Recife">
+ <exemplarCity>累西腓</exemplarCity>
+ </zone>
+ <zone type="America/Noronha">
+ <exemplarCity draft="unconfirmed">诺农哈</exemplarCity>
+ </zone>
+ <zone type="America/Dawson">
+ <exemplarCity>é“森</exemplarCity>
+ </zone>
+ <zone type="America/Whitehorse">
+ <exemplarCity>怀特éœæ–¯</exemplarCity>
+ </zone>
+ <zone type="America/Vancouver">
+ <exemplarCity>温哥åŽ</exemplarCity>
+ </zone>
+ <zone type="America/Dawson_Creek">
+ <exemplarCity>é“森克里克</exemplarCity>
+ </zone>
+ <zone type="America/Yellowknife">
+ <exemplarCity>耶洛奈夫</exemplarCity>
+ </zone>
+ <zone type="America/Inuvik">
+ <exemplarCity>伊努维克</exemplarCity>
+ </zone>
+ <zone type="America/Edmonton">
+ <exemplarCity>埃德蒙顿</exemplarCity>
+ </zone>
+ <zone type="America/Swift_Current">
+ <exemplarCity>æ–¯å¨å¤«ç‰¹å¡ä¼¦ç‰¹</exemplarCity>
+ </zone>
+ <zone type="America/Cambridge_Bay">
+ <exemplarCity draft="unconfirmed">åŽå¸ƒé‡Œå­£è´</exemplarCity>
+ </zone>
+ <zone type="America/Regina">
+ <exemplarCity>里贾纳</exemplarCity>
+ </zone>
+ <zone type="America/Winnipeg">
+ <exemplarCity>温尼伯</exemplarCity>
+ </zone>
+ <zone type="America/Rainy_River">
+ <exemplarCity>雷尼河</exemplarCity>
+ </zone>
+ <zone type="America/Rankin_Inlet">
+ <exemplarCity draft="unconfirmed">雷今海å£</exemplarCity>
+ </zone>
+ <zone type="America/Thunder_Bay">
+ <exemplarCity>æ¡‘å¾·è´</exemplarCity>
+ </zone>
+ <zone type="America/Nipigon">
+ <exemplarCity>尼皮贡</exemplarCity>
+ </zone>
+ <zone type="America/Toronto">
+ <exemplarCity>多伦多</exemplarCity>
+ </zone>
+ <zone type="America/Montreal">
+ <exemplarCity>蒙特利尔</exemplarCity>
+ </zone>
+ <zone type="America/Iqaluit">
+ <exemplarCity>伊基克</exemplarCity>
+ </zone>
+ <zone type="America/Pangnirtung">
+ <exemplarCity draft="unconfirmed">庞贡å”</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <standard>大西洋标准时间</standard>
+ <daylight>大西洋å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ <short>
+ <standard draft="provisional">大西洋标准时间</standard>
+ <daylight draft="provisional">大西洋å¤ä»¤æ—¶é—´</daylight>
+ </short>
+ <exemplarCity>哈利法克斯</exemplarCity>
+ </zone>
+ <zone type="America/Goose_Bay">
+ <exemplarCity>å¤æ–¯æ¹¾</exemplarCity>
+ </zone>
+ <zone type="America/Glace_Bay">
+ <exemplarCity>格莱斯è´</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <standard>纽芬兰标准时间</standard>
+ <daylight>纽芬兰å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ <short>
+ <standard>NST 纽芬兰标准时间</standard>
+ <daylight>NDT 纽芬兰å¤ä»¤æ—¶é—´</daylight>
+ </short>
+ <exemplarCity>圣约翰</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity>金沙è¨</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity>å¢æœ¬å·´å¸Œ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>å¤æ´»èŠ‚å²›</exemplarCity>
+ </zone>
+ <zone type="America/Santiago">
+ <exemplarCity>圣地亚哥</exemplarCity>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity>喀什葛尔</exemplarCity>
+ </zone>
+ <zone type="Asia/Urumqi">
+ <exemplarCity>乌é²æœ¨é½</exemplarCity>
+ </zone>
+ <zone type="Asia/Chongqing">
+ <exemplarCity>é‡åº†</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <standard>中国标准时间</standard>
+ <daylight>中国标准时间</daylight>
+ </long>
+ <exemplarCity>上海</exemplarCity>
+ </zone>
+ <zone type="Asia/Harbin">
+ <exemplarCity>哈尔滨</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity>加拉帕哥斯</exemplarCity>
+ </zone>
+ <zone type="America/Guayaquil">
+ <exemplarCity>瓜亚基尔</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>加那利群岛</exemplarCity>
+ </zone>
+ <zone type="Africa/Ceuta">
+ <exemplarCity>休达</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity>马德里</exemplarCity>
+ </zone>
+ <zone type="Pacific/Truk">
+ <exemplarCity>特é²å…‹ç¾¤å²›</exemplarCity>
+ </zone>
+ <zone type="Pacific/Ponape">
+ <exemplarCity>波纳佩岛</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kosrae">
+ <exemplarCity draft="unconfirmed">科斯里</exemplarCity>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <standard>中欧标准时间</standard>
+ <daylight>中欧å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ <short>
+ <standard>CET</standard>
+ <daylight>CEST</daylight>
+ </short>
+ <exemplarCity>巴黎</exemplarCity>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>伦敦</exemplarCity>
+ </zone>
+ <zone type="America/Thule">
+ <exemplarCity>图勒</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity>戈德éœæ™®</exemplarCity>
+ </zone>
+ <zone type="America/Scoresbysund">
+ <exemplarCity draft="unconfirmed">斯科列斯比桑德</exemplarCity>
+ </zone>
+ <zone type="America/Danmarkshavn">
+ <exemplarCity draft="unconfirmed">丹麦沙文</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity>雅加达</exemplarCity>
+ </zone>
+ <zone type="Asia/Pontianak">
+ <exemplarCity>å¤ç”¸</exemplarCity>
+ </zone>
+ <zone type="Asia/Makassar">
+ <exemplarCity>望加锡</exemplarCity>
+ </zone>
+ <zone type="Asia/Jayapura">
+ <exemplarCity>查亚普拉</exemplarCity>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <standard>以色列标准时间</standard>
+ <daylight>以色列å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ <short>
+ <standard>IST</standard>
+ <daylight>IDT</daylight>
+ </short>
+ <exemplarCity>耶路撒冷</exemplarCity>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <standard>日本标准时间</standard>
+ <daylight>日本标准时间</daylight>
+ </long>
+ <short>
+ <standard>JST</standard>
+ <daylight>JST</daylight>
+ </short>
+ <exemplarCity>东京</exemplarCity>
+ </zone>
+ <zone type="Pacific/Enderbury">
+ <exemplarCity>æ©å¾·è´é‡Œ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kiritimati">
+ <exemplarCity draft="unconfirmed">克里斯马斯</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tarawa">
+ <exemplarCity draft="unconfirmed">塔拉瓦岛</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtau">
+ <exemplarCity>阿克套</exemplarCity>
+ </zone>
+ <zone type="Asia/Oral">
+ <exemplarCity draft="unconfirmed">奥拉</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtobe">
+ <exemplarCity>阿克托别</exemplarCity>
+ </zone>
+ <zone type="Asia/Qyzylorda">
+ <exemplarCity>克孜勒奥尔达</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity>阿拉木图</exemplarCity>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <standard>格林å¨æ²»æ ‡å‡†æ—¶é—´</standard>
+ <daylight>格林å¨æ²»æ ‡å‡†æ—¶é—´</daylight>
+ </long>
+ <short>
+ <standard>GMT</standard>
+ <daylight>GMT</daylight>
+ </short>
+ <exemplarCity>å¡è¨å¸ƒå…°å¡</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kwajalein">
+ <exemplarCity>å¡ç“¦åŠ å…°</exemplarCity>
+ </zone>
+ <zone type="Pacific/Majuro">
+ <exemplarCity>马朱罗</exemplarCity>
+ </zone>
+ <zone type="Africa/Bamako">
+ <exemplarCity>巴马科</exemplarCity>
+ </zone>
+ <zone type="Asia/Hovd">
+ <exemplarCity>科布多</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>乌兰巴托</exemplarCity>
+ </zone>
+ <zone type="Asia/Choibalsan">
+ <exemplarCity>å“巴尔塞</exemplarCity>
+ </zone>
+ <zone type="America/Tijuana">
+ <exemplarCity>æåŽçº³</exemplarCity>
+ </zone>
+ <zone type="America/Hermosillo">
+ <exemplarCity>埃莫西约</exemplarCity>
+ </zone>
+ <zone type="America/Mazatlan">
+ <exemplarCity>马è¨ç‰¹å…°</exemplarCity>
+ </zone>
+ <zone type="America/Chihuahua">
+ <exemplarCity>奇瓦瓦</exemplarCity>
+ </zone>
+ <zone type="America/Monterrey">
+ <exemplarCity>蒙特雷</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>墨西哥城</exemplarCity>
+ </zone>
+ <zone type="America/Merida">
+ <exemplarCity>梅里达</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>åŽæ˜†</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuala_Lumpur">
+ <exemplarCity>å‰éš†å¡</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuching">
+ <exemplarCity>å¤æ™‹</exemplarCity>
+ </zone>
+ <zone type="Pacific/Chatham">
+ <exemplarCity>查塔姆</exemplarCity>
+ </zone>
+ <zone type="Pacific/Auckland">
+ <exemplarCity>奥克兰</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity>塔希æ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Marquesas">
+ <exemplarCity>马克è¨æ–¯</exemplarCity>
+ </zone>
+ <zone type="Pacific/Gambier">
+ <exemplarCity>甘比尔</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>亚速尔群岛</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Madeira">
+ <exemplarCity>马德拉群岛</exemplarCity>
+ </zone>
+ <zone type="Europe/Lisbon">
+ <exemplarCity>里斯本</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>东欧标准时间</standard>
+ <daylight>东欧å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ <short>
+ <standard>EET</standard>
+ <daylight>EEST</daylight>
+ </short>
+ <exemplarCity>布加勒斯特</exemplarCity>
+ </zone>
+ <zone type="Europe/Kaliningrad">
+ <exemplarCity>加里å®æ ¼å‹’</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity>莫斯科</exemplarCity>
+ </zone>
+ <zone type="Europe/Samara">
+ <exemplarCity>è¨é©¬æ‹‰</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>å¶å¡æ·æž—å ¡</exemplarCity>
+ </zone>
+ <zone type="Asia/Omsk">
+ <exemplarCity>鄂木斯克</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity>新西伯利亚</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>克拉斯诺亚尔斯克</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity>伊尔库茨克</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>雅库茨克</exemplarCity>
+ </zone>
+ <zone type="Asia/Vladivostok">
+ <exemplarCity>符拉迪沃斯托克</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>库页岛</exemplarCity>
+ </zone>
+ <zone type="Asia/Magadan">
+ <exemplarCity>马加丹</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>堪察加åŠå²›</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity>阿纳德尔</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Jan_Mayen">
+ <exemplarCity>扬马延岛</exemplarCity>
+ </zone>
+ <zone type="Arctic/Longyearbyen">
+ <exemplarCity>朗伊尔城</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>乌日戈罗德</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>基辅</exemplarCity>
+ </zone>
+ <zone type="Europe/Simferopol">
+ <exemplarCity>è¾›è²ç½—波尔</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>扎波罗热</exemplarCity>
+ </zone>
+ <zone type="Pacific/Midway">
+ <exemplarCity draft="unconfirmed">中途岛</exemplarCity>
+ </zone>
+ <zone type="Pacific/Johnston">
+ <exemplarCity>约翰斯顿</exemplarCity>
+ </zone>
+ <zone type="Pacific/Wake">
+ <exemplarCity>å¨å…‹å²›</exemplarCity>
+ </zone>
+ <zone type="America/Adak">
+ <exemplarCity>艾德克岛</exemplarCity>
+ </zone>
+ <zone type="America/Nome">
+ <exemplarCity>诺æ¯</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <standard>å¤å¨å¤·æ ‡å‡†æ—¶é—´</standard>
+ <daylight>å¤å¨å¤·æ ‡å‡†æ—¶é—´</daylight>
+ </long>
+ <short>
+ <standard>HST</standard>
+ <daylight>HST</daylight>
+ </short>
+ <exemplarCity>檀香山</exemplarCity>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <standard>阿拉斯加标准时间</standard>
+ <daylight>阿拉斯加å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ <short>
+ <standard>阿拉斯加标准时间</standard>
+ <daylight>阿拉斯加å¤ä»¤æ—¶é—´</daylight>
+ </short>
+ <exemplarCity>安克雷奇</exemplarCity>
+ </zone>
+ <zone type="America/Yakutat">
+ <exemplarCity>亚库塔特</exemplarCity>
+ </zone>
+ <zone type="America/Juneau">
+ <exemplarCity>朱诺</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <standard>太平洋标准时间</standard>
+ <daylight>太平洋å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ <short>
+ <standard>PST</standard>
+ <daylight>PDT</daylight>
+ </short>
+ <exemplarCity>æ´›æ‰çŸ¶</exemplarCity>
+ </zone>
+ <zone type="America/Boise">
+ <exemplarCity>åšä¼Šè¥¿</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <long>
+ <standard>山区标准时间 Phoenix</standard>
+ <daylight>山区å¤ä»¤æ—¶é—´ Phoenix</daylight>
+ </long>
+ <exemplarCity>凤凰城</exemplarCity>
+ </zone>
+ <zone type="America/Shiprock">
+ <exemplarCity>舰石城</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <standard>山区标准时间</standard>
+ <daylight>山区å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ <short>
+ <standard>MST</standard>
+ <daylight>MDT</daylight>
+ </short>
+ <exemplarCity>丹佛</exemplarCity>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity>森特</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <standard>中央标准时间</standard>
+ <daylight>中央å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ <short>
+ <standard draft="provisional">中部标准时间</standard>
+ </short>
+ <exemplarCity>èŠåŠ å“¥</exemplarCity>
+ </zone>
+ <zone type="America/Menominee">
+ <exemplarCity draft="unconfirmed">密诺米尼</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Knox">
+ <exemplarCity>诺克斯</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Marengo">
+ <exemplarCity>马伦戈</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <long>
+ <standard>东部标准时间 Indianapolis</standard>
+ <daylight draft="unconfirmed">东部å¤æ—¶åˆ¶ Indianapolis</daylight>
+ </long>
+ <exemplarCity>å°åœ°å®‰çº³æ³¢åˆ©æ–¯</exemplarCity>
+ </zone>
+ <zone type="America/Louisville">
+ <exemplarCity>路易(斯)维尔</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vevay">
+ <exemplarCity>沃韦</exemplarCity>
+ </zone>
+ <zone type="America/Kentucky/Monticello">
+ <exemplarCity>蒙蒂塞洛</exemplarCity>
+ </zone>
+ <zone type="America/Detroit">
+ <exemplarCity>底特律</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <standard>东部标准时间</standard>
+ <daylight>东部å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ <short>
+ <standard draft="provisional">东部标准时间</standard>
+ <daylight draft="provisional">东部å¤ä»¤æ—¶é—´</daylight>
+ </short>
+ <exemplarCity>纽约</exemplarCity>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity>撒马尔罕</exemplarCity>
+ </zone>
+ <zone type="Asia/Tashkent">
+ <exemplarCity>塔什干</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ADP">
+ <displayName>安é“尔比塞塔元</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>阿è”酋迪拉姆</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName>阿富汗尼 (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName>阿富汗尼</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName>阿尔巴尼亚列克</displayName>
+ </currency>
+ <currency type="AMD">
+ <displayName>亚美尼亚德拉姆</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName>è·å…°å®‰æ›¿å…°ç›¾</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName>安戈拉宽扎</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>安戈拉宽扎 (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>安戈拉新宽扎 (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>安戈拉宽扎 Reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>阿根廷奥斯特</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>阿根廷比索 (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>阿根廷比索</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName>奥地利西令</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>澳大利亚元</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName>阿é²å·´åŸºå°”å¾·å…ƒ</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>波士尼亚-赫塞哥维纳第纳尔元</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>波士尼亚-赫塞哥维纳兑æ¢åˆ¸</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName>巴巴多斯元</displayName>
+ </currency>
+ <currency type="BDT">
+ <displayName>孟加拉达å¡</displayName>
+ </currency>
+ <currency type="BEC">
+ <displayName>比利时法郎兑æ¢åˆ¸</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>比利时法郎</displayName>
+ </currency>
+ <currency type="BEL">
+ <displayName>比利时法郎(金èžï¼‰</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>ä¿åŠ åˆ©äºšç¡¬åˆ—å…‹</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName>ä¿åŠ åˆ©äºšæ–°åˆ—å…‹</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>巴林第纳尔元</displayName>
+ </currency>
+ <currency type="BIF">
+ <displayName>布隆迪法郎</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName>百慕大元</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName>汶莱元</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>玻利维亚</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>玻利维亚比索</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>巴西克é²èµ›ç½— (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>巴西克é²å¡žç½— Brazilian Cruzado</displayName>
+ <displayName alt="proposed" draft="provisional">巴希克é²å¡žç½—</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>巴西克é²å¡žç½— (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>巴西里尔</displayName>
+ </currency>
+ <currency type="BRN">
+ <displayName>巴西克é²å¡žç½— Cruzado Novo</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>巴西克é²å¡žç½—</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>巴哈马元</displayName>
+ </currency>
+ <currency type="BTN">
+ <displayName>ä¸ä¸¹åŠªæ‰Žå§†</displayName>
+ </currency>
+ <currency type="BUK">
+ <displayName>ç¼…å…ƒ</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>波渣那扑拉</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>白俄罗斯新å¢å¸ƒ (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>白俄罗斯å¢å¸ƒ</displayName>
+ </currency>
+ <currency type="BZD">
+ <displayName>伯利兹元</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>加拿大元</displayName>
+ </currency>
+ <currency type="CDF">
+ <displayName>刚果法郎</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName>瑞士法郎</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>智利 Unidades de Fomento</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>智利 比索</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>人民å¸</displayName>
+ <symbol>ï¿¥</symbol>
+ </currency>
+ <currency type="COP">
+ <displayName>哥伦比亚比索</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>哥斯达黎加科隆</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>æ·å…‹ç¡¬å…‹éƒŽ</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>å¤å·´æ¯”ç´¢</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>佛得角埃斯库多</displayName>
+ </currency>
+ <currency type="CYP">
+ <displayName>塞浦路斯磅</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName>æ·å…‹å…‹éƒŽ</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>东德奥斯特马克</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>德国马克</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>å‰å¸ƒæ法郎</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName>丹麦克朗</displayName>
+ </currency>
+ <currency type="DOP">
+ <displayName>多米尼加比索</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName>阿尔åŠåˆ©äºšç¬¬çº³å°”å…ƒ</displayName>
+ </currency>
+ <currency type="ECS">
+ <displayName>厄瓜多尔è‹å…‹é›·</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>爱沙尼亚克朗</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>埃åŠç£…</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>厄立特里亚纳ç¦å¡</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>西ç­ç‰™é©¬èµ›å¡”</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>埃塞俄比亚比尔</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>欧元</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName>芬兰玛å¡</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>æ–济元</displayName>
+ </currency>
+ <currency type="FKP">
+ <displayName>ç¦å…‹å…°ç¾¤å²›ç£…</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>法国法郎</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>英磅</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName>乔治亚库蓬拉瑞特</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>乔治亚库蓬拉瑞</displayName>
+ </currency>
+ <currency type="GHC">
+ <displayName>加纳塞第</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>直布罗陀磅</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>冈比亚达拉西</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>几内亚法郎</displayName>
+ </currency>
+ <currency type="GNS">
+ <displayName>几内亚Syli</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>赤é“几内亚爱克å¨ä¹</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>希腊德拉克马</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>å±åœ°é©¬æ‹‰</displayName>
+ </currency>
+ <currency type="GWE">
+ <displayName>è‘¡è„牙几内亚埃斯库多</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>几内亚比索</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>圭亚那元</displayName>
+ </currency>
+ <currency type="HKD">
+ <displayName>港元</displayName>
+ <symbol>HK$</symbol>
+ </currency>
+ <currency type="HNL">
+ <displayName>洪都拉斯勒皮拉</displayName>
+ </currency>
+ <currency type="HRD">
+ <displayName>克罗地亚第纳尔元</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>克罗地亚库娜元</displayName>
+ </currency>
+ <currency type="HTG">
+ <displayName>海地å¤å¾·</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>匈牙利缶瑞特</displayName>
+ </currency>
+ <currency type="IDR">
+ <displayName>å°åº¦å°¼è¥¿äºšç›¾</displayName>
+ </currency>
+ <currency type="IEP">
+ <displayName>爱尔兰磅</displayName>
+ </currency>
+ <currency type="ILP">
+ <displayName>以色列磅</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>以色列新谢客尔</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>å°åº¦å¢æ¯”</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>伊拉克第纳尔元</displayName>
+ </currency>
+ <currency type="IRR">
+ <displayName>伊朗里亚 尔</displayName>
+ </currency>
+ <currency type="ISK">
+ <displayName>冰岛克朗</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>æ„大利里拉</displayName>
+ <symbol>ITL</symbol>
+ </currency>
+ <currency type="JMD">
+ <displayName>牙买加元</displayName>
+ </currency>
+ <currency type="JOD">
+ <displayName>约旦第纳尔元</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>日元</displayName>
+ <symbol>JPÂ¥</symbol>
+ </currency>
+ <currency type="KES">
+ <displayName>肯尼亚先令</displayName>
+ </currency>
+ <currency type="KGS">
+ <displayName>å‰å°”å‰æ–¯å¦è¨å§†</displayName>
+ </currency>
+ <currency type="KHR">
+ <displayName>柬埔寨里尔</displayName>
+ </currency>
+ <currency type="KMF">
+ <displayName>科摩罗法郎</displayName>
+ </currency>
+ <currency type="KPW">
+ <displayName>北æœé²œå¸</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>韩国å¸</displayName>
+ <symbol>₩</symbol>
+ </currency>
+ <currency type="KWD">
+ <displayName>科å¨ç‰¹ç¬¬çº³å°”å…ƒ</displayName>
+ </currency>
+ <currency type="KYD">
+ <displayName>开曼岛元</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>哈è¨å…‹è…¾é¢</displayName>
+ </currency>
+ <currency type="LAK">
+ <displayName>è€æŒåŸºæ™®</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>黎巴嫩磅</displayName>
+ </currency>
+ <currency type="LKR">
+ <displayName>斯里兰å¡å¢æ¯”</displayName>
+ </currency>
+ <currency type="LRD">
+ <displayName>利比亚元</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>莱索托</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>立陶宛利塔</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>立陶宛塔咯å‘å¸</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>å¢æ£®å ¡æ³•éƒŽ</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>拉脱维亚拉特</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>拉脱维亚å¢å¸ƒ</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>利比亚第纳尔元</displayName>
+ </currency>
+ <currency type="MAD">
+ <displayName>摩洛哥迪拉姆</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName>摩洛哥法郎</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>å—特市列伊</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>马达加斯加阿日瑞</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>马达加斯加法郎</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>马其顿戴纳</displayName>
+ </currency>
+ <currency type="MLF">
+ <displayName>马里法郎</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>缅甸开亚特</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>è’™å¤å›¾æ ¼é‡Œå…‹</displayName>
+ </currency>
+ <currency type="MOP">
+ <displayName>澳门元</displayName>
+ <symbol>P</symbol>
+ </currency>
+ <currency type="MRO">
+ <displayName>里塔尼亚乌å‰äºš</displayName>
+ </currency>
+ <currency type="MTL">
+ <displayName>马尔他里拉</displayName>
+ </currency>
+ <currency type="MTP">
+ <displayName>马尔他磅</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>毛里求斯å¢æ¯”</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>马尔代夫群岛芦è²äºš</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>马拉维夸æ°</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName>墨西哥比索</displayName>
+ </currency>
+ <currency type="MXP">
+ <displayName>墨西哥银比索 (1861-1992)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>马æ¥è¥¿äºšå¸</displayName>
+ </currency>
+ <currency type="MZE">
+ <displayName>莫桑比克埃斯库多</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>莫桑比克å¸</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName>纳米比亚元</displayName>
+ </currency>
+ <currency type="NGN">
+ <displayName>尼日利亚奈拉.</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName>尼加拉瓜科多巴</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>尼加拉瓜金哥多åŽ</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>è·å…°ç›¾</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>挪å¨å…‹æœ—</displayName>
+ </currency>
+ <currency type="NPR">
+ <displayName>尼泊尔å¢æ¯”</displayName>
+ </currency>
+ <currency type="NZD">
+ <displayName>新西兰元</displayName>
+ </currency>
+ <currency type="OMR">
+ <displayName>阿曼里尔</displayName>
+ </currency>
+ <currency type="PAB">
+ <displayName>巴拿马巴波亚</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>秘é²å› è’‚</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>秘é²ç´¢é¢å¥´è‰¾æŒ</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>秘é²ç´¢é¢</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>巴布亚新几内亚基那</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>è²å¾‹å®¾æ¯”ç´¢</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>巴基斯å¦å¢æ¯”</displayName>
+ </currency>
+ <currency type="PLN">
+ <displayName>波兰兹罗æ</displayName>
+ </currency>
+ <currency type="PLZ">
+ <displayName>波兰兹罗æ (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>è‘¡è„牙铃木</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>巴拉圭å¸</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>å¡å¡”尔里亚尔</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>罗马尼亚镭</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>俄国å¢å¸ƒ</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>俄国å¢å¸ƒ (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>å¢æ—ºè¾¾æ³•éƒŽ</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>沙特里亚尔</displayName>
+ <symbol>SRl</symbol>
+ </currency>
+ <currency type="SBD">
+ <displayName>所罗门群岛元</displayName>
+ </currency>
+ <currency type="SCR">
+ <displayName>塞舌尔å¢æ¯”</displayName>
+ </currency>
+ <currency type="SDD">
+ <displayName>è‹ä¸¹ç¬¬çº³å°”å…ƒ</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>è‹ä¸¹ç£…</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>瑞士克朗</displayName>
+ </currency>
+ <currency type="SGD">
+ <displayName>新加å¡å…ƒ</displayName>
+ <symbol>S$</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>圣赫勒拿磅</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>斯洛文尼亚淘拉</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>斯洛ä¼å…‹ç§‘路那</displayName>
+ </currency>
+ <currency type="SLL">
+ <displayName>赛拉里昂å¸</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>索马里先令</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>è‹é‡Œå—基尔</displayName>
+ </currency>
+ <currency type="STD">
+ <displayName>圣多美普林西比都比拉</displayName>
+ </currency>
+ <currency type="SUR">
+ <displayName>è‹è”å¢å¸ƒ</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>è¨å°”瓦多科洛涅</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>å™åˆ©äºšç£…</displayName>
+ </currency>
+ <currency type="SZL">
+ <displayName>æ–¯å¨å£«å…°å¸</displayName>
+ </currency>
+ <currency type="THB">
+ <displayName>æ³°é“¢</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>å¡”å‰å…‹æ–¯å¦å¢å¸ƒ</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>å¡”å‰å…‹æ–¯å¦ç´¢èŽ«å°¼</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>土库曼斯å¦å¸</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>çªå°¼æ–¯ç¬¬çº³å°”å…ƒ</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>汤加å¸</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>å¸æ±¶åŸƒæ–¯åº“多</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName>土耳其里拉</displayName>
+ </currency>
+ <currency type="TRY">
+ <displayName>新土耳其里拉</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>特立尼达和多巴哥元</displayName>
+ </currency>
+ <currency type="TWD">
+ <displayName>æ–°å°å¸</displayName>
+ <symbol>NT$</symbol>
+ </currency>
+ <currency type="TZS">
+ <displayName>å¦æ¡‘尼亚先令</displayName>
+ </currency>
+ <currency type="UAH">
+ <displayName>乌克兰赫里纳</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>乌克兰å¸</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>乌干达先令 (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>乌干达先令</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName>美元</displayName>
+ <symbol>US$</symbol>
+ </currency>
+ <currency type="USN">
+ <displayName>美元 (下一天)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName>美元 (åŒä¸€å¤©)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>乌拉圭比索 (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>乌拉圭比索</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName>乌兹别克斯å¦å¸</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>内瑞拉åšåˆ©ç“¦</displayName>
+ </currency>
+ <currency type="VND">
+ <displayName>越å—盾</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>瓦努阿图</displayName>
+ </currency>
+ <currency type="WST">
+ <displayName>西è¨æ‘©äºšå¡”拉</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>黄金</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>欧洲å¤åˆå•ä½</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>欧洲金èžå•ä½</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>东加勒比元</displayName>
+ </currency>
+ <currency type="XDR">
+ <displayName>特别æ款æƒ</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>欧洲货å¸å•ä½</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>法国金法郎</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>也门第纳尔元</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>也门里尔</displayName>
+ </currency>
+ <currency type="YUD">
+ <displayName>å—斯拉夫硬第纳尔元</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>å—斯拉夫åŒå¨ç¬¬çº³å°”å…ƒ</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>å—斯拉夫兑æ¢ç¬¬çº³å°”å…ƒ</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>å—éžå…°ç‰¹ (金èž)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>å—éžå…°ç‰¹</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName>赞比亚马拉维</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>新扎伊尔元</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>扎伊尔元</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>津巴布韦元</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">是:确定</yesstr>
+ <nostr draft="unconfirmed">å¦:å¦å®š</nostr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="R1" uri="http://www.info.gov.hk/info/holiday_c.htm">二零零五年公眾å‡æœŸåˆŠç™»æ†²å ±</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/zh_CN.xml b/libs/Zend/Locale/Data/zh_CN.xml
new file mode 100755
index 0000000000..d6b4833db5
--- /dev/null
+++ b/libs/Zend/Locale/Data/zh_CN.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.38 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="zh"/>
+ <territory type="CN"/>
+ </identity>
+ <alias source="zh_Hans_CN" path="//ldml"/>
+</ldml>
diff --git a/libs/Zend/Locale/Data/zh_HK.xml b/libs/Zend/Locale/Data/zh_HK.xml
new file mode 100755
index 0000000000..9e145cc138
--- /dev/null
+++ b/libs/Zend/Locale/Data/zh_HK.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.36 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="zh"/>
+ <territory type="HK"/>
+ </identity>
+ <alias source="zh_Hant_HK" path="//ldml"/>
+</ldml>
diff --git a/libs/Zend/Locale/Data/zh_Hans.xml b/libs/Zend/Locale/Data/zh_Hans.xml
new file mode 100755
index 0000000000..474bde8e20
--- /dev/null
+++ b/libs/Zend/Locale/Data/zh_Hans.xml
@@ -0,0 +1,768 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.36 $"/>
+ <generation date="$Date: 2006/08/04 21:48:00 $"/>
+ <language type="zh"/>
+ <script type="Hans"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ain" references="RP1">阿伊努文</language>
+ <language type="ale" references="RP1">阿留申文</language>
+ <language type="alt" references="RP1">å—阿尔泰文</language>
+ <language type="an" references="RP1">阿拉贡文</language>
+ <language type="ang" references="RP1">å¤è‹±æ–‡</language>
+ <language type="art">其他人工语系</language>
+ <language type="ast">阿斯图里亚æ€ç‰¹æ–‡</language>
+ <language type="ath" references="RP1">阿è¨å¸•æ–¯åŽè¯­ç³»</language>
+ <language type="bai">巴米累克语系</language>
+ <language type="bat" references="RP1">其他波罗的语系</language>
+ <language type="ber" references="RP1">æŸæŸå°”æ–‡</language>
+ <language type="bo" references="RP1">è—æ–‡</language>
+ <language type="cpe" references="RP1">其他以英文为基础的克里奥尔混åˆè¯­ç³»</language>
+ <language type="cpf" references="RP1">其他以法文为基础的克里奥尔混åˆè¯­ç³»</language>
+ <language type="cpp" references="RP1">其他以葡è„牙文为基础的克里奥尔混åˆè¯­ç³»</language>
+ <language type="crp" references="RP1">其他克里奥尔混åˆè¯­ç³»</language>
+ <language type="del" references="RP1">特拉åŽæ–‡</language>
+ <language type="dgr" references="RP1">多格里布文</language>
+ <language type="doi" references="RP1">多格拉文</language>
+ <language type="dsb" references="RP1">下索布文</language>
+ <language type="ee" references="RP1">埃维文</language>
+ <language type="efi" references="RP1">埃è²å…‹æ–‡</language>
+ <language type="egy" references="RP1">å¤åŸƒåŠæ–‡</language>
+ <language type="eka" references="RP1">埃克丘克文</language>
+ <language type="fil" references="RP2">è²å¾‹å®¾æ–‡</language>
+ <language type="fiu" references="RP1">其他芬兰乌戈尔语系</language>
+ <language type="gd">è‹æ ¼å…°ç›–尔文</language>
+ <language type="gem" references="RP1">其他日尔曼语系</language>
+ <language type="goh" references="RP1">å¤é«˜åœ°å¾·æ–‡</language>
+ <language type="got" references="RP1">哥特文</language>
+ <language type="hit" references="RP1">赫梯文</language>
+ <language type="ho" references="RP1">希里莫图文</language>
+ <language type="ht" references="RP1">海地文</language>
+ <language type="ia" references="RP1">国际文 A</language>
+ <language type="ie" references="RP1">国际文 E</language>
+ <language type="inc">其他å°åº¦è¯­ç³»</language>
+ <language type="io" references="RP3">伊多文</language>
+ <language type="iro" references="RP1">伊洛é­è¯­ç³»</language>
+ <language type="iu" references="RP1">伊努伊特文</language>
+ <language type="jbo" references="RP3">逻辑文</language>
+ <language type="jpr">犹太波斯文</language>
+ <language type="jrb">犹太阿拉伯文</language>
+ <language type="khi">其他科伊桑语系</language>
+ <language type="kj" references="RP1">宽亚玛文</language>
+ <language type="kn" references="RP1">åŽçº³è¾¾æ–‡</language>
+ <language type="kos" references="RP1">科斯拉伊文</language>
+ <language type="krc" references="RP1">å¡æ‹‰æ°ä¼Šå·´å°”å¡å°”æ–‡</language>
+ <language type="lol" references="RP1">芒戈文</language>
+ <language type="lv">拉脱维亚文</language>
+ <language type="map" references="RP1">澳斯特罗尼西亚语系</language>
+ <language type="mis">å„ç§ä¸åŒè¯­ç³»</language>
+ <language type="mkh" references="RP1">其他孟高棉语系</language>
+ <language type="mno" references="RP1">马诺åšè¯­ç³»</language>
+ <language type="mul">多ç§è¯­ç³»</language>
+ <language type="mun" references="RP1">蒙达语系</language>
+ <language type="mus" references="RP1">克里克文</language>
+ <language type="mwl" references="RP3">米兰德斯文</language>
+ <language type="mwr" references="RP1">马尔瓦利文</language>
+ <language type="myn">玛雅语系</language>
+ <language type="nds" references="RP1">低地德文;低地撒克逊文</language>
+ <language type="nia" references="RP1">尼亚斯文</language>
+ <language type="nic" references="RP1">其他尼日尔科尔多凡语系</language>
+ <language type="nub">努比亚语系</language>
+ <language type="nwc" references="RP1">尼瓦尔文 Classical Newari</language>
+ <language type="ny" references="RP1">尼扬贾文;é½åˆ‡ç“¦æ–‡ï¼›åˆ‡ç“¦æ–‡</language>
+ <language type="nyo">尼约罗文</language>
+ <language type="nzi">æ©æµŽé©¬æ–‡</language>
+ <language type="oc">奥克西å”æ–‡(1500以åŽ)</language>
+ <language type="oj">奥å‰å¸ƒç“¦æ–‡</language>
+ <language type="om">奥洛莫文</language>
+ <language type="os">奥塞梯文</language>
+ <language type="osa">奥è¨æ ¼æ–‡</language>
+ <language type="pag">邦阿西楠文</language>
+ <language type="pap">帕皮亚门托文</language>
+ <language type="phn">腓尼基文</language>
+ <language type="pi">巴利文</language>
+ <language type="pon">波纳佩文</language>
+ <language type="pra">普拉克里特诸语言</language>
+ <language type="rap">拉帕努伊文</language>
+ <language type="rm">列托ï¼ç½—曼文</language>
+ <language type="rup" references="RP1">亚美尼亚语</language>
+ <language type="sas">è¨è¨å…‹æ–‡</language>
+ <language type="sat">桑塔利文</language>
+ <language type="scn">西西里文</language>
+ <language type="sd">ä¿¡å¾·æ–‡</language>
+ <language type="se">北è¨ç±³æ–‡</language>
+ <language type="sh">塞尔维亚-克罗地亚文</language>
+ <language type="sma">å—è¨ç±³æ–‡</language>
+ <language type="smi">其他è¨ç±³æ–‡</language>
+ <language type="smj">Lule è¨ç±³è¯­</language>
+ <language type="smn">伊纳里è¨ç±³è¯­</language>
+ <language type="sms">斯科特è¨ç±³æ–‡</language>
+ <language type="sn">ç»çº³æ–‡</language>
+ <language type="sog">å¤ç²Ÿç‰¹æ–‡</language>
+ <language type="srn">Sranan Tongo(æºäºŽå…‹é‡Œå¥¥å°”语)</language>
+ <language type="ss">斯瓦特文</language>
+ <language type="ssa">éžæ´²æ’’哈拉沙漠边缘地带语言</language>
+ <language type="su">巽他文</language>
+ <language type="tai">傣语诸语言(其他)</language>
+ <language type="tem">滕内文</language>
+ <language type="ter">特列纳文</language>
+ <language type="tet">特塔姆文</language>
+ <language type="tkl">托克劳文</language>
+ <language type="tl">他加禄文</language>
+ <language type="tlh">å…‹æž—è´¡æ–‡</language>
+ <language type="tmh">塔马奇克文</language>
+ <language type="tn">塞茨瓦纳文</language>
+ <language type="ts">宗加文</language>
+ <language type="tt">塔塔尔文</language>
+ <language type="tup">图皮语系</language>
+ <language type="tut">阿尔泰诸语言(其他)</language>
+ <language type="tw">特å¨æ–‡</language>
+ <language type="umb">ç¿æœ¬æœæ–‡</language>
+ <language type="wa">瓦隆文</language>
+ <language type="wak">瓦å¡ä»€è¯¸è¯­è¨€</language>
+ <language type="war">瓦赖文</language>
+ <language type="wo">沃洛夫文</language>
+ <language type="xal">å¡å°”梅克文</language>
+ <language type="xh">科è¨æ–‡</language>
+ <language type="ypk">尤皮克诸语言</language>
+ <language type="za">壮语</language>
+ </languages>
+ <scripts>
+ <script type="Bali">巴厘语</script>
+ <script type="Batk">巴塔克语</script>
+ <script type="Blis">布列斯符å·</script>
+ <script type="Brah">婆罗米文字</script>
+ <script type="Brai">布莱å¶ç›²æ–‡</script>
+ <script type="Bugi">布å‰è¯­</script>
+ <script type="Cham">å è¯­</script>
+ <script type="Cirt">色斯文</script>
+ <script type="Cyrs">西里尔文字(å¤æ•™ä¼šæ–¯æ‹‰å¤«è¯­çš„å˜ä½“)</script>
+ <script type="Dsrt">德塞莱特文</script>
+ <script type="Egyd">åŽæœŸåŸƒåŠè¯­</script>
+ <script type="Egyh">å¤åŸƒåŠåƒ§ä¾£ä¹¦å†™ä½“</script>
+ <script type="Egyp">å¤åŸƒåŠè±¡å½¢æ–‡</script>
+ <script type="Geok">æ ¼é²å‰äºšè¯­æ–‡å­— (Asomtavruli and Nuskhuri)</script>
+ <script type="Geor">æ ¼é²å‰äºšè¯­</script>
+ <script type="Glag">格拉哥里语</script>
+ <script type="Hans">简体中文</script>
+ <script type="Hant">ç¹ä½“中文</script>
+ <script type="Hmng">æ¨æ¾å½•è‹—æ–‡</script>
+ <script type="Hrkt" draft="provisional">片å‡å或平å‡å</script>
+ <script type="Hung">å¤åŒˆç‰™åˆ©è¯­</script>
+ <script type="Inds">å¤å¸Œè…Šå“ˆæ‹‰æ½˜</script>
+ <script type="Java">爪哇语</script>
+ <script type="Kali">克耶æŽæ–‡å­—</script>
+ <script type="Khar">å¡ç½—é¡»ææ–‡</script>
+ <script type="Latf">拉ä¸æ–‡ï¼ˆå“¥ç‰¹å¼å­—体å˜ä½“)</script>
+ <script type="Latg">拉ä¸æ–‡ï¼ˆç›–尔语å˜ä½“)</script>
+ <script type="Lepc">雷布查语</script>
+ <script type="Lina">线形文字 A</script>
+ <script type="Linb">线形文字 B</script>
+ <script type="Mand">阿拉米语</script>
+ <script type="Maya">玛雅圣符文</script>
+ <script type="Mero">麦若æå…‹æ–‡</script>
+ <script type="Nkoo">N’Ko(西éžä¹¦é¢è¯­è¨€ï¼‰</script>
+ <script type="Orkh">鄂尔浑文</script>
+ <script type="Perm">å¤å½¼å°”姆诸语</script>
+ <script type="Phag">å…«æ€å·´æ–‡</script>
+ <script type="Phnx">腓尼基语</script>
+ <script type="Plrd">波拉德音标文字</script>
+ <script type="Qaai">é—传学术语</script>
+ <script type="Roro">朗格朗格文</script>
+ <script type="Runr">å¤ä»£åŒ—欧文</script>
+ <script type="Sara">沙拉堤文</script>
+ <script type="Sylo">Syloti Nagri 书写体</script>
+ </scripts>
+ <territories>
+ <territory type="034">å—亚</territory>
+ <territory type="061">玻利尼西亚</territory>
+ <territory type="143">中亚</territory>
+ <territory type="172">独è”体</territory>
+ <territory type="419">拉ä¸ç¾Žæ´²å’ŒåŠ å‹’比海</territory>
+ <territory type="BA">波斯尼亚和黑塞哥维那</territory>
+ <territory type="CC">科科斯(基林)群岛</territory>
+ <territory type="CD">刚果(金)</territory>
+ <territory type="CG">刚果(布)</territory>
+ <territory type="DM">多米尼加</territory>
+ <territory type="KG">å‰å°”å‰æ–¯æ–¯å¦</territory>
+ <territory type="MD">摩尔多瓦</territory>
+ <territory type="MK">马其顿</territory>
+ <territory type="MQ">马æ尼克群岛</territory>
+ <territory type="MS">蒙塞拉特群岛</territory>
+ <territory type="NC">æ–°å¡é‡Œå¤šå°¼äºš</territory>
+ <territory type="RU">ä¿„ç½—æ–¯</territory>
+ <territory type="SC">塞舌尔群岛</territory>
+ <territory type="TF">法属å—部领土</territory>
+ </territories>
+ <variants>
+ <variant type="1901">传统德语拼字学</variant>
+ <variant type="1996">1996 年的德语拼字学</variant>
+ <variant type="POLYTONI">多音</variant>
+ <variant type="REVISED">已修订的拼字学</variant>
+ <variant type="SAAHO">è¨éœ</variant>
+ </variants>
+ </localeDisplayNames>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <fields>
+ <field type="era">
+ <displayName>时期</displayName>
+ </field>
+ <field type="year">
+ <displayName>å¹´</displayName>
+ </field>
+ <field type="month">
+ <displayName>月</displayName>
+ </field>
+ <field type="week">
+ <displayName>周</displayName>
+ </field>
+ <field type="day">
+ <displayName>æ—¥</displayName>
+ </field>
+ <field type="weekday">
+ <displayName>周天</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName>上åˆ/下åˆ</displayName>
+ </field>
+ <field type="hour">
+ <displayName>å°æ—¶</displayName>
+ </field>
+ <field type="minute">
+ <displayName>分钟</displayName>
+ </field>
+ <field type="second">
+ <displayName>秒钟</displayName>
+ </field>
+ <field type="zone">
+ <displayName>区域</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Antarctica/Casey">
+ <exemplarCity>å¡å¡ž</exemplarCity>
+ </zone>
+ <zone type="Australia/Currie">
+ <exemplarCity>库利</exemplarCity>
+ </zone>
+ <zone type="America/Eirunepe">
+ <exemplarCity>ä¾ä¼¦å°¼è´</exemplarCity>
+ </zone>
+ <zone type="America/Noronha">
+ <exemplarCity>洛(诺)罗尼亚</exemplarCity>
+ </zone>
+ <zone type="America/Rainy_River">
+ <exemplarCity>雨河</exemplarCity>
+ </zone>
+ <zone type="America/Coral_Harbour">
+ <exemplarCity>çŠç‘šæ¸¯</exemplarCity>
+ </zone>
+ <zone type="America/Iqaluit">
+ <exemplarCity>伊é­é²ä¼Šç‰¹</exemplarCity>
+ </zone>
+ <zone type="America/Pangnirtung">
+ <exemplarCity>潘尼尔东</exemplarCity>
+ </zone>
+ <zone type="America/Moncton">
+ <exemplarCity>蒙克顿</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity>戈特éœå¸ƒ</exemplarCity>
+ </zone>
+ <zone type="America/Danmarkshavn">
+ <exemplarCity>Danmarkshavn(格陵兰东北城市)</exemplarCity>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <standard>格林尼治标准时间</standard>
+ <daylight references="RP20">格林尼治å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ <short>
+ <standard draft="provisional">格林尼治标准时间</standard>
+ <daylight references="RP21">GDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Adak">
+ <exemplarCity>艾德克</exemplarCity>
+ </zone>
+ <zone type="America/Nome">
+ <exemplarCity>诺姆</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <short>
+ <standard draft="provisional">太平洋标准时间</standard>
+ <daylight draft="provisional">太平洋å¤ä»¤æ—¶é—´</daylight>
+ </short>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity>北达科他</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <standard>中部标准时间</standard>
+ <daylight>中部å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ </zone>
+ <zone type="America/Indiana/Vincennes">
+ <exemplarCity>温森斯</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Petersburg">
+ <exemplarCity>彼得斯堡</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <long>
+ <daylight>东部å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ <short>
+ <standard draft="provisional">东部标准时间</standard>
+ <daylight references="RP22">EDT</daylight>
+ </short>
+ </zone>
+ <zone type="America/Louisville">
+ <exemplarCity>路易斯维尔</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vevay">
+ <exemplarCity>维维市(å°ç¬¬å®‰çº³å·žï¼‰</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ADP">
+ <displayName references="RP2">安é“尔比塞塔</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName references="RP2">安哥拉宽扎</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName references="RP2">安哥拉宽扎 (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>安哥拉新宽扎 (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName references="RP2">安哥拉宽扎 Reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName references="RP5">奥地利先令</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>阿塞拜疆马纳特</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName references="RP2">波士尼亚-赫塞哥维纳第纳尔</displayName>
+ </currency>
+ <currency type="BDT">
+ <displayName references="RP5">孟加拉塔å¡</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName references="RP5">ä¿åŠ åˆ©äºšç¡¬åˆ—å¼—</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName references="RP5">ä¿åŠ åˆ©äºšæ–°åˆ—å¼—</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>巴林第纳尔</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName references="RP2">文莱元</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName references="RP5">玻利维亚诺</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName references="RP5">玻利维亚 Mvdol(资金)</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>巴西克é²èµ›ç½— Novo (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName references="RP5">巴西克é²æ‰Žå¤š</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName references="RP5">巴西雷亚尔</displayName>
+ </currency>
+ <currency type="BRN">
+ <displayName references="RP2">巴西克é²æ‰Žå¤š Novo</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName references="RP5">åšèŒ¨ç“¦çº³æ™®æ‹‰</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName references="RP5">智利 Unidades de Fomento(资金)</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>智利比索</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName references="RP5">哥斯达黎加科朗</displayName>
+ </currency>
+ <currency type="CSD">
+ <displayName references="RP5">塞尔维亚第纳尔</displayName>
+ </currency>
+ <currency type="CYP">
+ <displayName references="RP7">塞浦路斯镑</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName references="RP5">阿尔åŠåˆ©äºšç¬¬çº³å°”</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName references="RP5">厄瓜多尔 Unidad de Valor Constante (UVC)</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName references="RP7">埃åŠé•‘</displayName>
+ </currency>
+ <currency type="EQE">
+ <displayName references="RP7">埃奎勒</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName references="RP7">厄立特里亚纳克法</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName references="RP3">西ç­ç‰™æ¯”塞塔(å¸æˆ· A)</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName references="RP3">西ç­ç‰™æ¯”塞塔(兑æ¢å¸æˆ·ï¼‰</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName references="RP7">西ç­ç‰™æ¯”å¡žå¡”</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName references="RP2">芬兰马克</displayName>
+ </currency>
+ <currency type="FKP">
+ <displayName references="RP7">ç¦å…‹å…°é•‘</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName references="RP7">英镑</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>乔治亚拉瑞</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName references="RP7">直布罗陀镑</displayName>
+ </currency>
+ <currency type="GNS">
+ <displayName references="RP7">几内亚西里</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName references="RP7">赤é“几内亚埃奎勒</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName references="RP7">å±åœ°é©¬æ‹‰æ ¼æŸ¥å°”</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName references="RP2">几内亚比ç»æ¯”ç´¢</displayName>
+ </currency>
+ <currency type="HNL">
+ <displayName references="RP7">洪都拉斯拉伦皮拉</displayName>
+ </currency>
+ <currency type="HRD">
+ <displayName references="RP2">克罗地亚第纳尔</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName references="RP7">克罗地亚库纳</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName references="RP7">匈牙利ç¦æž—</displayName>
+ </currency>
+ <currency type="IEP">
+ <displayName references="RP2">爱尔兰镑</displayName>
+ </currency>
+ <currency type="ILP">
+ <displayName references="RP2">以色列镑</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName references="RP7">以色列新谢克尔</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName references="RP7">伊拉克第纳尔</displayName>
+ </currency>
+ <currency type="IRR">
+ <displayName>伊朗里亚尔</displayName>
+ </currency>
+ <currency type="JOD">
+ <displayName references="RP7">约旦第纳尔</displayName>
+ </currency>
+ <currency type="KGS">
+ <displayName references="RP7">å‰å°”å‰æ–¯æ–¯å¦ç´¢å§†</displayName>
+ </currency>
+ <currency type="KHR">
+ <displayName references="RP7">柬埔寨瑞尔</displayName>
+ </currency>
+ <currency type="KPW">
+ <displayName references="RP7">æœé²œåœ†</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName references="RP7">韩圆</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName references="RP7">科å¨ç‰¹ç¬¬çº³å°”</displayName>
+ </currency>
+ <currency type="KYD">
+ <displayName references="RP7">开曼元</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName references="RP7">哈è¨å…‹æ–¯å¦åšæˆˆ</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName references="RP2">黎巴嫩镑</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName references="RP7">莱索托洛蒂</displayName>
+ </currency>
+ <currency type="LSM">
+ <displayName references="RP7">马洛蒂</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName references="RP7">立陶宛立特</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName references="RP2">å¢æ£®å ¡å¯å…‘æ¢æ³•éƒŽ</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName references="RP2">å¢æ£®å ¡é‡‘èžæ³•éƒŽ</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName references="RP2">利比亚第纳尔</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName references="RP7">摩尔多瓦列伊</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName references="RP7">马达加斯加阿里亚里</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName references="RP7">马其顿戴代纳尔</displayName>
+ </currency>
+ <currency type="MRO">
+ <displayName references="RP7">毛里塔尼亚乌å‰äºš</displayName>
+ </currency>
+ <currency type="MTL">
+ <displayName references="RP7">马耳他里拉</displayName>
+ </currency>
+ <currency type="MTP">
+ <displayName references="RP2">马耳他镑</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName references="RP7">马尔代夫拉è²äºš</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName references="RP7">马拉维克瓦查</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName references="RP7">墨西哥 Unidad de Inversion (UDI)(资金)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName references="RP7">马æ¥è¥¿äºšæž—å‰ç‰¹</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName references="RP7">莫桑比克梅蒂å¡å°”</displayName>
+ </currency>
+ <currency type="NGN">
+ <displayName>尼日利亚奈拉</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName references="RP2">尼加拉瓜金科多巴</displayName>
+ </currency>
+ <currency type="OMR">
+ <displayName references="RP7">阿曼里亚尔</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName references="RP2">秘é²å°é”‘</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName references="RP7">秘é²æ–°ç´¢å°”</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName references="RP7">秘é²ç´¢å°”</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName references="RP2">è‘¡è„牙埃斯库多</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName references="RP7">巴拉圭瓜拉尼</displayName>
+ </currency>
+ <currency type="RHD">
+ <displayName references="RP2">罗得西亚元</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName references="RP7">旧罗马尼亚列伊</displayName>
+ </currency>
+ <currency type="SDD">
+ <displayName references="RP7">è‹ä¸¹ç¬¬çº³å°”</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName references="RP2">è‹ä¸¹é•‘</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName references="RP7">瑞典克朗</displayName>
+ </currency>
+ <currency type="SHP">
+ <displayName references="RP2">圣赫勒拿镑</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName references="RP7">斯洛文尼亚托拉尔</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName references="RP7">斯洛ä¼å…‹å…‹æœ—</displayName>
+ </currency>
+ <currency type="SLL">
+ <displayName references="RP7">塞拉利昂利昂</displayName>
+ </currency>
+ <currency type="SRD">
+ <displayName references="RP7">è‹é‡Œå—å…ƒ</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName references="RP2">è‹é‡Œå—盾</displayName>
+ </currency>
+ <currency type="STD">
+ <displayName references="RP7">圣多美和普林西比多布拉</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName references="RP7">è¨å°”瓦多科朗</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName references="RP2">å™åˆ©äºšé•‘</displayName>
+ </currency>
+ <currency type="SZL">
+ <displayName references="RP7">æ–¯å¨å£«å…°é‡Œå…°å‰å°¼</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName references="RP7">土库曼斯å¦é©¬çº³ç‰¹</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName references="RP2">çªå°¼æ–¯ç¬¬çº³å°”</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName references="RP7">汤加潘加</displayName>
+ </currency>
+ <currency type="TWD">
+ <displayName references="RP7">æ–°å°å¸å…ƒ</displayName>
+ </currency>
+ <currency type="UAH">
+ <displayName references="RP7">乌克兰格里夫尼亚</displayName>
+ </currency>
+ <currency type="USN">
+ <displayName>美元(次日)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName references="RP7">美元(当日)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName references="RP7">乌拉圭新比索 (1975-1993)</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName>乌兹别克斯è‹å§†</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName references="RP7">委内瑞拉åšåˆ©ç“¦</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName references="RP7">瓦努阿图瓦图</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName references="RP7">中éžé‡‘èžåˆä½œæ³•éƒŽ</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName references="RP7">银</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName references="RP7">欧洲货å¸è”盟</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName references="RP7">欧洲计算å•ä½ (XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName references="RP7">欧洲计算å•ä½ (XBD)</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName references="RP7">法国 UIC 法郎</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>éžæ´²é‡‘èžå…±åŒä½“法郎</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName references="RP7">é’¯</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName references="RP7">太平洋法郎</displayName>
+ </currency>
+ <currency type="XPT">
+ <displayName references="RP7">é“‚</displayName>
+ </currency>
+ <currency type="XTS">
+ <displayName references="RP7">为测试ä¿ç•™çš„代ç </displayName>
+ </currency>
+ <currency type="XXX">
+ <displayName references="RP7">没有货å¸çš„交易</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName references="RP2">也门第纳尔</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName references="RP7">也门里亚尔</displayName>
+ </currency>
+ <currency type="YUD">
+ <displayName references="RP2">å—斯拉夫硬第纳尔</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName references="RP2">å—斯拉夫åŒå¨ç¬¬çº³å°”</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName references="RP2">å—斯拉夫å¯å…‘æ¢ç¬¬çº³å°”</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName references="RP7">赞比亚克瓦查</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName references="RP2">新扎伊尔</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName references="RP2">扎伊尔</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1">Languages (GB/T 4880.2-2000)</reference>
+ <reference type="RP10" uri="http://www.xzqh.org/waiguo/asia/1046.htm">Chinese (Simplified Han): timezones: Asia/Oral/exemplarCity (change from &quot;奥拉&quot; to &quot;乌拉尔&quot;)</reference>
+ <reference type="RP11" uri="http://www.bjfao.gov.cn/newsite/world/detail.asp?countryID=389">Chinese (Simplified Han): timezones: Pacific/Kiritimati/exemplarCity (change from &quot;克里斯马斯&quot; to &quot;圣诞岛&quot;)</reference>
+ <reference type="RP12" uri="http://www.bjfao.gov.cn/newsite/world/detail.asp?countryID=391">Chinese (Simplified Han): timezones:Pacific/Kosrae/exemplarCity (change from &quot;科斯里&quot; to &quot;科斯雷&quot;)</reference>
+ <reference type="RP13">Chinese (Simplified Han): timezones: Europe/Paris/short/standard (change from &quot;CET&quot; to &quot;CEST&quot;)</reference>
+ <reference type="RP14">Chinese (Simplified Han): timezones: Europe/Paris/short/daylight (chang from &quot;CEST&quot; to &quot;CEDT&quot;)</reference>
+ <reference type="RP15">Chinese (Simplified Han): timezones: Asia/Shanghai/long/daylight (change from &quot;中国标准时间&quot; to &quot;中国å¤ä»¤æ—¶é—´&quot;)</reference>
+ <reference type="RP16">Chinese (Simplified Han): timezones: Pacific/Honolulu/long/daylight (change from &quot;å¤å¨å¤·æ ‡å‡†æ—¶é—´&quot; to &quot;å¤å¨å¤·å¤ä»¤æ—¶é—´&quot;)</reference>
+ <reference type="RP17">Chinese (Simplified Han): timezones: Pacific/Honolulu/short/daylight (change from &quot;HST&quot; to &quot;HDT&quot;)</reference>
+ <reference type="RP18">Chinese (Simplified Han): timezones: Asia/Tokyo/long/daylight (change from &quot;日本标准时间&quot; to &quot;日本å¤ä»¤æ—¶é—´&quot;)</reference>
+ <reference type="RP19">Chinese (Simplified Han): timezones: Asia/Tokyo/short/daylight (change form &quot;JST&quot; to &quot;JDT&quot;)</reference>
+ <reference type="RP2" uri="http://cb.kingsoft.com">Kingsoft Online Dictionary</reference>
+ <reference type="RP20">Chinese (Simplified Han): timezones: Africa/Casablanca/long/daylight (change from &quot;格林尼治标准时间&quot; to &quot;格林尼治å¤ä»¤æ—¶é—´&quot;)</reference>
+ <reference type="RP21">Chinese (Simplified Han): timezones: Africa/Casablanca/short/daylight (change from &quot;GMT&quot; to &quot;GDT&quot;)</reference>
+ <reference type="RP22">Chinese (Simplified Han): timezones: America/Indianapolis/short/daylight (change from &quot;EST&quot; to &quot;EDT&quot;)</reference>
+ <reference type="RP23">Chinese (Simplified Han): timezones: America/Phoenix/short/daylight (change from &quot;MST&quot; to &quot;MDT&quot;)</reference>
+ <reference type="RP24">Chinese (Simplified Han): currencies: &quot;Angolan Kwanza (1977-1990) (symbol)&quot; propose &quot;AOK (1977-1990)&quot;</reference>
+ <reference type="RP25">Chinese (Simplified Han): currencies: &quot;Angolan Kwanza Reajustado (1995-1999) (symbol)&quot; propose &quot;AOR (1995-1999)&quot;</reference>
+ <reference type="RP26">Chinese (Simplified Han): currencies: &quot;Angolan New Kwanza (1990-2000) (symbol) propose &quot;AON (1990-2000)&quot;</reference>
+ <reference type="RP27">Chinese (Simplified Han): currencies: &quot;Argentine Peso (1983-1985) (symbol)&quot; propose &quot;ARP (1983-1985)&quot;</reference>
+ <reference type="RP28">Chinese (Simplified Han): currencies: &quot;Belarussian New Ruble (1994-1999) (symbol)&quot; propose &quot;BYB (1994-1999)&quot;</reference>
+ <reference type="RP29">Chinese (Simplified Han): currencies: &quot;Polish Zloty (1950-1995) (symbol)&quot; propose &quot;PLZ (1950-1995)&quot;</reference>
+ <reference type="RP3" uri="http://zh.wikipedia.org/wiki/ISO_639">ISO 639 - Wikipedia</reference>
+ <reference type="RP30">Chinese (Simplified Han): currencies: &quot;Russian Ruble (1991-1998) (symbol)&quot; propose &quot;RUR (1991-1998)&quot;</reference>
+ <reference type="RP31">Chinese (Simplified Han): languages: &quot;Cornish&quot; propose &quot;康沃尔文&quot;</reference>
+ <reference type="RP32">Chinese (Simplified Han): languages: &quot;Ganda&quot; propose &quot;干达文&quot;</reference>
+ <reference type="RP4">Currency Units</reference>
+ <reference type="RP5" uri="http://www.bridge69.com/365/ylxx/5-3money.htm">Currency Units</reference>
+ <reference type="RP6" uri="http://140.111.1.22/mandr/clc/dict.new/public_html/dict/htm/fulu/huo3.htm">Currency Units of African Countries</reference>
+ <reference type="RP7">http://www.geocities.com/jusjih/iso3166-zh-cn.html</reference>
+ <reference type="RP8">Kingsoft Online Dictionary</reference>
+ <reference type="RP9" uri="http://www.fmprc.gov.cn/chn/gjhdq/default.htm">Territories</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/zh_Hans_CN.xml b/libs/Zend/Locale/Data/zh_Hans_CN.xml
new file mode 100755
index 0000000000..3da8c05444
--- /dev/null
+++ b/libs/Zend/Locale/Data/zh_Hans_CN.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.27 $"/>
+ <generation date="$Date: 2006/06/27 23:30:54 $"/>
+ <language type="zh"/>
+ <script type="Hans"/>
+ <territory type="CN"/>
+ </identity>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>yyyy'年'M'月'd'日'EEEE</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>yyyy'年'M'月'd'日'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy-M-d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yy-M-d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>ahh'时'mm'分'ss'秒' z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>ahh'时'mm'分'ss'秒'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>ahh:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>ah:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="Md" draft="provisional">M-d</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">yyyy-M</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Pacific/Yap">
+ <exemplarCity draft="provisional">雅浦</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Palmer">
+ <exemplarCity draft="provisional">帕默尔</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity draft="provisional">å¤æ´»èŠ‚</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <daylight>中国å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>加那利</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kosrae">
+ <exemplarCity>库赛埃</exemplarCity>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <daylight>日本å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ </zone>
+ <zone type="Pacific/Kiritimati">
+ <exemplarCity>基里巴斯(圣诞岛)</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tarawa">
+ <exemplarCity draft="provisional">塔拉瓦</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtau">
+ <exemplarCity draft="provisional">阿克图</exemplarCity>
+ </zone>
+ <zone type="Asia/Oral">
+ <exemplarCity>乌拉尔</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kwajalein">
+ <exemplarCity>夸贾林</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity draft="provisional">亚速</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Madeira">
+ <exemplarCity>马德拉</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity>诺沃西比尔斯克</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>è¨å“ˆæž—</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>堪察加</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Jan_Mayen">
+ <exemplarCity draft="provisional">扬马延</exemplarCity>
+ </zone>
+ <zone type="Pacific/Wake">
+ <exemplarCity draft="provisional">å¨å…‹</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <daylight>å¤å¨å¤·å¤ä»¤æ—¶é—´</daylight>
+ </long>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+</ldml>
diff --git a/libs/Zend/Locale/Data/zh_Hans_SG.xml b/libs/Zend/Locale/Data/zh_Hans_SG.xml
new file mode 100755
index 0000000000..676851cc91
--- /dev/null
+++ b/libs/Zend/Locale/Data/zh_Hans_SG.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.32 $"/>
+ <generation date="$Date: 2006/07/11 19:31:56 $"/>
+ <language type="zh"/>
+ <script type="Hans"/>
+ <territory type="SG"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="root">æ ¹ æº</language>
+ <language type="sh">塞尔维亚克罗地亚文</language>
+ </languages>
+ <territories>
+ <territory type="AU">澳洲</territory>
+ <territory type="CZ">æ·å…‹</territory>
+ <territory type="ID">å°å°¼</territory>
+ <territory type="KR">å—韩</territory>
+ <territory type="NZ">纽西兰</territory>
+ <territory type="SA">沙地阿拉伯</territory>
+ </territories>
+ </localeDisplayNames>
+ <delimiters>
+ <quotationStart draft="unconfirmed">‘</quotationStart>
+ <quotationEnd draft="unconfirmed">’</quotationEnd>
+ <alternateQuotationStart draft="unconfirmed">“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>dd MMMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>dd MMM yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>dd-MMM-yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd/MM/yy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>a hh:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>a hh:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>a hh:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>a hh:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="MMMMdd" draft="provisional">dd MMMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="provisional">dd/MM</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="provisional">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyyyMMMM" draft="provisional">MMMM yyyy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ </numbers>
+ <references>
+ <reference type="RP1">Chinese (Simplified Han, Singapore): languages: &quot;Root&quot; propose &quot;Root&quot;</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/zh_Hant.xml b/libs/Zend/Locale/Data/zh_Hant.xml
new file mode 100755
index 0000000000..8ff5661fc6
--- /dev/null
+++ b/libs/Zend/Locale/Data/zh_Hant.xml
@@ -0,0 +1,2043 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.60 $"/>
+ <generation date="$Date: 2006/10/26 22:46:10 $"/>
+ <language type="zh"/>
+ <script type="Hant"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="aa" draft="provisional">伊索匹亞語</language>
+ <language type="ab">阿布哈西亞文</language>
+ <language type="ace">亞齊文</language>
+ <language type="ach">阿僑利文</language>
+ <language type="ada">阿當莫文</language>
+ <language type="ady">阿迪å„æ–‡</language>
+ <language type="ae">阿緯斯陀文</language>
+ <language type="af">å—éžè·è˜­æ–‡</language>
+ <language type="afa">éžé–ƒæ—åŠéžäºžèªžè¨€</language>
+ <language type="ak">阿åŽæ–‡</language>
+ <language type="ale">阿留申文</language>
+ <language type="alg">阿爾岡昆文</language>
+ <language type="an">阿拉貢文</language>
+ <language type="ang" draft="provisional">å¤è‹±æ–‡ï¼ˆå…¬å…ƒ 450-1100 年)</language>
+ <language type="apa">阿帕奇語言</language>
+ <language type="arn">阿勞åŽæ–‡</language>
+ <language type="art">其他人工語言</language>
+ <language type="as">阿薩姆文</language>
+ <language type="ast">阿斯圖里亞文</language>
+ <language type="ath">阿薩巴斯å¡æ–‡</language>
+ <language type="aus">澳洲英文</language>
+ <language type="av">阿法文 Avaric</language>
+ <language type="ay">艾馬拉文</language>
+ <language type="az">亞塞拜然文</language>
+ <language type="ba">巴什客爾文</language>
+ <language type="bad">ç­é”æ–‡</language>
+ <language type="ban">巴厘文</language>
+ <language type="bas">å·´è–©æ–‡</language>
+ <language type="bat">波羅的文(其他)</language>
+ <language type="be">白俄羅斯文</language>
+ <language type="bej">è²æ‰Žæ–‡</language>
+ <language type="bem">別姆巴文</language>
+ <language type="ber">æŸæŸçˆ¾æ–‡</language>
+ <language type="bg">ä¿åŠ åˆ©äºžæ–‡</language>
+ <language type="bh">比哈爾文</language>
+ <language type="bho">åšå‚‘普爾文</language>
+ <language type="bi">比斯拉馬文</language>
+ <language type="bik">比科爾文</language>
+ <language type="bla">錫克錫å¡æ–‡</language>
+ <language type="bnt">ç­åœ–諸語言</language>
+ <language type="bo">è—æ–‡</language>
+ <language type="bs">波士尼亞文</language>
+ <language type="bua">布里阿特文</language>
+ <language type="bug">布å‰æ–¯æ–‡</language>
+ <language type="ca">加泰羅尼亞文</language>
+ <language type="cai">中美å°ç¬¬å®‰æ–‡ï¼ˆå…¶ä»–)</language>
+ <language type="cau">高加索文(其他)</language>
+ <language type="ce">車臣文</language>
+ <language type="ceb">宿務æ—æ–‡</language>
+ <language type="cel">克爾特文(其他)</language>
+ <language type="ch">查莫洛文</language>
+ <language type="chb">奇布查文</language>
+ <language type="chk">處奇斯文</language>
+ <language type="chm">馬里文</language>
+ <language type="chn">契奴克文</language>
+ <language type="cho">喬克托文</language>
+ <language type="chp">奇佩瓦æšæ–‡</language>
+ <language type="chr">柴羅基文</language>
+ <language type="chy">沙伊安文</language>
+ <language type="cpe">æ­æ´²è…”調和洋涇濱,æºè‡ªè‹±æ–‡çš„(其他)</language>
+ <language type="cpf">æ­æ´²è…”調和洋涇濱,æºè‡ªæ³•æ–‡çš„(其他)</language>
+ <language type="cpp">æ­æ´²è…”調和洋涇濱,æºè‡ªè‘¡è„牙文的(其他)</language>
+ <language type="cr">克裡文</language>
+ <language type="crh">克里米亞åŠå³¶çš„土耳其文;克里米亞åŠå³¶çš„塔塔爾文</language>
+ <language type="crp">克里奧爾文和皮欽文</language>
+ <language type="csb">å¡èˆ’布文</language>
+ <language type="cus">庫施特語系(其他)</language>
+ <language type="cv">楚瓦甚文</language>
+ <language type="cy">å¨çˆ¾å£«æ–‡</language>
+ <language type="da">丹麥文</language>
+ <language type="dak">é”科他文</language>
+ <language type="dar">é”爾格瓦文</language>
+ <language type="day">迪雅克文</language>
+ <language type="del">德拉瓦</language>
+ <language type="den">斯拉夫</language>
+ <language type="dgr">多格里布文</language>
+ <language type="doi">多格來文</language>
+ <language type="dra">德拉å¨æ–‡ï¼ˆå…¶ä»–)</language>
+ <language type="dsb">下索布文</language>
+ <language type="dua">æœäºžæ‹‰æ–‡</language>
+ <language type="dum">è·è˜­ï¼Œä¸­å¤ (ca. 1050-1350)</language>
+ <language type="dv">迪維西文</language>
+ <language type="ee">埃緯文</language>
+ <language type="efi">埃è²å…‹æ–‡</language>
+ <language type="egy">å¤åŸƒåŠæ–‡)</language>
+ <language type="eka">艾å¡æœ±å…‹æ–‡</language>
+ <language type="el">希臘文</language>
+ <language type="elx">埃蘭文</language>
+ <language type="enm">英文,中世紀 (1100-1500)</language>
+ <language type="eo">世界語</language>
+ <language type="et">愛沙尼亞文</language>
+ <language type="ewo">ä¾æ±ªéƒ½æ–‡</language>
+ <language type="fan">芳æ—æ–‡</language>
+ <language type="ff">富拉文</language>
+ <language type="fi">芬蘭文</language>
+ <language type="fiu">芬蘭-çƒæˆˆçˆ¾æ—æ–‡(其他)</language>
+ <language type="fj">æ–æ¿Ÿæ–‡</language>
+ <language type="fo">法羅文</language>
+ <language type="fon">è±æ–‡</language>
+ <language type="fy">弗里斯蘭文</language>
+ <language type="ga">愛爾蘭文</language>
+ <language type="gaa">加æ—æ–‡</language>
+ <language type="gay">加約文</language>
+ <language type="gba">葛巴亞文</language>
+ <language type="gd">蘇格蘭 - 蓋爾文</language>
+ <language type="gem">德國的(其他)</language>
+ <language type="gem" alt="proposed-u29-1" draft="provisional">日耳曼文(其他)</language>
+ <language type="gez">å‰èŒ²æ–‡</language>
+ <language type="gil">å‰çˆ¾ä¼¯ç‰¹ç¾¤å³¶æ–‡</language>
+ <language type="gl">加里西亞文</language>
+ <language type="gmh">å¾·æ–‡, 中å¤å…¨ç››æ™‚期 (ca.1050-1500)</language>
+ <language type="goh">å¾·æ–‡,上å¤å…¨ç››æ™‚期 (ca.750-1050)</language>
+ <language type="gon">岡德文</language>
+ <language type="gor">科隆é”ç¾…æ–‡</language>
+ <language type="got">哥特文</language>
+ <language type="grb">å“¥åšèªž</language>
+ <language type="grc">å¤å¸Œè‡˜æ–‡ (至 1453)</language>
+ <language type="gu">å‰äºžæ‹‰å¡”æ–‡</language>
+ <language type="gv">曼島文</language>
+ <language type="gwi">圭契文</language>
+ <language type="hai">æµ·é”æ–‡</language>
+ <language type="he">希伯來文</language>
+ <language type="hi">北å°åº¦æ–‡</language>
+ <language type="hil">希利蓋農文</language>
+ <language type="him">赫馬查利文</language>
+ <language type="hit">赫梯文</language>
+ <language type="hmn">å­Ÿæ–‡</language>
+ <language type="ho">西里莫圖土文</language>
+ <language type="hr">克羅埃西亞文</language>
+ <language type="ht">海地人</language>
+ <language type="ht" alt="proposed" draft="provisional">海地文</language>
+ <language type="hy">亞美尼亞文</language>
+ <language type="hz">赫雷羅文</language>
+ <language type="ia">拉ä¸åœ‹éš›æ–‡ Interlingua</language>
+ <language type="id">å°å°¼æ–‡</language>
+ <language type="ie">拉ä¸åœ‹éš›æ–‡ Interlingue</language>
+ <language type="ig">伊布文</language>
+ <language type="ii">å››å·è©±</language>
+ <language type="ijo">伊喬文</language>
+ <language type="ik">ä¾å¥´çš®ç¶­å…‹æ–‡</language>
+ <language type="ilo">伊洛闊文</language>
+ <language type="inc">å°åº¦èªžç³»ï¼ˆå…¶ä»–)</language>
+ <language type="ine">å°æ­èªžç³»ï¼ˆå…¶ä»–)</language>
+ <language type="io">伊朗文</language>
+ <language type="ira">伊芳朗文</language>
+ <language type="iro">易洛é­æ–‡</language>
+ <language type="is">冰島文</language>
+ <language type="it">義大利文</language>
+ <language type="iu">å› ç´ç‰¹æ–‡</language>
+ <language type="jbo">é‚輯文</language>
+ <language type="jpr">猶太教-波斯文</language>
+ <language type="jrb">猶太教-阿拉伯文</language>
+ <language type="ka">喬治亞文</language>
+ <language type="kaa">å¡æ‹‰å¡çˆ¾å¸•å…‹æ–‡</language>
+ <language type="kab">å¡æ¯”爾文</language>
+ <language type="kar">克倫文</language>
+ <language type="kbd">å¡å·´çˆ¾é”æ–‡</language>
+ <language type="kg">剛果文</language>
+ <language type="kho">å’Œé—[與é—]æ–‡</language>
+ <language type="ki">å‰åº«å°¤äºº</language>
+ <language type="kj">廣亞馬文</language>
+ <language type="kk">哈薩克文</language>
+ <language type="kl">格陵蘭文</language>
+ <language type="km">高棉文</language>
+ <language type="kn">åŽé‚£é”æ–‡</language>
+ <language type="ko">韓文</language>
+ <language type="kok">貢根文</language>
+ <language type="kos">科斯雷æ©æ–‡</language>
+ <language type="kr">å¡åŠªè£¡æ–‡</language>
+ <language type="krc">å¡æ‹‰æŸ´-包爾å¡çˆ¾æ–‡</language>
+ <language type="kro">克魯文</language>
+ <language type="kru">庫魯科文</language>
+ <language type="ks">克什米爾文</language>
+ <language type="ku">庫爾德文</language>
+ <language type="kum">庫密克文</language>
+ <language type="kut">庫特奈文</language>
+ <language type="kw">康瓦耳文</language>
+ <language type="ky">å‰çˆ¾å‰æ–¯æ–‡</language>
+ <language type="lad">拉迪諾文</language>
+ <language type="lah">拉亨é”æ–‡</language>
+ <language type="lam">蘭巴文</language>
+ <language type="lb">盧森堡文</language>
+ <language type="lez">立陶宛文 Lezghian</language>
+ <language type="lg">å¹²é”æ–‡</language>
+ <language type="li">æž—å ¡æ–‡</language>
+ <language type="lo">寮國文</language>
+ <language type="loz">洛齊文</language>
+ <language type="lt">立陶宛語</language>
+ <language type="lu">魯巴加丹加文</language>
+ <language type="lua">魯巴魯魯亞文</language>
+ <language type="lui">路易塞諾文</language>
+ <language type="lun">盧æ©é”æ–‡</language>
+ <language type="luo">盧奧文</language>
+ <language type="lus">盧晒文</language>
+ <language type="mad">馬都拉文</language>
+ <language type="mag">馬加伊文</language>
+ <language type="mai">é‚蒂利文</language>
+ <language type="mak">望加錫文</language>
+ <language type="map">å—島文</language>
+ <language type="mas">馬賽文</language>
+ <language type="mdr">曼é”æ–‡</language>
+ <language type="men">門德文</language>
+ <language type="mg">馬爾加什文</language>
+ <language type="mga">æ„›çˆ¾è˜­æ–‡ï¼Œä¸­å¤ (900-1200)</language>
+ <language type="mh">馬紹爾文</language>
+ <language type="mic">米克馬克文</language>
+ <language type="min">ç±³å—å¡å ¡æ–‡</language>
+ <language type="mis">其他語言</language>
+ <language type="mk">馬其頓文</language>
+ <language type="mkh">其他高棉語系</language>
+ <language type="ml">馬來亞拉姆文</language>
+ <language type="mnc">滿æ—æ–‡</language>
+ <language type="mni">曼尼普裡文</language>
+ <language type="mno">馬諾波文</language>
+ <language type="mo">摩爾多瓦文</language>
+ <language type="moh">莫éœå…‹æ–‡</language>
+ <language type="mr">馬拉地文</language>
+ <language type="ms">馬來文</language>
+ <language type="mt">馬爾他文</language>
+ <language type="mul">多種語言</language>
+ <language type="mun">è’™é”æ–‡</language>
+ <language type="mus">克里克文</language>
+ <language type="mwr">馬爾尼裡文</language>
+ <language type="my">緬甸文</language>
+ <language type="myn">馬雅文</language>
+ <language type="myv">厄爾茲亞文</language>
+ <language type="na">諾魯文</language>
+ <language type="nah">ç´ç“¦ç‰¹æ–‡</language>
+ <language type="nai">其他北美å°åœ°å®‰æ–‡</language>
+ <language type="nb">挪å¨æ³¢å…‹é»˜çˆ¾æ–‡</language>
+ <language type="nd">北地畢列文</language>
+ <language type="nds">德國北部的德文; è–©å…‹éœæ–‡</language>
+ <language type="ne">尼泊爾文</language>
+ <language type="new">尼瓦爾文</language>
+ <language type="ng">æ©æ±åŠ æ–‡</language>
+ <language type="nia">尼亞斯文</language>
+ <language type="nic">其他尼日剛果語系</language>
+ <language type="niu">ç´åŸƒæ–‡</language>
+ <language type="nl">è·è˜­æ–‡</language>
+ <language type="nn">新挪å¨æ–‡</language>
+ <language type="nog">諾蓋文</language>
+ <language type="non">å¤è«¾çˆ¾æ–¯æ–‡</language>
+ <language type="nr">å—地畢列文</language>
+ <language type="nub">努比亞文</language>
+ <language type="nv">ç´ç“¦ç´„æ–‡</language>
+ <language type="ny">å°¼æšè³ˆæ–‡</language>
+ <language type="nym">å°¼æšéŸ‹é½Šæ–‡</language>
+ <language type="nyn">å°¼æšç§‘èŠæ–‡</language>
+ <language type="nyo">尼奧囉文</language>
+ <language type="nzi">尼茲馬文</language>
+ <language type="oc">奧西å¦æ–‡</language>
+ <language type="oj">奧æ°å¸ƒç“¦æ–‡</language>
+ <language type="or">æ­é‡Œäºžæ–‡</language>
+ <language type="os">奧塞ææ–‡</language>
+ <language type="osa">æ­å¡žå¥‡æ–‡</language>
+ <language type="ota">鄂圖曼土耳其文 (1500-1928)</language>
+ <language type="oto">奧托米文</language>
+ <language type="paa">其他巴布亞諸語言</language>
+ <language type="pag">潘加辛文</language>
+ <language type="pal">巴列維文</language>
+ <language type="pam">潘帕嘉文</language>
+ <language type="pap">帕皮阿門托文</language>
+ <language type="pau">帛ç‰æ–‡</language>
+ <language type="peo">å¤æ³¢æ–¯æ–‡ (ca.600-400 B.C.)</language>
+ <language type="phi">其他è²å¾‹è³“æ–‡</language>
+ <language type="phn">腓尼基文</language>
+ <language type="pi">巴利文</language>
+ <language type="pl">波蘭文</language>
+ <language type="pon">波那è²æ–‡</language>
+ <language type="pra">å°åº¦å¤ä»£åŠä¸­ä¸–紀之中部åŠåŒ—部方言</language>
+ <language type="pro">普羅文斯文 (to 1500)</language>
+ <language type="ps">普什圖文</language>
+ <language type="qu">蓋丘亞文</language>
+ <language type="raj">拉賈斯å¦è«¸æ–‡</language>
+ <language type="rap">復活島文</language>
+ <language type="rar">拉羅通加文</language>
+ <language type="rm">里托羅曼斯文</language>
+ <language type="ro">羅馬尼亞文</language>
+ <language type="roa">其他羅曼文</language>
+ <language type="rom">å‰æ™®è³½æ–‡</language>
+ <language type="rw">盧安é”æ–‡</language>
+ <language type="sad">æ¡‘é”韋文</language>
+ <language type="sah">雅庫特文</language>
+ <language type="sal">薩利甚文</language>
+ <language type="sam">薩瑪利亞阿拉姆文</language>
+ <language type="sas">æ’’æ’’å…‹æ–‡</language>
+ <language type="sat">散塔利文</language>
+ <language type="sc">æ’’ä¸æ–‡</language>
+ <language type="sd">å°åº¦èªž</language>
+ <language type="se">北方薩米文</language>
+ <language type="sel">瑟爾å¡æ™®æ–‡</language>
+ <language type="sem">其他閃æ—語言</language>
+ <language type="sga">å¤æ„›çˆ¾è˜­æ–‡ï¼ˆè‡³ 900)</language>
+ <language type="sgn">手語</language>
+ <language type="sh">塞爾維亞克羅埃西亞文</language>
+ <language type="shn">撣文</language>
+ <language type="si">僧伽羅文</language>
+ <language type="sid">希é”æ‘©æ–‡</language>
+ <language type="sio">大蘇文</language>
+ <language type="sit">其他漢è—æ–‡</language>
+ <language type="sl">斯洛維尼亞文</language>
+ <language type="sla">其他斯拉夫文</language>
+ <language type="sm">薩摩亞文</language>
+ <language type="sma">å—薩米文</language>
+ <language type="smi">其他薩米文</language>
+ <language type="smj">魯勒薩米文</language>
+ <language type="smn">伊ç´è£¡è–©ç±³æ–‡</language>
+ <language type="sms">斯科特薩米文</language>
+ <language type="sn">塞內加爾文</language>
+ <language type="so">索馬利文</language>
+ <language type="sog">索格底亞ç´æ–‡</language>
+ <language type="sq">阿爾巴尼亞文</language>
+ <language type="sr">塞爾維亞文</language>
+ <language type="srr">塞雷爾文</language>
+ <language type="ssa">éžæ´²æ’’哈拉沙漠邊緣地帶文</language>
+ <language type="su">巽他語</language>
+ <language type="suk">蘇庫馬文</language>
+ <language type="sus">蘇蘇文</language>
+ <language type="sux">蘇美文</language>
+ <language type="sw">å²ç“¦å¸Œé‡Œæ–‡</language>
+ <language type="syr">å¤æ•˜åˆ©äºžæ–‡</language>
+ <language type="ta">å¦ç±³çˆ¾æ–‡</language>
+ <language type="te">泰盧固文</language>
+ <language type="tem">æ姆文</language>
+ <language type="ter">泰雷諾文</language>
+ <language type="tet">æ³°é “æ–‡</language>
+ <language type="ti">æ格利尼亞文</language>
+ <language type="tig">蒂格雷文</language>
+ <language type="tiv">æ夫文</language>
+ <language type="tk">土庫曼文</language>
+ <language type="tkl">托克勞文</language>
+ <language type="tli">特林基特文</language>
+ <language type="tmh">塔馬奇克文</language>
+ <language type="tn">çªå°¼è¥¿äºžæ–‡</language>
+ <language type="to">æ±åŠ æ–‡</language>
+ <language type="tog">湯加文(尼亞薩文)</language>
+ <language type="tpi">托比辛文</language>
+ <language type="tsi">欽西安文</language>
+ <language type="tt">韃é¼æ–‡</language>
+ <language type="tum">圖姆布å¡æ–‡</language>
+ <language type="tup">圖皮文</language>
+ <language type="tut">其他阿爾泰諸文</language>
+ <language type="tvl">å瓦魯文</language>
+ <language type="tw">ç¹é«”中文</language>
+ <language type="ty">大溪地文</language>
+ <language type="tyv">土凡文</language>
+ <language type="udm">沃蒂艾克文</language>
+ <language type="ug">維å¾çˆ¾æ–‡</language>
+ <language type="uga">çƒåŠ åˆ—æ–‡</language>
+ <language type="uk">çƒå…‹è˜­æ–‡</language>
+ <language type="umb">姆本æœæ–‡</language>
+ <language type="und">未確定的</language>
+ <language type="ur">çƒçˆ¾éƒ½æ–‡</language>
+ <language type="uz">çƒèŒ²åˆ¥å…‹æ–‡</language>
+ <language type="vai">越å—æ–‡ Vai</language>
+ <language type="ve">溫é”æ–‡</language>
+ <language type="vi">越å—語</language>
+ <language type="wa">瓦隆文</language>
+ <language type="wak">夸基武特文</language>
+ <language type="war">瓦瑞文</language>
+ <language type="was">瓦紹文</language>
+ <language type="wen">文德文</language>
+ <language type="wo">沃爾夫文</language>
+ <language type="xal">å¡çˆ¾æ¢…å…‹æ–‡</language>
+ <language type="xh">科薩語</language>
+ <language type="yao">瑤文</language>
+ <language type="yi">æ„第緒文</language>
+ <language type="yo">約魯巴文</language>
+ <language type="ypk">愛斯基摩文</language>
+ <language type="za">壯文</language>
+ <language type="zap">薩波特克文</language>
+ <language type="zen">澤ç´åŠ æ–‡</language>
+ <language type="znd">è´Šå¾·æ–‡</language>
+ <language type="zu">祖魯文</language>
+ <language type="zun">祖尼文</language>
+ </languages>
+ <scripts>
+ <script type="Arab">阿拉伯文</script>
+ <script type="Armn">亞美尼亞文</script>
+ <script type="Beng">孟加拉文</script>
+ <script type="Bopo">漢語注音符號</script>
+ <script type="Brai">盲人用點字法</script>
+ <script type="Cans">加拿大原ä½æ°‘通用字符</script>
+ <script type="Cher">柴羅基文</script>
+ <script type="Copt">科普特文</script>
+ <script type="Cprt">塞浦路斯文</script>
+ <script type="Cyrl">斯拉夫語系</script>
+ <script type="Dsrt">德瑟雷特文</script>
+ <script type="Ethi">衣索匹亞文</script>
+ <script type="Geor">喬治亞文</script>
+ <script type="Goth">歌德文</script>
+ <script type="Grek">希臘文</script>
+ <script type="Gujr">å‰äºžæ‹‰å¡”æ–‡</script>
+ <script type="Guru">å¤çˆ¾ç©†å¥‡æ–‡</script>
+ <script type="Hang">諺文</script>
+ <script type="Hani">漢語</script>
+ <script type="Hano">哈努努文</script>
+ <script type="Hans">簡體漢語</script>
+ <script type="Hans" alt="proposed-u63-3" draft="provisional">簡體中文</script>
+ <script type="Hant">ç¹é«”漢語</script>
+ <script type="Hant" alt="proposed-u63-1" draft="provisional">ç¹é«”中文</script>
+ <script type="Hebr">希伯來文</script>
+ <script type="Ital">å¤æ„大利文</script>
+ <script type="Khmr">高棉文</script>
+ <script type="Knda">åŽé‚£é”æ–‡</script>
+ <script type="Laoo">寮國文</script>
+ <script type="Latn">拉ä¸æ–‡</script>
+ <script type="Limb">林佈文</script>
+ <script type="Mlym">馬來亞拉姆文</script>
+ <script type="Mong">è’™å¤æ–‡</script>
+ <script type="Mymr">緬甸文</script>
+ <script type="Ogam">æ­ç”˜æ–‡</script>
+ <script type="Orya">æ­åˆ©äºžæ–‡</script>
+ <script type="Osma">æ­æ–¯æ›¼äºžæ–‡</script>
+ <script type="Runr">å¤åŒ—æ­æ–‡å­—</script>
+ <script type="Shaw">ç°«æŸç´å­—符</script>
+ <script type="Sinh">錫蘭文</script>
+ <script type="Syrc">æ•åˆ©äºžæ–‡</script>
+ <script type="Tagb">å—島文</script>
+ <script type="Taml">å¦ç±³çˆ¾æ–‡</script>
+ <script type="Telu">æ³°é­¯å¤æ–‡</script>
+ <script type="Tglg">塔加拉文</script>
+ <script type="Thaa">塔安那文</script>
+ <script type="Thai">æ³°æ–‡</script>
+ <script type="Tibt">西è—æ–‡</script>
+ <script type="Ugar">çƒåŠ åˆ—æ–‡</script>
+ <script type="Yiii">彞文</script>
+ </scripts>
+ <territories>
+ <territory type="014">æ±éž</territory>
+ <territory type="030">æ±äºž</territory>
+ <territory type="035">æ±å—亞</territory>
+ <territory type="039">å—æ­</territory>
+ <territory type="053">澳洲與ç´è¥¿è˜­</territory>
+ <territory type="054">美拉尼西亞</territory>
+ <territory type="057">密克羅尼西亞</territory>
+ <territory type="061">玻里尼西亞</territory>
+ <territory type="062" draft="unconfirmed">中å—亞</territory>
+ <territory type="142">亞洲</territory>
+ <territory type="145">西亞</territory>
+ <territory type="150">æ­æ´²</territory>
+ <territory type="151">æ±æ­</territory>
+ <territory type="154">北æ­</territory>
+ <territory type="155">西æ­</territory>
+ <territory type="830">海峽群島</territory>
+ <territory type="IM">曼島</territory>
+ <territory type="AD">安é“爾</territory>
+ <territory type="AE">阿拉伯è¯åˆå¤§å…¬åœ‹</territory>
+ <territory type="AG">安地å¡åŠå·´å¸ƒé”</territory>
+ <territory type="AI">安圭拉島</territory>
+ <territory type="AL">阿爾巴尼亞</territory>
+ <territory type="AM">亞美尼亞</territory>
+ <territory type="AN">è·å±¬å®‰åœ°åˆ—æ–¯</territory>
+ <territory type="AQ">å—極洲</territory>
+ <territory type="AS">美屬薩摩亞群島</territory>
+ <territory type="AT">奧地利</territory>
+ <territory type="AU">澳洲</territory>
+ <territory type="AW">阿路巴</territory>
+ <territory type="AX">亞蘭群島</territory>
+ <territory type="AZ">亞塞拜然</territory>
+ <territory type="BA">波士尼亞與赫塞格維ç´</territory>
+ <territory type="BB">å·´è²å¤š</territory>
+ <territory type="BD">孟加拉</territory>
+ <territory type="BE">比利時</territory>
+ <territory type="BF">布基ç´æ³•ç´¢</territory>
+ <territory type="BG">ä¿åŠ åˆ©äºž</territory>
+ <territory type="BI">浦隆地</territory>
+ <territory type="BJ">è²å—</territory>
+ <territory type="BM">百慕é”</territory>
+ <territory type="BN">汶èŠ</territory>
+ <territory type="BO">玻利維亞</territory>
+ <territory type="BS">巴哈馬</territory>
+ <territory type="BV">布å¨å³¶</territory>
+ <territory type="BW">波札那</territory>
+ <territory type="BY">白俄羅斯</territory>
+ <territory type="BZ">è²é‡Œæ–¯</territory>
+ <territory type="CC">å¯å¯æ–¯ç¾¤å³¶</territory>
+ <territory type="CD">剛果民主共和國</territory>
+ <territory type="CF">中éžå…±å’Œåœ‹</territory>
+ <territory type="CG">剛果</territory>
+ <territory type="CI">科特迪瓦</territory>
+ <territory type="CK">庫克群島</territory>
+ <territory type="CM">喀麥隆</territory>
+ <territory type="CN">中è¯äººæ°‘共和國</territory>
+ <territory type="CO">哥倫比亞</territory>
+ <territory type="CR">哥斯大黎加</territory>
+ <territory type="CS">塞爾維亞和蒙特尼哥羅</territory>
+ <territory type="CV">維德角</territory>
+ <territory type="CX">è–誕島</territory>
+ <territory type="CY">賽普勒斯</territory>
+ <territory type="CZ">æ·å…‹å…±å’Œåœ‹</territory>
+ <territory type="DE">德國</territory>
+ <territory type="DJ">å‰å¸ƒåœ°</territory>
+ <territory type="DK">丹麥</territory>
+ <territory type="DM">多明尼加</territory>
+ <territory type="DO">多明尼加共和國</territory>
+ <territory type="DZ">阿爾åŠåˆ©äºž</territory>
+ <territory type="EC">厄瓜多爾</territory>
+ <territory type="EE">愛沙尼亞</territory>
+ <territory type="ER">厄利垂亞</territory>
+ <territory type="ET">衣索比亞</territory>
+ <territory type="FI">芬蘭</territory>
+ <territory type="FJ">æ–æ¿Ÿ</territory>
+ <territory type="FK">ç¦å…‹è˜­ç¾¤å³¶</territory>
+ <territory type="FM">密克羅尼西亞群島</territory>
+ <territory type="FO">法羅群島</territory>
+ <territory type="FR">法國</territory>
+ <territory type="GA">加彭</territory>
+ <territory type="GB">英國</territory>
+ <territory type="GD">格瑞ç´é”</territory>
+ <territory type="GE">喬治亞共和國</territory>
+ <territory type="GF">法屬圭亞那</territory>
+ <territory type="GH">迦ç´</territory>
+ <territory type="GI">直布羅陀</territory>
+ <territory type="GL">格陵蘭</territory>
+ <territory type="GM">甘比亞</territory>
+ <territory type="GN">幾內亞</territory>
+ <territory type="GP">哥德普洛</territory>
+ <territory type="GQ">赤é“幾內亞</territory>
+ <territory type="GR">希臘</territory>
+ <territory type="GS">å—喬治亞與å—三明治群島</territory>
+ <territory type="GT">瓜地馬拉</territory>
+ <territory type="GU">關島</territory>
+ <territory type="GW">幾內亞比索</territory>
+ <territory type="GY">蓋亞ç´</territory>
+ <territory type="HK">中è¯äººæ°‘共和國香港特別行政å€</territory>
+ <territory type="HM">赫德與麥克當諾群島</territory>
+ <territory type="HN">å®éƒ½æ‹‰æ–¯</territory>
+ <territory type="HR">克羅埃西亞</territory>
+ <territory type="ID">å°å°¼</territory>
+ <territory type="IE">愛爾蘭</territory>
+ <territory type="IO">英屬å°åº¦æ´‹é ˜åœŸ</territory>
+ <territory type="IS">冰島</territory>
+ <territory type="IT">義大利</territory>
+ <territory type="JM">牙買加</territory>
+ <territory type="JO">ç´„æ—¦</territory>
+ <territory type="KE">肯亞</territory>
+ <territory type="KG">å‰çˆ¾å‰æ–¯</territory>
+ <territory type="KH">高棉</territory>
+ <territory type="KI">å‰é‡Œå·´æ–¯</territory>
+ <territory type="KM">科摩羅群島</territory>
+ <territory type="KN">è–克里斯多ç¦åŠå°¼ç¶­æ–¯</territory>
+ <territory type="KP">北韓</territory>
+ <territory type="KR">å—韓</territory>
+ <territory type="KY">開曼群島</territory>
+ <territory type="KZ">哈薩克</territory>
+ <territory type="LA">寮國</territory>
+ <territory type="LC">è–露西亞</territory>
+ <territory type="LI">列支敦斯登</territory>
+ <territory type="LK">斯里蘭å¡</territory>
+ <territory type="LR">賴比瑞亞</territory>
+ <territory type="LS">賴索扥</territory>
+ <territory type="LU">盧森堡</territory>
+ <territory type="LV">拉脫維亞</territory>
+ <territory type="LY">利比亞</territory>
+ <territory type="MC">æ‘©ç´å“¥</territory>
+ <territory type="MD">摩爾多瓦</territory>
+ <territory type="MG">馬é”加斯加</territory>
+ <territory type="MH">馬紹爾群島</territory>
+ <territory type="MK">馬其頓</territory>
+ <territory type="ML">馬利</territory>
+ <territory type="MM">緬甸</territory>
+ <territory type="MO">中è¯äººæ°‘共和國澳門特別行政å€</territory>
+ <territory type="MP">北馬里安ç´</territory>
+ <territory type="MQ">馬ä¸å°¼å…‹å³¶</territory>
+ <territory type="MR">茅利塔尼亞</territory>
+ <territory type="MS">蒙特色拉特島</territory>
+ <territory type="MT">馬爾他</territory>
+ <territory type="MU">模里西斯</territory>
+ <territory type="MV">馬爾地夫</territory>
+ <territory type="MW">馬拉å¨</territory>
+ <territory type="MY">馬來西亞</territory>
+ <territory type="MZ">莫三比克</territory>
+ <territory type="NA">ç´ç±³æ¯”亞</territory>
+ <territory type="NC">新喀里多尼亞群島</territory>
+ <territory type="NE">尼日</territory>
+ <territory type="NF">諾ç¦å…‹å³¶</territory>
+ <territory type="NG">奈åŠåˆ©äºž</territory>
+ <territory type="NL">è·è˜­</territory>
+ <territory type="NP">尼泊爾</territory>
+ <territory type="NR">諾魯</territory>
+ <territory type="NU">ç´å¨å³¶</territory>
+ <territory type="NZ">ç´è¥¿è˜­</territory>
+ <territory type="OM">阿曼王國</territory>
+ <territory type="PA">巴拿馬</territory>
+ <territory type="PE">秘魯</territory>
+ <territory type="PF">法屬玻里尼西亞</territory>
+ <territory type="PG">巴布亞ç´å¹¾å…§äºž</territory>
+ <territory type="PH">è²å¾‹è³“</territory>
+ <territory type="PL">波蘭</territory>
+ <territory type="PM">è–彼德與密啟崙</territory>
+ <territory type="PN">皮特康</territory>
+ <territory type="PR">玻多黎克</territory>
+ <territory type="PS">å·´å‹’æ–¯å¦</territory>
+ <territory type="PW">帛ç‰</territory>
+ <territory type="QA">å¡é”</territory>
+ <territory type="QO">大洋洲邊疆群島</territory>
+ <territory type="RE">留尼旺</territory>
+ <territory type="RO">羅馬尼亞</territory>
+ <territory type="RU">ä¿„ç¾…æ–¯</territory>
+ <territory type="RW">盧安é”</territory>
+ <territory type="SA">æ²™çƒåœ°é˜¿æ‹‰ä¼¯</territory>
+ <territory type="SB">索羅門群島</territory>
+ <territory type="SC">塞席爾</territory>
+ <territory type="SD">蘇丹</territory>
+ <territory type="SH">è–赫勒拿島</territory>
+ <territory type="SI">斯洛維尼亞</territory>
+ <territory type="SJ">冷岸åŠå¤®éº¥æ©ç¾¤å³¶</territory>
+ <territory type="SL">ç…å­å±±</territory>
+ <territory type="SM">è–馬利諾</territory>
+ <territory type="SN">塞內加爾</territory>
+ <territory type="SO">索馬利亞</territory>
+ <territory type="SR">蘇利å—</territory>
+ <territory type="ST">è–多美åŠæ™®æž—西比</territory>
+ <territory type="SV">薩爾瓦多</territory>
+ <territory type="SY">敘利亞</territory>
+ <territory type="SZ">å²ç“¦æ¿Ÿè˜­</territory>
+ <territory type="TC">土克斯åŠé–‹ç§‘斯群島</territory>
+ <territory type="TD">查德</territory>
+ <territory type="TF">法國å—屬地</territory>
+ <territory type="TG">多哥共和國</territory>
+ <territory type="TH">泰國</territory>
+ <territory type="TJ">å¡”å‰å…‹</territory>
+ <territory type="TK">托克勞群島</territory>
+ <territory type="TL">æ±å¸æ–‡</territory>
+ <territory type="TM">土庫曼</territory>
+ <territory type="TN">çªå°¼è¥¿äºž</territory>
+ <territory type="TO">æ±åŠ </territory>
+ <territory type="TT">åƒé‡Œé”åŠæ‰˜å·´å“¥</territory>
+ <territory type="TV">å瓦魯</territory>
+ <territory type="TW">臺ç£</territory>
+ <territory type="TZ">å¦å°šå°¼äºž</territory>
+ <territory type="UA">çƒå…‹è˜­</territory>
+ <territory type="UG">çƒå¹²é”</territory>
+ <territory type="UM">美屬邊疆群島</territory>
+ <territory type="US">美國</territory>
+ <territory type="UY">çƒæ‹‰åœ­</territory>
+ <territory type="UZ">çƒèŒ²åˆ¥å…‹</territory>
+ <territory type="VA">梵å¸å²¡</territory>
+ <territory type="VC">è–文森åŠæ ¼ç‘žé‚£ä¸</territory>
+ <territory type="VE">委內瑞拉</territory>
+ <territory type="VG">英屬維爾京群島</territory>
+ <territory type="VI">美屬維爾京群島</territory>
+ <territory type="VU">è¬é‚£æœ</territory>
+ <territory type="WF">瓦利斯和ç¦æœç´ç¾¤å³¶</territory>
+ <territory type="WS">薩摩亞群島</territory>
+ <territory type="YE">葉門</territory>
+ <territory type="YT">馬約特</territory>
+ <territory type="ZM">尚比亞</territory>
+ <territory type="ZW">辛巴å¨</territory>
+ </territories>
+ <variants>
+ <variant type="REVISED">已修訂</variant>
+ </variants>
+ <keys>
+ <key type="calendar">曆法</key>
+ <key type="collation">æ ¡å°</key>
+ <key type="currency">貨幣</key>
+ </keys>
+ <types>
+ <type type="buddhist" key="calendar">佛教曆法</type>
+ <type type="chinese" key="calendar">農曆</type>
+ <type type="direct" key="collation">直接順åº</type>
+ <type type="gregorian" key="calendar">公曆</type>
+ <type type="hebrew" key="calendar">希伯來曆法</type>
+ <type type="islamic" key="calendar">伊斯蘭曆法</type>
+ <type type="islamic-civil" key="calendar">伊斯蘭城市曆法</type>
+ <type type="japanese" key="calendar">日本曆法</type>
+ <type type="phonebook" key="collation">電話簿順åº</type>
+ <type type="pinyin" key="collation">拼音順åº</type>
+ <type type="stroke" key="collation">筆劃顺åº</type>
+ <type type="traditional" key="collation">傳統曆法</type>
+ </types>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[一 ä¹™ ä¸ ä¸ƒ 乃 ä¹ äº† 二 人 å…¥ å…« 刀 力 å åˆ ä¸‰ 下 丈 上 丸 凡 ä¹… 么 也 于 亡 åƒ å£ åœŸ 士 夕 大 女 å­ å° å±± å· å·¥ å·± å·² å¹² æ‰ ä¸Œ ä¸ ä¸­ 丹 之 予 云 井 互 五 ä» ä»€ 仇 ä» ä»Š 介 å…ƒ å… å…§ å…­ å…® å…¬ 分 切 å‹¿ 化 匹 åˆ å‡ åŽ„ å‹ åŠ å 天 夫 太 å­” å°‘ å°¤ å°º å·´ å¹» 引 心 戈 戶 手 扎 支 æ–‡ æ–— æ–¹ æ—¥ æ›° 月 木 æ­¢ 比 毛 æ° æ°´ ç« çˆª 父 片 牙 牛 王 丙 世 且 丘 主 ä¹ ä¹Ž 以 付 ä»” ä»– 代 令 ä»™ å…… å…„ 冊 冬 出 刊 加 功 包 北 åŠ å¡ åŽ» å¯ å¤ å³ å¬ å¸ å« å¦ å² å° å¥ å­ å›› 外 央 失 奴 奶 它 å°¼ å·¨ å·§ å·¦ 市 布 å¹³ å¹¼ 弘 å¼— å¿… 打 æ—¦ 本 未 末 札 æ­£ æ¯ æ°‘ æ°¸ 犯 玄 玉 ç“œ 瓦 甘 生 用 ç”°-申 白 çš® ç›® 矛 石 示 ç«‹ 丟 交 亦 ä¼™ 伊 ä¼ ä¼ ä¼‘ 仲 件 ä»» ä»° 份 ä¼ å…‰ å…‡ å…ˆ å…¨ å…± å† å†° 列 匈 å° å± å‰ åŒ åŠ å å„ å‘ å åˆ åƒ åŽ å›  回 地 在 圭 多 夷 夸 好 她 如 å­— å­˜ 宇 守 å®… 安 å°– å·ž å¹´ å¼ å¿™ æˆ æ‰£ 托 收 æ—© æ—­ 曲 有 朱 朵 次 æ­¤ æ­» æ± æ±— 江-污 ç° ç™¾ 竹 ç±³ 羊 ç¾½ è€ è€ƒ 而 耳 肉 臣 自 至 舌 舟 色 艾 è¡€ è¡Œ è¡£ 西 扥 串 亨 ä½ ä½ ä¼´ ä½› 何 ä¼° ä¼½ 伸 ä½” ä¼¼ 但 作 ä½  伯 低 ä½™ 佈 å…‹ å… å…µ 冷 別 判 利 刪 劫 助 努 å³ å åž å¾ å¦ å§ å‘† å³ å‘‚ å› å‘Š å¹ å¸ åµ å‘€ å« åŸ å›° å€ å‡ åŽ åœ¾ å 壯 夾 妨 妙 妥 å­ å®Œ 宋 å® å±€ å± å°¾ å·« 希 åº åºŠ å»· 弄 弟 å½¢ å½¹ 忘 å¿Œ å¿— å¿ å¿« 戒 我 抄 抗 技 扭 把 找 批 扯 折 投 抓 改 æ”» æ›´ æŸ æŽ æ æ‘ æœ æ‰ æ­¥ æ¯ æ±‚ æ²™ 沈 沉 汪 決 æ²– æ²’ æ±½ 沃 汶 ç½ ç‰  ç‹‚ ç”· 甸 矣 ç§ ç§€ 究 ç³» 罕 è‚š 育 良 見 角 言 è°· 豆 è² èµ¤ èµ° 足 身 車 è¾› è¿… å·¡ 邪 邦 é‚£ 里 防 並 ä¹– 事 些 亞 享 京 ä¾ ä½³ 使 ä¾› 例 來 佩 å…” å…’ å…© å…· å…¶ å…¸ 函 刻 刷 刺 到 制 å’ å” å“ å· å– å” å— å‘³ 呵 å’– 呼 å’Œ å‘¢ 周 命 固 垃 åª å¡ å¦ å¤ å¤œ 奉 奇 奈 奔 妻 委 妹 妮 姑 姆 å§ å§‹ 姓 姊 妳 å­Ÿ å­¤ å­£ å®— 定 官 宜 å®™ å®› å°š å±… 屆 岡 岸 岩 帕 帛 幸 店 府 底 延 弦 å¾€ å¾ å½¼ å¿  忽 念 怖 怪 怕 怡 性 或 房 所 承 拉 抹 æ‹’ æ‹› 披 æ‹” æ‹‹ 抽 æ‹ æŠµ 抱 æ‹– 拆 抬 放 æ–¼ æ—º 易 昌 昆 昂 明 æ˜ æ˜‡ æœ æœ‹ æ± æžœ æž æž— æ¯ æ° æ¿ æ¾ æž æ¬£ æ­¦ 注 æ³³ æ³¥ æ²³ æ³¢ 法 æ²¹ æ³ æ²¿ æ²» 泡 泊 ç‚Ž 爬 爭 爸 版 牧 物 ç‹€ ç‹— ç‹ çŽ© 玫 çš„ 盲 ç›´ 知 社 空 穹 ç³¾ 者 è‚¥ è‚¡ è‚© 肯 臥 èˆ èŠ³ èŠ èŠ± 芬 虎 åˆ è¡¨ è¿Ž è¿‘ 邱 采 金 é•· é–€ 陀 阿 阻 附 雨 é’ éž äº® ä¿¡ ä¾µ 侯 便 ä¿  ä¿ ä¿ƒ ä¿Š ä¿— ä¿„ ä¿‚ 冒 冠 å‰ å‰‡ 勇 勉 å‹ å— å» åŽš å’¬ å“€ å“Ž 哉 å’¦ 哇 å’ª å“ å“ˆ å’± å’§ åž‚ åž‹ 城 契 å¥ å¥Ž 姿 娃 å¨ å­© 宣 室 客 å° å± å±‹ å·· å¸ å¸¥ å¹½ 度 建 å½¥ 很 å¾… 律 後 怒 æ€ æ€¥ 怎 怨 æ° æ¨ æ¢ æ† æ‰ æ‹œ 挖 按 拼 æŒ æŒ‡ 括 拾 挑 政 æ•… æ–½ æ—¢ 春 昭 映 是 星 昨 染 柔 æŸ æŸ¬ 架 查 æŸ æŸ³ 段 毒 泉 æ´‹ æ´² æ´ª æµ æ´ž æ´— æ´» æ´½ æ´¾ æ´› æ´© 為 炸 ç‚® 牲 ç‹  çŠ çŽ» 玲 ç 甚 ç•Œ 皆 皇 盃 çœ ç›¸ 眉 看 盾 盼 ç ‚ ç ” ç  ç§‘ 秒 秋 ç©¿ çª ç´… ç´€ ç´„ 缸 美 è€ è€ è€¶ 胖 背 胡 胎 胞 致 茅 苦 è‹¥ 英 è¦ è¨ˆ 訂 貞 è²  è» è»Œ è¿° 迦 迪 è¿« 郎 é‡ é™ é™ é¢ é© éŸ‹ 音 é  é¢¨ 飛 食 首 香 厘 乘 å€ å€¼ 借 倚 倒 們 俱 個 候 ä¿® 俾 倫 å…¼ 凌 准 剛 原 å” å”· å“¥ 哲 å“© å“­ å“¡ 唉 哪 哦 埔 埃 å¤ å¥— 娘 å­« 害 家 å®® 容 å°„ 展 å³½ å³° 島 å·® 席 師 庫 庭 座 å¼± å¾’ 徑 å¾ æ¥ æ æ­ æ© æ¯ æ‚Ÿ æ‚” æ‚… 扇 拳 æ‹¿ 振 æ• æŒº æ 挪 效 æ–™ æ— æ—… 時 晉 æ™’ 書 朗 æ ¡ æ ¸ 案 æ ¹ æ¡Œ æ¡‘ 柴 æ ¼ 桃 殊 æ°£ æ³° 浪 消 涇 浦 æµ· 涉 æµ® 浩 烤 烈 çƒ ç‰¹ 狼 ç­ ç‰ ç  ç•™ ç—… ç–¼ 益 真 眠 ç ´ ç ² 祕 祖 神 ç¥ ç§¤ 租 秦 秘 ç«™ 笑 粉 ç´  ç´¢ ç´” ç´ ç´š ç´ ç´™ ç´› 缺 ç¿ è€— 脆 胸 能 臭 航 般 茫 è’ è‰ èŒ² 茶 記 討 訊 託 訓 豈 財 è²¢ èµ· è»’ è¾± é€ é€† è¿· 退 è¿´ 逃 追 é…’ é… é‡ é–ƒ 院-除 éš» 馬 骨 高 鬥 鬼 ä¹¾ åœ å‡ åš å‰ å¥ å¶ åµ å´ å· å 凰 剪 副 å‹’ å‹™ å‹• å€ åƒ æ›¼ 商 啪 啦 å•¡ å•Š å”± å• å”¯ 唸 å”® 唬 圈 國 域 å … å † 基 å ‚ 執 培 夠 å© å©¦ å©š 婆 寄 寂 宿 密 å°ˆ å°‡ å±  å´‡ å´™ 常 帶 帳 康 庸 å¼µ å¼· 彬 彩 å¾— 從 悉 æ‚  您 情 惜 控 æ² æŽ¢ 接 æ· æŽª 掉 掃 掛 推 授 採 排 æ¨ æ• æ•‘ æ•™ æ•— å•Ÿ æ• æ•˜ æ— æ—‹ 晚 晨 望 æ¢ æ¢¯ 梵 械 棄 梅 æ¢ æ¢¨ 欲 殺 毫 涼 液 æ·¡ æ·º 清 涯 æ·‘ æ·· 涵 æ·š æ·± æ·¨ 爽 牽 猜 猛 率 çƒ ç† ç¾ ç“¶ 甜 產 ç•¥ ç•¢ ç•° ç– ç—• ç›› 眾 眼 祥 票 移 笨 笛 第 符 ç²— çµ± ç´¹ ç´° 組 ç´¯ 終 羞 ç¿’ èŠ è„« 船 莎 莫 莊 莉 è· è™• 蛋 è¡“ 被 袋 è¦ è¨ª 許 設 責 貫 貨 貪 軟 這 通 連 速 é€ é€ é€  é€ é€¢ 逛 途 部 郭 都 野 釣 é–‰ 陪 陵 陳 陸 é™° 陶 é™· 雪 ç«  ç«Ÿ é ‚ é­š é³¥ 鹿 麥 麻 å•¥ å‚¢ å‚™ å‚‘ 最 凱 割 創 剩 å‹ž å‹ åš å–€ å–Š å– å–‚ å–œ å–” å–‡ å–® å–¬ åœ å ª å ´ å ± å ¡ 媒 寒 富 å°Š å°‹ å°± åµ å´´ å¹… 帽 å¹¾ å½­ 復 惑 惡 悲 悶 惠 惱 愉 掌 æ æ’ æ æ¡ æ® æ´ æ› æš æ•¦ æ•¢ æ•£ æ– æ–¯ æ™® æ™´ 晶 景 æš‘ 智 曾 替 期 æœ æ¤… 森 棒 棋 æ¤ æ£‰ 棚 款 欺 欽 殘 殼 港 游 渡 減 æ¹– 湯 測 滋 焦 ç„¡ 然 牌 猶 çª ç´ ç•« 番 ç—› ç™» 發 盜 短 硬 ç¨ ç¨‹ 稅 窗 ç«¥ ç­‰ ç­– ç­† ç­” ç­‹ çµ çµ• ç´« çµ² 絡 給 å–„ ç¿” è…” è…“ 舒 è© è¯ è‘— èŠ è² è„ èœ è™› è›™ è¡— è£ è£‚ 視 註 è©• è©ž 証 訴 象 è²¼ è²» è³€ è²´ è²· 越 超 è·Ž è· è·‘ è·Œ 週 逸 進 é„‚ 郵 鄉 é‡ é–‹ é–“ é–’ 隊 階 陽 隆 é›… 雄 集 雲 é … é † é ˆ 飯 飲 黃 黑 å–µ 亂 傲 傳 僅 傾 å‚· å‚» 勤 å‹¢ å—¨ å—Ž å—¯ å—š 園 圓 å¡ž å¡— å¡” å¡« å¡Š 奧 å«Œ 媽 å¹¹ 廉 å¾® æ„š æ„ æ…ˆ æ„Ÿ 想 æ„› 惹 æ„ æ„ˆ æž æ­ æ¬ æ æ¶ æ– æ•¬ æ–° æš— æš– 會 業 楚 極 椰 概 楊 楓 æ­² 毀 æº æº æ»… 溫 滑 準 滄 溪 ç…™ ç…© ç…§ ç…ž 爺 ç… ç‘Ÿ ç‘ž ç‘™ ç‘œ 當 ç—´ 盟 ç› ç£ ç¢Ž 碰 碗 ç¦ è¬ ç¯€ 經 ç½® 罪 ç½² 義 群 è– è…° è…³ è…¦ è’‚ è½ è‘‰ è‘› è‘¡ 號 蜂 補 è£ è£¡ 裕 解 該 詳 試 è©© 誇 誠 話 è©¢ 資 賈 è·¡ è·Ÿ è·¯ è·³ 躲 較 載 è¾² é‹ éŠ é“ é” é€¼ é• é‡ éŽ é 鈴 éš” é›· é›» 零 é– é  é ‘ é “ 飽 飾 鼓 é¼  僧 åƒ åƒ‘ 劃 厭 嘛 嘗 嘆 嘉 團 圖 塵 境 壽 夥 夢 奪 å«© 寞 寧 實 寨 寢 察 å° å¹£ 幕 å»– å½° å¾¹ æ…‹ æ…¢ æ…£ æ…˜ 截 摘 摸 æ—— 榜 榮 構 æ§ æ­‰ æ­Œ æ¼” 滾 æ»´ æ¼  æ¼ æ¼‚ æ¼¢ 滿 漸 æ¼² 漫 熊 爾 ç„ ç‘¤ 瑪 ç‘° ç–‘ 瘋 盡 監 ç¡ ç£ ç¢Ÿ 碧 碩 ç¦ ç¦ ç¨® 稱 窩 端 管 ç®— ç²¾ 綜 綠 ç·Š 網 綱 維 ç·’ ç½° èž èš è…¿ 臺 與 舞 è’™ è’² è“‹ è’¼ 蜜 製 誌 語 èª èª“ 誤 說 豪 貌 賓 赫 趙 趕 è¼” 輕 é  éœ é™ é…¸ é…· 銀 銘 銖 é–£ éšœ éš› 需 é¼ é — é ˜ 餅 é­ é­‚ é³´ é³³ 麼 é¼» 齊 å„„ å„€ 價 劇 劉 åŠ åŽ² 嘻 嘿 嘴 å™´ 增 墮 寮 寬 審 寫 層 廢 廣 å»  彈 å½± å¾· å¾µ æ…¶ æ…§ æ…® æ…• 憂 æ…° æ…¾ æ† æ‘© æ’ž æ’ æ’¥ æ’’ æ’­ 敵 數 æš« æš´ 樣 樞 標 模 樓 樂 æ­ æ¯… æ½” æ½› æ½® 潘 熟 熱 çŽ ç›¤ 確 碼 稿 窮 ç®­ ç®± 範 篇 糊 ç·´ ç·¯ ç·¬ ç·¨ ç·£ ç·š ç·© ç½µ ç½· è“® 蔣 蔡 è¶ è¡› è¡ è¤‡ 誼 è«’ 談 誕 è«‹ 諸 課 調 誰 è«– 豬 賞 賦 賤 è³­ è³¢ è³£ 賜 質 趣 踢 è¸ è¼ è¼› 輩 輪 é© é® é­ é· é„° é„­ 醉 銷 銳 é‹’ é–± 震 é  éž‹ 養 餘 é§ é§› 駕 é«® 鬧 é­… é­¯ 黎 墨 é½’ æ’£ 蔕 å„’ 儘 å‡ å™¨ å£ å¥® å­¸ å°Ž 彊 憲 憑 憶 憾 戰 æ“ æ“‹ æ“š 擇 æ“ æ’¿ æ“” æ’¾ æ•´ 曆 曉 æ©« 樹 æ©‹ æ©Ÿ æ­· 濃 澤 æ¾³ æ¿€ 燒 燈 燃 ç¨ ç›§ 磨 ç© ç©† ç©Œ 築 糕 縣 ç¿° 興 è•­ 螢 èž è¡¡ 褲 親 諺 謀 諾 謂 貓 è³´ 輯 輸 辨 辦 é¸ é² éº é†’ 錯 錢 鋼 錫 錄 錦 隨 險 éœ éœ é » é ­ é¤ é¤¨ 默 é¾ é¾œ 圜 優 勵 嚇 壓 嶺 幫 彌 應 懂 戲 戴 æ“Ž æ“Š æ“  擦 擬 檀 檔 檢 濱 æ¿Ÿ 濤 æ¿« 營 爵 牆 ç² ç’° 療 瞧 çž­ 磯 禪 糟 縮 績 總 縱 ç¹ ç¿¼ è² è° è¯ è†½ 臉 臨 舉 è–ª è–„ 虧 講 è¬ è³º è³½ è³¼ 趨 é¿ é‚„ é‚ é‚€ 醜 éµ é‹ é¾ é—Š é—† éš± é›– 韓 顆 é®® é´» 點 齋 壘 æ“´ 擾 擺 æ–· æ­¸ 礎 禮 ç°« ç°¡ ç¹” 繞 翹 ç¿» è· èˆŠ è— è–© è— è—‰ è–¦ 蟲 覆 è± è¹¤ 蹟 轉 醫 鎊 鎖 鎮 é— é›¢ 雜 é›™ 雞 é¡ é¡ é¡Œ 騎 鬆 éµ å£ž 壢 懷 懶 爆 ç¸ ç–† 癡 礙 ç©© ç°¿ ç°½ 繪 ç¾… ç¹³ 臘 è— è—¤ è—¥ è  èŸ¹ è­œ è­˜ è­‰ è´ˆ è´Š è¾­ é‚Š é¡ é—œ 難 霧 韻 é¡ž 願 騙 麗 勸 åš´ 寶 çˆ ç» ç«¶ 籌 籃 ç± ç¹¼ 耀 艦 蘆 蘇 覺 觸 è­° è­¦ è­¯ è´ é‡‹ é˜ é—¡ 飄 騷 麵 黨 齡 屬 懼 æ” æ¬„ çŒ çˆ› 犧 續 蘭 覽 è­· è­½ èº è½Ÿ 辯 éµ éœ¸ 霹 露 響 顧 é©… é­” 囉 彎 權 æ­¡ è½ è®€ é‘‘ 韃 戀 變 é‚ é¡¯ é©š é©— é«” 讓 é‚ éˆ é·¹ 廳 ç£ è » 觀 讚 鬱 彞 æ• ç®€]</exemplarCharacters>
+ </characters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="wide">
+ <quarter type="1" draft="unconfirmed">第1季</quarter>
+ <quarter type="2" draft="unconfirmed">第2季</quarter>
+ <quarter type="3" draft="unconfirmed">第3季</quarter>
+ <quarter type="4" draft="unconfirmed">第4季</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">西元å‰</era>
+ <era type="1" draft="unconfirmed">西元</era>
+ </eraNames>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>yyyy'年'M'月'd'日'EEEE</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>yyyy'年'M'月'd'日'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy/M/d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yyyy/M/d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern>ahh'時'mm'分'ss'秒' z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>ahh'時'mm'分'ss'秒'</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>a h:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>a h:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="Md" draft="provisional">M/d</dateFormatItem>
+ <dateFormatItem id="yyyyM" draft="provisional">yyyy/M</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat>+HH:mm;-HH:mm</hourFormat>
+ <zone type="Africa/Timbuktu">
+ <exemplarCity>廷巴克圖</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/ComodRivadavia">
+ <exemplarCity>科木多洛</exemplarCity>
+ </zone>
+ <zone type="Europe/Belfast">
+ <exemplarCity>è²çˆ¾è²»æ–¯ç‰¹</exemplarCity>
+ </zone>
+ <zone type="Pacific/Yap">
+ <exemplarCity>雅浦島</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Rothera">
+ <exemplarCity>羅瑟拉</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Palmer">
+ <exemplarCity>帕麥</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity>å—極</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Davis">
+ <exemplarCity>戴維斯</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Vostok">
+ <exemplarCity>莫斯托克</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Casey">
+ <exemplarCity>凱西</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity>æœè’™æœçˆ¾ç¶­çˆ¾</exemplarCity>
+ </zone>
+ <zone type="Antarctica/McMurdo">
+ <exemplarCity>麥克馬多</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Rio_Gallegos">
+ <exemplarCity>加拉哥斯</exemplarCity>
+ </zone>
+ <zone type="America/Mendoza">
+ <exemplarCity>門多薩</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/San_Juan">
+ <exemplarCity>è–胡安</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Ushuaia">
+ <exemplarCity>çƒæ–¯æ‡·äºž</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/La_Rioja">
+ <exemplarCity>拉略哈</exemplarCity>
+ </zone>
+ <zone type="America/Catamarca">
+ <exemplarCity>å¡å¡”馬å¡</exemplarCity>
+ </zone>
+ <zone type="America/Jujuy">
+ <exemplarCity>胡韋</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Tucuman">
+ <exemplarCity>å庫曼</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity>哥多è¯</exemplarCity>
+ </zone>
+ <zone type="America/Buenos_Aires">
+ <exemplarCity>布宜諾斯艾利斯</exemplarCity>
+ </zone>
+ <zone type="Australia/Perth">
+ <exemplarCity>伯斯</exemplarCity>
+ </zone>
+ <zone type="Australia/Darwin">
+ <exemplarCity>é”爾文</exemplarCity>
+ </zone>
+ <zone type="Australia/Adelaide">
+ <exemplarCity>阿得雷德</exemplarCity>
+ </zone>
+ <zone type="Australia/Broken_Hill">
+ <exemplarCity>斷丘市</exemplarCity>
+ </zone>
+ <zone type="Australia/Melbourne">
+ <exemplarCity>墨爾本</exemplarCity>
+ </zone>
+ <zone type="Australia/Hobart">
+ <exemplarCity>è·å·´ç‰¹</exemplarCity>
+ </zone>
+ <zone type="Australia/Sydney">
+ <exemplarCity>雪梨</exemplarCity>
+ </zone>
+ <zone type="Australia/Brisbane">
+ <exemplarCity>布利斯ç­</exemplarCity>
+ </zone>
+ <zone type="Australia/Lord_Howe">
+ <exemplarCity>羅豪島</exemplarCity>
+ </zone>
+ <zone type="America/Eirunepe">
+ <exemplarCity>艾魯內佩</exemplarCity>
+ </zone>
+ <zone type="America/Rio_Branco">
+ <exemplarCity>布蘭科</exemplarCity>
+ </zone>
+ <zone type="America/Porto_Velho">
+ <exemplarCity>維留港</exemplarCity>
+ </zone>
+ <zone type="America/Boa_Vista">
+ <exemplarCity>ä¿ç¶­æ–¯å¡”</exemplarCity>
+ </zone>
+ <zone type="America/Manaus">
+ <exemplarCity>瑪瑙斯</exemplarCity>
+ </zone>
+ <zone type="America/Cuiaba">
+ <exemplarCity>å¤é›…å·´</exemplarCity>
+ </zone>
+ <zone type="America/Campo_Grande">
+ <exemplarCity>格蘭場</exemplarCity>
+ </zone>
+ <zone type="America/Belem">
+ <exemplarCity>è²å€«</exemplarCity>
+ </zone>
+ <zone type="America/Araguaina">
+ <exemplarCity>阿拉圭那</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity>è–ä¿ç¾…</exemplarCity>
+ </zone>
+ <zone type="America/Bahia">
+ <exemplarCity>巴伊阿</exemplarCity>
+ </zone>
+ <zone type="America/Fortaleza">
+ <exemplarCity>ç¦å¡”力莎</exemplarCity>
+ </zone>
+ <zone type="America/Maceio">
+ <exemplarCity>馬瑟æ­</exemplarCity>
+ </zone>
+ <zone type="America/Recife">
+ <exemplarCity>雷西éž</exemplarCity>
+ </zone>
+ <zone type="America/Noronha">
+ <exemplarCity>諾倫哈</exemplarCity>
+ </zone>
+ <zone type="America/Dawson">
+ <exemplarCity>é“生河</exemplarCity>
+ </zone>
+ <zone type="America/Whitehorse">
+ <exemplarCity>懷特éœæ–¯</exemplarCity>
+ </zone>
+ <zone type="America/Vancouver">
+ <exemplarCity>溫哥è¯</exemplarCity>
+ </zone>
+ <zone type="America/Dawson_Creek">
+ <exemplarCity>é“生ç£</exemplarCity>
+ </zone>
+ <zone type="America/Yellowknife">
+ <exemplarCity>è€ç¾…è€ä½›</exemplarCity>
+ </zone>
+ <zone type="America/Inuvik">
+ <exemplarCity>伊奴維克</exemplarCity>
+ </zone>
+ <zone type="America/Edmonton">
+ <exemplarCity>艾德蒙åž</exemplarCity>
+ </zone>
+ <zone type="America/Swift_Current">
+ <exemplarCity>瑞夫å¡å€«ç‰¹</exemplarCity>
+ </zone>
+ <zone type="America/Cambridge_Bay">
+ <exemplarCity>åŠæ©‹ç£</exemplarCity>
+ </zone>
+ <zone type="America/Regina">
+ <exemplarCity>利宅那</exemplarCity>
+ </zone>
+ <zone type="America/Winnipeg">
+ <exemplarCity>溫尼伯</exemplarCity>
+ </zone>
+ <zone type="America/Rainy_River">
+ <exemplarCity>雨河鎮</exemplarCity>
+ </zone>
+ <zone type="America/Rankin_Inlet">
+ <exemplarCity>蘭今ç£</exemplarCity>
+ </zone>
+ <zone type="America/Thunder_Bay">
+ <exemplarCity>çŠå¾·ç£</exemplarCity>
+ </zone>
+ <zone type="America/Nipigon">
+ <exemplarCity>尼皮岡</exemplarCity>
+ </zone>
+ <zone type="America/Toronto">
+ <exemplarCity>多倫多</exemplarCity>
+ </zone>
+ <zone type="America/Montreal">
+ <exemplarCity>蒙特å©</exemplarCity>
+ </zone>
+ <zone type="America/Iqaluit">
+ <exemplarCity>伊é­ç‰¹</exemplarCity>
+ </zone>
+ <zone type="America/Pangnirtung">
+ <exemplarCity>潘尼爾æ±</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <standard>大西洋標準時間</standard>
+ <daylight>大西洋日光節約時間</daylight>
+ </long>
+ <exemplarCity>哈里法克斯</exemplarCity>
+ </zone>
+ <zone type="America/Goose_Bay">
+ <exemplarCity>éµç£</exemplarCity>
+ </zone>
+ <zone type="America/Glace_Bay">
+ <exemplarCity>格雷斯è²</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <standard>ç´èŠ¬è˜­æ¨™æº–時間</standard>
+ <daylight>ç´èŠ¬è˜­æ—¥å…‰ç¯€ç´„時間</daylight>
+ </long>
+ <exemplarCity>è–ç´„ç¿°</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity>金å¤æ²™</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity>蘆佈巴西</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity>復活島</exemplarCity>
+ </zone>
+ <zone type="America/Santiago">
+ <exemplarCity>è–地牙哥</exemplarCity>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity>喀什米爾</exemplarCity>
+ </zone>
+ <zone type="Asia/Urumqi">
+ <exemplarCity>çƒé­¯æœ¨é½Š</exemplarCity>
+ </zone>
+ <zone type="Asia/Chongqing">
+ <exemplarCity>é‡æ…¶</exemplarCity>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <standard>中國標準時間</standard>
+ <daylight>中國標準時間</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Harbin">
+ <exemplarCity>哈爾濱</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity>加拉巴哥群島</exemplarCity>
+ </zone>
+ <zone type="America/Guayaquil">
+ <exemplarCity>瓜亞基爾</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity>加ç´åˆ©</exemplarCity>
+ </zone>
+ <zone type="Africa/Ceuta">
+ <exemplarCity>休é”</exemplarCity>
+ </zone>
+ <zone type="Europe/Madrid">
+ <exemplarCity>馬德里</exemplarCity>
+ </zone>
+ <zone type="Pacific/Truk">
+ <exemplarCity>土魯克群島</exemplarCity>
+ </zone>
+ <zone type="Pacific/Ponape">
+ <exemplarCity>æ³¢ç´ä½©</exemplarCity>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <standard>中æ­æ¨™æº–時間</standard>
+ <daylight>中æ­æ—¥å…‰ç¯€ç´„時間</daylight>
+ </long>
+ </zone>
+ <zone type="Europe/London">
+ <exemplarCity>倫敦</exemplarCity>
+ </zone>
+ <zone type="America/Thule">
+ <exemplarCity>æœé‡Œ</exemplarCity>
+ </zone>
+ <zone type="America/Godthab">
+ <exemplarCity>高特哈市</exemplarCity>
+ </zone>
+ <zone type="America/Scoresbysund">
+ <exemplarCity>æ–¯å¯æ¯”æµ·å³½</exemplarCity>
+ </zone>
+ <zone type="America/Danmarkshavn">
+ <exemplarCity>丹馬沙文</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity>雅加é”</exemplarCity>
+ </zone>
+ <zone type="Asia/Makassar">
+ <exemplarCity>馬å¡æ²™çˆ¾</exemplarCity>
+ </zone>
+ <zone type="Asia/Jayapura">
+ <exemplarCity>加亞布拉</exemplarCity>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <standard>以色列標準時間</standard>
+ <daylight>以色列日光節約時間</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <standard>日本標準時間</standard>
+ <daylight>日本標準時間</daylight>
+ </long>
+ <exemplarCity>æ±äº¬</exemplarCity>
+ </zone>
+ <zone type="Pacific/Enderbury">
+ <exemplarCity>æ©å¾—伯ç†å³¶</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kiritimati">
+ <exemplarCity>è–誕島</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tarawa">
+ <exemplarCity>塔拉瓦</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtau">
+ <exemplarCity>艾克陶</exemplarCity>
+ </zone>
+ <zone type="Asia/Oral">
+ <exemplarCity>奧拉爾</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtobe">
+ <exemplarCity>阿克糾賓</exemplarCity>
+ </zone>
+ <zone type="Asia/Qyzylorda">
+ <exemplarCity>奎茲羅答</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity>阿拉木圖</exemplarCity>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <standard>格林å¨æ²»æ¨™æº–時間</standard>
+ <daylight>格林å¨æ²»æ¨™æº–時間</daylight>
+ </long>
+ <exemplarCity>å¡è–©å¸ƒè˜­å¡</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kwajalein">
+ <exemplarCity>瓜加林島</exemplarCity>
+ </zone>
+ <zone type="Pacific/Majuro">
+ <exemplarCity>馬朱諾</exemplarCity>
+ </zone>
+ <zone type="Africa/Bamako">
+ <exemplarCity>巴馬科</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity>çƒè˜­å·´æ‰˜</exemplarCity>
+ </zone>
+ <zone type="Asia/Choibalsan">
+ <exemplarCity>å“巴爾塞</exemplarCity>
+ </zone>
+ <zone type="America/Tijuana">
+ <exemplarCity>æè¯ç´</exemplarCity>
+ </zone>
+ <zone type="America/Hermosillo">
+ <exemplarCity>厄莫休</exemplarCity>
+ </zone>
+ <zone type="America/Mazatlan">
+ <exemplarCity>馬薩特蘭</exemplarCity>
+ </zone>
+ <zone type="America/Chihuahua">
+ <exemplarCity>奇è¯è¯</exemplarCity>
+ </zone>
+ <zone type="America/Monterrey">
+ <exemplarCity>蒙特瑞</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity>墨西哥市</exemplarCity>
+ </zone>
+ <zone type="America/Merida">
+ <exemplarCity>美里é”</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity>康庫</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuching">
+ <exemplarCity>å¤æ™‰</exemplarCity>
+ </zone>
+ <zone type="Pacific/Chatham">
+ <exemplarCity>查å¦</exemplarCity>
+ </zone>
+ <zone type="Pacific/Auckland">
+ <exemplarCity>奧克蘭</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tahiti">
+ <exemplarCity>大溪地</exemplarCity>
+ </zone>
+ <zone type="Pacific/Marquesas">
+ <exemplarCity>馬å¯è–©æ–¯å³¶</exemplarCity>
+ </zone>
+ <zone type="Pacific/Gambier">
+ <exemplarCity>岡必爾群島</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity>亞速爾群島</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Madeira">
+ <exemplarCity>馬得拉群島</exemplarCity>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <standard>æ±æ­æ¨™æº–時間</standard>
+ <daylight>æ±æ­æ—¥å…‰ç¯€ç´„時間</daylight>
+ </long>
+ </zone>
+ <zone type="Europe/Kaliningrad">
+ <exemplarCity>加里寧格勒</exemplarCity>
+ </zone>
+ <zone type="Europe/Samara">
+ <exemplarCity>沙馬拉</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity>葉å¡æ·æž—å ¡</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity>新西伯利亞</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity>克拉斯諾雅斯克</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity>伊爾庫次克</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity>雅庫次克</exemplarCity>
+ </zone>
+ <zone type="Asia/Vladivostok">
+ <exemplarCity>æµ·åƒå´´</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity>庫é å³¶</exemplarCity>
+ </zone>
+ <zone type="Asia/Magadan">
+ <exemplarCity>馬加丹</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity>堪查加</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity>阿那底河</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Jan_Mayen">
+ <exemplarCity>央麥æ©å³¶</exemplarCity>
+ </zone>
+ <zone type="Arctic/Longyearbyen">
+ <exemplarCity>隆æ„耳拜æ©</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity>çƒèŒ²å“¥æ´›</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity>基輔</exemplarCity>
+ </zone>
+ <zone type="Europe/Simferopol">
+ <exemplarCity>è¾›éžæ´›æµ¦</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity>札波羅çµ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Midway">
+ <exemplarCity>中途島</exemplarCity>
+ </zone>
+ <zone type="Pacific/Johnston">
+ <exemplarCity>強斯頓</exemplarCity>
+ </zone>
+ <zone type="Pacific/Wake">
+ <exemplarCity>å¨å…‹</exemplarCity>
+ </zone>
+ <zone type="America/Adak">
+ <exemplarCity>艾é”å…‹</exemplarCity>
+ </zone>
+ <zone type="America/Nome">
+ <exemplarCity>諾姆</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <standard>å¤å¨å¤·æ¨™æº–時間</standard>
+ <daylight>å¤å¨å¤·æ¨™æº–時間</daylight>
+ </long>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <standard>阿拉斯加標準時間</standard>
+ <daylight>阿拉斯加日光節約時間</daylight>
+ </long>
+ <exemplarCity>安克里治</exemplarCity>
+ </zone>
+ <zone type="America/Yakutat">
+ <exemplarCity>雅庫塔</exemplarCity>
+ </zone>
+ <zone type="America/Juneau">
+ <exemplarCity>朱諾</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <standard>太平洋標準時間</standard>
+ <daylight>太平洋日光節約時間</daylight>
+ </long>
+ <exemplarCity>æ´›æ‰ç£¯</exemplarCity>
+ </zone>
+ <zone type="America/Boise">
+ <exemplarCity>波伊斯</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <long>
+ <standard>å±±å€æ¨™æº–時間</standard>
+ <daylight>å±±å€æ¨™æº–時間</daylight>
+ </long>
+ <exemplarCity>鳳凰城</exemplarCity>
+ </zone>
+ <zone type="America/Shiprock">
+ <exemplarCity>船岩峰</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <long>
+ <standard>å±±å€æ¨™æº–時間</standard>
+ <daylight>å±±å€æ—¥å…‰ç¯€ç´„時間</daylight>
+ </long>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity>申特城</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <standard>中部標準時間</standard>
+ <daylight>中部日光節約時間</daylight>
+ </long>
+ </zone>
+ <zone type="America/Menominee">
+ <exemplarCity>美諾米克</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Knox">
+ <exemplarCity>諾克斯</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Marengo">
+ <exemplarCity>馬倫哥</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <long>
+ <standard>æ±éƒ¨æ¨™æº–時間 Indianapolis</standard>
+ <daylight>æ±éƒ¨æ¨™æº–時間 Indianapolis daylight</daylight>
+ </long>
+ <exemplarCity>å°ç¬¬å®‰é‚£æ³¢é‡Œæ–¯</exemplarCity>
+ </zone>
+ <zone type="America/Louisville">
+ <exemplarCity>路易斯維</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vevay">
+ <exemplarCity>維å¨</exemplarCity>
+ </zone>
+ <zone type="America/Kentucky/Monticello">
+ <exemplarCity>è’™æç‘Ÿæ´›</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <standard>æ±éƒ¨æ¨™æº–時間</standard>
+ <daylight>æ±éƒ¨æ—¥å…‰ç¯€ç´„時間</daylight>
+ </long>
+ <exemplarCity>ç´ç´„</exemplarCity>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity>撒馬爾罕</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencies>
+ <currency type="ADP">
+ <displayName>安é“爾陪士特</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName>阿拉伯è¯åˆå¤§å…¬åœ‹è¿ªçˆ¾æ±—</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName>阿爾巴尼亞列克</displayName>
+ </currency>
+ <currency type="AMD">
+ <displayName>亞美尼亞德拉姆</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName>è·è˜­ 安梯蘭 盾</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName>安哥拉寬扎</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName>安哥拉寬扎(1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName>安哥拉新寬扎 (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName>安哥拉新寬扎 Reajustado (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName>阿根廷奧斯特ç´çˆ¾</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName>阿根廷披索(1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName>阿根廷披索</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName>奧地利先令</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName>澳幣</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName>阿魯巴盾</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName>阿塞拜彊馬特ç´</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName>波士尼亞-黑塞哥維那第ç´çˆ¾</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName>波士尼亞-黑塞哥維那å¯è½‰æ›é¦¬å…‹</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName>å·´è²å¤šå…ƒ</displayName>
+ </currency>
+ <currency type="BDT">
+ <displayName>孟加拉塔å¡</displayName>
+ </currency>
+ <currency type="BEC">
+ <displayName>比利時法郎 (å¯è½‰æ›ï¼‰</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName>比利時法郎</displayName>
+ </currency>
+ <currency type="BEL">
+ <displayName>比利時法郎 (金èžï¼‰</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName>ä¿åŠ åˆ©äºžç¡¬åˆ—å¼—</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName>ä¿åŠ åˆ©äºžæ–°åˆ—å¼—</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName>巴林第ç´çˆ¾</displayName>
+ </currency>
+ <currency type="BIF">
+ <displayName>蒲隆地法郎</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName>百慕é”å¹£</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName>汶èŠå…ƒ</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName>玻利維亞貨幣單ä½</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName>玻利維亞披索</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName>玻利維亞 幕多</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName>巴西克魯薩多 農瓦 (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName>巴西克魯賽羅 (1986-1989)</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName>巴西克魯賽羅 (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName>巴西里拉</displayName>
+ </currency>
+ <currency type="BRN">
+ <displayName>巴西 å…‹å¦‚çˆ¾é” è¾²ç“¦</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName>巴西克魯賽羅</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName>巴哈馬元</displayName>
+ </currency>
+ <currency type="BUK">
+ <displayName>緬甸元 BUK</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName>波札那 - 普拉</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName>白俄羅斯新盧布 (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName>白俄羅斯盧布</displayName>
+ </currency>
+ <currency type="BZD">
+ <displayName>伯利茲元</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName>加幣</displayName>
+ </currency>
+ <currency type="CDF">
+ <displayName>剛果法郎</displayName>
+ </currency>
+ <currency type="CLF">
+ <displayName>å¡æž—æ²¹é”佛曼跎</displayName>
+ </currency>
+ <currency type="CLP">
+ <displayName>智利披索</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName>人民幣</displayName>
+ </currency>
+ <currency type="COP">
+ <displayName>哥倫比亞披索</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName>哥斯大黎加科郎</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName>æ·å…‹æ–¯æ´›ä¼å…‹ç¡¬å…‹æœ—</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName>å¤å·´æŠ«ç´¢</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName>維德角埃斯庫多</displayName>
+ </currency>
+ <currency type="CYP">
+ <displayName>賽浦路斯鎊</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName>æ·å…‹å…‹æœ—</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName>æ±å¾·æ±å¾·é¦¬å…‹</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName>德國馬克</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName>å‰å¸ƒåœ°æ³•éƒŽ</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName>丹麥克羅ç´</displayName>
+ </currency>
+ <currency type="DOP">
+ <displayName>多明尼加披索</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName>阿爾åŠåˆ©äºžç¬¬ç´çˆ¾</displayName>
+ </currency>
+ <currency type="ECS">
+ <displayName>厄瓜多蘇克雷</displayName>
+ </currency>
+ <currency type="ECV">
+ <displayName>厄瓜多爾由里é”ç“¦åº·æ–¯å¦ (UVC)</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName>愛沙尼亞克朗</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName>埃åŠéŽŠ</displayName>
+ </currency>
+ <currency type="ERN">
+ <displayName>厄立特里亞ç´å…‹æ³•</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName>西ç­ç‰™é™ªå£«ç‰¹</displayName>
+ </currency>
+ <currency type="ETB">
+ <displayName>衣索比亞比爾</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName>æ­å…ƒ</displayName>
+ <symbol>EUR</symbol>
+ </currency>
+ <currency type="FIM">
+ <displayName>芬蘭馬克</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName>æ–æ¿Ÿå…ƒ</displayName>
+ </currency>
+ <currency type="FKP">
+ <displayName>ç¦å…‹è˜­ç¾¤å³¶éŽŠ</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName>法國法郎</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName>英鎊</displayName>
+ <symbol>GBP</symbol>
+ </currency>
+ <currency type="GEK">
+ <displayName>喬治 åº«æ— æ‹‰é‡Œ</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName>喬治拉里</displayName>
+ </currency>
+ <currency type="GHC">
+ <displayName>迦ç´ä»™è”•</displayName>
+ </currency>
+ <currency type="GIP">
+ <displayName>直布羅陀鎊</displayName>
+ </currency>
+ <currency type="GMD">
+ <displayName>甘比亞é”拉西</displayName>
+ </currency>
+ <currency type="GNF">
+ <displayName>幾內亞法郎</displayName>
+ </currency>
+ <currency type="GNS">
+ <displayName>幾內亞西里</displayName>
+ </currency>
+ <currency type="GQE">
+ <displayName>赤é“幾內亞埃奎勒</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName>希臘德拉克馬</displayName>
+ </currency>
+ <currency type="GTQ">
+ <displayName>瓜地馬拉格查爾</displayName>
+ </currency>
+ <currency type="GWE">
+ <displayName>葡屬幾內亞埃斯庫多</displayName>
+ </currency>
+ <currency type="GWP">
+ <displayName>幾內亞披索披索</displayName>
+ </currency>
+ <currency type="GYD">
+ <displayName>圭亞那元</displayName>
+ </currency>
+ <currency type="HNL">
+ <displayName>洪都拉斯倫皮拉</displayName>
+ </currency>
+ <currency type="HRD">
+ <displayName>克羅地亞第ç´çˆ¾</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName>克羅地亞庫ç´</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName>匈牙利 - ç¦æž—</displayName>
+ </currency>
+ <currency type="IDR">
+ <displayName>å°å°¼ - 盧布</displayName>
+ </currency>
+ <currency type="IEP">
+ <displayName>愛爾蘭鎊</displayName>
+ </currency>
+ <currency type="ILP">
+ <displayName>以色列鎊</displayName>
+ </currency>
+ <currency type="ILS">
+ <displayName>以色列新è¬å…‹çˆ¾</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName>å°åº¦ç›§å¸ƒ</displayName>
+ </currency>
+ <currency type="IQD">
+ <displayName>伊拉克第ç´çˆ¾</displayName>
+ </currency>
+ <currency type="IRR">
+ <displayName>伊朗里亞爾</displayName>
+ </currency>
+ <currency type="ISK">
+ <displayName>冰島克朗</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName>義大利里拉</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName>牙買加元</displayName>
+ </currency>
+ <currency type="JOD">
+ <displayName>約旦第ç´çˆ¾</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName>日圓</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName>肯尼亞先令</displayName>
+ </currency>
+ <currency type="KGS">
+ <displayName>å‰çˆ¾å‰æ–¯ç´¢é¦¬</displayName>
+ </currency>
+ <currency type="KHR">
+ <displayName>柬埔寨瑞爾</displayName>
+ </currency>
+ <currency type="KMF">
+ <displayName>科摩羅法郎</displayName>
+ </currency>
+ <currency type="KPW">
+ <displayName>北æœé®®å¹£</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName>韓國圜</displayName>
+ <symbol>KRW</symbol>
+ </currency>
+ <currency type="KWD">
+ <displayName>科å¨ç‰¹ç¬¬ç´çˆ¾</displayName>
+ </currency>
+ <currency type="KYD">
+ <displayName>開曼群島美元</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName>å¡æ‰Žå…‹æ–¯å¦å¦å‰</displayName>
+ </currency>
+ <currency type="LAK">
+ <displayName>è€æ’¾ é–‹æ™®</displayName>
+ </currency>
+ <currency type="LBP">
+ <displayName>黎巴嫩鎊</displayName>
+ </currency>
+ <currency type="LKR">
+ <displayName>斯里蘭å¡ç›§å¸ƒ</displayName>
+ </currency>
+ <currency type="LRD">
+ <displayName>賴比瑞亞元</displayName>
+ </currency>
+ <currency type="LSL">
+ <displayName>賴索托羅蒂</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName>立陶宛里塔</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName>立陶宛特羅</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName>盧森堡法郎</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName>拉脫維亞拉特銀幣</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName>拉脫維亞盧布</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName>利比亞第ç´çˆ¾</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName>æ‘©æœé›²åˆ—伊</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName>馬é”加斯加艾瑞爾</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName>馬é”加斯加法郎</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName>馬其頓第ç´çˆ¾</displayName>
+ </currency>
+ <currency type="MLF">
+ <displayName>馬里法郎</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName>緬甸元</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName>è’™å¤åœ–格里克</displayName>
+ </currency>
+ <currency type="MOP">
+ <displayName>澳門元</displayName>
+ <symbol>MOP</symbol>
+ </currency>
+ <currency type="MRO">
+ <displayName>茅利塔尼亞çƒå‰äºž</displayName>
+ </currency>
+ <currency type="MTL">
+ <displayName>馬爾他里拉</displayName>
+ </currency>
+ <currency type="MTP">
+ <displayName>馬爾他鎊</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName>模里西斯盧布</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName>馬爾地夫海島盧éžäºž</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName>馬拉維克瓦查</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName>墨西哥 - 披索</displayName>
+ </currency>
+ <currency type="MXP">
+ <displayName>墨西哥銀披索 (1861-1992)</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName>墨西哥法律å轉(UDI)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName>馬來西亞 - æž—å‰ç‰¹</displayName>
+ </currency>
+ <currency type="MZE">
+ <displayName>莫桑比克埃斯庫多</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName>莫三比克梅蒂å¡çˆ¾</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName>ç´ç±³æ¯”亞元</displayName>
+ </currency>
+ <currency type="NGN">
+ <displayName>奈åŠåˆ©äºžå¥ˆæ‹‰</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName>尼加拉瓜 金哥多è¯</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName>è·è˜­ç›¾</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName>挪å¨å…‹ç¾…ç´</displayName>
+ </currency>
+ <currency type="NPR">
+ <displayName>尼泊爾盧布</displayName>
+ </currency>
+ <currency type="NZD">
+ <displayName>ç´è¥¿è˜­å¹£</displayName>
+ <symbol>$NZ</symbol>
+ </currency>
+ <currency type="OMR">
+ <displayName>阿曼里奧</displayName>
+ </currency>
+ <currency type="PAB">
+ <displayName>巴拿馬巴波亞</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName>祕魯因蒂</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName>秘魯新太陽幣</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName>秘魯太陽幣</displayName>
+ </currency>
+ <currency type="PGK">
+ <displayName>巴布亞ç´å¹¾å…§äºžåŸºé‚£</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName>è²å¾‹è³“披索</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName>巴基斯å¦ç›§å¸ƒ</displayName>
+ </currency>
+ <currency type="PLN">
+ <displayName>波蘭茲羅æ</displayName>
+ </currency>
+ <currency type="PLZ">
+ <displayName>波蘭茲羅æ (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName>è‘¡è„牙埃斯庫多</displayName>
+ </currency>
+ <currency type="PYG">
+ <displayName>巴拉圭瓜拉尼</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName>å¡é”爾里亞爾</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName>羅馬尼亞列伊</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName>俄羅斯盧布</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName>俄羅斯盧布 (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName>盧安é”法郎</displayName>
+ </currency>
+ <currency type="SAR">
+ <displayName>æ²™çƒåœ°é‡Œé›…</displayName>
+ </currency>
+ <currency type="SBD">
+ <displayName>索羅門群島元</displayName>
+ </currency>
+ <currency type="SCR">
+ <displayName>塞舌爾群島盧布</displayName>
+ </currency>
+ <currency type="SDD">
+ <displayName>蘇丹第ç´çˆ¾</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName>蘇丹鎊</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName>瑞典克羅ç´</displayName>
+ </currency>
+ <currency type="SGD">
+ <displayName>新加å¡å¹£</displayName>
+ <symbol>SGD</symbol>
+ </currency>
+ <currency type="SHP">
+ <displayName>è–赫勒拿 鎊</displayName>
+ </currency>
+ <currency type="SIT">
+ <displayName>斯洛維尼亞托勒</displayName>
+ </currency>
+ <currency type="SKK">
+ <displayName>斯洛ä¼å…‹å…‹æœ—</displayName>
+ </currency>
+ <currency type="SLL">
+ <displayName>ç…å­å±±åˆ©æ˜‚</displayName>
+ </currency>
+ <currency type="SOS">
+ <displayName>索馬利亞先令</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName>蘇里å—盾</displayName>
+ </currency>
+ <currency type="STD">
+ <displayName>è–多美島和普林西比島多布拉</displayName>
+ </currency>
+ <currency type="SUR">
+ <displayName>蘇è¯ç›§å¸ƒ</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName>愛爾 薩爾瓦多科郎</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName>敘利亞鎊</displayName>
+ </currency>
+ <currency type="SZL">
+ <displayName>æ–¯å¨å£«è˜­ 里郎</displayName>
+ </currency>
+ <currency type="THB">
+ <displayName>泰銖</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName>å¡”å‰å…‹æ–¯å¦ç›§å¸ƒ</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName>å¡”å‰å…‹æ–¯å¦ 索莫尼</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName>土庫曼馬ç´ç‰¹</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName>çªå°¼è¥¿äºžç¬¬ç´çˆ¾</displayName>
+ </currency>
+ <currency type="TOP">
+ <displayName>æ±åŠ æ½˜åŠ </displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName>å¸æ±¶ 埃斯庫多</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName>åƒé‡Œé”åŠæ‰˜å·´å“¥r</displayName>
+ </currency>
+ <currency type="TWD">
+ <displayName>新臺幣</displayName>
+ </currency>
+ <currency type="TZS">
+ <displayName>å¦æ¡‘尼亞 先令</displayName>
+ </currency>
+ <currency type="UAH">
+ <displayName>çƒå…‹è˜­æ ¼é‡Œå¤«é‚£</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName>çƒå…‹è˜­ å¡æœ¬ç“¦é‚£èŒ²</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName>çƒå¹²é”先令 (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName>çƒå¹²é”先令</displayName>
+ </currency>
+ <currency type="USN">
+ <displayName>美元 (第二天)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName>çƒæ‹‰åœ­æŠ«ç´¢ (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName>çƒæ‹‰åœ­æŠ«ç´¢</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName>çƒèŒ²åˆ¥å…‹æ–¯å¦ 薩木</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName>委內瑞拉åšåˆ©ç“¦</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName>è¬é‚£æœè¬æœ</displayName>
+ </currency>
+ <currency type="WST">
+ <displayName>西薩摩亞塔拉</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName>è¥¿éž æ³•éƒŽ BEAC</displayName>
+ </currency>
+ <currency type="XAU">
+ <displayName>黃金</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName>æ­æ´²ç¶œåˆå–®ä½</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName>æ­æ´²è²¨å¹£å–®ä½ XBB</displayName>
+ </currency>
+ <currency type="XBC">
+ <displayName>æ­æ´²æœƒè¨ˆå–®ä½(XBC)</displayName>
+ </currency>
+ <currency type="XBD">
+ <displayName>æ­æ´²æœƒè¨ˆå–®ä½(XBD)</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName>格瑞那é”å…ƒ</displayName>
+ </currency>
+ <currency type="XDR">
+ <displayName>特殊æ款權</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName>æ­æ´²è²¨å¹£å–®ä½ XEU</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName>法國金法郎</displayName>
+ </currency>
+ <currency type="XFU">
+ <displayName>法國 UIC 法郎</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName>è¥¿éž æ³•éƒŽ BCEAO</displayName>
+ </currency>
+ <currency type="XPF">
+ <displayName>CFP 法郎</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName>葉門第ç´çˆ¾</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName>也門里亞爾</displayName>
+ </currency>
+ <currency type="YUD">
+ <displayName>å—斯拉夫第ç´çˆ¾ç¡¬å¹£</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName>å—斯拉夫挪å¨äºžç¬¬ç´çˆ¾</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName>å—斯拉夫 å¯è½‰æ›ç¬¬ç´çˆ¾</displayName>
+ </currency>
+ <currency type="ZAL">
+ <displayName>å—éž - 蘭特 (金èž)</displayName>
+ </currency>
+ <currency type="ZAR">
+ <displayName>å—éžè˜­ç‰¹</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName>尚比亞克瓦查</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName>薩伊扎新伊爾</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName>扎伊爾扎伊爾</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName>辛巴å¨å…ƒ</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <posix>
+ <messages>
+ <yesstr draft="unconfirmed">確定</yesstr>
+ </messages>
+ </posix>
+ <references>
+ <reference type="RP1">Germanic(Other) =&gt; Should be 日耳曼文(其他)</reference>
+ <reference type="RP2">Chinese (Traditional Han)/Scripts/Simplified Han, please use &quot;簡體中文&quot; since it is traditional Chinese and none of the currect choice is correct.</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/zh_Hant_HK.xml b/libs/Zend/Locale/Data/zh_Hant_HK.xml
new file mode 100755
index 0000000000..6f12a8f6b2
--- /dev/null
+++ b/libs/Zend/Locale/Data/zh_Hant_HK.xml
@@ -0,0 +1,427 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.40 $"/>
+ <generation date="$Date: 2006/07/11 19:27:38 $"/>
+ <language type="zh"/>
+ <script type="Hant"/>
+ <territory type="HK"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ain" draft="provisional">愛奴文</language>
+ <language type="alt" draft="provisional">å—阿爾泰文</language>
+ <language type="awa" draft="provisional">阿瓦文</language>
+ <language type="cv" draft="provisional">楚瓦士文</language>
+ <language type="dum" draft="provisional">中å¤è·è˜­æ–‡</language>
+ <language type="egy" draft="provisional">å¤åŸƒåŠæ–‡</language>
+ <language type="fil" draft="provisional">è²å¾‹è³“æ–‡</language>
+ <language type="gem" draft="provisional">日耳曼文(其他)</language>
+ <language type="grb" draft="provisional">å“¥åšæ–‡</language>
+ <language type="mga" draft="provisional">中å¤æ„›çˆ¾è˜­æ–‡ï¼ˆ900-1200)</language>
+ <language type="nds" draft="provisional">低地日爾曼文;低地薩克éœæ–‡</language>
+ <language type="nwc" draft="provisional">å¤å°¼ç“¦çˆ¾æ–‡</language>
+ <language type="oc" draft="provisional">奧克西å¦æ–‡ï¼ˆ1500 後);普羅旺斯文</language>
+ <language type="pro" draft="provisional">å¤æ™®ç¾…旺斯文</language>
+ <language type="scn" draft="provisional">西西里文</language>
+ <language type="sco" draft="provisional">蘇格蘭文</language>
+ <language type="srn" draft="provisional">蘇拉å—æ±å¢Žæ–‡</language>
+ <language type="tlh" draft="provisional">克林貢文</language>
+ </languages>
+ <scripts>
+ <script type="Bali" draft="provisional">峇里文</script>
+ <script type="Batk" draft="provisional">巴塔克文</script>
+ <script type="Blis" draft="provisional">布列斯文</script>
+ <script type="Brah" draft="provisional">婆羅米文</script>
+ <script type="Bugi" draft="provisional">布å‰æ–¯æ–‡</script>
+ <script type="Buhd" draft="provisional">布希德文</script>
+ <script type="Cham" draft="provisional">å æ–‡</script>
+ <script type="Cirt" draft="provisional">色斯文</script>
+ <script type="Cyrs" draft="provisional">西里爾文(å¤æ•™æœƒæ–¯æ‹‰å¤«æ–‡è®Šé«”)</script>
+ <script type="Egyd" draft="provisional">å¤åŸƒåŠä¸–ä¿—é«”</script>
+ <script type="Egyh" draft="provisional">å¤åŸƒåŠåƒ§ä¾¶é«”</script>
+ <script type="Egyp" draft="provisional">å¤åŸƒåŠè±¡å½¢æ–‡å­—</script>
+ <script type="Glag" draft="provisional">格拉哥里文</script>
+ <script type="Gujr" draft="provisional">å¤å‰æ‹‰ç‰¹æ–‡</script>
+ <script type="Hmng" draft="provisional">楊æ¾éŒ„è‹—æ–‡</script>
+ <script type="Hrkt" draft="provisional">片å‡å或平å‡å</script>
+ <script type="Hung" draft="provisional">å¤åŒˆç‰™åˆ©æ–‡</script>
+ <script type="Inds" draft="provisional">å°åº¦æ²³æµåŸŸï¼ˆå“ˆæ‹‰å¸•æ–‡ï¼‰</script>
+ <script type="Java" draft="provisional">爪哇文</script>
+ <script type="Kali" draft="provisional">克耶æŽæ–‡</script>
+ <script type="Khar" draft="provisional">å¡ç¾…é ˆææ–‡</script>
+ <script type="Latf" draft="provisional">拉ä¸æ–‡ï¼ˆå°–角體活字變體)</script>
+ <script type="Latg" draft="provisional">拉ä¸æ–‡ï¼ˆè“‹çˆ¾èªžè®Šé«”)</script>
+ <script type="Lepc" draft="provisional">雷布查文(榮)</script>
+ <script type="Lina" draft="provisional">線性文字 A</script>
+ <script type="Linb" draft="provisional">線性文字 B</script>
+ <script type="Mand" draft="provisional">曼安底文</script>
+ <script type="Maya" draft="provisional">瑪雅象形文字</script>
+ <script type="Mero" draft="provisional">麥羅埃文</script>
+ <script type="Orkh" draft="provisional">鄂爾渾文</script>
+ <script type="Perm" draft="provisional">å¤å½¼çˆ¾å§†è«¸æ–‡</script>
+ <script type="Phag" draft="provisional">å…«æ€å·´æ–‡</script>
+ <script type="Phnx" draft="provisional">腓尼基文</script>
+ <script type="Plrd" draft="provisional">æŸæ ¼ç†æ‹¼éŸ³ç¬¦</script>
+ <script type="Roro" draft="provisional">朗格朗格象形文</script>
+ <script type="Sara" draft="provisional">沙拉堤文</script>
+ <script type="Sylo" draft="provisional">希洛弟ç´æ ¼é‡Œæ–‡</script>
+ <script type="Syre" draft="provisional">敘利亞文(ç¦éŸ³é«”文字變體)</script>
+ <script type="Syrj" draft="provisional">敘利亞文(西方文字變體)</script>
+ <script type="Syrn" draft="provisional">敘利亞文(æ±æ–¹æ–‡å­—變體)</script>
+ <script type="Tale" draft="provisional">泰樂文</script>
+ <script type="Talu" draft="provisional">æ–°å½æ—æ–‡</script>
+ <script type="Teng" draft="provisional">談格瓦文</script>
+ <script type="Tfng" draft="provisional">æéžç´ï¼ˆæŸæŸçˆ¾æ–‡ï¼‰</script>
+ <script type="Visp" draft="provisional">視覺語音文</script>
+ <script type="Xpeo" draft="provisional">å¤æ³¢æ–¯æ–‡</script>
+ <script type="Xsux" draft="provisional">蘇米魯亞甲文楔形文字</script>
+ <script type="Zxxx" draft="provisional">éžæ›¸å¯«èªžè¨€ç¢¼</script>
+ <script type="Zyyy" draft="provisional">一般文字</script>
+ <script type="Zzzz" draft="provisional">未編碼工åºæŒ‡ä»¤ç¢¼</script>
+ </scripts>
+ <territories>
+ <territory type="143" draft="provisional">中亞</territory>
+ <territory type="172" draft="provisional">ç¨ç«‹åœ‹å®¶åœ‹å”</territory>
+ <territory type="419" draft="provisional">拉ä¸ç¾Žæ´²å’ŒåŠ å‹’比海</territory>
+ <territory type="MO">澳門特別行政å€</territory>
+ <territory type="MO" alt="proposed-u29-1" draft="provisional">中è¯äººæ°‘共和國澳門特別行政å€</territory>
+ </territories>
+ <types>
+ <type type="stroke" key="collation" draft="provisional">筆劃順åº</type>
+ </types>
+ </localeDisplayNames>
+ <delimiters>
+ <quotationStart>「</quotationStart>
+ <quotationEnd>ã€</quotationEnd>
+ <alternateQuotationStart>『</alternateQuotationStart>
+ <alternateQuotationEnd>ã€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">1月</month>
+ <month type="2">2月</month>
+ <month type="3">3月</month>
+ <month type="4">4月</month>
+ <month type="5">5月</month>
+ <month type="6">6月</month>
+ <month type="7">7月</month>
+ <month type="8">8月</month>
+ <month type="9">9月</month>
+ <month type="10">10月</month>
+ <month type="11">11月</month>
+ <month type="12">12月</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern references="R1">yyyy'年'M'月'd'日' EEEE</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern references="R1">yyyy'年'M'月'd'日'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy'年'M'月'd'日'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yy'年'M'月'd'日'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>ahh:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>ah:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Australia/Currie">
+ <exemplarCity draft="provisional">居里</exemplarCity>
+ </zone>
+ <zone type="America/Coral_Harbour">
+ <exemplarCity draft="provisional">çŠç‘šæ¸¯</exemplarCity>
+ </zone>
+ <zone type="America/Moncton">
+ <exemplarCity draft="provisional">曼克頓</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <daylight draft="provisional">大西洋å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <daylight draft="provisional">ç´èŠ¬è˜­å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <daylight draft="provisional">中國å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <daylight draft="provisional">中æ­å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <daylight draft="provisional">以色列å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <daylight draft="provisional">日本å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <daylight draft="provisional">格林å¨æ²»å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <daylight draft="provisional">æ±æ­å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <daylight draft="provisional">å¤å¨å¤·å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <daylight draft="provisional">阿拉斯加å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <daylight draft="provisional">太平洋å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <daylight draft="provisional">中部å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/Indiana/Vincennes">
+ <exemplarCity draft="provisional">溫森斯</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Petersburg">
+ <exemplarCity draft="provisional">彼得堡</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <long>
+ <daylight draft="provisional">æ±éƒ¨å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/Louisville">
+ <exemplarCity draft="provisional">路易斯維爾</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <daylight draft="provisional">æ±éƒ¨å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ANG">
+ <displayName draft="provisional">è·è˜­å®‰æ¢¯è˜­ç›¾</displayName>
+ </currency>
+ <currency type="BEC">
+ <displayName draft="provisional">比利時法郎(å¯è½‰æ›ï¼‰</displayName>
+ </currency>
+ <currency type="BEL">
+ <displayName draft="provisional">比利時法郎(金èžï¼‰</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName draft="provisional">玻利維亞幕多</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName draft="provisional">巴西克魯薩多農瓦(1967-1986)</displayName>
+ </currency>
+ <currency type="BRN">
+ <displayName draft="provisional">巴西克如爾é”農瓦</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName draft="provisional">æ±å¾·å¥§æ–¯ç‰¹é¦¬å…‹</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName draft="provisional">喬治庫æ—拉里</displayName>
+ </currency>
+ <currency type="LAK">
+ <displayName draft="provisional">è€æ’¾é–‹æ™®</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName draft="provisional">尼加拉瓜金哥多è¯</displayName>
+ </currency>
+ <currency type="SHP">
+ <displayName draft="provisional">è–赫勒拿鎊</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName draft="provisional">愛爾薩爾瓦多科郎</displayName>
+ </currency>
+ <currency type="SZL">
+ <displayName draft="provisional">æ–¯å¨å£«è˜­é‡ŒéƒŽ</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName draft="provisional">å¡”å‰å…‹æ–¯å¦ç´¢èŽ«å°¼</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName draft="provisional">å¸æ±¶åŸƒæ–¯åº«å¤š</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName draft="provisional">åƒé‡Œé”åŠæ‰˜å·´å“¥å…ƒ</displayName>
+ </currency>
+ <currency type="TZS">
+ <displayName draft="provisional">å¦æ¡‘尼亞先令</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName draft="provisional">çƒå…‹è˜­å¡æœ¬ç“¦é‚£èŒ²</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName draft="provisional">çƒèŒ²åˆ¥å…‹æ–¯å¦è–©æœ¨</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName draft="provisional">西éžæ³•éƒŽ BEAC</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName draft="provisional">西éžæ³•éƒŽ BCEAO</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName draft="provisional">å—斯拉夫å¯è½‰æ›ç¬¬ç´çˆ¾</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1">The simplifed Chinese should be changed to the Traditional Chinese.</reference>
+ <reference type="RP10" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Central Daylight Time(change from “中部日光節約時間†to “中部å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP11" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Mountain Daylight Time(change from “山å€æ—¥å…‰ç¯€ç´„時間†to “山å€å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP12" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Atlantic Daylight Time(change from “大西洋日光節約時間†to “大西洋å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP13" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Indianapolis&amp;btnG=%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">Timezones: Indianapolis (Indianapolis is a new word, change from “Indianapolis†to “å°ç¬¬å®‰é‚£æ³¢é‡Œæ–¯â€)</reference>
+ <reference type="RP14" uri="http://www.apecgender.org/Page_Show.asp?Page_ID=177">Timezones: Petersburg (Petersburg is a new word, change from “Petersburg†to “彼得堡â€)</reference>
+ <reference type="RP15" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: America/Indianapolis/long/daylight (change from “æ±éƒ¨æ¨™æº–時間†to “æ±éƒ¨å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP16" uri="http://www.google.com/search?hl=zh-TW&amp;q=Louisville&amp;btnG=Google+%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">Timezones: Louisville (Louisville is a new word, change from “Louisville†to “路易斯維爾â€)</reference>
+ <reference type="RP17" uri="http://www.zftrans.com/favorite/vocabulary/20050707/185716-83.htm">Timezones: Coral Harbour (Coral Harbour is a new word, change from “Coral Harbour†to “çŠç‘šæ¸¯â€).</reference>
+ <reference type="RP18" uri="http://www.google.com/search?q=Vincennes&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Timezones: Vincennes (Louisville is a new word, change from “Vincennes†to “溫森斯â€).</reference>
+ <reference type="RP19" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Pacific Daylight Time(change from “太平洋日光節約時間†to “太平洋å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP2" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Southern+Africa&amp;btnG=%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">Territories: Southern Africa (change from “å—éžâ€ to “éžæ´²å—部â€)</reference>
+ <reference type="RP20" uri="//www.google.com/search?q=Moncton&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Timezones: Moncton(This is a new word, change from “Moncton†to “曼克頓â€)</reference>
+ <reference type="RP21" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Eastern Daylight Time(change from “æ±éƒ¨æ—¥å…‰ç¯€ç´„時間†to “æ±éƒ¨å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP22" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: America/Phoenix/long/daylight(change from “山å€æ¨™æº–時間†to “山å€å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP23" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Newfoundland Daylight Time(change from “纽芬蘭日光節約時間†to “纽芬蘭å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP24" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Israel Daylight Time(change from “以色列日光節約時間†to “以色列å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP25" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Hawaii Daylight Time(change from “å¤å¨å¤·æ¨™æº–時間†to “å¤å¨å¤·å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP26" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Central European Daylight Time (change from “中æ­æ—¥å…‰ç¯€ç´„時間†to “中æ­å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP27">Currencies: Trinidad and Tobago Dollar (change from &amp;quot;åƒé‡Œé”åŠæ‰˜å·´å“¥r&amp;quot; to &amp;quot;åƒé‡Œé”åŠæ‰˜å·´å“¥&amp;quot;)</reference>
+ <reference type="RP28" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Eastern European Daylight Time(change from “æ±æ­æ—¥å…‰ç¯€ç´„時間†to “æ±æ­å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP29" uri="http://www.google.com/search?q=Currie&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=50&amp;sa=N">Timezones: Currie(This is a new word, change from “Currie†to “居里â€)</reference>
+ <reference type="RP3" uri="http://www.google.com/search?q=Central+Asia&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=270&amp;sa=N">Territories: Central Asia (change from “143†to “中亞â€)</reference>
+ <reference type="RP30" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Hk Timezones: Japan Daylight Time(change from “日本標準時間†to “日本å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP31" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: China Daylight Time(change from “中國標準時間†to “中國å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP32">Timezones: America/New_York/long/standard Eastern Daylight Time ( “æ±éƒ¨æ¨™æº–時間†is right, please ignore “æ±éƒ¨å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP33">Currencies: Trinidad and Tobago Dollar (change from &amp;quot;åƒé‡Œé”åŠæ‰˜å·´å“¥r&amp;quot; to &amp;quot;åƒé‡Œé”åŠæ‰˜å·´å“¥å…ƒ&amp;quot;)</reference>
+ <reference type="RP34">Currencies: CFA Franc BEAC (change from &amp;quot;è¥¿éž æ³•éƒŽ BEAC&amp;quot; to &amp;quot;西éžæ³•éƒŽBEAC&amp;quot;)</reference>
+ <reference type="RP35">Currencies: CFA Franc BCEAO (change from &amp;quot;è¥¿éž æ³•éƒŽ BCEAO&amp;quot; to &amp;quot;西éžæ³•éƒŽ BCEAO&amp;quot;)</reference>
+ <reference type="RP36">Currencies: CFA Franc BEAC (change from &amp;quot;è¥¿éž æ³•éƒŽ BEAC&amp;quot; to &amp;quot;西éžæ³•éƒŽ BEAC&amp;quot;)</reference>
+ <reference type="RP37">Currencies: Netherlands Antillan Guilder (change from &amp;quot;è·è˜­ 安梯蘭 盾&amp;quot; to &amp;quot;è·è˜­å®‰æ¢¯è˜­ç›¾&amp;quot;)</reference>
+ <reference type="RP38">Currencies: Brazilian Cruzeiro Novo (1967-1986) (change from &amp;quot;巴西克魯薩多 農瓦 (1967-1986)&amp;quot; to &amp;quot;巴西克魯薩多農瓦 (1967-1986)&amp;quot;)</reference>
+ <reference type="RP39">Currencies: Brazilian Cruzado Novo (change from &amp;quot;巴西 å…‹å¦‚çˆ¾é” è¾²ç“¦&amp;quot; to &amp;quot;巴西克如爾é”農瓦&amp;quot;)</reference>
+ <reference type="RP4" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Latin+America+and+the+Caribbean&amp;btnG=%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">Territories: Latin America and the Caribbean (change from “419†to “拉ä¸ç¾Žæ´²å’ŒåŠ å‹’比海â€)</reference>
+ <reference type="RP40">Currencies: Bolivian Mvdol (change from &amp;quot;玻利維亞 幕多&amp;quot; to &amp;quot;玻利維亞幕多&amp;quot;)</reference>
+ <reference type="RP41" draft="provisional">Currencies: East German Ostmark (change from &amp;quot;æ±å¾·æ±å¾·é¦¬å…‹&amp;quot; to &amp;quot;æ±å¾·å¥§æ–¯ç‰¹é¦¬å…‹&amp;quot;)</reference>
+ <reference type="RP42">Currencies: Georgian Kupon Larit (change from &amp;quot;喬治 åº«æ— æ‹‰é‡Œ&amp;quot; to &amp;quot;喬治庫æ—拉里&amp;quot;)</reference>
+ <reference type="RP43">Currencies: Laotian Kip (change from &amp;quot;è€æ’¾ é–‹æ™®&amp;quot; to &amp;quot;è€æ’¾é–‹æ™®&amp;quot;)</reference>
+ <reference type="RP44">Currencies: Nicaraguan Cordoba Oro (change from &amp;quot;尼加拉瓜 金哥多è¯&amp;quot; to &amp;quot;尼加拉瓜金哥多è¯&amp;quot;)</reference>
+ <reference type="RP45">Currencies: Saint Helena Pound (change from &amp;quot;è–赫勒拿 鎊&amp;quot; to &amp;quot;è–赫勒拿鎊&amp;quot;)</reference>
+ <reference type="RP46">Currencies: El Salvador Colon (change from &amp;quot;愛爾 薩爾瓦多科郎&amp;quot; to &amp;quot;愛爾薩爾瓦多科郎&amp;quot;)</reference>
+ <reference type="RP47">Currencies: Swaziland Lilangeni (change from &amp;quot;æ–¯å¨å£«è˜­ 里郎&amp;quot; to &amp;quot;æ–¯å¨å£«è˜­é‡ŒéƒŽ&amp;quot;)</reference>
+ <reference type="RP48">Currencies: Tajikistan Somoni (change from &amp;quot;å¡”å‰å…‹æ–¯å¦ 索莫尼&amp;quot; to &amp;quot;å¡”å‰å…‹æ–¯å¦ç´¢èŽ«å°¼&amp;quot;)</reference>
+ <reference type="RP49">Currencies: Timor Escudo (change from &amp;quot;å¸æ±¶ 埃斯庫多&amp;quot; to &amp;quot;å¸æ±¶åŸƒæ–¯åº«å¤š&amp;quot;)</reference>
+ <reference type="RP5" uri="http://www.google.com/search?q=Commonwealth+of+Independent+States&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Territories: Commonwealth of Independent States (change from “172†to “ç¨ç«‹åœ‹å®¶åœ‹å”â€)</reference>
+ <reference type="RP50" uri="http://www.worldlanguage.com/ChineseTraditional/Languages/Altai.htm">Language: Southern Altai (change from “alt†to “å—阿爾泰語â€)</reference>
+ <reference type="RP51">Currencies: Tanzanian Shilling (change from &amp;quot;å¦æ¡‘尼亞 先令&amp;quot; to &amp;quot;å¦æ¡‘尼亞先令&amp;quot;)</reference>
+ <reference type="RP52">Currencies: Ukrainian Karbovanetz (change from &amp;quot;çƒå…‹è˜­ å¡æœ¬ç“¦é‚£èŒ²&amp;quot; to &amp;quot;çƒå…‹è˜­å¡æœ¬ç“¦é‚£èŒ²&amp;quot;)</reference>
+ <reference type="RP53">Currencies: Uzbekistan Sum (change from &amp;quot;çƒèŒ²åˆ¥å…‹æ–¯å¦ 薩木&amp;quot; to &amp;quot;çƒèŒ²åˆ¥å…‹æ–¯å¦è–©æœ¨&amp;quot;)</reference>
+ <reference type="RP54">Currencies: Yugoslavian Convertible Dinar (change from &amp;quot;å—斯拉夫 å¯è½‰æ›ç¬¬ç´çˆ¾&amp;quot; to &amp;quot;å—斯拉夫å¯è½‰æ›ç¬¬ç´çˆ¾&amp;quot;)</reference>
+ <reference type="RP55" uri="http://www.google.com/search?q=Dutch&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=20&amp;sa=N">Language: Middle Dutch (change from “è·è˜­ï¼Œä¸­å¤ (ca. 1050-1350)†to “中å¤è·è˜­æ–‡â€)</reference>
+ <reference type="RP56" uri="http://www.google.com/search?q=Filipino&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=40&amp;sa=N">Language: Filipino (change from “fil†to “è²å¾‹è³“æ–‡â€)</reference>
+ <reference type="RP57" uri="http://www.google.com/search?q=Germanic+(Other)&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=60&amp;sa=N">Language: Germanic (Other) (change from “德國的(其他)†to “日耳曼文(其它)â€)</reference>
+ <reference type="RP58" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Mirandese&amp;btnG=æœå°‹&amp;lr=lang_zh-TW"> Language: Mirandese (change from “mwl†to “米蘭德斯文â€)</reference>
+ <reference type="RP59" uri="http://www.google.com/search?hl=zh-TW&amp;q=Classical+Newari+&amp;btnG=Google+æœå°‹&amp;lr=lang_zh-TW">Language: Classical Newari (change from “ nwc †to “ å¤å°¼ç“¦çˆ¾æ–‡ â€)</reference>
+ <reference type="RP6" uri="http://www.google.com/search?q=Macao+S.A.R.,+China&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Territories: Macao S.A.R., China(change from “澳門特別行政å€â€to “中è¯äººæ°‘共和國澳門特別行政å€â€)</reference>
+ <reference type="RP60" uri="http://wordpedia.britannica.com/concise/content.aspx?id=7841&amp;hash=PF16q%2BQ%2FWdoVa2%2Bve%2B%2FS%2Bg%3D%3D">Language: Old Provençal (change from “普羅文斯文 (to 1500)†to “å¤æ™®ç¾…旺斯文â€)</reference>
+ <reference type="RP61" uri="http://www.google.com/search?q=Sicilian+%E6%96%87&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;ie=UTF-8&amp;inlang=zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Language: Sicilian (change from “scn†to “西西里文â€)</reference>
+ <reference type="RP62" uri="http://140.111.34.46/cgi-bin/jdict/loadpage.cgi?file=gm/12-6-27.html&amp;word=%E8%98%87%E5%88%A9%E5%8D%97%E5%85%B1%E5%92%8C%E5%9C%8B">Language: Sranan Tongo (change from “srn†to “蘇拉å—æ±å¢Žæ–‡â€)</reference>
+ <reference type="RP63" uri="http://www.google.com/search?q=Klingon+%E6%96%87&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;ie=UTF-8&amp;inlang=zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Language: Klingon (change from “tlh†to “克林貢文â€)</reference>
+ <reference type="RP64" uri="http://www.google.com/search?q=Haitian&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=0&amp;sa=N">Language: Haitian (change from “海地人†to “海地文â€)</reference>
+ <reference type="RP65" uri="http://www.tattpe.org.tw/news_20051114-2.shtml">Script: New Tai Lue (It's a new term)</reference>
+ <reference type="RP66" uri="http://www.google.com/search?q=Chuvash&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Language: Chuvash (change from “楚瓦甚文†to “楚瓦士文â€)</reference>
+ <reference type="RP67" uri="http://www.fantasyweb.idv.tw/yilu/gallery/Spec/Tolkien_fonts/index.htm">Script: Tengwar (It's a new term)</reference>
+ <reference type="RP68" uri="http://wiki.foreprinciple.org/mediawiki-1.3.8/index.php?title=%E6%8F%90%E9%9D%9E%E7%B4%8D%E6%96%87">Script: Tifinagh (Berber) (It's a new term)</reference>
+ <reference type="RP69" uri="RP39 http://blog.yam.com/festival/archives/1044108.html">Script: Bali (It's a new term)</reference>
+ <reference type="RP7">types: Stroke Order (change &amp;quot;筆劃顺åº&amp;quot; to &amp;quot;筆劃順åº&amp;quot;)</reference>
+ <reference type="RP70" uri="http://www.taiwanus.us/MediaVideoAudio/books/history/b5/03.htm">Script: Batak (It's a new term)</reference>
+ <reference type="RP71" uri="http://www.ntctc.edu.tw/spc/ebook/pdf/9003/1.pdf">Script: Blissymbols (It's a new term)</reference>
+ <reference type="RP72" uri="http://tw.britannica.com/MiniSite/Article/id00005994.html">Script: Brahmi (It's a new term)</reference>
+ <reference type="RP73" uri="http://www.unicode.org/cldr/data/common/main/zh_Hant.xml">Script: Buginese (It's a new term)</reference>
+ <reference type="RP74" uri="http://www.worldlanguage.com/ChineseTraditional/Languages/Cham.htm">Script: Cham (It's a new term)</reference>
+ <reference type="RP75" uri="http://www.gamez.com.tw/printthread.php?t=17770&amp;pp=40">Script: Cirth (It's a new term)</reference>
+ <reference type="RP76" uri="http://wordpedia.britannica.com/concise/content.aspx?id=570&amp;hash=vsW50K8BiqKfMw5LJ8gJmA%3D%3D&amp;t=3">Script: Cyrillic (Old Church Slavonic variant) (It's a new term)</reference>
+ <reference type="RP77" uri="http://egyptwords.blogspot.com/">Script: Egyptian demotic (It's a new term)</reference>
+ <reference type="RP78">Currencies: Belgian Franc (financial) (change from &amp;quot;比利時法郎 (金èžï¼‰&amp;quot; to &amp;quot;比利時法郎(金èžï¼‰&amp;quot;)</reference>
+ <reference type="RP79" uri="http://egyptwords.blogspot.com/">Script: Egyptian hieratic (It's a new term)</reference>
+ <reference type="RP8" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Africa/Casablanca/long/daylight (change from “格林å¨æ²»æ¨™æº–時間†to “格林å¨æ²»å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP80">Currencies: Belgian Franc (convertible) (change from &amp;quot;比利時法郎 (å¯è½‰æ›ï¼‰&amp;quot; to &amp;quot;比利時法郎(å¯è½‰æ›ï¼‰&amp;quot;)</reference>
+ <reference type="RP81" uri="http://egyptwords.blogspot.com/"> Script: Egyptian hieroglyphs (It's a new term)</reference>
+ <reference type="RP82" uri="http://203.64.158.220/ebintra/Content.asp?ContentID=16907">Script: Glagolitic (It's a new term)</reference>
+ <reference type="RP83" uri="http://www.e-safety.com.tw/1_main/103_learning/1037_news/ENS48/pdf/C6.pdf">Script: Gujarati (It's a new term)</reference>
+ <reference type="RP84" uri="http://homework.wtuc.edu.tw/~wenlurg/forghis/0323-10.htm">Script: Indus (Harappan) (It's a new term)</reference>
+ <reference type="RP85" uri="http://leoboard.cpatch.org/cgi-bin/topic.cgi?forum=4&amp;topic=164">Script: Javanese (It's a new term)</reference>
+ <reference type="RP86" uri="http://www.ncn.org/asp/zwgInfo/bg_Da.asp?ID=67438%20&amp;ad=1/2/2006">Script: Kayah Li (It's a new term)</reference>
+ <reference type="RP87" uri="http://webtitle.nmh.gov.tw/india/page/page.php?id=103">Script: Kharoshthi (It's a new term)</reference>
+ <reference type="RP88" uri="http://140.128.159.78/yldict/word.asp?w=Fraktur">Script: Latin (Fraktur variant) (It's a new term)</reference>
+ <reference type="RP89" uri="http://hk.dictionary.yahoo.com/search.html?s=Gaelic">Script: Latin (Gaelic variant) (It's a new term)</reference>
+ <reference type="RP9" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Alaska Daylight Time(change from “阿拉斯加日光節約時間†to “阿拉斯加å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP90" uri="http://203.64.158.220/ebintra/Content.asp?ContentID=25845">Script: Lepcha (Róng) (It's a new term)</reference>
+ <reference type="RP91" uri="http://tw.britannica.com/MiniSite/Article/id00036950.htm">Script: Linear A (It's a new term)</reference>
+ <reference type="RP92" uri="http://tw.britannica.com/MiniSite/Article/id00036950.html">Script: Linear B (It's a new term)</reference>
+ <reference type="RP93" uri="http://www2.ccim.org:8088/dictionary/zhaoindex.jsp?k=Gnosticism">Script: Mandaean (It's a new term)</reference>
+ <reference type="RP94" uri="http://tw.britannica.com/MiniSite/Article/id00040761.html">Script: Meroitic (It's a new term)</reference>
+ <reference type="RP95" uri="http://www.macaoheritage.net/Trends/NewsC.asp?nid=5678">Script: Orkhon (It's a new term)</reference>
+ <reference type="RP96" uri="http://tw.britannica.com/MiniSite/Article/id00048822.html">Script: Old Permic (It's a new term)</reference>
+ <reference type="RP97" uri="http://zh.wikipedia.org/wiki/%E5%85%AB%E6%80%9D%E5%B7%B4%E5%AD%97">Script: Phags-pa (It's a new term)</reference>
+ <reference type="RP98" uri="http://tw.britannica.com/MiniSite/Article/id00049079.html">Script: Phoenician (It's a new term)</reference>
+ <reference type="RP99" uri="http://www.cc-us.org/usa/H39-5.htm">Script: Pollard Phonetic (It's a new term)</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/zh_Hant_MO.xml b/libs/Zend/Locale/Data/zh_Hant_MO.xml
new file mode 100755
index 0000000000..736da0583f
--- /dev/null
+++ b/libs/Zend/Locale/Data/zh_Hant_MO.xml
@@ -0,0 +1,426 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.36 $"/>
+ <generation date="$Date: 2006/07/11 19:27:38 $"/>
+ <language type="zh"/>
+ <script type="Hant"/>
+ <territory type="MO"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ain" draft="provisional">愛奴文</language>
+ <language type="alt" draft="provisional">å—阿爾泰文</language>
+ <language type="awa" draft="provisional">阿瓦文</language>
+ <language type="egy" draft="provisional">å¤åŸƒåŠæ–‡</language>
+ <language type="fil" draft="provisional">è²å¾‹è³“æ–‡</language>
+ <language type="gem" draft="provisional">日耳曼文(其他)</language>
+ <language type="grb" draft="provisional">å“¥åšæ–‡</language>
+ <language type="lez" draft="provisional">列茲干文</language>
+ <language type="mga" draft="provisional">中å¤æ„›çˆ¾è˜­æ–‡ï¼ˆ900-1200)</language>
+ <language type="mwl" draft="provisional">米蘭德斯文</language>
+ <language type="nds" draft="provisional">低地日爾曼文;低地薩克éœæ–‡</language>
+ <language type="nwc" draft="provisional">å¤å°¼ç“¦çˆ¾æ–‡ </language>
+ <language type="oc" draft="provisional">奧克西å¦æ–‡ï¼ˆ1500 後);普羅旺斯文</language>
+ <language type="scn" draft="provisional">西西里文</language>
+ <language type="srn" draft="provisional">蘇拉å—æ±å¢Žæ–‡</language>
+ <language type="tlh" draft="provisional">克林貢文</language>
+ </languages>
+ <scripts>
+ <script type="Bali" draft="provisional">峇里文</script>
+ <script type="Batk" draft="provisional">巴塔克文</script>
+ <script type="Blis" draft="provisional">布列斯文</script>
+ <script type="Brah" draft="provisional">婆羅米文</script>
+ <script type="Bugi" draft="provisional">布å‰æ–¯æ–‡</script>
+ <script type="Buhd" draft="provisional">布希德文</script>
+ <script type="Cham" draft="provisional">å æ–‡</script>
+ <script type="Cirt" draft="provisional">色斯文</script>
+ <script type="Cyrs" draft="provisional">西里爾文(å¤æ•™æœƒæ–¯æ‹‰å¤«æ–‡è®Šé«”)</script>
+ <script type="Egyd" draft="provisional">å¤åŸƒåŠä¸–ä¿—é«”</script>
+ <script type="Egyh" draft="provisional">å¤åŸƒåŠåƒ§ä¾¶é«”</script>
+ <script type="Egyp" draft="provisional">å¤åŸƒåŠè±¡å½¢æ–‡å­—</script>
+ <script type="Glag" draft="provisional">格拉哥里文</script>
+ <script type="Hmng" draft="provisional">楊æ¾éŒ„è‹—æ–‡</script>
+ <script type="Hrkt" draft="provisional">片å‡å或平å‡å</script>
+ <script type="Hung" draft="provisional">å¤åŒˆç‰™åˆ©æ–‡</script>
+ <script type="Inds" draft="provisional">å°åº¦æ²³æµåŸŸï¼ˆå“ˆæ‹‰å¸•æ–‡ï¼‰</script>
+ <script type="Java" draft="provisional">爪哇文</script>
+ <script type="Kali" draft="provisional">克耶æŽæ–‡</script>
+ <script type="Khar" draft="provisional">å¡ç¾…é ˆææ–‡</script>
+ <script type="Latf" draft="provisional">拉ä¸æ–‡ï¼ˆå°–角體活字變體)</script>
+ <script type="Latg" draft="provisional">拉ä¸æ–‡ï¼ˆè“‹çˆ¾èªžè®Šé«”)</script>
+ <script type="Lepc" draft="provisional">雷布查文(榮)</script>
+ <script type="Lina" draft="provisional">線性文字 A</script>
+ <script type="Linb" draft="provisional">線性文字 B</script>
+ <script type="Mand" draft="provisional">曼安底文</script>
+ <script type="Maya" draft="provisional">瑪雅象形文字</script>
+ <script type="Mero" draft="provisional">麥羅埃語</script>
+ <script type="Orkh" draft="provisional">鄂爾渾文</script>
+ <script type="Perm" draft="provisional">å¤å½¼çˆ¾å§†è«¸æ–‡</script>
+ <script type="Phag" draft="provisional">å…«æ€å·´æ–‡</script>
+ <script type="Phnx" draft="provisional">腓尼基文</script>
+ <script type="Plrd" draft="provisional">æŸæ ¼ç†æ‹¼éŸ³ç¬¦</script>
+ <script type="Roro" draft="provisional">朗格朗格象形文</script>
+ <script type="Sara" draft="provisional">沙拉堤文</script>
+ <script type="Sylo" draft="provisional">希洛弟ç´æ ¼é‡Œæ–‡</script>
+ <script type="Syre" draft="provisional">敘利亞文(ç¦éŸ³é«”文字變體)</script>
+ <script type="Syrj" draft="provisional">敘利亞文(西方文字變體)</script>
+ <script type="Syrn" draft="provisional">敘利亞文(æ±æ–¹æ–‡å­—變體)</script>
+ <script type="Tale" draft="provisional">泰樂文</script>
+ <script type="Talu" draft="provisional">æ–°å½æ—æ–‡</script>
+ <script type="Teng" draft="provisional">談格瓦文</script>
+ <script type="Tfng" draft="provisional">æéžç´ï¼ˆæŸæŸçˆ¾æ–‡ï¼‰</script>
+ <script type="Visp" draft="provisional">視覺語音文</script>
+ <script type="Xpeo" draft="provisional">å¤æ³¢æ–¯æ–‡</script>
+ <script type="Xsux" draft="provisional">蘇米魯亞甲文楔形文字</script>
+ <script type="Zxxx" draft="provisional">éžæ›¸å¯«èªžè¨€ç¢¼</script>
+ <script type="Zyyy" draft="provisional">一般文字</script>
+ <script type="Zzzz" draft="provisional">未編碼工åºæŒ‡ä»¤ç¢¼</script>
+ </scripts>
+ <territories>
+ <territory type="034" draft="provisional">å—亞</territory>
+ <territory type="143" draft="provisional">中亞</territory>
+ <territory type="172" draft="provisional">ç¨ç«‹åœ‹å®¶åœ‹å”</territory>
+ <territory type="419" draft="provisional">拉ä¸ç¾Žæ´²å’ŒåŠ å‹’比海</territory>
+ <territory type="MO">澳門特別行政å€</territory>
+ <territory type="MO" alt="proposed-u29-1" draft="provisional">中è¯äººæ°‘共和國澳門特別行政å€</territory>
+ </territories>
+ <types>
+ <type type="stroke" key="collation" draft="provisional">筆劃順åº</type>
+ </types>
+ </localeDisplayNames>
+ <delimiters>
+ <quotationStart>「</quotationStart>
+ <quotationEnd>ã€</quotationEnd>
+ <alternateQuotationStart>『</alternateQuotationStart>
+ <alternateQuotationEnd>ã€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1">1月</month>
+ <month type="2">2月</month>
+ <month type="3">3月</month>
+ <month type="4">4月</month>
+ <month type="5">5月</month>
+ <month type="6">6月</month>
+ <month type="7">7月</month>
+ <month type="8">8月</month>
+ <month type="9">9月</month>
+ <month type="10">10月</month>
+ <month type="11">11月</month>
+ <month type="12">12月</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern>yyyy'年'MM'月'dd'日' EEEE</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>yyyy'年'MM'月'dd'日'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern>yyyy'年'M'月'd'日'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>yy'年'M'月'd'日'</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern>ahh:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>ah:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Australia/Currie">
+ <exemplarCity draft="provisional">居里</exemplarCity>
+ </zone>
+ <zone type="America/Coral_Harbour">
+ <exemplarCity draft="provisional">çŠç‘šæ¸¯</exemplarCity>
+ </zone>
+ <zone type="America/Moncton">
+ <exemplarCity draft="provisional">曼克頓</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <daylight draft="provisional">大西洋å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <daylight draft="provisional">ç´èŠ¬è˜­å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <daylight draft="provisional">中國å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <daylight draft="provisional">中æ­å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <daylight draft="provisional">以色列å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <daylight draft="provisional">日本å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <daylight draft="provisional">格林å¨æ²»å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <daylight draft="provisional">æ±æ­å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <daylight draft="provisional">å¤å¨å¤·å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <daylight draft="provisional">阿拉斯加å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <daylight draft="provisional">太平洋å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <daylight draft="provisional">中部å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/Indiana/Vincennes">
+ <exemplarCity draft="provisional">溫森斯</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Petersburg">
+ <exemplarCity draft="provisional">彼得堡</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <long>
+ <daylight draft="provisional">æ±éƒ¨å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/Louisville">
+ <exemplarCity draft="provisional">路易斯維爾</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <daylight draft="provisional">æ±éƒ¨å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00;(¤#,##0.00)</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ANG">
+ <displayName draft="provisional">è·è˜­å®‰æ¢¯è˜­ç›¾</displayName>
+ </currency>
+ <currency type="BEC">
+ <displayName draft="provisional">比利時法郎(å¯è½‰æ›ï¼‰</displayName>
+ </currency>
+ <currency type="BEL">
+ <displayName draft="provisional">比利時法郎(金èžï¼‰</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName draft="provisional">玻利維亞幕多</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName draft="provisional">巴西克魯薩多農瓦(1967-1986)</displayName>
+ </currency>
+ <currency type="BRN">
+ <displayName draft="provisional">巴西克如爾é”農瓦</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName draft="provisional">æ±å¾·å¥§æ–¯ç‰¹é¦¬å…‹</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName draft="provisional">喬治庫æ—拉里</displayName>
+ </currency>
+ <currency type="LAK">
+ <displayName draft="provisional">è€æ’¾é–‹æ™®</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName draft="provisional">尼加拉瓜金哥多è¯</displayName>
+ </currency>
+ <currency type="SHP">
+ <displayName draft="provisional">è–赫勒拿鎊</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName draft="provisional">愛爾薩爾瓦多科郎</displayName>
+ </currency>
+ <currency type="SZL">
+ <displayName draft="provisional">æ–¯å¨å£«è˜­é‡ŒéƒŽ</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName draft="provisional">å¡”å‰å…‹æ–¯å¦ç´¢èŽ«å°¼</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName draft="provisional">å¸æ±¶åŸƒæ–¯åº«å¤š</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName draft="provisional">åƒé‡Œé”åŠæ‰˜å·´å“¥å…ƒ</displayName>
+ </currency>
+ <currency type="TZS">
+ <displayName draft="provisional">å¦æ¡‘尼亞先令</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName draft="provisional">çƒå…‹è˜­å¡æœ¬ç“¦é‚£èŒ²</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName draft="provisional">çƒèŒ²åˆ¥å…‹æ–¯å¦è–©æœ¨</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName draft="provisional">西éžæ³•éƒŽ BEAC</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName draft="provisional">西éžæ³•éƒŽ BCEAO</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName draft="provisional">å—斯拉夫å¯è½‰æ›ç¬¬ç´çˆ¾</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1">types: Stroke Order (change &amp;quot;筆劃顺åº&amp;quot; to &amp;quot;筆劃順åº&amp;quot;)</reference>
+ <reference type="RP10" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Central Daylight Time(change from “中部日光節約時間†to “中部å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP11" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Mountain Daylight Time(change from “山å€æ—¥å…‰ç¯€ç´„時間†to “山å€å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP12" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Atlantic Daylight Time(change from “大西洋日光節約時間†to “大西洋å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP13" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Indianapolis&amp;btnG=%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">Timezones: Indianapolis (Indianapolis is a new word, change from “Indianapolis†to “å°ç¬¬å®‰é‚£æ³¢é‡Œæ–¯â€)</reference>
+ <reference type="RP14" uri="http://www.apecgender.org/Page_Show.asp?Page_ID=177">Timezones: Petersburg (Petersburg is a new word, change from “Petersburg†to “彼得堡â€)</reference>
+ <reference type="RP15" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: America/Indianapolis/long/daylight (change from “æ±éƒ¨æ¨™æº–時間†to “æ±éƒ¨å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP16" uri="http://www.google.com/search?hl=zh-TW&amp;q=Louisville&amp;btnG=Google+%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">Timezones: Louisville (Louisville is a new word, change from “Louisville†to “路易斯維爾â€)</reference>
+ <reference type="RP17" uri="http://www.zftrans.com/favorite/vocabulary/20050707/185716-83.htm">Timezones: Coral Harbour (Coral Harbour is a new word, change from “Coral Harbour†to “çŠç‘šæ¸¯â€).</reference>
+ <reference type="RP18" uri="http://www.google.com/search?q=Vincennes&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Timezones: Vincennes (Louisville is a new word, change from “Vincennes†to “溫森斯â€).</reference>
+ <reference type="RP19" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Pacific Daylight Time(change from “太平洋日光節約時間†to “太平洋å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP2" draft="provisional">Territories: Southern Asia(change from “034†to “å—亞â€)</reference>
+ <reference type="RP20" uri="//www.google.com/search?q=Moncton&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Timezones: Moncton(This is a new word, change from “Moncton†to “曼克頓â€)</reference>
+ <reference type="RP21" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Eastern Daylight Time(change from “æ±éƒ¨æ—¥å…‰ç¯€ç´„時間†to “æ±éƒ¨å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP22" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: America/Phoenix/long/daylight(change from “山å€æ¨™æº–時間†to “山å€å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP23" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Newfoundland Daylight Time(change from “纽芬蘭日光節約時間†to “纽芬蘭å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP24" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Israel Daylight Time(change from “以色列日光節約時間†to “以色列å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP25" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Hawaii Daylight Time(change from “å¤å¨å¤·æ¨™æº–時間†to “å¤å¨å¤·å¤ä»¤æ™‚é–“â€) </reference>
+ <reference type="RP26" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Central European Daylight Time (change from “中æ­æ—¥å…‰ç¯€ç´„時間†to “中æ­å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP27" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Eastern European Daylight Time(change from “æ±æ­æ—¥å…‰ç¯€ç´„時間†to “æ±æ­å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP28" uri="http://www.google.com/search?q=Currie&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=50&amp;sa=N">Timezones: Currie(This is a new word, change from “Currie†to “居里â€) </reference>
+ <reference type="RP29" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Japan Daylight Time(change from “日本標準時間†to “日本å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP3" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Southern+Africa&amp;btnG=%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">Territories: Southern Africa (change from “å—éžâ€ to “éžæ´²å—部â€)</reference>
+ <reference type="RP30" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: China Daylight Time(change from “中國標準時間†to “中國å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP31" uri="http://www.worldlanguage.com/ChineseTraditional/Languages/Altai.htm">Language: Southern Altai (change from “alt†to “å—阿爾泰語â€)</reference>
+ <reference type="RP32" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Mirandese&amp;btnG=æœå°‹&amp;lr=lang_zh-TW">Language: Mirandese (change from “mwl†to “米蘭德斯文â€) </reference>
+ <reference type="RP33" uri="http://www.google.com/search?hl=zh-TW&amp;q=Classical+Newari+&amp;btnG=Google+æœå°‹&amp;lr=lang_zh-TW">Language: Classical Newari (change from “ nwc †to “ å¤å°¼ç“¦çˆ¾æ–‡ â€)</reference>
+ <reference type="RP34" uri="http://www.google.com/search?q=Sicilian+%E6%96%87&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;ie=UTF-8&amp;inlang=zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Language: Sicilian (change from “scn†to “西西里文â€)</reference>
+ <reference type="RP35" uri="http://140.111.34.46/cgi-bin/jdict/loadpage.cgi?file=gm/12-6-27.html&amp;word=%E8%98%87%E5%88%A9%E5%8D%97%E5%85%B1%E5%92%8C%E5%9C%8B">Language: Sranan Tongo (change from “srn†to “蘇拉å—æ±å¢Žæ–‡â€)</reference>
+ <reference type="RP36" uri="http://wordpedia.britannica.com/concise/content.aspx?id=7841&amp;hash=PF16q%2BQ%2FWdoVa2%2Bve%2B%2FS%2Bg%3D%3D">Language: Old Provençal (change from “普羅文斯文 (to 1500)†to “å¤æ™®ç¾…旺斯文â€)</reference>
+ <reference type="RP37" uri="http://www.google.com/search?q=Filipino&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=40&amp;sa=N">Language: Filipino (change from “fil†to “è²å¾‹è³“æ–‡â€)</reference>
+ <reference type="RP38" uri="http://www.google.com/search?q=Germanic+(Other)&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=60&amp;sa=N">Language: Germanic (Other) (change from “德國的(其他)†to “日耳曼文(其它)â€)</reference>
+ <reference type="RP39" uri="http://blog.yam.com/festival/archives/1044108.html">Script: Bali (It's a new term)</reference>
+ <reference type="RP4" uri="http://www.google.com/search?q=Central+Asia&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=270&amp;sa=N">Territories: Central Asia (change from “143†to “中亞â€)</reference>
+ <reference type="RP40" uri="http://www.taiwanus.us/MediaVideoAudio/books/history/b5/03.htm">Script: Batak (It's a new term)</reference>
+ <reference type="RP41" uri="http://www.ntctc.edu.tw/spc/ebook/pdf/9003/1.pdf">Script: Blissymbols (It's a new term)</reference>
+ <reference type="RP42" uri="http://tw.britannica.com/MiniSite/Article/id00005994.html">Script: Brahmi (It's a new term) </reference>
+ <reference type="RP43" uri="http://www.google.com/search?q=Dutch&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=20&amp;sa=N">Language: Middle Dutch (change from “è·è˜­ï¼Œä¸­å¤ (ca. 1050-1350)†to “中å¤è·è˜­æ–‡â€)</reference>
+ <reference type="RP44" uri="http://www.unicode.org/cldr/data/common/main/zh_Hant.xml">Script: Buginese (It's a new term) </reference>
+ <reference type="RP45" uri="http://www.worldlanguage.com/ChineseTraditional/Languages/Cham.htm">Script: Cham (It's a new term) </reference>
+ <reference type="RP46" uri="http://www.gamez.com.tw/printthread.php?t=17770&amp;pp=40">Script: Cirth (It's a new term) </reference>
+ <reference type="RP47" uri="http://www.google.com/search?q=Chuvash&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Language: Chuvash (change from “楚瓦甚文†to “楚瓦士文â€)</reference>
+ <reference type="RP48" uri="http://wordpedia.britannica.com/concise/content.aspx?id=570&amp;hash=vsW50K8BiqKfMw5LJ8gJmA%3D%3D&amp;t=3">Script: Cyrillic (Old Church Slavonic variant) (It's a new term) </reference>
+ <reference type="RP49" uri="http://egyptwords.blogspot.com/">Script: Egyptian demotic (It's a new term) </reference>
+ <reference type="RP5" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Latin+America+and+the+Caribbean&amp;btnG=%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">Territories: Latin America and the Caribbean (change from “419†to “拉ä¸ç¾Žæ´²å’ŒåŠ å‹’比海â€)</reference>
+ <reference type="RP50" uri="http://egyptwords.blogspot.com/">Script: Egyptian hieratic (It's a new term) </reference>
+ <reference type="RP51" uri="http://egyptwords.blogspot.com/">Script: Egyptian hieroglyphs (It's a new term) </reference>
+ <reference type="RP52" uri="http://203.64.158.220/ebintra/Content.asp?ContentID=16907">Script: Glagolitic (It's a new term) </reference>
+ <reference type="RP53" uri="http://www.e-safety.com.tw/1_main/103_learning/1037_news/ENS48/pdf/C6.pdf">Script: Gujarati (It's a new term) </reference>
+ <reference type="RP54" uri="http://homework.wtuc.edu.tw/~wenlurg/forghis/0323-10.htm">Script: Indus (Harappan) (It's a new term) </reference>
+ <reference type="RP55" uri="http://leoboard.cpatch.org/cgi-bin/topic.cgi?forum=4&amp;topic=164">Script: Javanese (It's a new term) </reference>
+ <reference type="RP56" uri="http://www.ncn.org/asp/zwgInfo/bg_Da.asp?ID=67438%20&amp;ad=1/2/2006">Script: Kayah Li (It's a new term) </reference>
+ <reference type="RP57" uri="http://www.google.com/search?q=Klingon+%E6%96%87&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;ie=UTF-8&amp;inlang=zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Language: Klingon (change from “tlh†to “克林貢文â€)</reference>
+ <reference type="RP58" uri="http://webtitle.nmh.gov.tw/india/page/page.php?id=103">Script: Kharoshthi (It's a new term) </reference>
+ <reference type="RP59" uri="http://140.128.159.78/yldict/word.asp?w=Fraktur">Script: Latin (Fraktur variant) (It's a new term) </reference>
+ <reference type="RP6" uri="http://www.google.com/search?q=Commonwealth+of+Independent+States&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Territories: Commonwealth of Independent States (change from “172†to “ç¨ç«‹åœ‹å®¶åœ‹å”â€)</reference>
+ <reference type="RP60" uri="http://hk.dictionary.yahoo.com/search.html?s=Gaelic">Script: Latin (Gaelic variant) (It's a new term) </reference>
+ <reference type="RP61" uri="http://203.64.158.220/ebintra/Content.asp?ContentID=25845 &amp;">Script: Lepcha (Róng) (It's a new term) </reference>
+ <reference type="RP62" uri="http://tw.britannica.com/MiniSite/Article/id00036950.htm">Script: Linear A (It's a new term) </reference>
+ <reference type="RP63" uri="http://tw.britannica.com/MiniSite/Article/id00036950.html">Script: Linear B (It's a new term) </reference>
+ <reference type="RP64" uri="http://www2.ccim.org:8088/dictionary/zhaoindex.jsp?k=Gnosticism">Script: Mandaean (It's a new term) </reference>
+ <reference type="RP65" uri="http://tw.britannica.com/MiniSite/Article/id00040761.html">Script: Meroitic (It's a new term) </reference>
+ <reference type="RP66" uri="http://www.macaoheritage.net/Trends/NewsC.asp?nid=5678">Script: Orkhon (It's a new term) </reference>
+ <reference type="RP67" uri="http://tw.britannica.com/MiniSite/Article/id00048822.html">Script: Old Permic (It's a new term) </reference>
+ <reference type="RP68" uri="http://zh.wikipedia.org/wiki/%E5%85%AB%E6%80%9D%E5%B7%B4%E5%AD%97"> Script: Phags-pa (It's a new term) </reference>
+ <reference type="RP69" uri="http://www.google.com/search?q=Haitian&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=0&amp;sa=N">Language: Haitian (change from “海地人†to “海地文â€)</reference>
+ <reference type="RP7" uri="http://www.google.com/search?q=Macao+S.A.R.,+China&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Territories: Macao S.A.R., China(change from “澳門特別行政å€â€to “中è¯äººæ°‘共和國澳門特別行政å€â€)</reference>
+ <reference type="RP70">Currencies:Netherlands Antillan Guilder (change from &amp;quot;è·è˜­ 安梯蘭 盾&amp;quot; to &amp;quot;è·è˜­å®‰æ¢¯è˜­ç›¾&amp;quot;)</reference>
+ <reference type="RP71" uri="http://tw.britannica.com/MiniSite/Article/id00049079.html">Script: Phoenician (It's a new term) </reference>
+ <reference type="RP72">Currencies: Belgian Franc (convertible) (change from &amp;quot;比利時法郎 (å¯è½‰æ›ï¼‰&amp;quot; to &amp;quot;比利時法郎(å¯è½‰æ›ï¼‰&amp;quot;)</reference>
+ <reference type="RP73" uri="http://www.cc-us.org/usa/H39-5.htm">Script: Pollard Phonetic (It's a new term) </reference>
+ <reference type="RP74">Currencies: Belgian Franc (financial) (change from &amp;quot;比利時法郎 (金èžï¼‰&amp;quot; to &amp;quot;比利時法郎(金èžï¼‰&amp;quot;)</reference>
+ <reference type="RP75">Currencies: Bolivian Mvdol (change from &amp;quot;玻利維亞 幕多&amp;quot; to &amp;quot;玻利維亞幕多&amp;quot;)</reference>
+ <reference type="RP76" uri="http://www.thisisthelife.com/zh/historical-sites/easter-island.htm">Script: Rongorongo (It's a new term) </reference>
+ <reference type="RP77">Currencies: Brazilian Cruzeiro Novo (1967-1986) (change from &amp;quot;巴西克魯薩多 農瓦 (1967-1986)&amp;quot; to &amp;quot;巴西克魯薩多農瓦 (1967-1986)&amp;quot;)</reference>
+ <reference type="RP78" uri="http://zh.wikipedia.org/wiki/ç²¾éˆ語 "> Script: Sarati (It's a new term) </reference>
+ <reference type="RP79">Currencies: Brazilian Cruzado Novo (change from &amp;quot;巴西 å…‹å¦‚çˆ¾é” è¾²ç“¦&amp;quot; to &amp;quot;巴西克如爾é”農瓦&amp;quot;)</reference>
+ <reference type="RP8" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Africa/Casablanca/long/daylight (change from “格林å¨æ²»æ¨™æº–時間†to “格林å¨æ²»å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP80" uri="http://www.worldlanguage.com/ChineseTraditional/Languages/Syriac-Estrangelo.htm &amp; http://artvine.com.tw/cgi-bin/board/bbsboard.pl?board_id=2&amp;type=show_post&amp;post=3997">Script: Syriac (Estrangelo variant) (It's a new term) </reference>
+ <reference type="RP81" draft="provisional">Currencies: East German Ostmark (change from &amp;quot;æ±å¾·æ±å¾·é¦¬å…‹&amp;quot; to &amp;quot;æ±å¾·å¥§æ–¯ç‰¹é¦¬å…‹&amp;quot;)</reference>
+ <reference type="RP82" uri="http://www.tattpe.org.tw/news_20051114-2.shtml">Script: New Tai Lue (It's a new term) </reference>
+ <reference type="RP83">Currencies: Trinidad and Tobago Dollar (change from &amp;quot;åƒé‡Œé”åŠæ‰˜å·´å“¥r&amp;quot; to &amp;quot;åƒé‡Œé”åŠæ‰˜å·´å“¥å…ƒ&amp;quot;)</reference>
+ <reference type="RP84">Currencies: CFA Franc BEAC (change from &amp;quot;è¥¿éž æ³•éƒŽ BEAC&amp;quot; to &amp;quot;西éžæ³•éƒŽ BEAC&amp;quot;)</reference>
+ <reference type="RP85">Currencies: CFA Franc BCEAO (change from &amp;quot;è¥¿éž æ³•éƒŽ BCEAO&amp;quot; to &amp;quot;西éžæ³•éƒŽ BCEAO&amp;quot;)</reference>
+ <reference type="RP86" uri="http://www.fantasyweb.idv.tw/yilu/gallery/Spec/Tolkien_fonts/index.htm">Script: Tengwar (It's a new term) </reference>
+ <reference type="RP87">Currencies: Laotian Kip (change from &amp;quot;è€æ’¾ é–‹æ™®&amp;quot; to &amp;quot;è€æ’¾é–‹æ™®&amp;quot;)</reference>
+ <reference type="RP88" uri="http://wiki.foreprinciple.org/mediawiki-1.3.8/index.php?title=%E6%8F%90%E9%9D%9E%E7%B4%8D%E6%96%87">Script: Tifinagh (Berber) (It's a new term) </reference>
+ <reference type="RP89" uri="http://wiki.foreprinciple.org/mediawiki-1.3.8/index.php?title=%E6%8F%90%E9%9D%9E%E7%B4%8D%E6%96%87">Script: Tifinagh (Berber) (It's a new term) </reference>
+ <reference type="RP9" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Alaska Daylight Time(change from “阿拉斯加日光節約時間†to “阿拉斯加å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP90">Currencies: Nicaraguan Cordoba Oro (change from &amp;quot;尼加拉瓜 金哥多è¯&amp;quot; to &amp;quot;尼加拉瓜金哥多è¯æ™®&amp;quot;)</reference>
+ <reference type="RP91">Currencies: Saint Helena Pound (change from &amp;quot;è–赫勒拿 鎊&amp;quot; to &amp;quot;è–赫勒拿鎊&amp;quot;)</reference>
+ <reference type="RP92" uri="http://www.evangellite.org/159/article01.html &amp; http://wordpedia.britannica.com/concise/content.aspx?id=488&amp;hash=O12Uh%2FEcmekMDUZER8jE%2BA%3D%3D&amp;t=3">Script: Sumero-Akkadian Cuneiform (It's a new term) </reference>
+ <reference type="RP93">Currencies: El Salvador Colon (change from &amp;quot;愛爾 薩爾瓦多科郎&amp;quot; to &amp;quot;愛爾薩爾瓦多科郎&amp;quot;)</reference>
+ <reference type="RP94">Currencies: Swaziland Lilangeni (change from &amp;quot;æ–¯å¨å£«è˜­ 里郎&amp;quot; to &amp;quot;æ–¯å¨å£«è˜­é‡ŒéƒŽ&amp;quot;)</reference>
+ <reference type="RP95">Currencies: Tajikistan Somoni (change from &amp;quot;å¡”å‰å…‹æ–¯å¦ 索莫尼&amp;quot; to &amp;quot;å¡”å‰å…‹æ–¯å¦ç´¢èŽ«å°¼&amp;quot;)</reference>
+ <reference type="RP96">Currencies: Timor Escudo (change from &amp;quot;å¸æ±¶ 埃斯庫多&amp;quot; to &amp;quot;å¸æ±¶åŸƒæ–¯åº«å¤š&amp;quot;)</reference>
+ <reference type="RP97">Currencies: Tanzanian Shilling (change from &amp;quot;å¦æ¡‘尼亞 先令&amp;quot; to &amp;quot;å¦æ¡‘尼亞先令&amp;quot;)</reference>
+ <reference type="RP98">Currencies: Ukrainian Karbovanetz (change from &amp;quot;çƒå…‹è˜­ å¡æœ¬ç“¦é‚£èŒ²&amp;quot; to &amp;quot;çƒå…‹è˜­å¡æœ¬ç“¦é‚£èŒ²&amp;quot;)</reference>
+ <reference type="RP99">Currencies: Uzbekistan Sum (change from &amp;quot;çƒèŒ²åˆ¥å…‹æ–¯å¦ 薩木&amp;quot; to &amp;quot;çƒèŒ²åˆ¥å…‹æ–¯å¦è–©æœ¨&amp;quot;)</reference>
+ </references>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/zh_Hant_TW.xml b/libs/Zend/Locale/Data/zh_Hant_TW.xml
new file mode 100755
index 0000000000..36bc3771d9
--- /dev/null
+++ b/libs/Zend/Locale/Data/zh_Hant_TW.xml
@@ -0,0 +1,473 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.28 $"/>
+ <generation date="$Date: 2006/07/11 19:27:38 $"/>
+ <language type="zh"/>
+ <script type="Hant"/>
+ <territory type="TW"/>
+ </identity>
+ <localeDisplayNames>
+ <languages>
+ <language type="ain" draft="provisional">愛奴文</language>
+ <language type="alt" draft="provisional">å—阿爾泰文</language>
+ <language type="awa" draft="provisional">阿瓦文</language>
+ <language type="ban" draft="provisional">峇里文</language>
+ <language type="ceb" draft="provisional">宿霧文</language>
+ <language type="crp" draft="provisional">其他æ­æ´²è…”調和洋涇濱英文</language>
+ <language type="cv" draft="provisional">楚瓦士文</language>
+ <language type="dum" draft="provisional">中å¤è·è˜­æ–‡</language>
+ <language type="egy" draft="provisional">å¤åŸƒåŠæ–‡</language>
+ <language type="elx" draft="provisional">艾拉米特文</language>
+ <language type="enm" draft="provisional">中å¤è‹±æ–‡</language>
+ <language type="fil" draft="provisional">è²å¾‹è³“æ–‡</language>
+ <language type="gem" draft="provisional">日耳曼文(其他)</language>
+ <language type="gmh" draft="provisional">中å¤é«˜åœ°æ—¥è€³æ›¼æ–‡</language>
+ <language type="goh" draft="provisional">å¤é«˜åœ°æ—¥è€³æ›¼æ–‡</language>
+ <language type="got" draft="provisional">哥德文</language>
+ <language type="grb" draft="provisional">å“¥åšæ–‡ </language>
+ <language type="grc" draft="provisional">å¤å¸Œè‡˜æ–‡</language>
+ <language type="ia" draft="provisional">國際文 Interlingua</language>
+ <language type="ie" draft="provisional">國際文 Interlingue</language>
+ <language type="kho" draft="provisional">å’Œé—æ–‡</language>
+ <language type="lez" draft="provisional">列茲干文</language>
+ <language type="mga" draft="provisional">中å¤æ„›çˆ¾è˜­æ–‡</language>
+ <language type="mwl" draft="provisional">米蘭德斯文</language>
+ <language type="nds" draft="provisional">低地日耳曼文;低地薩克éœæ–‡</language>
+ <language type="nwc" draft="provisional">å¤å°¼ç“¦çˆ¾æ–‡</language>
+ <language type="oc" draft="provisional">奧克西å¦æ–‡ï¼ˆ1500 後);普羅旺斯文</language>
+ <language type="pro" draft="provisional">å¤æ™®ç¾…文斯文</language>
+ <language type="root" draft="provisional">根語言</language>
+ <language type="rup" draft="provisional">羅馬尼亞語系</language>
+ <language type="scn" draft="provisional">西西里文</language>
+ <language type="sco" draft="provisional">蘇格蘭文</language>
+ <language type="srn" draft="provisional">蘇拉å—æ±å¢Žæ–‡</language>
+ <language type="tlh" draft="provisional">克林貢文</language>
+ <language type="xh" draft="provisional">科薩文</language>
+ </languages>
+ <scripts>
+ <script type="Bali" draft="provisional">峇里文</script>
+ <script type="Batk" draft="provisional">巴塔克文</script>
+ <script type="Blis" draft="provisional">布列斯文</script>
+ <script type="Brah" draft="provisional">婆羅米文</script>
+ <script type="Bugi" draft="provisional">布å‰æ–¯æ–‡</script>
+ <script type="Buhd" draft="provisional">布希德文</script>
+ <script type="Cham" draft="provisional">å æ–‡</script>
+ <script type="Cirt" draft="provisional">色斯文</script>
+ <script type="Cyrs" draft="provisional">西里爾文(å¤æ•™æœƒæ–¯æ‹‰å¤«æ–‡è®Šé«”)</script>
+ <script type="Egyd" draft="provisional">å¤åŸƒåŠä¸–ä¿—é«”</script>
+ <script type="Egyh" draft="provisional">å¤åŸƒåŠåƒ§ä¾¶é«”</script>
+ <script type="Egyp" draft="provisional">å¤åŸƒåŠè±¡å½¢æ–‡å­—</script>
+ <script type="Geok" draft="provisional">格魯å‰äºžèªžç³»ï¼ˆé˜¿ç´¢ä»–路里和努斯克胡里文)</script>
+ <script type="Glag" draft="provisional">格拉哥里文</script>
+ <script type="Gujr" draft="provisional">å¤å‰æ‹‰ç‰¹æ–‡</script>
+ <script type="Hano" draft="provisional">哈努諾文</script>
+ <script type="Hans" draft="provisional">簡體中文</script>
+ <script type="Hmng" draft="provisional">楊æ¾éŒ„è‹—æ–‡</script>
+ <script type="Hrkt" draft="provisional">片å‡å或平å‡å</script>
+ <script type="Hung" draft="provisional">å¤åŒˆç‰™åˆ©æ–‡</script>
+ <script type="Inds" draft="provisional">å°åº¦æ²³æµåŸŸï¼ˆå“ˆæ‹‰å¸•æ–‡ï¼‰</script>
+ <script type="Java" draft="provisional">爪哇文</script>
+ <script type="Kali" draft="provisional">克耶æŽæ–‡</script>
+ <script type="Khar" draft="provisional">å¡ç¾…é ˆææ–‡</script>
+ <script type="Latf" draft="provisional">拉ä¸æ–‡ï¼ˆå°–角體活字變體)</script>
+ <script type="Latg" draft="provisional">拉ä¸æ–‡ï¼ˆè“‹çˆ¾èªžè®Šé«”)</script>
+ <script type="Lepc" draft="provisional">雷布查文(榮)</script>
+ <script type="Lina" draft="provisional">線性文字 A</script>
+ <script type="Linb" draft="provisional">線性文字 B</script>
+ <script type="Mand" draft="provisional">曼安底文</script>
+ <script type="Maya" draft="provisional">瑪雅象形文字</script>
+ <script type="Mero" draft="provisional">麥羅埃文</script>
+ <script type="Orkh" draft="provisional">鄂爾渾文</script>
+ <script type="Perm" draft="provisional">å¤å½¼çˆ¾å§†è«¸æ–‡</script>
+ <script type="Phag" draft="provisional">å…«æ€å·´æ–‡</script>
+ <script type="Phnx" draft="provisional">腓尼基文</script>
+ <script type="Plrd" draft="provisional">æŸæ ¼ç†æ‹¼éŸ³ç¬¦</script>
+ <script type="Roro" draft="provisional">朗格朗格象形文</script>
+ <script type="Sara" draft="provisional">沙拉堤文</script>
+ <script type="Sylo" draft="provisional">希洛弟ç´æ ¼é‡Œæ–‡</script>
+ <script type="Syre" draft="provisional">敘利亞文(ç¦éŸ³é«”文字變體)</script>
+ <script type="Syrj" draft="provisional">敘利亞文(西方文字變體)</script>
+ <script type="Syrn" draft="provisional">敘利亞文(æ±æ–¹æ–‡å­—變體)</script>
+ <script type="Tale" draft="provisional">泰樂文</script>
+ <script type="Talu" draft="provisional">æ–°å½æ—æ–‡</script>
+ <script type="Teng" draft="provisional">談格瓦文</script>
+ <script type="Tfng" draft="provisional">æéžç´ï¼ˆæŸæŸçˆ¾æ–‡ï¼‰</script>
+ <script type="Visp" draft="provisional">視覺語音文</script>
+ <script type="Xpeo" draft="provisional">å¤æ³¢æ–¯æ–‡</script>
+ <script type="Xsux" draft="provisional">蘇米魯亞甲文楔形文字</script>
+ <script type="Zxxx" draft="provisional">éžæ›¸å¯«èªžè¨€ç¢¼</script>
+ <script type="Zyyy" draft="provisional">一般文字</script>
+ <script type="Zzzz" draft="provisional">未編碼工åºæŒ‡ä»¤ç¢¼</script>
+ </scripts>
+ <territories>
+ <territory type="034" draft="provisional">å—亞</territory>
+ <territory type="143" draft="provisional">中亞</territory>
+ <territory type="172" draft="provisional">ç¨ç«‹åœ‹å®¶åœ‹å”</territory>
+ <territory type="419" draft="provisional">拉ä¸ç¾Žæ´²å’ŒåŠ å‹’比海</territory>
+ </territories>
+ <types>
+ <type type="stroke" key="collation" draft="provisional">筆劃順åº</type>
+ </types>
+ </localeDisplayNames>
+ <delimiters>
+ <quotationStart>「</quotationStart>
+ <quotationEnd>ã€</quotationEnd>
+ <alternateQuotationStart>『</alternateQuotationStart>
+ <alternateQuotationEnd>ã€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="provisional">週日</day>
+ <day type="mon" draft="provisional">週一</day>
+ <day type="wed" draft="provisional">週三</day>
+ <day type="thu" draft="provisional">週四</day>
+ <day type="fri" draft="provisional">週五</day>
+ <day type="sat" draft="provisional">週六</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <fields>
+ <field type="era">
+ <displayName draft="provisional">年代</displayName>
+ </field>
+ <field type="year">
+ <displayName draft="provisional">å¹´</displayName>
+ </field>
+ <field type="month">
+ <displayName draft="provisional">月</displayName>
+ </field>
+ <field type="week">
+ <displayName draft="provisional">週</displayName>
+ </field>
+ <field type="day">
+ <displayName draft="provisional">æ•´æ—¥</displayName>
+ </field>
+ <field type="weekday">
+ <displayName draft="provisional">週天</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName draft="provisional">日間</displayName>
+ </field>
+ <field type="hour">
+ <displayName draft="provisional">å°æ™‚</displayName>
+ </field>
+ <field type="minute">
+ <displayName draft="provisional">分é˜</displayName>
+ </field>
+ <field type="second">
+ <displayName draft="provisional">秒</displayName>
+ </field>
+ <field type="zone">
+ <displayName draft="provisional">å€åŸŸ</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <zone type="Australia/Currie">
+ <exemplarCity draft="provisional">居里</exemplarCity>
+ </zone>
+ <zone type="America/Coral_Harbour">
+ <exemplarCity draft="provisional">çŠç‘šæ¸¯</exemplarCity>
+ </zone>
+ <zone type="America/Moncton">
+ <exemplarCity draft="provisional">曼克頓</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <long>
+ <daylight draft="provisional">大西洋å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/St_Johns">
+ <long>
+ <daylight draft="provisional">ç´èŠ¬è˜­å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Shanghai">
+ <long>
+ <daylight draft="provisional">中國å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Europe/Paris">
+ <long>
+ <daylight draft="provisional">中æ­å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Jerusalem">
+ <long>
+ <daylight draft="provisional">以色列å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Asia/Tokyo">
+ <long>
+ <daylight draft="provisional">日本å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <long>
+ <daylight draft="provisional">格林å¨æ²»å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Europe/Bucharest">
+ <long>
+ <daylight draft="provisional">æ±æ­å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <long>
+ <daylight draft="provisional">å¤å¨å¤·å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/Anchorage">
+ <long>
+ <daylight draft="provisional">阿拉斯加å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <long>
+ <daylight draft="provisional">太平洋å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/Chicago">
+ <long>
+ <daylight draft="provisional">中部å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/Indiana/Vincennes">
+ <exemplarCity draft="provisional">溫森斯</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Petersburg">
+ <exemplarCity draft="provisional">彼得堡</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <long>
+ <daylight draft="provisional">æ±éƒ¨å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ <zone type="America/Louisville">
+ <exemplarCity draft="provisional">路易斯維爾</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <long>
+ <daylight draft="provisional">æ±éƒ¨å¤ä»¤æ™‚é–“</daylight>
+ </long>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern>¤#,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ </currencyFormats>
+ <currencies>
+ <currency type="ANG">
+ <displayName draft="provisional">è·è˜­å®‰æ¢¯è˜­ç›¾</displayName>
+ </currency>
+ <currency type="BOV">
+ <displayName draft="provisional">玻利維亞幕多</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName draft="provisional">巴西克魯薩多農瓦(1967-1986)</displayName>
+ </currency>
+ <currency type="BRN">
+ <displayName draft="provisional">巴西克如爾é”農瓦</displayName>
+ </currency>
+ <currency type="CSD">
+ <displayName draft="provisional">塞爾維亞第ç´çˆ¾</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName draft="provisional">æ±å¾·å¥§æ–¯ç‰¹é¦¬å…‹</displayName>
+ </currency>
+ <currency type="EQE">
+ <displayName draft="provisional">埃奎維勒</displayName>
+ </currency>
+ <currency type="ESA">
+ <displayName draft="provisional">西ç­ç‰™æ¯”塞塔(會計單ä½ï¼‰</displayName>
+ </currency>
+ <currency type="ESB">
+ <displayName draft="provisional">西ç­ç‰™æ¯”塞塔(å¯è½‰æ›æœƒè¨ˆå–®ä½ï¼‰</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName draft="provisional">喬治庫æ—拉里</displayName>
+ </currency>
+ <currency type="INR">
+ <symbol draft="provisional">0#Rs.|1#Re.|1&amp;lt;Rs.</symbol>
+ </currency>
+ <currency type="LAK">
+ <displayName draft="provisional">è€æ’¾é–‹æ™®</displayName>
+ </currency>
+ <currency type="LSM">
+ <displayName draft="provisional">馬洛蒂</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName draft="provisional">盧森堡å¯è½‰æ›æ³•éƒŽ</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName draft="provisional">盧森堡金èžæ³•éƒŽ</displayName>
+ </currency>
+ <currency type="MXV">
+ <displayName draft="provisional">墨西哥轉æ›å–®ä½ï¼ˆUDI)</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName draft="provisional">尼加拉瓜金哥多è¯</displayName>
+ </currency>
+ <currency type="RHD">
+ <displayName draft="provisional">羅德西亞元</displayName>
+ </currency>
+ <currency type="SHP">
+ <displayName draft="provisional">è–赫勒拿鎊</displayName>
+ </currency>
+ <currency type="SRD">
+ <displayName draft="provisional">蘇利å—å…ƒ</displayName>
+ </currency>
+ <currency type="SVC">
+ <displayName draft="provisional">愛爾薩爾瓦多科郎</displayName>
+ </currency>
+ <currency type="SZL">
+ <displayName draft="provisional">æ–¯å¨å£«è˜­é‡ŒéƒŽ</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName draft="provisional">å¡”å‰å…‹æ–¯å¦ç´¢èŽ«å°¼</displayName>
+ </currency>
+ <currency type="TPE">
+ <displayName draft="provisional">å¸æ±¶åŸƒæ–¯åº«å¤š</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName draft="provisional">åƒé‡Œé”åŠæ‰˜å·´å“¥å…ƒ</displayName>
+ </currency>
+ <currency type="TZS">
+ <displayName draft="provisional">å¦æ¡‘尼亞先令</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName draft="provisional">çƒå…‹è˜­å¡æœ¬ç“¦é‚£èŒ²</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName draft="provisional">çƒèŒ²åˆ¥å…‹æ–¯å¦è–©æœ¨</displayName>
+ </currency>
+ <currency type="XAF">
+ <displayName draft="provisional">西éžæ³•éƒŽ BEAC</displayName>
+ </currency>
+ <currency type="XOF">
+ <displayName draft="provisional">西éžæ³•éƒŽ BCEAO</displayName>
+ </currency>
+ <currency type="XPD">
+ <displayName draft="provisional">帕拉狄昂</displayName>
+ </currency>
+ <currency type="XPT">
+ <displayName draft="provisional">白金</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName draft="provisional">扎伊爾新扎伊爾</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <references>
+ <reference type="RP1" uri="http://www.google.com/search?hl=zh-TW&amp;q=Louisville&amp;btnG=Google+%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">http://www.google.com/search?hl=zh-TW&amp;amp;amp;q=Louisville&amp;amp;amp;btnG=Google+%E6%90%9C%E5%B0%8B&amp;amp;amp;lr=lang_zh-TW</reference>
+ <reference type="RP10" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Japan Daylight Time(change from “日本日光節約時間†to “日本å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP11" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: China Daylight Time(change from “中國日光節約時間†to “中國å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP12" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Pacific Daylight Time(change from “太平洋日光節約時間†to “太平洋å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP13" uri="//www.google.com/search?q=Moncton&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Timezones: Moncton(This is a new word, change from “Moncton†to “曼克頓â€)</reference>
+ <reference type="RP14" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Eastern Daylight Time(change from “æ±éƒ¨æ—¥å…‰ç¯€ç´„時間†to “æ±éƒ¨å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP15" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: America/Phoenix/long/daylight(change from “山å€æ¨™æº–時間†to “山å€å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP16" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Newfoundland Daylight Time(change from “纽芬蘭日光節約時間†to “纽芬蘭å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP17" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Israel Daylight Time(change from “以色列日光節約時間†to “以色列å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP18" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Africa/Casablanca/long/daylight (change from “格林å¨æ²»æ¨™æº–時間†to “格林å¨æ²»å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP19" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Alaska Daylight Time(change from “阿拉斯加日光節約時間†to “阿拉斯加å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP2" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Petersburg&amp;btnG=%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">http://www.google.com/search?hl=zh-TW&amp;amp;amp;newwindow=1&amp;amp;amp;q=Petersburg&amp;amp;amp;btnG=%E6%90%9C%E5%B0%8B&amp;amp;amp;lr=lang_zh-TW</reference>
+ <reference type="RP20" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Central Daylight Time(change from “中部日光節約時間†to “中部å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP21" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Mountain Daylight Time(change from “山å€æ—¥å…‰ç¯€ç´„時間†to “山å€å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP22" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Atlantic Daylight Time(change from “大西洋日光節約時間†to “大西洋å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP23" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Indianapolis&amp;btnG=%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">Timezones: Indianapolis (Indianapolis is a new word, change from “Indianapolis†to “å°ç¬¬å®‰é‚£æ³¢é‡Œæ–¯â€).</reference>
+ <reference type="RP24" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Petersburg&amp;btnG=%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">Timezones: Petersburg (Petersburg is a new word, change from “Petersburg†to “彼得堡â€).</reference>
+ <reference type="RP25" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: America/Indianapolis/long/daylight (change from “æ±éƒ¨æ¨™æº–時間†to “æ±éƒ¨å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP26" uri="http://www.google.com/search?hl=zh-TW&amp;q=Louisville&amp;btnG=Google+%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">Timezones: Louisville (Louisville is a new word, change from “Louisville†to “路易斯維爾â€).</reference>
+ <reference type="RP27" uri="http://www.google.com/search?q=Chuvash&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Language: Chuvash (change from &amp;amp;quot;楚瓦甚文&amp;amp;quot; to &amp;amp;quot;楚瓦士文&amp;amp;quot;)</reference>
+ <reference type="RP28" uri="http://www.google.com/search?q=Dutch&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=20&amp;sa=N">Language: Middle Dutch (change from &amp;amp;quot;è·è˜­ï¼Œä¸­å¤ (ca. 1050-1350)&amp;amp;quot; to &amp;amp;quot;è·è˜­æ–‡ï¼Œä¸­å¤&amp;amp;quot;)</reference>
+ <reference type="RP29" uri="http://www.google.com/search?q=Filipino&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=40&amp;sa=N">Language: Filipino (change from &amp;amp;quot;fil&amp;amp;quot; to &amp;amp;quot;è²å¾‹è³“æ–‡&amp;amp;quot;)</reference>
+ <reference type="RP3" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Petersburg&amp;btnG=%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">Petersburg</reference>
+ <reference type="RP30" uri="http://www.google.com/search?q=Germanic+(Other)&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=60&amp;sa=N">Language: Germanic (Other) (change from &amp;amp;quot;德國的(其他)&amp;amp;quot; to &amp;amp;quot;日耳曼文(其它)&amp;amp;quot;)</reference>
+ <reference type="RP31" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Southern+Africa&amp;btnG=%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">Territories: Southern Africa (change from “å—éžâ€ to “éžæ´²å—部â€)</reference>
+ <reference type="RP32" uri="http://www.google.com/search?q=Central+Asia&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=270&amp;sa=N">Territories: Central Asia (change from “143†to “中亞â€)</reference>
+ <reference type="RP33" uri="http://www.google.com/search?q=Haitian&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=0&amp;sa=N">Language: Haitian (change from &amp;amp;quot;海地人&amp;amp;quot; to &amp;amp;quot;海地文&amp;amp;quot;)</reference>
+ <reference type="RP34" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Latin+America+and+the+Caribbean&amp;btnG=%E6%90%9C%E5%B0%8B&amp;lr=lang_zh-TW">Territories: Latin America and the Caribbean (change from “Latin America and the Caribbean†to “拉ä¸ç¾Žæ´²å’ŒåŠ å‹’比海â€)</reference>
+ <reference type="RP35" uri="http://www.google.com/search?q=Commonwealth+of+Independent+States&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Territories: Commonwealth of Independent States (change from “Commonwealth of Independent States†to “ç¨ç«‹åœ‹å®¶åœ‹å”â€)</reference>
+ <reference type="RP36" uri="none">Language: Egyptian (Ancient) (change from &amp;amp;quot;å¤åŸƒåŠæ–‡)&amp;amp;quot; to &amp;amp;quot;å¤åŸƒåŠæ–‡&amp;amp;quot;)</reference>
+ <reference type="RP37">Currencies: Netherlands Antillan Guilder (change from &amp;amp;quot;è·è˜­ 安梯蘭 盾&amp;amp;quot; to &amp;amp;quot;è·è˜­å®‰æ¢¯è˜­ç›¾&amp;amp;quot;, extra spaces deleted)</reference>
+ <reference type="RP38">Currencies: Bolivian Mvdol (change from &amp;amp;quot;利維亞 幕多&amp;amp;quot; to &amp;amp;quot;利維亞幕多&amp;amp;quot;, extra spaces deleted)</reference>
+ <reference type="RP39">Currencies: Brazilian Cruzeiro Novo (1967-1986) (change from &amp;amp;quot;巴西克魯薩多 農瓦 (1967-1986)&amp;amp;quot; to &amp;amp;quot;巴西克魯薩多農瓦 (1967-1986)&amp;amp;quot;, extra spaces deleted)</reference>
+ <reference type="RP40" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Mirandese&amp;btnG=æœå°‹&amp;lr=lang_zh-TW"> Language: Mirandese (change from “mwl†to “米蘭德斯文â€) </reference>
+ <reference type="RP41" uri="http://www.google.com/search?hl=zh-TW&amp;q=Classical+Newari+&amp;btnG=Google+æœå°‹&amp;lr=lang_zh-TW">Language: Classical Newari (change from “ nwc †to “ å¤å°¼ç“¦çˆ¾æ–‡ â€)</reference>
+ <reference type="RP42" uri="http://www.google.com/search?q=Sicilian+%E6%96%87&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;ie=UTF-8&amp;inlang=zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Language: Sicilian (change from “scn†to “西西里文â€)</reference>
+ <reference type="RP43" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Javanese&amp;btnG=æœå°‹&amp;lr=lang_zh-TW">Scripts: Javanese (change from “Java†to “爪哇文â€)</reference>
+ <reference type="RP44" draft="provisional">Language: Klingon (change from “tlh†to “克林貢文â€)</reference>
+ <reference type="RP45" uri="http://www.3miao.net/Article/ShowArticle.asp?ArticleID=717">Script :Pahawh Hmong (It's a new term)</reference>
+ <reference type="RP46" uri="http://www.ccea.org.tw/missionworld/functioncode/publish/articleshow.asp?sn=916&amp;type=0">Script :Cyrillic (Old Church Slavonic variant) (It's a new term)</reference>
+ <reference type="RP47" uri="http://homework.wtuc.edu.tw/~wenlurg/forghis/0323-10.htm">Script :Indus (Harappan) (It's a new term)</reference>
+ <reference type="RP48" uri="http://www.ncn.org/asp/zwgInfo/bg_Da.asp?ID=67438%20&amp;ad=1/2/2006">Script : Kayah Li (It's a new term)</reference>
+ <reference type="RP49" uri="http://webtitle.nmh.gov.tw/india/page/page.php?id=103">Script : Kharoshthi (It's a new term)</reference>
+ <reference type="RP5" uri="http://www.google.com/search?q=Ainu&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Ainu (change from &amp;amp;quot;ain&amp;amp;quot; to &amp;amp;quot;愛奴語&amp;amp;quot;)</reference>
+ <reference type="RP50" uri="http://140.128.159.78/yldict/word.asp?w=Fraktur">Script : Latin (Fraktur variant) (It's a new term)</reference>
+ <reference type="RP51" uri="http://hk.dictionary.yahoo.com/search.html?s=Gaelic">Script : Latin (Gaelic variant) (It's a new term)</reference>
+ <reference type="RP52" uri="http://203.64.158.220/ebintra/Content.asp?ContentID=25845 &amp;">Script : Lepcha (Róng) (It's a new term)</reference>
+ <reference type="RP53" uri="http://www2.ccim.org:8088/dictionary/zhaoindex.jsp?k=Gnosticism">Script : Mandaean (It's a new term)</reference>
+ <reference type="RP54" uri="http://tw.britannica.com/MiniSite/Article/id00040761.html">Script : Meroitic (It's a new term)</reference>
+ <reference type="RP55" uri="http://www.macaoheritage.net/Trends/NewsC.asp?nid=5678">Script : Orkhon (It's a new term)</reference>
+ <reference type="RP56" uri="http://tw.britannica.com/MiniSite/Article/id00048822.html">Script : Old Permic (It's a new term)</reference>
+ <reference type="RP57" uri="http://zh.wikipedia.org/wiki/%E5%85%AB%E6%80%9D%E5%B7%B4%E5%AD%97">Script : Phags-pa (It's a new term)</reference>
+ <reference type="RP58" uri="http://tw.britannica.com/MiniSite/Article/id00049079.html">Script : Phoenician (It's a new term)</reference>
+ <reference type="RP59" uri="http://www.thisisthelife.com/zh/historical-sites/easter-island.htm">Script : Rongorongo (It's a new term)</reference>
+ <reference type="RP6" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Hawaii Daylight Time(change from “å¤å¨å¤·æ¨™æº–時間†to “å¤å¨å¤·å¤ä»¤æ™‚é–“â€) </reference>
+ <reference type="RP60" uri="http://zh.wikipedia.org/wiki/ç²¾éˆ語">Script : Sarati (It's a new term)</reference>
+ <reference type="RP61" uri="http://www.worldlanguage.com/ChineseTraditional/Languages/Syriac-Estrangelo.htm &amp; http://artvine.com.tw/cgi-bin/board/bbsboard.pl?board_id=2&amp;type=show_post&amp;post=3997">Script : Syriac (Estrangelo variant) (It's a new term)</reference>
+ <reference type="RP62" uri="http://www.tattpe.org.tw/news_20051114-2.shtml">Script : New Tai Lue (It's a new term)</reference>
+ <reference type="RP63" uri="http://www.fantasyweb.idv.tw/yilu/gallery/Spec/Tolkien_fonts/index.htm">Script : Tengwar (It's a new term)</reference>
+ <reference type="RP64" uri="http://wiki.foreprinciple.org/mediawiki-1.3.8/index.php?title=%E6%8F%90%E9%9D%9E%E7%B4%8D%E6%96%87">Script : Tifinagh (Berber) (It's a new term)</reference>
+ <reference type="RP65" uri="http://www.evangellite.org/159/article01.html &amp; http://wordpedia.britannica.com/concise/content.aspx?id=488&amp;hash=O12Uh%2FEcmekMDUZER8jE%2BA%3D%3D&amp;t=3">Script : Sumero-Akkadian Cuneiform (It's a new term)</reference>
+ <reference type="RP66">Territories: Macao S.A.R., China(After check again, “中è¯äººæ°‘共和國澳門特別行政å€â€is right, please ignore: “澳門特別行政å€â€)</reference>
+ <reference type="RP67">Territories: Greenland (After check again, “格陵蘭â€is right, please ignore: “陵蘭â€)</reference>
+ <reference type="RP68" uri="http://www.zftrans.com/favorite/vocabulary/20050707/185716-83.htm">Timezones: Coral Harbour (Coral Harbour is a new word, change from “Coral Harbour†to “çŠç‘šæ¸¯â€).</reference>
+ <reference type="RP69" uri="http://www.google.com/search?q=Vincennes&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=10&amp;sa=N">Timezones: Vincennes (Louisville is a new word, change from “Vincennes†to “溫森斯â€).</reference>
+ <reference type="RP7" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Central European Daylight Time (change from “中æ­æ—¥å…‰ç¯€ç´„時間†to “中æ­å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP70">types: Stroke Order (change &amp;amp;quot;筆劃顺åº&amp;amp;quot; to &amp;amp;quot;筆劃順åº&amp;amp;quot;)</reference>
+ <reference type="RP71" uri="http://140.111.34.46/cgi-bin/jdict/loadpage.cgi?file=gm/12-6-27.html&amp;word=%E8%98%87%E5%88%A9%E5%8D%97%E5%85%B1%E5%92%8C%E5%9C%8B">Language: Sranan Tongo (change from “srn†to “蘇拉å—æ±å¢Žæ–‡â€)</reference>
+ <reference type="RP72" uri="http://blog.yam.com/festival/archives/1044108.html">Script :Bali (It's a new term)</reference>
+ <reference type="RP73" uri="http://www.taiwanus.us/MediaVideoAudio/books/history/b5/03.htm">Script :Batak (It's a new term)</reference>
+ <reference type="RP74" uri="http://www.ntctc.edu.tw/spc/ebook/pdf/9003/1.pdf">Script :Blissymbols (It's a new term)</reference>
+ <reference type="RP75" uri="http://tw.britannica.com/MiniSite/Article/id00005994.html">Script :Brahmi (It's a new term)</reference>
+ <reference type="RP76" uri="http://www.unicode.org/cldr/data/common/main/zh_Hant.xml">Script : Buginese (It's a new term)</reference>
+ <reference type="RP77" uri="http://www.gamez.com.tw/printthread.php?t=17770&amp;pp=40">Script : Cirth (It's a new term)</reference>
+ <reference type="RP78" uri="http://wordpedia.britannica.com/concise/content.aspx?id=570&amp;hash=vsW50K8BiqKfMw5LJ8gJmA%3D%3D&amp;t=3">Script : Cyrillic (Old Church Slavonic variant) (It's a new term)</reference>
+ <reference type="RP79" uri="http://egyptwords.blogspot.com/"> Script : Egyptian demotic (It's a new term) </reference>
+ <reference type="RP8" uri="http://www.google.com/search?hl=zh-TW&amp;newwindow=1&amp;q=Daylight+Time&amp;lr=lang_zh-TW">Timezones: Eastern European Daylight Time(change from “æ±æ­æ—¥å…‰ç¯€ç´„時間†to “æ±æ­å¤ä»¤æ™‚é–“â€)</reference>
+ <reference type="RP80" uri="http://egyptwords.blogspot.com/">Script : Egyptian hieratic (It's a new term) </reference>
+ <reference type="RP81" uri="http://egyptwords.blogspot.com/">Script: Egyptian hieroglyphs (It's a new term)</reference>
+ <reference type="RP82" uri="http://egyptwords.blogspot.com/">Script : Egyptian hieroglyphs (It's a new term) </reference>
+ <reference type="RP83" uri="http://203.64.158.220/ebintra/Content.asp?ContentID=16907">Script : Glagolitic (It's a new term) </reference>
+ <reference type="RP84" uri="http://wordpedia.britannica.com/concise/content.aspx?id=7841&amp;hash=PF16q%2BQ%2FWdoVa2%2Bve%2B%2FS%2Bg%3D%3D">Language: Old Provençal (change from “普羅文斯文 (to 1500)†to “å¤æ™®ç¾…旺斯文â€)</reference>
+ <reference type="RP85" uri="http://www.e-safety.com.tw/1_main/103_learning/1037_news/ENS48/pdf/C6.pdf">Script : Gujarati (It's a new term) </reference>
+ <reference type="RP86" uri="http://tw.britannica.com/MiniSite/Article/id00036950.html">Script : Linear A (It's a new term) </reference>
+ <reference type="RP87" uri="http://tw.britannica.com/MiniSite/Article/id00036950.html">Script : Linear B (It's a new term) </reference>
+ <reference type="RP88" uri="http://www.worldlanguage.com/ChineseTraditional/Languages/Cham.htm">Script : Cham (It's a new term) </reference>
+ <reference type="RP89" uri="http://www.cc-us.org/usa/H39-5.htm">Script : Pollard Phonetic (It's a new term) </reference>
+ <reference type="RP9" uri="http://www.google.com/search?q=Currie&amp;hl=zh-TW&amp;lr=lang_zh-TW&amp;newwindow=1&amp;start=50&amp;sa=N">Timezones: Currie(This is a new word, change from “Currie†to “居里â€) </reference>
+ <reference type="RP90">Currencies: Brazilian Cruzado Novo (change from &amp;amp;quot;巴西 å…‹å¦‚çˆ¾é” è¾²ç“¦&amp;amp;quot; to &amp;amp;quot;巴西克如爾é”農瓦&amp;amp;quot;)</reference>
+ <reference type="RP91">Currencies: Serbian Dinar (change from &amp;amp;quot;Serbian Dinar&amp;amp;quot; to &amp;amp;quot;塞爾維亞第ç´çˆ¾&amp;amp;quot;)</reference>
+ <reference type="RP92">Currencies: East German Ostmark (change from &amp;amp;quot;æ±å¾·æ±å¾·é¦¬å…‹&amp;amp;quot; to &amp;amp;quot;æ±å¾·å¥§æ–¯ç‰¹é¦¬å…‹&amp;amp;quot;)</reference>
+ <reference type="RP93">Currencies: Spanish Peseta (A account) (change from &amp;amp;quot;西ç­ç‰™æ¯”塞塔(會計單ä½ï¼‰&amp;amp;quot; to &amp;amp;quot;西ç­ç‰™æŠ«ç´¢ï¼ˆæœƒè¨ˆå–®ä½ï¼‰&amp;amp;quot;)</reference>
+ <reference type="RP94">Currencies: Spanish Peseta (convertible account) (change from &amp;amp;quot;西ç­ç‰™æ¯”塞塔(å¯è½‰æ›å–®ä½ï¼‰&amp;amp;quot; to &amp;amp;quot;西ç­ç‰™æŠ«ç´¢ï¼ˆå¯è½‰æ›å–®ä½ï¼‰&amp;amp;quot;)</reference>
+ <reference type="RP95">Currencies: Georgian Kupon Larit (change from &amp;amp;quot;喬治 åº«æ— æ‹‰é‡Œ&amp;amp;quot; to &amp;amp;quot;喬治庫æ—拉里&amp;amp;quot;)</reference>
+ <reference type="RP96">Currencies: Laotian Kip (change from &amp;amp;quot;è€æ’¾ é–‹æ™®&amp;amp;quot; to &amp;amp;quot;è€æ’¾é–‹æ™®&amp;amp;quot;)</reference>
+ <reference type="RP97">Currencies: Saint Helena Pound (change from &amp;amp;quot;è–赫勒拿 鎊&amp;amp;quot; to &amp;amp;quot;è–赫勒拿鎊&amp;amp;quot;)</reference>
+ <reference type="RP98">Currencies: El Salvador Colon (change from &amp;amp;quot;愛爾 薩爾瓦多科郎&amp;amp;quot; to &amp;amp;quot;愛爾薩爾瓦多科郎&amp;amp;quot;)</reference>
+ <reference type="RP99">Currencies: Swaziland Lilangeni (change from &amp;amp;quot;æ–¯å¨å£«è˜­ 里郎&amp;amp;quot; to &amp;amp;quot;æ–¯å¨å£«è˜­é‡ŒéƒŽ&amp;amp;quot;)</reference>
+ </references>
+</ldml>
diff --git a/libs/Zend/Locale/Data/zh_MO.xml b/libs/Zend/Locale/Data/zh_MO.xml
new file mode 100755
index 0000000000..c9f2bc6532
--- /dev/null
+++ b/libs/Zend/Locale/Data/zh_MO.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="zh"/>
+ <territory type="MO"/>
+ </identity>
+ <alias source="zh_Hant_MO" path="//ldml"/>
+</ldml>
diff --git a/libs/Zend/Locale/Data/zh_SG.xml b/libs/Zend/Locale/Data/zh_SG.xml
new file mode 100755
index 0000000000..f3946cdb01
--- /dev/null
+++ b/libs/Zend/Locale/Data/zh_SG.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="zh"/>
+ <territory type="SG"/>
+ </identity>
+ <alias source="zh_Hans_SG" path="//ldml"/>
+</ldml>
diff --git a/libs/Zend/Locale/Data/zh_TW.xml b/libs/Zend/Locale/Data/zh_TW.xml
new file mode 100755
index 0000000000..a5663b3969
--- /dev/null
+++ b/libs/Zend/Locale/Data/zh_TW.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.42 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="zh"/>
+ <territory type="TW"/>
+ </identity>
+ <alias source="zh_Hant_TW" path="//ldml"/>
+</ldml>
diff --git a/libs/Zend/Locale/Data/zu.xml b/libs/Zend/Locale/Data/zu.xml
new file mode 100755
index 0000000000..cab6789d20
--- /dev/null
+++ b/libs/Zend/Locale/Data/zu.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.12 $"/>
+ <generation date="$Date: 2006/07/11 19:22:10 $"/>
+ <language type="zu"/>
+ </identity>
+ <characters>
+ <exemplarCharacters>[a b {bh} c {ch} d {dl} e-g {gc} {gq} {gx} h {hh} {hl} i k {kh} {kl} l-n {nc} {nq} {nx} {ny} o p {ph} q {qh} s {sh} t {th} {ts} {tsh} u-x {xh} y z]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart>‘</quotationStart>
+ <quotationEnd>’</quotationEnd>
+ <alternateQuotationStart>“</alternateQuotationStart>
+ <alternateQuotationEnd draft="unconfirmed">â€</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="unconfirmed">Jan</month>
+ <month type="2" draft="unconfirmed">Feb</month>
+ <month type="3" draft="unconfirmed">Mas</month>
+ <month type="4" draft="unconfirmed">Apr</month>
+ <month type="5" draft="unconfirmed">Mey</month>
+ <month type="6" draft="unconfirmed">Jun</month>
+ <month type="7" draft="unconfirmed">Jul</month>
+ <month type="8" draft="unconfirmed">Aga</month>
+ <month type="9" draft="unconfirmed">Sep</month>
+ <month type="10" draft="unconfirmed">Okt</month>
+ <month type="11" draft="unconfirmed">Nov</month>
+ <month type="12" draft="unconfirmed">Dis</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="unconfirmed">Januwari</month>
+ <month type="2" draft="unconfirmed">Februwari</month>
+ <month type="3" draft="unconfirmed">Mashi</month>
+ <month type="4" draft="unconfirmed">Apreli</month>
+ <month type="5" draft="unconfirmed">Meyi</month>
+ <month type="6" draft="unconfirmed">Juni</month>
+ <month type="7" draft="unconfirmed">Julayi</month>
+ <month type="8" draft="unconfirmed">Agasti</month>
+ <month type="9" draft="unconfirmed">Septemba</month>
+ <month type="10" draft="unconfirmed">Okthoba</month>
+ <month type="11" draft="unconfirmed">Novemba</month>
+ <month type="12" draft="unconfirmed">Disemba</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="unconfirmed">Son</day>
+ <day type="mon" draft="unconfirmed">Mso</day>
+ <day type="tue" draft="unconfirmed">Bil</day>
+ <day type="wed" draft="unconfirmed">Tha</day>
+ <day type="thu" draft="unconfirmed">Sin</day>
+ <day type="fri" draft="unconfirmed">Hla</day>
+ <day type="sat" draft="unconfirmed">Mgq</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="unconfirmed">Sonto</day>
+ <day type="mon" draft="unconfirmed">Msombuluko</day>
+ <day type="tue" draft="unconfirmed">Lwesibili</day>
+ <day type="wed" draft="unconfirmed">Lwesithathu</day>
+ <day type="thu" draft="unconfirmed">Lwesine</day>
+ <day type="fri" draft="unconfirmed">Lwesihlanu</day>
+ <day type="sat" draft="unconfirmed">Mgqibelo</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <eras>
+ <eraNames>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="unconfirmed">BC</era>
+ <era type="1" draft="unconfirmed">AD</era>
+ </eraAbbr>
+ </eras>
+ </calendar>
+ </calendars>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal draft="provisional">,</decimal>
+ </symbols>
+ <currencies>
+ <currency type="ZAR">
+ <symbol>R</symbol>
+ </currency>
+ </currencies>
+ </numbers>
+</ldml>
+
diff --git a/libs/Zend/Locale/Data/zu_ZA.xml b/libs/Zend/Locale/Data/zu_ZA.xml
new file mode 100755
index 0000000000..5dda5cb14e
--- /dev/null
+++ b/libs/Zend/Locale/Data/zu_ZA.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "http://www.unicode.org/cldr/dtd/1.4/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.7 $"/>
+ <generation date="$Date: 2006/06/24 23:27:02 $"/>
+ <language type="zu"/>
+ <territory type="ZA"/>
+ </identity>
+</ldml>
+
diff --git a/libs/Zend/Locale/Exception.php b/libs/Zend/Locale/Exception.php
new file mode 100755
index 0000000000..2fbf7d5696
--- /dev/null
+++ b/libs/Zend/Locale/Exception.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Locale
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Exception.php 2883 2007-01-18 05:56:31Z gavin $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Locale
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Locale_Exception extends Zend_Exception
+{
+}
diff --git a/libs/Zend/Locale/Format.php b/libs/Zend/Locale/Format.php
new file mode 100755
index 0000000000..0f03f3a14a
--- /dev/null
+++ b/libs/Zend/Locale/Format.php
@@ -0,0 +1,1044 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Locale
+ * @subpackage Format
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Format.php 5507 2007-06-29 19:57:28Z thomas $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * include needed classes
+ */
+require_once 'Zend/Locale/Data.php';
+require_once 'Zend/Locale/Exception.php';
+require_once 'Zend/Locale/Math.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Locale
+ * @subpackage Format
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Locale_Format
+{
+ const STANDARD = 'STANDARD';
+
+ private static $_Options = array('date_format' => null,
+ 'number_format' => null,
+ 'format_type' => 'iso',
+ 'fix_date' => false,
+ 'locale' => null,
+ 'precision' => null);
+
+ private static $_signs = array(
+ 'Latn' => array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'), // Latn - default latin
+ 'Arab' => array( 'Ù ', 'Ù¡', 'Ù¢', 'Ù£', 'Ù¤', 'Ù¥', 'Ù¦', 'Ù§', 'Ù¨', 'Ù©'), // 0660 - 0669 arabic
+ 'Deva' => array( '०', '१', '२', '३', '४', '५', '६', '७', '८', '९'), // 0966 - 096F devanagari
+ 'Beng' => array( '০', '১', '২', '৩', '৪', '৫', '৬', '৭', '৮', '৯'), // 09E6 - 09EF bengali
+ 'Guru' => array( '੦', '੧', '੨', '੩', '੪', '੫', '੬', '੭', '੮', '੯'), // 0A66 - 0A6F gurmukhi
+ 'Gujr' => array( '૦', '૧', '૨', '૩', '૪', '૫', '૬', '૭', '૮', '૯'), // 0AE6 - 0AEF gujarati
+ 'Orya' => array( 'à­¦', 'à­§', 'à­¨', 'à­©', 'à­ª', 'à­«', 'à­¬', 'à­­', 'à­®', 'à­¯'), // 0B66 - 0B6F orija
+ 'Taml' => array( '௦', '௧', '௨', '௩', '௪', '௫', '௬', '௭', '௮', '௯'), // 0BE6 - 0BEF tamil
+ 'Telu' => array( '౦', '౧', '౨', '౩', '౪', '౫', '౬', '౭', '౮', '౯'), // 0C66 - 0C6F telugu
+ 'Knda' => array( '೦', '೧', '೨', '೩', '೪', '೫', '೬', '೭', '೮', '೯'), // 0CE6 - 0CEF kannada
+ 'Mlym' => array( '൦', '൧', '൨', '൩', '൪', '൫', '൬', '൭', '൮', '൯ '), // 0D66 - 0D6F malayalam
+ 'Tale' => array( 'à¹', '๑', '๒', '๓', '๔', '๕', '๖', '๗', '๘', '๙ '), // 0E50 - 0E59 thai
+ 'Laoo' => array( 'à»', '໑', 'à»’', '໓', 'à»”', '໕', 'à»–', 'à»—', '໘', 'à»™'), // 0ED0 - 0ED9 lao
+ 'Tibt' => array( '༠', '༡', '༢', '༣', '༤', '༥', '༦', '༧', '༨', '༩ '), // 0F20 - 0F29 tibetan
+ 'Mymr' => array( 'á€', 'á', 'á‚', 'áƒ', 'á„', 'á…', 'á†', 'á‡', 'áˆ', 'á‰'), // 1040 - 1049 myanmar
+ 'Khmr' => array( '០', '១', '២', '៣', '៤', '៥', '៦', '៧', '៨', '៩'), // 17E0 - 17E9 khmer
+ 'Mong' => array( 'á ', 'á ‘', 'á ’', 'á “', 'á ”', 'á •', 'á –', 'á —', 'á ˜', 'á ™'), // 1810 - 1819 mongolian
+ 'Limb' => array( '᥆', '᥇', '᥈', '᥉', '᥊', '᥋', '᥌', 'á¥', '᥎', 'á¥'), // 1946 - 194F limbu
+ 'Talu' => array( 'á§', '᧑', '᧒', '᧓', '᧔', '᧕', '᧖', '᧗', '᧘', '᧙'), // 19D0 - 19D9 tailue
+ 'Bali' => array( 'á­', 'á­‘', 'á­’', 'á­“', 'á­”', 'á­•', 'á­–', 'á­—', 'á­˜', 'á­™'), // 1B50 - 1B59 balinese
+ 'Nkoo' => array( '߀', 'ß', 'ß‚', '߃', 'ß„', 'ß…', '߆', '߇', '߈', '߉') // 07C0 - 07C9 nko
+ );
+
+ /**
+ * Sets class wide options, if no option was given, the actual set options will be returned
+ * The 'precision' option of a value is used to truncate or stretch extra digits. -1 means not to touch the extra digits.
+ * The 'locale' option helps when parsing numbers and dates using separators and month names.
+ * The date format 'format_type' option selects between CLDR/ISO date format specifier tokens and PHP's date() tokens.
+ * The 'fix_date' option enables or disables heuristics that attempt to correct invalid dates.
+ * The 'number_format' option can be used to specify a default number format string
+ * The 'date_format' option can be used to specify a default date format string, but beware of using getDate(),
+ * checkDateFormat() and getTime() after using setOptions() with a 'format'. To use these four methods
+ * with the default date format for a locale, use array('date_format' => null, 'locale' => $locale) for their options.
+ *
+ * @param array $options Array of options, keyed by option name: format_type = 'iso' | 'php', fix_date = true | false,
+ * locale = Zend_Locale | locale string, precision = whole number between -1 and 30
+ * @throws Zend_Locale_Exception
+ * @return Options array if no option was given
+ */
+ public static function setOptions(array $options = array())
+ {
+ self::$_Options = array_merge(self::$_Options, self::checkOptions($options));
+ return self::$_Options;
+ }
+
+ /**
+ * Internal function for checking the options array of proper input values
+ * See {@link setOptions()} for details.
+ *
+ * @param array $options Array of options, keyed by option name: format_type = 'iso' | 'php', fix_date = true | false,
+ * locale = Zend_Locale | locale string, precision = whole number between -1 and 30
+ * @throws Zend_Locale_Exception
+ * @return Options array if no option was given
+ */
+ private static function checkOptions(array $options = array())
+ {
+ if (count($options) == 0) {
+ return self::$_Options;
+ }
+ foreach ($options as $name => $value) {
+ $name = strtolower($name);
+ if ($name !== 'locale') {
+ if (gettype($value) === 'string') {
+ $value = strtolower($value);
+ }
+ }
+
+ if (array_key_exists($name, self::$_Options)) {
+ switch($name) {
+ case 'number_format' :
+ if ($value == 'standard') {
+ $locale = self::$_Options['locale'];
+ if (isset($options['locale'])) {
+ $locale = $options['locale'];
+ }
+ $format = Zend_Locale_Data::getContent($locale, 'decimalnumberformat');
+ $options['number_format'] = $format['default'];
+ } else if ((gettype($value) !== 'string') and ($value !== NULL)) {
+ throw new Zend_Locale_Exception("Unknown number format type '" . gettype($value) . "'. "
+ . "Format '$value' must be a valid number format string.");
+ }
+ break;
+ case 'date_format' :
+ if ($value == 'standard') {
+ $locale = self::$_Options['locale'];
+ if (isset($options['locale'])) {
+ $locale = $options['locale'];
+ }
+ $options['date_format'] = Zend_Locale_Format::getDateFormat($locale);
+ } else if ((gettype($value) !== 'string') and ($value !== NULL)) {
+ throw new Zend_Locale_Exception("Unknown dateformat type '" . gettype($value) . "'. "
+ . "Format '$value' must be a valid ISO or PHP date format string.");
+ } else {
+ if (((array_key_exists('format_type', $options)) and ($options['format_type'] == 'php')) or
+ ((!array_key_exists('format_type', $options)) and (self::$_Options['format_type'] == 'php'))) {
+ $options['date_format'] = Zend_Locale_Format::convertPhpToIsoFormat($value);
+ }
+ }
+ break;
+ case 'format_type' :
+ if (($value != 'php') && ($value != 'iso')) {
+ throw new Zend_Locale_Exception("Unknown date format type '$value'. Only 'iso' and 'php'"
+ . " are supported.");
+ }
+ break;
+ case 'fix_date' :
+ if (($value !== true) && ($value !== false)) {
+ throw new Zend_Locale_Exception("Enabling correction of dates must be either true or false"
+ . "(fix_date='$value').");
+ }
+ break;
+ case 'locale' :
+ if (gettype($value) === 'string' && strtolower($value) == 'standard') {
+ $options['locale'] = new Zend_Locale();
+ } else if (!empty($value) && (!Zend_Locale::isLocale($value))) {
+ throw new Zend_Locale_Exception("'" .
+ (gettype($value) === 'object' ? get_class($value) : $value)
+ . "' is not a known locale.");
+ }
+ break;
+ case 'precision' :
+ if ($value === NULL) {
+ $value = -1;
+ }
+ if (($value < -1) || ($value > 30)) {
+ throw new Zend_Locale_Exception("'$value' precision is not a whole number less than 30.");
+ }
+ break;
+ }
+ }
+ else {
+ throw new Zend_Locale_Exception("Unknown option: '$name' = '$value'");
+ }
+ }
+ return $options;
+ }
+
+ /**
+ * Changes the numbers/digits within a given string from one script to another
+ * 'Decimal' representated the stardard numbers 0-9, if a script does not exist
+ * an exception will be thrown.
+ *
+ * Examples for conversion from Arabic to Latin numerals:
+ * convertNumerals('١١٠ Tests', 'Arab'); -> returns '100 Tests'
+ * Example for conversion from Latin to Arabic numerals:
+ * convertNumerals('100 Tests', 'Latn', 'Arab'); -> returns '١١٠ Tests'
+ *
+ * @param string $input String to convert
+ * @param string $from Script to parse, see {@link Zend_Locale::getScriptList()} for details.
+ * @param string $to OPTIONAL Script to convert to
+ * @return string Returns the converted input
+ * @throws Zend_Locale_Exception
+ */
+ public static function convertNumerals($input, $from, $to = null)
+ {
+ if (is_string($from)) {
+ $from = ucfirst(strtolower($from));
+ }
+ if (!array_key_exists($from, self::$_signs)) {
+ throw new Zend_Locale_Exception("Unknown script '$from'. Use 'Latn' for digits 0,1,2,3,4,5,6,7,8,9.");
+ }
+ if (is_string($to)) {
+ $to = ucfirst(strtolower($to));
+ }
+ if (($to !== null) and (!array_key_exists($to, self::$_signs))) {
+ throw new Zend_Locale_Exception("Unknown script '$to'. Use 'Latn' for digits 0,1,2,3,4,5,6,7,8,9.");
+ }
+
+ if (isset(self::$_signs[$from])) {
+ for ($X = 0; $X < 10; ++$X) {
+ $source[$X + 10] = "/" . self::$_signs[$from][$X] . "/u";
+ }
+ }
+
+ if (isset(self::$_signs[$to])) {
+ for ($X = 0; $X < 10; ++$X) {
+ $dest[$X + 10] = self::$_signs[$to][$X];
+ }
+ } else {
+ for ($X = 0; $X < 10; ++$X) {
+ $dest[$X + 10] = $X;
+ }
+ }
+
+ return preg_replace($source, $dest, $input);
+ }
+
+ /**
+ * Returns the first found number from an string
+ * Parsing depends on given locale (grouping and decimal)
+ *
+ * Examples for input:
+ * ' 2345.4356,1234' = 23455456.1234
+ * '+23,3452.123' = 233452.123
+ * ' 12343 ' = 12343
+ * '-9456km' = -9456
+ * '0' = 0
+ * '(-){0,1}(\d+(\.){0,1})*(\,){0,1})\d+'
+ * '١١٠ Tests' = 110 call: getNumber($string, 'Arab');
+ *
+ * @param string $input Input string to parse for numbers
+ * @param array $options Options: locale, precision. See {@link setOptions()} for details.
+ * @return integer|string Returns the extracted number
+ * @throws Zend_Locale_Exception
+ */
+ public static function getNumber($input, array $options = array())
+ {
+ $options = array_merge(self::$_Options, self::checkOptions($options));
+ if (!is_string($input)) {
+ return $input;
+ }
+
+ // Get correct signs for this locale
+ $symbols = Zend_Locale_Data::getContent($options['locale'],'numbersymbols');
+
+ // Parse input locale aware
+ $regex = '/(' . $symbols['minus'] . '){0,1}(\d+(\\' . $symbols['group'] . '){0,1})*(\\' .
+ $symbols['decimal'] . '){0,1}\d+/';
+ preg_match($regex, $input, $found);
+ if (!isset($found[0]))
+ throw new Zend_Locale_Exception('No value in ' . $input . ' found');
+ $found = $found[0];
+
+ // Change locale input to be standard number
+ if ($symbols['minus'] != "-")
+ $found = strtr($found,$symbols['minus'],'-');
+ $found = str_replace($symbols['group'],'', $found);
+
+ // Do precision
+ if (strpos($found, $symbols['decimal']) !== false) {
+ if ($symbols['decimal'] != '.') {
+ $found = str_replace($symbols['decimal'], ".", $found);
+ }
+
+ $pre = substr($found, strpos($found, '.') + 1);
+ if ($options['precision'] === null) {
+ $options['precision'] = strlen($pre);
+ }
+
+ if (strlen($pre) >= $options['precision']) {
+ $found = substr($found, 0, strlen($found) - strlen($pre) + $options['precision']);
+ }
+ }
+
+ return $found;
+ }
+
+ /**
+ * Returns a locale formatted number depending on the given options.
+ * The seperation and fraction sign is used from the set locale.
+ * ##0.# -> 12345.12345 -> 12345.12345
+ * ##0.00 -> 12345.12345 -> 12345.12
+ * ##,##0.00 -> 12345.12345 -> 12,345.12
+ *
+ * @param string $input Localized number string
+ * @param array $options Options: number_format, locale, precision. See {@link setOptions()} for details.
+ * @return string locale formatted number
+ */
+ public static function toNumber($value, array $options = array())
+ {
+ $value = Zend_Locale_Math::normalize($value);
+ $options = array_merge(self::$_Options, self::checkOptions($options));
+ if ($options['locale'] instanceof Zend_Locale) {
+ $options['locale'] = $options['locale']->toString();
+ }
+
+ // Get correct signs for this locale
+ $symbols = Zend_Locale_Data::getContent($options['locale'], 'numbersymbols');
+ iconv_set_encoding('internal_encoding', 'UTF-8');
+
+ // Get format
+ $format = $options['number_format'];
+ if ($format === null) {
+ $format = Zend_Locale_Data::getContent($options['locale'], 'decimalnumberformat');
+ $format = $format['default'];
+ if (iconv_strpos($format, ';') !== false) {
+ if (call_user_func(Zend_Locale_Math::$comp, $value, 0) < 0) {
+ $format = iconv_substr($format, iconv_strpos($format, ';') + 1);
+ } else {
+ $format = iconv_substr($format, 0, iconv_strpos($format, ';'));
+ }
+ }
+ } else {
+ // seperate negative format pattern when avaiable
+ if (iconv_strpos($format, ';') !== false) {
+ if (call_user_func(Zend_Locale_Math::$comp, $value, 0) < 0) {
+ $format = iconv_substr($format, iconv_strpos($format, ';') + 1);
+ } else {
+ $format = iconv_substr($format, 0, iconv_strpos($format, ';'));
+ }
+ }
+
+ if (strpos($format, '.')) {
+ if (is_numeric($options['precision'])) {
+ $value = round($value, $options['precision']);
+ } else {
+ if (substr($format, strpos($format, '.') + 1, 3) == '###') {
+ $options['precision'] = null;
+ } else {
+ $options['precision'] = strlen(substr($format, strpos($format, '.') + 1,
+ strrpos($format, '0') - strpos($format, '.')));
+ $format = substr($format, 0, strpos($format, '.') + 1) . '###'
+ . substr($format, strrpos($format, '0') + 1);
+ }
+ }
+ } else {
+ $value = round($value, 0);
+ $options['precision'] = 0;
+ }
+ }
+ // set negative sign
+ if (call_user_func(Zend_Locale_Math::$comp, $value, 0) < 0) {
+ if (iconv_strpos($format, '-') === false) {
+ $format = $symbols['minus'] . $format;
+ } else {
+ $format = str_replace('-', $symbols['minus'], $format);
+ }
+ }
+
+ // get number parts
+ if (strlen($value) != strlen(round($value, 0))) {
+ if ($options['precision'] === null) {
+ $precstr = iconv_substr($value, strlen(round($value, 0)) + 1);
+ } else {
+ $precstr = iconv_substr($value, strlen(round($value, 0)) + 1, $options['precision']);
+ if (iconv_strlen($precstr) < $options['precision']) {
+ $precstr = $precstr . str_pad("0", ($options['precision'] - iconv_strlen($precstr)), "0");
+ }
+ }
+ } else {
+ if ($options['precision'] > 0) {
+ $precstr = str_pad("0", ($options['precision']), "0");
+ }
+ }
+ if ($options['precision'] === null) {
+ if (isset($precstr)) {
+ $options['precision'] = iconv_strlen($precstr);
+ } else {
+ $options['precision'] = 0;
+ }
+ }
+
+ // get fraction and format lengths
+ $number = call_user_func(Zend_Locale_Math::$sub, $value, '0');
+ $prec = call_user_func(Zend_Locale_Math::$sub, $value, $number, $options['precision']);
+ if (iconv_strpos($prec, '-') !== false) {
+ $prec = iconv_substr($prec, 1);
+ }
+ if (($options['precision'] + 2) > strlen($prec)) {
+ $prec = $prec . str_pad("0", ($options['precision'] - iconv_strlen($prec)), "0");
+ }
+ if (iconv_strpos($number, '-') !== false) {
+ $number = iconv_substr($number, 1);
+ }
+ $group = iconv_strrpos($format, ',');
+ $group2 = iconv_strpos ($format, ',');
+ $point = iconv_strpos ($format, '0');
+ // Add fraction
+ $rest = "";
+ if (($value < 0) && (strpos($format, '.'))) {
+ $rest = substr(substr($format, strpos($format, '.') + 1), -1, 1);
+ }
+ if ($options['precision'] == '0') {
+ $format = iconv_substr($format, 0, $point) . iconv_substr($format, iconv_strrpos($format, '#') + 2);
+ } else {
+ $format = iconv_substr($format, 0, $point) . $symbols['decimal']
+ . iconv_substr($prec, 2) . iconv_substr($format, iconv_strrpos($format, '#') + 2 + strlen($prec) - 2);
+ }
+ if (($value < 0) and ($rest != '0') and ($rest != '#')) {
+ $format .= $rest;
+ }
+ // Add seperation
+ if ($group == 0) {
+ // no seperation
+ $format = $number . iconv_substr($format, $point);
+
+ } else if ($group == $group2) {
+ // only 1 seperation
+ $seperation = ($point - $group);
+ for ($x = iconv_strlen($number); $x > $seperation; $x -= $seperation) {
+ if (iconv_substr($number, 0, $x - $seperation) !== "") {
+ $number = iconv_substr($number, 0, $x - $seperation) . $symbols['group']
+ . iconv_substr($number, $x - $seperation);
+ }
+ }
+ $format = iconv_substr($format, 0, iconv_strpos($format, '#')) . $number . iconv_substr($format, $point);
+
+ } else {
+
+ // 2 seperations
+ if (iconv_strlen($number) > ($point - $group)) {
+ $seperation = ($point - $group);
+ $number = iconv_substr($number, 0, iconv_strlen($number) - $seperation) . $symbols['group']
+ . iconv_substr($number, iconv_strlen($number) - $seperation);
+
+ if ((iconv_strlen($number) - 1) > ($point - $group + 1)) {
+ $seperation2 = ($group - $group2 - 1);
+
+ for ($x = iconv_strlen($number) - $seperation2 - 2; $x > $seperation2; $x -= $seperation2) {
+ $number = iconv_substr($number, 0, $x - $seperation2) . $symbols['group']
+ . iconv_substr($number, $x - $seperation2);
+ }
+ }
+
+ }
+ $format = iconv_substr($format, 0, iconv_strpos($format, '#')) . $number . iconv_substr($format, $point);
+
+ }
+
+ return (string) $format;
+ }
+
+
+ /**
+ * Checks if the input contains a normalized or localized number
+ *
+ * @param string $input Localized number string
+ * @param array $options Options: locale. See {@link setOptions()} for details.
+ * @return boolean Returns true if a number was found
+ */
+ public static function isNumber($input, array $options = array())
+ {
+ // Get correct signs for this locale
+ $symbols = Zend_Locale_Data::getContent($options['locale'],'numbersymbols');
+
+ // Parse input locale aware
+ $regex = '/^(' . $symbols['minus'] . '){0,1}(\d+(\\' . $symbols['group']
+ . '){0,1})*(\\' . $symbols['decimal'] . '){0,1}\d+$/';
+ preg_match($regex, $input, $found);
+
+ if (!isset($found[0]))
+ return false;
+ return true;
+ }
+
+
+ /**
+ * Alias for getNumber
+ *
+ * @param string $value Number to localize
+ * @param array $options Options: locale, precision. See {@link setOptions()} for details.
+ * @return float
+ */
+ public static function getFloat($input, array $options = array())
+ {
+ return floatval(self::getNumber($input, $options));
+ }
+
+
+ /**
+ * Returns a locale formatted integer number
+ * Alias for toNumber()
+ *
+ * @param string $value Number to normalize
+ * @param array $options Options: locale, precision. See {@link setOptions()} for details.
+ * @return string Locale formatted number
+ */
+ public static function toFloat($value, array $options = array())
+ {
+ $options['number_format'] = 'standard';
+ return self::toNumber($value, $options);
+ }
+
+
+ /**
+ * Returns if a float was found
+ * Alias for isNumber()
+ *
+ * @param string $input Localized number string
+ * @param array $options Options: locale. See {@link setOptions()} for details.
+ * @return boolean Returns true if a number was found
+ */
+ public static function isFloat($value, array $options = array())
+ {
+ return self::isNumber($value, $options);
+ }
+
+
+ /**
+ * Returns the first found integer from an string
+ * Parsing depends on given locale (grouping and decimal)
+ *
+ * Examples for input:
+ * ' 2345.4356,1234' = 23455456
+ * '+23,3452.123' = 233452
+ * ' 12343 ' = 12343
+ * '-9456km' = -9456
+ * '0' = 0
+ * '(-){0,1}(\d+(\.){0,1})*(\,){0,1})\d+'
+ *
+ * @param string $input Input string to parse for numbers
+ * @param array $options Options: locale. See {@link setOptions()} for details.
+ * @return integer Returns the extracted number
+ */
+ public static function getInteger($input, array $options = array())
+ {
+ $options['precision'] = 0;
+ return intval(self::getFloat($input, $options));
+ }
+
+
+ /**
+ * Returns a localized number
+ *
+ * @param string $value Number to normalize
+ * @param array $options Options: locale. See {@link setOptions()} for details.
+ * @return string Locale formatted number
+ */
+ public static function toInteger($value, array $options = array())
+ {
+ $options['precision'] = 0;
+ $options['number_format'] = 'standard';
+ return self::toNumber($value, $options);
+ }
+
+
+ /**
+ * Returns if a integer was found
+ *
+ * @param string $input Localized number string
+ * @param array $options Options: locale. See {@link setOptions()} for details.
+ * @return boolean Returns true if a integer was found
+ */
+ public static function isInteger($value, array $options = array())
+ {
+ $options['precision'] = 0;
+ return self::isNumber($value, $options);
+ }
+
+
+ /**
+ * Converts a format string from PHP's date format to ISO format
+ * Remember that Zend Date always returns localized string, so a month name which returns the english
+ * month in php's date() will return the translated month name with this function... use 'en' as locale
+ * if you are in need of the original english names
+ *
+ * The conversion has the following restrictions:
+ * 'a', 'A' - Meridiem is not explicit upper/lowercase, you have to upper/lowercase the translated value yourself
+ *
+ * @param string $format Format string in PHP's date format
+ * @return string Format string in ISO format
+ */
+ public static function convertPhpToIsoFormat($format)
+ {
+ $convert = array('d' => 'dd' , 'D' => 'EEE' , 'j' => 'd' , 'l' => 'EEEE', 'N' => 'e' , 'S' => 'SS' ,
+ 'w' => 'eee' , 'z' => 'D' , 'W' => 'w' , 'F' => 'MMMM', 'm' => 'MM' , 'M' => 'MMM' ,
+ 'n' => 'M' , 't' => 'ddd' , 'L' => 'l' , 'o' => 'YYYY', 'Y' => 'yyyy', 'y' => 'yy' ,
+ 'a' => 'a' , 'A' => 'a' , 'B' => 'B' , 'g' => 'h' , 'G' => 'H' , 'h' => 'hh' ,
+ 'H' => 'HH' , 'i' => 'mm' , 's' => 'ss' , 'e' => 'zzzz', 'I' => 'I' , 'O' => 'Z' ,
+ 'P' => 'ZZZZ', 'T' => 'z' , 'Z' => 'X' , 'c' => 'yyyy-MM-ddTHH:mm:ssZZZZ',
+ 'r' => 'r' , 'U' => 'U');
+ $values = str_split($format);
+ foreach ($values as $key => $value) {
+ if (array_key_exists($value, $convert)) {
+ $values[$key] = $convert[$value];
+ }
+ }
+ return join($values);
+ }
+
+
+ /**
+ * Parse date and split in named array fields
+ *
+ * @param string $date Date string to parse
+ * @param array $options Options: format_type, fix_date, locale, date_format. See {@link setOptions()} for details.
+ * @return array Possible array members: day, month, year, hour, minute, second, fixed, format
+ */
+ private static function _parseDate($date, $options)
+ {
+ $options = array_merge(self::$_Options, self::checkOptions($options));
+ $test = array('h', 'H', 'm', 's', 'y', 'Y', 'M', 'd', 'D', 'E', 'S', 'l', 'B', 'I',
+ 'X', 'r', 'U', 'G', 'w', 'e', 'a', 'A', 'Z', 'z');
+
+ $format = $options['date_format'];
+ foreach (str_split($format) as $splitted) {
+ if ((!in_array($splitted, $test)) and (ctype_alpha($splitted))) {
+ throw new Zend_Locale_Exception("Unable to parse the date format string '" . $format
+ . "' at letter '$splitted'");
+ }
+ }
+ $number = $date; // working copy
+ $result['date_format'] = $format; // save the format used to normalize $number (convenience)
+ $result['locale'] = $options['locale']; // save the locale used to normalize $number (convenience)
+
+ $day = iconv_strpos($format, 'd');
+ $month = iconv_strpos($format, 'M');
+ $year = iconv_strpos($format, 'y');
+ $hour = iconv_strpos($format, 'H');
+ $min = iconv_strpos($format, 'm');
+ $sec = iconv_strpos($format, 's');
+ $am = null;
+ if ($hour === false) {
+ $hour = iconv_strpos($format, 'h');
+ }
+ if ($year === false) {
+ $year = iconv_strpos($format, 'Y');
+ }
+ if ($day === false) {
+ $day = iconv_strpos($format, 'E');
+ if ($day === false) {
+ $day = iconv_strpos($format, 'D');
+ }
+ }
+
+ if ($day !== false) {
+ $parse[$day] = 'd';
+ if (!empty($options['locale']) && ($options['locale'] !== 'root') &&
+ (!is_object($options['locale']) || ($options['locale']->toString() !== 'root'))) {
+ // erase day string
+ $daylist = Zend_Locale_Data::getContent($options['locale'], 'daylist',
+ array('gregorian', 'format', 'wide'));
+ foreach($daylist as $key => $name) {
+ if (iconv_strpos($number, $name) !== false) {
+ $number = str_replace($name, "EEEE", $number);
+ break;
+ }
+ }
+ }
+ }
+ $position = false;
+
+ if ($month !== false) {
+ $parse[$month] = 'M';
+ if (!empty($options['locale']) && ($options['locale'] !== 'root') &&
+ (!is_object($options['locale']) || ($options['locale']->toString() !== 'root'))) {
+ // prepare to convert month name to their numeric equivalents, if requested,
+ // and we have a $options['locale']
+ $position = self::_replaceMonth($number, Zend_Locale_Data::getContent($options['locale'],
+ 'monthlist', array('gregorian', 'format', 'wide')));
+ if ($position === false) {
+ $position = self::_replaceMonth($number, Zend_Locale_Data::getContent($options['locale'],
+ 'monthlist', array('gregorian', 'format', 'abbreviated')));
+ }
+ }
+ }
+ if ($year !== false) {
+ $parse[$year] = 'y';
+ }
+ if ($hour !== false) {
+ $parse[$hour] = 'H';
+ }
+ if ($min !== false) {
+ $parse[$min] = 'm';
+ }
+ if ($sec !== false) {
+ $parse[$sec] = 's';
+ }
+
+ if (empty($parse)) {
+ throw new Zend_Locale_Exception("unknown date format, neither date nor time in '" . $format . "' found");
+ }
+ ksort($parse);
+
+ // get daytime
+ if (iconv_strpos($format, 'a') !== false) {
+ $daytime = Zend_Locale_Data::getContent($options['locale'], 'daytime', 'gregorian');
+ if (iconv_strpos(strtoupper($number), strtoupper($daytime['am']))) {
+ $am = true;
+ } else if (iconv_strpos(strtoupper($number), strtoupper($daytime['pm']))) {
+ $am = false;
+ }
+ }
+
+ // split number parts
+ $split = false;
+ preg_match_all('/\d+/u', $number, $splitted);
+
+ if (count($splitted[0]) == 0) {
+ throw new Zend_Locale_Exception("No date part in '$date' found.");
+ }
+ if (count($splitted[0]) == 1) {
+ $split = 0;
+ }
+ $cnt = 0;
+ foreach($parse as $key => $value) {
+
+ switch($value) {
+ case 'd':
+ if ($split === false) {
+ if (count($splitted[0]) > $cnt) {
+ $result['day'] = $splitted[0][$cnt];
+ }
+ } else {
+ $result['day'] = iconv_substr($splitted[0][0], $split, 2);
+ $split += 2;
+ }
+ ++$cnt;
+ break;
+ case 'M':
+ if ($split === false) {
+ if (count($splitted[0]) > $cnt) {
+ $result['month'] = $splitted[0][$cnt];
+ }
+ } else {
+ $result['month'] = iconv_substr($splitted[0][0], $split, 2);
+ $split += 2;
+ }
+ ++$cnt;
+ break;
+ case 'y':
+ $length = 2;
+ if ((iconv_substr($format, $year, 4) == 'yyyy')
+ || (iconv_substr($format, $year, 4) == 'YYYY')) {
+ $length = 4;
+ }
+ if ($split === false) {
+ if (count($splitted[0]) > $cnt) {
+ $result['year'] = $splitted[0][$cnt];
+ }
+ } else {
+ $result['year'] = iconv_substr($splitted[0][0], $split, $length);
+ $split += $length;
+ }
+ ++$cnt;
+ break;
+ case 'H':
+ if ($split === false) {
+ if (count($splitted[0]) > $cnt) {
+ $result['hour'] = $splitted[0][$cnt];
+ }
+ } else {
+ $result['hour'] = iconv_substr($splitted[0][0], $split, 2);
+ $split += 2;
+ }
+ ++$cnt;
+ break;
+ case 'm':
+ if ($split === false) {
+ if (count($splitted[0]) > $cnt) {
+ $result['minute'] = $splitted[0][$cnt];
+ }
+ } else {
+ $result['minute'] = iconv_substr($splitted[0][0], $split, 2);
+ $split += 2;
+ }
+ ++$cnt;
+ break;
+ case 's':
+ if ($split === false) {
+ if (count($splitted[0]) > $cnt) {
+ $result['second'] = $splitted[0][$cnt];
+ }
+ } else {
+ $result['second'] = iconv_substr($splitted[0][0], $split, 2);
+ $split += 2;
+ }
+ ++$cnt;
+ break;
+ }
+ }
+
+ // AM/PM correction
+ if ($hour !== false) {
+ if (($am === true) and ($result['hour'] == 12)){
+ $result['hour'] = 0;
+ } else if (($am === false) and ($result['hour'] != 12)) {
+ $result['hour'] += 12;
+ }
+ }
+
+ if ($options['fix_date'] === true) {
+ $result['fixed'] = 0; // nothing has been "fixed" by swapping date parts around (yet)
+ }
+
+ if ($day !== false) {
+ // fix false month
+ if (isset($result['day']) and isset($result['month'])) {
+ if (($position !== false) and ((iconv_strpos($date, $result['day']) === false) or
+ (isset($result['year']) and (iconv_strpos($date, $result['year']) === false)))) {
+ if ($options['fix_date'] !== true) {
+ throw new Zend_Locale_Exception("unable to parse date '$date' using '" . $format
+ . "' (false month, $position, $month)");
+ }
+ $temp = $result['day'];
+ $result['day'] = $result['month'];
+ $result['month'] = $temp;
+ $result['fixed'] = 1;
+ }
+ }
+
+ // fix switched values d <> y
+ if (isset($result['day']) and isset($result['year'])) {
+ if ($result['day'] > 31) {
+ if ($options['fix_date'] !== true) {
+ throw new Zend_Locale_Exception("unable to parse date '$date' using '"
+ . $format . "' (d <> y)");
+ }
+ $temp = $result['year'];
+ $result['year'] = $result['day'];
+ $result['day'] = $temp;
+ $result['fixed'] = 2;
+ }
+ }
+
+ // fix switched values M <> y
+ if (isset($result['month']) and isset($result['year'])) {
+ if ($result['month'] > 31) {
+ if ($options['fix_date'] !== true) {
+ throw new Zend_Locale_Exception("unable to parse date '$date' using '"
+ . $format . "' (M <> y)");
+ }
+ $temp = $result['year'];
+ $result['year'] = $result['month'];
+ $result['month'] = $temp;
+ $result['fixed'] = 3;
+ }
+ }
+
+ // fix switched values M <> d
+ if (isset($result['month']) and isset($result['day'])) {
+ if ($result['month'] > 12) {
+ if ($options['fix_date'] !== true || $result['month'] > 31) {
+ throw new Zend_Locale_Exception("unable to parse date '$date' using '"
+ . $format . "' (M <> d)");
+ }
+ $temp = $result['day'];
+ $result['day'] = $result['month'];
+ $result['month'] = $temp;
+ $result['fixed'] = 4;
+ }
+ }
+ }
+ return $result;
+ }
+
+
+ /**
+ * Search $number for a month name found in $monthlist, and replace if found.
+ *
+ * @param string $number Date string (modified)
+ * @param array $monthlist List of month names
+ *
+ * @return int|false Position of replaced string (false if nothing replaced)
+ */
+ protected static function _replaceMonth(&$number, $monthlist)
+ {
+ // If $locale was invalid, $monthlist will default to a "root" identity
+ // mapping for each month number from 1 to 12.
+ // If no $locale was given, or $locale was invalid, do not use this identity mapping to normalize.
+ // Otherwise, translate locale aware month names in $number to their numeric equivalents.
+ $position = false;
+ if ($monthlist && $monthlist[1] != 1) {
+ foreach($monthlist as $key => $name) {
+ if (($position = iconv_strpos($number, $name)) !== false) {
+ if ($key < 10) {
+ $key = "0" . $key;
+ }
+ $number = str_replace($name, $key, $number);
+ return $position;
+ }
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns the default date format for $locale.
+ *
+ * @param string|Zend_Locale $locale OPTIONAL Locale of $number, possibly in string form (e.g. 'de_AT')
+ * @return string format
+ */
+ public static function getDateFormat($locale = null)
+ {
+ $format = Zend_Locale_Data::getContent($locale, 'defdateformat', 'gregorian');
+ $format = $format['default'];
+
+ $format = Zend_Locale_Data::getContent($locale, 'dateformat', array('gregorian', $format));
+ return $format['pattern'];
+ }
+
+
+ /**
+ * Returns an array with the normalized date from an locale date
+ * a input of 10.01.2006 without a $locale would return:
+ * array ('day' => 10, 'month' => 1, 'year' => 2006)
+ * The 'locale' option is only used to convert human readable day
+ * and month names to their numeric equivalents.
+ * The 'format' option allows specification of self-defined date formats,
+ * when not using the default format for the 'locale'.
+ *
+ * @param string $date Date string
+ * @param array $options Options: format_type, fix_date, locale, date_format. See {@link setOptions()} for details.
+ * @return array Possible array members: day, month, year, hour, minute, second, fixed, format
+ */
+ public static function getDate($date, array $options = array())
+ {
+ $options = array_merge(self::$_Options, self::checkOptions($options));
+ if (empty($options['date_format'])) {
+ $options['format_type'] = 'iso';
+ $options['date_format'] = self::getDateFormat($options['locale']);
+ }
+ return self::_parseDate($date, $options);
+ }
+
+
+ /**
+ * Returns if the given datestring contains all date parts from the given format.
+ * If no format is given, the standard date format from the locale is used
+ * If you want to check if the date is a proper date you should use Zend_Date::isDate()
+ *
+ * @param string $date Date string
+ * @param array $options Options: format_type, fix_date, locale, date_format. See {@link setOptions()} for details.
+ * @return boolean
+ */
+ public static function checkDateFormat($date, array $options = array())
+ {
+ try {
+ $date = self::getDate($date, $options);
+ } catch (Exception $e) {
+ return false;
+ }
+
+ if (empty($options['date_format'])) {
+ $options['format_type'] = 'iso';
+ $options['date_format'] = self::getDateFormat($options['locale']);
+ }
+ $options = array_merge(self::$_Options, self::checkOptions($options));
+
+ // day expected but not parsed
+ if ((iconv_strpos($options['date_format'], 'd') !== false) and (!isset($date['day']) or ($date['day'] == ""))) {
+ return false;
+ }
+
+ // month expected but not parsed
+ if ((iconv_strpos($options['date_format'], 'M') !== false) and (!isset($date['month']) or ($date['month'] == ""))) {
+ return false;
+ }
+
+ // year expected but not parsed
+ if (((iconv_strpos($options['date_format'], 'Y') !== false) or
+ (iconv_strpos($options['date_format'], 'y') !== false)) and (!isset($date['year']) or ($date['year'] == ""))) {
+ return false;
+ }
+
+ // second expected but not parsed
+ if ((iconv_strpos($options['date_format'], 's') !== false) and (!isset($date['second']) or ($date['second'] == ""))) {
+ return false;
+ }
+
+ // minute expected but not parsed
+ if ((iconv_strpos($options['date_format'], 'm') !== false) and (!isset($date['minute']) or ($date['minute'] == ""))) {
+ return false;
+ }
+
+ // hour expected but not parsed
+ if (((iconv_strpos($options['date_format'], 'H') !== false) or
+ (iconv_strpos($options['date_format'], 'h') !== false)) and (!isset($date['hour']) or ($date['hour'] == ""))) {
+ return false;
+ }
+ return true;
+ }
+
+
+ /**
+ * Returns the default time format for $locale.
+ *
+ * @param string|Zend_Locale $locale OPTIONAL Locale of $number, possibly in string form (e.g. 'de_AT')
+ * @return string format
+ */
+ public static function getTimeFormat($locale = null)
+ {
+ $format = Zend_Locale_Data::getContent($locale, 'deftimeformat', 'gregorian');
+ $format = $format['default'];
+
+ $format = Zend_Locale_Data::getContent($locale, 'timeformat', array('gregorian', $format));
+ return $format['pattern'];
+ }
+
+
+ /**
+ * Returns an array with 'hour', 'minute', and 'second' elements extracted from $time
+ * according to the order described in $format. For a format of 'H:m:s', and
+ * an input of 11:20:55, getTime() would return:
+ * array ('hour' => 11, 'minute' => 20, 'second' => 55)
+ * The optional $locale parameter may be used to help extract times from strings
+ * containing both a time and a day or month name.
+ *
+ * @param string $time Time string
+ * @param array $options Options: format_type, fix_date, locale, date_format. See {@link setOptions()} for details.
+ * @return array Possible array members: day, month, year, hour, minute, second, fixed, format
+ */
+ public static function getTime($time, array $options = array())
+ {
+ $options = array_merge(self::$_Options, self::checkOptions($options));
+ if (empty($options['date_format'])) {
+ $options['format_type'] = 'iso';
+ $options['date_format'] = self::getTimeFormat($options['locale']);
+ }
+
+ return self::_parseDate($time, $options);
+ }
+}
diff --git a/libs/Zend/Locale/Math.php b/libs/Zend/Locale/Math.php
new file mode 100755
index 0000000000..4ab5d91f4f
--- /dev/null
+++ b/libs/Zend/Locale/Math.php
@@ -0,0 +1,139 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Locale
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Math.php 4104 2007-03-18 17:57:13Z thomas $
+ */
+
+
+/**
+ * Utility class for proxying math function to bcmath functions, if present,
+ * otherwise to PHP builtin math operators, with limited detection of overflow conditions.
+ * Sampling of PHP environments and platforms suggests that at least 80% to 90% support bcmath.
+ * Thus, this file should be as light as possible.
+ *
+ * @category Zend
+ * @package Zend_Locale
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+class Zend_Locale_Math
+{
+ // support unit testing without using bcmath functions
+ public static $_bcmathDisabled = false;
+
+ public static $add = 'bcadd';
+ public static $sub = 'bcsub';
+ public static $pow = 'bcpow';
+ public static $mul = 'bcmul';
+ public static $div = 'bcdiv';
+ public static $comp = 'bccomp';
+ public static $sqrt = 'bcsqrt';
+ public static $mod = 'bcmod';
+ public static $scale = 'bcscale';
+
+ public static function isBcmathDisabled()
+ {
+ return self::$_bcmathDisabled;
+ }
+
+ /**
+ * Surprisingly, the results of this implementation of round()
+ * prove better than the native PHP round(). For example, try:
+ * round(639.795, 2);
+ * round(267.835, 2);
+ * round(0.302515, 5);
+ * round(0.36665, 4);
+ * then try:
+ * Zend_Locale_Math::round('639.795', 2);
+ */
+ public static function round($op1, $precision = 0)
+ {
+ if (self::$_bcmathDisabled) {
+ return (string) round($op1, $precision);
+ }
+ $op1 = trim($op1);
+ $length = strlen($op1);
+ if (($decPos = strpos($op1, '.')) === false) {
+ $op1 .= '.0';
+ $decPos = $length;
+ $length += 2;
+ }
+ if ($precision < 0 && abs($precision) > $decPos) {
+ return '0';
+ }
+ $digitsBeforeDot = $length - ($decPos + 1);
+ if ($precision >= ($length - ($decPos + 1))) {
+ return $op1;
+ }
+ if ($precision === 0) {
+ $triggerPos = 1;
+ $roundPos = -1;
+ } elseif ($precision > 0) {
+ $triggerPos = $precision + 1;
+ $roundPos = $precision;
+ } else {
+ $triggerPos = $precision;
+ $roundPos = $precision -1;
+ }
+ $triggerDigit = $op1[$triggerPos + $decPos];
+ if ($precision < 0) {
+ // zero fill digits to the left of the decimal place
+ $op1 = substr($op1, 0, $decPos + $precision) . str_pad('', abs($precision), '0');
+ }
+ if ($triggerDigit >= '5') {
+ if ($roundPos + $decPos == -1) {
+ return str_pad('1', $decPos + 1, '0');
+ }
+ $roundUp = str_pad('', $length, '0');
+ $roundUp[$decPos] = '.';
+ $roundUp[$roundPos + $decPos] = '1';
+ return bcadd($op1, $roundUp, $precision);
+ } elseif ($precision >= 0) {
+ return substr($op1, 0, $decPos + ($precision ? $precision + 1: 0));
+ }
+ return (string) $op1;
+ }
+
+ /**
+ * Normalizes an input to standard english notation
+ * Fixes a problem of BCMath with setLocale which is PHP related
+ *
+ * @param integer $value Value to normalize
+ * @return string Normalized string without BCMath problems
+ */
+ public static function normalize($value)
+ {
+ $value = (string) $value;
+ $convert = localeconv();
+ $value = str_replace($convert['thousands_sep'], "",$value);
+ $value = str_replace($convert['positive_sign'], "",$value);
+ if (!empty($convert['negative_sign']) and (strpos($value, $convert['negative_sign']))) {
+ $value = str_replace($convert['negative_sign'], "",$value);
+ $value = "-".$value;
+ }
+ return $value;
+ }
+}
+
+if ((defined('TESTS_ZEND_LOCALE_BCMATH_ENABLED') && !TESTS_ZEND_LOCALE_BCMATH_ENABLED)
+ || !extension_loaded('bcmath')) {
+ require_once 'Zend/Locale/Math/PhpMath.php';
+}
+
+?>
diff --git a/libs/Zend/Locale/Math/Exception.php b/libs/Zend/Locale/Math/Exception.php
new file mode 100755
index 0000000000..2d344dc462
--- /dev/null
+++ b/libs/Zend/Locale/Math/Exception.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Locale
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Exception.php 3827 2007-03-08 18:26:49Z darby $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Locale
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Locale_Math_Exception extends Zend_Exception
+{
+ protected $op1 = null;
+ protected $op2 = null;
+ protected $result = null;
+
+ public function __construct($message, $op1 = null, $op2 = null, $result = null)
+ {
+ $this->op1 = $op1;
+ $this->op2 = $op2;
+ $this->result = $result;
+ parent::__construct($message);
+ }
+
+ public function getResults()
+ {
+ return array($this->op1 = $op1, $this->op2 = $op2, $this->result = $result);
+ }
+}
diff --git a/libs/Zend/Locale/Math/PhpMath.php b/libs/Zend/Locale/Math/PhpMath.php
new file mode 100755
index 0000000000..8615ed8ef6
--- /dev/null
+++ b/libs/Zend/Locale/Math/PhpMath.php
@@ -0,0 +1,222 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Locale
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: PhpMath.php 5533 2007-06-30 16:38:20Z bkarwin $
+ */
+
+
+/**
+ * Utility class for proxying math function to bcmath functions, if present,
+ * otherwise to PHP builtin math operators, with limited detection of overflow conditions.
+ * Sampling of PHP environments and platforms suggests that at least 80% to 90% support bcmath.
+ * This file should only be loaded for the 10% to 20% lacking access to the bcmath extension.
+ *
+ * @category Zend
+ * @package Zend_Locale
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Locale_Math_PhpMath extends Zend_Locale_Math
+{
+ public static function disable()
+ {
+ self::$_bcmathDisabled = true;
+ self::$add = 'Zend_Locale_Math_Add';
+ self::$sub = 'Zend_Locale_Math_Sub';
+ self::$pow = 'Zend_Locale_Math_Pow';
+ self::$mul = 'Zend_Locale_Math_Mul';
+ self::$div = 'Zend_Locale_Math_Div';
+ self::$comp = 'Zend_Locale_Math_Comp';
+ self::$sqrt = 'Zend_Locale_Math_Sqrt';
+ self::$mod = 'Zend_Locale_Math_Mod';
+ self::$scale = 'Zend_Locale_Math_Scale';
+ }
+}
+
+function Zend_Locale_Math_Add($op1, $op2)
+{
+ if (empty($op1)) {
+ $op1 = 0;
+ }
+ $result = $op1 + $op2;
+ if ((string)($result - $op2) != (string)$op1) {
+ /**
+ * @see Zend_Locale_Math_Exception
+ */
+ require_once 'Zend/Locale/Math/Exception.php';
+ throw new Zend_Locale_Math_Exception("addition overflow: $op1 + $op2 != $result", $op1, $op2, $result);
+ }
+ return $result;
+}
+
+function Zend_Locale_Math_Sub($op1, $op2, $op3 = null)
+{
+ if (empty($op1)) {
+ $op1 = 0;
+ }
+ $result = $op1 - $op2;
+ if ((string)($result + $op2) != (string)$op1) {
+ /**
+ * @see Zend_Locale_Math_Exception
+ */
+ require_once 'Zend/Locale/Math/Exception.php';
+ throw new Zend_Locale_Math_Exception("subtraction overflow: $op1 - $op2 != $result", $op1, $op2, $result);
+ }
+ if ($op3 <> 0) {
+ $result = round($result, $op3);
+ } else {
+ if ($result > 0) {
+ $result = floor($result);
+ } else {
+ $result = ceil($result);
+ }
+ }
+ if ($op3 > 0) {
+ if ((string) $result == "0") {
+ $result = "0.";
+ }
+ if (strlen($result) < ($op3 + 2)) {
+ $result = str_pad($result, ($op3 + 2), "0", STR_PAD_RIGHT);
+ }
+ }
+ return $result;
+}
+
+function Zend_Locale_Math_Pow($base, $exp)
+{
+ $result = pow($base, $exp);
+ if ($result === false) {
+ /**
+ * @see Zend_Locale_Math_Exception
+ */
+ require_once 'Zend/Locale/Math/Exception.php';
+ throw new Zend_Locale_Math_Exception("power overflow: $op1 ^ $op2", $op1, $op2, $result);
+ }
+ return $result;
+}
+
+function Zend_Locale_Math_Mul($op1, $op2)
+{
+ if (empty($op1)) {
+ $op1 = 0;
+ }
+ $result = $op1 * $op2;
+ if ((string)($result / $op2) != (string)$op1) {
+ /**
+ * @see Zend_Locale_Math_Exception
+ */
+ require_once 'Zend/Locale/Math/Exception.php';
+ throw new Zend_Locale_Math_Exception("multiplication overflow: $op1 * $op2 != $result", $op1, $op2, $result);
+ }
+ return $result;
+}
+
+function Zend_Locale_Math_Div($op1, $op2)
+{
+ $result = $op1 / $op2;
+ if (empty($op2)) {
+ /**
+ * @see Zend_Locale_Math_Exception
+ */
+ require_once 'Zend/Locale/Math/Exception.php';
+ throw new Zend_Locale_Math_Exception("can not divide by zero");
+ }
+ if (empty($op1)) {
+ $op1 = 0;
+ }
+ if ((string)($result * $op2) != (string)$op1) {
+ /**
+ * @see Zend_Locale_Math_Exception
+ */
+ require_once 'Zend/Locale/Math/Exception.php';
+ throw new Zend_Locale_Math_Exception("division overflow: $op1 / $op2 != $result", $op1, $op2, $result);
+ }
+ return $result;
+}
+
+function Zend_Locale_Math_Comp($op1, $op2)
+{
+ if (empty($op1)) {
+ $op1 = 0;
+ }
+ // @todo: this unecessarily breaks for $op1 == large positive #, $op2 = large negative number
+ $result = $op1 - $op2;
+ if ((string)($result + $op2) != (string)$op1) {
+ /**
+ * @see Zend_Locale_Math_Exception
+ */
+ require_once 'Zend/Locale/Math/Exception.php';
+ throw new Zend_Locale_Math_Exception("compare overflow: comp($op1, $op2)", $op1, $op2, $result);
+ }
+ return $result;
+}
+
+function Zend_Locale_Math_Sqrt($op1)
+{
+ if (empty($op1)) {
+ $op1 = 0;
+ }
+ $result = sqrt($op1);
+ if (is_string($op1) && (string)($result * $result) != (string)$op1) {
+ /**
+ * @see Zend_Locale_Math_Exception
+ */
+ require_once 'Zend/Locale/Math/Exception.php';
+ throw new Zend_Locale_Math_Exception("sqrt operand overflow: $op1", $op1, null, $result);
+ }
+ return $result;
+}
+
+function Zend_Locale_Math_Mod($op1, $op2)
+{
+ if (empty($op1)) {
+ $op1 = 0;
+ }
+ $result = $op1 / $op2;
+ if (empty($op2)) {
+ /**
+ * @see Zend_Locale_Math_Exception
+ */
+ require_once 'Zend/Locale/Math/Exception.php';
+ throw new Zend_Locale_Math_Exception("can not modulo by zero: $op1 % $op2", $op1, $op2, $result);
+ }
+ if ((string)($result * $op2) != (string)$op1) {
+ /**
+ * @see Zend_Locale_Math_Exception
+ */
+ require_once 'Zend/Locale/Math/Exception.php';
+ throw new Zend_Locale_Math_Exception("modulo overflow: $op1 % $op2 (result=$result)", $op1, $op2, $result);
+ }
+ $result = $op1 % $op2;
+ return $result;
+}
+
+function Zend_Locale_Math_Scale($op1)
+{
+ if ($op1 > 9) {
+ /**
+ * @see Zend_Locale_Math_Exception
+ */
+ require_once 'Zend/Locale/Math/Exception.php';
+ throw new Zend_Locale_Math_Exception("can not scale to precision $op1", $op1, null, $result);
+ }
+}
+
+Zend_Locale_Math_PhpMath::disable(); // disable use of bcmath functions
+
+?>
diff --git a/libs/Zend/Log.php b/libs/Zend/Log.php
new file mode 100755
index 0000000000..d0430cdc56
--- /dev/null
+++ b/libs/Zend/Log.php
@@ -0,0 +1,211 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Log
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Log.php 5112 2007-06-04 23:28:58Z mike $
+ */
+
+/** Zend_Log_Filter_Priority */
+require_once 'Zend/Log/Filter/Priority.php';
+
+/**
+ * @category Zend
+ * @package Zend_Log
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Log.php 5112 2007-06-04 23:28:58Z mike $
+ */
+class Zend_Log
+{
+ const EMERG = 0; // Emergency: system is unusable
+ const ALERT = 1; // Alert: action must be taken immediately
+ const CRIT = 2; // Critical: critical conditions
+ const ERR = 3; // Error: error conditions
+ const WARN = 4; // Warning: warning conditions
+ const NOTICE = 5; // Notice: normal but significant condition
+ const INFO = 6; // Informational: informational messages
+ const DEBUG = 7; // Debug: debug messages
+
+ /**
+ * @var array of priorities where the keys are the
+ * priority numbers and the values are the priority names
+ */
+ private $_priorities = array();
+
+ /**
+ * @var array of Zend_Log_Writer_Abstract
+ */
+ private $_writers = array();
+
+ /**
+ * @var array of Zend_Log_Filter_Interface
+ */
+ private $_filters = array();
+
+ /**
+ * @var array of extra log event
+ */
+ private $_extras = array();
+
+ /**
+ * Class constructor. Create a new logger
+ *
+ * @param Zend_Log_Writer_Abstract|null $writer default writer
+ */
+ public function __construct($writer = null)
+ {
+ $r = new ReflectionClass($this);
+ $this->_priorities = array_flip($r->getConstants());
+
+ if ($writer !== null) {
+ $this->addWriter($writer);
+ }
+ }
+
+ /**
+ * Class destructor. Shutdown log writers
+ *
+ * @return void
+ */
+ public function __destruct()
+ {
+ foreach($this->_writers as $writer) {
+ $writer->shutdown();
+ }
+ }
+
+ /**
+ * Undefined method handler allows a shortcut:
+ * $log->priorityName('message')
+ * instead of
+ * $log->log('message', Zend_Log::PRIORITY_NAME)
+ *
+ * @param string $method priority name
+ * @param string $params message to log
+ * @return void
+ * @throws Zend_Log_Exception
+ */
+ public function __call($method, $params)
+ {
+ $priority = strtoupper($method);
+ if (($priority = array_search($priority, $this->_priorities)) !== false) {
+ $this->log(array_shift($params), $priority);
+ } else {
+ throw new Zend_Log_Exception('Bad log priority');
+ }
+ }
+
+ /**
+ * Log a message at a priority
+ *
+ * @param string $message Message to log
+ * @param integer $priority Priority of message
+ * @return void
+ * @throws Zend_Log_Exception
+ */
+ public function log($message, $priority)
+ {
+ // sanity checks
+ if (empty($this->_writers)) {
+ throw new Zend_Log_Exception('No writers were added');
+ }
+
+ if (! isset($this->_priorities[$priority])) {
+ throw new Zend_Log_Exception('Bad log priority');
+ }
+
+ // pack into event required by filters and writers
+ $event = array_merge(array('timestamp' => date('c'),
+ 'message' => $message,
+ 'priority' => $priority,
+ 'priorityName' => $this->_priorities[$priority]),
+ $this->_extras);
+
+ // abort if rejected by the global filters
+ foreach ($this->_filters as $filter) {
+ if (! $filter->accept($event)) {
+ return;
+ }
+ }
+
+ // send to each writer
+ foreach ($this->_writers as $writer) {
+ $writer->write($event);
+ }
+ }
+
+ /**
+ * Add a custom priority
+ *
+ * @param string $name Name of priority
+ * @param integer $priority Numeric priority
+ * @throws Zend_Log_InvalidArgumentException
+ */
+ public function addPriority($name, $priority)
+ {
+ // Priority names must be uppercase for predictability.
+ $name = strtoupper($name);
+
+ if (isset($this->_priorities[$priority])
+ || array_search($name, $this->_priorities)) {
+ throw new Zend_Log_Exception('Existing priorities cannot be overwritten');
+ }
+
+ $this->_priorities[$priority] = $name;
+ }
+
+ /**
+ * Add a filter that will be applied before all log writers.
+ * Before a message will be received by any of the writers, it
+ * must be accepted by all filters added with this method.
+ *
+ * @param Zend_Log_Filter_Interface $filter
+ * @return void
+ */
+ public function addFilter($filter)
+ {
+ if (is_integer($filter)) {
+ $filter = new Zend_Log_Filter_Priority($filter);
+ }
+
+ $this->_filters[] = $filter;
+ }
+
+ /**
+ * Add a writer. A writer is responsible for taking a log
+ * message and writing it out to storage.
+ *
+ * @param Zend_Log_Writer_Abstract $writer
+ * @return void
+ */
+ public function addWriter($writer)
+ {
+ $this->_writers[] = $writer;
+ }
+
+ /**
+ * Set an extra item to pass to the log writers.
+ *
+ * @param $name Name of the field
+ * @param $value Value of the field
+ * @return void
+ */
+ public function setEventItem($name, $value) {
+ $this->_extras = array_merge($this->_extras, array($name => $value));
+ }
+
+} \ No newline at end of file
diff --git a/libs/Zend/Log/Exception.php b/libs/Zend/Log/Exception.php
new file mode 100755
index 0000000000..b1018f8b34
--- /dev/null
+++ b/libs/Zend/Log/Exception.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Log
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Exception.php 4412 2007-04-06 21:17:32Z zendbot $
+ */
+
+/** Zend_Exception */
+require_once 'Zend/Exception.php';
+
+/**
+ * @category Zend
+ * @package Zend_Log
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Exception.php 4412 2007-04-06 21:17:32Z zendbot $
+ */
+class Zend_Log_Exception extends Zend_Exception
+{}
diff --git a/libs/Zend/Log/Filter/Interface.php b/libs/Zend/Log/Filter/Interface.php
new file mode 100755
index 0000000000..c42808c826
--- /dev/null
+++ b/libs/Zend/Log/Filter/Interface.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 4389 2007-04-06 15:17:41Z mike $
+ */
+
+/**
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 4389 2007-04-06 15:17:41Z mike $
+ */
+interface Zend_Log_Filter_Interface
+{
+ /**
+ * Returns TRUE to accept the message, FALSE to block it.
+ *
+ * @param array $event event data
+ * @return boolean accepted?
+ */
+ public function accept($event);
+
+}
diff --git a/libs/Zend/Log/Filter/Message.php b/libs/Zend/Log/Filter/Message.php
new file mode 100755
index 0000000000..4da81c4c10
--- /dev/null
+++ b/libs/Zend/Log/Filter/Message.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Message.php 4389 2007-04-06 15:17:41Z mike $
+ */
+
+/** Zend_Log_Filter_Interface */
+require_once 'Zend/Log/Filter/Interface.php';
+
+/**
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Message.php 4389 2007-04-06 15:17:41Z mike $
+ */
+class Zend_Log_Filter_Message implements Zend_Log_Filter_Interface
+{
+ /**
+ * @var string
+ */
+ protected $_regexp;
+
+ /**
+ * Filter out any log messages not matching $regexp.
+ *
+ * @param string $regexp Regular expression to test the log message
+ * @throws Zend_Log_Exception
+ */
+ public function __construct($regexp)
+ {
+ if (@preg_match($regexp, '') === false) {
+ throw new Zend_Log_Exception("Invalid regular expression '$regexp'");
+ }
+ $this->_regexp = $regexp;
+ }
+
+ /**
+ * Returns TRUE to accept the message, FALSE to block it.
+ *
+ * @param array $event event data
+ * @return boolean accepted?
+ */
+ public function accept($event)
+ {
+ return preg_match($this->_regexp, $event['message']) > 0;
+ }
+
+}
diff --git a/libs/Zend/Log/Filter/Priority.php b/libs/Zend/Log/Filter/Priority.php
new file mode 100755
index 0000000000..9c61ff28db
--- /dev/null
+++ b/libs/Zend/Log/Filter/Priority.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Priority.php 4474 2007-04-11 19:56:57Z mike $
+ */
+
+/** Zend_Log_Filter_Interface */
+require_once 'Zend/Log/Filter/Interface.php';
+
+/**
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Priority.php 4474 2007-04-11 19:56:57Z mike $
+ */
+class Zend_Log_Filter_Priority implements Zend_Log_Filter_Interface
+{
+ /**
+ * @var integer
+ */
+ protected $_priority;
+
+ /**
+ * @var string
+ */
+ protected $_operator;
+
+ /**
+ * Filter logging by $priority. By default, it will accept any log
+ * event whose priority value is less than or equal to $priority.
+ *
+ * @param integer $priority Priority
+ * @param string $operator Comparison operator
+ * @throws Zend_Log_Exception
+ */
+ public function __construct($priority, $operator = '<=')
+ {
+ if (! is_integer($priority)) {
+ throw new Zend_Log_Exception('Priority must be an integer');
+ }
+
+ $this->_priority = $priority;
+ $this->_operator = $operator;
+ }
+
+ /**
+ * Returns TRUE to accept the message, FALSE to block it.
+ *
+ * @param array $event event data
+ * @return boolean accepted?
+ */
+ public function accept($event)
+ {
+ return version_compare($event['priority'], $this->_priority, $this->_operator);
+ }
+
+}
diff --git a/libs/Zend/Log/Filter/Suppress.php b/libs/Zend/Log/Filter/Suppress.php
new file mode 100755
index 0000000000..68a88311c7
--- /dev/null
+++ b/libs/Zend/Log/Filter/Suppress.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Suppress.php 4627 2007-04-28 01:29:42Z mike $
+ */
+
+/** Zend_Log_Filter_Interface */
+require_once 'Zend/Log/Filter/Interface.php';
+
+/**
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Filter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Suppress.php 4627 2007-04-28 01:29:42Z mike $
+ */
+class Zend_Log_Filter_Suppress implements Zend_Log_Filter_Interface
+{
+ /**
+ * @var boolean
+ */
+ protected $_accept = true;
+
+ /**
+ * This is a simple boolean filter.
+ *
+ * Call suppress(true) to suppress all log events.
+ * Call suppress(false) to accept all log events.
+ *
+ * @param boolean $suppress Should all log events be suppressed?
+ * @return void
+ */
+ public function suppress($suppress)
+ {
+ $this->_accept = (! $suppress);
+ }
+
+ /**
+ * Returns TRUE to accept the message, FALSE to block it.
+ *
+ * @param array $event event data
+ * @return boolean accepted?
+ */
+ public function accept($event)
+ {
+ return $this->_accept;
+ }
+
+}
diff --git a/libs/Zend/Log/Formatter/Interface.php b/libs/Zend/Log/Formatter/Interface.php
new file mode 100755
index 0000000000..9055156e14
--- /dev/null
+++ b/libs/Zend/Log/Formatter/Interface.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Formatter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 4389 2007-04-06 15:17:41Z mike $
+ */
+
+/**
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Formatter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 4389 2007-04-06 15:17:41Z mike $
+ */
+interface Zend_Log_Formatter_Interface
+{
+ /**
+ * Formats data into a single line to be written by the writer.
+ *
+ * @param array $event event data
+ * @return string formatted line to write to the log
+ */
+ public function format($event);
+
+}
diff --git a/libs/Zend/Log/Formatter/Simple.php b/libs/Zend/Log/Formatter/Simple.php
new file mode 100755
index 0000000000..4202ad9385
--- /dev/null
+++ b/libs/Zend/Log/Formatter/Simple.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Formatter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Simple.php 4389 2007-04-06 15:17:41Z mike $
+ */
+
+/** Zend_Log_Formatter_Interface */
+require_once 'Zend/Log/Formatter/Interface.php';
+
+/**
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Formatter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Simple.php 4389 2007-04-06 15:17:41Z mike $
+ */
+class Zend_Log_Formatter_Simple implements Zend_Log_Formatter_Interface
+{
+ /**
+ * @var string
+ */
+ protected $_format;
+
+ /**
+ * Class constructor
+ *
+ * @param null|string $format Format specifier for log messages
+ * @throws Zend_Log_Exception
+ */
+ public function __construct($format = null)
+ {
+ if ($format === null) {
+ $format = '%timestamp% %priorityName% (%priority%): %message%' . PHP_EOL;
+ }
+
+ if (! is_string($format)) {
+ throw new Zend_Log_Exception('Format must be a string');
+ }
+
+ $this->_format = $format;
+ }
+
+ /**
+ * Formats data into a single line to be written by the writer.
+ *
+ * @param array $event event data
+ * @return string formatted line to write to the log
+ */
+ public function format($event)
+ {
+ $output = $this->_format;
+ foreach ($event as $name => $value) {
+ $output = str_replace("%$name%", $value, $output);
+ }
+ return $output;
+ }
+
+}
diff --git a/libs/Zend/Log/Formatter/Xml.php b/libs/Zend/Log/Formatter/Xml.php
new file mode 100755
index 0000000000..1072fd4764
--- /dev/null
+++ b/libs/Zend/Log/Formatter/Xml.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Formatter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Xml.php 4389 2007-04-06 15:17:41Z mike $
+ */
+
+/** Zend_Log_Formatter_Interface */
+require_once 'Zend/Log/Formatter/Interface.php';
+
+/**
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Formatter
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Xml.php 4389 2007-04-06 15:17:41Z mike $
+ */
+class Zend_Log_Formatter_Xml implements Zend_Log_Formatter_Interface
+{
+ /**
+ * @var Relates XML elements to log data field keys.
+ */
+ protected $_rootElement;
+
+ /**
+ * @var Relates XML elements to log data field keys.
+ */
+ protected $_elementMap;
+
+ /**
+ * Class constructor
+ *
+ * @param array $elementMap
+ */
+ public function __construct($rootElement = 'logEntry', $elementMap = null)
+ {
+ $this->_rootElement = $rootElement;
+ $this->_elementMap = $elementMap;
+ }
+
+ /**
+ * Formats data into a single line to be written by the writer.
+ *
+ * @param array $event event data
+ * @return string formatted line to write to the log
+ */
+ public function format($event)
+ {
+ if ($this->_elementMap === null) {
+ $dataToInsert = $event;
+ } else {
+ $dataToInsert = array();
+ foreach ($this->_elementMap as $elementName => $fieldKey) {
+ $dataToInsert[$elementName] = $event[$fieldKey];
+ }
+ }
+
+ $dom = new DOMDocument();
+ $elt = $dom->appendChild(new DOMElement($this->_rootElement));
+
+ foreach ($dataToInsert as $key => $value) {
+ $elt->appendChild(new DOMElement($key, $value));
+ }
+
+ $xml = $dom->saveXML();
+ $xml = preg_replace('/<\?xml version="1.0"( encoding="[^\"]*")?\?>\n/u', '', $xml);
+
+ return $xml . PHP_EOL;
+ }
+
+}
diff --git a/libs/Zend/Log/Writer/Abstract.php b/libs/Zend/Log/Writer/Abstract.php
new file mode 100755
index 0000000000..89966c0f7f
--- /dev/null
+++ b/libs/Zend/Log/Writer/Abstract.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Writer
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Abstract.php 4560 2007-04-20 08:01:32Z mike $
+ */
+
+/** Zend_Log_Filter_Priority */
+require_once 'Zend/Log/Filter/Priority.php';
+
+/** Zend_Log_Exception */
+require_once 'Zend/Log/Exception.php';
+
+/**
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Writer
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Abstract.php 4560 2007-04-20 08:01:32Z mike $
+ */
+abstract class Zend_Log_Writer_Abstract
+{
+ /**
+ * @var array of Zend_Log_Filter_Interface
+ */
+ protected $_filters = array();
+
+ /**
+ * Formats the log message before writing.
+ * @var Zend_Log_Formatter_Interface
+ */
+ protected $_formatter;
+
+ /**
+ * Add a filter specific to this writer.
+ *
+ * @param Zend_Log_Filter_Interface $filter
+ * @return void
+ */
+ public function addFilter($filter)
+ {
+ if (is_integer($filter)) {
+ $filter = new Zend_Log_Filter_Priority($filter);
+ }
+
+ $this->_filters[] = $filter;
+ }
+
+ /**
+ * Log a message to this writer.
+ *
+ * @param array $event log data event
+ * @return void
+ */
+ public function write($event)
+ {
+ foreach ($this->_filters as $filter) {
+ if (! $filter->accept($event)) {
+ return;
+ }
+ }
+
+ // exception occurs on error
+ $this->_write($event);
+ }
+
+ /**
+ * Set a new formatter for this writer
+ *
+ * @param Zend_Log_Formatter_Interface $formatter
+ * @return void
+ */
+ public function setFormatter($formatter) {
+ $this->_formatter = $formatter;
+ }
+
+ /**
+ * Perform shutdown activites such as closing open resources
+ *
+ * @return void
+ */
+ public function shutdown()
+ {}
+
+ /**
+ * Write a message to the log.
+ *
+ * @param array $event log data event
+ * @return void
+ */
+ abstract protected function _write($event);
+
+} \ No newline at end of file
diff --git a/libs/Zend/Log/Writer/Db.php b/libs/Zend/Log/Writer/Db.php
new file mode 100755
index 0000000000..540b98312d
--- /dev/null
+++ b/libs/Zend/Log/Writer/Db.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Writer
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Db.php 5453 2007-06-26 17:03:01Z bkarwin $
+ */
+
+/** Zend_Log_Writer_Abstract */
+require_once 'Zend/Log/Writer/Abstract.php';
+
+/**
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Writer
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Db.php 5453 2007-06-26 17:03:01Z bkarwin $
+ */
+class Zend_Log_Writer_Db extends Zend_Log_Writer_Abstract
+{
+ /**
+ * Database adapter instance
+ * @var Zend_Db_Adapter
+ */
+ private $_db;
+
+ /**
+ * Name of the log table in the database
+ * @var string
+ */
+ private $_table;
+
+ /**
+ * Relates database columns names to log data field keys.
+ *
+ * @var null|array
+ */
+ private $_columnMap;
+
+ /**
+ * Class constructor
+ *
+ * @param Zend_Db_Adapter $db Database adapter instance
+ * @param string $table Log table in database
+ * @param array $columnMap
+ */
+ public function __construct($db, $table, $columnMap = null)
+ {
+ $this->_db = $db;
+ $this->_table = $table;
+ $this->_columnMap = $columnMap;
+ }
+
+ /**
+ * Formatting is not possible on this writer
+ */
+ public function setFormatter($formatter)
+ {
+ throw new Zend_Log_Exception(get_class() . ' does not support formatting');
+ }
+
+ /**
+ * Remove reference to database adapter
+ *
+ * @return void
+ */
+ public function shutdown()
+ {
+ $this->_db = null;
+ }
+
+ /**
+ * Write a message to the log.
+ *
+ * @param array $event event data
+ * @return void
+ */
+ protected function _write($event)
+ {
+ if ($this->_db === null) {
+ throw new Zend_Log_Exception('Database adapter instance has been removed by shutdown');
+ }
+
+ if ($this->_columnMap === null) {
+ $dataToInsert = $event;
+ } else {
+ $dataToInsert = array();
+ foreach ($this->_columnMap as $columnName => $fieldKey) {
+ $dataToInsert[$columnName] = $event[$fieldKey];
+ }
+ }
+
+ $this->_db->insert($this->_table, $dataToInsert);
+ }
+
+}
diff --git a/libs/Zend/Log/Writer/Mock.php b/libs/Zend/Log/Writer/Mock.php
new file mode 100755
index 0000000000..8ed990692a
--- /dev/null
+++ b/libs/Zend/Log/Writer/Mock.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Writer
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Null.php 3980 2007-03-15 21:38:38Z mike $
+ */
+
+/** Zend_Log_Writer_Abstract */
+require_once 'Zend/Log/Writer/Abstract.php';
+
+/**
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Writer
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Null.php 3980 2007-03-15 21:38:38Z mike $
+ */
+class Zend_Log_Writer_Mock extends Zend_Log_Writer_Abstract
+{
+ /**
+ * array of log events
+ */
+ public $events = array();
+
+ /**
+ * shutdown called?
+ */
+ public $shutdown = false;
+
+ /**
+ * Write a message to the log.
+ *
+ * @param array $event event data
+ * @return void
+ */
+ public function _write($event)
+ {
+ $this->events[] = $event;
+ }
+
+ /**
+ * Record shutdown
+ *
+ * @return void
+ */
+ public function shutdown()
+ {
+ $this->shutdown = true;
+ }
+} \ No newline at end of file
diff --git a/libs/Zend/Log/Writer/Null.php b/libs/Zend/Log/Writer/Null.php
new file mode 100755
index 0000000000..319dbc5da7
--- /dev/null
+++ b/libs/Zend/Log/Writer/Null.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Writer
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Null.php 4389 2007-04-06 15:17:41Z mike $
+ */
+
+/** Zend_Log_Writer_Abstract */
+require_once 'Zend/Log/Writer/Abstract.php';
+
+/**
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Writer
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Null.php 4389 2007-04-06 15:17:41Z mike $
+ */
+class Zend_Log_Writer_Null extends Zend_Log_Writer_Abstract
+{
+ /**
+ * Write a message to the log.
+ *
+ * @param array $event event data
+ * @return void
+ */
+ protected function _write($event)
+ {
+ }
+
+} \ No newline at end of file
diff --git a/libs/Zend/Log/Writer/Stream.php b/libs/Zend/Log/Writer/Stream.php
new file mode 100755
index 0000000000..206a1251ab
--- /dev/null
+++ b/libs/Zend/Log/Writer/Stream.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Writer
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Stream.php 4560 2007-04-20 08:01:32Z mike $
+ */
+
+/** Zend_Log_Writer_Abstract */
+require_once 'Zend/Log/Writer/Abstract.php';
+
+/** Zend_Log_Formatter_Simple */
+require_once 'Zend/Log/Formatter/Simple.php';
+
+/**
+ * @category Zend
+ * @package Zend_Log
+ * @subpackage Writer
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Stream.php 4560 2007-04-20 08:01:32Z mike $
+ */
+class Zend_Log_Writer_Stream extends Zend_Log_Writer_Abstract
+{
+ /**
+ * Holds the PHP stream to log to.
+ * @var null|stream
+ */
+ protected $_stream = null;
+
+ /**
+ * Class Constructor
+ *
+ * @param streamOrUrl Stream or URL to open as a stream
+ * @param mode Mode, only applicable if a URL is given
+ */
+ public function __construct($streamOrUrl, $mode = 'a')
+ {
+ if (is_resource($streamOrUrl)) {
+ if (get_resource_type($streamOrUrl) != 'stream') {
+ throw new Zend_Log_Exception('Resource is not a stream');
+ }
+
+ if ($mode != 'a') {
+ throw new Zend_Log_Exception('Mode cannot be changed on existing streams');
+ }
+
+ $this->_stream = $streamOrUrl;
+ } else {
+ if (! $this->_stream = @fopen($streamOrUrl, $mode, false)) {
+ $msg = "\"$streamOrUrl\" cannot be opened with mode \"$mode\"";
+ throw new Zend_Log_Exception($msg);
+ }
+ }
+
+ $this->_formatter = new Zend_Log_Formatter_Simple();
+ }
+
+ /**
+ * Close the stream resource.
+ *
+ * @return void
+ */
+ public function shutdown()
+ {
+ if (is_resource($this->_stream)) {
+ fclose($this->_stream);
+ }
+ }
+
+ /**
+ * Write a message to the log.
+ *
+ * @param array $event event data
+ * @return void
+ */
+ protected function _write($event)
+ {
+ $line = $this->_formatter->format($event);
+
+ if (! @fwrite($this->_stream, $line)) {
+ throw new Zend_Log_Exception("Unable to write to stream");
+ }
+ }
+
+}
diff --git a/libs/Zend/Mail.php b/libs/Zend/Mail.php
new file mode 100755
index 0000000000..59201a4ce2
--- /dev/null
+++ b/libs/Zend/Mail.php
@@ -0,0 +1,649 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Mail_Exception
+ */
+require_once 'Zend/Mail/Exception.php';
+
+/**
+ * Zend_Mail_Transport_Abstract
+ */
+require_once 'Zend/Mail/Transport/Abstract.php';
+
+/**
+ * Zend_Mime
+ */
+require_once 'Zend/Mime.php';
+
+/**
+ * Zend_Mail_Transport_Abstract
+ */
+require_once 'Zend/Mail/Transport/Abstract.php';
+
+/**
+ * Zend_Mime_Message
+ */
+require_once 'Zend/Mime/Message.php';
+
+/**
+ * Zend_Mime_Part
+ */
+require_once 'Zend/Mime/Part.php';
+
+
+/**
+ * Class for sending an email.
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mail extends Zend_Mime_Message
+{
+ /**#@+
+ * @access protected
+ */
+
+ /**
+ * @var Zend_Mail_Transport_Abstract
+ * @static
+ */
+ protected static $_defaultTransport = null;
+
+ /**
+ * Mail character set
+ * @var string
+ */
+ protected $_charset = null;
+
+ /**
+ * Mail headers
+ * @var array
+ */
+ protected $_headers = array();
+
+ /**
+ * From: address
+ * @var string
+ */
+ protected $_from = null;
+
+ /**
+ * To: addresses
+ * @var array
+ */
+ protected $_to = array();
+
+ /**
+ * Array of all recipients
+ * @var array
+ */
+ protected $_recipients = array();
+
+ /**
+ * Return-Path header
+ * @var string
+ */
+ protected $_returnPath = null;
+
+ /**
+ * Subject: header
+ * @var string
+ */
+ protected $_subject = null;
+
+ /**
+ * text/plain MIME part
+ * @var false|Zend_Mime_Part
+ */
+ protected $_bodyText = false;
+
+ /**
+ * text/html MIME part
+ * @var false|Zend_Mime_Part
+ */
+ protected $_bodyHtml = false;
+
+ /**
+ * MIME boundary string
+ * @var string
+ */
+ protected $_mimeBoundary = null;
+
+ /**
+ * Content type of the message
+ * @var string
+ */
+ protected $_type = null;
+
+ /**#@-*/
+
+ /**
+ * Flag: whether or not email has attachments
+ * @var boolean
+ */
+ public $hasAttachments = false;
+
+
+ /**
+ * Sets the default mail transport for all following uses of
+ * Zend_Mail::send();
+ *
+ * @todo Allow passing a string to indicate the transport to load
+ * @todo Allow passing in optional options for the transport to load
+ * @param Zend_Mail_Transport_Abstract $transport
+ */
+ public static function setDefaultTransport(Zend_Mail_Transport_Abstract $transport)
+ {
+ self::$_defaultTransport = $transport;
+ }
+
+ /**
+ * Public constructor
+ *
+ * @param string $charset
+ */
+ public function __construct($charset='iso-8859-1')
+ {
+ $this->_charset = $charset;
+ }
+
+ /**
+ * Return charset string
+ *
+ * @return string
+ */
+ public function getCharset()
+ {
+ return $this->_charset;
+ }
+
+ /**
+ * Set content type
+ *
+ * Should only be used for manually setting multipart content types.
+ *
+ * @param string $type Content type
+ * @return Zend_Mail Implements fluent interface
+ * @throws Zend_Mail_Exception for types not supported by Zend_Mime
+ */
+ public function setType($type)
+ {
+ $allowed = array(
+ Zend_Mime::MULTIPART_ALTERNATIVE,
+ Zend_Mime::MULTIPART_MIXED,
+ Zend_Mime::MULTIPART_RELATED,
+ );
+ if (!in_array($type, $allowed)) {
+ throw new Zend_Mail_Exception('Invalid content type "' . $type . '"');
+ }
+
+ $this->_type = $type;
+ return $this;
+ }
+
+ /**
+ * Get content type of the message
+ *
+ * @return string
+ */
+ public function getType()
+ {
+ return $this->_type;
+ }
+
+ /**
+ * Set an arbitrary mime boundary for the message
+ *
+ * If not set, Zend_Mime will generate one.
+ *
+ * @param string $boundary
+ * @return Zend_Mail Provides fluent interface
+ */
+ public function setMimeBoundary($boundary)
+ {
+ $this->_mimeBoundary = $boundary;
+ }
+
+ /**
+ * Return the boundary string used for the message
+ *
+ * @return string
+ */
+ public function getMimeBoundary()
+ {
+ return $this->_mimeBoundary;
+ }
+
+ /**
+ * Sets the text body for the message.
+ *
+ * @param string $txt
+ * @param string $charset
+ * @param string $encoding
+ * @return Zend_Mail Provides fluent interface
+ */
+ public function setBodyText($txt, $charset = null, $encoding = Zend_Mime::ENCODING_QUOTEDPRINTABLE)
+ {
+ if ($charset === null) {
+ $charset = $this->_charset;
+ }
+
+ $mp = new Zend_Mime_Part($txt);
+ $mp->encoding = $encoding;
+ $mp->type = Zend_Mime::TYPE_TEXT;
+ $mp->disposition = Zend_Mime::DISPOSITION_INLINE;
+ $mp->charset = $charset;
+
+ $this->_bodyText = $mp;
+
+ return $this;
+ }
+
+ /**
+ * Return text body Zend_Mime_Part or string
+ *
+ * @param bool textOnly Whether to return just the body text content or the MIME part; defaults to false, the MIME part
+ * @return false|Zend_Mime_Part|string
+ */
+ public function getBodyText($textOnly = false)
+ {
+ if ($textOnly && $this->_bodyText) {
+ $body = $this->_bodyText;
+ return $body->getContent();
+ }
+
+ return $this->_bodyText;
+ }
+
+ /**
+ * Sets the HTML body for the message
+ *
+ * @param string $html
+ * @param string $charset
+ * @param string $encoding
+ * @return Zend_Mail Provides fluent interface
+ */
+ public function setBodyHtml($html, $charset = null, $encoding = Zend_Mime::ENCODING_QUOTEDPRINTABLE)
+ {
+ if ($charset === null) {
+ $charset = $this->_charset;
+ }
+
+ $mp = new Zend_Mime_Part($html);
+ $mp->encoding = $encoding;
+ $mp->type = Zend_Mime::TYPE_HTML;
+ $mp->disposition = Zend_Mime::DISPOSITION_INLINE;
+ $mp->charset = $charset;
+
+ $this->_bodyHtml = $mp;
+
+ return $this;
+ }
+
+ /**
+ * Return Zend_Mime_Part representing body HTML
+ *
+ * @param bool $htmlOnly Whether to return the body HTML only, or the MIME part; defaults to false, the MIME part
+ * @return false|Zend_Mime_Part|string
+ */
+ public function getBodyHtml($htmlOnly = false)
+ {
+ if ($htmlOnly && $this->_bodyHtml) {
+ $body = $this->_bodyHtml;
+ return $body->getContent();
+ }
+
+ return $this->_bodyHtml;
+ }
+
+ /**
+ * Adds an existing attachment to the mail message
+ *
+ * @param Zend_Mime_Part $attachment
+ * @return Zend_Mail Provides fluent interface
+ */
+ public function addAttachment(Zend_Mime_Part $attachment)
+ {
+ $this->addPart($attachment);
+ $this->hasAttachments = true;
+
+ return $this;
+ }
+
+ /**
+ * Creates a Zend_Mime_Part attachment
+ *
+ * Attachment is automatically added to the mail object after creation. The
+ * attachment object is returned to allow for further manipulation.
+ *
+ * @param string $body
+ * @param string $mimeType
+ * @param string $disposition
+ * @param string $encoding
+ * @param string $filename OPTIONAL A filename for the attachment
+ * @return Zend_Mime_Part Newly created Zend_Mime_Part object (to allow
+ * advanced settings)
+ */
+ public function createAttachment($body,
+ $mimeType = Zend_Mime::TYPE_OCTETSTREAM,
+ $disposition = Zend_Mime::DISPOSITION_ATTACHMENT,
+ $encoding = Zend_Mime::ENCODING_BASE64,
+ $filename = null)
+ {
+
+ $mp = new Zend_Mime_Part($body);
+ $mp->encoding = $encoding;
+ $mp->type = $mimeType;
+ $mp->disposition = $disposition;
+ $mp->filename = $filename;
+
+ $this->addAttachment($mp);
+
+ return $mp;
+ }
+
+ /**
+ * Return a count of message parts
+ *
+ * @return void
+ */
+ public function getPartCount()
+ {
+ return count($this->_parts);
+ }
+
+ /**
+ * Encode header fields
+ *
+ * Encodes header content according to RFC1522 if it contains non-printable
+ * characters.
+ *
+ * @param string $value
+ * @return string
+ */
+ protected function _encodeHeader($value)
+ {
+ if (Zend_Mime::isPrintable($value)) {
+ return $value;
+ } else {
+ $quotedValue = Zend_Mime::encodeQuotedPrintable($value);
+ $quotedValue = str_replace(array('?', ' '), array('=3F', '=20'), $quotedValue);
+ return '=?' . $this->_charset . '?Q?' . $quotedValue . '?=';
+ }
+ }
+
+ /**
+ * Add a header to the message
+ *
+ * Adds a header to this message. If append is true and the header already
+ * exists, raises a flag indicating that the header should be appended.
+ *
+ * @param string $headerName
+ * @param string $value
+ * @param boolean $append
+ */
+ protected function _storeHeader($headerName, $value, $append=false)
+ {
+ $value = strtr($value,"\r\n\t",'???');
+ if (isset($this->_headers[$headerName])) {
+ $this->_headers[$headerName][] = $value;
+ } else {
+ $this->_headers[$headerName] = array($value);
+ }
+
+ if ($append) {
+ $this->_headers[$headerName]['append'] = true;
+ }
+
+ }
+
+ /**
+ * Add a recipient
+ *
+ * @param string $email
+ */
+ protected function _addRecipient($email, $to = false)
+ {
+ // prevent duplicates
+ $this->_recipients[$email] = 1;
+
+ if ($to) {
+ $this->_to[] = $email;
+ }
+ }
+
+ /**
+ * Helper function for adding a recipient and the corresponding header
+ *
+ * @param string $headerName
+ * @param string $name
+ * @param string $email
+ */
+ protected function _addRecipientAndHeader($headerName, $name, $email)
+ {
+ $email = strtr($email,"\r\n\t",'???');
+ $this->_addRecipient($email, ('To' == $headerName) ? true : false);
+ if ($name != '') {
+ $name = '"' . $this->_encodeHeader($name) . '" ';
+ }
+
+ $this->_storeHeader($headerName, $name .'<'. $email . '>', true);
+ }
+
+ /**
+ * Adds To-header and recipient
+ *
+ * @param string $name
+ * @param string $email
+ * @return Zend_Mail Provides fluent interface
+ */
+ public function addTo($email, $name='')
+ {
+ $this->_addRecipientAndHeader('To', $name, $email);
+ return $this;
+ }
+
+ /**
+ * Adds Cc-header and recipient
+ *
+ * @param string $name
+ * @param string $email
+ * @return Zend_Mail Provides fluent interface
+ */
+ public function addCc($email, $name='')
+ {
+ $this->_addRecipientAndHeader('Cc', $name, $email);
+ return $this;
+ }
+
+ /**
+ * Adds Bcc recipient
+ *
+ * @param string $email
+ * @return Zend_Mail Provides fluent interface
+ */
+ public function addBcc($email)
+ {
+ $this->_addRecipientAndHeader('Bcc', '', $email);
+ return $this;
+ }
+
+ /**
+ * Return list of recipient email addresses
+ *
+ * @return array (of strings)
+ */
+ public function getRecipients()
+ {
+ return array_keys($this->_recipients);
+ }
+
+ /**
+ * Sets From-header and sender of the message
+ *
+ * @param string $email
+ * @param string $name
+ * @return Zend_Mail Provides fluent interface
+ * @throws Zend_Mail_Exception if called subsequent times
+ */
+ public function setFrom($email, $name = '')
+ {
+ if ($this->_from === null) {
+ $email = strtr($email,"\r\n\t",'???');
+ $this->_from = $email;
+ $this->_storeHeader('From', $this->_encodeHeader('"'.$name.'"').' <'.$email.'>', true);
+ } else {
+ throw new Zend_Mail_Exception('From Header set twice');
+ }
+ return $this;
+ }
+
+ /**
+ * Returns the sender of the mail
+ *
+ * @return string
+ */
+ public function getFrom()
+ {
+ return $this->_from;
+ }
+
+ /**
+ * Sets the Return-Path header for an email
+ *
+ * @param string $email
+ * @return Zend_Mail Provides fluent interface
+ * @throws Zend_Mail_Exception if set multiple times
+ */
+ public function setReturnPath($email)
+ {
+ if ($this->_returnPath === null) {
+ $email = strtr($email,"\r\n\t",'???');
+ $this->_returnPath = $email;
+ $this->_storeHeader('Return-Path', $email, false);
+ } else {
+ throw new Zend_Mail_Exception('Return-Path Header set twice');
+ }
+ return $this;
+ }
+
+ /**
+ * Returns the current Return-Path address for the email
+ *
+ * If no Return-Path header is set, returns the value of {@link $_from}.
+ *
+ * @return string
+ */
+ public function getReturnPath()
+ {
+ if (null !== $this->_returnPath) {
+ return $this->_returnPath;
+ }
+
+ return $this->_from;
+ }
+
+ /**
+ * Sets the subject of the message
+ *
+ * @param string $subject
+ * @return Zend_Mail Provides fluent interface
+ */
+ public function setSubject($subject)
+ {
+ if ($this->_subject === null) {
+ $subject = strtr($subject,"\r\n\t",'???');
+ $this->_subject = $this->_encodeHeader($subject);
+ $this->_storeHeader('Subject', $this->_subject);
+ } else {
+ throw new Zend_Mail_Exception('Subject set twice');
+ }
+ return $this;
+ }
+
+ /**
+ * Returns the encoded subject of the message
+ *
+ * @return string
+ */
+ public function getSubject()
+ {
+ return $this->_subject;
+ }
+
+ /**
+ * Add a custom header to the message
+ *
+ * @param string $name
+ * @param string $value
+ * @param boolean $append
+ * @return Zend_Mail Provides fluent interface
+ * @throws Zend_Mail_Exception on attempts to create standard headers
+ */
+ public function addHeader($name, $value, $append = false)
+ {
+ if (in_array(strtolower($name), array('to', 'cc', 'bcc', 'from', 'subject', 'return-path'))) {
+ throw new Zend_Mail_Exception('Cannot set standard header from addHeader()');
+ }
+
+ $value = strtr($value,"\r\n\t",'???');
+ $value = $this->_encodeHeader($value);
+ $this->_storeHeader($name, $value, $append);
+ }
+
+ /**
+ * Return mail headers
+ *
+ * @return void
+ */
+ public function getHeaders()
+ {
+ return $this->_headers;
+ }
+
+ /**
+ * Sends this email using the given transport or a previously
+ * set DefaultTransport or the internal mail function if no
+ * default transport had been set.
+ *
+ * @param Zend_Mail_Transport_Abstract $transport
+ * @return Zend_Mail Provides fluent interface
+ */
+ public function send($transport = null)
+ {
+ if ($transport === null) {
+ if (! self::$_defaultTransport instanceof Zend_Mail_Transport_Abstract) {
+ require_once 'Zend/Mail/Transport/Sendmail.php';
+ $transport = new Zend_Mail_Transport_Sendmail();
+ } else {
+ $transport = self::$_defaultTransport;
+ }
+ }
+
+ $transport->send($this);
+
+ return $this;
+ }
+
+}
diff --git a/libs/Zend/Mail/Exception.php b/libs/Zend/Mail/Exception.php
new file mode 100755
index 0000000000..6cb4262caf
--- /dev/null
+++ b/libs/Zend/Mail/Exception.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mail_Exception extends Zend_Exception
+{}
+
diff --git a/libs/Zend/Mail/Message.php b/libs/Zend/Mail/Message.php
new file mode 100755
index 0000000000..bdb2f72516
--- /dev/null
+++ b/libs/Zend/Mail/Message.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/**
+ * Zend_Mail_Exception
+ */
+require_once 'Zend/Mail/Exception.php';
+
+/**
+ * Zend_Mail_Part
+ */
+require_once 'Zend/Mail/Part.php';
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Mail_Message extends Zend_Mail_Part
+{
+ /**
+ * flags for this message
+ * @var array
+ */
+ protected $_flags = array();
+
+ /**
+ * Public constructor
+ *
+ * In addition to the parameters of Zend_Mail_Part::__construct() this constructor supports:
+ * - file filename or file handle of a file with raw message content
+ * - flags array with flags for message, keys are ignored, use constants defined in Zend_Mail_Storage
+ *
+ * @param string $rawMessage full message with or without headers
+ * @throws Zend_Mail_Exception
+ */
+ public function __construct(array $params)
+ {
+ if (isset($params['file'])) {
+ if (!is_resource($params['file'])) {
+ $params['raw'] = @file_get_contents($params['file']);
+ if ($params['raw'] === false) {
+ throw new Zend_Mail_Exception('could not open file');
+ }
+ } else {
+ $params['raw'] = stream_get_contents($params['file']);
+ }
+ }
+
+ if (!empty($params['flags'])) {
+ // set key and value to the same value for easy lookup
+ $this->_flags = array_combine($params['flags'], $params['flags']);
+ }
+
+ parent::__construct($params);
+ }
+
+ /**
+ * return toplines as found after headers
+ *
+ * @return string toplines
+ */
+ public function getTopLines()
+ {
+ return $this->_topLines;
+ }
+
+ /**
+ * check if flag is set
+ *
+ * @param mixed $flag a flag name, use constants defined in Zend_Mail_Storage
+ * @return bool true if set, otherwise false
+ */
+ public function hasFlag($flag)
+ {
+ return isset($this->_flags[$flag]);
+ }
+
+ /**
+ * get all set flags
+ *
+ * @return array array with flags, key and value are the same for easy lookup
+ */
+ public function getFlags()
+ {
+ return $this->_flags;
+ }
+}
diff --git a/libs/Zend/Mail/Part.php b/libs/Zend/Mail/Part.php
new file mode 100755
index 0000000000..dbc33d53ff
--- /dev/null
+++ b/libs/Zend/Mail/Part.php
@@ -0,0 +1,422 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/**
+ * Zend_Mime_Decode
+ */
+require_once 'Zend/Mime/Decode.php';
+
+/**
+ * Zend_Mail_Exception
+ */
+require_once 'Zend/Mail/Exception.php';
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Mail_Part implements RecursiveIterator
+{
+ /**
+ * headers of part as array
+ * @var null|array
+ */
+ protected $_headers;
+
+ /**
+ * raw part body
+ * @var null|string
+ */
+ protected $_content;
+
+ /**
+ * toplines as fetched with headers
+ * @var string
+ */
+ protected $_topLines = '';
+
+ /**
+ * parts of multipart message
+ * @var array
+ */
+ protected $_parts = array();
+
+ /**
+ * count of parts of a multipart message
+ * @var null|int
+ */
+ protected $_countParts;
+
+ /**
+ * current position of iterator
+ * @var int
+ */
+ protected $_iterationPos = 1;
+
+ /**
+ * mail handler, if late fetch is active
+ * @var null|Zend_Mail_Storage_Abstract
+ */
+ protected $_mail;
+
+ /**
+ * message number for mail handler
+ * @var int
+ */
+ protected $_messageNum = 0;
+
+ /**
+ * Public constructor
+ *
+ * Zend_Mail_Part supports different sources for content. The possible params are:
+ * - handler a instance of Zend_Mail_Storage_Abstract for late fetch
+ * - id number of message for handler
+ * - raw raw content with header and body as string
+ * - headers headers as array (name => value) or string, if a content part is found it's used as toplines
+ * - noToplines ignore content found after headers in param 'headers'
+ * - content content as string
+ *
+ * @param array $params full message with or without headers
+ */
+ public function __construct(array $params)
+ {
+ if (isset($params['handler'])) {
+ if (!$params['handler'] instanceof Zend_Mail_Storage_Abstract) {
+ throw new Zend_Mail_Exception('handler is not a valid mail handler');
+ }
+ if (!isset($params['id'])) {
+ throw new Zend_Mail_Exception('need a message id with a handler');
+ }
+
+ $this->_mail = $params['handler'];
+ $this->_messageNum = $params['id'];
+ }
+
+ if (isset($params['raw'])) {
+ Zend_Mime_Decode::splitMessage($params['raw'], $this->_headers, $this->_content);
+ } else if (isset($params['headers'])) {
+ if (is_array($params['headers'])) {
+ $this->_headers = $params['headers'];
+ } else {
+ if (!empty($params['noToplines'])) {
+ Zend_Mime_Decode::splitMessage($params['headers'], $this->_headers, $null);
+ } else {
+ Zend_Mime_Decode::splitMessage($params['headers'], $this->_headers, $this->_topLines);
+ }
+ }
+ if (isset($params['content'])) {
+ $this->_content = $params['content'];
+ }
+ }
+ }
+
+ /**
+ * Check if part is a multipart message
+ *
+ * @return bool if part is multipart
+ */
+ public function isMultipart()
+ {
+ try {
+ return strpos($this->contentType, 'multipart/') === 0;
+ } catch(Zend_Mail_Exception $e) {
+ return false;
+ }
+ }
+
+
+ /**
+ * Body of part
+ *
+ * If part is multipart the raw content of this part with all sub parts is returned
+ *
+ * @return string body
+ * @throws Zend_Mail_Exception
+ */
+ public function getContent()
+ {
+ if ($this->_content !== null) {
+ return $this->_content;
+ }
+
+ if ($this->_mail) {
+ return $this->_mail->getRawContent($this->_messageNum);
+ } else {
+ throw new Zend_Mail_Exception('no content');
+ }
+ }
+
+ /**
+ * Cache content and split in parts if multipart
+ *
+ * @return null
+ * @throws Zend_Mail_Exception
+ */
+ protected function _cacheContent()
+ {
+ // caching content if we can't fetch parts
+ if ($this->_content === null && $this->_mail) {
+ $this->_content = $this->_mail->getRawContent($this->_messageNum);
+ }
+
+ if (!$this->isMultipart()) {
+ return;
+ }
+
+ // split content in parts
+ $boundary = Zend_Mime_Decode::splitContentType($this->contentType, 'boundary');
+ if (!$boundary) {
+ throw new Zend_Mail_Exception('no boundary found in content type to split message');
+ }
+ $parts = Zend_Mime_Decode::splitMessageStruct($this->_content, $boundary);
+ $counter = 1;
+ foreach ($parts as $part) {
+ $this->_parts[$counter++] = new self(array('headers' => $part['header'], 'content' => $part['body']));
+ }
+ }
+
+ /**
+ * Get part of multipart message
+ *
+ * @param int $num number of part starting with 1 for first part
+ * @return Zend_Mail_Part wanted part
+ * @throws Zend_Mail_Exception
+ */
+ public function getPart($num)
+ {
+ if (isset($this->_parts[$num])) {
+ return $this->_parts[$num];
+ }
+
+ if (!$this->_mail && $this->_content === null) {
+ throw new Zend_Mail_Exception('part not found');
+ }
+
+ if ($this->_mail && $this->_mail->hasFetchPart) {
+ // TODO: fetch part
+ // return
+ }
+
+ $this->_cacheContent();
+
+ if (!isset($this->_parts[$num])) {
+ throw new Zend_Mail_Exception('part not found');
+ }
+
+ return $this->_parts[$num];
+ }
+
+ /**
+ * Count parts of a multipart part
+ *
+ * @return int number of sub-parts
+ */
+ public function countParts()
+ {
+ if ($this->_countParts) {
+ return $this->_countParts;
+ }
+
+ $this->_countParts = count($this->_parts);
+ if ($this->_countParts) {
+ return $this->_countParts;
+ }
+
+ if ($this->_mail && $this->_mail->hasFetchPart) {
+ // TODO: fetch part
+ // return
+ }
+
+ $this->_cacheContent();
+
+ $this->_countParts = count($this->_parts);
+ return $this->_countParts;
+ }
+
+
+ /**
+ * Get all headers
+ *
+ * The returned headers are as saved internally. All names are lowercased. The value is a string or an array
+ * if a header with the same name occurs more than once.
+ *
+ * @return array headers as array(name => value)
+ */
+ public function getHeaders()
+ {
+ if ($this->_headers === null) {
+ if (!$this->_mail) {
+ $this->_headers = array();
+ } else {
+ $part = $this->_mail->getRawHeader($this->_messageNum);
+ Zend_Mime_Decode::splitMessage($part, $this->_headers, $null);
+ }
+ }
+
+ return $this->_headers;
+ }
+
+ /**
+ * Get a header in specificed format
+ *
+ * Internally headers that occur more than once are saved as array, all other as string. If $format
+ * is set to string implode is used to concat the values (with Zend_Mime::LINEEND as delim).
+ *
+ * @param string $name name of header, matches case-insensitive, but camel-case is replaced with dashes
+ * @param string $format change type of return value to 'string' or 'array'
+ * @return string|array value of header in wanted or internal format
+ * @throws Zend_Mail_Exception
+ */
+ public function getHeader($name, $format = null)
+ {
+ if ($this->_headers === null) {
+ $this->getHeaders();
+ }
+
+ $lowerName = strtolower($name);
+
+ if (!isset($this->_headers[$lowerName])) {
+ $lowerName = strtolower(preg_replace('%([a-z])([A-Z])%', '\1-\2', $name));
+ if (!isset($this->_headers[$lowerName])) {
+ throw new Zend_Mail_Exception("no Header with Name $name found");
+ }
+ }
+ $name = $lowerName;
+
+ $header = $this->_headers[$name];
+
+ switch ($format) {
+ case 'string':
+ if (is_array($header)) {
+ $header = implode(Zend_Mime::LINEEND, $header);
+ }
+ break;
+ case 'array':
+ $header = (array)$header;
+ default:
+ // do nothing
+ }
+
+ return $header;
+ }
+
+
+ /**
+ * Getter for mail headers - name is matched in lowercase
+ *
+ * This getter is short for Zend_Mail_Part::getHeader($name, 'string')
+ *
+ * @see Zend_Mail_Part::getHeader()
+ *
+ * @param string $name header name
+ * @return string value of header
+ * @throws Zend_Mail_Exception
+ */
+ public function __get($name)
+ {
+ return $this->getHeader($name, 'string');
+ }
+
+ /**
+ * magic method to get content of part
+ *
+ * @return string content
+ */
+ public function __toString()
+ {
+ return $this->getContent();
+ }
+
+ /**
+ * implements RecursiveIterator::hasChildren()
+ *
+ * @return bool current element has children/is multipart
+ */
+ public function hasChildren()
+ {
+ $current = $this->current();
+ return $current && $current instanceof Zend_Mail_Part && $current->isMultipart();
+ }
+
+ /**
+ * implements RecursiveIterator::getChildren()
+ *
+ * @return Zend_Mail_Part same as self::current()
+ */
+ public function getChildren()
+ {
+ return $this->current();
+ }
+
+ /**
+ * implements Iterator::valid()
+ *
+ * @return bool check if there's a current element
+ */
+ public function valid()
+ {
+ if ($this->_countParts === null) {
+ $this->countParts();
+ }
+ return $this->_iterationPos && $this->_iterationPos <= $this->_countParts;
+ }
+
+ /**
+ * implements Iterator::next()
+ *
+ * @return null
+ */
+ public function next()
+ {
+ ++$this->_iterationPos;
+ }
+
+ /**
+ * implements Iterator::key()
+ *
+ * @return string key/number of current part
+ */
+ public function key()
+ {
+ return $this->_iterationPos;
+ }
+
+ /**
+ * implements Iterator::current()
+ *
+ * @return Zend_Mail_Part current part
+ */
+ public function current()
+ {
+ return $this->getPart($this->_iterationPos);
+ }
+
+ /**
+ * implements Iterator::rewind()
+ *
+ * @return null
+ */
+ public function rewind()
+ {
+ $this->countParts();
+ $this->_iterationPos = 1;
+ }
+}
diff --git a/libs/Zend/Mail/Protocol/Abstract.php b/libs/Zend/Mail/Protocol/Abstract.php
new file mode 100755
index 0000000000..948ef38bd1
--- /dev/null
+++ b/libs/Zend/Mail/Protocol/Abstract.php
@@ -0,0 +1,358 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Protocol
+ * @version $Id$
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Validate
+ */
+require_once 'Zend/Validate.php';
+
+
+/**
+ * Zend_Validate_Hostname
+ */
+require_once 'Zend/Validate/Hostname.php';
+
+
+/**
+ * Zend_Mail_Protocol_Abstract
+ *
+ * Provides low-level methods for concrete adapters to communicate with a remote mail server and track requests and responses.
+ *
+ * @todo Implement proxy settings
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Protocol
+ * @throws Zend_Mail_Protocol_Exception
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Mail_Protocol_Abstract
+{
+ /**
+ * Mail default EOL string
+ */
+ const EOL = "\r\n";
+
+
+ /**
+ * Default timeout in seconds for initiating session
+ */
+ const TIMEOUT_CONNECTION = 30;
+
+
+ /**
+ * Hostname or IP address of remote server
+ * @var string
+ */
+ protected $_host;
+
+
+ /**
+ * Port number of connection
+ * @var integer
+ */
+ protected $_port;
+
+
+ /**
+ * Instance of Zend_Validate to check hostnames
+ * @var Zend_Validate
+ */
+ protected $_validHost;
+
+
+ /**
+ * Socket connection resource
+ * @var resource
+ */
+ protected $_socket;
+
+
+ /**
+ * Last request sent to server
+ * @var string
+ */
+ protected $_request;
+
+
+ /**
+ * Array of server responses to last request
+ * @var array
+ */
+ protected $_response;
+
+
+ /**
+ * String template for parsing server responses using sscanf (default: 3 digit code and response string)
+ * @var resource
+ */
+ protected $_template = '%d%s';
+
+
+ /**
+ * Log of mail requests and server responses for a session
+ * @var string
+ */
+ private $_log;
+
+
+ /**
+ * Constructor.
+ *
+ * @param string $host OPTIONAL Hostname of remote connection (default: 127.0.0.1)
+ * @param integer $port OPTIONAL Port number (default: null)
+ * @throws Zend_Mail_Protocol_Exception
+ * @return void
+ */
+ public function __construct($host = '127.0.0.1', $port = null)
+ {
+ $this->_validHost = new Zend_Validate();
+ $this->_validHost->addValidator(new Zend_Validate_Hostname(Zend_Validate_Hostname::ALLOW_ALL));
+
+ if (!$this->_validHost->isValid($host)) {
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception(join(', ', $this->_validHost->getMessages()));
+ }
+
+ $this->_host = $host;
+ $this->_port = $port;
+ }
+
+
+ /**
+ * Class destructor to cleanup open resources
+ *
+ * @return void
+ */
+ public function __destruct()
+ {
+ $this->_disconnect();
+ }
+
+
+ /**
+ * Create a connection to the remote host
+ *
+ * Concrete adapters for this class will implement their own unique connect scripts, using the _connect() method to create the socket resource.
+ */
+ abstract public function connect();
+
+
+ /**
+ * Retrieve the last client request
+ *
+ * @return string
+ */
+ public function getRequest()
+ {
+ return $this->_request;
+ }
+
+
+ /**
+ * Retrieve the last server response
+ *
+ * @return array
+ */
+ public function getResponse()
+ {
+ return $this->_response;
+ }
+
+
+ /**
+ * Retrieve the transaction log
+ *
+ * @return string
+ */
+ public function getLog()
+ {
+ return $this->_log;
+ }
+
+
+ /**
+ * Reset the transaction log
+ *
+ * @return void
+ */
+ public function resetLog()
+ {
+ $this->_log = '';
+ }
+
+
+ /**
+ * Connect to the server using the supplied transport and target
+ *
+ * An example $remote string may be 'tcp://mail.example.com:25' or 'ssh://hostname.com:2222'
+ *
+ * @param string $remote Remote
+ * @throws Zend_Mail_Protocol_Exception
+ * @return boolean
+ */
+ protected function _connect($remote)
+ {
+ $errorNum = 0;
+ $errorStr = '';
+
+ // open connection
+ $this->_socket = stream_socket_client($remote, $errorNum, $errorStr, self::TIMEOUT_CONNECTION);
+
+ if ($this->_socket === false) {
+ if ($errorNum == 0) {
+ $errorStr = 'Could not open socket';
+ }
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception($errorStr);
+ }
+
+ if (($result = stream_set_timeout($this->_socket, self::TIMEOUT_CONNECTION)) === false) {
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception('Could not set stream timeout');
+ }
+
+ return $result;
+ }
+
+
+ /**
+ * Disconnect from remote host and free resource
+ *
+ * @return void
+ */
+ protected function _disconnect()
+ {
+ if (is_resource($this->_socket)) {
+ fclose($this->_socket);
+ }
+ }
+
+
+ /**
+ * Send the given request followed by a LINEEND to the server.
+ *
+ * @param string $request
+ * @throws Zend_Mail_Protocol_Exception
+ * @return integer|boolean Number of bytes written to remote host
+ */
+ protected function _send($request)
+ {
+ if (!is_resource($this->_socket)) {
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception('No connection has been established to ' . $this->_host);
+ }
+
+ $this->_request = $request;
+
+ $result = fwrite($this->_socket, $request . self::EOL);
+
+ // Save request to internal log
+ $this->_log .= $request . self::EOL;
+
+ if ($result === false) {
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception('Could not send request to ' . $this->_host);
+ }
+
+ return $result;
+ }
+
+
+ /**
+ * Get a line from the stream.
+ *
+ * @var integer $timeout Per-request timeout value if applicable
+ * @throws Zend_Mail_Protocol_Exception
+ * @return string
+ */
+ protected function _receive($timeout = null)
+ {
+ if (!is_resource($this->_socket)) {
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception('No connection has been established to ' . $this->_host);
+ }
+
+ // Adapters may wish to supply per-commend timeouts according to appropriate RFC
+ if ($timeout !== null) {
+ stream_set_timeout($this->_socket, $timeout);
+ }
+
+ // Retrieve response
+ $reponse = fgets($this->_socket, 1024);
+
+ // Save request to internal log
+ $this->_log .= $reponse;
+
+ // Check meta data to ensure connection is still valid
+ $info = stream_get_meta_data($this->_socket);
+
+ if (!empty($info['timed_out'])) {
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception($this->_host . ' has timed out');
+ }
+
+ if ($reponse === false) {
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception('Could not read from ' . $this->_host);
+ }
+
+ return $reponse;
+ }
+
+
+ /**
+ * Parse server response for successful codes
+ *
+ * Read the response from the stream and check for expected return code.
+ * Throws a Zend_Mail_Protocol_Exception if an unexpected code is returned.
+ *
+ * @param string|array $code One or more codes that indicate a successful response
+ * @throws Zend_Mail_Protocol_Exception
+ * @return string Last line of response string
+ */
+ protected function _expect($code, $timeout = null)
+ {
+ $this->_response = array();
+ $cmd = '';
+ $msg = '';
+
+ if (!is_array($code)) {
+ $code = array($code);
+ }
+
+ do {
+ $this->_response[] = $result = $this->_receive($timeout);
+ sscanf($result, $this->_template, $cmd, $msg);
+
+ if ($cmd === null || !in_array($cmd, $code)) {
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception($result);
+ }
+
+ } while (strpos($msg, '-') === 0); // The '-' message prefix indicates an information string instead of a response string.
+
+ return $msg;
+ }
+}
diff --git a/libs/Zend/Mail/Protocol/Exception.php b/libs/Zend/Mail/Protocol/Exception.php
new file mode 100755
index 0000000000..1690d53083
--- /dev/null
+++ b/libs/Zend/Mail/Protocol/Exception.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Protocol
+ * @version $Id$
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Protocol
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mail_Protocol_Exception extends Zend_Exception
+{}
+
diff --git a/libs/Zend/Mail/Protocol/Imap.php b/libs/Zend/Mail/Protocol/Imap.php
new file mode 100755
index 0000000000..d86608700c
--- /dev/null
+++ b/libs/Zend/Mail/Protocol/Imap.php
@@ -0,0 +1,770 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * Zend_Mail_Protocol_Exception
+ */
+require_once 'Zend/Mail/Protocol/Exception.php';
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Mail_Protocol_Imap
+{
+ /**
+ * socket to imap server
+ * @var resource|null
+ */
+ protected $_socket;
+
+ /**
+ * counter for request tag
+ * @var int
+ */
+ protected $_tagCount = 0;
+
+
+ /**
+ * Public constructor
+ *
+ * @param string $host hostname of IP address of IMAP server, if given connect() is called
+ * @param int|null $port port of IMAP server, null for default (143 or 993 for ssl)
+ * @param bool $ssl use ssl? 'SSL', 'TLS' or false
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ function __construct($host = '', $port = null, $ssl = false)
+ {
+ if ($host) {
+ $this->connect($host, $port, $ssl);
+ }
+ }
+
+ /**
+ * Public destructor
+ */
+ public function __destruct()
+ {
+ $this->logout();
+ }
+
+ /**
+ * Open connection to POP3 server
+ *
+ * @param string $host hostname of IP address of POP3 server
+ * @param int|null $port of IMAP server, default is 143 (993 for ssl)
+ * @param string|bool $ssl use 'SSL', 'TLS' or false
+ * @return string welcome message
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function connect($host, $port = null, $ssl = false)
+ {
+ if ($ssl == 'SSL') {
+ $host = 'ssl://' . $host;
+ }
+
+ if ($port === null) {
+ $port = $ssl === 'SSL' ? 993 : 143;
+ }
+
+ $this->_socket = @fsockopen($host, $port);
+ if (!$this->_socket) {
+ throw new Zend_Mail_Protocol_Exception('cannot connect to host');
+ }
+
+ if (!$this->_assumedNextLine('* OK')) {
+ throw new Zend_Mail_Protocol_Exception('host doesn\'t allow connection');
+ }
+
+ if ($ssl === 'TLS') {
+ $result = $this->requestAndResponse('STARTTLS');
+ $result = $result && stream_socket_enable_crypto($this->_socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
+ if (!$result) {
+ throw new Zend_Mail_Protocol_Exception('cannot enable TLS');
+ }
+ }
+ }
+
+ /**
+ * get the next line from socket with error checking, but nothing else
+ *
+ * @return string next line
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ protected function _nextLine()
+ {
+ $line = @fgets($this->_socket);
+ if ($line === false) {
+ throw new Zend_Mail_Protocol_Exception('cannot read - connection closed?');
+ }
+
+ return $line;
+ }
+
+ /**
+ * get next line and assume it starts with $start. some requests give a simple
+ * feedback so we can quickly check if we can go on.
+ *
+ * @param string $start the first bytes we assume to be in the next line
+ * @return bool line starts with $start
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ protected function _assumedNextLine($start)
+ {
+ $line = $this->_nextLine();
+ return strpos($line, $start) === 0;
+ }
+
+ /**
+ * get next line and split the tag. that's the normal case for a response line
+ *
+ * @param string $tag tag of line is returned by reference
+ * @return string next line
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ protected function _nextTaggedLine(&$tag)
+ {
+ $line = $this->_nextLine();
+
+ // seperate tag from line
+ list($tag, $line) = explode(' ', $line, 2);
+
+ return $line;
+ }
+
+ /**
+ * split a given line in tokens. a token is literal of any form or a list
+ *
+ * @param string $line line to decode
+ * @return array tokens, literals are returned as string, lists as array
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ protected function _decodeLine($line)
+ {
+ $tokens = array();
+ $stack = array();
+
+ /*
+ We start to decode the response here. The unterstood tokens are:
+ literal
+ "literal" or also "lit\\er\"al"
+ {bytes}<NL>literal
+ (literals*)
+ All tokens are returned in an array. Literals in braces (the last unterstood
+ token in the list) are returned as an array of tokens. I.e. the following response:
+ "foo" baz {3}<NL>bar ("f\\\"oo" bar)
+ would be returned as:
+ array('foo', 'baz', 'bar', array('f\\\"oo', 'bar'));
+ */
+ // replace any trailling <NL> including spaces with a single space
+ $line = rtrim($line) . ' ';
+ while (($pos = strpos($line, ' ')) !== false) {
+ $token = substr($line, 0, $pos);
+ while ($token[0] == '(') {
+ array_push($stack, $tokens);
+ $tokens = array();
+ $token = substr($token, 1);
+ }
+ if ($token[0] == '"') {
+ if (preg_match('%^"((.|\\\\|\\")*?)"%', $line, $matches)) {
+ $tokens[] = $matches[1];
+ $line = substr($line, strlen($matches[0]) + 1);
+ continue;
+ }
+ }
+ if ($token[0] == '{') {
+ $endPos = strpos($token, '}');
+ $chars = substr($token, 1, $endPos - 1);
+ if (is_numeric($chars)) {
+ $token = '';
+ while (strlen($token) < $chars) {
+ $token .= $this->_nextLine();
+ }
+ $line = '';
+ if (strlen($token) > $chars) {
+ $line = substr($token, $chars);
+ $token = substr($token, 0, $chars);
+ } else {
+ $line .= $this->_nextLine();
+ }
+ $tokens[] = $token;
+ $line = trim($line) . ' ';
+ continue;
+ }
+ }
+ if ($stack && $token[strlen($token) - 1] == ')') {
+ // closing braces are not seperated by spaces, so we need to count them
+ $braces = strlen($token);
+ $token = rtrim($token, ')');
+ // only count braces if more than one
+ $braces -= strlen($token) + 1;
+ // only add if token had more than just closing braces
+ if ($token) {
+ $tokens[] = $token;
+ }
+ $token = $tokens;
+ $tokens = array_pop($stack);
+ // special handline if more than one closing brace
+ while ($braces-- > 0) {
+ $tokens[] = $token;
+ $token = $tokens;
+ $tokens = array_pop($stack);
+ }
+ }
+ $tokens[] = $token;
+ $line = substr($line, $pos + 1);
+ }
+
+ // maybe the server forgot to send some closing braces
+ while ($stack) {
+ $child = $tokens;
+ $tokens = array_pop($stack);
+ $tokens[] = $child;
+ }
+
+ return $tokens;
+ }
+
+ /**
+ * read a response "line" (could also be more than one real line if response has {..}<NL>)
+ * and do a simple decode
+ *
+ * @param array|string $tokens decoded tokens are returned by reference, if $dontParse
+ * is true the unparsed line is returned here
+ * @param string $wantedTag check for this tag for response code. Default '*' is
+ * continuation tag.
+ * @param bool $dontParse if true only the unparsed line is returned $tokens
+ * @return bool if returned tag matches wanted tag
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function readLine(&$tokens = array(), $wantedTag = '*', $dontParse = false)
+ {
+ $line = $this->_nextTaggedLine($tag);
+ if (!$dontParse) {
+ $tokens = $this->_decodeLine($line);
+ } else {
+ $tokens = $line;
+ }
+
+ // if tag is wanted tag we might be at the end of a multiline response
+ return $tag == $wantedTag;
+ }
+
+ /**
+ * read all lines of response until given tag is found (last line of response)
+ *
+ * @param string $tag the tag of your request
+ * @param string|array $filter you can filter the response so you get only the
+ * given response lines
+ * @param bool $dontParse if true every line is returned unparsed instead of
+ * the decoded tokens
+ * @return null|bool|array tokens if success, false if error, null if bad request
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function readResponse($tag, $dontParse = false)
+ {
+ $lines = array();
+ while (!$this->readLine($tokens, $tag, $dontParse)) {
+ $lines[] = $tokens;
+ }
+
+ if ($dontParse) {
+ // last to chars are still needed for response code
+ $tokens = array(substr($tokens, 0, 2));
+ }
+ // last line has response code
+ if ($tokens[0] == 'OK') {
+ return $lines ? $lines : true;
+ } else if ($tokens[0] == 'NO'){
+ return false;
+ }
+ return null;
+ }
+
+ /**
+ * send a request
+ *
+ * @param string $command your request command
+ * @param array $tokens additional parameters to command, use escapeString() to prepare
+ * @param string $tag provide a tag otherwise an autogenerated is returned
+ * @return null
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function sendRequest($command, $tokens = array(), &$tag = null)
+ {
+ if (!$tag) {
+ ++$this->_tagCount;
+ $tag = 'TAG' . $this->_tagCount;
+ }
+
+ $line = $tag . ' ' . $command;
+
+ foreach ($tokens as $token) {
+ if (is_array($token)) {
+ if (@fputs($this->_socket, $line . ' ' . $token[0] . "\r\n") === false) {
+ throw new Zend_Mail_Protocol_Exception('cannot write - connection closed?');
+ }
+ if (!$this->_assumedNextLine('+ OK')) {
+ throw new Zend_Mail_Protocol_Exception('cannot send literal string');
+ }
+ $line = $token[1];
+ } else {
+ $line .= ' ' . $token;
+ }
+ }
+
+ if (@fputs($this->_socket, $line . "\r\n") === false) {
+ throw new Zend_Mail_Protocol_Exception('cannot write - connection closed?');
+ }
+ }
+
+ /**
+ * send a request and get response at once
+ *
+ * @param string $command command as in sendRequest()
+ * @param array $tokens parameters as in sendRequest()
+ * @param bool $dontParse if true unparsed lines are returned instead of tokens
+ * @return mixed response as in readResponse()
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function requestAndResponse($command, $tokens = array(), $dontParse = false)
+ {
+ $this->sendRequest($command, $tokens, $tag);
+ $response = $this->readResponse($tag, $dontParse);
+
+ return $response;
+ }
+
+ /**
+ * escape one or more literals i.e. for sendRequest
+ *
+ * @param string|array $string the literal/-s
+ * @return string|array escape literals, literals with newline ar returned
+ * as array('{size}', 'string');
+ */
+ public function escapeString($string)
+ {
+ if (func_num_args() < 2) {
+ if (strpos($string, "\n") !== false) {
+ return array('{' . strlen($string) . '}', $string);
+ } else {
+ return '"' . str_replace(array('\\', '"'), array('\\\\', '\\"'), $string) . '"';
+ }
+ }
+ $result = array();
+ foreach (func_get_args() as $string) {
+ $result[] = $this->escapeString($string);
+ }
+ return $result;
+ }
+
+ /**
+ * escape a list with literals or lists
+ *
+ * @param array $list list with literals or lists as PHP array
+ * @return string escaped list for imap
+ */
+ public function escapeList($list)
+ {
+ $result = array();
+ foreach ($list as $k => $v) {
+ if (!is_array($v)) {
+// $result[] = $this->escapeString($v);
+ $result[] = $v;
+ continue;
+ }
+ $result[] = $this->escapeList($v);
+ }
+ return '(' . implode(' ', $result) . ')';
+ }
+
+ /**
+ * Login to IMAP server.
+ *
+ * @param string $user username
+ * @param string $password password
+ * @return bool success
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function login($user, $password)
+ {
+ return $this->requestAndResponse('LOGIN', $this->escapeString($user, $password), true);
+ }
+
+ /**
+ * logout of imap server
+ *
+ * @return bool success
+ */
+ public function logout()
+ {
+ $result = false;
+ if ($this->_socket) {
+ try {
+ $result = $this->requestAndResponse('LOGOUT', array(), true);
+ } catch (Zend_Mail_Protocol_Exception $e) {
+ // ignoring exception
+ }
+ fclose($this->_socket);
+ $this->_socket = null;
+ }
+ return $result;
+ }
+
+
+ /**
+ * Get capabilities from IMAP server
+ *
+ * @return array list of capabilities
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function capability()
+ {
+ $response = $this->requestAndResponse('CAPABILITY');
+
+ if (!$response) {
+ return $response;
+ }
+
+ $capabilities = array();
+ foreach ($response as $line) {
+ $capabilities = array_merge($capabilities, $line);
+ }
+ return $capabilities;
+ }
+
+ /**
+ * Examine and select have the same response. The common code for both
+ * is in this method
+ *
+ * @param string $command can be 'EXAMINE' or 'SELECT' and this is used as command
+ * @param string $box which folder to change to or examine
+ * @return bool|array false if error, array with returned information
+ * otherwise (flags, exists, recent, uidvalidity)
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function examineOrSelect($command = 'EXAMINE', $box = 'INBOX')
+ {
+ $this->sendRequest($command, array($this->escapeString($box)), $tag);
+
+ $result = array();
+ while (!$this->readLine($tokens, $tag)) {
+ if ($tokens[0] == 'FLAGS') {
+ array_shift($tokens);
+ $result['flags'] = $tokens;
+ continue;
+ }
+ switch ($tokens[1]) {
+ case 'EXISTS':
+ case 'RECENT':
+ $result[strtolower($tokens[1])] = $tokens[0];
+ break;
+ case '[UIDVALIDITY':
+ $result['uidvalidity'] = (int)$tokens[2];
+ break;
+ default:
+ // ignore
+ }
+ }
+
+ if ($tokens[0] != 'OK') {
+ return false;
+ }
+ return $result;
+ }
+
+ /**
+ * change folder
+ *
+ * @param string $box change to this folder
+ * @return bool|array see examineOrselect()
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function select($box = 'INBOX')
+ {
+ return $this->examineOrSelect('SELECT', $box);
+ }
+
+ /**
+ * examine folder
+ *
+ * @param string $box examine this folder
+ * @return bool|array see examineOrselect()
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function examine($box = 'INBOX')
+ {
+ return $this->examineOrSelect('EXAMINE', $box);
+ }
+
+ /**
+ * fetch one or more items of one or more messages
+ *
+ * @param string|array $items items to fetch from message(s) as string (if only one item)
+ * or array of strings
+ * @param int $from message for items or start message if $to !== null
+ * @param int|null $to if null only one message ($from) is fetched, else it's the
+ * last message, INF means last message avaible
+ * @return string|array if only one item of one message is fetched it's returned as string
+ * if items of one message are fetched it's returned as (name => value)
+ * if one items of messages are fetched it's returned as (msgno => value)
+ * if items of messages are fetchted it's returned as (msgno => (name => value))
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function fetch($items, $from, $to = null)
+ {
+ if (is_array($from)) {
+ $set = implode(',', $from);
+ } else if ($to === null) {
+ $set = (int)$from;
+ } else if ($to === INF) {
+ $set = (int)$from . ':*';
+ } else {
+ $set = (int)$from . ':' . (int)$to;
+ }
+
+ $items = (array)$items;
+ $itemList = $this->escapeList($items);
+
+ $this->sendRequest('FETCH', array($set, $itemList), $tag);
+
+ $result = array();
+ while (!$this->readLine($tokens, $tag)) {
+ // ignore other responses
+ if ($tokens[1] != 'FETCH') {
+ continue;
+ }
+ // ignore other messages
+ if ($to === null && !is_array($from) && $tokens[0] != $from) {
+ continue;
+ }
+ // if we only want one item we return that one directly
+ if (count($items) == 1) {
+ if ($tokens[2][0] == $items[0]) {
+ $data = $tokens[2][1];
+ } else {
+ // maybe the server send an other field we didn't wanted
+ $count = count($tokens[2]);
+ // we start with 2, because 0 was already checked
+ for ($i = 2; $i < $count; $i += 2) {
+ if ($tokens[2][$i] != $items[0]) {
+ continue;
+ }
+ $data = $tokens[2][$i + 1];
+ break;
+ }
+ }
+ } else {
+ $data = array();
+ while (key($tokens[2]) !== null) {
+ $data[current($tokens[2])] = next($tokens[2]);
+ next($tokens[2]);
+ }
+ }
+ // if we want only one message we can ignore everything else and just return
+ if ($to === null && !is_array($from) && $tokens[0] == $from) {
+ // we still need to read all lines
+ while (!$this->readLine($tokens, $tag));
+ return $data;
+ }
+ $result[$tokens[0]] = $data;
+ }
+
+ if ($to === null && !is_array($from)) {
+ throw new Zend_Mail_Protocol_Exception('the single id was not found in response');
+ }
+
+ return $result;
+ }
+
+ /**
+ * get mailbox list
+ *
+ * this method can't be named after the IMAP command 'LIST', as list is a reserved keyword
+ *
+ * @param string $reference mailbox reference for list
+ * @param string $mailbox mailbox name match with wildcards
+ * @return array mailboxes that matched $mailbox as array(globalName => array('delim' => .., 'flags' => ..))
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function listMailbox($reference = '', $mailbox = '*')
+ {
+ $result = array();
+ $list = $this->requestAndResponse('LIST', $this->escapeString($reference, $mailbox));
+ if (!$list) {
+ return $result;
+ }
+
+ foreach ($list as $item) {
+ if (count($item) != 4 || $item[0] != 'LIST') {
+ continue;
+ }
+ $result[$item[3]] = array('delim' => $item[2], 'flags' => $item[1]);
+ }
+
+ return $result;
+ }
+
+ /**
+ * set flags
+ *
+ * @param array $flags flags to set, add or remove - see $mode
+ * @param int $from message for items or start message if $to !== null
+ * @param int|null $to if null only one message ($from) is fetched, else it's the
+ * last message, INF means last message avaible
+ * @param string|null $mode '+' to add flags, '-' to remove flags, everything else sets the flags as given
+ * @param bool $silent if false the return values are the new flags for the wanted messages
+ * @return bool|array new flags if $silent is false, else true or false depending on success
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function store(array $flags, $from, $to = null, $mode = null, $silent = true)
+ {
+ $item = 'FLAGS';
+ if ($mode == '+' || $mode == '-') {
+ $item = $mode . $item;
+ }
+ if ($silent) {
+ $item .= '.SILENT';
+ }
+
+ $flags = $this->escapeList($flags);
+ $set = (int)$from;
+ if ($to != null) {
+ $set .= ':' . ($to == INF ? '*' : (int)$to);
+ }
+
+ $result = $this->requestAndResponse('STORE', array($set, $item, $flags), $silent);
+
+ if ($silent) {
+ return $result ? true : false;
+ }
+
+ $tokens = $result;
+ $result = array();
+ foreach ($tokens as $token) {
+ if ($token[1] != 'FETCH' || $token[2][0] != 'FLAGS') {
+ continue;
+ }
+ $result[$token[0]] = $token[2][1];
+ }
+
+ return $result;
+ }
+
+ /**
+ * append a new message to given folder
+ *
+ * @param string $folder name of target folder
+ * @param string $message full message content
+ * @param array $flags flags for new message
+ * @param string $date date for new message
+ * @return bool success
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function append($folder, $message, $flags = null, $date = null)
+ {
+ $tokens = array();
+ $tokens[] = $this->escapeString($folder);
+ if ($flags !== null) {
+ $tokens[] = $this->escapeList($flags);
+ }
+ if ($date !== null) {
+ $tokens[] = $this->escapeString($date);
+ }
+ $tokens[] = $this->escapeString($message);
+
+ return $this->requestAndResponse('APPEND', $tokens, true);
+ }
+
+ /**
+ * copy message set from current folder to other folder
+ *
+ * @param string $folder destination folder
+ * @param int|null $to if null only one message ($from) is fetched, else it's the
+ * last message, INF means last message avaible
+ * @return bool success
+ * @throw Zend_Mail_Protocol_Exception
+ */
+ public function copy($folder, $from, $to = null)
+ {
+ $set = (int)$from;
+ if ($to != null) {
+ $set .= ':' . ($to == INF ? '*' : (int)$to);
+ }
+
+ return $this->requestAndResponse('COPY', array($set, $this->escapeString($folder)), true);
+ }
+
+ /**
+ * create a new folder (and parent folders if needed)
+ *
+ * @param string $folder folder name
+ * @return bool success
+ */
+ public function create($folder)
+ {
+ return $this->requestAndResponse('CREATE', array($this->escapeString($folder)), true);
+ }
+
+ /**
+ * rename an existing folder
+ *
+ * @param string $old old name
+ * @param string $new new name
+ * @return bool success
+ */
+ public function rename($old, $new)
+ {
+ return $this->requestAndResponse('RENAME', $this->escapeString($old, $new), true);
+ }
+
+ /**
+ * remove a folder
+ *
+ * @param string $folder folder name
+ * @return bool success
+ */
+ public function delete($folder)
+ {
+ return $this->requestAndResponse('DELETE', array($this->escapeString($folder)), true);
+ }
+
+ /**
+ * permanently remove messages
+ *
+ * @return bool success
+ */
+ public function expunge()
+ {
+ // TODO: parse response?
+ return $this->requestAndResponse('EXPUNGE');
+ }
+
+ /**
+ * send noop
+ *
+ * @return bool success
+ */
+ public function noop()
+ {
+ // TODO: parse response
+ return $this->requestAndResponse('NOOP');
+ }
+}
diff --git a/libs/Zend/Mail/Protocol/Pop3.php b/libs/Zend/Mail/Protocol/Pop3.php
new file mode 100755
index 0000000000..d406b3e707
--- /dev/null
+++ b/libs/Zend/Mail/Protocol/Pop3.php
@@ -0,0 +1,424 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * Zend_Mail_Protocol_Exception
+ */
+require_once 'Zend/Mail/Protocol/Exception.php';
+
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Mail_Protocol_Pop3
+{
+ /**
+ * saves if server supports top
+ * @var null|bool
+ */
+ public $hasTop = null;
+
+ /**
+ * socket to pop3
+ * @var null|resource
+ */
+ protected $_socket;
+
+ /**
+ * greeting timestamp for apop
+ * @var null|string
+ */
+ protected $_timestamp;
+
+
+ /**
+ * Public constructor
+ *
+ * @param string $host hostname of IP address of POP3 server, if given connect() is called
+ * @param int|null $port port of POP3 server, null for default (110 or 995 for ssl)
+ * @param bool|string $ssl use ssl? 'SSL', 'TLS' or false
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function __construct($host = '', $port = null, $ssl = false)
+ {
+ if ($host) {
+ $this->connect($host, $port, $ssl);
+ }
+ }
+
+
+ /**
+ * Public destructor
+ */
+ public function __destruct()
+ {
+ $this->logout();
+ }
+
+
+ /**
+ * Open connection to POP3 server
+ *
+ * @param string $host hostname of IP address of POP3 server
+ * @param int|null $port of POP3 server, default is 110 (995 for ssl)
+ * @param string|bool $ssl use 'SSL', 'TLS' or false
+ * @return string welcome message
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function connect($host, $port = null, $ssl = false)
+ {
+ if ($ssl == 'SSL') {
+ $host = 'ssl://' . $host;
+ }
+
+ if ($port === null) {
+ $port = $ssl == 'SSL' ? 995 : 110;
+ }
+
+ $this->_socket = @fsockopen($host, $port);
+ if (!$this->_socket) {
+ throw new Zend_Mail_Protocol_Exception('cannot connect to host');
+ }
+
+ $welcome = $this->readResponse();
+
+ strtok($welcome, '<');
+ $this->_timestamp = strtok('>');
+ if (!strpos($this->_timestamp, '@')) {
+ $this->_timestamp = null;
+ } else {
+ $this->_timestamp = '<' . $this->_timestamp . '>';
+ }
+
+ if ($ssl === 'TLS') {
+ $this->request('STLS');
+ $result = stream_socket_enable_crypto($this->_socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
+ if (!$result) {
+ throw new Zend_Mail_Protocol_Exception('cannot enable TLS');
+ }
+ }
+
+ return $welcome;
+ }
+
+
+ /**
+ * Send a request
+ *
+ * @param string $request your request without newline
+ * @return null
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function sendRequest($request)
+ {
+ $result = @fputs($this->_socket, $request."\n");
+ if (!$result) {
+ throw new Zend_Mail_Protocol_Exception('send failed - connection closed?');
+ }
+ }
+
+
+ /**
+ * read a response
+ *
+ * @param boolean $multiline response has multiple lines and should be read until "<nl>.<nl>"
+ * @return string response
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function readResponse($multiline = false)
+ {
+ $result = @fgets($this->_socket);
+ if (!is_string($result)) {
+ throw new Zend_Mail_Protocol_Exception('read failed - connection closed?');
+ }
+
+ $result = trim($result);
+ if (strpos($result, ' ')) {
+ list($status, $message) = explode(' ', $result, 2);
+ } else {
+ $status = $result;
+ $message = '';
+ }
+
+ if ($status != '+OK') {
+ throw new Zend_Mail_Protocol_Exception('last request failed');
+ }
+
+ if ($multiline) {
+ $message = '';
+ $line = fgets($this->_socket);
+ while ($line && trim($line) != '.') {
+ $message .= $line;
+ $line = fgets($this->_socket);
+ };
+ }
+
+ return $message;
+ }
+
+
+ /**
+ * Send request and get resposne
+ *
+ * @see sendRequest(), readResponse()
+ *
+ * @param string $request request
+ * @param bool $multiline multiline response?
+ * @return string result from readResponse()
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function request($request, $multiline = false)
+ {
+ $this->sendRequest($request);
+ return $this->readResponse($multiline);
+ }
+
+
+ /**
+ * End communication with POP3 server (also closes socket)
+ *
+ * @return null
+ */
+ public function logout()
+ {
+ if (!$this->_socket) {
+ return;
+ }
+
+ try {
+ $this->request('QUIT');
+ } catch (Zend_Mail_Protocol_Exception $e) {
+ // ignore error - we're closing the socket anyway
+ }
+
+ fclose($this->_socket);
+ $this->_socket = null;
+ }
+
+
+ /**
+ * Get capabilities from POP3 server
+ *
+ * @return array list of capabilities
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function capa()
+ {
+ $result = $this->request('CAPA', true);
+ return explode("\n", $result);
+ }
+
+
+ /**
+ * Login to POP3 server. Can use APOP
+ *
+ * @param string $user username
+ * @param string $password password
+ * @param bool $try_apop should APOP be tried?
+ * @return void
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function login($user, $password, $tryApop = true)
+ {
+ if ($tryApop && $this->_timestamp) {
+ try {
+ $this->request("APOP $user " . md5($this->_timestamp . $password));
+ return;
+ } catch (Zend_Mail_Protocol_Exception $e) {
+ // ignore
+ }
+ }
+
+ $result = $this->request("USER $user");
+ $result = $this->request("PASS $password");
+ }
+
+
+ /**
+ * Make STAT call for message count and size sum
+ *
+ * @param int $messages out parameter with count of messages
+ * @param int $octets out parameter with size in octects of messages
+ * @return void
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function status(&$messages, &$octets)
+ {
+ $messages = 0;
+ $octets = 0;
+ $result = $this->request('STAT');
+
+ list($messages, $octets) = explode(' ', $result);
+ }
+
+
+ /**
+ * Make LIST call for size of message(s)
+ *
+ * @param int|null $msgno number of message, null for all
+ * @return int|array size of given message or list with array(num => size)
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function getList($msgno = null)
+ {
+ if ($msgno !== null) {
+ $result = $this->request("LIST $msgno");
+
+ list(, $result) = explode(' ', $result);
+ return (int)$result;
+ }
+
+ $result = $this->request('LIST', true);
+ $messages = array();
+ $line = strtok($result, "\n");
+ while ($line) {
+ list($no, $size) = explode(' ', trim($line));
+ $messages[(int)$no] = (int)$size;
+ $line = strtok("\n");
+ }
+
+ return $messages;
+ }
+
+
+ /**
+ * Make UIDL call for getting a uniqueid
+ *
+ * @param int|null $msgno number of message, null for all
+ * @return string|array uniqueid of message or list with array(num => uniqueid)
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function uniqueid($msgno = null)
+ {
+ if ($msgno !== null) {
+ $result = $this->request("UIDL $msgno");
+
+ list(, $result) = explode(' ', $result);
+ return $result;
+ }
+
+ $result = $this->request('UIDL', true);
+
+ $result = explode("\n", $result);
+ $messages = array();
+ foreach ($result as $line) {
+ if (!$line) {
+ continue;
+ }
+ list($no, $id) = explode(' ', trim($line), 2);
+ $messages[(int)$no] = $id;
+ }
+
+ return $messages;
+
+ }
+
+
+ /**
+ * Make TOP call for getting headers and maybe some body lines
+ * This method also sets hasTop - before it it's not known if top is supported
+ *
+ * The fallback makes normale RETR call, which retrieves the whole message. Additional
+ * lines are not removed.
+ *
+ * @param int $msgno number of message
+ * @param int $lines number of wanted body lines (empty line is inserted after header lines)
+ * @param bool $fallback fallback with full retrieve if top is not supported
+ * @return string message headers with wanted body lines
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function top($msgno, $lines = 0, $fallback = false)
+ {
+ if ($this->hasTop === false) {
+ if ($fallback) {
+ return $this->retrive($msgno);
+ } else {
+ throw new Zend_Mail_Protocol_Exception('top not supported and no fallback wanted');
+ }
+ }
+ $this->hasTop = true;
+
+ $lines = (!$lines || $lines < 1) ? 0 : (int)$lines;
+
+ try {
+ $result = $this->request("TOP $msgno $lines", true);
+ } catch (Zend_Mail_Protocol_Exception $e) {
+ $this->hasTop = false;
+ if ($fallback) {
+ $result = $this->retrive($msgno);
+ } else {
+ throw $e;
+ }
+ }
+
+ return $result;
+ }
+
+
+ /**
+ * Make a RETR call for retrieving a full message with headers and body
+ *
+ * @param int $msgno message number
+ * @return string message
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function retrive($msgno)
+ {
+ $result = $this->request("RETR $msgno", true);
+ return $result;
+ }
+
+
+ /**
+ * Make a NOOP call, maybe needed for keeping the server happy
+ *
+ * @return null
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function noop()
+ {
+ $this->request('NOOP');
+ }
+
+
+ /**
+ * Make a DELE count to remove a message
+ *
+ * @return null
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function delete($msgno)
+ {
+ $this->request("DELE $msgno");
+ }
+
+
+ /**
+ * Make RSET call, which rollbacks delete requests
+ *
+ * @return null
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function undelete()
+ {
+ $this->request('RSET');
+ }
+}
diff --git a/libs/Zend/Mail/Protocol/Smtp.php b/libs/Zend/Mail/Protocol/Smtp.php
new file mode 100755
index 0000000000..dbf77a30e8
--- /dev/null
+++ b/libs/Zend/Mail/Protocol/Smtp.php
@@ -0,0 +1,413 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Protocol
+ * @version $Id$
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Mail_Protocol_Abstract
+ */
+require_once 'Zend/Mail/Protocol/Abstract.php';
+
+
+/**
+ * Smtp implementation of Zend_Mail_Protocol_Abstract
+ *
+ * Minimum implementation according to RFC2821: EHLO, MAIL FROM, RCPT TO, DATA, RSET, NOOP, QUIT
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Protocol
+ * @throws Zend_Mail_Protocol_Exception
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mail_Protocol_Smtp extends Zend_Mail_Protocol_Abstract
+{
+ /**
+ * The transport method for the socket
+ *
+ * @var string
+ */
+ protected $_transport = 'tcp';
+
+
+ /**
+ * Indicates that a session is requested to be secure
+ *
+ * @var string
+ */
+ protected $_secure;
+
+
+ /**
+ * Indicates an smtp session has been started by the HELO command
+ *
+ * @var boolean
+ */
+ protected $_sess = false;
+
+
+ /**
+ * Indicates the HELO command has been issues
+ *
+ * @var unknown_type
+ */
+ protected $_helo = false;
+
+
+ /**
+ * Indicates an smtp AUTH has been issued and authenticated
+ *
+ * @var unknown_type
+ */
+ protected $_auth = false;
+
+
+ /**
+ * Indicates a MAIL command has been issued
+ *
+ * @var unknown_type
+ */
+ protected $_mail = false;
+
+
+ /**
+ * Indicates one or more RCTP commands have been issued
+ *
+ * @var unknown_type
+ */
+ protected $_rcpt = false;
+
+
+ /**
+ * Indicates that DATA has been issued and sent
+ *
+ * @var unknown_type
+ */
+ protected $_data = null;
+
+
+ /**
+ * Constructor.
+ *
+ * @param string $host
+ * @param integer $port
+ * @param array $config
+ * @return void
+ */
+ public function __construct($host = '127.0.0.1', $port = null, array $config = array())
+ {
+ if (isset($config['ssl'])) {
+ switch (strtolower($config['ssl'])) {
+ case 'tls':
+ $this->_secure = 'tls';
+ break;
+
+ case 'ssl':
+ $this->_transport = 'ssl';
+ $this->_secure = 'ssl';
+ if ($port == null) {
+ $port = 465;
+ }
+ break;
+
+ default:
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception($ssl . ' is unsupported SSL type');
+ break;
+ }
+ }
+
+ // If no port has been specified then check the master PHP ini file. Defaults to 25 if the ini setting is null.
+ if ($port == null) {
+ if (($port = ini_get('smtp_port')) == '') {
+ $port = 25;
+ }
+ }
+
+ parent::__construct($host, $port);
+ }
+
+
+ /**
+ * Connect to the server with the parameters given in the constructor.
+ *
+ * @return boolean
+ */
+ public function connect()
+ {
+ return $this->_connect($this->_transport . '://' . $this->_host . ':'. $this->_port);
+ }
+
+
+ /**
+ * Initiate HELO/EHLO sequence and set flag to indicate valid smtp session
+ *
+ * @param string $host The client hostname or IP address (default: 127.0.0.1)
+ * @throws Zend_Mail_Protocol_Exception
+ * @return void
+ */
+ public function helo($host = '127.0.0.1')
+ {
+ // Respect RFC 2821 and disallow HELO attempts if session is already initiated.
+ if ($this->_sess === true) {
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception('Cannot issue HELO to existing session');
+ }
+
+ // Validate client hostname
+ if (!$this->_validHost->isValid($host)) {
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception(join(', ', $this->_validHost->getMessage()));
+ }
+
+ // Initiate helo sequence
+ $this->_expect(220, 300); // Timeout set for 5 minutes as per RFC 2821 4.5.3.2
+ $this->_ehlo($host);
+
+ // If a TLS session is required, commence negotiation
+ if ($this->_secure == 'tls') {
+ $this->_send('STARTTLS');
+ $this->_expect(220, 180);
+ if (!stream_socket_enable_crypto($this->_socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception('Unable to connect via TLS');
+ }
+ $this->_ehlo($host);
+ }
+
+ $this->_startSession();
+ $this->auth();
+ }
+
+
+ /**
+ * Send EHLO or HELO depending on capabilities of smtp host
+ *
+ * @param string $host The client hostname or IP address (default: 127.0.0.1)
+ * @throws Zend_Mail_Protocol_Exception
+ * @return void
+ */
+ protected function _ehlo($host)
+ {
+ // Support for older, less-compliant remote servers. Tries multiple attempts of EHLO or HELO.
+ try {
+ $this->_send('EHLO ' . $host);
+ $this->_expect(250, 300); // Timeout set for 5 minutes as per RFC 2821 4.5.3.2
+ } catch (Zend_Mail_Protocol_Exception $e) {
+ $this->_send('HELO ' . $host);
+ $this->_expect(250, 300); // Timeout set for 5 minutes as per RFC 2821 4.5.3.2
+ } catch (Zend_Mail_Protocol_Exception $e) {
+ throw $e;
+ }
+ }
+
+
+ /**
+ * Issues MAIL command
+ *
+ * @param string $from Sender mailbox
+ * @throws Zend_Mail_Protocol_Exception
+ * @return void
+ */
+ public function mail($from)
+ {
+ if ($this->_sess !== true) {
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception('A valid session has not been started');
+ }
+
+ $this->_send('MAIL FROM:<' . $from . '>');
+ $this->_expect(250, 300); // Timeout set for 5 minutes as per RFC 2821 4.5.3.2
+
+ // Set mail to true, clear recipients and any existing data flags as per 4.1.1.2 of RFC 2821
+ $this->_mail = true;
+ $this->_rcpt = false;
+ $this->_data = false;
+ }
+
+
+ /**
+ * Issues RCPT command
+ *
+ * @param string $to Receiver(s) mailbox
+ * @throws Zend_Mail_Protocol_Exception
+ * @return void
+ */
+ public function rcpt($to)
+ {
+ if ($this->_mail !== true) {
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception('No sender reverse path has been supplied');
+ }
+
+ // Set rcpt to true, as per 4.1.1.3 of RFC 2821
+ $this->_send('RCPT TO:<' . $to . '>');
+ $this->_expect(array(250, 251), 300); // Timeout set for 5 minutes as per RFC 2821 4.5.3.2
+ $this->_rcpt = true;
+ }
+
+
+ /**
+ * Issues DATA command
+ *
+ * @param string $data
+ * @throws Zend_Mail_Protocol_Exception
+ * @return void
+ */
+ public function data($data)
+ {
+ // Ensure recipients have been set
+ if ($this->_rcpt !== true) {
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception('No recipient forward path has been supplied');
+ }
+
+ $this->_send('DATA');
+ $this->_expect(354, 120); // Timeout set for 2 minutes as per RFC 2821 4.5.3.2
+
+ foreach (explode(self::EOL, $data) as $line) {
+ if (strpos($line, '.') === 0) {
+ // Escape lines prefixed with a '.'
+ $line = '.' . $line;
+ }
+ $this->_send($line);
+ }
+
+ $this->_send('.');
+ $this->_expect(250, 600); // Timeout set for 10 minutes as per RFC 2821 4.5.3.2
+ $this->_data = true;
+ }
+
+
+ /**
+ * Issues the RSET command end validates answer
+ *
+ * Can be used to restore a clean smtp communication state when a transaction has been cancelled or commencing a new transaction.
+ *
+ * @return void
+ */
+ public function rset()
+ {
+ $this->_send('RSET');
+ // MS ESMTP doesn't follow RFC, see [ZF-1377]
+ $this->_expect(array(250, 220));
+
+ $this->_mail = false;
+ $this->_rcpt = false;
+ $this->_data = false;
+ }
+
+
+ /**
+ * Issues the NOOP command end validates answer
+ *
+ * Not used by Zend_Mail, could be used to keep a connection alive or check if it is still open.
+ *
+ * @return void
+ */
+ public function noop()
+ {
+ $this->_send('NOOP');
+ $this->_expect(250, 300); // Timeout set for 5 minutes as per RFC 2821 4.5.3.2
+ }
+
+
+ /**
+ * Issues the VRFY command end validates answer
+ *
+ * Not used by Zend_Mail.
+ *
+ * @param string $user User Name or eMail to verify
+ * @return void
+ */
+ public function vrfy($user)
+ {
+ $this->_send('VRFY ' . $user);
+ $this->_expect(array(250, 251, 252), 300); // Timeout set for 5 minutes as per RFC 2821 4.5.3.2
+ }
+
+
+ /**
+ * Issues the QUIT command and clears the current session
+ *
+ * @return void
+ */
+ public function quit()
+ {
+ if ($this->_sess) {
+ $this->_send('QUIT');
+ $this->_expect(221, 300); // Timeout set for 5 minutes as per RFC 2821 4.5.3.2
+ $this->_stopSession();
+ }
+ }
+
+
+ /**
+ * Default authentication method
+ *
+ * This default method is implemented by AUTH adapters to properly authenticate to a remote host.
+ *
+ * @throws Zend_Mail_Protocol_Exception
+ * @return void
+ */
+ public function auth()
+ {
+ if ($this->_auth === true) {
+ require_once 'Zend/Mail/Protocol/Exception.php';
+ throw new Zend_Mail_Protocol_Exception('Already authenticated for this session');
+ }
+ }
+
+
+ /**
+ * Closes connection
+ *
+ * @return void
+ */
+ public function disconnect()
+ {
+ $this->_disconnect();
+ }
+
+
+ /**
+ * Start mail session
+ *
+ * @return void
+ */
+ protected function _startSession()
+ {
+ $this->_sess = true;
+ }
+
+
+ /**
+ * Stop mail session
+ *
+ * @return void
+ */
+ protected function _stopSession()
+ {
+ $this->_sess = false;
+ }
+}
diff --git a/libs/Zend/Mail/Protocol/Smtp/Auth/Crammd5.php b/libs/Zend/Mail/Protocol/Smtp/Auth/Crammd5.php
new file mode 100755
index 0000000000..7140889430
--- /dev/null
+++ b/libs/Zend/Mail/Protocol/Smtp/Auth/Crammd5.php
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Protocol
+ * @version $Id$
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Mail_Protocol_Smtp
+ */
+require_once 'Zend/Mail/Protocol/Smtp.php';
+
+
+/**
+ * Performs CRAM-MD5 authentication
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Protocol
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mail_Protocol_Smtp_Auth_Crammd5 extends Zend_Mail_Protocol_Smtp
+{
+ /**
+ * Constructor.
+ *
+ * @param string $host (Default: 127.0.0.1)
+ * @param int $port (Default: null)
+ * @param array $config Auth-specific parameters
+ * @return void
+ */
+ public function __construct($host = '127.0.0.1', $port = null, $config = null)
+ {
+ if (is_array($config)) {
+ if (isset($config['username'])) {
+ $this->_username = $config['username'];
+ }
+ if (isset($config['password'])) {
+ $this->_password = $config['password'];
+ }
+ }
+
+ parent::__construct($host, $port, $config);
+ }
+
+
+ /**
+ * @todo Perform CRAM-MD5 authentication with supplied credentials
+ *
+ * @return void
+ */
+ public function auth()
+ {
+ // Ensure AUTH has not already been initiated.
+ parent::auth();
+
+ $this->_send('AUTH CRAM-MD5');
+ $challenge = $this->_expect(334);
+ $challenge = base64_decode($challenge);
+ $digest = $this->_hmacMd5($this->_password, $challenge);
+ $this->_send(base64_encode($this->_username . ' ' . $digest));
+ $this->_expect(235);
+ $this->_auth = true;
+ }
+
+
+ /**
+ * Prepare CRAM-MD5 response to server's ticket
+ *
+ * @param string $key Challenge key (usually password)
+ * @param string $data Challenge data
+ * @param string $block Length of blocks
+ * @return string
+ */
+ protected function _hmacMd5($key, $data, $block = 64)
+ {
+ if (strlen($key) > 64) {
+ $key = pack('H32', md5($key));
+ } elseif (strlen($key) < 64) {
+ $key = str_pad($key, $block, chr(0));
+ }
+
+ $k_ipad = substr($key, 0, 64) ^ str_repeat(chr(0x36), 64);
+ $k_opad = substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64);
+
+ $inner = pack('H32', md5($k_ipad . $data));
+ $digest = md5($k_opad . $inner);
+
+ return $digest;
+ }
+}
diff --git a/libs/Zend/Mail/Protocol/Smtp/Auth/Login.php b/libs/Zend/Mail/Protocol/Smtp/Auth/Login.php
new file mode 100755
index 0000000000..668247bd5f
--- /dev/null
+++ b/libs/Zend/Mail/Protocol/Smtp/Auth/Login.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Protocol
+ * @version $Id$
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Mail_Protocol_Smtp
+ */
+require_once 'Zend/Mail/Protocol/Smtp.php';
+
+
+/**
+ * Performs LOGIN authentication
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Protocol
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mail_Protocol_Smtp_Auth_Login extends Zend_Mail_Protocol_Smtp
+{
+ /**
+ * LOGIN username
+ *
+ * @var string
+ */
+ protected $_username;
+
+
+ /**
+ * LOGIN password
+ *
+ * @var string
+ */
+ protected $_password;
+
+
+ /**
+ * Constructor.
+ *
+ * @param string $host (Default: 127.0.0.1)
+ * @param int $port (Default: null)
+ * @param array $config Auth-specific parameters
+ * @return void
+ */
+ public function __construct($host = '127.0.0.1', $port = null, $config = null)
+ {
+ if (is_array($config)) {
+ if (isset($config['username'])) {
+ $this->_username = $config['username'];
+ }
+ if (isset($config['password'])) {
+ $this->_password = $config['password'];
+ }
+ }
+
+ parent::__construct($host, $port, $config);
+ }
+
+
+ /**
+ * Perform LOGIN authentication with supplied credentials
+ *
+ * @return void
+ */
+ public function auth()
+ {
+ // Ensure AUTH has not already been initiated.
+ parent::auth();
+
+ $this->_send('AUTH LOGIN');
+ $this->_expect(334);
+ $this->_send(base64_encode($this->_username));
+ $this->_expect(334);
+ $this->_send(base64_encode($this->_password));
+ $this->_expect(235);
+ $this->_auth = true;
+ }
+}
diff --git a/libs/Zend/Mail/Protocol/Smtp/Auth/Plain.php b/libs/Zend/Mail/Protocol/Smtp/Auth/Plain.php
new file mode 100755
index 0000000000..0a2201c524
--- /dev/null
+++ b/libs/Zend/Mail/Protocol/Smtp/Auth/Plain.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Protocol
+ * @version $Id$
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Mail_Protocol_Smtp
+ */
+require_once 'Zend/Mail/Protocol/Smtp.php';
+
+
+/**
+ * Performs PLAIN authentication
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Protocol
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mail_Protocol_Smtp_Auth_Plain extends Zend_Mail_Protocol_Smtp
+{
+ /**
+ * PLAIN username
+ *
+ * @var string
+ */
+ protected $_username;
+
+
+ /**
+ * PLAIN password
+ *
+ * @var string
+ */
+ protected $_password;
+
+
+ /**
+ * Constructor.
+ *
+ * @param string $host (Default: 127.0.0.1)
+ * @param int $port (Default: null)
+ * @param array $config Auth-specific parameters
+ * @return void
+ */
+ public function __construct($host = '127.0.0.1', $port = null, $config = null)
+ {
+ if (is_array($config)) {
+ if (isset($config['username'])) {
+ $this->_username = $config['username'];
+ }
+ if (isset($config['password'])) {
+ $this->_password = $config['password'];
+ }
+ }
+
+ parent::__construct($host, $port, $config);
+ }
+
+
+ /**
+ * Perform PLAIN authentication with supplied credentials
+ *
+ * @return void
+ */
+ public function auth()
+ {
+ // Ensure AUTH has not already been initiated.
+ parent::auth();
+
+ $this->_send('AUTH PLAIN');
+ $this->_expect(334);
+ $this->_send(base64_encode(chr(0) . $this->_username . chr(0) . $this->_password));
+ $this->_expect(235);
+ $this->_auth = true;
+ }
+}
diff --git a/libs/Zend/Mail/Storage.php b/libs/Zend/Mail/Storage.php
new file mode 100755
index 0000000000..94171e6ae1
--- /dev/null
+++ b/libs/Zend/Mail/Storage.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Mail_Storage
+{
+ // maildir and IMAP flags, using IMAP names, where possible to be able to distinguish between IMAP
+ // system flags and other flags
+ const FLAG_PASSED = 'Passed';
+ const FLAG_SEEN = '\Seen';
+ const FLAG_ANSWERED = '\Answered';
+ const FLAG_FLAGGED = '\Flagged';
+ const FLAG_DELETED = '\Deleted';
+ const FLAG_DRAFT = '\Draft';
+ const FLAG_RECENT = '\Recent';
+}
diff --git a/libs/Zend/Mail/Storage/Abstract.php b/libs/Zend/Mail/Storage/Abstract.php
new file mode 100755
index 0000000000..8ae79d06d5
--- /dev/null
+++ b/libs/Zend/Mail/Storage/Abstract.php
@@ -0,0 +1,357 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * Zend_Mail_Exception
+ */
+require_once 'Zend/Mail/Storage/Exception.php';
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+abstract class Zend_Mail_Storage_Abstract implements Countable, ArrayAccess, SeekableIterator
+{
+ /**
+ * class capabilities with default values
+ * @var array
+ */
+ protected $_has = array('uniqueid' => true,
+ 'delete' => false,
+ 'create' => false,
+ 'top' => false,
+ 'fetchPart' => true,
+ 'flags' => false);
+
+ /**
+ * current iteration position
+ * @var int
+ */
+ protected $_iterationPos = 0;
+
+ /**
+ * maximum iteration position (= message count)
+ * @var null|int
+ */
+ protected $_iterationMax = null;
+
+ /**
+ * used message class, change it in an extened class to extend the returned message class
+ * @var string
+ */
+ protected $_messageClass = 'Zend_Mail_Message';
+
+ /**
+ * Getter for has-properties. The standard has properties
+ * are: hasFolder, hasUniqueid, hasDelete, hasCreate, hasTop
+ *
+ * The valid values for the has-properties are:
+ * - true if a feature is supported
+ * - false if a feature is not supported
+ * - null is it's not yet known or it can't be know if a feature is supported
+ *
+ * @param string $var property name
+ * @return bool supported or not
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function __get($var)
+ {
+ if (strpos($var, 'has') === 0) {
+ $var = strtolower(substr($var, 3));
+ return isset($this->_has[$var]) ? $this->_has[$var] : null;
+ }
+
+ throw new Zend_Mail_Storage_Exception($var . ' not found');
+ }
+
+
+ /**
+ * Get a full list of features supported by the specific mail lib and the server
+ *
+ * @return array list of features as array(featurename => true|false[|null])
+ */
+ public function getCapabilities()
+ {
+ return $this->_has;
+ }
+
+
+ /**
+ * Count messages messages in current box/folder
+ *
+ * @return int number of messages
+ * @throws Zend_Mail_Storage_Exception
+ */
+ abstract public function countMessages();
+
+
+ /**
+ * Get a list of messages with number and size
+ *
+ * @param int $id number of message
+ * @return int|array size of given message of list with all messages as array(num => size)
+ */
+ abstract public function getSize($id = 0);
+
+
+ /**
+ * Get a message with headers and body
+ *
+ * @param $id int number of message
+ * @return Zend_Mail_Message
+ */
+ abstract public function getMessage($id);
+
+
+ /**
+ * Get raw header of message or part
+ *
+ * @param int $id number of message
+ * @param null|array|string $part path to part or null for messsage header
+ * @param int $topLines include this many lines with header (after an empty line)
+ * @return string raw header
+ */
+ abstract public function getRawHeader($id, $part = null, $topLines = 0);
+
+ /**
+ * Get raw content of message or part
+ *
+ * @param int $id number of message
+ * @param null|array|string $part path to part or null for messsage content
+ * @return string raw content
+ */
+ abstract public function getRawContent($id, $part = null);
+
+ /**
+ * Create instance with parameters
+ *
+ * @param array $params mail reader specific parameters
+ * @throws Zend_Mail_Storage_Exception
+ */
+ abstract public function __construct($params);
+
+
+ /**
+ * Destructor calls close() and therefore closes the resource.
+ */
+ public function __destruct()
+ {
+ $this->close();
+ }
+
+
+ /**
+ * Close resource for mail lib. If you need to control, when the resource
+ * is closed. Otherwise the destructor would call this.
+ *
+ * @return null
+ */
+ abstract public function close();
+
+
+ /**
+ * Keep the resource alive.
+ *
+ * @return null
+ */
+ abstract public function noop();
+
+ /**
+ * delete a message from current box/folder
+ *
+ * @return null
+ */
+ abstract public function removeMessage($id);
+
+ /**
+ * get unique id for one or all messages
+ *
+ * if storage does not support unique ids it's the same as the message number
+ *
+ * @param int|null $id message number
+ * @return array|string message number for given message or all messages as array
+ * @throws Zend_Mail_Storage_Exception
+ */
+ abstract public function getUniqueId($id = null);
+
+ /**
+ * get a message number from a unique id
+ *
+ * I.e. if you have a webmailer that supports deleting messages you should use unique ids
+ * as parameter and use this method to translate it to message number right before calling removeMessage()
+ *
+ * @param string $id unique id
+ * @return int message number
+ * @throws Zend_Mail_Storage_Exception
+ */
+ abstract public function getNumberByUniqueId($id);
+
+ // interface implementations follows
+
+ /**
+ * Countable::count()
+ *
+ * @return int
+ */
+ public function count()
+ {
+ return $this->countMessages();
+ }
+
+
+ /**
+ * ArrayAccess::offsetExists()
+ *
+ * @param int $id
+ * @return boolean
+ */
+ public function offsetExists($id)
+ {
+ try {
+ if ($this->getMessage($id)) {
+ return true;
+ }
+ } catch(Zend_Mail_Storage_Exception $e) {}
+
+ return false;
+ }
+
+
+ /**
+ * ArrayAccess::offsetGet()
+ *
+ * @param int $id
+ * @return Zend_Mail_Message message object
+ */
+ public function offsetGet($id)
+ {
+ return $this->getMessage($id);
+ }
+
+
+ /**
+ * ArrayAccess::offsetSet()
+ *
+ * @param id $id
+ * @param mixed $value
+ * @throws Zend_Mail_Storage_Exception
+ * @return void
+ */
+ public function offsetSet($id, $value)
+ {
+ throw new Zend_Mail_Storage_Exception('cannot write mail messages via array access');
+ }
+
+
+ /**
+ * ArrayAccess::offsetUnset()
+ *
+ * @param int $id
+ * @return boolean success
+ */
+ public function offsetUnset($id)
+ {
+ return $this->removeMessage($id);
+ }
+
+
+ /**
+ * Iterator::rewind()
+ *
+ * Rewind always gets the new count from the storage. Thus if you use
+ * the interfaces and your scripts take long you should use reset()
+ * from time to time.
+ *
+ * @return void
+ */
+ public function rewind()
+ {
+ $this->_iterationMax = $this->countMessages();
+ $this->_iterationPos = 1;
+ }
+
+
+ /**
+ * Iterator::current()
+ *
+ * @return Zend_Mail_Message current message
+ */
+ public function current()
+ {
+ return $this->getMessage($this->_iterationPos);
+ }
+
+
+ /**
+ * Iterator::key()
+ *
+ * @return int id of current position
+ */
+ public function key()
+ {
+ return $this->_iterationPos;
+ }
+
+
+ /**
+ * Iterator::next()
+ *
+ * @return void
+ */
+ public function next()
+ {
+ ++$this->_iterationPos;
+ }
+
+
+ /**
+ * Iterator::valid()
+ *
+ * @return boolean
+ */
+ public function valid()
+ {
+ if ($this->_iterationMax === null) {
+ $this->_iterationMax = $this->countMessages();
+ }
+ return $this->_iterationPos && $this->_iterationPos <= $this->_iterationMax;
+ }
+
+
+ /**
+ * SeekableIterator::seek()
+ *
+ * @param int $pos
+ * @return void
+ * @throws OutOfBoundsException
+ */
+ public function seek($pos)
+ {
+ if ($this->_iterationMax === null) {
+ $this->_iterationMax = $this->countMessages();
+ }
+
+ if ($pos > $this->_iterationMax) {
+ throw new OutOfBoundsException('this position does not exist');
+ }
+ $this->_iterationPos = $pos;
+ }
+
+}
diff --git a/libs/Zend/Mail/Storage/Exception.php b/libs/Zend/Mail/Storage/Exception.php
new file mode 100755
index 0000000000..34d8e96c6b
--- /dev/null
+++ b/libs/Zend/Mail/Storage/Exception.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Storage
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+
+/**
+ * Zend_Mail_Exception
+ */
+require_once 'Zend/Mail/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Storage
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mail_Storage_Exception extends Zend_Mail_Exception
+{}
+
diff --git a/libs/Zend/Mail/Storage/Folder.php b/libs/Zend/Mail/Storage/Folder.php
new file mode 100755
index 0000000000..f7f5d8bf72
--- /dev/null
+++ b/libs/Zend/Mail/Storage/Folder.php
@@ -0,0 +1,232 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/**
+ * Zend_Mail_Storage_Exception
+ */
+require_once 'Zend/Mail/Storage/Exception.php';
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Mail_Storage_Folder implements RecursiveIterator
+{
+ /**
+ * subfolders of folder array(localName => Zend_Mail_Storage_Folder folder)
+ * @var array
+ */
+ protected $_folders;
+
+ /**
+ * local name (name of folder in parent folder)
+ * @var string
+ */
+ protected $_localName;
+
+ /**
+ * global name (absolute name of folder)
+ * @var string
+ */
+ protected $_globalName;
+
+ /**
+ * folder is selectable if folder is able to hold messages, else it's just a parent folder
+ * @var bool
+ */
+ protected $_selectable = true;
+
+ /**
+ * create a new mail folder instance
+ *
+ * @param string $localName name of folder in current subdirectory
+ * @param string $globalName absolute name of folder
+ * @param bool $selectable if true folder holds messages, if false it's just a parent for subfolders
+ * @param array $folders init with given instances of Zend_Mail_Storage_Folder as subfolders
+ */
+ public function __construct($localName, $globalName = '', $selectable = true, array $folders = array())
+ {
+ $this->_localName = $localName;
+ $this->_globalName = $globalName ? $globalName : $localName;
+ $this->_selectable = $selectable;
+ $this->_folders = $folders;
+ }
+
+ /**
+ * implements RecursiveIterator::hasChildren()
+ *
+ * @return bool current element has children
+ */
+ public function hasChildren()
+ {
+ $current = $this->current();
+ return $current && $current instanceof Zend_Mail_Storage_Folder && !$current->isLeaf();
+ }
+
+ /**
+ * implements RecursiveIterator::getChildren()
+ *
+ * @return Zend_Mail_Storage_Folder same as self::current()
+ */
+ public function getChildren()
+ {
+ return $this->current();
+ }
+
+ /**
+ * implements Iterator::valid()
+ *
+ * @return bool check if there's a current element
+ */
+ public function valid()
+ {
+ return key($this->_folders) !== null;
+ }
+
+ /**
+ * implements Iterator::next()
+ *
+ * @return null
+ */
+ public function next()
+ {
+ next($this->_folders);
+ }
+
+ /**
+ * implements Iterator::key()
+ *
+ * @return string key/local name of current element
+ */
+ public function key()
+ {
+ return key($this->_folders);
+ }
+
+ /**
+ * implements Iterator::current()
+ *
+ * @return Zend_Mail_Storage_Folder current folder
+ */
+ public function current()
+ {
+ return current($this->_folders);
+ }
+
+ /**
+ * implements Iterator::rewind()
+ *
+ * @return null
+ */
+ public function rewind()
+ {
+ reset($this->_folders);
+ }
+
+ /**
+ * get subfolder named $name
+ *
+ * @param string $name wanted subfolder
+ * @return Zend_Mail_Storage_Folder folder named $folder
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function __get($name)
+ {
+ if (!isset($this->_folders[$name])) {
+ throw new Zend_Mail_Storage_Exception("no subfolder named $name");
+ }
+
+ return $this->_folders[$name];
+ }
+
+ /**
+ * add or replace subfolder named $name
+ *
+ * @param string $name local name of subfolder
+ * @param Zend_Mail_Storage_Folder $folder instance for new subfolder
+ * @return null
+ */
+ public function __set($name, Zend_Mail_Storage_Folder $folder)
+ {
+ $this->_folders[$name] = $folder;
+ }
+
+ /**
+ * remove subfolder named $name
+ *
+ * @param string $name local name of subfolder
+ * @return null
+ */
+ public function __unset($name)
+ {
+ unset($this->_folders[$name]);
+ }
+
+ /**
+ * magic method for easy output of global name
+ *
+ * @return string global name of folder
+ */
+ public function __toString()
+ {
+ return (string)$this->getGlobalName();
+ }
+
+ /**
+ * get local name
+ *
+ * @return string local name
+ */
+ public function getLocalName()
+ {
+ return $this->_localName;
+ }
+
+ /**
+ * get global name
+ *
+ * @return string global name
+ */
+ public function getGlobalName()
+ {
+ return $this->_globalName;
+ }
+
+ /**
+ * is this folder selectable?
+ *
+ * @return bool selectable
+ */
+ public function isSelectable()
+ {
+ return $this->_selectable;
+ }
+
+ /**
+ * check if folder has no subfolder
+ *
+ * @return bool true if no subfolders
+ */
+ public function isLeaf()
+ {
+ return empty($this->_folders);
+ }
+}
diff --git a/libs/Zend/Mail/Storage/Folder/Interface.php b/libs/Zend/Mail/Storage/Folder/Interface.php
new file mode 100755
index 0000000000..4087466ad5
--- /dev/null
+++ b/libs/Zend/Mail/Storage/Folder/Interface.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+interface Zend_Mail_Storage_Folder_Interface
+{
+ /**
+ * get root folder or given folder
+ *
+ * @param string $rootFolder get folder structure for given folder, else root
+ * @return Zend_Mail_Storage_Folder root or wanted folder
+ */
+ public function getFolders($rootFolder = null);
+
+ /**
+ * select given folder
+ *
+ * folder must be selectable!
+ *
+ * @param Zend_Mail_Storage_Folder|string $globalName global name of folder or instance for subfolder
+ * @return null
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function selectFolder($globalName);
+
+
+ /**
+ * get Zend_Mail_Storage_Folder instance for current folder
+ *
+ * @return Zend_Mail_Storage_Folder instance of current folder
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getCurrentFolder();
+}
diff --git a/libs/Zend/Mail/Storage/Folder/Maildir.php b/libs/Zend/Mail/Storage/Folder/Maildir.php
new file mode 100755
index 0000000000..817900c5c9
--- /dev/null
+++ b/libs/Zend/Mail/Storage/Folder/Maildir.php
@@ -0,0 +1,226 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * Zend_Mail_Storage_Folder
+ */
+require_once 'Zend/Mail/Storage/Folder.php';
+
+/**
+ * Zend_Mail_Storage_Folder_Interface
+ */
+require_once 'Zend/Mail/Storage/Folder/Interface.php';
+
+/**
+ * Zend_Mail_Storage_Maildir
+ */
+require_once 'Zend/Mail/Storage/Maildir.php';
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Mail_Storage_Folder_Maildir extends Zend_Mail_Storage_Maildir implements Zend_Mail_Storage_Folder_Interface
+{
+ /**
+ * Zend_Mail_Storage_Folder root folder for folder structure
+ * @var Zend_Mail_Storage_Folder
+ */
+ protected $_rootFolder;
+
+ /**
+ * rootdir of folder structure
+ * @var string
+ */
+ protected $_rootdir;
+
+ /**
+ * name of current folder
+ * @var string
+ */
+ protected $_currentFolder;
+
+ /**
+ * delim char for subfolders
+ * @var string
+ */
+ protected $_delim;
+
+ /**
+ * Create instance with parameters
+ * Supported parameters are:
+ * - dirname rootdir of maildir structure
+ * - delim delim char for folder structur, default is '.'
+ * - folder intial selected folder, default is 'INBOX'
+ *
+ * @param $params array mail reader specific parameters
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function __construct($params)
+ {
+ if (!isset($params['dirname']) || !is_dir($params['dirname'])) {
+ throw new Zend_Mail_Storage_Exception('no valid dirname given in params');
+ }
+
+ $this->_rootdir = rtrim($params['dirname'], DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
+
+ $this->_delim = isset($params['delim']) ? $params['delim'] : '.';
+
+ $this->_buildFolderTree();
+ $this->selectFolder(!empty($params['folder']) ? $params['folder'] : 'INBOX');
+ $this->_has['top'] = true;
+ $this->_has['flags'] = true;
+ }
+
+ /**
+ * find all subfolders and mbox files for folder structure
+ *
+ * Result is save in Zend_Mail_Storage_Folder instances with the root in $this->_rootFolder.
+ * $parentFolder and $parentGlobalName are only used internally for recursion.
+ *
+ * @return null
+ * @throws Zend_Mail_Storage_Exception
+ */
+ protected function _buildFolderTree()
+ {
+ $this->_rootFolder = new Zend_Mail_Storage_Folder('/', '/', false);
+ $this->_rootFolder->INBOX = new Zend_Mail_Storage_Folder('INBOX', 'INBOX', true);
+
+ $dh = @opendir($this->_rootdir);
+ if (!$dh) {
+ throw new Zend_Mail_Storage_Exception("can't read folders in maildir");
+ }
+ $dirs = array();
+ while (($entry = readdir($dh)) !== false) {
+ // maildir++ defines folders must start with .
+ if ($entry[0] != '.' || $entry == '.' || $entry == '..') {
+ continue;
+ }
+ if ($this->_isMaildir($this->_rootdir . $entry)) {
+ $dirs[] = $entry;
+ }
+ }
+ closedir($dh);
+
+ sort($dirs);
+ $stack = array(null);
+ $folderStack = array(null);
+ $parentFolder = $this->_rootFolder;
+ $parent = '.';
+
+ foreach ($dirs as $dir) {
+ do {
+ if (strpos($dir, $parent) === 0) {
+ $local = substr($dir, strlen($parent));
+ if (strpos($local, $this->_delim) !== false) {
+ throw new Zend_Mail_Storage_Exception('error while reading maildir');
+ }
+ array_push($stack, $parent);
+ $parent = $dir . $this->_delim;
+ $folder = new Zend_Mail_Storage_Folder($local, substr($dir, 1), true);
+ $parentFolder->$local = $folder;
+ array_push($folderStack, $parentFolder);
+ $parentFolder = $folder;
+ break;
+ } else if ($stack) {
+ $parent = array_pop($stack);
+ $parentFolder = array_pop($folderStack);
+ }
+ } while ($stack);
+ if (!$stack) {
+ throw new Zend_Mail_Storage_Exception('error while reading maildir');
+ }
+ }
+ }
+
+ /**
+ * get root folder or given folder
+ *
+ * @param string $rootFolder get folder structure for given folder, else root
+ * @return Zend_Mail_Storage_Folder root or wanted folder
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getFolders($rootFolder = null)
+ {
+ if (!$rootFolder || $rootFolder == 'INBOX') {
+ return $this->_rootFolder;
+ }
+
+ // rootdir is same as INBOX in maildir
+ if (strpos($rootFolder, 'INBOX' . $this->_delim) === 0) {
+ $rootFolder = substr($rootFolder, 6);
+ }
+ $currentFolder = $this->_rootFolder;
+ $subname = trim($rootFolder, $this->_delim);
+ while ($currentFolder) {
+ @list($entry, $subname) = @explode($this->_delim, $subname, 2);
+ $currentFolder = $currentFolder->$entry;
+ if (!$subname) {
+ break;
+ }
+ }
+
+ if ($currentFolder->getGlobalName() != rtrim($rootFolder, $this->_delim)) {
+ throw new Zend_Mail_Storage_Exception("folder $rootFolder not found");
+ }
+ return $currentFolder;
+ }
+
+ /**
+ * select given folder
+ *
+ * folder must be selectable!
+ *
+ * @param Zend_Mail_Storage_Folder|string $globalName global name of folder or instance for subfolder
+ * @return null
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function selectFolder($globalName)
+ {
+ $this->_currentFolder = (string)$globalName;
+
+ // getting folder from folder tree for validation
+ $folder = $this->getFolders($this->_currentFolder);
+
+ try {
+ $this->_openMaildir($this->_rootdir . '.' . $folder->getGlobalName());
+ } catch(Zend_Mail_Storage_Exception $e) {
+ // check what went wrong
+ if (!$folder->isSelectable()) {
+ throw new Zend_Mail_Storage_Exception("{$this->_currentFolder} is not selectable");
+ }
+ // seems like file has vanished; rebuilding folder tree - but it's still an exception
+ $this->_buildFolderTree($this->_rootdir);
+ throw new Zend_Mail_Storage_Exception('seems like the maildir has vanished, I\'ve rebuild the ' .
+ 'folder tree, search for an other folder and try again');
+ }
+ }
+
+ /**
+ * get Zend_Mail_Storage_Folder instance for current folder
+ *
+ * @return Zend_Mail_Storage_Folder instance of current folder
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getCurrentFolder()
+ {
+ return $this->_currentFolder;
+ }
+}
diff --git a/libs/Zend/Mail/Storage/Folder/Mbox.php b/libs/Zend/Mail/Storage/Folder/Mbox.php
new file mode 100755
index 0000000000..1bb05e4155
--- /dev/null
+++ b/libs/Zend/Mail/Storage/Folder/Mbox.php
@@ -0,0 +1,234 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * Zend_Mail_Storage_Folder
+ */
+require_once 'Zend/Mail/Storage/Folder.php';
+
+/**
+ * Zend_Mail_Storage_Folder_Interface
+ */
+require_once 'Zend/Mail/Storage/Folder/Interface.php';
+
+/**
+ * Zend_Mail_Storage_Mbox
+ */
+require_once 'Zend/Mail/Storage/Mbox.php';
+
+/**
+ * Zend_Mail_Storage_Exception
+ */
+require_once 'Zend/Mail/Storage/Exception.php';
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Mail_Storage_Folder_Mbox extends Zend_Mail_Storage_Mbox implements Zend_Mail_Storage_Folder_Interface
+{
+ /**
+ * Zend_Mail_Storage_Folder root folder for folder structure
+ * @var Zend_Mail_Storage_Folder
+ */
+ protected $_rootFolder;
+
+ /**
+ * rootdir of folder structure
+ * @var string
+ */
+ protected $_rootdir;
+
+ /**
+ * name of current folder
+ * @var string
+ */
+ protected $_currentFolder;
+
+ /**
+ * Create instance with parameters
+ *
+ * Disallowed parameters are:
+ * - filename use Zend_Mail_Storage_Mbox for a single file
+ * Supported parameters are:
+ * - dirname rootdir of mbox structure
+ * - folder intial selected folder, default is 'INBOX'
+ *
+ * @param $params array mail reader specific parameters
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function __construct($params)
+ {
+ if (isset($params['filename'])) {
+ throw new Zend_Mail_Storage_Exception('use Zend_Mail_Storage_Mbox for a single file');
+ }
+
+ if (!isset($params['dirname']) || !is_dir($params['dirname'])) {
+ throw new Zend_Mail_Storage_Exception('no valid dirname given in params');
+ }
+
+ $this->_rootdir = rtrim($params['dirname'], DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
+
+ $this->_buildFolderTree($this->_rootdir);
+ $this->selectFolder(!empty($params['folder']) ? $params['folder'] : 'INBOX');
+ $this->_has['top'] = true;
+ $this->_has['uniqueid'] = false;
+ }
+
+ /**
+ * find all subfolders and mbox files for folder structure
+ *
+ * Result is save in Zend_Mail_Storage_Folder instances with the root in $this->_rootFolder.
+ * $parentFolder and $parentGlobalName are only used internally for recursion.
+ *
+ * @param string $currentDir call with root dir, also used for recursion.
+ * @param Zend_Mail_Storage_Folder|null $parentFolder used for recursion
+ * @param string $parentGlobalName used for rescursion
+ * @return null
+ * @throws Zend_Mail_Storage_Exception
+ */
+ protected function _buildFolderTree($currentDir, $parentFolder = null, $parentGlobalName = '')
+ {
+ if (!$parentFolder) {
+ $this->_rootFolder = new Zend_Mail_Storage_Folder('/', '/', false);
+ $parentFolder = $this->_rootFolder;
+ }
+
+ $dh = @opendir($currentDir);
+ if (!$dh) {
+ throw new Zend_Mail_Storage_Exception("can't read dir $currentDir");
+ }
+ while (($entry = readdir($dh)) !== false) {
+ // ignore hidden files for mbox
+ if ($entry[0] == '.') {
+ continue;
+ }
+ $absoluteEntry = $currentDir . $entry;
+ $globalName = $parentGlobalName . DIRECTORY_SEPARATOR . $entry;
+ if (is_file($absoluteEntry) && $this->_isMboxFile($absoluteEntry)) {
+ $parentFolder->$entry = new Zend_Mail_Storage_Folder($entry, $globalName);
+ continue;
+ }
+ if (!is_dir($absoluteEntry) /* || $entry == '.' || $entry == '..' */) {
+ continue;
+ }
+ $folder = new Zend_Mail_Storage_Folder($entry, $globalName, false);
+ $parentFolder->$entry = $folder;
+ $this->_buildFolderTree($absoluteEntry . DIRECTORY_SEPARATOR, $folder, $globalName);
+ }
+
+ closedir($dh);
+ }
+
+ /**
+ * get root folder or given folder
+ *
+ * @param string $rootFolder get folder structure for given folder, else root
+ * @return Zend_Mail_Storage_Folder root or wanted folder
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getFolders($rootFolder = null)
+ {
+ if (!$rootFolder) {
+ return $this->_rootFolder;
+ }
+
+ $currentFolder = $this->_rootFolder;
+ $subname = trim($rootFolder, DIRECTORY_SEPARATOR);
+ while ($currentFolder) {
+ @list($entry, $subname) = @explode(DIRECTORY_SEPARATOR, $subname, 2);
+ $currentFolder = $currentFolder->$entry;
+ if (!$subname) {
+ break;
+ }
+ }
+
+ if ($currentFolder->getGlobalName() != DIRECTORY_SEPARATOR . trim($rootFolder, DIRECTORY_SEPARATOR)) {
+ throw new Zend_Mail_Storage_Exception("folder $rootFolder not found");
+ }
+ return $currentFolder;
+ }
+
+ /**
+ * select given folder
+ *
+ * folder must be selectable!
+ *
+ * @param Zend_Mail_Storage_Folder|string $globalName global name of folder or instance for subfolder
+ * @return null
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function selectFolder($globalName)
+ {
+ $this->_currentFolder = (string)$globalName;
+
+ // getting folder from folder tree for validation
+ $folder = $this->getFolders($this->_currentFolder);
+
+ try {
+ $this->_openMboxFile($this->_rootdir . $folder->getGlobalName());
+ } catch(Zend_Mail_Storage_Exception $e) {
+ // check what went wrong
+ if (!$folder->isSelectable()) {
+ throw new Zend_Mail_Storage_Exception("{$this->_currentFolder} is not selectable");
+ }
+ // seems like file has vanished; rebuilding folder tree - but it's still an exception
+ $this->_buildFolderTree($this->_rootdir);
+ throw new Zend_Mail_Storage_Exception('seems like the mbox file has vanished, I\'ve rebuild the ' .
+ 'folder tree, search for an other folder and try again');
+ }
+ }
+
+ /**
+ * get Zend_Mail_Storage_Folder instance for current folder
+ *
+ * @return Zend_Mail_Storage_Folder instance of current folder
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getCurrentFolder()
+ {
+ return $this->_currentFolder;
+ }
+
+ /**
+ * magic method for serialize()
+ *
+ * with this method you can cache the mbox class
+ *
+ * @return array name of variables
+ */
+ public function __sleep()
+ {
+ return array_merge(parent::__sleep(), array('_currentFolder', '_rootFolder', '_rootdir'));
+ }
+
+ /**
+ * magic method for unserialize()
+ *
+ * with this method you can cache the mbox class
+ *
+ * @return null
+ */
+ public function __wakeup()
+ {
+ // if cache is stall selectFolder() rebuilds the tree on error
+ parent::__wakeup();
+ }
+}
diff --git a/libs/Zend/Mail/Storage/Imap.php b/libs/Zend/Mail/Storage/Imap.php
new file mode 100755
index 0000000000..0b5017cc1a
--- /dev/null
+++ b/libs/Zend/Mail/Storage/Imap.php
@@ -0,0 +1,524 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/**
+ * Zend_Mail_Storage_Abstract
+ */
+require_once 'Zend/Mail/Storage/Abstract.php';
+
+/**
+ * Zend_Mail_Protocol_Imap
+ */
+require_once 'Zend/Mail/Protocol/Imap.php';
+
+/**
+ * Zend_Mail_Storage_Writable_Interface
+ */
+require_once 'Zend/Mail/Storage/Writable/Interface.php';
+
+/**
+ * Zend_Mail_Storage_Folder_Interface
+ */
+require_once 'Zend/Mail/Storage/Folder/Interface.php';
+
+/**
+ * Zend_Mail_Storage_Folder
+ */
+require_once 'Zend/Mail/Storage/Folder.php';
+
+/**
+ * Zend_Mail_Message
+ */
+require_once 'Zend/Mail/Message.php';
+
+/**
+ * Zend_Mail_Storage_Exception
+ */
+require_once 'Zend/Mail/Storage/Exception.php';
+
+/**
+ * Zend_Mail_Storage
+ */
+require_once 'Zend/Mail/Storage.php';
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Mail_Storage_Imap extends Zend_Mail_Storage_Abstract
+ implements Zend_Mail_Storage_Folder_Interface, Zend_Mail_Storage_Writable_Interface
+{
+ // TODO: with an internal cache we could optimize this class, or create an extra class with
+ // such optimizations. Especially the various fetch calls could be combined to one cache call
+
+ /**
+ * protocol handler
+ * @var null|Zend_Mail_Protocol_Imap
+ */
+ protected $_protocol;
+
+ /**
+ * name of current folder
+ * @var string
+ */
+ protected $_currentFolder = '';
+
+ /**
+ * imap flags to constants translation
+ * @var array
+ */
+ protected static $_knownFlags = array('\Passed' => Zend_Mail_Storage::FLAG_PASSED,
+ '\Answered' => Zend_Mail_Storage::FLAG_ANSWERED,
+ '\Seen' => Zend_Mail_Storage::FLAG_SEEN,
+ '\Deleted' => Zend_Mail_Storage::FLAG_DELETED,
+ '\Draft' => Zend_Mail_Storage::FLAG_DRAFT,
+ '\Flagged' => Zend_Mail_Storage::FLAG_FLAGGED);
+
+ /**
+ * Count messages all messages in current box
+ *
+ * @return int number of messages
+ * @throws Zend_Mail_Storage_Exception
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function countMessages()
+ {
+ if (!$this->_currentFolder) {
+ throw new Zend_Mail_Storage_Exception('No selected folder to count');
+ }
+
+ // we're reselecting the current mailbox, because STATUS is slow and shouldn't be used on the current mailbox
+ $result = $this->_protocol->select($this->_currentFolder);
+ return $result['exists'];
+ }
+
+ /**
+ * get a list of messages with number and size
+ *
+ * @param int $id number of message
+ * @return int|array size of given message of list with all messages as array(num => size)
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function getSize($id = 0)
+ {
+ if ($id) {
+ return $this->_protocol->fetch('RFC822.SIZE', $id);
+ }
+ return $this->_protocol->fetch('RFC822.SIZE', 1, INF);
+ }
+
+ /**
+ * Fetch a message
+ *
+ * @param int $id number of message
+ * @return Zend_Mail_Message
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function getMessage($id)
+ {
+ $data = $this->_protocol->fetch(array('FLAGS', 'RFC822.HEADER'), $id);
+ $header = $data['RFC822.HEADER'];
+
+ $flags = array();
+ foreach ($data['FLAGS'] as $flag) {
+ $flags[] = isset(self::$_knownFlags[$flag]) ? self::$_knownFlags[$flag] : $flag;
+ }
+
+ return new $this->_messageClass(array('handler' => $this, 'id' => $id, 'headers' => $header, 'flags' => $flags));
+ }
+
+ /*
+ * Get raw header of message or part
+ *
+ * @param int $id number of message
+ * @param null|array|string $part path to part or null for messsage header
+ * @param int $topLines include this many lines with header (after an empty line)
+ * @param int $topLines include this many lines with header (after an empty line)
+ * @return string raw header
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function getRawHeader($id, $part = null, $topLines = 0)
+ {
+ if ($part !== null) {
+ // TODO: implement
+ throw new Zend_Mail_Storage_Exception('not implemented');
+ }
+
+ // TODO: toplines
+ return $this->_protocol->fetch('RFC822.HEADER', $id);
+ }
+
+ /*
+ * Get raw content of message or part
+ *
+ * @param int $id number of message
+ * @param null|array|string $part path to part or null for messsage content
+ * @return string raw content
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function getRawContent($id, $part = null)
+ {
+ if ($part !== null) {
+ // TODO: implement
+ throw new Zend_Mail_Storage_Exception('not implemented');
+ }
+
+ return $this->_protocol->fetch('RFC822.TEXT', $id);
+ }
+
+ /**
+ * create instance with parameters
+ * Supported paramters are
+ * - user username
+ * - host hostname or ip address of IMAP server [optional, default = 'localhost']
+ * - password password for user 'username' [optional, default = '']
+ * - port port for IMAP server [optional, default = 110]
+ * - ssl 'SSL' or 'TLS' for secure sockets
+ * - folder select this folder [optional, default = 'INBOX']
+ *
+ * @param array $params mail reader specific parameters
+ * @throws Zend_Mail_Storage_Exception
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function __construct($params)
+ {
+ $this->_has['flags'] = true;
+
+ if ($params instanceof Zend_Mail_Protocol_Imap) {
+ $this->_protocol = $params;
+ try {
+ $this->selectFolder('INBOX');
+ } catch(Zend_Mail_Storage_Exception $e) {
+ throw new Zend_Mail_Storage_Exception('cannot select INBOX, is this a valid transport?');
+ }
+ return;
+ }
+
+ if (!isset($params['user'])) {
+ throw new Zend_Mail_Storage_Exception('need at least user in params');
+ }
+
+ $params['host'] = isset($params['host']) ? $params['host'] : 'localhost';
+ $params['password'] = isset($params['password']) ? $params['password'] : '';
+ $params['port'] = isset($params['port']) ? $params['port'] : null;
+ $params['ssl'] = isset($params['ssl']) ? $params['ssl'] : false;
+
+ $this->_protocol = new Zend_Mail_Protocol_Imap();
+ $this->_protocol->connect($params['host'], $params['port'], $params['ssl']);
+ if (!$this->_protocol->login($params['user'], $params['password'])) {
+ throw new Zend_Mail_Storage_Exception('cannot login, user or password wrong');
+ }
+ $this->selectFolder(isset($params['folder']) ? $params['folder'] : 'INBOX');
+ }
+
+ /**
+ * Close resource for mail lib. If you need to control, when the resource
+ * is closed. Otherwise the destructor would call this.
+ *
+ * @return null
+ */
+ public function close()
+ {
+ $this->_currentFolder = '';
+ $this->_protocol->logout();
+ }
+
+ /**
+ * Keep the server busy.
+ *
+ * @return null
+ */
+ public function noop()
+ {
+ if (!$this->_protocol->noop()) {
+ throw new Zend_Mail_Storage_Exception('could not do nothing');
+ }
+ }
+
+ /**
+ * Remove a message from server. If you're doing that from a web enviroment
+ * you should be careful and use a uniqueid as parameter if possible to
+ * identify the message.
+ *
+ * @param int $id number of message
+ * @return null
+ */
+ public function removeMessage($id)
+ {
+ if (!$this->_protocol->store(array(Zend_Mail_Storage::FLAG_DELETED), $id, null, '+')) {
+ throw new Zend_Mail_Storage_Exception('cannot set deleted flag');
+ }
+ // TODO: expunge here or at close? we can handle an error here better and are more fail safe
+ if (!$this->_protocol->expunge()) {
+ throw new Zend_Mail_Storage_Exception('message marked as deleted, but could not expunge');
+ }
+ }
+
+ /**
+ * get unique id for one or all messages
+ *
+ * if storage does not support unique ids it's the same as the message number
+ *
+ * @param int|null $id message number
+ * @return array|string message number for given message or all messages as array
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getUniqueId($id = null)
+ {
+ if ($id) {
+ return $this->_protocol->fetch('UID', $id);
+ }
+
+ return $this->_protocol->fetch('UID', 1, INF);
+ }
+
+ /**
+ * get a message number from a unique id
+ *
+ * I.e. if you have a webmailer that supports deleting messages you should use unique ids
+ * as parameter and use this method to translate it to message number right before calling removeMessage()
+ *
+ * @param string $id unique id
+ * @return int message number
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getNumberByUniqueId($id)
+ {
+ // TODO: use search to find number directly
+ $ids = $this->getUniqueId();
+ foreach ($ids as $k => $v) {
+ if ($v == $id) {
+ return $k;
+ }
+ }
+
+ throw new Zend_Mail_Storage_Exception('unique id not found');
+ }
+
+
+ /**
+ * get root folder or given folder
+ *
+ * @param string $rootFolder get folder structure for given folder, else root
+ * @return Zend_Mail_Storage_Folder root or wanted folder
+ * @throws Zend_Mail_Storage_Exception
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function getFolders($rootFolder = null)
+ {
+ $folders = $this->_protocol->listMailbox((string)$rootFolder);
+ if (!$folders) {
+ throw new Zend_Mail_Storage_Exception('folder not found');
+ }
+
+ ksort($folders, SORT_STRING);
+ $root = new Zend_Mail_Storage_Folder('/', '/', false);
+ $stack = array(null);
+ $folderStack = array(null);
+ $parentFolder = $root;
+ $parent = '';
+
+ foreach ($folders as $globalName => $data) {
+ do {
+ if (!$parent || strpos($globalName, $parent) === 0) {
+ $pos = strrpos($globalName, $data['delim']);
+ if ($pos === false) {
+ $localName = $globalName;
+ } else {
+ $localName = substr($globalName, $pos + 1);
+ }
+ $selectable = !$data['flags'] || !in_array('\\Noselect', $data['flags']);
+
+ array_push($stack, $parent);
+ $parent = $globalName . $data['delim'];
+ $folder = new Zend_Mail_Storage_Folder($localName, $globalName, $selectable);
+ $parentFolder->$localName = $folder;
+ array_push($folderStack, $parentFolder);
+ $parentFolder = $folder;
+ break;
+ } else if ($stack) {
+ $parent = array_pop($stack);
+ $parentFolder = array_pop($folderStack);
+ }
+ } while ($stack);
+ if (!$stack) {
+ throw new Zend_Mail_Storage_Exception('error while constructing folder tree');
+ }
+ }
+
+ return $root;
+ }
+
+ /**
+ * select given folder
+ *
+ * folder must be selectable!
+ *
+ * @param Zend_Mail_Storage_Folder|string $globalName global name of folder or instance for subfolder
+ * @return null
+ * @throws Zend_Mail_Storage_Exception
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function selectFolder($globalName)
+ {
+ $this->_currentFolder = $globalName;
+ if (!$this->_protocol->select($this->_currentFolder)) {
+ $this->_currentFolder = '';
+ throw new Zend_Mail_Storage_Exception('cannot change folder, maybe it does not exist');
+ }
+ }
+
+
+ /**
+ * get Zend_Mail_Storage_Folder instance for current folder
+ *
+ * @return Zend_Mail_Storage_Folder instance of current folder
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getCurrentFolder()
+ {
+ return $this->_currentFolder;
+ }
+
+ /**
+ * create a new folder
+ *
+ * This method also creates parent folders if necessary. Some mail storages may restrict, which folder
+ * may be used as parent or which chars may be used in the folder name
+ *
+ * @param string $name global name of folder, local name if $parentFolder is set
+ * @param string|Zend_Mail_Storage_Folder $parentFolder parent folder for new folder, else root folder is parent
+ * @return null
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function createFolder($name, $parentFolder = null)
+ {
+ // TODO: we assume / as the hierarchy delim - need to get that from the folder class!
+ if ($parentFolder instanceof Zend_Mail_Storage_Folder) {
+ $folder = $parentFolder->getGlobalName() . '/' . $name;
+ } else if ($parentFolder != null) {
+ $folder = $parentFolder . '/' . $name;
+ } else {
+ $folder = $name;
+ }
+
+ if (!$this->_protocol->create($folder)) {
+ throw new Zend_Mail_Storage_Exception('cannot create folder');
+ }
+ }
+
+ /**
+ * remove a folder
+ *
+ * @param string|Zend_Mail_Storage_Folder $name name or instance of folder
+ * @return null
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function removeFolder($name)
+ {
+ if ($name instanceof Zend_Mail_Storage_Folder) {
+ $name = $name->getGlobalName();
+ }
+
+ if (!$this->_protocol->delete($name)) {
+ throw new Zend_Mail_Storage_Exception('cannot delete folder');
+ }
+ }
+
+ /**
+ * rename and/or move folder
+ *
+ * The new name has the same restrictions as in createFolder()
+ *
+ * @param string|Zend_Mail_Storage_Folder $oldName name or instance of folder
+ * @param string $newName new global name of folder
+ * @return null
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function renameFolder($oldName, $newName)
+ {
+ if ($oldName instanceof Zend_Mail_Storage_Folder) {
+ $oldName = $oldName->getGlobalName();
+ }
+
+ if (!$this->_protocol->rename($oldName, $newName)) {
+ throw new Zend_Mail_Storage_Exception('cannot rename folder');
+ }
+ }
+
+ /**
+ * append a new message to mail storage
+ *
+ * @param string $message message as string or instance of message class
+ * @param null|string|Zend_Mail_Storage_Folder $folder folder for new message, else current folder is taken
+ * @param null|array $flags set flags for new message, else a default set is used
+ * @throw Zend_Mail_Storage_Exception
+ */
+ // not yet * @param string|Zend_Mail_Message|Zend_Mime_Message $message message as string or instance of message class
+ public function appendMessage($message, $folder = null, $flags = null)
+ {
+ if ($folder === null) {
+ $folder = $this->_currentFolder;
+ }
+
+ if ($flags === null) {
+ $flags = array(Zend_Mail_Storage::FLAG_SEEN);
+ }
+
+ // TODO: handle class instances for $message
+ if (!$this->_protocol->append($folder, $message, $flags)) {
+ throw new Zend_Mail_Storage_Exception('cannot create message, please check if the folder exists and your flags');
+ }
+ }
+
+ /**
+ * copy an existing message
+ *
+ * @param int $id number of message
+ * @param string|Zend_Mail_Storage_Folder $folder name or instance of targer folder
+ * @return null
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function copyMessage($id, $folder)
+ {
+ if (!$this->_protocol->copy($folder, $id)) {
+ throw new Zend_Mail_Storage_Exception('cannot copy message, does the folder exist?');
+ }
+ }
+
+
+ /**
+ * set flags for message
+ *
+ * NOTE: this method can't set the recent flag.
+ *
+ * @param int $id number of message
+ * @param array $flags new flags for message
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function setFlags($id, $flags)
+ {
+ if (!$this->_protocol->store($flags, $id)) {
+ throw new Zend_Mail_Storage_Exception('cannot set flags, have you tried to set the recent flag or special chars?');
+ }
+ }
+}
+
diff --git a/libs/Zend/Mail/Storage/Maildir.php b/libs/Zend/Mail/Storage/Maildir.php
new file mode 100755
index 0000000000..cd8503df83
--- /dev/null
+++ b/libs/Zend/Mail/Storage/Maildir.php
@@ -0,0 +1,381 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/**
+ * Zend_Mail_Storage_Abstract
+ */
+require_once 'Zend/Mail/Storage/Abstract.php';
+
+/**
+ * Zend_Mail_Message
+ */
+require_once 'Zend/Mail/Message.php';
+
+/**
+ * Zend_Mail_Storage_Exception
+ */
+require_once 'Zend/Mail/Storage/Exception.php';
+
+/**
+ * Zend_Mail_Storage
+ */
+require_once 'Zend/Mail/Storage.php';
+
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Mail_Storage_Maildir extends Zend_Mail_Storage_Abstract
+{
+ /**
+ * data of found message files in maildir dir
+ * @var array
+ */
+ protected $_files = array();
+
+ /**
+ * known flag chars in filenames
+ *
+ * This list has to be in alphabetical order for setFlags()
+ *
+ * @var array
+ */
+ protected static $_knownFlags = array('D' => Zend_Mail_Storage::FLAG_DRAFT,
+ 'F' => Zend_Mail_Storage::FLAG_FLAGGED,
+ 'P' => Zend_Mail_Storage::FLAG_PASSED,
+ 'R' => Zend_Mail_Storage::FLAG_ANSWERED,
+ 'S' => Zend_Mail_Storage::FLAG_SEEN,
+ 'T' => Zend_Mail_Storage::FLAG_DELETED);
+
+ /**
+ * Count messages all messages in current box
+ *
+ * @return int number of messages
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function countMessages()
+ {
+ return count($this->_files);
+ }
+
+ /**
+ * Get one or all fields from file structure. Also checks if message is valid
+ *
+ * @param int $id message number
+ * @param string|null $field wanted field
+ * @return string|array wanted field or all fields as array
+ * @throws Zend_Mail_Storage_Exception
+ */
+ protected function _getFileData($id, $field = null)
+ {
+ if (!isset($this->_files[$id - 1])) {
+ throw new Zend_Mail_Storage_Exception('id does not exist');
+ }
+
+ if (!$field) {
+ return $this->_files[$id - 1];
+ }
+
+ if (!isset($this->_files[$id - 1][$field])) {
+ throw new Zend_Mail_Storage_Exception('field does not exist');
+ }
+
+ return $this->_files[$id - 1][$field];
+ }
+
+ /**
+ * Get a list of messages with number and size
+ *
+ * @param int|null $id number of message or null for all messages
+ * @return int|array size of given message of list with all messages as array(num => size)
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getSize($id = null)
+ {
+ if ($id !== null) {
+ return filesize($this->_getFileData($id, 'filename'));
+ }
+
+ $result = array();
+ foreach ($this->_files as $num => $pos) {
+ $result[$num + 1] = filesize($this->_files[$num]['filename']);
+ }
+
+ return $result;
+ }
+
+
+
+ /**
+ * Fetch a message
+ *
+ * @param int $id number of message
+ * @return Zend_Mail_Message
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getMessage($id)
+ {
+ return new $this->_messageClass(array('handler' => $this, 'id' => $id, 'headers' => $this->getRawHeader($id),
+ 'flags' => $this->_getFileData($id, 'flags')));
+ }
+
+ /*
+ * Get raw header of message or part
+ *
+ * @param int $id number of message
+ * @param null|array|string $part path to part or null for messsage header
+ * @param int $topLines include this many lines with header (after an empty line)
+ * @return string raw header
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getRawHeader($id, $part = null, $topLines = 0)
+ {
+ if ($part !== null) {
+ // TODO: implement
+ throw new Zend_Mail_Storage_Exception('not implemented');
+ }
+
+ $fh = fopen($this->_getFileData($id, 'filename'), 'r');
+
+ $content = '';
+ while (!feof($fh)) {
+ $line = fgets($fh);
+ if (!trim($line)) {
+ break;
+ }
+ $content .= $line;
+ }
+
+ fclose($fh);
+ return $content;
+ }
+
+ /*
+ * Get raw content of message or part
+ *
+ * @param int $id number of message
+ * @param null|array|string $part path to part or null for messsage content
+ * @return string raw content
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getRawContent($id, $part = null)
+ {
+ if ($part !== null) {
+ // TODO: implement
+ throw new Zend_Mail_Storage_Exception('not implemented');
+ }
+
+ $fh = fopen($this->_getFileData($id, 'filename'), 'r');
+
+ while (!feof($fh)) {
+ $line = fgets($fh);
+ if (!trim($line)) {
+ break;
+ }
+ }
+
+ $content = stream_get_contents($fh);
+ fclose($fh);
+ return $content;
+ }
+
+ /**
+ * Create instance with parameters
+ * Supported parameters are:
+ * - dirname dirname of mbox file
+ *
+ * @param $params array mail reader specific parameters
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function __construct($params)
+ {
+ if (!isset($params['dirname']) || !is_dir($params['dirname'])) {
+ throw new Zend_Mail_Storage_Exception('no valid dirname given in params');
+ }
+
+ if (!$this->_isMaildir($params['dirname'])) {
+ throw new Zend_Mail_Storage_Exception('invalid maildir given');
+ }
+
+ $this->_has['top'] = true;
+ $this->_has['flags'] = true;
+ $this->_openMaildir($params['dirname']);
+ }
+
+ /**
+ * check if a given dir is a valid maildir
+ *
+ * @param string $dirname name of dir
+ * @return bool dir is valid maildir
+ */
+ protected function _isMaildir($dirname)
+ {
+ if (file_exists($dirname . '/new') && !is_dir($dirname . '/new')) {
+ return false;
+ }
+ if (file_exists($dirname . '/tmp') && !is_dir($dirname . '/tmp')) {
+ return false;
+ }
+ return is_dir($dirname . '/cur');
+ }
+
+ /**
+ * open given dir as current maildir
+ *
+ * @param string $dirname name of maildir
+ * @return null
+ * @throws Zend_Mail_Storage_Exception
+ */
+ protected function _openMaildir($dirname)
+ {
+ if ($this->_files) {
+ $this->close();
+ }
+
+ $dh = @opendir($dirname . '/cur/');
+ if (!$dh) {
+ throw new Zend_Mail_Storage_Exception('cannot open maildir');
+ }
+ $this->_getMaildirFiles($dh, $dirname . '/cur/');
+ closedir($dh);
+
+ $dh = @opendir($dirname . '/new/');
+ if ($dh) {
+ $this->_getMaildirFiles($dh, $dirname . '/new/', array(Zend_Mail_Storage::FLAG_RECENT));
+ closedir($dh);
+ } else if (file_exists($dirname . '/new/')) {
+ throw new Zend_Mail_Storage_Exception('cannot read recent mails in maildir');
+ }
+ }
+
+ /**
+ * find all files in opened dir handle and add to maildir files
+ *
+ * @param resource $dh dir handle used for search
+ * @param string $dirname dirname of dir in $dh
+ * @param array $default_flags default flags for given dir
+ * @return null
+ */
+ protected function _getMaildirFiles($dh, $dirname, $default_flags = array())
+ {
+ while (($entry = readdir($dh)) !== false) {
+ if ($entry[0] == '.' || !is_file($dirname . $entry)) {
+ continue;
+ }
+
+ @list($uniq, $info) = explode(':', $entry, 2);
+ @list($version, $flags) = explode(',', $info, 2);
+ if ($version != 2) {
+ $flags = '';
+ }
+
+ $named_flags = $default_flags;
+ $length = strlen($flags);
+ for ($i = 0; $i < $length; ++$i) {
+ $flag = $flags[$i];
+ $named_flags[$flag] = isset(self::$_knownFlags[$flag]) ? self::$_knownFlags[$flag] : $flag;
+ }
+
+ $this->_files[] = array('uniq' => $uniq,
+ 'flags' => $named_flags,
+ 'filename' => $dirname . $entry);
+ }
+ }
+
+
+ /**
+ * Close resource for mail lib. If you need to control, when the resource
+ * is closed. Otherwise the destructor would call this.
+ *
+ * @return void
+ */
+ public function close()
+ {
+ $this->_files = array();
+ }
+
+
+ /**
+ * Waste some CPU cycles doing nothing.
+ *
+ * @return void
+ */
+ public function noop()
+ {
+ return true;
+ }
+
+
+ /**
+ * stub for not supported message deletion
+ *
+ * @return null
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function removeMessage($id)
+ {
+ throw new Zend_Mail_Storage_Exception('maildir is (currently) read-only');
+ }
+
+ /**
+ * get unique id for one or all messages
+ *
+ * if storage does not support unique ids it's the same as the message number
+ *
+ * @param int|null $id message number
+ * @return array|string message number for given message or all messages as array
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getUniqueId($id = null)
+ {
+ if ($id) {
+ return $this->_getFileData($id, 'uniq');
+ }
+
+ $ids = array();
+ foreach ($this->_files as $num => $file) {
+ $ids[$num + 1] = $file['uniq'];
+ }
+ return $ids;
+ }
+
+ /**
+ * get a message number from a unique id
+ *
+ * I.e. if you have a webmailer that supports deleting messages you should use unique ids
+ * as parameter and use this method to translate it to message number right before calling removeMessage()
+ *
+ * @param string $id unique id
+ * @return int message number
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getNumberByUniqueId($id)
+ {
+ foreach ($this->_files as $num => $file) {
+ if ($file['uniq'] == $id) {
+ return $num + 1;
+ }
+ }
+
+ throw new Zend_Mail_Storage_Exception('unique id not found');
+ }
+}
diff --git a/libs/Zend/Mail/Storage/Mbox.php b/libs/Zend/Mail/Storage/Mbox.php
new file mode 100755
index 0000000000..9d0155edc5
--- /dev/null
+++ b/libs/Zend/Mail/Storage/Mbox.php
@@ -0,0 +1,396 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/**
+ * Zend_Loader
+ * May be used in constructor, but commented out for now
+ */
+// require_once 'Zend/Loader.php';
+
+/**
+ * Zend_Mail_Storage_Abstract
+ */
+require_once 'Zend/Mail/Storage/Abstract.php';
+
+/**
+ * Zend_Mail_Message
+ */
+require_once 'Zend/Mail/Message.php';
+
+/**
+ * Zend_Mail_Storage_Exception
+ */
+require_once 'Zend/Mail/Storage/Exception.php';
+
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Mail_Storage_Mbox extends Zend_Mail_Storage_Abstract
+{
+ /**
+ * file handle to mbox file
+ * @var null|resource
+ */
+ protected $_fh;
+
+ /**
+ * filename of mbox file for __wakeup
+ * @var string
+ */
+ protected $_filename;
+
+ /**
+ * modification date of mbox file for __wakeup
+ * @var int
+ */
+ protected $_filemtime;
+
+ /**
+ * start and end position of messages as array('start' => start, 'seperator' => headersep, 'end' => end)
+ * @var array
+ */
+ protected $_positions;
+
+
+ /**
+ * Count messages all messages in current box
+ *
+ * @return int number of messages
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function countMessages()
+ {
+ return count($this->_positions);
+ }
+
+
+ /**
+ * Get a list of messages with number and size
+ *
+ * @param int|null $id number of message or null for all messages
+ * @return int|array size of given message of list with all messages as array(num => size)
+ */
+ public function getSize($id = 0)
+ {
+ if ($id) {
+ $pos = $this->_positions[$id - 1];
+ return $pos['end'] - $pos['start'];
+ }
+
+ $result = array();
+ foreach ($this->_positions as $num => $pos) {
+ $result[$num + 1] = $pos['end'] - $pos['start'];
+ }
+
+ return $result;
+ }
+
+
+ /**
+ * Get positions for mail message or throw exeption if id is invalid
+ *
+ * @param int $id number of message
+ * @return array positions as in _positions
+ * @throws Zend_Mail_Storage_Exception
+ */
+ protected function _getPos($id)
+ {
+ if (!isset($this->_positions[$id - 1])) {
+ throw new Zend_Mail_Storage_Exception('id does not exist');
+ }
+
+ return $this->_positions[$id - 1];
+ }
+
+
+ /**
+ * Fetch a message
+ *
+ * @param int $id number of message
+ * @return Zend_Mail_Message
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getMessage($id)
+ {
+ $bodyLines = 0; // TODO: need a way to change that
+
+ $message = $this->getRawHeader($id);
+ // file pointer is after headers now
+ if ($bodyLines) {
+ $message .= "\n";
+ while ($bodyLines-- && ftell($this->_fh) < $this->_positions[$id - 1]['end']) {
+ $message .= fgets($this->_fh);
+ }
+ }
+
+ return new $this->_messageClass(array('handler' => $this, 'id' => $id, 'headers' => $message));
+ }
+
+ /*
+ * Get raw header of message or part
+ *
+ * @param int $id number of message
+ * @param null|array|string $part path to part or null for messsage header
+ * @param int $topLines include this many lines with header (after an empty line)
+ * @return string raw header
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function getRawHeader($id, $part = null, $topLines = 0)
+ {
+ if ($part !== null) {
+ // TODO: implement
+ throw new Zend_Mail_Storage_Exception('not implemented');
+ }
+ $messagePos = $this->_getPos($id);
+ // TODO: toplines
+ return stream_get_contents($this->_fh, $messagePos['separator'] - $messagePos['start'], $messagePos['start']);
+ }
+
+ /*
+ * Get raw content of message or part
+ *
+ * @param int $id number of message
+ * @param null|array|string $part path to part or null for messsage content
+ * @return string raw content
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function getRawContent($id, $part = null)
+ {
+ if ($part !== null) {
+ // TODO: implement
+ throw new Zend_Mail_Storage_Exception('not implemented');
+ }
+ $messagePos = $this->_getPos($id);
+ return stream_get_contents($this->_fh, $messagePos['end'] - $messagePos['separator'], $messagePos['separator']);
+ }
+
+ /**
+ * Create instance with parameters
+ * Supported parameters are:
+ * - filename filename of mbox file
+ *
+ * @param $params array mail reader specific parameters
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function __construct($params)
+ {
+ if (!isset($params['filename']) /* || Zend_Loader::isReadable($params['filename']) */) {
+ throw new Zend_Mail_Storage_Exception('no valid filename given in params');
+ }
+
+ $this->_openMboxFile($params['filename']);
+ $this->_has['top'] = true;
+ $this->_has['uniqueid'] = false;
+ }
+
+ /**
+ * check if given file is a mbox file
+ *
+ * if $file is a resource its file pointer is moved after the first line
+ *
+ * @param resource|string $file stream resource of name of file
+ * @param bool $fileIsString file is string or resource
+ * @return bool file is mbox file
+ */
+ protected function _isMboxFile($file, $fileIsString = true)
+ {
+ if ($fileIsString) {
+ $file = @fopen($file, 'r');
+ if (!$file) {
+ return false;
+ }
+ } else {
+ fseek($file, 0);
+ }
+
+ $result = false;
+
+ $line = fgets($file);
+ if (strpos($line, 'From ') === 0) {
+ $result = true;
+ }
+
+ if ($fileIsString) {
+ @fclose($file);
+ }
+
+ return $result;
+ }
+
+ /**
+ * open given file as current mbox file
+ *
+ * @param string $filename filename of mbox file
+ * @return null
+ * @throws Zend_Mail_Storage_Exception
+ */
+ protected function _openMboxFile($filename)
+ {
+ if ($this->_fh) {
+ $this->close();
+ }
+
+ $this->_fh = @fopen($filename, 'r');
+ if (!$this->_fh) {
+ throw new Zend_Mail_Storage_Exception('cannot open mbox file');
+ }
+ $this->_filename = $filename;
+ $this->_filemtime = filemtime($this->_filename);
+
+ if (!$this->_isMboxFile($this->_fh, false)) {
+ @fclose($this->_fh);
+ throw new Zend_Mail_Storage_Exception('file is not a valid mbox format');
+ }
+
+ $messagePos = array('start' => ftell($this->_fh), 'separator' => 0, 'end' => 0);
+ while (($line = fgets($this->_fh)) !== false) {
+ if (strpos($line, 'From ') === 0) {
+ $messagePos['end'] = ftell($this->_fh) - strlen($line) - 2; // + newline
+ if (!$messagePos['separator']) {
+ $messagePos['separator'] = $messagePos['end'];
+ }
+ $this->_positions[] = $messagePos;
+ $messagePos = array('start' => ftell($this->_fh), 'separator' => 0, 'end' => 0);
+ }
+ if (!$messagePos['separator'] && !trim($line)) {
+ $messagePos['separator'] = ftell($this->_fh);
+ }
+ }
+
+ $messagePos['end'] = ftell($this->_fh);
+ if (!$messagePos['separator']) {
+ $messagePos['separator'] = $messagePos['end'];
+ }
+ $this->_positions[] = $messagePos;
+ }
+
+ /**
+ * Close resource for mail lib. If you need to control, when the resource
+ * is closed. Otherwise the destructor would call this.
+ *
+ * @return void
+ */
+ public function close()
+ {
+ @fclose($this->_fh);
+ $this->_positions = array();
+ }
+
+
+ /**
+ * Waste some CPU cycles doing nothing.
+ *
+ * @return void
+ */
+ public function noop()
+ {
+ return true;
+ }
+
+
+ /**
+ * stub for not supported message deletion
+ *
+ * @return null
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function removeMessage($id)
+ {
+ throw new Zend_Mail_Storage_Exception('mbox is read-only');
+ }
+
+ /**
+ * get unique id for one or all messages
+ *
+ * Mbox does not support unique ids (yet) - it's always the same as the message number.
+ * That shouldn't be a problem, because we can't change mbox files. Therefor the message
+ * number is save enough.
+ *
+ * @param int|null $id message number
+ * @return array|string message number for given message or all messages as array
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getUniqueId($id = null)
+ {
+ if ($id) {
+ // check if id exists
+ $this->_getPos($id);
+ return $id;
+ }
+
+ $range = range(1, $this->countMessages());
+ return array_combine($range, $range);
+ }
+
+ /**
+ * get a message number from a unique id
+ *
+ * I.e. if you have a webmailer that supports deleting messages you should use unique ids
+ * as parameter and use this method to translate it to message number right before calling removeMessage()
+ *
+ * @param string $id unique id
+ * @return int message number
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getNumberByUniqueId($id)
+ {
+ // check if id exists
+ $this->_getPos($id);
+ return $id;
+ }
+
+ /**
+ * magic method for serialize()
+ *
+ * with this method you can cache the mbox class
+ *
+ * @return array name of variables
+ */
+ public function __sleep()
+ {
+ return array('_filename', '_positions', '_filemtime');
+ }
+
+ /**
+ * magic method for unserialize()
+ *
+ * with this method you can cache the mbox class
+ * for cache validation the mtime of the mbox file is used
+ *
+ * @return null
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function __wakeup()
+ {
+ if ($this->_filemtime != @filemtime($this->_filename)) {
+ $this->close();
+ $this->_openMboxFile($this->_filename);
+ } else {
+ $this->_fh = @fopen($this->_filename, 'r');
+ if (!$this->_fh) {
+ throw new Zend_Mail_Storage_Exception('cannot open mbox file');
+ }
+ }
+ }
+
+}
diff --git a/libs/Zend/Mail/Storage/Pop3.php b/libs/Zend/Mail/Storage/Pop3.php
new file mode 100755
index 0000000000..5b5effe4c3
--- /dev/null
+++ b/libs/Zend/Mail/Storage/Pop3.php
@@ -0,0 +1,301 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/**
+ * Zend_Mail_Storage_Abstract
+ */
+require_once 'Zend/Mail/Storage/Abstract.php';
+
+/**
+ * Zend_Mail_Protocol_Pop3
+ */
+require_once 'Zend/Mail/Protocol/Pop3.php';
+
+/**
+ * Zend_Mail_Message
+ */
+require_once 'Zend/Mail/Message.php';
+
+/**
+ * Zend_Mail_Storage_Exception
+ */
+require_once 'Zend/Mail/Storage/Exception.php';
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Mail_Storage_Pop3 extends Zend_Mail_Storage_Abstract
+{
+ /**
+ * protocol handler
+ * @var null|Zend_Mail_Protocol_Pop3
+ */
+ protected $_protocol;
+
+
+ /**
+ * Count messages all messages in current box
+ *
+ * @return int number of messages
+ * @throws Zend_Mail_Storage_Exception
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function countMessages()
+ {
+ $this->_protocol->status($count, $null);
+ return (int)$count;
+ }
+
+ /**
+ * get a list of messages with number and size
+ *
+ * @param int $id number of message
+ * @return int|array size of given message of list with all messages as array(num => size)
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function getSize($id = 0)
+ {
+ $id = $id ? $id : null;
+ return $this->_protocol->getList($id);
+ }
+
+ /**
+ * Fetch a message
+ *
+ * @param int $id number of message
+ * @return Zend_Mail_Message
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function getMessage($id)
+ {
+ $bodyLines = 0;
+ $message = $this->_protocol->top($id, $bodyLines, true);
+
+ return new $this->_messageClass(array('handler' => $this, 'id' => $id, 'headers' => $message,
+ 'noToplines' => $bodyLines < 1));
+ }
+
+ /*
+ * Get raw header of message or part
+ *
+ * @param int $id number of message
+ * @param null|array|string $part path to part or null for messsage header
+ * @param int $topLines include this many lines with header (after an empty line)
+ * @return string raw header
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function getRawHeader($id, $part = null, $topLines = 0)
+ {
+ if ($part !== null) {
+ // TODO: implement
+ throw new Zend_Mail_Storage_Exception('not implemented');
+ }
+
+ return $this->_protocol->top($id, 0, true);
+ }
+
+ /*
+ * Get raw content of message or part
+ *
+ * @param int $id number of message
+ * @param null|array|string $part path to part or null for messsage content
+ * @return string raw content
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function getRawContent($id, $part = null)
+ {
+ if ($part !== null) {
+ // TODO: implement
+ throw new Zend_Mail_Storage_Exception('not implemented');
+ }
+
+ $content = $this->_protocol->retrive($id);
+ // TODO: find a way to avoid decoding the headers
+ Zend_Mime_Decode::splitMessage($content, $null, $body);
+ return $body;
+ }
+
+ /**
+ * create instance with parameters
+ * Supported paramters are
+ * - host hostname or ip address of POP3 server
+ * - user username
+ * - password password for user 'username' [optional, default = '']
+ * - port port for POP3 server [optional, default = 110]
+ * - ssl 'SSL' or 'TLS' for secure sockets
+ *
+ * @param $params array mail reader specific parameters
+ * @throws Zend_Mail_Storage_Exception
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function __construct($params)
+ {
+ $this->_has['fetchPart'] = false;
+ $this->_has['top'] = null;
+ $this->_has['uniqueid'] = null;
+
+ if ($params instanceof Zend_Mail_Protocol_Pop3) {
+ $this->_protocol = $params;
+ return;
+ }
+
+ if (!isset($params['user'])) {
+ throw new Zend_Mail_Storage_Exception('need at least user in params');
+ }
+
+ $params['host'] = isset($params['host']) ? $params['host'] : 'localhost';
+ $params['password'] = isset($params['password']) ? $params['password'] : '';
+ $params['port'] = isset($params['port']) ? $params['port'] : null;
+ $params['ssl'] = isset($params['ssl']) ? $params['ssl'] : false;
+
+ $this->_protocol = new Zend_Mail_Protocol_Pop3();
+ $this->_protocol->connect($params['host'], $params['port'], $params['ssl']);
+ $this->_protocol->login($params['user'], $params['password']);
+ }
+
+ /**
+ * Close resource for mail lib. If you need to control, when the resource
+ * is closed. Otherwise the destructor would call this.
+ *
+ * @return null
+ */
+ public function close()
+ {
+ $this->_protocol->logout();
+ }
+
+ /**
+ * Keep the server busy.
+ *
+ * @return null
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function noop()
+ {
+ return $this->_protocol->noop();
+ }
+
+ /**
+ * Remove a message from server. If you're doing that from a web enviroment
+ * you should be careful and use a uniqueid as parameter if possible to
+ * identify the message.
+ *
+ * @param int $id number of message
+ * @return null
+ * @throws Zend_Mail_Protocol_Exception
+ */
+ public function removeMessage($id)
+ {
+ $this->_protocol->delete($id);
+ }
+
+ /**
+ * get unique id for one or all messages
+ *
+ * if storage does not support unique ids it's the same as the message number
+ *
+ * @param int|null $id message number
+ * @return array|string message number for given message or all messages as array
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getUniqueId($id = null)
+ {
+ if (!$this->hasUniqueid) {
+ if ($id) {
+ return $id;
+ }
+ $range = range(1, $this->countMessages());
+ return array_combine($range, $range);
+ }
+
+ return $this->_protocol->uniqueid($id);
+ }
+
+ /**
+ * get a message number from a unique id
+ *
+ * I.e. if you have a webmailer that supports deleting messages you should use unique ids
+ * as parameter and use this method to translate it to message number right before calling removeMessage()
+ *
+ * @param string $id unique id
+ * @return int message number
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function getNumberByUniqueId($id)
+ {
+ if (!$this->hasUniqueid) {
+ return $id;
+ }
+
+ $ids = $this->getUniqueId();
+ foreach ($ids as $k => $v) {
+ if ($v == $id) {
+ return $k;
+ }
+ }
+
+ throw new Zend_Mail_Storage_Exception('unique id not found');
+ }
+
+ /**
+ * Special handling for hasTop and hasUniqueid. The headers of the first message is
+ * retrieved if Top wasn't needed/tried yet.
+ *
+ * @see Zend_Mail_Storage_Abstract:__get()
+ * @param string $var
+ * @return string
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function __get($var)
+ {
+ $result = parent::__get($var);
+ if ($result !== null) {
+ return $result;
+ }
+
+ if (strtolower($var) == 'hastop') {
+ if ($this->_protocol->hasTop === null) {
+ // need to make a real call, because not all server are honest in their capas
+ try {
+ $this->_protocol->top(1, 0, false);
+ } catch(Zend_Mail_Exception $e) {
+ // ignoring error
+ }
+ }
+ $this->_has['top'] = $this->_protocol->hasTop;
+ return $this->_protocol->hasTop;
+ }
+
+ if (strtolower($var) == 'hasuniqueid') {
+ $id = null;
+ try {
+ $id = $this->_protocol->uniqueid(1);
+ } catch(Zend_Mail_Exception $e) {
+ // ignoring error
+ }
+ $this->_has['uniqueid'] = $id ? true : false;
+ return $this->_has['uniqueid'];
+ }
+
+ return $result;
+ }
+}
diff --git a/libs/Zend/Mail/Storage/Writable/Interface.php b/libs/Zend/Mail/Storage/Writable/Interface.php
new file mode 100755
index 0000000000..936dd95767
--- /dev/null
+++ b/libs/Zend/Mail/Storage/Writable/Interface.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+interface Zend_Mail_Storage_Writable_Interface
+{
+ /**
+ * create a new folder
+ *
+ * This method also creates parent folders if necessary. Some mail storages may restrict, which folder
+ * may be used as parent or which chars may be used in the folder name
+ *
+ * @param string $name global name of folder, local name if $parentFolder is set
+ * @param string|Zend_Mail_Storage_Folder $parentFolder parent folder for new folder, else root folder is parent
+ * @return null
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function createFolder($name, $parentFolder = null);
+
+ /**
+ * remove a folder
+ *
+ * @param string|Zend_Mail_Storage_Folder $name name or instance of folder
+ * @return null
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function removeFolder($name);
+
+ /**
+ * rename and/or move folder
+ *
+ * The new name has the same restrictions as in createFolder()
+ *
+ * @param string|Zend_Mail_Storage_Folder $oldName name or instance of folder
+ * @param string $newName new global name of folder
+ * @return null
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function renameFolder($oldName, $newName);
+
+ /**
+ * append a new message to mail storage
+ *
+ * @param string|Zend_Mail_Message|Zend_Mime_Message $message message as string or instance of message class
+ * @param null|string|Zend_Mail_Storage_Folder $folder folder for new message, else current folder is taken
+ * @param null|array $flags set flags for new message, else a default set is used
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function appendMessage($message, $folder = null, $flags = null);
+
+ /**
+ * copy an existing message
+ *
+ * @param int $id number of message
+ * @param string|Zend_Mail_Storage_Folder $folder name or instance of targer folder
+ * @return null
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function copyMessage($id, $folder);
+
+ /**
+ * set flags for message
+ *
+ * NOTE: this method can't set the recent flag.
+ *
+ * @param int $id number of message
+ * @param array $flags new flags for message
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function setFlags($id, $flags);
+} \ No newline at end of file
diff --git a/libs/Zend/Mail/Storage/Writable/Maildir.php b/libs/Zend/Mail/Storage/Writable/Maildir.php
new file mode 100755
index 0000000000..766b91acad
--- /dev/null
+++ b/libs/Zend/Mail/Storage/Writable/Maildir.php
@@ -0,0 +1,524 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/**
+ * Zend_Mail_Storage_Folder_Maildir
+ */
+require_once 'Zend/Mail/Storage/Folder/Maildir.php';
+
+/**
+ * Zend_Mail_Storage_Exception
+ */
+require_once 'Zend/Mail/Storage/Exception.php';
+
+/**
+ * Zend_Mail_Storage_Writable_Interface
+ */
+require_once 'Zend/Mail/Storage/Writable/Interface.php';
+
+
+/**
+ * @package Zend_Mail
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Maildir
+ implements Zend_Mail_Storage_Writable_Interface
+{
+ /**
+ * create a new folder
+ *
+ * This method also creates parent folders if necessary. Some mail storages may restrict, which folder
+ * may be used as parent or which chars may be used in the folder name
+ *
+ * @param string $name global name of folder, local name if $parentFolder is set
+ * @param string|Zend_Mail_Storage_Folder $parentFolder parent folder for new folder, else root folder is parent
+ * @return string only used internally (new created maildir)
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function createFolder($name, $parentFolder = null)
+ {
+ if ($parentFolder instanceof Zend_Mail_Storage_Folder) {
+ $folder = $parentFolder->getGlobalName() . $this->_delim . $name;
+ } else if ($parentFolder != null) {
+ $folder = rtrim($parentFolder, $this->_delim) . $this->_delim . $name;
+ } else {
+ $folder = $name;
+ }
+
+ $folder = trim($folder, $this->_delim);
+
+ // first we check if we try to create a folder that does exist
+ $exists = null;
+ try {
+ $exists = $this->getFolders($folder);
+ } catch (Zend_Mail_Exception $e) {
+ // ok
+ }
+ if ($exists) {
+ throw new Zend_Mail_Storage_Exception('folder already exists');
+ }
+
+ if (strpos($folder, $this->_delim . $this->_delim) !== false) {
+ throw new Zend_Mail_Storage_Exception('invalid name - folder parts may not be empty');
+ }
+
+ if (strpos($folder, 'INBOX' . $this->_delim) === 0) {
+ $folder = substr($folder, 6);
+ }
+
+ $fulldir = $this->_rootdir . '.' . $folder;
+
+ // check if we got tricked and would create a dir outside of the rootdir or not as direct child
+ if (strpos($folder, DIRECTORY_SEPARATOR) !== false || strpos($folder, '/') !== false
+ || dirname($fulldir) . DIRECTORY_SEPARATOR != $this->_rootdir) {
+ throw new Zend_Mail_Storage_Exception('invalid name - no directory seprator allowed in folder name');
+ }
+
+ // has a parent folder?
+ $parent = null;
+ if (strpos($folder, $this->_delim)) {
+ // let's see if the parent folder exists
+ $parent = substr($folder, 0, strrpos($folder, $this->_delim));
+ try {
+ $this->getFolders($parent);
+ } catch (Zend_Mail_Exception $e) {
+ // does not - create parent folder
+ $this->createFolder($parent);
+ }
+ }
+
+ if (!@mkdir($fulldir) || !@mkdir($fulldir . DIRECTORY_SEPARATOR . 'cur')) {
+ throw new Zend_Mail_Storage_Exception('error while creating new folder, may be created incompletly');
+ }
+
+ mkdir($fulldir . DIRECTORY_SEPARATOR . 'new');
+ mkdir($fulldir . DIRECTORY_SEPARATOR . 'tmp');
+
+ $localName = $parent ? substr($folder, strlen($parent) + 1) : $folder;
+ $this->getFolders($parent)->$localName = new Zend_Mail_Storage_Folder($localName, $folder, true);
+
+ return $fulldir;
+ }
+
+ /**
+ * remove a folder
+ *
+ * @param string|Zend_Mail_Storage_Folder $name name or instance of folder
+ * @return null
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function removeFolder($name)
+ {
+ // TODO: This could fail in the middle of the task, which is not optimal.
+ // But there is no defined standard way to mark a folder as removed and there is no atomar fs-op
+ // to remove a directory. Also moving the folder to a/the trash folder is not possible, as
+ // all parent folders must be created. What we could do is add a dash to the front of the
+ // directory name and it should be ignored as long as other processes obey the standard.
+
+ if ($name instanceof Zend_Mail_Storage_Folder) {
+ $name = $name->getGlobalName();
+ }
+
+ $name = trim($name, $this->_delim);
+ if (strpos($name, 'INBOX' . $this->_delim) === 0) {
+ $name = substr($name, 6);
+ }
+
+ // check if folder exists and has no children
+ if (!$this->getFolders($name)->isLeaf()) {
+ throw new Zend_Mail_Storage_Exception('delete children first');
+ }
+
+ if ($name == 'INBOX' || $name == '/') {
+ throw new Zend_Mail_Storage_Exception('wont delete INBOX');
+ }
+
+ if ($name == $this->getCurrentFolder()) {
+ throw new Zend_Mail_Storage_Exception('wont delete selected folder');
+ }
+
+ foreach (array('tmp', 'new', 'cur', '.') as $subdir) {
+ $dir = $this->_rootdir . '.' . $name . '/' . $subdir;
+ if (!file_exists($dir)) {
+ continue;
+ }
+ $dh = opendir($dir);
+ if (!$dh) {
+ throw new Zend_Mail_Storage_Exception("error opening $subdir");
+ }
+ while (($entry = readdir($dh)) !== false) {
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+ if (!unlink($dir . '/' . $entry)) {
+ throw new Zend_Mail_Storage_Exception("error cleaning $subdir");
+ }
+ }
+ closedir($dh);
+ if ($subdir !== '.') {
+ if (!rmdir($dir)) {
+ throw new Zend_Mail_Storage_Exception("error removing $subdir");
+ }
+ }
+ }
+
+ if (!rmdir($this->_rootdir . '.' . $name)) {
+ // at least we should try to make it a valid maildir again
+ mkdir($this->_rootdir . '.' . $name . '/' . 'cur');
+ throw new Zend_Mail_Storage_Exception("error removing maindir");
+ }
+
+ $parent = strpos($name, $this->_delim) ? substr($name, 0, strrpos($name, $this->_delim)) : null;
+ $localName = $parent ? substr($name, strlen($parent) + 1) : $name;
+ unset($this->getFolders($parent)->$localName);
+ }
+
+ /**
+ * rename and/or move folder
+ *
+ * The new name has the same restrictions as in createFolder()
+ *
+ * @param string|Zend_Mail_Storage_Folder $oldName name or instance of folder
+ * @param string $newName new global name of folder
+ * @return null
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function renameFolder($oldName, $newName)
+ {
+ // TODO: This is also not atomar and has similar problems as removeFolder()
+
+ if ($oldName instanceof Zend_Mail_Storage_Folder) {
+ $oldName = $oldName->getGlobalName();
+ }
+
+ $oldName = trim($oldName, $this->_delim);
+ if (strpos($oldName, 'INBOX' . $this->_delim) === 0) {
+ $oldName = substr($oldName, 6);
+ }
+
+ $newName = trim($newName, $this->_delim);
+ if (strpos($newName, 'INBOX' . $this->_delim) === 0) {
+ $newName = substr($newName, 6);
+ }
+
+ if (strpos($newName, $oldName . $this->_delim) === 0) {
+ throw new Zend_Mail_Storage_Exception('new folder cannot be a child of old folder');
+ }
+
+ // check if folder exists and has no children
+ $folder = $this->getFolders($oldName);
+
+ if ($oldName == 'INBOX' || $oldName == '/') {
+ throw new Zend_Mail_Storage_Exception('wont rename INBOX');
+ }
+
+ if ($oldName == $this->getCurrentFolder()) {
+ throw new Zend_Mail_Storage_Exception('wont rename selected folder');
+ }
+
+ $newdir = $this->createFolder($newName);
+
+ if (!$folder->isLeaf()) {
+ foreach ($folder as $k => $v) {
+ $this->renameFolder($v->getGlobalName(), $newName . $this->_delim . $k);
+ }
+ }
+
+ $olddir = $this->_rootdir . '.' . $folder;
+ foreach (array('tmp', 'new', 'cur') as $subdir) {
+ $subdir = DIRECTORY_SEPARATOR . $subdir;
+ if (!file_exists($olddir . $subdir)) {
+ continue;
+ }
+ // using copy or moving files would be even better - but also much slower
+ if (!rename($olddir . $subdir, $newdir . $subdir)) {
+ throw new Zend_Mail_Storage_Exception('error while moving ' . $subdir);
+ }
+ }
+ // create a dummy if removing fails - otherwise we can't read it next time
+ mkdir($olddir . DIRECTORY_SEPARATOR . 'cur');
+ $this->removeFolder($oldName);
+ }
+
+ /**
+ * create a uniqueid for maildir filename
+ *
+ * This is nearly the format defined in the maildir standard. The microtime() call should already
+ * create a uniqueid, the pid is for multicore/-cpu machine that manage to call this function at the
+ * exact same time, and uname() gives us the hostname for multiple machines accessing the same storage.
+ *
+ * If someone disables posix we create a random number of the same size, so this method should also
+ * work on Windows - if you manage to get maildir working on Windows.
+ * Microtime could also be disabled, altough I've never seen it.
+ *
+ * @return string new uniqueid
+ */
+ protected function _createUniqueId()
+ {
+ $id = '';
+ $id .= function_exists('microtime') ? microtime(true) : (time() . ' ' . rand(0, 100000));
+ $id .= '.' . (function_exists('posix_getpid') ? posix_getpid() : rand(50, 65535));
+ $id .= '.' . php_uname('n');
+
+ return $id;
+ }
+
+ /**
+ * open a temporary maildir file
+ *
+ * makes sure tmp/ exists and create a file with a unique name
+ * you should close the returned filehandle!
+ *
+ * @param string $folder name of current folder without leading .
+ * @return array array('dirname' => dir of maildir folder, 'uniq' => unique id, 'filename' => name of create file
+ * 'handle' => file opened for writing)
+ * @throw Zend_Mail_Storage_Exception
+ */
+ protected function _createTmpFile($folder)
+ {
+ $tmpdir = $this->_rootdir . '.' . $folder . '/tmp/';
+ if (!file_exists($tmpdir)) {
+ if (!mkdir($tmpdir)) {
+ throw new Zend_Mail_Storage_Exception('problems creating tmp dir');
+ }
+ }
+
+ // we should retry to create a unique id if a file with the same name exists
+ // to avoid a script timeout we only wait 1 second (instead of 2) and stop
+ // after a defined retry count
+ // if you change this variable take into account that it can take up to $max_tries seconds
+ // normally we should have a valid unique name after the first try, we're just following the "standard" here
+ $max_tries = 5;
+ for ($i = 0; $i < $max_tries; ++$i) {
+ $uniq = $this->_createUniqueId();
+ if (!file_exists($tmpdir . $uniq)) {
+ // here is the race condition! - as defined in the standard
+ // to avoid having a long time between stat()ing the file and creating it we're opening it here
+ // to mark the filename as taken
+ $fh = fopen($tmpdir . $uniq, 'w');
+ if (!$fh) {
+ throw new Zend_Mail_Storage_Exception('could not open temp file');
+ }
+ break;
+ }
+ sleep(1);
+ }
+
+ if (!$fh) {
+ throw new Zend_Mail_Storage_Exception("tried $max_tries unique ids for a temp file, but all were taken"
+ . ' - giving up');
+ }
+
+ return array('dirname' => $this->_rootdir . '.' . $folder, 'uniq' => $uniq, 'filename' => $tmpdir . $uniq,
+ 'handle' => $fh);
+ }
+
+ /**
+ * create an info string for filenames with given flags
+ *
+ * @param array $flags wanted flags, with the reference you'll get the set flags with correct key (= char for flag)
+ * @return string info string for version 2 filenames including the leading colon
+ */
+ protected function _getInfoString(&$flags)
+ {
+ // accessing keys is easier, faster and it removes duplicated flags
+ $wanted_flags = array_flip($flags);
+ if (isset($wanted_flags[Zend_Mail_Storage::FLAG_RECENT])) {
+ throw new Zend_Mail_Storage_Exception('recent flag may not be set');
+ }
+
+ $info = ':2,';
+ $flags = array();
+ foreach (Zend_Mail_Storage_Maildir::$_knownFlags as $char => $flag) {
+ if (!isset($wanted_flags[$flag])) {
+ continue;
+ }
+ $info .= $char;
+ $flags[$char] = $flag;
+ unset($wanted_flags[$flag]);
+ }
+
+ if (!empty($wanted_flags)) {
+ $wanted_flags = implode(', ', array_keys($wanted_flags));
+ throw new Zend_Mail_Storage_Exception('unknown flag(s): ' . $wanted_flags);
+ }
+
+ return $info;
+ }
+
+ /**
+ * append a new message to mail storage
+ *
+ * @param string $message message as string or instance of message class
+ * @param null|string|Zend_Mail_Storage_Folder $folder folder for new message, else current folder is taken
+ * @param null|array $flags set flags for new message, else a default set is used
+ * @throw Zend_Mail_Storage_Exception
+ */
+ // not yet * @param string|Zend_Mail_Message|Zend_Mime_Message $message message as string or instance of message class
+
+ public function appendMessage($message, $folder = null, $flags = null)
+ {
+ if ($folder === null) {
+ $folder = $this->_currentFolder;
+ }
+
+ if (!($folder instanceof Zend_Mail_Storage_Folder)) {
+ $folder = $this->getFolders($folder);
+ }
+
+ if ($flags === null) {
+ $flags = array(Zend_Mail_Storage::FLAG_SEEN);
+ }
+ $info = $this->_getInfoString($flags);
+ $temp_file = $this->_createTmpFile($folder->getGlobalName());
+
+ // TODO: handle class instances for $message
+ fputs($temp_file['handle'], $message);
+ fclose($temp_file['handle']);
+
+ // we're adding the size to the filename for maildir++
+ $size = filesize($temp_file['filename']);
+ if ($size) {
+ $info = ',S=' . $size . $info;
+ }
+ $new_filename = $temp_file['dirname'] . '/cur/' . $temp_file['uniq'] . $info;
+
+ // we're throwing any exception after removing our temp file and saving it to this variable instead
+ $exception = null;
+
+ if (!link($temp_file['filename'], $new_filename)) {
+ $exception = new Zend_Mail_Storage_Exception('cannot link message file to final dir');
+ }
+ @unlink($temp_file['filename']);
+
+ if ($exception) {
+ throw $exception;
+ }
+
+ $this->_files[] = array('uniq' => $temp_file['uniq'],
+ 'flags' => $flags,
+ 'filename' => $new_filename);
+ }
+
+ /**
+ * copy an existing message
+ *
+ * @param int $id number of message
+ * @param string|Zend_Mail_Storage_Folder $folder name or instance of targer folder
+ * @return null
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function copyMessage($id, $folder)
+ {
+ if (!($folder instanceof Zend_Mail_Storage_Folder)) {
+ $folder = $this->getFolders($folder);
+ }
+
+ $filedata = $this->_getFileData($id);
+ $old_file = $filedata['filename'];
+ $flags = $filedata['flags'];
+
+ // copied message can't be recent
+ while (($key = array_search(Zend_Mail_Storage::FLAG_RECENT, $flags)) !== false) {
+ unset($flags[$key]);
+ }
+ $info = $this->_getInfoString($flags);
+
+ // we're creating the copy as temp file before moving to cur/
+ $temp_file = $this->_createTmpFile($folder->getGlobalName());
+ // we don't write directly to the file
+ fclose($temp_file['handle']);
+
+ // we're adding the size to the filename for maildir++
+ // TODO: maybe we should support maildirsize or we just let the MDA do the work
+ $size = filesize($old_file);
+ if ($size) {
+ $info = ',S=' . $size . $info;
+ }
+ $new_file = $temp_file['dirname'] . '/cur/' . $temp_file['uniq'] . $info;
+
+ // we're throwing any exception after removing our temp file and saving it to this variable instead
+ $exception = null;
+
+ if (!copy($old_file, $temp_file['filename'])) {
+ $exception = new Zend_Mail_Storage_Exception('cannot copy message file');
+ } else if (!link($temp_file['filename'], $new_file)) {
+ $exception = new Zend_Mail_Storage_Exception('cannot link message file to final dir');
+ }
+ @unlink($temp_file['filename']);
+
+ if ($exception) {
+ throw $exception;
+ }
+
+ if ($folder->getGlobalName() == $this->_currentFolder
+ || ($this->_currentFolder == 'INBOX' && $folder->getGlobalName() == '/')) {
+ $this->_files[] = array('uniq' => $temp_file['uniq'],
+ 'flags' => $flags,
+ 'filename' => $new_file);
+ }
+ }
+
+ /**
+ * set flags for message
+ *
+ * NOTE: this method can't set the recent flag.
+ *
+ * @param int $id number of message
+ * @param array $flags new flags for message
+ * @throw Zend_Mail_Storage_Exception
+ */
+ public function setFlags($id, $flags)
+ {
+ $info = $this->_getInfoString($flags);
+ $filedata = $this->_getFileData($id);
+
+ // TODO: move file from new to cur
+ $new_filename = dirname($filedata['filename']) . "/$filedata[uniq]$info";
+
+ if (!@rename($filedata['filename'], $new_filename)) {
+ throw new Zend_Mail_Storage_Exception('cannot rename file');
+ }
+
+ $filedata['flags'] = $flags;
+ $filedata['filename'] = $new_filename;
+
+ $this->_files[$id - 1] = $filedata;
+ }
+
+
+ /**
+ * stub for not supported message deletion
+ *
+ * @return null
+ * @throws Zend_Mail_Storage_Exception
+ */
+ public function removeMessage($id)
+ {
+ $filename = $this->_getFileData($id, 'filename');
+ if (!@unlink($filename)) {
+ throw new Zend_Mail_Storage_Exception('cannot remove message');
+ }
+ unset($this->_files[$id - 1]);
+ // remove the gap
+ $this->_files = array_values($this->_files);
+ }
+}
diff --git a/libs/Zend/Mail/TODO.txt b/libs/Zend/Mail/TODO.txt
new file mode 100755
index 0000000000..0f6d39dff2
--- /dev/null
+++ b/libs/Zend/Mail/TODO.txt
@@ -0,0 +1 @@
+./. \ No newline at end of file
diff --git a/libs/Zend/Mail/Transport/Abstract.php b/libs/Zend/Mail/Transport/Abstract.php
new file mode 100755
index 0000000000..d41d9fc48c
--- /dev/null
+++ b/libs/Zend/Mail/Transport/Abstract.php
@@ -0,0 +1,335 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Transport
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Mail_Transport_Exception
+ */
+require_once 'Zend/Mail/Transport/Exception.php';
+
+/**
+ * Zend_Mime
+ */
+require_once 'Zend/Mime.php';
+
+/**
+ * Abstract for sending eMails through different
+ * ways of transport
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Transport
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Mail_Transport_Abstract {
+ /**
+ * Mail body
+ * @var string
+ * @access public
+ */
+ public $body = '';
+
+ /**
+ * MIME boundary
+ * @var string
+ * @access public
+ */
+ public $boundary = '';
+
+ /**
+ * Mail header string
+ * @var string
+ * @access public
+ */
+ public $header = '';
+
+ /**
+ * Array of message headers
+ * @var array
+ * @access protected
+ */
+ protected $_headers = array();
+
+ /**
+ * Message is a multipart message
+ * @var boolean
+ * @access protected
+ */
+ protected $_isMultipart = false;
+
+ /**
+ * Zend_Mail object
+ * @var false|Zend_Mail
+ * @access protected
+ */
+ protected $_mail = false;
+
+ /**
+ * Array of message parts
+ * @var array
+ * @access protected
+ */
+ protected $_parts = array();
+
+ /**
+ * Recipients string
+ * @var string
+ * @access public
+ */
+ public $recipients = '';
+
+ /**
+ * EOL character string used by transport
+ * @var string
+ * @access public
+ */
+ public $EOL = "\r\n";
+
+ /**
+ * Send an email independent from the used transport
+ *
+ * The requisite information for the email will be found in the following
+ * properties:
+ *
+ * - {@link $recipients} - list of recipients (string)
+ * - {@link $header} - message header
+ * - {@link $body} - message body
+ */
+ abstract protected function _sendMail();
+
+ /**
+ * Return all mail headers as an array
+ *
+ * If a boundary is given, a multipart header is generated with a
+ * Content-Type of either multipart/alternative or multipart/mixed depending
+ * on the mail parts present in the {@link $_mail Zend_Mail object} present.
+ *
+ * @param string $boundary
+ * @return array
+ */
+ protected function _getHeaders($boundary)
+ {
+ if (null !== $boundary) {
+ // Build multipart mail
+ $type = $this->_mail->getType();
+ if (!$type) {
+ if ($this->_mail->hasAttachments) {
+ $type = Zend_Mime::MULTIPART_MIXED;
+ } elseif ($this->_mail->getBodyText() && $this->_mail->getBodyHtml()) {
+ $type = Zend_Mime::MULTIPART_ALTERNATIVE;
+ } else {
+ $type = Zend_Mime::MULTIPART_MIXED;
+ }
+ }
+
+ $this->_headers['Content-Type'] = array(
+ $type . '; charset="' . $this->_mail->getCharset() . '";'
+ . $this->EOL
+ . " " . 'boundary="' . $boundary . '"'
+ );
+ $this->_headers['MIME-Version'] = array('1.0');
+
+ $this->boundary = $boundary;
+ }
+
+ return $this->_headers;
+ }
+
+ /**
+ * Prepend header name to header value
+ *
+ * @param string $item
+ * @param string $key
+ * @param string $prefix
+ * @static
+ * @access protected
+ * @return void
+ */
+ protected static function _formatHeader(&$item, $key, $prefix)
+ {
+ $item = $prefix . ': ' . $item;
+ }
+
+ /**
+ * Prepare header string for use in transport
+ *
+ * Prepares and generates {@link $header} based on the headers provided.
+ *
+ * @param mixed $headers
+ * @access protected
+ * @return void
+ * @throws Zend_Mail_Transport_Exception if any header lines exceed 998
+ * characters
+ */
+ protected function _prepareHeaders($headers)
+ {
+ if (!$this->_mail) {
+ throw new Zend_Mail_Transport_Exception('Missing Zend_Mail object in _mail property');
+ }
+
+ $this->header = '';
+
+ foreach ($headers as $header => $content) {
+ if (isset($content['append'])) {
+ unset($content['append']);
+ $value = implode(',' . $this->EOL . ' ', $content);
+ $this->header .= $header . ': ' . $value . $this->EOL;
+ } else {
+ array_walk($content, array(get_class($this), '_formatHeader'), $header);
+ $this->header .= implode($this->EOL, $content) . $this->EOL;
+ }
+ }
+
+ // Sanity check on headers -- should not be > 998 characters
+ $sane = true;
+ foreach (explode($this->EOL, $this->header) as $line) {
+ if (strlen(trim($line)) > 998) {
+ $sane = false;
+ break;
+ }
+ }
+ if (!$sane) {
+ throw new Zend_Mail_Exception('At least one mail header line is too long');
+ }
+ }
+
+ /**
+ * Generate MIME compliant message from the current configuration
+ *
+ * If both a text and HTML body are present, generates a
+ * multipart/alternative Zend_Mime_Part containing the headers and contents
+ * of each. Otherwise, uses whichever of the text or HTML parts present.
+ *
+ * The content part is then prepended to the list of Zend_Mime_Parts for
+ * this message.
+ *
+ * @return void
+ */
+ protected function _buildBody()
+ {
+ if (($text = $this->_mail->getBodyText())
+ && ($html = $this->_mail->getBodyHtml()))
+ {
+ // Generate unique boundary for multipart/alternative
+ $mime = new Zend_Mime(null);
+ $boundaryLine = $mime->boundaryLine($this->EOL);
+ $boundaryEnd = $mime->mimeEnd($this->EOL);
+
+ $text->disposition = false;
+ $html->disposition = false;
+
+ $body = $boundaryLine
+ . $text->getHeaders($this->EOL)
+ . $this->EOL
+ . $text->getContent()
+ . $this->EOL
+ . $boundaryLine
+ . $html->getHeaders($this->EOL)
+ . $this->EOL
+ . $html->getContent()
+ . $this->EOL
+ . $boundaryEnd;
+
+ $mp = new Zend_Mime_Part($body);
+ $mp->type = Zend_Mime::MULTIPART_ALTERNATIVE;
+ $mp->boundary = $mime->boundary();
+
+ $this->_isMultipart = true;
+
+ // Ensure first part contains text alternatives
+ array_unshift($this->_parts, $mp);
+
+ // Get headers
+ $this->_headers = $this->_mail->getHeaders();
+ return;
+ }
+
+ // If not multipart, then get the body
+ if (false !== ($body = $this->_mail->getBodyHtml())) {
+ array_unshift($this->_parts, $body);
+ } elseif (false !== ($body = $this->_mail->getBodyText())) {
+ array_unshift($this->_parts, $body);
+ }
+
+ if (!$body) {
+ throw new Zend_Mail_Transport_Exception('No body specified');
+ }
+
+ // Get headers
+ $this->_headers = $this->_mail->getHeaders();
+ $headers = $body->getHeadersArray($this->EOL);
+ foreach ($headers as $header) {
+ // Headers in Zend_Mime_Part are kept as arrays with two elements, a
+ // key and a value
+ $this->_headers[$header[0]] = array($header[1]);
+ }
+ }
+
+ /**
+ * Send a mail using this transport
+ *
+ * @param Zend_Mail $mail
+ * @access public
+ * @return void
+ * @throws Zend_Mail_Transport_Exception if mail is empty
+ */
+ public function send(Zend_Mail $mail)
+ {
+ $this->_isMultipart = false;
+ $this->_mail = $mail;
+ $this->_parts = $mail->getParts();
+ $mime = $mail->getMime();
+
+ // Build body content
+ $this->_buildBody();
+
+ // Determine number of parts and boundary
+ $count = count($this->_parts);
+ $boundary = null;
+ if ($count < 1) {
+ throw new Zend_Mail_Transport_Exception('Empty mail cannot be sent');
+ }
+
+ if ($count > 1) {
+ // Multipart message; create new MIME object and boundary
+ $mime = new Zend_Mime($this->_mail->getMimeBoundary());
+ $boundary = $mime->boundary();
+ } elseif ($this->_isMultipart) {
+ // multipart/alternative -- grab boundary
+ $boundary = $this->_parts[0]->boundary;
+ }
+
+ // Determine recipients, and prepare headers
+ $this->recipients = implode(',', $mail->getRecipients());
+ $this->_prepareHeaders($this->_getHeaders($boundary));
+
+ // Create message body
+ // This is done so that the same Zend_Mail object can be used in
+ // multiple transports
+ $message = new Zend_Mime_Message();
+ $message->setParts($this->_parts);
+ $message->setMime($mime);
+ $this->body = $message->generateMessage($this->EOL);
+
+ // Send to transport!
+ $this->_sendMail();
+ }
+}
diff --git a/libs/Zend/Mail/Transport/Exception.php b/libs/Zend/Mail/Transport/Exception.php
new file mode 100755
index 0000000000..abb0eaa1cd
--- /dev/null
+++ b/libs/Zend/Mail/Transport/Exception.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Transport
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+
+/**
+ * Zend_Mail_Exception
+ */
+require_once 'Zend/Mail/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Transport
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mail_Transport_Exception extends Zend_Mail_Exception
+{}
+
diff --git a/libs/Zend/Mail/Transport/Sendmail.php b/libs/Zend/Mail/Transport/Sendmail.php
new file mode 100755
index 0000000000..f4510f4eca
--- /dev/null
+++ b/libs/Zend/Mail/Transport/Sendmail.php
@@ -0,0 +1,153 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Transport
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Mail_Transport_Abstract
+ */
+require_once 'Zend/Mail/Transport/Abstract.php';
+
+
+/**
+ * Class for sending eMails via the PHP internal mail() function
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Transport
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mail_Transport_Sendmail extends Zend_Mail_Transport_Abstract
+{
+ /**
+ * Subject
+ * @var string
+ * @access public
+ */
+ public $subject = null;
+
+
+ /**
+ * Config options for sendmail parameters
+ *
+ * @var string
+ */
+ public $parameters;
+
+
+ /**
+ * EOL character string
+ * @var string
+ * @access public
+ */
+ public $EOL = PHP_EOL;
+
+
+ /**
+ * Constructor.
+ *
+ * @param string $parameters OPTIONAL (Default: null)
+ * @return void
+ */
+ public function __construct($parameters = null)
+ {
+ $this->parameters = $parameters;
+ }
+
+
+ /**
+ * Send mail using PHP native mail()
+ *
+ * @access public
+ * @return void
+ * @throws Zend_Mail_Transport_Exception on mail() failure
+ */
+ public function _sendMail()
+ {
+ if ($this->parameters === null) {
+ $result = mail(
+ $this->recipients,
+ $this->_mail->getSubject(),
+ $this->body,
+ $this->header);
+ } else {
+ $result = mail(
+ $this->recipients,
+ $this->_mail->getSubject(),
+ $this->body,
+ $this->header,
+ $this->parameters);
+ }
+ if (!$result)
+ {
+ throw new Zend_Mail_Transport_Exception('Unable to send mail');
+ }
+ }
+
+
+ /**
+ * Format and fix headers
+ *
+ * mail() uses its $to and $subject arguments to set the To: and Subject:
+ * headers, respectively. This method strips those out as a sanity check to
+ * prevent duplicate header entries.
+ *
+ * @access protected
+ * @param array $headers
+ * @return void
+ */
+ protected function _prepareHeaders($headers)
+ {
+ if (!$this->_mail) {
+ throw new Zend_Mail_Transport_Exception('_prepareHeaders requires a registered Zend_Mail object');
+ }
+
+ // mail() uses its $to parameter to set the To: header, and the $subject
+ // parameter to set the Subject: header. We need to strip them out.
+ if (0 === strpos(PHP_OS, 'WIN')) {
+ // If the current recipients list is empty, throw an error
+ if (empty($this->recipients)) {
+ throw new Zend_Mail_Transport_Exception('Missing To addresses');
+ }
+ } else {
+ // All others, simply grab the recipients and unset the To: header
+ if (!isset($headers['To'])) {
+ throw new Zend_Mail_Transport_Exception('Missing To header');
+ }
+
+ unset($headers['To']['append']);
+ $this->recipients = implode(',', $headers['To']);
+ }
+
+ // Remove recipient header
+ unset($headers['To']);
+
+ // Remove subject header, if present
+ if (isset($headers['Subject'])) {
+ unset($headers['Subject']);
+ }
+
+ // Prepare headers
+ parent::_prepareHeaders($headers);
+ }
+
+}
+
diff --git a/libs/Zend/Mail/Transport/Smtp.php b/libs/Zend/Mail/Transport/Smtp.php
new file mode 100755
index 0000000000..23805742f6
--- /dev/null
+++ b/libs/Zend/Mail/Transport/Smtp.php
@@ -0,0 +1,202 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Transport
+ * @version $Id: Smtp.php 3944 2007-03-14 22:13:13Z peptolab $
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Loader
+ */
+require_once 'Zend/Loader.php';
+
+
+/**
+ * Zend_Mail_Protocol_Smtp
+ */
+require_once 'Zend/Mail/Protocol/Smtp.php';
+
+
+/**
+ * Zend_Mail_Transport_Abstract
+ */
+require_once 'Zend/Mail/Transport/Abstract.php';
+
+
+/**
+ * SMTP connection object
+ *
+ * Loads an instance of Zend_Mail_Protocol_Smtp and forwards smtp transactions
+ *
+ * @category Zend
+ * @package Zend_Mail
+ * @subpackage Transport
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mail_Transport_Smtp extends Zend_Mail_Transport_Abstract
+{
+ /**
+ * Remote smtp hostname or i.p.
+ *
+ * @var string
+ */
+ protected $_host;
+
+
+ /**
+ * Port number
+ *
+ * @var integer|null
+ */
+ protected $_port;
+
+
+ /**
+ * Local client hostname or i.p.
+ *
+ * @var string
+ */
+ protected $_name = 'localhost';
+
+
+ /**
+ * Authentication type OPTIONAL
+ *
+ * @var string
+ */
+ protected $_auth;
+
+
+ /**
+ * Config options for authentication
+ *
+ * @var array
+ */
+ protected $_config;
+
+
+ /**
+ * Instance of Zend_Mail_Protocol_Smtp
+ *
+ * @var Zend_Mail_Protocol_Smtp
+ */
+ protected $_connection;
+
+
+ /**
+ * Constructor.
+ *
+ * @param string $host OPTIONAL (Default: 127.0.0.1)
+ * @param array|null $config OPTIONAL (Default: null)
+ * @return void
+ */
+ public function __construct($host = '127.0.0.1', Array $config = array())
+ {
+ if (isset($config['name'])) {
+ $this->_name = $config['name'];
+ }
+ if (isset($config['port'])) {
+ $this->_port = $config['port'];
+ }
+ if (isset($config['auth'])) {
+ $this->_auth = $config['auth'];
+ }
+
+ $this->_host = $host;
+ $this->_config = $config;
+ }
+
+
+ /**
+ * Class destructor to ensure all open connections are closed
+ *
+ * @return void
+ */
+ public function __destruct()
+ {
+ if ($this->_connection instanceof Zend_Mail_Protocol_Smtp) {
+ $this->_connection->quit();
+ $this->_connection->disconnect();
+ }
+ }
+
+
+ /**
+ * Sets the connection protocol instance
+ *
+ * @param Zend_Mail_Protocol_Abstract $client
+ *
+ * @return void
+ */
+ public function setConnection(Zend_Mail_Protocol_Abstract $connection)
+ {
+ $this->_connection = $connection;
+ }
+
+
+ /**
+ * Gets the connection protocol instance
+ *
+ * @return Zend_Mail_Protocol|null
+ */
+ public function getConnection()
+ {
+ return $this->_connection;
+ }
+
+ /**
+ * Send an email via the SMTP connection protocol
+ *
+ * The connection via the protocol adapter is made just-in-time to allow a
+ * developer to add a custom adapter if required before mail is sent.
+ *
+ * @return void
+ */
+ public function _sendMail()
+ {
+ // If sending multiple messages per session use existing adapter
+ if (!($this->_connection instanceof Zend_Mail_Protocol_Smtp)) {
+ // Check if authentication is required and determine required class
+ $connectionClass = 'Zend_Mail_Protocol_Smtp';
+ if ($this->_auth) {
+ $connectionClass .= '_Auth_' . ucwords($this->_auth);
+ }
+ Zend_Loader::loadClass($connectionClass);
+ $this->setConnection(new $connectionClass($this->_host, $this->_port, $this->_config));
+ $this->_connection->connect();
+ $this->_connection->helo($this->_name);
+ } else {
+ // Reset connection to ensure reliable transaction
+ $this->_connection->rset();
+ }
+
+ // Set mail return path from sender email address
+ $this->_connection->mail($this->_mail->getReturnPath());
+
+ // Set recipient forward paths
+ foreach ($this->_mail->getRecipients() as $recipient) {
+ $this->_connection->rcpt($recipient);
+ }
+
+ // Issue DATA command to client
+ $this->_connection->data($this->header . $this->EOL . $this->body);
+ }
+
+}
diff --git a/libs/Zend/Memory.php b/libs/Zend/Memory.php
new file mode 100755
index 0000000000..34fdbbde9a
--- /dev/null
+++ b/libs/Zend/Memory.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Memory_Exception */
+require_once 'Zend/Memory/Manager.php';
+
+/** Zend_Memory_Exception */
+require_once 'Zend/Memory/Exception.php';
+
+/** Zend_Memory_Value */
+require_once 'Zend/Memory/Value.php';
+
+/** Zend_Memory_Container */
+require_once 'Zend/Memory/Container.php';
+
+/** Zend_Memory_Exception */
+require_once 'Zend/Cache.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Memory
+{
+ /**
+ * Factory
+ *
+ * @param string $backend backend name
+ * @param array $backendOptions associative array of options for the corresponding backend constructor
+ * @return Zend_Memory_Manager
+ * @throws Zend_Memory_Exception
+ */
+ public static function factory($backend, $backendOptions = array())
+ {
+ if (strcasecmp($backend, 'none') == 0) {
+ return new Zend_Memory_Manager();
+ }
+
+ // because lowercase will fail
+ $backend = @ucfirst(strtolower($backend));
+
+ if (!in_array($backend, Zend_Cache::$availableBackends)) {
+ throw new Zend_Memory_Exception("Incorrect backend ($backend)");
+ }
+
+ $backendClass = 'Zend_Cache_Backend_' . $backend;
+
+ // For perfs reasons, we do not use the Zend_Loader::loadClass() method
+ // (security controls are explicit)
+ require_once str_replace('_', DIRECTORY_SEPARATOR, $backendClass) . '.php';
+
+ $backendObject = new $backendClass($backendOptions);
+
+ return new Zend_Memory_Manager($backendObject);
+ }
+}
diff --git a/libs/Zend/Memory/AccessController.php b/libs/Zend/Memory/AccessController.php
new file mode 100755
index 0000000000..ab302b1dd8
--- /dev/null
+++ b/libs/Zend/Memory/AccessController.php
@@ -0,0 +1,147 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Memory_Container_Interface
+ */
+require_once 'Zend/Memory/Container/Interface.php';
+
+/**
+ * Memory object container access controller.
+ *
+ * Memory manager stores a list of generated objects to control them.
+ * So container objects always have at least one reference and can't be automatically destroyed.
+ *
+ * This class is intended to be an userland proxy to memory container object.
+ * It's not referenced by memory manager and class destructor is invoked immidiately after gouing
+ * out of scope or unset operation.
+ *
+ * Class also provides Zend_Memory_Container_Interface interface and works as proxy for such cases.
+ *
+ * @category Zend
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Memory_AccessController implements Zend_Memory_Container_Interface
+{
+ /**
+ * Memory container object
+ *
+ * @var Zend_Memory_Container
+ */
+ private $_memContainer;
+
+
+ /**
+ * Object constructor
+ *
+ * @param Zend_Memory_Container_Movable $memoryManager
+ */
+ public function __construct(Zend_Memory_Container_Movable $memContainer)
+ {
+ $this->_memContainer = $memContainer;
+ }
+
+ /**
+ * Object destructor
+ */
+ public function __destruct()
+ {
+ $this->_memContainer->destroy();
+ }
+
+
+ /**
+ * Get string value reference
+ *
+ * _Must_ be used for value access before PHP v 5.2
+ * or _may_ be used for performance considerations
+ *
+ * @return &string
+ */
+ public function &getRef()
+ {
+ return $this->_memContainer->getRef();
+ }
+
+ /**
+ * Signal, that value is updated by external code.
+ *
+ * Should be used together with getRef()
+ */
+ public function touch()
+ {
+ $this->_memContainer->touch();
+ }
+
+ /**
+ * Lock object in memory.
+ */
+ public function lock()
+ {
+ $this->_memContainer->lock();
+ }
+
+
+ /**
+ * Unlock object
+ */
+ public function unlock()
+ {
+ $this->_memContainer->unlock();
+ }
+
+ /**
+ * Return true if object is locked
+ *
+ * @return boolean
+ */
+ public function isLocked()
+ {
+ return $this->_memContainer->isLocked();
+ }
+
+ /**
+ * Get handler
+ *
+ * Loads object if necessary and moves it to the top of loaded objects list.
+ * Swaps objects from the bottom of loaded objects list, if necessary.
+ *
+ * @param string $property
+ * @return string
+ * @throws Zend_Memory_Exception
+ */
+ public function __get($property)
+ {
+ return $this->_memContainer->$property;
+ }
+
+ /**
+ * Set handler
+ *
+ * @param string $property
+ * @param string $value
+ * @throws Zend_Exception
+ */
+ public function __set($property, $value)
+ {
+ $this->_memContainer->$property = $value;
+ }
+}
diff --git a/libs/Zend/Memory/Container.php b/libs/Zend/Memory/Container.php
new file mode 100755
index 0000000000..e514b1b914
--- /dev/null
+++ b/libs/Zend/Memory/Container.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Memory_Exception */
+require_once 'Zend/Memory/Exception.php';
+
+/** Zend_Memory_Container_Interface */
+require_once 'Zend/Memory/Container/Interface.php';
+
+
+/**
+ * Memory value container
+ *
+ * @category Zend
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Memory_Container implements Zend_Memory_Container_Interface
+{
+}
diff --git a/libs/Zend/Memory/Container/Interface.php b/libs/Zend/Memory/Container/Interface.php
new file mode 100755
index 0000000000..6fd28ae947
--- /dev/null
+++ b/libs/Zend/Memory/Container/Interface.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Memory value container interface
+ *
+ * @category Zend
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Memory_Container_Interface
+{
+ /**
+ * Get string value reference
+ *
+ * _Must_ be used for value access before PHP v 5.2
+ * or _may_ be used for performance considerations
+ *
+ * @return &string
+ */
+ public function &getRef();
+
+ /**
+ * Signal, that value is updated by external code.
+ *
+ * Should be used together with getRef()
+ */
+ public function touch();
+
+ /**
+ * Lock object in memory.
+ */
+ public function lock();
+
+ /**
+ * Unlock object
+ */
+ public function unlock();
+
+ /**
+ * Return true if object is locked
+ *
+ * @return boolean
+ */
+ public function isLocked();
+}
+
diff --git a/libs/Zend/Memory/Container/Locked.php b/libs/Zend/Memory/Container/Locked.php
new file mode 100755
index 0000000000..9ab9f16c86
--- /dev/null
+++ b/libs/Zend/Memory/Container/Locked.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Memory_Exception */
+require_once 'Zend/Memory/Exception.php';
+
+/** Zend_Memory_Container */
+require_once 'Zend/Memory/Container.php';
+
+
+/**
+ * Memory value container
+ *
+ * Locked (always stored in memory).
+ *
+ * @category Zend
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Memory_Container_Locked extends Zend_Memory_Container
+{
+ /**
+ * Value object
+ *
+ * @var string
+ */
+ public $value;
+
+
+ /**
+ * Object constructor
+ *
+ * @param Zend_Memory_Manager $memoryManager
+ * @param integer $id
+ * @param string $value
+ */
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+
+ /**
+ * Lock object in memory.
+ */
+ public function lock()
+ {
+ /* Do nothing */
+ }
+
+ /**
+ * Unlock object
+ */
+ public function unlock()
+ {
+ /* Do nothing */
+ }
+
+ /**
+ * Return true if object is locked
+ *
+ * @return boolean
+ */
+ public function isLocked()
+ {
+ return true;
+ }
+
+ /**
+ * Get string value reference
+ *
+ * _Must_ be used for value access before PHP v 5.2
+ * or _may_ be used for performance considerations
+ *
+ * @return &string
+ */
+ public function &getRef()
+ {
+ return $this->value;
+ }
+
+ /**
+ * Signal, that value is updated by external code.
+ *
+ * Should be used together with getRef()
+ */
+ public function touch()
+ {
+ /* Do nothing */
+ }
+
+ /**
+ * Destroy memory container and remove it from memory manager list
+ */
+ public function destroy()
+ {
+ /* Do nothing */
+ }
+}
diff --git a/libs/Zend/Memory/Container/Movable.php b/libs/Zend/Memory/Container/Movable.php
new file mode 100755
index 0000000000..2658276146
--- /dev/null
+++ b/libs/Zend/Memory/Container/Movable.php
@@ -0,0 +1,298 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Memory_Exception */
+require_once 'Zend/Memory/Exception.php';
+
+/** Zend_Memory_Container */
+require_once 'Zend/Memory/Container.php';
+
+/** Zend_Memory_Value */
+require_once 'Zend/Memory/Value.php';
+
+
+/**
+ * Memory value container
+ *
+ * Movable (may be swapped with specified backend and unloaded).
+ *
+ * @category Zend
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Memory_Container_Movable extends Zend_Memory_Container {
+ /**
+ * Internal object Id
+ *
+ * @var integer
+ */
+ protected $_id;
+
+ /**
+ * Memory manager reference
+ *
+ * @var Zend_Memory_Manager
+ */
+ private $_memManager;
+
+ /**
+ * Value object
+ *
+ * @var Zend_Memory_Value
+ */
+ private $_value;
+
+ /** Value states */
+ const LOADED = 1;
+ const SWAPPED = 2;
+ const LOCKED = 4;
+
+ /**
+ * Value state (LOADED/SWAPPED/LOCKED)
+ *
+ * @var integer
+ */
+ private $_state;
+
+ /**
+ * Object constructor
+ *
+ * @param Zend_Memory_Manager $memoryManager
+ * @param integer $id
+ * @param string $value
+ */
+ public function __construct(Zend_Memory_Manager $memoryManager, $id, $value)
+ {
+ $this->_memManager = $memoryManager;
+ $this->_id = $id;
+ $this->_state = self::LOADED;
+ $this->_value = new Zend_Memory_Value($value, $this);
+ }
+
+ /**
+ * Lock object in memory.
+ */
+ public function lock()
+ {
+ if ( !($this->_state & self::LOADED) ) {
+ $this->_memManager->load($this, $this->_id);
+ $this->_state |= self::LOADED;
+ }
+
+ $this->_state |= self::LOCKED;
+
+ /**
+ * @todo
+ * It's possible to set "value" container attribute to avoid modification tracing, while it's locked
+ * Check, if it's more effective
+ */
+ }
+
+ /**
+ * Unlock object
+ */
+ public function unlock()
+ {
+ // Clear LOCKED state bit
+ $this->_state &= ~self::LOCKED;
+ }
+
+ /**
+ * Return true if object is locked
+ *
+ * @return boolean
+ */
+ public function isLocked()
+ {
+ return $this->_state & self::LOCKED;
+ }
+
+ /**
+ * Get handler
+ *
+ * Loads object if necessary and moves it to the top of loaded objects list.
+ * Swaps objects from the bottom of loaded objects list, if necessary.
+ *
+ * @param string $property
+ * @return string
+ * @throws Zend_Memory_Exception
+ */
+ public function __get($property)
+ {
+ if ($property != 'value') {
+ throw new Zend_Memory_Exception('Unknown property: Zend_Memory_container::$' . $property);
+ }
+
+ if ( !($this->_state & self::LOADED) ) {
+ $this->_memManager->load($this, $this->_id);
+ $this->_state |= self::LOADED;
+ }
+
+ return $this->_value;
+ }
+
+ /**
+ * Set handler
+ *
+ * @param string $property
+ * @param string $value
+ * @throws Zend_Exception
+ */
+ public function __set($property, $value)
+ {
+ if ($property != 'value') {
+ throw new Zend_Memory_Exception('Unknown property: Zend_Memory_container::$' . $property);
+ }
+
+ $this->_state = self::LOADED;
+ $this->_value = new Zend_Memory_Value($value, $this);
+
+ $this->_memManager->processUpdate($this, $this->_id);
+ }
+
+
+ /**
+ * Get string value reference
+ *
+ * _Must_ be used for value access before PHP v 5.2
+ * or _may_ be used for performance considerations
+ *
+ * @return &string
+ */
+ public function &getRef()
+ {
+ if ( !($this->_state & self::LOADED) ) {
+ $this->_memManager->load($this, $this->_id);
+ $this->_state |= self::LOADED;
+ }
+
+ return $this->_value->getRef();
+ }
+
+ /**
+ * Signal, that value is updated by external code.
+ *
+ * Should be used together with getRef()
+ */
+ public function touch()
+ {
+ $this->_memManager->processUpdate($this, $this->_id);
+ }
+
+ /**
+ * Process container value update.
+ * Must be called only by value object
+ *
+ * @internal
+ */
+ public function processUpdate()
+ {
+ // Clear SWAPPED state bit
+ $this->_state &= ~self::SWAPPED;
+
+ $this->_memManager->processUpdate($this, $this->_id);
+ }
+
+ /**
+ * Start modifications trace
+ *
+ * @internal
+ */
+ public function startTrace()
+ {
+ if ( !($this->_state & self::LOADED) ) {
+ $this->_memManager->load($this, $this->_id);
+ $this->_state |= self::LOADED;
+ }
+
+ $this->_value->startTrace();
+ }
+
+ /**
+ * Set value (used by memory manager when value is loaded)
+ *
+ * @internal
+ */
+ public function setValue($value)
+ {
+ $this->_value = new Zend_Memory_Value($value, $this);
+ }
+
+ /**
+ * Clear value (used by memory manager when value is swapped)
+ *
+ * @internal
+ */
+ public function unloadValue()
+ {
+ // Clear LOADED state bit
+ $this->_state &= ~self::LOADED;
+
+ $this->_value = null;
+ }
+
+ /**
+ * Mark, that object is swapped
+ *
+ * @internal
+ */
+ public function markAsSwapped()
+ {
+ // Clear LOADED state bit
+ $this->_state |= self::LOADED;
+ }
+
+ /**
+ * Check if object is marked as swapped
+ *
+ * @internal
+ * @return boolean
+ */
+ public function isSwapped()
+ {
+ return $this->_state & self::SWAPPED;
+ }
+
+ /**
+ * Get object id
+ *
+ * @internal
+ * @return integer
+ */
+ public function getId()
+ {
+ return $this->_id;
+ }
+ /**
+ * Destroy memory container and remove it from memory manager list
+ *
+ * @internal
+ */
+ public function destroy()
+ {
+ /**
+ * We don't clean up swap because of performance considerations
+ * Cleaning is performed by Memory Manager destructor
+ */
+
+ $this->_memManager->unlink($this, $this->_id);
+ }
+}
diff --git a/libs/Zend/Memory/Exception.php b/libs/Zend/Memory/Exception.php
new file mode 100755
index 0000000000..62cb112688
--- /dev/null
+++ b/libs/Zend/Memory/Exception.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Exception.php 1972 2006-11-30 18:28:34Z matthew $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Controller_Exception */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Memory_Exception extends Zend_Exception
+{}
+
diff --git a/libs/Zend/Memory/Manager.php b/libs/Zend/Memory/Manager.php
new file mode 100755
index 0000000000..3f7a937352
--- /dev/null
+++ b/libs/Zend/Memory/Manager.php
@@ -0,0 +1,460 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Memory_Container_Movable */
+require_once 'Zend/Memory/Container/Movable.php';
+
+/** Zend_Memory_Container_Locked */
+require_once 'Zend/Memory/Container/Locked.php';
+
+/** Zend_Memory_AccessController */
+require_once 'Zend/Memory/AccessController.php';
+
+
+/**
+ * Memory manager
+ *
+ * This class encapsulates memory menagement operations, when PHP works
+ * in limited memory mode.
+ *
+ *
+ * @category Zend
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Memory_Manager
+{
+ /**
+ * Object storage backend
+ *
+ * @var Zend_Cache_Backend_Interface
+ */
+ private $_backend = null;
+
+ /**
+ * Memory grow limit.
+ * Default value is 2/3 of memory_limit php.ini variable
+ * Negative value means no limit
+ *
+ * @var integer
+ */
+ private $_memoryLimit = -1;
+
+ /**
+ * Minimum value size to be swapped.
+ * Default value is 16K
+ * Negative value means that memory objects are never swapped
+ *
+ * @var integer
+ */
+ private $_minSize = 16384;
+
+ /**
+ * Overall size of memory, used by values
+ *
+ * @var integer
+ */
+ private $_memorySize = 0;
+
+ /**
+ * Id for next Zend_Memory object
+ *
+ * @var integer
+ */
+ private $_nextId = 0;
+
+ /**
+ * List of candidates to unload
+ *
+ * It also represents objects access history. Last accessed objects are moved to the end of array
+ *
+ * array(
+ * <id> => <memory container object>,
+ * ...
+ * )
+ *
+ * @var array
+ */
+ private $_unloadCandidates = array();
+
+ /**
+ * List of object sizes.
+ *
+ * This list is used to calculate modification of object sizes
+ *
+ * array( <id> => <size>, ...)
+ *
+ * @var array
+ */
+ private $_sizes = array();
+
+ /**
+ * Last modified object
+ *
+ * It's used to reduce number of calls necessary to trace objects' modifications
+ * Modification is not processed by memory manager until we do not switch to another
+ * object.
+ * So we have to trace only _first_ object modification and do nothing for others
+ *
+ * @var Zend_Memory_Container_Movable
+ */
+ private $_lastModified = null;
+
+ /**
+ * Unique memory manager id
+ *
+ * @var integer
+ */
+ private $_managerId;
+
+ /**
+ * Tags array, used by backend to categorize stored values
+ *
+ * @var array
+ */
+ private $_tags;
+
+ /**
+ * This function is intended to generate unique id, used by memory manager
+ */
+ private function _generateMemManagerId()
+ {
+ /**
+ * @todo !!!
+ * uniqid() php function doesn't really garantee the id to be unique
+ * it should be changed by something else
+ * (Ex. backend interface should be extended to provide this functionality)
+ */
+ $this->_managerId = uniqid('ZendMemManager', true);
+ $this->_tags = array($this->_managerId);
+ $this->_managerId .= '_';
+ }
+
+
+ /**
+ * Memory manager constructor
+ *
+ * If backend is not specified, then memory objects are never swapped
+ *
+ * @param Zend_Cache_Backend $backend
+ * @param array $backendOptions associative array of options for the corresponding backend constructor
+ */
+ public function __construct($backend = null)
+ {
+ if ($backend === null) {
+ return;
+ }
+
+ $this->_backend = $backend;
+ $this->_generateMemManagerId();
+
+ $memoryLimitStr = trim(ini_get('memory_limit'));
+ if ($memoryLimitStr != '') {
+ $this->_memoryLimit = (integer)$memoryLimitStr;
+ switch (strtolower($memoryLimitStr[strlen($memoryLimitStr)-1])) {
+ case 'g':
+ $this->_memoryLimit *= 1024;
+ // Break intentionally omitted
+ case 'm':
+ $this->_memoryLimit *= 1024;
+ // Break intentionally omitted
+ case 'k':
+ $this->_memoryLimit *= 1024;
+ break;
+
+ default:
+ break;
+ }
+
+ $this->_memoryLimit = (int)($this->_memoryLimit*2/3);
+ } // No limit otherwise
+ }
+
+ /**
+ * Object destructor
+ *
+ * Clean up backend storage
+ */
+ public function __destruct()
+ {
+ if ($this->_backend !== null) {
+ $this->_backend->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, $this->_tags);
+ }
+ }
+
+ /**
+ * Set memory grow limit
+ *
+ * @param integer $newLimit
+ * @throws Zend_Exception
+ */
+ public function setMemoryLimit($newLimit)
+ {
+ $this->_memoryLimit = $newLimit;
+
+ $this->_swapCheck();
+ }
+
+ /**
+ * Get memory grow limit
+ *
+ * @return integer
+ */
+ public function getMemoryLimit()
+ {
+ return $this->_memoryLimit;
+ }
+
+ /**
+ * Set minimum size of values, which may be swapped
+ *
+ * @param integer $newSize
+ */
+ public function setMinSize($newSize)
+ {
+ $this->_minSize = $newSize;
+ }
+
+ /**
+ * Get minimum size of values, which may be swapped
+ *
+ * @return integer
+ */
+ public function getMinSize()
+ {
+ return $this->_minSize;
+ }
+
+ /**
+ * Create new Zend_Memory value container
+ *
+ * @param string $value
+ * @return Zend_Memory_Container_Interface
+ * @throws Zend_Memory_Exception
+ */
+ public function create($value = '')
+ {
+ return $this->_create($value, false);
+ }
+
+ /**
+ * Create new Zend_Memory value container, which has value always
+ * locked in memory
+ *
+ * @param string $value
+ * @return Zend_Memory_Container_Interface
+ * @throws Zend_Memory_Exception
+ */
+ public function createLocked($value = '')
+ {
+ return $this->_create($value, true);
+ }
+
+ /**
+ * Create new Zend_Memory object
+ *
+ * @param string $value
+ * @param boolean $locked
+ * @return Zend_Memory_Container_Interface
+ * @throws Zend_Memory_Exception
+ */
+ private function _create($value, $locked)
+ {
+ $id = $this->_nextId++;
+
+ if ($locked || ($this->_backend === null) /* Use only memory locked objects if backend is not specified */) {
+ return new Zend_Memory_Container_Locked($value);
+ }
+
+ // Commit other objects modifications
+ $this->_commit();
+
+ $valueObject = new Zend_Memory_Container_Movable($this, $id, $value);
+
+ // Store last object size as 0
+ $this->_sizes[$id] = 0;
+ // prepare object for next modifications
+ $this->_lastModified = $valueObject;
+
+ return new Zend_Memory_AccessController($valueObject);
+ }
+
+ /**
+ * Unlink value container from memory manager
+ *
+ * Used by Memory container destroy() method
+ *
+ * @internal
+ * @param integer $id
+ * @return Zend_Memory_Container
+ */
+ public function unlink(Zend_Memory_Container_Movable $container, $id)
+ {
+ if ($this->_lastModified === $container) {
+ // Drop all object modifications
+ $this->_lastModified = null;
+ unset($this->_sizes[$id]);
+ return;
+ }
+
+ if (isset($this->_unloadCandidates[$id])) {
+ unset($this->_unloadCandidates[$id]);
+ }
+
+ $this->_memorySize -= $this->_sizes[$id];
+ unset($this->_sizes[$id]);
+ }
+
+ /**
+ * Process value update
+ *
+ * @internal
+ * @param Zend_Memory_Container_Movable $container
+ * @param integer $id
+ */
+ public function processUpdate(Zend_Memory_Container_Movable $container, $id)
+ {
+ /**
+ * This method is automatically invoked by memory container only once per
+ * "modification session", but user may call memory container touch() method
+ * several times depending on used algorithm. So we have to use this check
+ * to optimize this case.
+ */
+ if ($container === $this->_lastModified) {
+ return;
+ }
+
+ // Remove just updated object from list of candidates to unload
+ if( isset($this->_unloadCandidates[$id])) {
+ unset($this->_unloadCandidates[$id]);
+ }
+
+ // Reduce used memory mark
+ $this->_memorySize -= $this->_sizes[$id];
+
+ // Commit changes of previously modified object if necessary
+ $this->_commit();
+
+ $this->_lastModified = $container;
+ }
+
+ /**
+ * Commit modified object and put it back to the loaded objects list
+ */
+ private function _commit()
+ {
+ if (($container = $this->_lastModified) === null) {
+ return;
+ }
+
+ $this->_lastModified = null;
+
+ $id = $container->getId();
+
+ // Calculate new object size and increase used memory size by this value
+ $this->_memorySize += ($this->_sizes[$id] = strlen($container->getRef()));
+
+ if ($this->_sizes[$id] > $this->_minSize) {
+ // Move object to "unload candidates list"
+ $this->_unloadCandidates[$id] = $container;
+ }
+
+ $container->startTrace();
+
+ $this->_swapCheck();
+ }
+
+ /**
+ * Check and swap objects if necessary
+ *
+ * @throws Zend_MemoryException
+ */
+ private function _swapCheck()
+ {
+ if ($this->_memoryLimit < 0 || $this->_memorySize < $this->_memoryLimit) {
+ // Memory limit is not reached
+ // Do nothing
+ return;
+ }
+
+ // walk through loaded objects in access history order
+ foreach ($this->_unloadCandidates as $id => $container) {
+ $this->_swap($container, $id);
+ unset($this->_unloadCandidates[$id]);
+
+ if ($this->_memorySize < $this->_memoryLimit) {
+ // We've swapped enough objects
+ return;
+ }
+ }
+
+ throw new Zend_Memory_Exception('Memory manager can\'t get enough space.');
+ }
+
+
+ /**
+ * Swap object data to disk
+ * Actualy swaps data or only unloads it from memory,
+ * if object is not changed since last swap
+ *
+ * @param Zend_Memory_Container_Movable $container
+ * @param integer $id
+ */
+ private function _swap(Zend_Memory_Container_Movable $container, $id)
+ {
+ if ($container->isLocked()) {
+ return;
+ }
+
+ if (!$container->isSwapped()) {
+ $this->_backend->save($container->getRef(), $this->_managerId . $id, $this->_tags);
+ }
+
+ $this->_memorySize -= $this->_sizes[$id];
+
+ $container->markAsSwapped();
+ $container->unloadValue();
+ }
+
+ /**
+ * Load value from swap file.
+ *
+ * @internal
+ * @param Zend_Memory_Container_Movable $container
+ * @param integer $id
+ */
+ public function load(Zend_Memory_Container_Movable $container, $id)
+ {
+ $value = $this->_backend->load($this->_managerId . $id, true);
+
+ // Try to swap other objects if necessary
+ // (do not include specified object into check)
+ $this->_memorySize += strlen($value);
+ $this->_swapCheck();
+
+ // Add loaded obect to the end of loaded objects list
+ $container->setValue($value);
+
+ if ($this->_sizes[$id] > $this->_minSize) {
+ // Add object to the end of "unload candidates list"
+ $this->_unloadCandidates[$id] = $container;
+ }
+ }
+}
diff --git a/libs/Zend/Memory/Value.php b/libs/Zend/Memory/Value.php
new file mode 100755
index 0000000000..d81e53972e
--- /dev/null
+++ b/libs/Zend/Memory/Value.php
@@ -0,0 +1,174 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * String value object
+ *
+ * It's an OO string wrapper.
+ * Used to intercept string updates.
+ *
+ * @package Zend_Memory
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @todo also implement Countable for PHP 5.1 but not yet to stay 5.0 compatible
+ */
+class Zend_Memory_Value implements ArrayAccess {
+ /**
+ * Value
+ *
+ * @var string
+ */
+ private $_value;
+
+ /**
+ * Container
+ *
+ * @var Zend_Memory_Container_Interface
+ */
+ private $_container;
+
+ /**
+ * Boolean flag which signals to trace value modifications
+ *
+ * @var boolean
+ */
+ private $_trace;
+
+
+ /**
+ * Object constructor
+ *
+ * @param string $value
+ * @param Zend_Memory_Container_Movable $container
+ */
+ public function __construct($value, Zend_Memory_Container_Movable $container)
+ {
+ $this->_container = $container;
+
+ $this->_value = (string)$value;
+
+ /**
+ * Object is marked as just modified by memory manager
+ * So we don't need to trace followed object modifications and
+ * object is processed (and marked as traced) when another
+ * memory object is modified.
+ *
+ * It reduces overall numberr of calls necessary to modification trace
+ */
+ $this->_trace = false;
+ }
+
+
+ /**
+ * ArrayAccess interface method
+ * returns true if string offset exists
+ *
+ * @param integer $offset
+ * @return boolean
+ */
+ public function offsetExists($offset)
+ {
+ return $offset >= 0 && $offset < strlen($this->_value);
+ }
+
+ /**
+ * ArrayAccess interface method
+ * Get character at $offset position
+ *
+ * @param integer $offset
+ * @return string
+ */
+ public function offsetGet($offset)
+ {
+ return $this->_value[$offset];
+ }
+
+ /**
+ * ArrayAccess interface method
+ * Set character at $offset position
+ *
+ * @param integer $offset
+ * @param string $char
+ */
+ public function offsetSet($offset, $char)
+ {
+ $this->_value[$offset] = $char;
+
+ if ($this->_trace) {
+ $this->_trace = false;
+ $this->_container->processUpdate();
+ }
+ }
+
+ /**
+ * ArrayAccess interface method
+ * Unset character at $offset position
+ *
+ * @param integer $offset
+ */
+ public function offsetUnset($offset)
+ {
+ unset($this->_value[$offset]);
+
+ if ($this->_trace) {
+ $this->_trace = false;
+ $this->_container->processUpdate();
+ }
+ }
+
+
+ /**
+ * To string conversion
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->_value;
+ }
+
+
+ /**
+ * Get string value reference
+ *
+ * _Must_ be used for value access before PHP v 5.2
+ * or _may_ be used for performance considerations
+ *
+ * @internal
+ * @return string
+ */
+ public function &getRef()
+ {
+ return $this->_value;
+ }
+
+ /**
+ * Start modifications trace
+ *
+ * _Must_ be used for value access before PHP v 5.2
+ * or _may_ be used for performance considerations
+ *
+ * @internal
+ */
+ public function startTrace()
+ {
+ $this->_trace = true;
+ }
+}
diff --git a/libs/Zend/Mime.php b/libs/Zend/Mime.php
new file mode 100755
index 0000000000..e6640ad4fe
--- /dev/null
+++ b/libs/Zend/Mime.php
@@ -0,0 +1,251 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mime
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Support class for MultiPart Mime Messages
+ *
+ * @category Zend
+ * @package Zend_Mime
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mime
+{
+ const TYPE_OCTETSTREAM = 'application/octet-stream';
+ const TYPE_TEXT = 'text/plain';
+ const TYPE_HTML = 'text/html';
+ const ENCODING_7BIT = '7bit';
+ const ENCODING_8BIT = '8bit';
+ const ENCODING_QUOTEDPRINTABLE = 'quoted-printable';
+ const ENCODING_BASE64 = 'base64';
+ const DISPOSITION_ATTACHMENT = 'attachment';
+ const DISPOSITION_INLINE = 'inline';
+ const LINELENGTH = 74;
+ const LINEEND = "\n";
+ const MULTIPART_ALTERNATIVE = 'multipart/alternative';
+ const MULTIPART_MIXED = 'multipart/mixed';
+ const MULTIPART_RELATED = 'multipart/related';
+
+ protected $_boundary;
+ protected static $makeUnique = 0;
+
+ // lookup-Tables for QuotedPrintable
+ public static $qpKeys = array(
+ "\x00","\x01","\x02","\x03","\x04","\x05","\x06","\x07",
+ "\x08","\x09","\x0A","\x0B","\x0C","\x0D","\x0E","\x0F",
+ "\x10","\x11","\x12","\x13","\x14","\x15","\x16","\x17",
+ "\x18","\x19","\x1A","\x1B","\x1C","\x1D","\x1E","\x1F",
+ "\x7F","\x80","\x81","\x82","\x83","\x84","\x85","\x86",
+ "\x87","\x88","\x89","\x8A","\x8B","\x8C","\x8D","\x8E",
+ "\x8F","\x90","\x91","\x92","\x93","\x94","\x95","\x96",
+ "\x97","\x98","\x99","\x9A","\x9B","\x9C","\x9D","\x9E",
+ "\x9F","\xA0","\xA1","\xA2","\xA3","\xA4","\xA5","\xA6",
+ "\xA7","\xA8","\xA9","\xAA","\xAB","\xAC","\xAD","\xAE",
+ "\xAF","\xB0","\xB1","\xB2","\xB3","\xB4","\xB5","\xB6",
+ "\xB7","\xB8","\xB9","\xBA","\xBB","\xBC","\xBD","\xBE",
+ "\xBF","\xC0","\xC1","\xC2","\xC3","\xC4","\xC5","\xC6",
+ "\xC7","\xC8","\xC9","\xCA","\xCB","\xCC","\xCD","\xCE",
+ "\xCF","\xD0","\xD1","\xD2","\xD3","\xD4","\xD5","\xD6",
+ "\xD7","\xD8","\xD9","\xDA","\xDB","\xDC","\xDD","\xDE",
+ "\xDF","\xE0","\xE1","\xE2","\xE3","\xE4","\xE5","\xE6",
+ "\xE7","\xE8","\xE9","\xEA","\xEB","\xEC","\xED","\xEE",
+ "\xEF","\xF0","\xF1","\xF2","\xF3","\xF4","\xF5","\xF6",
+ "\xF7","\xF8","\xF9","\xFA","\xFB","\xFC","\xFD","\xFE",
+ "\xFF"
+ );
+
+ public static $qpReplaceValues = array(
+ "=00","=01","=02","=03","=04","=05","=06","=07",
+ "=08","=09","=0A","=0B","=0C","=0D","=0E","=0F",
+ "=10","=11","=12","=13","=14","=15","=16","=17",
+ "=18","=19","=1A","=1B","=1C","=1D","=1E","=1F",
+ "=7F","=80","=81","=82","=83","=84","=85","=86",
+ "=87","=88","=89","=8A","=8B","=8C","=8D","=8E",
+ "=8F","=90","=91","=92","=93","=94","=95","=96",
+ "=97","=98","=99","=9A","=9B","=9C","=9D","=9E",
+ "=9F","=A0","=A1","=A2","=A3","=A4","=A5","=A6",
+ "=A7","=A8","=A9","=AA","=AB","=AC","=AD","=AE",
+ "=AF","=B0","=B1","=B2","=B3","=B4","=B5","=B6",
+ "=B7","=B8","=B9","=BA","=BB","=BC","=BD","=BE",
+ "=BF","=C0","=C1","=C2","=C3","=C4","=C5","=C6",
+ "=C7","=C8","=C9","=CA","=CB","=CC","=CD","=CE",
+ "=CF","=D0","=D1","=D2","=D3","=D4","=D5","=D6",
+ "=D7","=D8","=D9","=DA","=DB","=DC","=DD","=DE",
+ "=DF","=E0","=E1","=E2","=E3","=E4","=E5","=E6",
+ "=E7","=E8","=E9","=EA","=EB","=EC","=ED","=EE",
+ "=EF","=F0","=F1","=F2","=F3","=F4","=F5","=F6",
+ "=F7","=F8","=F9","=FA","=FB","=FC","=FD","=FE",
+ "=FF"
+ );
+
+ public static $qpKeysString =
+ "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF";
+
+ /**
+ * Check if the given string is "printable"
+ *
+ * Checks that a string contains no unprintable characters. If this returns
+ * false, encode the string for secure delivery.
+ *
+ * @param string $str
+ * @return boolean
+ */
+ public static function isPrintable($str)
+ {
+ return (strcspn($str, self::$qpKeysString) == strlen($str));
+ }
+
+ /**
+ * Encode a given string with the QUOTED_PRINTABLE mechanism
+ *
+ * @param string $str
+ * @param int $lineLength Defaults to {@link LINELENGTH}
+ * @param int $lineEnd Defaults to {@link LINEEND}
+ * @return string
+ */
+ public static function encodeQuotedPrintable($str,
+ $lineLength = self::LINELENGTH,
+ $lineEnd = self::LINEEND)
+ {
+ $out = '';
+ $str = str_replace('=', '=3D', $str);
+ $str = str_replace(self::$qpKeys, self::$qpReplaceValues, $str);
+ $str = rtrim($str);
+
+ // Split encoded text into separate lines
+ while ($str) {
+ $ptr = strlen($str);
+ if ($ptr > $lineLength) {
+ $ptr = $lineLength;
+ }
+
+ // Ensure we are not splitting across an encoded character
+ $pos = strrpos(substr($str, 0, $ptr), '=');
+ if ($pos !== false && $pos >= $ptr - 2) {
+ $ptr = $pos;
+ }
+
+ // Check if there is a space at the end of the line and rewind
+ if ($ptr > 0 && $str[$ptr - 1] == ' ') {
+ --$ptr;
+ }
+
+ // Add string and continue
+ $out .= substr($str, 0, $ptr) . '=' . $lineEnd;
+ $str = substr($str, $ptr);
+ }
+
+ $out = rtrim($out, $lineEnd);
+ $out = rtrim($out, '=');
+ return $out;
+ }
+
+ /**
+ * Encode a given string in base64 encoding and break lines
+ * according to the maximum linelength.
+ *
+ * @param string $str
+ * @param int $lineLength Defaults to {@link LINELENGTH}
+ * @param int $lineEnd Defaults to {@link LINEEND}
+ * @return string
+ */
+ public static function encodeBase64($str,
+ $lineLength = self::LINELENGTH,
+ $lineEnd = self::LINEEND)
+ {
+ return rtrim(chunk_split(base64_encode($str), $lineLength, $lineEnd));
+ }
+
+ /**
+ * Constructor
+ *
+ * @param null|string $boundary
+ * @access public
+ * @return void
+ */
+ public function __construct($boundary = null)
+ {
+ // This string needs to be somewhat unique
+ if ($boundary === null) {
+ $this->_boundary = '=_' . md5(microtime(1) . self::$makeUnique++);
+ } else {
+ $this->_boundary = $boundary;
+ }
+ }
+
+ /**
+ * Encode the given string with the given encoding.
+ *
+ * @param string $str
+ * @param string $encoding
+ * @return string
+ */
+ public static function encode($str, $encoding)
+ {
+ switch ($encoding) {
+ case self::ENCODING_BASE64:
+ return self::encodeBase64($str);
+
+ case self::ENCODING_QUOTEDPRINTABLE:
+ return self::encodeQuotedPrintable($str);
+
+ default:
+ /**
+ * @todo 7Bit and 8Bit is currently handled the same way.
+ */
+ return $str;
+ }
+ }
+
+ /**
+ * Return a MIME boundary
+ *
+ * @access public
+ * @return string
+ */
+ public function boundary()
+ {
+ return $this->_boundary;
+ }
+
+ /**
+ * Return a MIME boundary line
+ *
+ * @param mixed $EOL Defaults to {@link LINEEND}
+ * @access public
+ * @return string
+ */
+ public function boundaryLine($EOL = self::LINEEND)
+ {
+ return $EOL . '--' . $this->_boundary . $EOL;
+ }
+
+ /**
+ * Return MIME ending
+ *
+ * @access public
+ * @return string
+ */
+ public function mimeEnd($EOL = self::LINEEND)
+ {
+ return $EOL . '--' . $this->_boundary . '--' . $EOL;
+ }
+}
diff --git a/libs/Zend/Mime/Decode.php b/libs/Zend/Mime/Decode.php
new file mode 100755
index 0000000000..3198ce27a2
--- /dev/null
+++ b/libs/Zend/Mime/Decode.php
@@ -0,0 +1,228 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mime
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Mime
+ */
+require_once 'Zend/Mime.php';
+
+/**
+ * @category Zend
+ * @package Zend_Mime
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mime_Decode
+{
+ /**
+ * Explode MIME multipart string into seperate parts
+ *
+ * Parts consist of the header and the body of each MIME part.
+ *
+ * @param string $body raw body of message
+ * @param string $boundary boundary as found in content-type
+ * @return array parts with content of each part, empty if no parts found
+ * @throws Zend_Exception
+ */
+ public static function splitMime($body, $boundary)
+ {
+ // TODO: we're ignoring \r for now - is this function fast enough and is it safe to asume noone needs \r?
+ $body = str_replace("\r", '', $body);
+
+ $start = 0;
+ $res = array();
+ // find every mime part limiter and cut out the
+ // string before it.
+ // the part before the first boundary string is discarded:
+ $p = strpos($body, '--' . $boundary . "\n", $start);
+ if ($p === false) {
+ // no parts found!
+ return array();
+ }
+
+ // position after first boundary line
+ $start = $p + 3 + strlen($boundary);
+
+ while (($p = strpos($body, '--' . $boundary . "\n", $start)) !== false) {
+ $res[] = substr($body, $start, $p-$start);
+ $start = $p + 3 + strlen($boundary);
+ }
+
+ // no more parts, find end boundary
+ $p = strpos($body, '--' . $boundary . '--', $start);
+ if ($p===false) {
+ throw new Zend_Exception('Not a valid Mime Message: End Missing');
+ }
+
+ // the remaining part also needs to be parsed:
+ $res[] = substr($body, $start, $p-$start);
+ return $res;
+ }
+
+ /**
+ * decodes a mime encoded String and returns a
+ * struct of parts with header and body
+ *
+ * @param string $message raw message content
+ * @param string $boundary boundary as found in content-type
+ * @param string $EOL EOL string; defaults to {@link Zend_Mime::LINEEND}
+ * @return array|null parts as array('header' => array(name => value), 'body' => content), null if no parts found
+ * @throws Zend_Exception
+ */
+ public static function splitMessageStruct($message, $boundary, $EOL = Zend_Mime::LINEEND)
+ {
+ $parts = self::splitMime($message, $boundary);
+ if (count($parts) <= 0) {
+ return null;
+ }
+ $result = array();
+ foreach ($parts as $part) {
+ self::splitMessage($part, $headers, $body, $EOL);
+ $result[] = array('header' => $headers,
+ 'body' => $body );
+ }
+ return $result;
+ }
+
+ /**
+ * split a message in header and body part, if no header or an
+ * invalid header is found $headers is empty
+ *
+ * The charset of the returned headers depend on your iconv settings.
+ *
+ * @param string $message raw message with header and optional content
+ * @param array $headers output param, array with headers as array(name => value)
+ * @param string $body output param, content of message
+ * @param string $EOL EOL string; defaults to {@link Zend_Mime::LINEEND}
+ * @return null
+ */
+ public static function splitMessage($message, &$headers, &$body, $EOL = Zend_Mime::LINEEND)
+ {
+ // check for valid header at first line
+ $firstline = strtok($message, "\n");
+ if (!preg_match('%^[^\s]+[^:]*:%', $firstline)) {
+ $headers = array();
+ // TODO: we're ignoring \r for now - is this function fast enough and is it safe to asume noone needs \r?
+ $body = str_replace(array("\r", "\n"), array('', $EOL), $message);
+ return;
+ }
+
+ // find an empty line between headers and body
+ // default is set new line
+ if (strpos($message, $EOL . $EOL)) {
+ list($headers, $body) = explode($EOL . $EOL, $message, 2);
+ // next is the standard new line
+ } else if ($EOL != "\r\n" && strpos($message, "\r\n\r\n")) {
+ list($headers, $body) = explode("\r\n\r\n", $message, 2);
+ // next is the other "standard" new line
+ } else if ($EOL != "\n" && strpos($message, "\n\n")) {
+ list($headers, $body) = explode("\n\n", $message, 2);
+ // at last resort find anything that looks like a new line
+ } else {
+ @list($headers, $body) = @preg_split("%([\r\n]+)\\1%U", $message, 2);
+ }
+
+ $headers = iconv_mime_decode_headers($headers, ICONV_MIME_DECODE_CONTINUE_ON_ERROR);
+
+ // normalize header names
+ foreach ($headers as $name => $header) {
+ $lower = strtolower($name);
+ if ($lower == $name) {
+ continue;
+ }
+ unset($headers[$name]);
+ if (!isset($headers[$lower])) {
+ $headers[$lower] = $header;
+ continue;
+ }
+ if (is_array($headers[$lower])) {
+ $headers[$lower][] = $header;
+ continue;
+ }
+ $headers[$lower] = array($headers[$lower], $header);
+ }
+ }
+
+ /**
+ * split a content type in its different parts
+ *
+ * @param string $type content-type
+ * @param string $wantedPart the wanted part, else an array with all parts is returned
+ * @return string|array wanted part or all parts as array('type' => content-type, partname => value)
+ */
+ public static function splitContentType($type, $wantedPart = null)
+ {
+ return self::splitHeaderField($type, $wantedPart, 'type');
+ }
+
+ /**
+ * split a header field like content type in its different parts
+ *
+ * @param string $type header field
+ * @param string $wantedPart the wanted part, else an array with all parts is returned
+ * @param string $firstName key name for the first part
+ * @return string|array wanted part or all parts as array($firstName => firstPart, partname => value)
+ * @throws Zend_Exception
+ */
+ public static function splitHeaderField($field, $wantedPart = null, $firstName = 0)
+ {
+ $field = $firstName . '=' . $field;
+ if (!preg_match_all('%([^=]+)=("[^"]+"|[^;]+)(;\s*|$)%', $field, $matches)) {
+ throw new Zend_Exception('not a valid header field');
+ }
+
+ if ($wantedPart) {
+ foreach ($matches[1] as $key => $name) {
+ if ($name != $wantedPart) {
+ continue;
+ }
+ if ($matches[2][$key][0] != '"') {
+ return $matches[2][$key];
+ }
+ return substr($matches[2][$key], 1, -1);
+ }
+ return null;
+ }
+
+ $split = array();
+ foreach ($matches[1] as $key => $name) {
+ if ($matches[2][$key][0] == '"') {
+ $split[$name] = substr($matches[2][$key], 1, -1);
+ } else {
+ $split[$name] = $matches[2][$key];
+ }
+ }
+
+ return $split;
+ }
+
+ /**
+ * decode a quoted printable encoded string
+ *
+ * The charset of the returned string depends on your iconv settings.
+ *
+ * @param string encoded string
+ * @return string decoded string
+ */
+ public static function decodeQuotedPrintable($string)
+ {
+ return iconv_mime_decode($string, ICONV_MIME_DECODE_CONTINUE_ON_ERROR);
+ }
+}
diff --git a/libs/Zend/Mime/Exception.php b/libs/Zend/Mime/Exception.php
new file mode 100755
index 0000000000..b2bce88f84
--- /dev/null
+++ b/libs/Zend/Mime/Exception.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mime
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Mime
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mime_Exception extends Zend_Exception
+{}
+
diff --git a/libs/Zend/Mime/Message.php b/libs/Zend/Mime/Message.php
new file mode 100755
index 0000000000..72f1a42de5
--- /dev/null
+++ b/libs/Zend/Mime/Message.php
@@ -0,0 +1,280 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mime
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Mime
+ */
+require_once 'Zend/Mime.php';
+
+/**
+ * Zend_Mime_Part
+ */
+require_once 'Zend/Mime/Part.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Mime
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mime_Message
+{
+
+ protected $_parts = array();
+ protected $_mime = null;
+
+ /**
+ * Returns the list of all Zend_Mime_Parts in the message
+ *
+ * @return array of Zend_Mime_Part
+ */
+ public function getParts()
+ {
+ return $this->_parts;
+ }
+
+ /**
+ * Sets the given array of Zend_Mime_Parts as the array for the message
+ *
+ * @param array $parts
+ */
+ public function setParts($parts)
+ {
+ $this->_parts = $parts;
+ }
+
+ /**
+ * Append a new Zend_Mime_Part to the current message
+ *
+ * @param Zend_Mime_Part $part
+ */
+ public function addPart(Zend_Mime_Part $part)
+ {
+ /**
+ * @todo check for duplicate object handle
+ */
+ $this->_parts[] = $part;
+ }
+
+ /**
+ * Check if message needs to be sent as multipart
+ * MIME message or if it has only one part.
+ *
+ * @return boolean
+ */
+ public function isMultiPart()
+ {
+ return (count($this->_parts) > 1);
+ }
+
+ /**
+ * Set Zend_Mime object for the message
+ *
+ * This can be used to set the boundary specifically or to use a subclass of
+ * Zend_Mime for generating the boundary.
+ *
+ * @param Zend_Mime $mime
+ */
+ public function setMime(Zend_Mime $mime)
+ {
+ $this->_mime = $mime;
+ }
+
+ /**
+ * Returns the Zend_Mime object in use by the message
+ *
+ * If the object was not present, it is created and returned. Can be used to
+ * determine the boundary used in this message.
+ *
+ * @return Zend_Mime
+ */
+ public function getMime()
+ {
+ if ($this->_mime === null) {
+ $this->_mime = new Zend_Mime();
+ }
+
+ return $this->_mime;
+ }
+
+ /**
+ * Generate MIME-compliant message from the current configuration
+ *
+ * This can be a multipart message if more than one MIME part was added. If
+ * only one part is present, the content of this part is returned. If no
+ * part had been added, an empty string is returned.
+ *
+ * Parts are seperated by the mime boundary as defined in Zend_Mime. If
+ * {@link setMime()} has been called before this method, the Zend_Mime
+ * object set by this call will be used. Otherwise, a new Zend_Mime object
+ * is generated and used.
+ *
+ * @param string $EOL EOL string; defaults to {@link Zend_Mime::LINEEND}
+ * @return string
+ */
+ public function generateMessage($EOL = Zend_Mime::LINEEND)
+ {
+ if (! $this->isMultiPart()) {
+ $body = array_shift($this->_parts);
+ $body = $body->getContent($EOL);
+ } else {
+ $mime = $this->getMime();
+
+ $boundaryLine = $mime->boundaryLine($EOL);
+ $body = 'This is a message in Mime Format. If you see this, '
+ . "your mail reader does not support this format." . $EOL;
+
+ foreach (array_keys($this->_parts) as $p) {
+ $body .= $boundaryLine
+ . $this->getPartHeaders($p, $EOL)
+ . $EOL
+ . $this->getPartContent($p);
+ }
+
+ $body .= $mime->mimeEnd($EOL);
+ }
+
+ return trim($body);
+ }
+
+ /**
+ * Get the headers of a given part as an array
+ *
+ * @param int $partnum
+ * @return array
+ */
+ public function getPartHeadersArray($partnum)
+ {
+ return $this->_parts[$partnum]->getHeadersArray();
+ }
+
+ /**
+ * Get the headers of a given part as a string
+ *
+ * @param int $partnum
+ * @return string
+ */
+ public function getPartHeaders($partnum, $EOL = Zend_Mime::LINEEND)
+ {
+ return $this->_parts[$partnum]->getHeaders($EOL);
+ }
+
+ /**
+ * Get the (encoded) content of a given part as a string
+ *
+ * @param int $partnum
+ * @return string
+ */
+ public function getPartContent($partnum)
+ {
+ return $this->_parts[$partnum]->getContent();
+ }
+
+ /**
+ * Explode MIME multipart string into seperate parts
+ *
+ * Parts consist of the header and the body of each MIME part.
+ *
+ * @param string $body
+ * @param string $boundary
+ * @return array
+ */
+ protected static function _disassembleMime($body, $boundary)
+ {
+ $start = 0;
+ $res = array();
+ // find every mime part limiter and cut out the
+ // string before it.
+ // the part before the first boundary string is discarded:
+ $p = strpos($body, '--'.$boundary."\n", $start);
+ if ($p === false) {
+ // no parts found!
+ return array();
+ }
+
+ // position after first boundary line
+ $start = $p + 3 + strlen($boundary);
+
+ while (($p = strpos($body, '--' . $boundary . "\n", $start)) !== false) {
+ $res[] = substr($body, $start, $p-$start);
+ $start = $p + 3 + strlen($boundary);
+ }
+
+ // no more parts, find end boundary
+ $p = strpos($body, '--' . $boundary . '--', $start);
+ if ($p===false) {
+ throw new Zend_Exception('Not a valid Mime Message: End Missing');
+ }
+
+ // the remaining part also needs to be parsed:
+ $res[] = substr($body, $start, $p-$start);
+ return $res;
+ }
+
+ /**
+ * Decodes a MIME encoded string and returns a Zend_Mime_Message object with
+ * all the MIME parts set according to the given string
+ *
+ * @param string $message
+ * @param string $boundary
+ * @param string $EOL EOL string; defaults to {@link Zend_Mime::LINEEND}
+ * @return Zend_Mime_Message
+ */
+ public static function createFromMessage($message, $boundary, $EOL = Zend_Mime::LINEEND)
+ {
+ require_once 'Zend/Mime/Decode.php';
+ $parts = Zend_Mime_Decode::splitMessageStruct($message, $boundary, $EOL);
+
+ $res = new Zend_Mime_Message();
+ foreach ($parts as $part) {
+ // now we build a new MimePart for the current Message Part:
+ $newPart = new Zend_Mime_Part($part);
+ foreach ($part['header'] as $key => $value) {
+ /**
+ * @todo check for characterset and filename
+ */
+ // list($key, $value) = $header;
+ switch($key) {
+ case 'content-type':
+ $newPart->type = $value;
+ break;
+ case 'content-transfer-encoding':
+ $newPart->encoding = $value;
+ break;
+ case 'content-id':
+ $newPart->id = trim($value,'<>');
+ break;
+ case 'Content-Disposition':
+ $newPart->disposition = $value;
+ break;
+ case 'content-description':
+ $newPart->description = $value;
+ break;
+ default:
+ throw new Zend_Exception('Unknown header ignored for MimePart:' . $key);
+ }
+ }
+ $res->addPart($newPart);
+ }
+ return $res;
+ }
+}
diff --git a/libs/Zend/Mime/Part.php b/libs/Zend/Mime/Part.php
new file mode 100755
index 0000000000..fc3a2bff48
--- /dev/null
+++ b/libs/Zend/Mime/Part.php
@@ -0,0 +1,208 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Mime
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Mime
+ */
+require_once 'Zend/Mime.php';
+
+/**
+ * Zend_Mime_Exception
+ */
+require_once 'Zend/Mime/Exception.php';
+
+/**
+ * Class representing a MIME part.
+ *
+ * @category Zend
+ * @package Zend_Mime
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Mime_Part {
+
+ public $type = Zend_Mime::TYPE_OCTETSTREAM;
+ public $encoding = Zend_Mime::ENCODING_8BIT;
+ public $id;
+ public $disposition;
+ public $filename;
+ public $description;
+ public $charset;
+ public $boundary;
+ protected $_content;
+ protected $_isStream = false;
+
+
+ /**
+ * create a new Mime Part.
+ * The (unencoded) content of the Part as passed
+ * as a string or stream
+ *
+ * @param mixed $content String or Stream containing the content
+ */
+ public function __construct($content)
+ {
+ $this->_content = $content;
+ if (is_resource($content)) {
+ $this->_isStream = true;
+ }
+ }
+
+ /**
+ * @todo setters/getters
+ * @todo error checking for setting $type
+ * @todo error checking for setting $encoding
+ */
+
+ /**
+ * check if this part can be read as a stream.
+ * if true, getEncodedStream can be called, otherwise
+ * only getContent can be used to fetch the encoded
+ * content of the part
+ *
+ * @return bool
+ */
+ public function isStream()
+ {
+ return $this->_isStream;
+ }
+
+ /**
+ * if this was created with a stream, return a filtered stream for
+ * reading the content. very useful for large file attachments.
+ *
+ * @return stream
+ * @throws Zend_Mime_Exception if not a stream or unable to append filter
+ */
+ public function getEncodedStream()
+ {
+ if (!$this->_isStream) {
+ throw new Zend_Mime_Exception('Attempt to get a stream from a string part');
+ }
+
+ //stream_filter_remove(); // ??? is that right?
+ switch ($this->encoding) {
+ case Zend_Mime::ENCODING_QUOTEDPRINTABLE:
+ $filter = stream_filter_append(
+ $this->_content,
+ 'convert.quoted-printable-encode',
+ STREAM_FILTER_READ,
+ array(
+ 'line-length' => 76,
+ 'line-break-chars' => Zend_Mime::LINEEND
+ )
+ );
+ if (!is_resource($filter)) {
+ throw new Zend_Mime_Exception('Failed to append quoted-printable filter');
+ }
+ break;
+ case Zend_Mime::ENCODING_BASE64:
+ $filter = stream_filter_append(
+ $this->_content,
+ 'convert.base64-encode',
+ STREAM_FILTER_READ,
+ array(
+ 'line-length' => 76,
+ 'line-break-chars' => Zend_Mime::LINEEND
+ )
+ );
+ if (!is_resource($filter)) {
+ throw new Zend_Mime_Exception('Failed to append base64 filter');
+ }
+ break;
+ default:
+ }
+ return $this->_content;
+ }
+
+ /**
+ * Get the Content of the current Mime Part in the given encoding.
+ *
+ * @return String
+ */
+ public function getContent($EOL = Zend_Mime::LINEEND)
+ {
+ if ($this->_isStream) {
+ return stream_get_contents($this->getEncodedStream());
+ } else {
+ return Zend_Mime::encode($this->_content, $this->encoding, $EOL);
+ }
+ }
+
+ /**
+ * Create and return the array of headers for this MIME part
+ *
+ * @access public
+ * @return array
+ */
+ public function getHeadersArray($EOL = Zend_Mime::LINEEND)
+ {
+ $headers = array();
+
+ $contentType = $this->type;
+ if ($this->charset) {
+ $contentType .= '; charset="' . $this->charset . '"';
+ }
+
+ if ($this->boundary) {
+ $contentType .= ';' . $EOL
+ . " boundary=\"" . $this->boundary . '"';
+ }
+
+ $headers[] = array('Content-Type', $contentType);
+
+ if ($this->encoding) {
+ $headers[] = array('Content-Transfer-Encoding', $this->encoding);
+ }
+
+ if ($this->id) {
+ $headers[] = array('Content-ID', '<' . $this->id . '>');
+ }
+
+ if ($this->disposition) {
+ $disposition = $this->disposition;
+ if ($this->filename) {
+ $disposition .= '; filename="' . $this->filename . '"';
+ }
+ $headers[] = array('Content-Disposition', $disposition);
+ }
+
+ if ($this->description) {
+ $headers[] = array('Content-Description', $this->description);
+ }
+
+ return $headers;
+ }
+
+ /**
+ * Return the headers for this part as a string
+ *
+ * @return String
+ */
+ public function getHeaders($EOL = Zend_Mime::LINEEND)
+ {
+ $res = '';
+ foreach ($this->getHeadersArray($EOL) as $header) {
+ $res .= $header[0] . ': ' . $header[1] . $EOL;
+ }
+
+ return $res;
+ }
+}
diff --git a/libs/Zend/Pdf.php b/libs/Zend/Pdf.php
new file mode 100755
index 0000000000..8e54a62396
--- /dev/null
+++ b/libs/Zend/Pdf.php
@@ -0,0 +1,685 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Pdf
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Pdf_Exception */
+require_once 'Zend/Pdf/Exception.php';
+
+/** Zend_Pdf_Page */
+require_once 'Zend/Pdf/Page.php';
+
+/** Zend_Pdf_Cmap */
+require_once 'Zend/Pdf/Cmap.php';
+
+/** Zend_Pdf_Font */
+require_once 'Zend/Pdf/Font.php';
+
+/** Zend_Pdf_Style */
+require_once 'Zend/Pdf/Style.php';
+
+/** Zend_Pdf_Parser */
+require_once 'Zend/Pdf/Parser.php';
+
+/** Zend_Pdf_Trailer */
+require_once 'Zend/Pdf/Trailer.php';
+
+/** Zend_Pdf_Trailer_Generator */
+require_once 'Zend/Pdf/Trailer/Generator.php';
+
+/** Zend_Pdf_Color */
+require_once 'Zend/Pdf/Color.php';
+
+/** Zend_Pdf_Color_GrayScale */
+require_once 'Zend/Pdf/Color/GrayScale.php';
+
+/** Zend_Pdf_Color_Rgb */
+require_once 'Zend/Pdf/Color/Rgb.php';
+
+/** Zend_Pdf_Color_Cmyk */
+require_once 'Zend/Pdf/Color/Cmyk.php';
+
+/** Zend_Pdf_Color_Html */
+require_once 'Zend/Pdf/Color/Html.php';
+
+/** Zend_Pdf_Image */
+require_once 'Zend/Pdf/Resource/Image.php';
+
+/** Zend_Pdf_Image */
+require_once 'Zend/Pdf/Image.php';
+
+/** Zend_Pdf_Image_Jpeg */
+require_once 'Zend/Pdf/Resource/Image/Jpeg.php';
+
+/** Zend_Pdf_Image_Tiff */
+require_once 'Zend/Pdf/Resource/Image/Tiff.php';
+
+/** Zend_Pdf_Image_Png */
+require_once 'Zend/Pdf/Resource/Image/Png.php';
+
+
+/** Zend_Memory */
+require_once 'Zend/Memory.php';
+
+
+/**
+ * General entity which describes PDF document.
+ * It implements document abstraction with a document level operations.
+ *
+ * Class is used to create new PDF document or load existing document.
+ * See details in a class constructor description
+ *
+ * Class agregates document level properties and entities (pages, bookmarks,
+ * document level actions, attachments, form object, etc)
+ *
+ * @category Zend
+ * @package Zend_Pdf
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Pdf
+{
+ /**** Class Constants ****/
+
+ /**
+ * Version number of generated PDF documents.
+ */
+ const PDF_VERSION = 1.4;
+
+ /**
+ * PDF file header.
+ */
+ const PDF_HEADER = "%PDF-1.4\n%\xE2\xE3\xCF\xD3\n";
+
+
+
+ /**
+ * Pages collection
+ *
+ * @todo implement it as a class, which supports ArrayAccess and Iterator interfaces,
+ * to provide incremental parsing and pages tree updating.
+ * That will give good performance and memory (PDF size) benefits.
+ *
+ * @var array - array of Zend_Pdf_Page object
+ */
+ public $pages = array();
+
+ /**
+ * Document properties
+ *
+ * @var array
+ */
+ private $_properties = array();
+
+ /**
+ * Document level javascript
+ *
+ * @var string
+ */
+ private $_javaScript = null;
+
+ /**
+ * Document named actions
+ * "GoTo..." actions, used to refer document parts
+ * from outside PDF
+ *
+ * @var array - array of Zend_Pdf_Action objects
+ */
+ private $_namedActions = array();
+
+
+ /**
+ * Pdf trailer (last or just created)
+ *
+ * @var Zend_Pdf_Trailer
+ */
+ private $_trailer = null;
+
+
+ /**
+ * PDF objects factory.
+ *
+ * @var Zend_Pdf_ElementFactory_Interface
+ */
+ private $_objFactory = null;
+
+ /**
+ * Memory manager for stream objects
+ *
+ * @var Zend_Memory_Manager|null
+ */
+ private static $_memoryManager = null;
+
+ /**
+ * Pdf file parser.
+ * It's not used, but has to be destroyed only with Zend_Pdf object
+ *
+ * @var Zend_Pdf_Parser
+ */
+ private $_parser;
+
+ /**
+ * Request used memory manager
+ *
+ * @return Zend_Memory_Manager
+ */
+ static public function getMemoryManager()
+ {
+ if (self::$_memoryManager === null) {
+ self::$_memoryManager = Zend_Memory::factory('none');
+ }
+
+ return self::$_memoryManager;
+ }
+
+ /**
+ * Set user defined memory manager
+ *
+ * @param Zend_Memory_Manager $memoryManager
+ */
+ static public function setMemoryManager(Zend_Memory_Manager $memoryManager)
+ {
+ self::$_memoryManager = $memoryManager;
+ }
+
+
+ /**
+ * Create new PDF document from a $source string
+ *
+ * @param string $source
+ * @param integer $revision
+ * @return Zend_Pdf
+ */
+ public static function parse(&$source = null, $revision = null)
+ {
+ return new Zend_Pdf($source, $revision);
+ }
+
+ /**
+ * Load PDF document from a file
+ *
+ * @param string $source
+ * @param integer $revision
+ * @return Zend_Pdf
+ */
+ public static function load($source = null, $revision = null)
+ {
+ return new Zend_Pdf($source, $revision, true);
+ }
+
+ /**
+ * Render PDF document and save it.
+ *
+ * If $updateOnly is true, then it only appends new section to the end of file.
+ *
+ * @param string $filename
+ * @param boolean $updateOnly
+ * @throws Zend_Pdf_Exception
+ */
+ public function save($filename, $updateOnly = false)
+ {
+ if (($file = @fopen($filename, $updateOnly ? 'ab':'wb')) === false ) {
+ throw new Zend_Pdf_Exception( "Can not open '$filename' file for writing." );
+ }
+
+ $this->render($updateOnly, $file);
+
+ fclose($file);
+ }
+
+ /**
+ * Creates or loads PDF document.
+ *
+ * If $source is null, then it creates a new document.
+ *
+ * If $source is a string and $load is false, then it loads document
+ * from a binary string.
+ *
+ * If $source is a string and $load is true, then it loads document
+ * from a file.
+
+ * $revision used to roll back document to specified version
+ * (0 - currtent version, 1 - previous version, 2 - ...)
+ *
+ * @param string $source - PDF file to load
+ * @param integer $revision
+ * @throws Zend_Pdf_Exception
+ * @return Zend_Pdf
+ */
+ public function __construct($source = null, $revision = null, $load = false)
+ {
+ $this->_objFactory = Zend_Pdf_ElementFactory::createFactory(1);
+
+ if ($source !== null) {
+ $this->_parser = new Zend_Pdf_Parser($source, $this->_objFactory, $load);
+ $this->_trailer = $this->_parser->getTrailer();
+ if ($revision !== null) {
+ $this->rollback($revision);
+ } else {
+ $this->_loadPages($this->_trailer->Root->Pages);
+ }
+ } else {
+ $trailerDictionary = new Zend_Pdf_Element_Dictionary();
+
+ /**
+ * Document id
+ */
+ $docId = md5(uniqid(rand(), true)); // 32 byte (128 bit) identifier
+ $docIdLow = substr($docId, 0, 16); // first 16 bytes
+ $docIdHigh = substr($docId, 16, 16); // second 16 bytes
+
+ $trailerDictionary->ID = new Zend_Pdf_Element_Array();
+ $trailerDictionary->ID->items[] = new Zend_Pdf_Element_String_Binary($docIdLow);
+ $trailerDictionary->ID->items[] = new Zend_Pdf_Element_String_Binary($docIdHigh);
+
+ $trailerDictionary->Size = new Zend_Pdf_Element_Numeric(0);
+
+ $this->_trailer = new Zend_Pdf_Trailer_Generator($trailerDictionary);
+
+ /**
+ * Document catalog indirect object.
+ */
+ $docCatalog = $this->_objFactory->newObject(new Zend_Pdf_Element_Dictionary());
+ $docCatalog->Type = new Zend_Pdf_Element_Name('Catalog');
+ $docCatalog->Version = new Zend_Pdf_Element_Name(Zend_Pdf::PDF_VERSION);
+ $this->_trailer->Root = $docCatalog;
+
+ /**
+ * Pages container
+ */
+ $docPages = $this->_objFactory->newObject(new Zend_Pdf_Element_Dictionary());
+ $docPages->Type = new Zend_Pdf_Element_Name('Pages');
+ $docPages->Kids = new Zend_Pdf_Element_Array();
+ $docPages->Count = new Zend_Pdf_Element_Numeric(0);
+ $docCatalog->Pages = $docPages;
+ }
+ }
+
+ /**
+ * Retrive number of revisions.
+ *
+ * @return integer
+ */
+ public function revisions()
+ {
+ $revisions = 1;
+ $currentTrailer = $this->_trailer;
+
+ while ($currentTrailer->getPrev() !== null && $currentTrailer->getPrev()->Root !== null ) {
+ $revisions++;
+ $currentTrailer = $currentTrailer->getPrev();
+ }
+
+ return $revisions++;
+ }
+
+ /**
+ * Rollback document $steps number of revisions.
+ * This method must be invoked before any changes, applied to the document.
+ * Otherwise behavior is undefined.
+ *
+ * @param integer $steps
+ */
+ public function rollback($steps)
+ {
+ for ($count = 0; $count < $steps; $count++) {
+ if ($this->_trailer->getPrev() !== null && $this->_trailer->getPrev()->Root !== null) {
+ $this->_trailer = $this->_trailer->getPrev();
+ } else {
+ break;
+ }
+ }
+ $this->_objFactory->setObjectCount($this->_trailer->Size->value);
+
+ // Mark content as modified to force new trailer generation at render time
+ $this->_trailer->Root->touch();
+
+ $this->pages = array();
+ $this->_loadPages($this->_trailer->Root->Pages);
+ }
+
+
+
+ /**
+ * List of inheritable attributesfor pages tree
+ *
+ * @var array
+ */
+ private static $_inheritableAttributes = array('Resources', 'MediaBox', 'CropBox', 'Rotate');
+
+
+ /**
+ * Load pages recursively
+ *
+ * @param Zend_Pdf_Element_Reference $pages
+ * @param array|null $attributes
+ */
+ private function _loadPages(Zend_Pdf_Element_Reference $pages, $attributes = array())
+ {
+ if ($pages->getType() != Zend_Pdf_Element::TYPE_DICTIONARY) {
+ throw new Zend_Pdf_Exception('Wrong argument');
+ }
+
+ foreach ($pages->getKeys() as $property) {
+ if (in_array($property, self::$_inheritableAttributes)) {
+ $attributes[$property] = $pages->$property;
+ $pages->$property = null;
+ }
+ }
+
+
+ foreach ($pages->Kids->items as $child) {
+ if ($child->Type->value == 'Pages') {
+ $this->_loadPages($child, $attributes);
+ } else if ($child->Type->value == 'Page') {
+ foreach (self::$_inheritableAttributes as $property) {
+ if ($child->$property === null && array_key_exists($property, $attributes)) {
+ /**
+ * Important note.
+ * If any attribute or dependant object is an indirect object, then it's still
+ * shared between pages.
+ */
+ if ($attributes[$property] instanceof Zend_Pdf_Element_Object) {
+ $child->$property = $attributes[$property];
+ } else {
+ $child->$property = $this->_objFactory->newObject($attributes[$property]);
+ }
+ }
+ }
+ $this->pages[] = new Zend_Pdf_Page($child, $this->_objFactory);
+ }
+ }
+ }
+
+
+ /**
+ * Orginize pages to tha pages tree structure.
+ *
+ * @todo atomatically attach page to the document, if it's not done yet.
+ * @todo check, that page is attached to the current document
+ *
+ * @todo Dump pages as a balanced tree instead of a plain set.
+ */
+ private function _dumpPages()
+ {
+ $pagesContainer = $this->_trailer->Root->Pages;
+ $pagesContainer->touch();
+ $pagesContainer->Kids->items->clear();
+
+ foreach ($this->pages as $page ) {
+ $page->render($this->_objFactory);
+
+ $pageDictionary = $page->getPageDictionary();
+ $pageDictionary->touch();
+ $pageDictionary->Parent = $pagesContainer;
+
+ $pagesContainer->Kids->items[] = $pageDictionary;
+ }
+
+ $pagesContainer->Count->touch();
+ $pagesContainer->Count->value = count($this->pages);
+ }
+
+
+ /**
+ * Create page object, attached to the PDF document.
+ * Method signatures:
+ *
+ * 1. Create new page with a specified pagesize.
+ * If $factory is null then it will be created and page must be attached to the document to be
+ * included into output.
+ * ---------------------------------------------------------
+ * new Zend_Pdf_Page(string $pagesize);
+ * ---------------------------------------------------------
+ *
+ * 2. Create new page with a specified pagesize (in default user space units).
+ * If $factory is null then it will be created and page must be attached to the document to be
+ * included into output.
+ * ---------------------------------------------------------
+ * new Zend_Pdf_Page(numeric $width, numeric $height);
+ * ---------------------------------------------------------
+ *
+ * @param mixed $param1
+ * @param mixed $param2
+ * @return Zend_Pdf_Page
+ */
+ public function newPage($param1, $param2 = null)
+ {
+ if ($param2 === null) {
+ return new Zend_Pdf_Page($param1, $this->_objFactory);
+ } else {
+ return new Zend_Pdf_Page($param1, $param2, $this->_objFactory);
+ }
+ }
+
+ /**
+ * Return return the an associative array with PDF meta information, values may
+ * be string, boolean or float.
+ * Returned array could be used directly to access, add, modify or remove
+ * document properties.
+ *
+ * Standard document properties: Title (must be set for PDF/X documents), Author,
+ * Subject, Keywords (comma separated list), Creator (the name of the application,
+ * that created document, if it was converted from other format), Trapped (must be
+ * true, false or null, can not be null for PDF/X documents)
+ *
+ * @todo implementation
+ *
+ * @return array
+ */
+ public function properties()
+ {
+ return $this->_properties;
+ }
+
+
+ /**
+ * Return the document-level JavaScript
+ * or null if there is no JavaScript for this document
+ *
+ * @return string
+ */
+ public function getJavaScript()
+ {
+ return $this->_javaScript;
+ }
+
+
+ /**
+ * Return an associative array containing all the named actions in the PDF.
+ * Named actions (it's always "GoTo" actions) can be used to reference from outside
+ * the PDF, ex: 'http://www.something.com/mydocument.pdf#MyAction'
+ *
+ * @return array
+ */
+ public function getNamedActions()
+ {
+ return $this->_namedActions;
+ }
+
+
+ /**
+ * Render the completed PDF to a string.
+ * If $newSegmentOnly is true, then only appended part of PDF is returned.
+ *
+ * @param boolean $newSegmentOnly
+ * @param resource $outputStream
+ * @return string
+ */
+ public function render($newSegmentOnly = false, $outputStream = null)
+ {
+ $this->_dumpPages();
+
+ // Check, that PDF file was modified
+ // File is always modified by _dumpPages() now, but future implementations may eliminate this.
+ if (!$this->_objFactory->isModified()) {
+ if ($newSegmentOnly) {
+ // Do nothing, return
+ return '';
+ }
+
+ if ($outputStream === null) {
+ return $this->_trailer->getPDFString();
+ } else {
+ $pdfData = $this->_trailer->getPDFString();
+ while ( strlen($pdfData) > 0 && ($byteCount = fwrite($outputStream, $pdfData)) != false ) {
+ $pdfData = substr($pdfData, $byteCount);
+ }
+
+ return '';
+ }
+ }
+
+ // offset (from a start of PDF file) of new PDF file segment
+ $offset = $this->_trailer->getPDFLength();
+ // Last Object number in a list of free objects
+ $lastFreeObject = $this->_trailer->getLastFreeObject();
+
+ // Array of cross-reference table subsections
+ $xrefTable = array();
+ // Object numbers of first objects in each subsection
+ $xrefSectionStartNums = array();
+
+ // Last cross-reference table subsection
+ $xrefSection = array();
+ // Dummy initialization of the first element (specail case - header of linked list of free objects).
+ $xrefSection[] = 0;
+ $xrefSectionStartNums[] = 0;
+ // Object number of last processed PDF object.
+ // Used to manage cross-reference subsections.
+ // Initialized by zero (specail case - header of linked list of free objects).
+ $lastObjNum = 0;
+
+ if ($outputStream !== null) {
+ if (!$newSegmentOnly) {
+ $pdfData = $this->_trailer->getPDFString();
+ while ( strlen($pdfData) > 0 && ($byteCount = fwrite($outputStream, $pdfData)) != false ) {
+ $pdfData = substr($pdfData, $byteCount);
+ }
+ }
+ } else {
+ $pdfSegmentBlocks = ($newSegmentOnly) ? array() : array($this->_trailer->getPDFString());
+ }
+
+ // Iterate objects to create new reference table
+ foreach ($this->_objFactory->listModifiedObjects() as $updateInfo) {
+ $objNum = $updateInfo->getObjNum();
+
+ if ($objNum - $lastObjNum != 1) {
+ // Save cross-reference table subsection and start new one
+ $xrefTable[] = $xrefSection;
+ $xrefSection = array();
+ $xrefSectionStartNums[] = $objNum;
+ }
+
+ if ($updateInfo->isFree()) {
+ // Free object cross-reference table entry
+ $xrefSection[] = sprintf("%010d %05d f \n", $lastFreeObject, $updateInfo->getGenNum());
+ $lastFreeObject = $objNum;
+ } else {
+ // In-use object cross-reference table entry
+ $xrefSection[] = sprintf("%010d %05d n \n", $offset, $updateInfo->getGenNum());
+
+ $pdfBlock = $updateInfo->getObjectDump();
+ $offset += strlen($pdfBlock);
+
+ if ($outputStream === null) {
+ $pdfSegmentBlocks[] = $pdfBlock;
+ } else {
+ while ( strlen($pdfBlock) > 0 && ($byteCount = fwrite($outputStream, $pdfBlock)) != false ) {
+ $pdfBlock = substr($pdfBlock, $byteCount);
+ }
+ }
+ }
+ $lastObjNum = $objNum;
+ }
+ // Save last cross-reference table subsection
+ $xrefTable[] = $xrefSection;
+
+ // Modify first entry (specail case - header of linked list of free objects).
+ $xrefTable[0][0] = sprintf("%010d 65535 f \n", $lastFreeObject);
+
+ $xrefTableStr = "xref\n";
+ foreach ($xrefTable as $sectId => $xrefSection) {
+ $xrefTableStr .= sprintf("%d %d \n", $xrefSectionStartNums[$sectId], count($xrefSection));
+ foreach ($xrefSection as $xrefTableEntry) {
+ $xrefTableStr .= $xrefTableEntry;
+ }
+ }
+
+ $this->_trailer->Size->value = $this->_objFactory->getObjectCount();
+
+ $pdfBlock = $xrefTableStr
+ . $this->_trailer->toString()
+ . "startxref\n" . $offset . "\n"
+ . "%%EOF\n";
+
+ if ($outputStream === null) {
+ $pdfSegmentBlocks[] = $pdfBlock;
+
+ return implode('', $pdfSegmentBlocks);
+ } else {
+ while ( strlen($pdfBlock) > 0 && ($byteCount = fwrite($outputStream, $pdfBlock)) != false ) {
+ $pdfBlock = substr($pdfBlock, $byteCount);
+ }
+
+ return '';
+ }
+ }
+
+
+ /**
+ * Set the document-level JavaScript
+ *
+ * @param string $javascript
+ */
+ public function setJavaScript($javascript)
+ {
+ $this->_javaScript = $javascript;
+ }
+
+
+ /**
+ * Convert date to PDF format (it's close to ASN.1 (Abstract Syntax Notation
+ * One) defined in ISO/IEC 8824).
+ *
+ * @todo This really isn't the best location for this method. It should
+ * probably actually exist as Zend_Pdf_Element_Date or something like that.
+ *
+ * @todo Address the following E_STRICT issue:
+ * PHP Strict Standards: date(): It is not safe to rely on the system's
+ * timezone settings. Please use the date.timezone setting, the TZ
+ * environment variable or the date_default_timezone_set() function. In
+ * case you used any of those methods and you are still getting this
+ * warning, you most likely misspelled the timezone identifier.
+ *
+ * @param integer $timestamp (optional) If omitted, uses the current time.
+ * @return string
+ */
+ public static function pdfDate($timestamp = null)
+ {
+ if (is_null($timestamp)) {
+ $date = date('\D\:YmdHisO');
+ } else {
+ $date = date('\D\:YmdHisO', $timestamp);
+ }
+ return substr_replace($date, '\'', -2, 0) . '\'';
+ }
+
+}
diff --git a/libs/Zend/Registry.php b/libs/Zend/Registry.php
new file mode 100755
index 0000000000..79eb1148af
--- /dev/null
+++ b/libs/Zend/Registry.php
@@ -0,0 +1,196 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Registry
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Registry.php 5491 2007-06-29 00:41:56Z bkarwin $
+ */
+
+/**
+ * Generic storage class helps to manage global data.
+ *
+ * @category Zend
+ * @package Zend_Registry
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Registry extends ArrayObject
+{
+ /**
+ * Class name of the singleton registry object.
+ * @var string
+ */
+ private static $_registryClassName = 'Zend_Registry';
+
+ /**
+ * Registry object provides storage for shared objects.
+ * @var Zend_Registry
+ */
+ private static $_registry = null;
+
+ /**
+ * Retrieves the default registry instance.
+ *
+ * @return Zend_Registry
+ */
+ public static function getInstance()
+ {
+ if (self::$_registry === null) {
+ self::init();
+ }
+
+ return self::$_registry;
+ }
+
+ /**
+ * Set the default registry instance to a specified instance.
+ *
+ * @param Zend_Registry $registry An object instance of type Zend_Registry,
+ * or a subclass.
+ * @return void
+ * @throws Zend_Exception if registry is already initialized.
+ */
+ public static function setInstance(Zend_Registry $registry)
+ {
+ if (self::$_registry !== null) {
+ require_once 'Zend/Exception.php';
+ throw new Zend_Exception('Registry is already initialized');
+ }
+
+ self::setClassName(get_class($registry));
+ self::$_registry = $registry;
+ }
+
+ /**
+ * Initialize the default registry instance.
+ *
+ * @return void
+ */
+ protected static function init()
+ {
+ $value = self::$_registryClassName;
+ self::setInstance(new $value());
+ }
+
+ /**
+ * Set the class name to use for the default registry instance.
+ * Does not affect the currently initialized instance, it only applies
+ * for the next time you instantiate.
+ *
+ * @param string $registryClassName
+ * @return void
+ * @throws Zend_Exception if the registry is initialized or if the
+ * class name is not valid.
+ */
+ public static function setClassName($registryClassName = 'Zend_Registry')
+ {
+ if (self::$_registry !== null) {
+ require_once 'Zend/Exception.php';
+ throw new Zend_Exception('Registry is already initialized');
+ }
+
+ if (!is_string($registryClassName)) {
+ require_once 'Zend/Exception.php';
+ throw new Zend_Exception("Argument is not a class name");
+ }
+
+ /**
+ * @see Zend_Loader
+ */
+ require_once 'Zend/Loader.php';
+ Zend_Loader::loadClass($registryClassName);
+
+ self::$_registryClassName = $registryClassName;
+ }
+
+ /**
+ * Unset the default registry instance.
+ * Primarily used in tearDown() in unit tests.
+ * @returns void
+ */
+ public static function _unsetInstance()
+ {
+ self::$_registry = null;
+ }
+
+ /**
+ * getter method, basically same as offsetGet().
+ *
+ * This method can be called from an object of type Zend_Registry, or it
+ * can be called statically. In the latter case, it uses the default
+ * static instance stored in the class.
+ *
+ * @param string $index - get the value associated with $index
+ * @return mixed
+ * @throws Zend_Exception if no entry is registerd for $index.
+ */
+ public static function get($index)
+ {
+ $instance = self::getInstance();
+
+ if (!$instance->offsetExists($index)) {
+ require_once 'Zend/Exception.php';
+ throw new Zend_Exception("No entry is registered for key '$index'");
+ }
+
+ return $instance->offsetGet($index);
+ }
+
+ /**
+ * setter method, basically same as offsetSet().
+ *
+ * This method can be called from an object of type Zend_Registry, or it
+ * can be called statically. In the latter case, it uses the default
+ * static instance stored in the class.
+ *
+ * @param string $index The location in the ArrayObject in which to store
+ * the value.
+ * @param mixed $value The object to store in the ArrayObject.
+ * @return void
+ */
+ public static function set($index, $value)
+ {
+ $instance = self::getInstance();
+ $instance->offsetSet($index, $value);
+ }
+
+ /**
+ * Returns TRUE if the $index is a named value in the registry,
+ * or FALSE if $index was not found in the registry.
+ *
+ * @param string $index
+ * @return boolean
+ */
+ public static function isRegistered($index)
+ {
+ if (self::$_registry === null) {
+ return false;
+ }
+ return self::$_registry->offsetExists($index);
+ }
+
+ /**
+ * @param string $index
+ * @returns mixed
+ *
+ * Workaround for http://bugs.php.net/bug.php?id=40442 (ZF-960).
+ */
+ public function offsetExists($index)
+ {
+ return array_key_exists($index, $this);
+ }
+
+}
diff --git a/libs/Zend/Request/Interface.php b/libs/Zend/Request/Interface.php
new file mode 100755
index 0000000000..0b8b855490
--- /dev/null
+++ b/libs/Zend/Request/Interface.php
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * @category Zend
+ * @package Zend_Request
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Request_Interface
+{
+ /**
+ * Overloading for accessing class property values
+ *
+ * @param string $key
+ * @return mixed
+ */
+ public function __get($key);
+
+ /**
+ * Overloading for setting class property values
+ *
+ * @param string $key
+ * @param mixed $value
+ * @return void
+ */
+ public function __set($key, $value);
+
+ /**
+ * Overloading to determine if a property is set
+ *
+ * @param string $key
+ * @return boolean
+ */
+ public function __isset($key);
+
+ /**
+ * Alias for __get()
+ *
+ * @param string $key
+ * @return mixed
+ */
+ public function get($key);
+
+ /**
+ * Alias for __set()
+ *
+ * @param string $key
+ * @param mixed $value
+ * @return void
+ */
+ public function set($key, $value);
+
+ /**
+ * Alias for __isset()
+ *
+ * @param string $key
+ * @return boolean
+ */
+ public function has($key);
+
+ /**
+ * Either alias for __get(), or provides ability to maintain separate
+ * configuration registry for request object.
+ *
+ * @param string $key
+ * @return mixed
+ */
+ public function getParam($key);
+
+ /**
+ * Either alias for __set(), or provides ability to maintain separate
+ * configuration registry for request object.
+ *
+ * @param string $key
+ * @param mixed $value
+ * @return void
+ */
+ public function setParam($key, $value);
+
+ /**
+ * Get all params handled by get/setParam()
+ *
+ * @return array
+ */
+ public function getParams();
+
+ /**
+ * Set all values handled by get/setParam()
+ *
+ * @param array $params
+ * @return void
+ */
+ public function setParams(array $params);
+}
diff --git a/libs/Zend/Rest/Client.php b/libs/Zend/Rest/Client.php
new file mode 100755
index 0000000000..de2af0bde8
--- /dev/null
+++ b/libs/Zend/Rest/Client.php
@@ -0,0 +1,254 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Rest
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Service_Abstract */
+require_once 'Zend/Service/Abstract.php';
+
+/** Zend_Rest_Client_Result */
+require_once 'Zend/Rest/Client/Result.php';
+
+/** Zend_Uri */
+require_once 'Zend/Uri.php';
+
+/**
+ * @category Zend
+ * @package Zend_Rest
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Rest_Client extends Zend_Service_Abstract
+{
+ /**
+ * Data for the query
+ * @var array
+ */
+ protected $_data = array();
+
+ /**
+ * Zend_Uri of this web service
+ * @var Zend_Uri_Http
+ */
+ protected $_uri = null;
+
+ /**
+ * Constructor
+ *
+ * @param string|Zend_Uri_Http $uri URI for the web service
+ * @return void
+ */
+ public function __construct($uri = null)
+ {
+ if (!empty($uri)) {
+ $this->setUri($uri);
+ }
+ }
+
+ /**
+ * Set the URI to use in the request
+ *
+ * @param string|Zend_Uri_Http $uri URI for the web service
+ * @return Zend_Rest_Client
+ */
+ public function setUri($uri)
+ {
+ if ($uri instanceof Zend_Uri_Http) {
+ $this->_uri = $uri;
+ } else {
+ $this->_uri = Zend_Uri::factory($uri);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Retrieve the current request URI object
+ *
+ * @return Zend_Uri_Http
+ */
+ public function getUri()
+ {
+ return $this->_uri;
+ }
+
+ /**
+ * Call a remote REST web service URI and return the Zend_Http_Response object
+ *
+ * @param string $path The path to append to the URI
+ * @throws Zend_Rest_Exception
+ * @return void
+ */
+ final private function _prepareRest($path)
+ {
+ // Get the URI object and configure it
+ if (!$this->_uri instanceof Zend_Uri_Http) {
+ require_once 'Zend/Rest/Client/Exception.php';
+ throw new Zend_Rest_Client_Exception('URI object must be set before performing call');
+ }
+
+ $uri = $this->_uri->getUri();
+
+ if ($path[0] != '/' && $uri[strlen($uri)-1] != '/') {
+ $path = '/' . $path;
+ }
+
+ $this->_uri->setPath($path);
+
+ /**
+ * Get the HTTP client and configure it for the endpoint URI. Do this each time
+ * because the Zend_Http_Client instance is shared among all Zend_Service_Abstract subclasses.
+ */
+ self::getHttpClient()->setUri($this->_uri);
+ }
+
+ /**
+ * Performs an HTTP GET request to the $path.
+ *
+ * @param string $path
+ * @param array $query Array of GET parameters
+ * @return Zend_Http_Response
+ */
+ final public function restGet($path, array $query = null)
+ {
+ $this->_prepareRest($path);
+ $client = self::getHttpClient();
+ $client->setParameterGet($query);
+ return $client->request('GET');
+ }
+
+ /**
+ * Perform a POST or PUT
+ *
+ * Performs a POST or PUT request. Any data provided is set in the HTTP
+ * client. String data is pushed in as raw POST data; array or object data
+ * is pushed in as POST parameters.
+ *
+ * @param mixed $method
+ * @param mixed $data
+ * @return Zend_Http_Response
+ */
+ protected function _performPost($method, $data = null)
+ {
+ $client = self::getHttpClient();
+ if (is_string($data)) {
+ $client->setRawData($data);
+ } elseif (is_array($data) || is_object($data)) {
+ $client->setParameterPost((array) $data);
+ }
+ return $client->request($method);
+ }
+
+ /**
+ * Performs an HTTP POST request to $path.
+ *
+ * @param string $path
+ * @param mixed $data Raw data to send
+ * @return Zend_Http_Response
+ */
+ final public function restPost($path, $data = null)
+ {
+ $this->_prepareRest($path);
+ return $this->_performPost('POST', $data);
+ }
+
+ /**
+ * Performs an HTTP PUT request to $path.
+ *
+ * @param string $path
+ * @param mixed $data Raw data to send in request
+ * @return Zend_Http_Response
+ */
+ final public function restPut($path, $data = null)
+ {
+ $this->_prepareRest($path);
+ return $this->_performPost('PUT', $data);
+ }
+
+ /**
+ * Performs an HTTP DELETE request to $path.
+ *
+ * @param string $path
+ * @return Zend_Http_Response
+ */
+ final public function restDelete($path)
+ {
+ $this->_prepareRest($path);
+ return self::getHttpClient()->request('DELETE');
+ }
+
+ /**
+ * Method call overload
+ *
+ * Allows calling REST actions as object methods; however, you must
+ * follow-up by chaining the request with a request to an HTTP request
+ * method (post, get, delete, put):
+ * <code>
+ * $response = $rest->sayHello('Foo', 'Manchu')->get();
+ * </code>
+ *
+ * You can also use an HTTP request method as a calling method, using the
+ * path as the first argument:
+ * <code>
+ * $rest->get('/sayHello', 'Foo', 'Manchu');
+ * </code>
+ *
+ * Or use them together, but in sequential calls:
+ * <code>
+ * $rest->sayHello('Foo', 'Manchu');
+ * $response = $rest->get();
+ * </code>
+ *
+ * @param string $method Method name
+ * @param array $args Method args
+ * @return Zend_Rest_Client_Result|Zend_Rest_Client Zend_Rest_Client if using
+ * a remote method, Zend_Rest_Client_Result if using an HTTP request method
+ */
+ public function __call($method, $args)
+ {
+ $methods = array('post', 'get', 'delete', 'put');
+
+ if (in_array(strtolower($method), $methods)) {
+ if (!isset($args[0])) {
+ $args[0] = $this->_uri->getPath();
+ }
+ $this->_data['rest'] = 1;
+ $data = array_slice($args, 1) + $this->_data;
+ $response = $this->{'rest' . $method}($args[0], $data);
+ return new Zend_Rest_Client_Result($response->getBody());
+ } else {
+ // More than one arg means it's definitely a Zend_Rest_Server
+ if (sizeof($args) == 1) {
+ $this->_data[$method] = $args[0];
+ $this->_data['arg1'] = $args[0];
+ } else {
+ $this->_data['method'] = $method;
+ if (sizeof($args) > 0) {
+ foreach ($args as $key => $arg) {
+ $key = 'arg' . $key;
+ $this->_data[$key] = $arg;
+ }
+ }
+ }
+ return $this;
+ }
+ }
+}
diff --git a/libs/Zend/Rest/Client/Exception.php b/libs/Zend/Rest/Client/Exception.php
new file mode 100755
index 0000000000..ddff2fa4e1
--- /dev/null
+++ b/libs/Zend/Rest/Client/Exception.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Rest
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Rest_Exception
+ */
+require_once 'Zend/Rest/Exception.php';
+
+
+/**
+ * Zend_Rest_Server_Exception
+ *
+ * @package Zend_Rest
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Rest_Client_Exception extends Zend_Rest_Exception
+{
+}
+
diff --git a/libs/Zend/Rest/Client/Result.php b/libs/Zend/Rest/Client/Result.php
new file mode 100755
index 0000000000..30b0ab495b
--- /dev/null
+++ b/libs/Zend/Rest/Client/Result.php
@@ -0,0 +1,201 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Rest
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * @category Zend
+ * @package Zend_Rest
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Rest_Client_Result implements IteratorAggregate {
+ /**
+ * @var SimpleXMLElement
+ */
+ private $_sxml;
+
+ /**
+ * Constructor
+ *
+ * @param string $data XML Result
+ * @return void
+ */
+ public function __construct($data)
+ {
+ $this->_sxml = simplexml_load_string($data);
+ }
+
+ /**
+ * Casts a SimpleXMLElement to its appropriate PHP value
+ *
+ * @param SimpleXMLElement $value
+ * @return mixed
+ */
+ public function toValue(SimpleXMLElement $value)
+ {
+ $node = dom_import_simplexml($value);
+ return $node->nodeValue;
+ }
+
+ /**
+ * Get Property Overload
+ *
+ * @param string $name
+ * @return null|SimpleXMLElement|array Null if not found, SimpleXMLElement if only one value found, array of Zend_Rest_Client_Result objects otherwise
+ */
+ public function __get($name)
+ {
+ if (isset($this->_sxml->{$name})) {
+ return $this->_sxml->{$name};
+ }
+
+ $result = $this->_sxml->xpath("//$name");
+ $count = count($result);
+
+ if ($count == 0) {
+ return null;
+ } elseif ($count == 1) {
+ return $result[0];
+ } else {
+ return $result;
+ }
+ }
+
+ /**
+ * Cast properties to PHP values
+ *
+ * For arrays, loops through each element and casts to a value as well.
+ *
+ * @param string $method
+ * @param array $args
+ * @return mixed
+ */
+ public function __call($method, $args)
+ {
+ if (null !== ($value = $this->__get($method))) {
+ if (!is_array($value)) {
+ return $this->toValue($value);
+ } else {
+ $return = array();
+ foreach ($value as $element) {
+ $return[] = $this->toValue($element);
+ }
+ return $return;
+ }
+ }
+
+ return null;
+ }
+
+
+ /**
+ * Isset Overload
+ *
+ * @param string $name
+ * @return boolean
+ */
+ public function __isset($name)
+ {
+ if (isset($this->_sxml->{$name})) {
+ return true;
+ }
+
+ $result = $this->_sxml->xpath("//$name");
+
+ if (sizeof($result) > 0) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Implement IteratorAggregate::getIterator()
+ *
+ * @return SimpleXMLIterator
+ */
+ public function getIterator()
+ {
+ return $this->_sxml;
+ }
+
+ /**
+ * Get Request Status
+ *
+ * @return boolean
+ */
+ public function getStatus()
+ {
+ $status = $this->_sxml->xpath('//status/text()');
+
+ $status = strtolower($status[0]);
+
+ if (ctype_alpha($status) && $status == 'success') {
+ return true;
+ } elseif (ctype_alpha($status) && $status != 'success') {
+ return false;
+ } else {
+ return (bool) $status;
+ }
+ }
+
+ public function isError()
+ {
+ $status = $this->getStatus();
+ if ($status) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public function isSuccess()
+ {
+ $status = $this->getStatus();
+ if ($status) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * toString overload
+ *
+ * Be sure to only call this when the result is a single value!
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ if (!$this->getStatus()) {
+ $message = $this->_sxml->xpath('//message');
+ return (string) $message[0];
+ } else {
+ $result = $this->_sxml->xpath('//response');
+ if (sizeof($result) > 1) {
+ return (string) "An error occured.";
+ } else {
+ return (string) $result[0];
+ }
+ }
+ }
+}
diff --git a/libs/Zend/Rest/Exception.php b/libs/Zend/Rest/Exception.php
new file mode 100755
index 0000000000..12737619b2
--- /dev/null
+++ b/libs/Zend/Rest/Exception.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Rest
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Rest
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Rest_Exception extends Zend_Exception
+{}
+
diff --git a/libs/Zend/Rest/Server.php b/libs/Zend/Rest/Server.php
new file mode 100755
index 0000000000..05f44617ce
--- /dev/null
+++ b/libs/Zend/Rest/Server.php
@@ -0,0 +1,494 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Rest
+ * @subpackage Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Server_Interface
+ */
+require_once 'Zend/Server/Interface.php';
+
+/**
+ * Zend_Server_Reflection
+ */
+require_once 'Zend/Server/Reflection.php';
+
+/**
+ * Zend_Rest_Server_Exception
+ */
+require_once 'Zend/Rest/Server/Exception.php';
+
+/**
+ * Zend_Server_Abstract
+ */
+require_once 'Zend/Server/Abstract.php';
+
+/**
+ * @category Zend
+ * @package Zend_Rest
+ * @subpackage Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Rest_Server extends Zend_Server_Abstract implements Zend_Server_Interface
+{
+ /**
+ * @var Zend_Server_Reflection
+ */
+ protected $_reflection = null;
+
+ /**
+ * Class Constructor Args
+ */
+ protected $_args = array();
+
+ /**
+ * @var array An array of Zend_Server_Reflect_Method
+ */
+ protected $_functions = array();
+
+ /**
+ * @var array Array of headers to send
+ */
+ protected $_headers = array();
+
+ /**
+ * @var string Current Method
+ */
+ protected $_method;
+
+ /**
+ * Whether or not {@link handle()} should send output or return the response.
+ * @var boolean Defaults to false
+ */
+ protected $_returnResponse = false;
+
+ /**
+ * Constructor
+ */
+ public function __construct()
+ {
+ set_exception_handler(array($this, "fault"));
+ $this->_reflection = new Zend_Server_Reflection();
+ }
+
+ /**
+ * Whether or not to return a response
+ *
+ * If called without arguments, returns the value of the flag. If called
+ * with an argument, sets the flag.
+ *
+ * When 'return response' is true, {@link handle()} will not send output,
+ * but will instead return the response from the dispatched function/method.
+ *
+ * @param boolean $flag
+ * @return boolean|Zend_Rest_Server Returns Zend_Rest_Server when used to set the flag; returns boolean flag value otherwise.
+ */
+ public function returnResponse($flag = null)
+ {
+ if (null == $flag) {
+ return $this->_returnResponse;
+ }
+
+ $this->_returnResponse = ($flag) ? true : false;
+ return $this;
+ }
+
+ /**
+ * Implement Zend_Server_Interface::handle()
+ *
+ * @param array $request
+ */
+ public function handle($request = false)
+ {
+ $this->_headers = array('Content-Type: text/xml');
+ if (!$request) {
+ $request = $_REQUEST;
+ }
+ if (isset($request['method'])) {
+ $this->_method = $request['method'];
+ if (isset($this->_functions[$this->_method])) {
+ if ($this->_functions[$this->_method] instanceof Zend_Server_Reflection_Function || $this->_functions[$this->_method] instanceof Zend_Server_Reflection_Method && $this->_functions[$this->_method]->isPublic()) {
+ $request_keys = array_keys($request);
+ array_walk($request_keys, array(__CLASS__, "lowerCase"));
+ $request = array_combine($request_keys, $request);
+
+ $func_args = $this->_functions[$this->_method]->getParameters();
+
+ $calling_args = array();
+ foreach ($func_args as $arg) {
+ if (isset($request[strtolower($arg->getName())])) {
+ $calling_args[] = $request[strtolower($arg->getName())];
+ }
+ }
+
+ foreach ($request as $key => $value) {
+ if (substr($key, 0, 3) == 'arg') {
+ $key = str_replace('arg', '', $key);
+ $calling_args[$key]= $value;
+ }
+ }
+
+ if (count($calling_args) < count($func_args)) {
+ throw new Zend_Rest_Server_Exception('Invalid Method Call to ' . $this->_method . '. Requires ' . count($func_args) . ', ' . count($calling_args) . ' given.', 400);
+ }
+
+ if ($this->_functions[$this->_method] instanceof Zend_Server_Reflection_Method) {
+ // Get class
+ $class = $this->_functions[$this->_method]->getDeclaringClass()->getName();
+
+ if ($this->_functions[$this->_method]->isStatic()) {
+ // for some reason, invokeArgs() does not work the same as
+ // invoke(), and expects the first argument to be an object.
+ // So, using a callback if the method is static.
+ $result = call_user_func_array(array($class, $this->_functions[$this->_method]->getName()), $calling_args);
+ }
+
+ // Object methods
+ try {
+ if ($this->_functions[$this->_method]->getDeclaringClass()->getConstructor()) {
+ $object = $this->_functions[$this->_method]->getDeclaringClass()->newInstanceArgs($this->_args);
+ } else {
+ $object = $this->_functions[$this->_method]->getDeclaringClass()->newInstance();
+ }
+ } catch (Exception $e) {
+ echo $e->getMessage();
+ throw new Zend_Rest_Server_Exception('Error instantiating class ' . $class . ' to invoke method ' . $this->_functions[$this->_method]->getName(), 500);
+ }
+
+ try {
+ $result = $this->_functions[$this->_method]->invokeArgs($object, $calling_args);
+ } catch (Exception $e) {
+ $result = $this->fault($e);
+ }
+ } else {
+ try {
+ $result = call_user_func_array($this->_functions[$this->_method]->getName(), $calling_args); //$this->_functions[$this->_method]->invokeArgs($calling_args);
+ } catch (Exception $e) {
+ $result = $this->fault($e);
+ }
+ }
+
+ } else {
+ $result = $this->fault("Unknown Method '$this->_method'.", 404);
+ }
+ } else {
+ $result = $this->fault("Unknown Method '$this->_method'.", 404);
+ }
+ } else {
+ $result = $this->fault("No Method Specified.", 404);
+ }
+
+ if ($result instanceof SimpleXMLElement) {
+ $response = $result->asXML();
+ } elseif ($result instanceof DOMDocument) {
+ $response = $result->saveXML();
+ } elseif ($result instanceof DOMNode) {
+ $response = $result->ownerDocument->saveXML($result);
+ } elseif (is_array($result) || is_object($result)) {
+ $response = $this->_handleStruct($result);
+ } else {
+ $response = $this->_handleScalar($result);
+ }
+
+ if (!$this->returnResponse()) {
+ if (!headers_sent()) {
+ foreach ($this->_headers as $header) {
+ header($header);
+ }
+ }
+
+ echo $response;
+ return;
+ }
+
+ return $response;
+ }
+
+ /**
+ * Implement Zend_Server_Interface::setClass()
+ *
+ * @param string $classname Class name
+ * @param string $namespace Class namespace (unused)
+ * @param array $argv An array of Constructor Arguments
+ */
+ public function setClass($classname, $namespace = '', $argv = array())
+ {
+ $this->_args = $argv;
+ foreach ($this->_reflection->reflectClass($classname, $argv)->getMethods() as $method) {
+ $this->_functions[$method->getName()] = $method;
+ }
+ }
+
+ /**
+ * Handle an array or object result
+ *
+ * @param array|object $struct Result Value
+ * @return string XML Response
+ */
+ protected function _handleStruct($struct)
+ {
+ $function = $this->_functions[$this->_method];
+ if ($function instanceof Zend_Server_Reflection_Method) {
+ $class = $function->getDeclaringClass()->getName();
+ } else {
+ $class = false;
+ }
+
+ $method = $function->getName();
+
+ $dom = new DOMDocument('1.0', 'UTF-8');
+ if ($class) {
+ $root = $dom->createElement($class);
+ $method = $dom->createElement($method);
+ $root->appendChild($method);
+ } else {
+ $root = $dom->createElement($method);
+ $method = $root;
+ }
+ $root->setAttribute('generator', 'zend');
+ $root->setAttribute('version', '1.0');
+ $dom->appendChild($root);
+
+ $this->_structValue($struct, $dom, $method);
+
+ $struct = (array) $struct;
+ if (!isset($struct['status'])) {
+ $status = $dom->createElement('status', 'success');
+ $method->appendChild($status);
+ }
+
+ return $dom->saveXML();
+ }
+
+ /**
+ * Recursively iterate through a struct
+ *
+ * Recursively iterates through an associative array or object's properties
+ * to build XML response.
+ *
+ * @param mixed $struct
+ * @param DOMDocument $dom
+ * @param DOMElement $parent
+ * @return void
+ */
+ protected function _structValue($struct, DOMDocument $dom, DOMElement $parent)
+ {
+ $struct = (array) $struct;
+
+ foreach ($struct as $key => $value) {
+ if ($value === false) {
+ $value = 0;
+ } elseif ($value === true) {
+ $value = 1;
+ }
+
+ if (ctype_digit((string) $key)) {
+ $key = 'key_' . $key;
+ }
+
+ if (is_array($value) || is_object($value)) {
+ $element = $dom->createElement($key);
+ $this->_structValue($value, $dom, $element);
+ } else {
+ $element = $dom->createElement($key, $value);
+ }
+
+ $parent->appendChild($element);
+ }
+ }
+
+ /**
+ * Handle a single value
+ *
+ * @param string|int|boolean $value Result value
+ * @return string XML Response
+ */
+ protected function _handleScalar($value)
+ {
+ $function = $this->_functions[$this->_method];
+ if ($function instanceof Zend_Server_Reflection_Method) {
+ $class = $function->getDeclaringClass()->getName();
+ } else {
+ $class = false;
+ }
+
+ $method = $function->getName();
+
+ $dom = new DOMDocument('1.0', 'UTF-8');
+ if ($class) {
+ $xml = $dom->createElement($class);
+ $methodNode = $dom->createElement($method);
+ $xml->appendChild($methodNode);
+ } else {
+ $xml = $dom->createElement($method);
+ $methodNode = $xml;
+ }
+ $xml->setAttribute('generator', 'zend');
+ $xml->setAttribute('version', '1.0');
+ $dom->appendChild($xml);
+
+ if ($value === false) {
+ $value = 0;
+ } elseif ($value === true) {
+ $value = 1;
+ }
+
+ if (isset($value)) {
+ $methodNode->appendChild($dom->createElement('response', $value));
+ } else {
+ $methodNode->appendChild($dom->createElement('response'));
+ }
+
+ $methodNode->appendChild($dom->createElement('status', 'success'));
+
+ return $dom->saveXML();
+ }
+
+ /**
+ * Implement Zend_Server_Interface::fault()
+ *
+ * Creates XML error response, returning DOMDocument with response.
+ *
+ * @param string|Exception $fault Message
+ * @param int $code Error Code
+ * @return DOMDocument
+ */
+ public function fault($exception = null, $code = null)
+ {
+ if (isset($this->_functions[$this->_method])) {
+ $function = $this->_functions[$this->_method];
+ } elseif (isset($this->_method)) {
+ $function = $this->_method;
+ } else {
+ $function = 'rest';
+ }
+
+ if ($function instanceof Zend_Server_Reflection_Method) {
+ $class = $function->getDeclaringClass()->getName();
+ } else {
+ $class = false;
+ }
+
+ if ($function instanceof Zend_Server_Reflection_Function_Abstract) {
+ $method = $function->getName();
+ } else {
+ $method = $function;
+ }
+
+ $dom = new DOMDocument('1.0', 'UTF-8');
+ if ($class) {
+ $xml = $dom->createElement($class);
+ $xmlMethod = $dom->createElement($method);
+ $xml->appendChild($xmlMethod);
+ } else {
+ $xml = $dom->createElement($method);
+ $xmlMethod = $xml;
+ }
+ $xml->setAttribute('generator', 'zend');
+ $xml->setAttribute('version', '1.0');
+ $dom->appendChild($xml);
+
+ $xmlResponse = $dom->createElement('response');
+ $xmlMethod->appendChild($xmlResponse);
+
+ if ($exception instanceof Exception) {
+ $xmlResponse->appendChild($dom->createElement('message', $exception->getMessage()));
+ $code = $exception->getCode();
+ } elseif (!is_null($exception) || 'rest' == $function) {
+ $xmlResponse->appendChild($dom->createElement('message', 'An unknown error occured. Please try again.'));
+ } else {
+ $xmlResponse->appendChild($dom->createElement('message', 'Call to ' . $method . ' failed.'));
+ }
+
+ $xmlMethod->appendChild($xmlResponse);
+ $xmlMethod->appendChild($dom->createElement('status', 'failed'));
+
+ // Headers to send
+ if (is_null($code) || (404 != $code))
+ {
+ $this->_headers[] = 'HTTP/1.0 400 Bad Request';
+ } else {
+ $this->_headers[] = 'HTTP/1.0 404 File Not Found';
+ }
+
+ return $dom;
+ }
+
+ /**
+ * Retrieve any HTTP extra headers set by the server
+ *
+ * @return array
+ */
+ public function getHeaders()
+ {
+ return $this->_headers;
+ }
+
+ /**
+ * Implement Zend_Server_Interface::addFunction()
+ *
+ * @param string $function Function Name
+ * @param string $namespace Function namespace (unused)
+ */
+ public function addFunction($function, $namespace = '')
+ {
+ if (!is_array($function)) {
+ $function = (array) $function;
+ }
+
+ foreach ($function as $func) {
+ if (is_callable($func) && !in_array($func, self::$magic_methods)) {
+ $this->_functions[$func] = $this->_reflection->reflectFunction($func);
+ } else {
+ throw new Zend_Rest_Server_Exception("Invalid Method Added to Service.");
+ }
+ }
+ }
+
+ /**
+ * Implement Zend_Server_Interface::getFunctions()
+ *
+ * @return array An array of Zend_Server_Reflection_Method's
+ */
+ public function getFunctions()
+ {
+ return $this->_functions;
+ }
+
+ /**
+ * Implement Zend_Server_Interface::loadFunctions()
+ *
+ * @todo Implement
+ * @param array $functions
+ */
+ public function loadFunctions($functions)
+ {
+ }
+
+ /**
+ * Implement Zend_Server_Interface::setPersistence()
+ *
+ * @todo Implement
+ * @param int $mode
+ */
+ public function setPersistence($mode)
+ {
+ }
+}
diff --git a/libs/Zend/Rest/Server/Exception.php b/libs/Zend/Rest/Server/Exception.php
new file mode 100755
index 0000000000..62d14a9108
--- /dev/null
+++ b/libs/Zend/Rest/Server/Exception.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Rest
+ * @subpackage Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/**
+ * Zend_Rest_Exception
+ */
+require_once 'Zend/Rest/Exception.php';
+
+
+/**
+ * Zend_Rest_Server_Exception
+ *
+ * @package Zend_Rest
+ * @subpackage Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Rest_Server_Exception extends Zend_Rest_Exception
+{
+}
+
diff --git a/libs/Zend/Server/Abstract.php b/libs/Zend/Server/Abstract.php
new file mode 100755
index 0000000000..7d5afbbdf8
--- /dev/null
+++ b/libs/Zend/Server/Abstract.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Server_Interface */
+require_once 'Zend/Server/Interface.php';
+
+/**
+ * Zend_Server_Abstract
+ *
+ * @category Zend
+ * @package Zend_Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Abstract.php 4223 2007-03-24 10:20:34Z thomas $
+ */
+abstract class Zend_Server_Abstract implements Zend_Server_Interface
+{
+ /**
+ * @var array PHP's Magic Methods, these are ignored
+ */
+ protected static $magic_methods = array(
+ '__construct',
+ '__destruct',
+ '__get',
+ '__set',
+ '__call',
+ '__sleep',
+ '__wakeup',
+ '__isset',
+ '__unset',
+ '__tostring',
+ '__clone',
+ '__set_state',
+ );
+
+ /**
+ * Lowercase a string
+ *
+ * Lowercase's a string by reference
+ *
+ * @param string $value
+ * @param string $key
+ * @return string Lower cased string
+ */
+ public static function lowerCase(&$value, &$key)
+ {
+ return $value = strtolower($value);
+ }
+}
diff --git a/libs/Zend/Server/Exception.php b/libs/Zend/Server/Exception.php
new file mode 100755
index 0000000000..7d38489531
--- /dev/null
+++ b/libs/Zend/Server/Exception.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+/**
+ * Zend_Server_Reflection exceptions
+ *
+ * @package Zend_Server
+ * @subpackage Reflection
+ * @version $Id: Exception.php 2815 2007-01-16 01:42:33Z bkarwin $
+ */
+class Zend_Server_Exception extends Zend_Exception
+{
+}
diff --git a/libs/Zend/Server/Interface.php b/libs/Zend/Server/Interface.php
new file mode 100755
index 0000000000..1ae3f600af
--- /dev/null
+++ b/libs/Zend/Server/Interface.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Server_Interface
+ *
+ * @category Zend
+ * @package Zend_Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 3452 2007-02-15 18:14:15Z matthew $
+ */
+interface Zend_Server_Interface
+{
+ /**
+ * Attach a function as a server method
+ *
+ * Namespacing is primarily for xmlrpc, but may be used with other
+ * implementations to prevent naming collisions.
+ *
+ * @param string $function
+ * @param string $namespace
+ * @param null|array Optional array of arguments to pass to callbacks at
+ * dispatch.
+ * @return void
+ */
+ public function addFunction($function, $namespace = '');
+
+ /**
+ * Attach a class to a server
+ *
+ * The individual implementations should probably allow passing a variable
+ * number of arguments in, so that developers may define custom runtime
+ * arguments to pass to server methods.
+ *
+ * Namespacing is primarily for xmlrpc, but could be used for other
+ * implementations as well.
+ *
+ * @param mixed $class Class name or object instance to examine and attach
+ * to the server.
+ * @param string $namespace Optional namespace with which to prepend method
+ * names in the dispatch table.
+ * methods in the class will be valid callbacks.
+ * @param null|array Optional array of arguments to pass to callbacks at
+ * dispatch.
+ * @return void
+ */
+ public function setClass($class, $namespace = '', $argv = null);
+
+ /**
+ * Generate a server fault
+ *
+ * @param mixed $fault
+ * @param int $code
+ * @return mixed
+ */
+ public function fault($fault = null, $code = 404);
+
+ /**
+ * Handle a request
+ *
+ * Requests may be passed in, or the server may automagically determine the
+ * request based on defaults. Dispatches server request to appropriate
+ * method and returns a response
+ *
+ * @param mixed $request
+ * @return mixed
+ */
+ public function handle($request = false);
+
+ /**
+ * Return a server definition array
+ *
+ * Returns a server definition array as created using
+ * {@link * Zend_Server_Reflection}. Can be used for server introspection,
+ * documentation, or persistence.
+ *
+ * @access public
+ * @return array
+ */
+ public function getFunctions();
+
+ /**
+ * Load server definition
+ *
+ * Used for persistence; loads a construct as returned by {@link getFunctions()}.
+ *
+ * @param array $array
+ * @return void
+ */
+ public function loadFunctions($definition);
+
+ /**
+ * Set server persistence
+ *
+ * @todo Determine how to implement this
+ * @param int $mode
+ * @return void
+ */
+ public function setPersistence($mode);
+}
diff --git a/libs/Zend/Server/Reflection.php b/libs/Zend/Server/Reflection.php
new file mode 100755
index 0000000000..e86edc10a2
--- /dev/null
+++ b/libs/Zend/Server/Reflection.php
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Server_Reflection_Exception
+ */
+require_once 'Zend/Server/Reflection/Exception.php';
+
+/**
+ * Zend_Server_Reflection_Function
+ */
+require_once 'Zend/Server/Reflection/Function.php';
+
+/**
+ * Zend_Server_Reflection_Class
+ */
+require_once 'Zend/Server/Reflection/Class.php';
+
+/**
+ * Reflection for determining method signatures to use with server classes
+ *
+ * @category Zend
+ * @package Zend_Server
+ * @subpackage Reflection
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Reflection.php 2815 2007-01-16 01:42:33Z bkarwin $
+ */
+class Zend_Server_Reflection
+{
+ /**
+ * Perform class reflection to create dispatch signatures
+ *
+ * Creates a {@link Zend_Server_Reflection_Class} object for the class or
+ * object provided.
+ *
+ * If extra arguments should be passed to dispatchable methods, these may
+ * be provided as an array to $argv.
+ *
+ * @param string|object $class Class name or object
+ * @param null|array $argv Optional arguments to be used during the method call
+ * @param string $namespace Optional namespace with which to prefix the
+ * method name (used for the signature key). Primarily to avoid collisions,
+ * also for XmlRpc namespacing
+ * @return Zend_Server_Reflection_Class
+ * @throws Zend_Server_Reflection_Exception
+ */
+ public static function reflectClass($class, $argv = false, $namespace = '')
+ {
+ if (is_object($class)) {
+ $reflection = new ReflectionObject($class);
+ } elseif (class_exists($class)) {
+ $reflection = new ReflectionClass($class);
+ } else {
+ throw new Zend_Server_Reflection_Exception('Invalid class or object passed to attachClass()');
+ }
+
+ if ($argv && !is_array($argv)) {
+ throw new Zend_Server_Reflection_Exception('Invalid argv argument passed to reflectClass');
+ }
+
+ return new Zend_Server_Reflection_Class($reflection, $namespace, $argv);
+ }
+
+ /**
+ * Perform function reflection to create dispatch signatures
+ *
+ * Creates dispatch prototypes for a function. It returns a
+ * {@link Zend_Server_Reflection_Function} object.
+ *
+ * If extra arguments should be passed to the dispatchable function, these
+ * may be provided as an array to $argv.
+ *
+ * @param string $function Function name
+ * @param null|array $argv Optional arguments to be used during the method call
+ * @param string $namespace Optional namespace with which to prefix the
+ * function name (used for the signature key). Primarily to avoid
+ * collisions, also for XmlRpc namespacing
+ * @return Zend_Server_Reflection_Function
+ * @throws Zend_Server_Reflection_Exception
+ */
+ public static function reflectFunction($function, $argv = false, $namespace = '')
+ {
+ if (!is_string($function) || !function_exists($function)) {
+ throw new Zend_Server_Reflection_Exception('Invalid function "' . $function . '" passed to reflectFunction');
+ }
+
+
+ if ($argv && !is_array($argv)) {
+ throw new Zend_Server_Reflection_Exception('Invalid argv argument passed to reflectClass');
+ }
+
+ return new Zend_Server_Reflection_Function(new ReflectionFunction($function), $namespace, $argv);
+ }
+}
diff --git a/libs/Zend/Server/Reflection/Class.php b/libs/Zend/Server/Reflection/Class.php
new file mode 100755
index 0000000000..3ea07bf1fc
--- /dev/null
+++ b/libs/Zend/Server/Reflection/Class.php
@@ -0,0 +1,201 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Server_Reflection_Method
+ */
+require_once 'Zend/Server/Reflection/Method.php';
+
+/**
+ * Zend_Server_Reflection_Exception
+ */
+require_once 'Zend/Server/Reflection/Exception.php';
+
+/**
+ * Class/Object reflection
+ *
+ * Proxies calls to a ReflectionClass object, and decorates getMethods() by
+ * creating its own list of {@link Zend_Server_Reflection_Method}s.
+ *
+ * @category Zend
+ * @package Zend_Server
+ * @subpackage Reflection
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Class.php 2815 2007-01-16 01:42:33Z bkarwin $
+ */
+class Zend_Server_Reflection_Class
+{
+ /**
+ * Optional configuration parameters; accessible via {@link __get} and
+ * {@link __set()}
+ * @var array
+ */
+ protected $_config = array();
+
+ /**
+ * Array of {@link Zend_Server_Reflection_Method}s
+ * @var array
+ */
+ protected $_methods = array();
+
+ /**
+ * Namespace
+ * @var string
+ */
+ protected $_namespace = null;
+
+ /**
+ * ReflectionClass object
+ * @var ReflectionClass
+ */
+ protected $_reflection;
+
+ /**
+ * Constructor
+ *
+ * Create array of dispatchable methods, each a
+ * {@link Zend_Server_Reflection_Method}. Sets reflection object property.
+ *
+ * @param ReflectionClass $reflection
+ * @param string $namespace
+ * @param mixed $argv
+ * @return void
+ */
+ public function __construct(ReflectionClass $reflection, $namespace = null, $argv = false)
+ {
+ $this->_reflection = $reflection;
+ $this->setNamespace($namespace);
+
+ foreach ($reflection->getMethods() as $method) {
+ // Don't aggregate magic methods
+ if ('__' == substr($method->getName(), 0, 2)) {
+ continue;
+ }
+
+ if ($method->isPublic()) {
+ // Get signatures and description
+ $this->_methods[] = new Zend_Server_Reflection_Method($this, $method, $this->getNamespace(), $argv);
+ }
+ }
+ }
+
+ /**
+ * Proxy reflection calls
+ *
+ * @param string $method
+ * @param array $args
+ * @return mixed
+ */
+ public function __call($method, $args)
+ {
+ if (method_exists($this->_reflection, $method)) {
+ return call_user_func_array(array($this->_reflection, $method), $args);
+ }
+
+ throw new Zend_Server_Reflection_Exception('Invalid reflection method');
+ }
+
+ /**
+ * Retrieve configuration parameters
+ *
+ * Values are retrieved by key from {@link $_config}. Returns null if no
+ * value found.
+ *
+ * @param string $key
+ * @return mixed
+ */
+ public function __get($key)
+ {
+ if (isset($this->_config[$key])) {
+ return $this->_config[$key];
+ }
+
+ return null;
+ }
+
+ /**
+ * Set configuration parameters
+ *
+ * Values are stored by $key in {@link $_config}.
+ *
+ * @param string $key
+ * @param mixed $value
+ * @return void
+ */
+ public function __set($key, $value)
+ {
+ $this->_config[$key] = $value;
+ }
+
+ /**
+ * Return array of dispatchable {@link Zend_Server_Reflection_Method}s.
+ *
+ * @access public
+ * @return array
+ */
+ public function getMethods()
+ {
+ return $this->_methods;
+ }
+
+ /**
+ * Get namespace for this class
+ *
+ * @return string
+ */
+ public function getNamespace()
+ {
+ return $this->_namespace;
+ }
+
+ /**
+ * Set namespace for this class
+ *
+ * @param string $namespace
+ * @return void
+ */
+ public function setNamespace($namespace)
+ {
+ if (empty($namespace)) {
+ $this->_namespace = '';
+ return;
+ }
+
+ if (!is_string($namespace) || !preg_match('/[a-z0-9_\.]+/i', $namespace)) {
+ throw new Zend_Server_Reflection_Exception('Invalid namespace');
+ }
+
+ $this->_namespace = $namespace;
+ }
+
+ /**
+ * Wakeup from serialization
+ *
+ * Reflection needs explicit instantiation to work correctly. Re-instantiate
+ * reflection object on wakeup.
+ *
+ * @return void
+ */
+ public function __wakeup()
+ {
+ $this->_reflection = new ReflectionClass($this->getName());
+ }
+}
diff --git a/libs/Zend/Server/Reflection/Exception.php b/libs/Zend/Server/Reflection/Exception.php
new file mode 100755
index 0000000000..ed0369cac4
--- /dev/null
+++ b/libs/Zend/Server/Reflection/Exception.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+/**
+ * Zend_Server_Reflection exceptions
+ *
+ * @category Zend
+ * @package Zend_Server
+ * @subpackage Reflection
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Exception.php 2815 2007-01-16 01:42:33Z bkarwin $
+ */
+class Zend_Server_Reflection_Exception extends Zend_Exception
+{
+}
diff --git a/libs/Zend/Server/Reflection/Function.php b/libs/Zend/Server/Reflection/Function.php
new file mode 100755
index 0000000000..903c0e7079
--- /dev/null
+++ b/libs/Zend/Server/Reflection/Function.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Server_Reflection_Function_Abstract
+ */
+require_once 'Zend/Server/Reflection/Function/Abstract.php';
+
+/**
+ * Function Reflection
+ *
+ * @uses Zend_Server_Reflection_Function_Abstract
+ * @category Zend
+ * @package Zend_Server
+ * @subpackage Reflection
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Function.php 2815 2007-01-16 01:42:33Z bkarwin $
+ */
+class Zend_Server_Reflection_Function extends Zend_Server_Reflection_Function_Abstract
+{
+}
diff --git a/libs/Zend/Server/Reflection/Function/Abstract.php b/libs/Zend/Server/Reflection/Function/Abstract.php
new file mode 100755
index 0000000000..f7668bdac3
--- /dev/null
+++ b/libs/Zend/Server/Reflection/Function/Abstract.php
@@ -0,0 +1,497 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Server_Reflection_Exception
+ */
+require_once 'Zend/Server/Reflection/Exception.php';
+
+/**
+ * Zend_Server_Reflection_Node
+ */
+require_once 'Zend/Server/Reflection/Node.php';
+
+/**
+ * Zend_Server_Reflection_Parameter
+ */
+require_once 'Zend/Server/Reflection/Parameter.php';
+
+/**
+ * Zend_Server_Reflection_Prototype
+ */
+require_once 'Zend/Server/Reflection/Prototype.php';
+
+/**
+ * Function/Method Reflection
+ *
+ * Decorates a ReflectionFunction. Allows setting and retrieving an alternate
+ * 'service' name (i.e., the name to be used when calling via a service),
+ * setting and retrieving the description (originally set using the docblock
+ * contents), retrieving the callback and callback type, retrieving additional
+ * method invocation arguments, and retrieving the
+ * method {@link Zend_Server_Reflection_Prototype prototypes}.
+ *
+ * @category Zend
+ * @package Zend_Server
+ * @subpackage Reflection
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Abstract.php 3916 2007-03-14 11:42:22Z matthew $
+ */
+abstract class Zend_Server_Reflection_Function_Abstract
+{
+ /**
+ * @var ReflectionFunction
+ */
+ protected $_reflection;
+
+ /**
+ * Additional arguments to pass to method on invocation
+ * @var array
+ */
+ protected $_argv = array();
+
+ /**
+ * Used to store extra configuration for the method (typically done by the
+ * server class, e.g., to indicate whether or not to instantiate a class).
+ * Associative array; access is as properties via {@link __get()} and
+ * {@link __set()}
+ * @var array
+ */
+ protected $_config = array();
+
+ /**
+ * Declaring class (needed for when serialization occurs)
+ * @var string
+ */
+ protected $_class;
+
+ /**
+ * Function/method description
+ * @var string
+ */
+ protected $_description = '';
+
+ /**
+ * Namespace with which to prefix function/method name
+ * @var string
+ */
+ protected $_namespace;
+
+ /**
+ * Prototypes
+ * @var array
+ */
+ protected $_prototypes = array();
+
+ private $_return;
+ private $_returnDesc;
+ private $_paramDesc;
+ private $_sigParams;
+ private $_sigParamsDepth;
+
+ /**
+ * Constructor
+ *
+ * @param ReflectionFunction $r
+ */
+ public function __construct(Reflector $r, $namespace = null, $argv = array())
+ {
+ // In PHP 5.1.x, ReflectionMethod extends ReflectionFunction. In 5.2.x,
+ // both extend ReflectionFunctionAbstract. So, we can't do normal type
+ // hinting in the prototype, but instead need to do some explicit
+ // testing here.
+ if ((!$r instanceof ReflectionFunction)
+ && (!$r instanceof ReflectionMethod)) {
+ throw new Zend_Server_Reflection_Exception('Invalid reflection class');
+ }
+ $this->_reflection = $r;
+
+ // Determine namespace
+ if (null !== $namespace){
+ $this->setNamespace($namespace);
+ }
+
+ // Determine arguments
+ if (is_array($argv)) {
+ $this->_argv = $argv;
+ }
+
+ // If method call, need to store some info on the class
+ if ($r instanceof ReflectionMethod) {
+ $this->_class = $r->getDeclaringClass()->getName();
+ }
+
+ // Perform some introspection
+ $this->_reflect();
+ }
+
+ /**
+ * Create signature node tree
+ *
+ * Recursive method to build the signature node tree. Increments through
+ * each array in {@link $_sigParams}, adding every value of the next level
+ * to the current value (unless the current value is null).
+ *
+ * @param Zend_Server_Reflection_Node $parent
+ * @param int $level
+ * @return void
+ */
+ protected function _addTree(Zend_Server_Reflection_Node $parent, $level = 0)
+ {
+ if ($level >= $this->_sigParamsDepth) {
+ return;
+ }
+
+ foreach ($this->_sigParams[$level] as $value) {
+ $node = new Zend_Server_Reflection_Node($value, $parent);
+ if ((null !== $value) && ($this->_sigParamsDepth > $level + 1)) {
+ $this->_addTree($node, $level + 1);
+ }
+ }
+ }
+
+ /**
+ * Build the signature tree
+ *
+ * Builds a signature tree starting at the return values and descending
+ * through each method argument. Returns an array of
+ * {@link Zend_Server_Reflection_Node}s.
+ *
+ * @return array
+ */
+ protected function _buildTree()
+ {
+ $returnTree = array();
+ foreach ((array) $this->_return as $value) {
+ $node = new Zend_Server_Reflection_Node($value);
+ $this->_addTree($node);
+ $returnTree[] = $node;
+ }
+
+ return $returnTree;
+ }
+
+ /**
+ * Build method signatures
+ *
+ * Builds method signatures using the array of return types and the array of
+ * parameters types
+ *
+ * @param array $return Array of return types
+ * @param string $returnDesc Return value description
+ * @param array $params Array of arguments (each an array of types)
+ * @param array $paramDesc Array of parameter descriptions
+ * @return array
+ */
+ protected function _buildSignatures($return, $returnDesc, $paramTypes, $paramDesc)
+ {
+ $this->_return = $return;
+ $this->_returnDesc = $returnDesc;
+ $this->_paramDesc = $paramDesc;
+ $this->_sigParams = $paramTypes;
+ $this->_sigParamsDepth = count($paramTypes);
+ $signatureTrees = $this->_buildTree();
+ $signatures = array();
+
+ $endPoints = array();
+ foreach ($signatureTrees as $root) {
+ $tmp = $root->getEndPoints();
+ if (empty($tmp)) {
+ $endPoints = array_merge($endPoints, array($root));
+ } else {
+ $endPoints = array_merge($endPoints, $tmp);
+ }
+ }
+
+ foreach ($endPoints as $node) {
+ if (!$node instanceof Zend_Server_Reflection_Node) {
+ continue;
+ }
+
+ $signature = array();
+ do {
+ array_unshift($signature, $node->getValue());
+ $node = $node->getParent();
+ } while ($node instanceof Zend_Server_Reflection_Node);
+
+ $signatures[] = $signature;
+ }
+
+ // Build prototypes
+ $params = $this->_reflection->getParameters();
+ foreach ($signatures as $signature) {
+ $return = new Zend_Server_Reflection_ReturnValue(array_shift($signature), $this->_returnDesc);
+ $tmp = array();
+ foreach ($signature as $key => $type) {
+ $param = new Zend_Server_Reflection_Parameter($params[$key], $type, $this->_paramDesc[$key]);
+ $param->setPosition($key);
+ $tmp[] = $param;
+ }
+
+ $this->_prototypes[] = new Zend_Server_Reflection_Prototype($return, $tmp);
+ }
+ }
+
+ /**
+ * Use code reflection to create method signatures
+ *
+ * Determines the method help/description text from the function DocBlock
+ * comment. Determines method signatures using a combination of
+ * ReflectionFunction and parsing of DocBlock @param and @return values.
+ *
+ * @param ReflectionFunction $function
+ * @return array
+ */
+ protected function _reflect()
+ {
+ $function = $this->_reflection;
+ $helpText = '';
+ $signatures = array();
+ $returnDesc = '';
+ $paramCount = $function->getNumberOfParameters();
+ $paramCountRequired = $function->getNumberOfRequiredParameters();
+ $parameters = $function->getParameters();
+ $docBlock = $function->getDocComment();
+
+ if (!empty($docBlock)) {
+ // Get help text
+ if (preg_match(':/\*\*\s*\r?\n\s*\*\s(.*?)\r?\n\s*\*(\s@|/):s', $docBlock, $matches))
+ {
+ $helpText = $matches[1];
+ $helpText = preg_replace('/(^\s*\*\s)/m', '', $helpText);
+ $helpText = preg_replace('/\r?\n\s*\*\s*(\r?\n)*/s', "\n", $helpText);
+ $helpText = trim($helpText);
+ }
+
+ // Get return type(s) and description
+ $return = 'void';
+ if (preg_match('/@return\s+(\S+)/', $docBlock, $matches)) {
+ $return = explode('|', $matches[1]);
+ if (preg_match('/@return\s+\S+\s+(.*?)(@|\*\/)/s', $docBlock, $matches))
+ {
+ $value = $matches[1];
+ $value = preg_replace('/\s?\*\s/m', '', $value);
+ $value = preg_replace('/\s{2,}/', ' ', $value);
+ $returnDesc = trim($value);
+ }
+ }
+
+ // Get param types and description
+ if (preg_match_all('/@param\s+([^\s]+)/m', $docBlock, $matches)) {
+ $paramTypesTmp = $matches[1];
+ if (preg_match_all('/@param\s+\S+\s+(\$^\S+)\s+(.*?)(@|\*\/)/s', $docBlock, $matches))
+ {
+ $paramDesc = $matches[2];
+ foreach ($paramDesc as $key => $value) {
+ $value = preg_replace('/\s?\*\s/m', '', $value);
+ $value = preg_replace('/\s{2,}/', ' ', $value);
+ $paramDesc[$key] = trim($value);
+ }
+ }
+ }
+ } else {
+ $helpText = $function->getName();
+ $return = 'void';
+ }
+
+ // Set method description
+ $this->setDescription($helpText);
+
+ // Get all param types as arrays
+ if (!isset($paramTypesTmp) && (0 < $paramCount)) {
+ $paramTypesTmp = array_fill(0, $paramCount, 'mixed');
+ } elseif (!isset($paramTypesTmp)) {
+ $paramTypesTmp = array();
+ } elseif (count($paramTypesTmp) < $paramCount) {
+ $start = $paramCount - count($paramTypesTmp);
+ for ($i = $start; $i < $paramCount; ++$i) {
+ $paramTypesTmp[$i] = 'mixed';
+ }
+ }
+
+ // Get all param descriptions as arrays
+ if (!isset($paramDesc) && (0 < $paramCount)) {
+ $paramDesc = array_fill(0, $paramCount, '');
+ } elseif (!isset($paramDesc)) {
+ $paramDesc = array();
+ } elseif (count($paramDesc) < $paramCount) {
+ $start = $paramCount - count($paramDesc);
+ for ($i = $start; $i < $paramCount; ++$i) {
+ $paramDesc[$i] = '';
+ }
+ }
+
+
+ $paramTypes = array();
+ foreach ($paramTypesTmp as $i => $param) {
+ $tmp = explode('|', $param);
+ if ($parameters[$i]->isOptional()) {
+ array_unshift($tmp, null);
+ }
+ $paramTypes[] = $tmp;
+ }
+
+ $this->_buildSignatures($return, $returnDesc, $paramTypes, $paramDesc);
+ }
+
+
+ /**
+ * Proxy reflection calls
+ *
+ * @param string $method
+ * @param array $args
+ * @return mixed
+ */
+ public function __call($method, $args)
+ {
+ if (method_exists($this->_reflection, $method)) {
+ return call_user_func_array(array($this->_reflection, $method), $args);
+ }
+
+ throw new Zend_Server_Reflection_Exception('Invalid reflection method ("' .$method. '")');
+ }
+
+ /**
+ * Retrieve configuration parameters
+ *
+ * Values are retrieved by key from {@link $_config}. Returns null if no
+ * value found.
+ *
+ * @param string $key
+ * @return mixed
+ */
+ public function __get($key)
+ {
+ if (isset($this->_config[$key])) {
+ return $this->_config[$key];
+ }
+
+ return null;
+ }
+
+ /**
+ * Set configuration parameters
+ *
+ * Values are stored by $key in {@link $_config}.
+ *
+ * @param string $key
+ * @param mixed $value
+ * @return void
+ */
+ public function __set($key, $value)
+ {
+ $this->_config[$key] = $value;
+ }
+
+ /**
+ * Set method's namespace
+ *
+ * @param string $namespace
+ * @return void
+ */
+ public function setNamespace($namespace)
+ {
+ if (empty($namespace)) {
+ $this->_namespace = '';
+ return;
+ }
+
+ if (!is_string($namespace) || !preg_match('/[a-z0-9_\.]+/i', $namespace)) {
+ throw new Zend_Server_Reflection_Exception('Invalid namespace');
+ }
+
+ $this->_namespace = $namespace;
+ }
+
+ /**
+ * Return method's namespace
+ *
+ * @return string
+ */
+ public function getNamespace()
+ {
+ return $this->_namespace;
+ }
+
+ /**
+ * Set the description
+ *
+ * @param string $string
+ * @return void
+ */
+ public function setDescription($string)
+ {
+ if (!is_string($string)) {
+ throw new Zend_Server_Reflection_Exception('Invalid description');
+ }
+
+ $this->_description = $string;
+ }
+
+ /**
+ * Retrieve the description
+ *
+ * @return void
+ */
+ public function getDescription()
+ {
+ return $this->_description;
+ }
+
+ /**
+ * Retrieve all prototypes as array of
+ * {@link Zend_Server_Reflection_Prototype Zend_Server_Reflection_Prototypes}
+ *
+ * @return array
+ */
+ public function getPrototypes()
+ {
+ return $this->_prototypes;
+ }
+
+ /**
+ * Retrieve additional invocation arguments
+ *
+ * @return array
+ */
+ public function getInvokeArguments()
+ {
+ return $this->_argv;
+ }
+
+ /**
+ * Wakeup from serialization
+ *
+ * Reflection needs explicit instantiation to work correctly. Re-instantiate
+ * reflection object on wakeup.
+ *
+ * @return void
+ */
+ public function __wakeup()
+ {
+ if ($this->_reflection instanceof ReflectionMethod) {
+ $class = new ReflectionClass($this->_class);
+ $this->_reflection = new ReflectionMethod($class->newInstance(), $this->getName());
+ } else {
+ $this->_reflection = new ReflectionFunction($this->getName());
+ }
+ }
+}
diff --git a/libs/Zend/Server/Reflection/Method.php b/libs/Zend/Server/Reflection/Method.php
new file mode 100755
index 0000000000..5eab209dad
--- /dev/null
+++ b/libs/Zend/Server/Reflection/Method.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Server_Reflection_Function_Abstract
+ */
+require_once 'Zend/Server/Reflection/Function/Abstract.php';
+
+/**
+ * Method Reflection
+ *
+ * @uses Zend_Server_Reflection_Function_Abstract
+ * @category Zend
+ * @package Zend_Server
+ * @subpackage Reflection
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Method.php 2815 2007-01-16 01:42:33Z bkarwin $
+ */
+class Zend_Server_Reflection_Method extends Zend_Server_Reflection_Function_Abstract
+{
+ /**
+ * Parent class name
+ * @var string
+ */
+ protected $_class;
+
+ /**
+ * Parent class reflection
+ * @var Zend_Server_Reflection_Class
+ */
+ protected $_classReflection;
+
+ /**
+ * Constructor
+ *
+ * @param Zend_Server_Reflection_Class $class
+ * @param ReflectionMethod $r
+ * @param string $namespace
+ * @param array $argv
+ * @return void
+ */
+ public function __construct(Zend_Server_Reflection_Class $class, ReflectionMethod $r, $namespace = null, $argv = array())
+ {
+ $this->_classReflection = $class;
+ $this->_reflection = $r;
+
+ $classNamespace = $class->getNamespace();
+
+ // Determine namespace
+ if (!empty($namespace)) {
+ $this->setNamespace($namespace);
+ } elseif (!empty($classNamespace)) {
+ $this->setNamespace($classNamespace);
+ }
+
+ // Determine arguments
+ if (is_array($argv)) {
+ $this->_argv = $argv;
+ }
+
+ // If method call, need to store some info on the class
+ $this->_class = $class->getName();
+
+ // Perform some introspection
+ $this->_reflect();
+ }
+
+ /**
+ * Return the reflection for the class that defines this method
+ *
+ * @return Zend_Server_Reflection_Class
+ */
+ public function getDeclaringClass()
+ {
+ return $this->_classReflection;
+ }
+
+ /**
+ * Wakeup from serialization
+ *
+ * Reflection needs explicit instantiation to work correctly. Re-instantiate
+ * reflection object on wakeup.
+ *
+ * @return void
+ */
+ public function __wakeup()
+ {
+ $this->_classReflection = new Zend_Server_Reflection_Class(new ReflectionClass($this->_class), $this->getNamespace(), $this->getInvokeArguments());
+ $this->_reflection = new ReflectionMethod($this->_classReflection->getName(), $this->getName());
+ }
+
+}
diff --git a/libs/Zend/Server/Reflection/Node.php b/libs/Zend/Server/Reflection/Node.php
new file mode 100755
index 0000000000..94619250fb
--- /dev/null
+++ b/libs/Zend/Server/Reflection/Node.php
@@ -0,0 +1,201 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Node Tree class for Zend_Server reflection operations
+ *
+ * @category Zend
+ * @package Zend_Server
+ * @subpackage Reflection
+ * @version $Id: Node.php 2815 2007-01-16 01:42:33Z bkarwin $
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Server_Reflection_Node
+{
+ /**
+ * Node value
+ * @var mixed
+ */
+ protected $_value = null;
+
+ /**
+ * Array of child nodes (if any)
+ * @var array
+ */
+ protected $_children = array();
+
+ /**
+ * Parent node (if any)
+ * @var Zend_Server_Reflection_Node
+ */
+ protected $_parent = null;
+
+ /**
+ * Constructor
+ *
+ * @param mixed $value
+ * @param Zend_Server_Reflection_Node $parent Optional
+ * @return Zend_Server_Reflection_Node
+ */
+ public function __construct($value, Zend_Server_Reflection_Node $parent = null)
+ {
+ $this->_value = $value;
+ if (null !== $parent) {
+ $this->setParent($parent, true);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Set parent node
+ *
+ * @param Zend_Server_Reflection_Node $node
+ * @param boolean $new Whether or not the child node is newly created
+ * and should always be attached
+ * @return void
+ */
+ public function setParent(Zend_Server_Reflection_Node $node, $new = false)
+ {
+ $this->_parent = $node;
+
+ if ($new) {
+ $node->attachChild($this);
+ return;
+ }
+ }
+
+ /**
+ * Create and attach a new child node
+ *
+ * @param mixed $value
+ * @access public
+ * @return Zend_Server_Reflection_Node New child node
+ */
+ public function createChild($value)
+ {
+ $child = new self($value, $this);
+
+ return $child;
+ }
+
+ /**
+ * Attach a child node
+ *
+ * @param Zend_Server_Reflection_Node $node
+ * @return void
+ */
+ public function attachChild(Zend_Server_Reflection_Node $node)
+ {
+ $this->_children[] = $node;
+
+ if ($node->getParent() !== $this) {
+ $node->setParent($this);
+ }
+ }
+
+ /**
+ * Return an array of all child nodes
+ *
+ * @return array
+ */
+ public function getChildren()
+ {
+ return $this->_children;
+ }
+
+ /**
+ * Does this node have children?
+ *
+ * @return boolean
+ */
+ public function hasChildren()
+ {
+ return count($this->_children) > 0;
+ }
+
+ /**
+ * Return the parent node
+ *
+ * @return null|Zend_Server_Reflection_Node
+ */
+ public function getParent()
+ {
+ return $this->_parent;
+ }
+
+ /**
+ * Return the node's current value
+ *
+ * @return mixed
+ */
+ public function getValue()
+ {
+ return $this->_value;
+ }
+
+ /**
+ * Set the node value
+ *
+ * @param mixed $value
+ * @return void
+ */
+ public function setValue($value)
+ {
+ $this->_value = $value;
+ }
+
+ /**
+ * Retrieve the bottommost nodes of this node's tree
+ *
+ * Retrieves the bottommost nodes of the tree by recursively calling
+ * getEndPoints() on all children. If a child is null, it returns the parent
+ * as an end point.
+ *
+ * @return array
+ */
+ public function getEndPoints()
+ {
+ $endPoints = array();
+ if (!$this->hasChildren()) {
+ return $endPoints;
+ }
+
+ foreach ($this->_children as $child) {
+ $value = $child->getValue();
+
+ if (null === $value) {
+ $endPoints[] = $this;
+ } elseif ((null !== $value)
+ && $child->hasChildren())
+ {
+ $childEndPoints = $child->getEndPoints();
+ if (!empty($childEndPoints)) {
+ $endPoints = array_merge($endPoints, $childEndPoints);
+ }
+ } elseif ((null !== $value) && !$child->hasChildren()) {
+ $endPoints[] = $child;
+ }
+ }
+
+ return $endPoints;
+ }
+}
diff --git a/libs/Zend/Server/Reflection/Parameter.php b/libs/Zend/Server/Reflection/Parameter.php
new file mode 100755
index 0000000000..f1609151d8
--- /dev/null
+++ b/libs/Zend/Server/Reflection/Parameter.php
@@ -0,0 +1,163 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Server_Reflection_Exception
+ */
+require_once 'Zend/Server/Reflection/Exception.php';
+
+/**
+ * Parameter Reflection
+ *
+ * Decorates a ReflectionParameter to allow setting the parameter type
+ *
+ * @category Zend
+ * @package Zend_Server
+ * @subpackage Reflection
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Parameter.php 2815 2007-01-16 01:42:33Z bkarwin $
+ */
+class Zend_Server_Reflection_Parameter
+{
+ /**
+ * @var ReflectionParameter
+ */
+ protected $_reflection;
+
+ /**
+ * Parameter position
+ * @var int
+ */
+ protected $_position;
+
+ /**
+ * Parameter type
+ * @var string
+ */
+ protected $_type;
+
+ /**
+ * Parameter description
+ * @var string
+ */
+ protected $_description;
+
+ /**
+ * Constructor
+ *
+ * @param ReflectionParameter $r
+ * @param string $type Parameter type
+ * @param string $description Parameter description
+ */
+ public function __construct(ReflectionParameter $r, $type = 'mixed', $description = '')
+ {
+ $this->_reflection = $r;
+ $this->setType($type);
+ $this->setDescription($description);
+ }
+
+ /**
+ * Proxy reflection calls
+ *
+ * @param string $method
+ * @param array $args
+ * @return mixed
+ */
+ public function __call($method, $args)
+ {
+ if (method_exists($this->_reflection, $method)) {
+ return call_user_func_array(array($this->_reflection, $method), $args);
+ }
+
+ throw new Zend_Server_Reflection_Exception('Invalid reflection method');
+ }
+
+ /**
+ * Retrieve parameter type
+ *
+ * @return string
+ */
+ public function getType()
+ {
+ return $this->_type;
+ }
+
+ /**
+ * Set parameter type
+ *
+ * @param string|null $type
+ * @return void
+ */
+ public function setType($type)
+ {
+ if (!is_string($type) && (null !== $type)) {
+ throw new Zend_Server_Reflection_Exception('Invalid parameter type');
+ }
+
+ $this->_type = $type;
+ }
+
+ /**
+ * Retrieve parameter description
+ *
+ * @return string
+ */
+ public function getDescription()
+ {
+ return $this->_description;
+ }
+
+ /**
+ * Set parameter description
+ *
+ * @param string|null $description
+ * @return void
+ */
+ public function setDescription($description)
+ {
+ if (!is_string($description) && (null !== $description)) {
+ throw new Zend_Server_Reflection_Exception('Invalid parameter description');
+ }
+
+ $this->_description = $description;
+ }
+
+ /**
+ * Set parameter position
+ *
+ * @param int $index
+ * @return void
+ */
+ public function setPosition($index)
+ {
+ $this->_position = (int) $index;
+ }
+
+ /**
+ * Return parameter position
+ *
+ * @return int
+ */
+ public function getPosition()
+ {
+ return $this->_position;
+ }
+}
diff --git a/libs/Zend/Server/Reflection/Prototype.php b/libs/Zend/Server/Reflection/Prototype.php
new file mode 100755
index 0000000000..4549ebbea1
--- /dev/null
+++ b/libs/Zend/Server/Reflection/Prototype.php
@@ -0,0 +1,106 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Server_Reflection_Exception
+ */
+require_once 'Zend/Server/Reflection/Exception.php';
+
+/**
+ * Zend_Server_Reflection_ReturnValue
+ */
+require_once 'Zend/Server/Reflection/ReturnValue.php';
+
+/**
+ * Zend_Server_Reflection_Parameter
+ */
+require_once 'Zend/Server/Reflection/Parameter.php';
+
+/**
+ * Method/Function prototypes
+ *
+ * Contains accessors for the return value and all method arguments.
+ *
+ * @category Zend
+ * @package Zend_Server
+ * @subpackage Reflection
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Prototype.php 2815 2007-01-16 01:42:33Z bkarwin $
+ */
+class Zend_Server_Reflection_Prototype
+{
+ /**
+ * Constructor
+ *
+ * @param Zend_Server_Reflection_ReturnValue $return
+ * @param array $params
+ * @return void
+ */
+ public function __construct(Zend_Server_Reflection_ReturnValue $return, $params = null)
+ {
+ $this->_return = $return;
+
+ if (!is_array($params) && (null !== $params)) {
+ throw new Zend_Server_Reflection_Exception('Invalid parameters');
+ }
+
+ if (is_array($params)) {
+ foreach ($params as $param) {
+ if (!$param instanceof Zend_Server_Reflection_Parameter) {
+ throw new Zend_Server_Reflection_Exception('One or more params are invalid');
+ }
+ }
+ }
+
+ $this->_params = $params;
+ }
+
+ /**
+ * Retrieve return type
+ *
+ * @return string
+ */
+ public function getReturnType()
+ {
+ return $this->_return->getType();
+ }
+
+ /**
+ * Retrieve the return value object
+ *
+ * @access public
+ * @return Zend_Server_Reflection_ReturnValue
+ */
+ public function getReturnValue()
+ {
+ return $this->_return;
+ }
+
+ /**
+ * Retrieve method parameters
+ *
+ * @return array Array of {@link Zend_Server_Reflection_Parameter}s
+ */
+ public function getParameters()
+ {
+ return $this->_params;
+ }
+}
diff --git a/libs/Zend/Server/Reflection/ReturnValue.php b/libs/Zend/Server/Reflection/ReturnValue.php
new file mode 100755
index 0000000000..9be3df2236
--- /dev/null
+++ b/libs/Zend/Server/Reflection/ReturnValue.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_Server_Reflection_Exception
+ */
+require_once 'Zend/Server/Reflection/Exception.php';
+
+/**
+ * Return value reflection
+ *
+ * Stores the return value type and description
+ *
+ * @category Zend
+ * @package Zend_Server
+ * @subpackage Reflection
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: ReturnValue.php 2815 2007-01-16 01:42:33Z bkarwin $
+ */
+class Zend_Server_Reflection_ReturnValue
+{
+ /**
+ * Return value type
+ * @var string
+ */
+ protected $_type;
+
+ /**
+ * Return value description
+ * @var string
+ */
+ protected $_description;
+
+ /**
+ * Constructor
+ *
+ * @param string $type Return value type
+ * @param string $description Return value type
+ */
+ public function __construct($type = 'mixed', $description = '')
+ {
+ $this->setType($type);
+ $this->setDescription($description);
+ }
+
+ /**
+ * Retrieve parameter type
+ *
+ * @return string
+ */
+ public function getType()
+ {
+ return $this->_type;
+ }
+
+ /**
+ * Set parameter type
+ *
+ * @param string|null $type
+ * @return void
+ */
+ public function setType($type)
+ {
+ if (!is_string($type) && (null !== $type)) {
+ throw new Zend_Server_Reflection_Exception('Invalid parameter type');
+ }
+
+ $this->_type = $type;
+ }
+
+ /**
+ * Retrieve parameter description
+ *
+ * @return string
+ */
+ public function getDescription()
+ {
+ return $this->_description;
+ }
+
+ /**
+ * Set parameter description
+ *
+ * @param string|null $description
+ * @return void
+ */
+ public function setDescription($description)
+ {
+ if (!is_string($description) && (null !== $description)) {
+ throw new Zend_Server_Reflection_Exception('Invalid parameter description');
+ }
+
+ $this->_description = $description;
+ }
+}
diff --git a/libs/Zend/Session.php b/libs/Zend/Session.php
new file mode 100755
index 0000000000..4ea8ce64a3
--- /dev/null
+++ b/libs/Zend/Session.php
@@ -0,0 +1,743 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Session.php 5500 2007-06-29 14:39:50Z darby $
+ * @since Preview Release 0.2
+ */
+
+
+/**
+ * @see Zend_Session_Abstract
+ */
+require_once 'Zend/Session/Abstract.php';
+
+/**
+ * @see Zend_Session_Namespace
+ */
+require_once 'Zend/Session/Namespace.php';
+
+/**
+ * @see Zend_Session_Exception
+ */
+require_once 'Zend/Session/Exception.php';
+
+/**
+ * @see Zend_Session_SaveHandler_Interface
+ */
+require_once 'Zend/Session/SaveHandler/Interface.php';
+
+
+/**
+ * Zend_Session
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Session extends Zend_Session_Abstract
+{
+ /**
+ * Check whether or not the session was started
+ *
+ * @var bool
+ */
+ private static $_sessionStarted = false;
+
+ /**
+ * Whether or not the session id has been regenerated this request.
+ *
+ * Id regeneration state
+ * <0 - regenerate requested when session is started
+ * 0 - do nothing
+ * >0 - already called session_regenerate_id()
+ *
+ * @var int
+ */
+ private static $_regenerateIdState = 0;
+
+ /**
+ * Private list of php's ini values for ext/session
+ * null values will default to the php.ini value, otherwise
+ * the value below will overwrite the default ini value, unless
+ * the user has set an option explicity with setOptions()
+ *
+ * @var array
+ */
+ private static $_defaultOptions = array(
+ 'save_path' => null,
+ 'name' => null, /* this should be set to a unique value for each application */
+ 'save_handler' => null,
+ //'auto_start' => null, /* intentionally excluded (see manual) */
+ 'gc_probability' => null,
+ 'gc_divisor' => null,
+ 'gc_maxlifetime' => null,
+ 'serialize_handler' => null,
+ 'cookie_lifetime' => null,
+ 'cookie_path' => null,
+ 'cookie_domain' => null,
+ 'cookie_secure' => null,
+ 'use_cookies' => null,
+ 'use_only_cookies' => 'on',
+ 'referer_check' => null,
+ 'entropy_file' => null,
+ 'entropy_length' => null,
+ 'cache_limiter' => null,
+ 'cache_expire' => null,
+ 'use_trans_sid' => null,
+ 'bug_compat_42' => null,
+ 'bug_compat_warn' => null,
+ 'hash_function' => null,
+ 'hash_bits_per_character' => null
+ );
+
+ /**
+ * List of options pertaining to Zend_Session that can be set by developers
+ * using Zend_Session::setOptions(). This list intentionally duplicates
+ * the individual declaration of static "class" variables by the same names.
+ *
+ * @var array
+ */
+ private static $_localOptions = array(
+ 'strict' => '_strict',
+ 'remember_me_seconds' => '_rememberMeSeconds'
+ );
+
+ /**
+ * Whether or not write close has been performed.
+ *
+ * @var bool
+ */
+ private static $_writeClosed = false;
+
+ /**
+ * Whether or not session id cookie has been deleted
+ *
+ * @var bool
+ */
+ private static $_sessionCookieDeleted = false;
+
+ /**
+ * Whether or not session has been destroyed via session_destroy()
+ *
+ * @var bool
+ */
+ private static $_destroyed = false;
+
+ /**
+ * Whether or not session must be initiated before usage
+ *
+ * @var bool
+ */
+ private static $_strict = false;
+
+ /**
+ * Default number of seconds the session will be remembered for when asked to be remembered
+ *
+ * @var int
+ */
+ private static $_rememberMeSeconds = 1209600; // 2 weeks
+
+ /**
+ * Whether the default options listed in Zend_Session::$_localOptions have been set
+ *
+ * @var bool
+ */
+ private static $_defaultOptionsSet = false;
+
+
+ /**
+ * Constructor overriding - make sure that a developer cannot instantiate
+ */
+ private function __construct()
+ {
+ }
+
+
+ /**
+ * setOptions - set both the class specified
+ *
+ * @param array $userOptions - pass-by-keyword style array of <option name, option value> pairs
+ * @throws Zend_Session_Exception
+ * @return void
+ */
+ public static function setOptions(array $userOptions = array())
+ {
+ // set default options on first run only (before applying user settings)
+ if (!self::$_defaultOptionsSet) {
+ foreach (self::$_defaultOptions as $defaultOptionName => $defaultOptionValue) {
+ if (isset(self::$_defaultOptions[$defaultOptionName])) {
+ ini_set("session.$defaultOptionName", $defaultOptionValue);
+ }
+ }
+
+ self::$_defaultOptionsSet = true;
+ }
+
+ // set the options the user has requested to set
+ foreach ($userOptions as $userOptionName => $userOptionValue) {
+
+ $userOptionName = strtolower($userOptionName);
+
+ // set the ini based values
+ if (array_key_exists($userOptionName, self::$_defaultOptions)) {
+ ini_set("session.$userOptionName", $userOptionValue);
+ }
+ elseif (isset(self::$_localOptions[$userOptionName])) {
+ self::${self::$_localOptions[$userOptionName]} = $userOptionValue;
+ }
+ else {
+ throw new Zend_Session_Exception("Unknown option: $userOptionName = $userOptionValue");
+ }
+ }
+ }
+
+
+ /**
+ * setSaveHandler() - Session Save Handler assignment
+ *
+ * @param Zend_Session_SaveHandler_Interface $interface
+ * @return void
+ */
+ public static function setSaveHandler(Zend_Session_SaveHandler_Interface $interface)
+ {
+ session_set_save_handler(
+ array(&$interface, 'open'),
+ array(&$interface, 'close'),
+ array(&$interface, 'read'),
+ array(&$interface, 'write'),
+ array(&$interface, 'destroy'),
+ array(&$interface, 'gc')
+ );
+ }
+
+
+ /**
+ * regenerateId() - Regenerate the session id. Best practice is to call this after
+ * session is started. If called prior to session starting, session id will be regenerated
+ * at start time.
+ *
+ * @throws Zend_Session_Exception
+ * @return void
+ */
+ public static function regenerateId()
+ {
+ if (headers_sent($filename, $linenum)) {
+ throw new Zend_Session_Exception("You must call " . __CLASS__ . '::' . __FUNCTION__ .
+ "() before any output has been sent to the browser; output started in {$filename}/{$linenum}");
+ }
+
+ if (self::$_sessionStarted && self::$_regenerateIdState <= 0) {
+ session_regenerate_id(true);
+ self::$_regenerateIdState = 1;
+ } else {
+ /**
+ * @todo If we can detect that this requester had no session previously,
+ * then why regenerate the id before the session has started?
+ * Feedback wanted for:
+ //
+ if (isset($_COOKIE[session_name()]) || (!use only cookies && isset($_REQUEST[session_name()]))) {
+ self::$_regenerateIdState = 1;
+ } else {
+ self::$_regenerateIdState = -1;
+ }
+ //*/
+ self::$_regenerateIdState = -1;
+ }
+ }
+
+
+ /**
+ * rememberMe() - Write a persistent cookie that expires after a number of seconds in the future. If no number of
+ * seconds is specified, then this defaults to self::$_rememberMeSeconds. Due to clock errors on end users' systems,
+ * large values are recommended to avoid undesirable expiration of session cookies.
+ *
+ * @param $seconds integer - OPTIONAL specifies TTL for cookie in seconds from present time
+ * @return void
+ */
+ public static function rememberMe($seconds = null)
+ {
+ $seconds = (int) $seconds;
+ $seconds = ($seconds > 0) ? $seconds : self::$_rememberMeSeconds;
+
+ self::rememberUntil($seconds);
+ }
+
+
+ /**
+ * forgetMe() - Write a volatile session cookie, removing any persistent cookie that may have existed. The session
+ * would end upon, for example, termination of a web browser program.
+ *
+ * @return void
+ */
+ public static function forgetMe()
+ {
+ self::rememberUntil(0);
+ }
+
+
+ /**
+ * rememberUntil() - This method does the work of changing the state of the session cookie and making
+ * sure that it gets resent to the browser via regenerateId()
+ *
+ * @param int $seconds
+ * @return void
+ */
+ public static function rememberUntil($seconds = 0)
+ {
+ $cookieParams = session_get_cookie_params();
+
+ session_set_cookie_params(
+ $seconds,
+ $cookieParams['path'],
+ $cookieParams['domain'],
+ $cookieParams['secure']
+ );
+
+ // normally "rememberMe()" represents a security context change, so should use new session id
+ self::regenerateId();
+ }
+
+
+ /**
+ * sessionExists() - whether or not a session exists for the current request
+ *
+ * @return bool
+ */
+ public static function sessionExists()
+ {
+ if (ini_get('session.use_cookies') == '1' && isset($_COOKIE[session_name()])) {
+ return true;
+ } elseif (!empty($_REQUEST[session_name()])) {
+ return true;
+ }
+
+ return false;
+ }
+
+
+ /**
+ * start() - Start the session.
+ *
+ * @param bool|array $options OPTIONAL Either user supplied options, or flag indicating if start initiated automatically
+ * @throws Zend_Session_Exception
+ * @return void
+ */
+ public static function start($options = false)
+ {
+ if (self::$_sessionStarted) {
+ return; // already started
+ }
+
+ // make sure our default options (at the least) have been set
+ if (!self::$_defaultOptionsSet) {
+ self::setOptions(is_array($options) ? $options : array());
+ }
+
+ // In strict mode, do not allow auto-starting Zend_Session, such as via "new Zend_Session_Namespace()"
+ if (self::$_strict && $options === true) {
+ throw new Zend_Session_Exception('You must explicitly start the session with Zend_Session::start() when session options are set to strict.');
+ }
+
+ if (headers_sent($filename, $linenum)) {
+ throw new Zend_Session_Exception("Session must be started before any output has been sent to the browser;"
+ . " output started in {$filename}/{$linenum}");
+ }
+
+ // See http://www.php.net/manual/en/ref.session.php for explanation
+ if (defined('SID')) {
+ throw new Zend_Session_Exception('session has already been started by session.auto-start or session_start()');
+ }
+
+ /**
+ * Hack to throw exceptions on start instead of php errors
+ * @see http://framework.zend.com/issues/browse/ZF-1325
+ */
+ set_error_handler(array('Zend_Session_Exception', 'handleSessionStartError'), E_ALL);
+ session_start();
+ restore_error_handler();
+ if (Zend_Session_Exception::$sessionStartError !== null) {
+ set_error_handler(array('Zend_Session_Exception', 'handleSilentWriteClose'), E_ALL);
+ session_write_close();
+ restore_error_handler();
+ throw new Zend_Session_Exception(__CLASS__ . '::' . __FUNCTION__ . '() - ' . Zend_Session_Exception::$sessionStartError);
+ }
+
+ parent::$_readable = true;
+ parent::$_writable = true;
+ self::$_sessionStarted = true;
+ if (self::$_regenerateIdState === -1) {
+ self::regenerateId();
+ }
+
+ // run validators if they exist
+ if (isset($_SESSION['__ZF']['VALID'])) {
+ self::_processValidators();
+ }
+
+ self::_processStartupMetadataGlobal();
+ }
+
+
+ /**
+ * _processGlobalMetadata() - this method initizes the sessions GLOBAL
+ * metadata, mostly global data expiration calculations.
+ *
+ * @return void
+ */
+ private static function _processStartupMetadataGlobal()
+ {
+ // process global metadata
+ if (isset($_SESSION['__ZF'])) {
+
+ // expire globally expired values
+ foreach ($_SESSION['__ZF'] as $namespace => $namespace_metadata) {
+
+ // Expire Namespace by Time (ENT)
+ if (isset($namespace_metadata['ENT']) && ($namespace_metadata['ENT'] > 0) && (time() > $namespace_metadata['ENT']) ) {
+ unset($_SESSION[$namespace]);
+ unset($_SESSION['__ZF'][$namespace]['ENT']);
+ }
+
+ // Expire Namespace by Global Hop (ENGH)
+ if (isset($namespace_metadata['ENGH']) && $namespace_metadata['ENGH'] >= 1) {
+ $_SESSION['__ZF'][$namespace]['ENGH']--;
+
+ if ($_SESSION['__ZF'][$namespace]['ENGH'] === 0) {
+ if (isset($_SESSION[$namespace])) {
+ parent::$_expiringData[$namespace] = $_SESSION[$namespace];
+ unset($_SESSION[$namespace]);
+ }
+ unset($_SESSION['__ZF'][$namespace]['ENGH']);
+ }
+ }
+
+ // Expire Namespace Variables by Time (ENVT)
+ if (isset($namespace_metadata['ENVT'])) {
+ foreach ($namespace_metadata['ENVT'] as $variable => $time) {
+ if (time() > $time) {
+ unset($_SESSION[$namespace][$variable]);
+ unset($_SESSION['__ZF'][$namespace]['ENVT'][$variable]);
+
+ if (empty($_SESSION['__ZF'][$namespace]['ENVT'])) {
+ unset($_SESSION['__ZF'][$namespace]['ENVT']);
+ }
+ }
+ }
+ }
+
+ // Expire Namespace Variables by Global Hop (ENVGH)
+ if (isset($namespace_metadata['ENVGH'])) {
+ foreach ($namespace_metadata['ENVGH'] as $variable => $hops) {
+ $_SESSION['__ZF'][$namespace]['ENVGH'][$variable]--;
+
+ if ($_SESSION['__ZF'][$namespace]['ENVGH'][$variable] === 0) {
+ if (isset($_SESSION[$namespace][$variable])) {
+ parent::$_expiringData[$namespace][$variable] = $_SESSION[$namespace][$variable];
+ unset($_SESSION[$namespace][$variable]);
+ }
+ unset($_SESSION['__ZF'][$namespace]['ENVGH'][$variable]);
+ }
+ }
+ }
+ }
+
+ if (empty($_SESSION['__ZF'][$namespace])) {
+ unset($_SESSION['__ZF'][$namespace]);
+ }
+
+ }
+
+ if (empty($_SESSION['__ZF'])) {
+ unset($_SESSION['__ZF']);
+ }
+ }
+
+
+ /**
+ * isStarted() - convenience method to determine if the session is already started.
+ *
+ * @return bool
+ */
+ public static function isStarted()
+ {
+ return self::$_sessionStarted;
+ }
+
+
+ /**
+ * isRegenerated() - convenience method to determine if session_regenerate_id()
+ * has been called during this request by Zend_Session.
+ *
+ * @return bool
+ */
+ public static function isRegenerated()
+ {
+ return ( (self::$_regenerateIdState > 0) ? true : false );
+ }
+
+
+ /**
+ * getId() - get the current session id
+ *
+ * @return string
+ */
+ public static function getId()
+ {
+ return session_id();
+ }
+
+
+ /**
+ * setId() - set an id to a user specified id
+ *
+ * @throws Zend_Session_Exception
+ * @param string $id
+ * @return void
+ */
+ public static function setId($id)
+ {
+ if (defined('SID')) {
+ throw new Zend_Session_Exception('The session has already been started. The session id must be set first.');
+ }
+
+ if (headers_sent($filename, $linenum)) {
+ throw new Zend_Session_Exception("You must call ".__CLASS__.'::'.__FUNCTION__.
+ "() before any output has been sent to the browser; output started in {$filename}/{$linenum}");
+ }
+
+ if (!is_string($id) || $id === '') {
+ throw new Zend_Session_Exception('You must provide a non-empty string as a session identifier.');
+ }
+
+ session_id($id);
+ }
+
+
+ /**
+ * registerValidator() - register a validator that will attempt to validate this session for
+ * every future request
+ *
+ * @param Zend_Session_Validator_Interface $validator
+ * @return void
+ */
+ public static function registerValidator(Zend_Session_Validator_Interface $validator)
+ {
+ $validator->setup();
+ }
+
+
+ /**
+ * stop() - Disable write access. Optionally disable read (not implemented).
+ *
+ * @return void
+ */
+ public static function stop()
+ {
+ parent::$_writable = false;
+ }
+
+
+ /**
+ * writeClose() - Shutdown the sesssion, close writing and detach $_SESSION from the back-end storage mechanism.
+ * This will complete the internal data transformation on this request.
+ *
+ * @param bool $readonly - OPTIONAL remove write access (i.e. throw error if Zend_Session's attempt writes)
+ * @return void
+ */
+ public static function writeClose($readonly = true)
+ {
+ if (self::$_writeClosed) {
+ return;
+ }
+
+ if ($readonly) {
+ parent::$_writable = false;
+ }
+
+ session_write_close();
+ self::$_writeClosed = true;
+ }
+
+
+ /**
+ * destroy() - This is used to destroy session data, and optionally, the session cookie itself
+ *
+ * @param bool $remove_cookie - OPTIONAL remove session id cookie, defaults to true (remove cookie)
+ * @param bool $readonly - OPTIONAL remove write access (i.e. throw error if Zend_Session's attempt writes)
+ * @return void
+ */
+ public static function destroy($remove_cookie = true, $readonly = true)
+ {
+ if (self::$_destroyed) {
+ return;
+ }
+
+ if ($readonly) {
+ parent::$_writable = false;
+ }
+
+ session_destroy();
+ self::$_destroyed = true;
+
+ if ($remove_cookie) {
+ self::expireSessionCookie();
+ }
+ }
+
+
+ /**
+ * expireSessionCookie() - Sends an expired session id cookie, causing the client to delete the session cookie
+ *
+ * @return void
+ */
+ public static function expireSessionCookie()
+ {
+ if (self::$_sessionCookieDeleted) {
+ return;
+ }
+
+ self::$_sessionCookieDeleted = true;
+
+ if (isset($_COOKIE[session_name()])) {
+ $cookie_params = session_get_cookie_params();
+
+ setcookie(
+ session_name(),
+ false,
+ 315554400, // strtotime('1980-01-01'),
+ $cookie_params['path'],
+ $cookie_params['domain'],
+ $cookie_params['secure']
+ );
+ }
+ }
+
+
+ /**
+ * _processValidator() - internal function that is called in the existence of VALID metadata
+ *
+ * @throws Zend_Session_Exception
+ * @return void
+ */
+ private static function _processValidators()
+ {
+ if (count($_SESSION['__ZF']['VALID']) > 0) {
+ /**
+ * @see Zend_Loader
+ */
+ require_once 'Zend/Loader.php';
+ }
+
+ foreach ($_SESSION['__ZF']['VALID'] as $validator_name => $valid_data) {
+ Zend_Loader::loadClass($validator_name);
+ $validator = new $validator_name;
+ if ($validator->validate() === false) {
+ throw new Zend_Session_Exception("This session is not valid according to {$validator_name}.");
+ }
+ }
+ }
+
+
+ /**
+ * namespaceIsset() - check to see if a namespace is set
+ *
+ * @param string $namespace
+ * @return bool
+ */
+ public static function namespaceIsset($namespace)
+ {
+ return parent::_namespaceIsset($namespace);
+ }
+
+
+ /**
+ * namespaceUnset() - unset a namespace or a variable within a namespace
+ *
+ * @param string $namespace
+ * @throws Zend_Session_Exception
+ * @return void
+ */
+ public static function namespaceUnset($namespace)
+ {
+ parent::_namespaceUnset($namespace);
+ }
+
+
+ /**
+ * namespaceGet() - get all variables in a namespace
+ * Deprecated: Use getIterator() in Zend_Session_Namespace.
+ *
+ * @param string $namespace
+ * @return array
+ */
+ public static function namespaceGet($namespace)
+ {
+ return parent::_namespaceGetAll($namespace);
+ }
+
+
+ /**
+ * getIterator() - return an iteratable object for use in foreach and the like,
+ * this completes the IteratorAggregate interface
+ *
+ * @return ArrayObject
+ */
+ public static function getIterator()
+ {
+ if (parent::$_readable === false) {
+ throw new Zend_Session_Exception(parent::_THROW_NOT_READABLE_MSG);
+ }
+
+ $spaces = array();
+ if (isset($_SESSION)) {
+ $spaces = array_keys($_SESSION);
+ foreach($spaces as $key => $space) {
+ if (!strncmp($space, '__', 2) || !is_array($_SESSION[$space])) {
+ unset($spaces[$key]);
+ }
+ }
+ }
+
+ return new ArrayObject(array_merge($spaces, array_keys(parent::$_expiringData)));
+ }
+
+
+ /**
+ * isWritable() - returns a boolean indicating if namespaces can write (use setters)
+ *
+ * @return bool
+ */
+ public static function isWritable()
+ {
+ return parent::$_writable;
+ }
+
+
+ /**
+ * isReadable() - returns a boolean indicating if namespaces can write (use setters)
+ *
+ * @return bool
+ */
+ public static function isReadable()
+ {
+ return parent::$_readable;
+ }
+
+}
diff --git a/libs/Zend/Session/Abstract.php b/libs/Zend/Session/Abstract.php
new file mode 100755
index 0000000000..0e26374672
--- /dev/null
+++ b/libs/Zend/Session/Abstract.php
@@ -0,0 +1,185 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Abstract.php 4773 2007-05-09 19:33:10Z darby $
+ * @since Preview Release 0.2
+ */
+
+
+/**
+ * Zend_Session_Abstract
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Session_Abstract
+{
+ /**
+ * Whether or not session permits writing (modification of $_SESSION[])
+ *
+ * @var bool
+ */
+ protected static $_writable = false;
+
+ /**
+ * Whether or not session permits reading (reading data in $_SESSION[])
+ *
+ * @var bool
+ */
+ protected static $_readable = false;
+
+ /**
+ * Since expiring data is handled at startup to avoid __destruct difficulties,
+ * the data that will be expiring at end of this request is held here
+ *
+ * @var array
+ */
+ protected static $_expiringData = array();
+
+
+ /**
+ * Error message thrown when an action requires modification,
+ * but current Zend_Session has been marked as read-only.
+ */
+ const _THROW_NOT_WRITABLE_MSG = 'Zend_Session is currently marked as read-only.';
+
+
+ /**
+ * Error message thrown when an action requires reading session data,
+ * but current Zend_Session is not marked as readable.
+ */
+ const _THROW_NOT_READABLE_MSG = 'Zend_Session is not marked as readable.';
+
+
+ /**
+ * namespaceIsset() - check to see if a namespace or a variable within a namespace is set
+ *
+ * @param string $namespace
+ * @param string $name
+ * @return bool
+ */
+ protected static function _namespaceIsset($namespace, $name = null)
+ {
+ if (self::$_readable === false) {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception(self::_THROW_NOT_READABLE_MSG);
+ }
+
+ if ($name === null) {
+ return ( isset($_SESSION[$namespace]) || isset(self::$_expiringData[$namespace]) );
+ } else {
+ return ( isset($_SESSION[$namespace][$name]) || isset(self::$_expiringData[$namespace][$name]) );
+ }
+ }
+
+
+ /**
+ * namespaceUnset() - unset a namespace or a variable within a namespace
+ *
+ * @param string $namespace
+ * @param string $name
+ * @throws Zend_Session_Exception
+ * @return void
+ */
+ protected static function _namespaceUnset($namespace, $name = null)
+ {
+ if (self::$_writable === false) {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception(self::_THROW_NOT_WRITABLE_MSG);
+ }
+
+ $name = (string) $name;
+
+ // check to see if the api wanted to remove a var from a namespace or a namespace
+ if ($name === '') {
+ unset($_SESSION[$namespace]);
+ unset(self::$_expiringData[$namespace]);
+ } else {
+ unset($_SESSION[$namespace][$name]);
+ unset(self::$_expiringData[$namespace]);
+ }
+
+ // if we remove the last value, remove namespace.
+ if (empty($_SESSION[$namespace])) {
+ unset($_SESSION[$namespace]);
+ }
+ }
+
+
+ /**
+ * namespaceGet() - Get $name variable from $namespace, returning by reference.
+ *
+ * @param string $namespace
+ * @param string $name
+ * @return mixed
+ */
+ protected static function & _namespaceGet($namespace, $name = null)
+ {
+ if (self::$_readable === false) {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception(self::_THROW_NOT_READABLE_MSG);
+ }
+
+ if ($name === null) {
+ if (isset($_SESSION[$namespace])) { // check session first for data requested
+ return $_SESSION[$namespace];
+ } elseif (isset(self::$_expiringData[$namespace])) { // check expiring data for data reqeusted
+ return self::$_expiringData[$namespace];
+ } else {
+ return $_SESSION[$namespace]; // satisfy return by reference
+ }
+ } else {
+ if (isset($_SESSION[$namespace][$name])) { // check session first
+ return $_SESSION[$namespace][$name];
+ } elseif (isset(self::$_expiringData[$namespace][$name])) { // check expiring data
+ return self::$_expiringData[$namespace][$name];
+ } else {
+ return $_SESSION[$namespace][$name]; // satisfy return by reference
+ }
+ }
+ }
+
+
+ /**
+ * namespaceGetAll() - Get an array containing $namespace, including expiring data.
+ *
+ * @param string $namespace
+ * @param string $name
+ * @return mixed
+ */
+ protected static function _namespaceGetAll($namespace)
+ {
+ $currentData = (isset($_SESSION[$namespace]) && is_array($_SESSION[$namespace])) ?
+ $_SESSION[$namespace] : array();
+ $expiringData = (isset(self::$_expiringData[$namespace]) && is_array(self::$_expiringData[$namespace])) ?
+ self::$_expiringData[$namespace] : array();
+ return array_merge($currentData, $expiringData);
+ }
+}
diff --git a/libs/Zend/Session/Exception.php b/libs/Zend/Session/Exception.php
new file mode 100755
index 0000000000..5d44363c61
--- /dev/null
+++ b/libs/Zend/Session/Exception.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Exception.php 4773 2007-05-09 19:33:10Z darby $
+ * @since Preview Release 0.2
+ */
+
+
+/**
+ * @see Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * Zend_Session_Exception
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Session_Exception extends Zend_Exception
+{
+ /**
+ * sessionStartError
+ *
+ * @see http://framework.zend.com/issues/browse/ZF-1325
+ * @var string PHP Error Message
+ */
+ static public $sessionStartError = null;
+
+ /**
+ * handleSessionStartError() - interface for set_error_handler()
+ *
+ * @see http://framework.zend.com/issues/browse/ZF-1325
+ * @param int $errno
+ * @param string $errstr
+ * @return void
+ */
+ static public function handleSessionStartError($errno, $errstr)
+ {
+ self::$sessionStartError = $errstr;
+ }
+
+ /**
+ * handleSilentWriteClose() - interface for set_error_handler()
+ *
+ * @see http://framework.zend.com/issues/browse/ZF-1325
+ * @param int $errno
+ * @param string $errstr
+ * @return void
+ */
+ static public function handleSilentWriteClose($errno, $errstr)
+ {
+ }
+}
diff --git a/libs/Zend/Session/Namespace.php b/libs/Zend/Session/Namespace.php
new file mode 100755
index 0000000000..22e91c156a
--- /dev/null
+++ b/libs/Zend/Session/Namespace.php
@@ -0,0 +1,489 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Namespace.php 4666 2007-05-02 17:12:28Z darby $
+ * @since Preview Release 0.2
+ */
+
+
+/**
+ * @see Zend_Session
+ */
+require_once 'Zend/Session.php';
+
+
+/**
+ * @see Zend_Session_Abstract
+ */
+require_once 'Zend/Session/Abstract.php';
+
+
+/**
+ * Zend_Session_Namespace
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Session_Namespace extends Zend_Session_Abstract implements IteratorAggregate
+{
+
+ /**
+ * used as option to constructor to prevent additional instances to the same namespace
+ */
+ const SINGLE_INSTANCE = true;
+
+ /**
+ * Namespace - which namespace this instance of zend-session is saving-to/getting-from
+ *
+ * @var string
+ */
+ protected $_namespace = "Default";
+
+ /**
+ * Namespace locking mechanism
+ *
+ * @var array
+ */
+ protected static $_namespaceLocks = array();
+
+ /**
+ * Single instance namespace array to ensure data security.
+ *
+ * @var array
+ */
+ protected static $_singleInstances = array();
+
+ /**
+ * __construct() - Returns an instance object bound to a particular, isolated section
+ * of the session, identified by $namespace name (defaulting to 'Default').
+ * The optional argument $singleInstance will prevent construction of additional
+ * instance objects acting as accessors to this $namespace.
+ *
+ * @param string $namespace - programmatic name of the requested namespace
+ * @param bool $singleInstance - prevent creation of additional accessor instance objects for this namespace
+ * @return void
+ */
+ public function __construct($namespace = 'Default', $singleInstance = false)
+ {
+ if ($namespace === '') {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception('Session namespace must be a non-empty string.');
+ }
+
+ if ($namespace[0] == "_") {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception('Session namespace must not start with an underscore.');
+ }
+
+ if (isset(self::$_singleInstances[$namespace])) {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception("A session namespace object already exists for this namespace ('$namespace'), and no additional accessors (session namespace objects) for this namespace are permitted.");
+ }
+
+ if ($singleInstance === true) {
+ self::$_singleInstances[$namespace] = true;
+ }
+
+ $this->_namespace = $namespace;
+
+ // Process metadata specific only to this namespace.
+ Zend_Session::start(true); // attempt auto-start (throws exception if strict option set)
+
+ if (self::$_readable === false) {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception(self::_THROW_NOT_READABLE_MSG);
+ }
+
+ if (!isset($_SESSION['__ZF'])) {
+ return; // no further processing needed
+ }
+
+ // do not allow write access to namespaces, after stop() or writeClose()
+ if (parent::$_writable === true) {
+ if (isset($_SESSION['__ZF'][$namespace])) {
+
+ // Expire Namespace by Namespace Hop (ENNH)
+ if (isset($_SESSION['__ZF'][$namespace]['ENNH'])) {
+ $_SESSION['__ZF'][$namespace]['ENNH']--;
+
+ if ($_SESSION['__ZF'][$namespace]['ENNH'] === 0) {
+ if (isset($_SESSION[$namespace])) {
+ self::$_expiringData[$namespace] = $_SESSION[$namespace];
+ unset($_SESSION[$namespace]);
+ }
+ unset($_SESSION['__ZF'][$namespace]['ENNH']);
+ }
+ }
+
+ // Expire Namespace Variables by Namespace Hop (ENVNH)
+ if (isset($_SESSION['__ZF'][$namespace]['ENVNH'])) {
+ foreach ($_SESSION['__ZF'][$namespace]['ENVNH'] as $variable => $hops) {
+ $_SESSION['__ZF'][$namespace]['ENVNH'][$variable]--;
+
+ if ($_SESSION['__ZF'][$namespace]['ENVNH'][$variable] === 0) {
+ if (isset($_SESSION[$namespace][$variable])) {
+ self::$_expiringData[$namespace][$variable] = $_SESSION[$namespace][$variable];
+ unset($_SESSION[$namespace][$variable]);
+ }
+ unset($_SESSION['__ZF'][$namespace]['ENVNH'][$variable]);
+ }
+ }
+ }
+ }
+
+ if (empty($_SESSION['__ZF'][$namespace])) {
+ unset($_SESSION['__ZF'][$namespace]);
+ }
+
+ if (empty($_SESSION['__ZF'])) {
+ unset($_SESSION['__ZF']);
+ }
+ }
+ }
+
+
+ /**
+ * getIterator() - return an iteratable object for use in foreach and the like,
+ * this completes the IteratorAggregate interface
+ *
+ * @return ArrayObject - iteratable container of the namespace contents
+ */
+ public function getIterator()
+ {
+ return new ArrayObject(parent::_namespaceGetAll($this->_namespace));
+ }
+
+
+ /**
+ * lock() - mark a session/namespace as readonly
+ *
+ * @return void
+ */
+ public function lock()
+ {
+ self::$_namespaceLocks[$this->_namespace] = true;
+ }
+
+
+ /**
+ * unlock() - unmark a session/namespace to enable read & write
+ *
+ * @return void
+ */
+ public function unlock()
+ {
+ unset(self::$_namespaceLocks[$this->_namespace]);
+ }
+
+
+ /**
+ * unlockAll() - unmark all session/namespaces to enable read & write
+ *
+ * @return void
+ */
+ public static function unlockAll()
+ {
+ self::$_namespaceLocks = array();
+ }
+
+
+ /**
+ * isLocked() - return lock status, true if, and only if, read-only
+ *
+ * @return bool
+ */
+ public function isLocked()
+ {
+ return isset(self::$_namespaceLocks[$this->_namespace]);
+ }
+
+
+ /**
+ * unsetAll() - unset all variables in this namespace
+ *
+ * @return true
+ */
+ public function unsetAll()
+ {
+ return parent::_namespaceUnset($this->_namespace);
+ }
+
+
+ /**
+ * __get() - method to get a variable in this object's current namespace
+ *
+ * @param string $name - programmatic name of a key, in a <key,value> pair in the current namespace
+ * @return mixed
+ */
+ protected function & __get($name)
+ {
+ if ($name === '') {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception("The '$name' key must be a non-empty string");
+ }
+
+ return parent::_namespaceGet($this->_namespace, $name);
+ }
+
+
+ /**
+ * __set() - method to set a variable/value in this object's namespace
+ *
+ * @param string $name - programmatic name of a key, in a <key,value> pair in the current namespace
+ * @param mixed $value - value in the <key,value> pair to assign to the $name key
+ * @throws Zend_Session_Exception
+ * @return true
+ */
+ protected function __set($name, $value)
+ {
+ if (isset(self::$_namespaceLocks[$this->_namespace])) {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception('This session/namespace has been marked as read-only.');
+ }
+
+ if ($name === '') {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception("The '$name' key must be a non-empty string");
+ }
+
+ if (parent::$_writable === false) {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception(parent::_THROW_NOT_WRITABLE_MSG);
+ }
+
+ $name = (string) $name;
+
+ $_SESSION[$this->_namespace][$name] = $value;
+ }
+
+
+ /**
+ * apply() - enables applying user-selected function, such as array_merge() to the namespace
+ * Caveat: ignores members expiring now.
+ *
+ * Example:
+ * $namespace->apply('array_merge', array('tree' => 'apple', 'fruit' => 'peach'), array('flower' => 'rose'));
+ * $namespace->apply('count');
+ *
+ * @param string $callback - callback function
+ * @param mixed OPTIONAL arguments passed to the callback function
+ */
+ public function apply($callback)
+ {
+ $arg_list = func_get_args();
+ $arg_list[0] = $_SESSION[$this->_namespace];
+ return call_user_func_array($callback, $arg_list);
+ }
+
+
+ /**
+ * applySet() - enables applying user-selected function, and sets entire namespace to the result
+ * Result of $callback must be an array. Caveat: ignores members expiring now.
+ *
+ * Example:
+ * $namespace->applySet('array_merge', array('tree' => 'apple', 'fruit' => 'peach'), array('flower' => 'rose'));
+ *
+ * @param string $callback - callback function
+ * @param mixed OPTIONAL arguments passed to the callback function
+ */
+ public function applySet($callback)
+ {
+ $arg_list = func_get_args();
+ $arg_list[0] = $_SESSION[$this->_namespace];
+ $result = call_user_func_array($callback, $arg_list);
+ if (!is_array($result)) {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception("Result must be an array. Got: " . gettype($result));
+ }
+ $_SESSION[$this->_namespace] = $result;
+ return $result;
+ }
+
+
+ /**
+ * __isset() - determine if a variable in this object's namespace is set
+ *
+ * @param string $name - programmatic name of a key, in a <key,value> pair in the current namespace
+ * @return bool
+ */
+ protected function __isset($name)
+ {
+ if ($name === '') {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception("The '$name' key must be a non-empty string");
+ }
+
+ return parent::_namespaceIsset($this->_namespace, $name);
+ }
+
+
+ /**
+ * __unset() - unset a variable in this object's namespace.
+ *
+ * @param string $name - programmatic name of a key, in a <key,value> pair in the current namespace
+ * @return true
+ */
+ protected function __unset($name)
+ {
+ if ($name === '') {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception("The '$name' key must be a non-empty string");
+ }
+
+ return parent::_namespaceUnset($this->_namespace, $name);
+ }
+
+
+ /**
+ * setExpirationSeconds() - expire the namespace, or specific variables after a specified
+ * number of seconds
+ *
+ * @param int $seconds - expires in this many seconds
+ * @param mixed $variables - OPTIONAL list of variables to expire (defaults to all)
+ * @throws Zend_Session_Exception
+ * @return void
+ */
+ public function setExpirationSeconds($seconds, $variables = null)
+ {
+ if (parent::$_writable === false) {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception(parent::_THROW_NOT_WRITABLE_MSG);
+ }
+
+ if ($seconds <= 0) {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception('Seconds must be positive.');
+ }
+
+ if ($variables === null) {
+
+ // apply expiration to entire namespace
+ $_SESSION['__ZF'][$this->_namespace]['ENT'] = time() + $seconds;
+
+ } else {
+
+ if (is_string($variables)) {
+ $variables = array($variables);
+ }
+
+ foreach ($variables as $variable) {
+ if (!empty($variable)) {
+ $_SESSION['__ZF'][$this->_namespace]['ENVT'][$variable] = time() + $seconds;
+ }
+ }
+ }
+ }
+
+
+ /**
+ * setExpirationHops() - expire the namespace, or specific variables after a specified
+ * number of page hops
+ *
+ * @param int $hops - how many "hops" (number of subsequent requests) before expiring
+ * @param mixed $variables - OPTIONAL list of variables to expire (defaults to all)
+ * @param boolean $hopCountOnUsageOnly - OPTIONAL if set, only count a hop/request if this namespace is used
+ * @throws Zend_Session_Exception
+ * @return void
+ */
+ public function setExpirationHops($hops, $variables = null, $hopCountOnUsageOnly = false)
+ {
+ if (parent::$_writable === false) {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception(parent::_THROW_NOT_WRITABLE_MSG);
+ }
+
+ if ($hops <= 0) {
+ /**
+ * @see Zend_Session_Exception
+ */
+ require_once 'Zend/Session/Exception.php';
+ throw new Zend_Session_Exception('Hops must be positive number.');
+ }
+
+ if ($variables === null) {
+
+ // apply expiration to entire namespace
+ if ($hopCountOnUsageOnly === false) {
+ $_SESSION['__ZF'][$this->_namespace]['ENGH'] = $hops;
+ } else {
+ $_SESSION['__ZF'][$this->_namespace]['ENNH'] = $hops;
+ }
+
+ } else {
+
+ if (is_string($variables)) {
+ $variables = array($variables);
+ }
+
+ foreach ($variables as $variable) {
+ if (!empty($variable)) {
+ if ($hopCountOnUsageOnly === false) {
+ $_SESSION['__ZF'][$this->_namespace]['ENVGH'][$variable] = $hops;
+ } else {
+ $_SESSION['__ZF'][$this->_namespace]['ENVNH'][$variable] = $hops;
+ }
+ }
+ }
+ }
+ }
+
+}
diff --git a/libs/Zend/Session/SaveHandler/Interface.php b/libs/Zend/Session/SaveHandler/Interface.php
new file mode 100755
index 0000000000..ba69bcb3a1
--- /dev/null
+++ b/libs/Zend/Session/SaveHandler/Interface.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 2812 2007-01-16 01:40:54Z bkarwin $
+ * @since Preview Release 0.2
+ */
+
+/**
+ * Zend_Session_SaveHandler_Interface
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @subpackage SaveHandlers
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @see http://us3.php.net/manual/en/function.session-set-save-handler.php
+ */
+interface Zend_Session_SaveHandler_Interface
+{
+
+ /**
+ * Open Session - retrieve resources
+ *
+ * @param string $save_path
+ * @param string $name
+ */
+ public function open($save_path, $name);
+
+ /**
+ * Close Session - free resources
+ *
+ */
+ public function close();
+
+ /**
+ * Read session data
+ *
+ * @param string $id
+ */
+ public function read($id);
+
+ /**
+ * Write Session - commit data to resource
+ *
+ * @param string $id
+ * @param mixed $data
+ */
+ public function write($id, $data);
+
+ /**
+ * Destroy Session - remove data from resource for
+ * given session id
+ *
+ * @param string $id
+ */
+ public function destroy($id);
+
+ /**
+ * Garbage Collection - remove old session data older
+ * than $maxlifetime (in seconds)
+ *
+ * @param int $maxlifetime
+ */
+ public function gc($maxlifetime);
+
+}
diff --git a/libs/Zend/Session/Validator/Abstract.php b/libs/Zend/Session/Validator/Abstract.php
new file mode 100755
index 0000000000..a6f6ed8c9d
--- /dev/null
+++ b/libs/Zend/Session/Validator/Abstract.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Abstract.php 2812 2007-01-16 01:40:54Z bkarwin $
+ * @since Preview Release 0.2
+ */
+
+/**
+ * Zend_Session_Validator_Interface
+ */
+require_once 'Zend/Session/Validator/Interface.php';
+
+/**
+ * Zend_Session_Validator_Abstract
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Session_Validator_Abstract implements Zend_Session_Validator_Interface
+{
+
+ /**
+ * SetValidData() - This method should be used to store the environment variables that
+ * will be needed in order to validate the session later in the validate() method.
+ * These values are stored in the session in the __ZF namespace, in an array named VALID
+ *
+ * @param mixed $data
+ */
+ protected function setValidData($data)
+ {
+ $validator_name = get_class($this);
+
+ $_SESSION['__ZF']['VALID'][$validator_name] = $data;
+ }
+
+
+ /**
+ * GetValidData() - This method should be used to retrieve the environment variables that
+ * will be needed to 'validate' a session.
+ *
+ * @return mixed
+ */
+ protected function getValidData()
+ {
+ $validator_name = get_class($this);
+
+ return $_SESSION['__ZF']['VALID'][$validator_name];
+ }
+
+}
diff --git a/libs/Zend/Session/Validator/HttpUserAgent.php b/libs/Zend/Session/Validator/HttpUserAgent.php
new file mode 100755
index 0000000000..586e130d67
--- /dev/null
+++ b/libs/Zend/Session/Validator/HttpUserAgent.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: HttpUserAgent.php 2812 2007-01-16 01:40:54Z bkarwin $
+ * @since Preview Release 0.2
+ */
+
+/**
+ * Zend_Session_Validator_Abstract
+ */
+require_once 'Zend/Session/Validator/Abstract.php';
+
+/**
+ * Zend_Session_Validator_HttpUserAgent
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @subpackage Validators
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Session_Validator_HttpUserAgent extends Zend_Session_Validator_Abstract
+{
+
+ /**
+ * Setup() - this method will get the current user agent and store it in the session
+ * as 'valid data'
+ *
+ */
+ public function setup()
+ {
+ $this->setValidData( (isset($_SERVER['HTTP_USER_AGENT'])
+ ? $_SERVER['HTTP_USER_AGENT'] : null) );
+ }
+
+ /**
+ * Validate() - this method will determine if the current user agent matches the
+ * user agent we stored when we initialized this variable.
+ *
+ * @return bool
+ */
+ public function validate()
+ {
+ $current_browser = (isset($_SERVER['HTTP_USER_AGENT'])
+ ? $_SERVER['HTTP_USER_AGENT'] : null);
+
+ if ($current_browser === $this->getValidData()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+}
diff --git a/libs/Zend/Session/Validator/Interface.php b/libs/Zend/Session/Validator/Interface.php
new file mode 100755
index 0000000000..bb5372ad4c
--- /dev/null
+++ b/libs/Zend/Session/Validator/Interface.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 2812 2007-01-16 01:40:54Z bkarwin $
+ * @since Preview Release 0.2
+ */
+
+/**
+ * Zend_Session_Validator_Interface
+ *
+ * @category Zend
+ * @package Zend_Session
+ * @subpackage Validators
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Session_Validator_Interface
+{
+
+ /**
+ * Setup() - this method will store the environment variables
+ * nessissary to be able to validate against in future requests.
+ */
+ public function setup();
+
+ /**
+ * Validate() - this method will be called at the beginning of
+ * every session to determine if the current environment matches
+ * that which was store in the setup() procedure.
+ */
+ public function validate();
+
+}
diff --git a/libs/Zend/Translate.php b/libs/Zend/Translate.php
new file mode 100755
index 0000000000..22caa3aed3
--- /dev/null
+++ b/libs/Zend/Translate.php
@@ -0,0 +1,238 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Date.php 2498 2006-12-23 22:13:38Z thomas $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Translate_Exception */
+require_once 'Zend/Translate/Exception.php';
+
+/** Zend_Locale */
+require_once 'Zend/Locale.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Translate {
+ /**
+ * Adapter names constants
+ */
+ const AN_ARRAY = 'array';
+ const AN_CSV = 'csv';
+ const AN_GETTEXT = 'gettext';
+ const AN_QT = 'qt';
+ const AN_TMX = 'tmx';
+ const AN_XLIFF = 'xliff';
+
+ /**
+ * Adapter
+ *
+ * @var Zend_Translate_Adapter
+ */
+ private $_adapter;
+
+
+ /**
+ * Generates the standard translation object
+ *
+ * @param string $adapter Adapter to use
+ * @param array $options Options for this adapter to set
+ * Depends on the Adapter
+ * @param string|Zend_Locale $locale OPTIONAL locale to use
+ * @throws Zend_Translate_Exception
+ */
+ public function __construct($adapter, $options, $locale = null)
+ {
+ $this->setAdapter($adapter, $options, $locale);
+ }
+
+
+ /**
+ * Sets a new adapter
+ *
+ * @param string $adapter Adapter to use
+ * @param string|array $data Translation data
+ * @param string|Zend_Locale $locale OPTIONAL locale to use
+ * @param array $options OPTIONAL Options to use
+ * @throws Zend_Translate_Exception
+ */
+ public function setAdapter($adapter, $data, $locale = null, array $options = array())
+ {
+ switch (strtolower($adapter)) {
+ case 'array':
+ /** Zend_Translate_Adapter_Array */
+ require_once('Zend/Translate/Adapter/Array.php');
+ $this->_adapter = new Zend_Translate_Adapter_Array($data, $locale, $options);
+ break;
+ case 'csv':
+ /** Zend_Translate_Adapter_Csv */
+ require_once('Zend/Translate/Adapter/Csv.php');
+ $this->_adapter = new Zend_Translate_Adapter_Csv($data, $locale, $options);
+ break;
+ case 'gettext':
+ /** Zend_Translate_Adapter_Gettext */
+ require_once('Zend/Translate/Adapter/Gettext.php');
+ $this->_adapter = new Zend_Translate_Adapter_Gettext($data, $locale, $options);
+ break;
+ case 'qt':
+ /** Zend_Translate_Adapter_Qt */
+ require_once('Zend/Translate/Adapter/Qt.php');
+ $this->_adapter = new Zend_Translate_Adapter_Qt($data, $locale, $options);
+ break;
+ case 'tmx':
+ /** Zend_Translate_Adapter_Tmx */
+ require_once('Zend/Translate/Adapter/Tmx.php');
+ $this->_adapter = new Zend_Translate_Adapter_Tmx($data, $locale, $options);
+ break;
+ case 'xliff':
+ /** Zend_Translate_Adapter_Xliff */
+ require_once('Zend/Translate/Adapter/Xliff.php');
+ $this->_adapter = new Zend_Translate_Adapter_Xliff($data, $locale, $options);
+ break;
+ case 'sql':
+ case 'tbx':
+ case 'xmltm':
+ throw new Zend_Translate_Exception("adapter '$adapter' is not supported for now");
+ break;
+ default:
+ throw new Zend_Translate_Exception('no adapter selected');
+ break;
+ }
+ }
+
+
+ /**
+ * Returns the adapters name and it's options
+ *
+ * @return Zend_Translate_Adapter
+ */
+ public function getAdapter()
+ {
+ return $this->_adapter;
+ }
+
+
+ /**
+ * Add translation data.
+ *
+ * It may be a new language or additional data for existing language
+ * If $clear parameter is true, then translation data for specified
+ * language is replaced and added otherwise
+ *
+ * @param string|array $data Translation data
+ * @param string|Zend_Locale $locale Locale/Language to add to this adapter
+ * @param array $options OPTIONAL Options to use
+ */
+ public function addTranslation($data, $locale, array $options = array())
+ {
+ $this->_adapter->addTranslation($data, $locale, $options);
+ }
+
+
+ /**
+ * Sets a new locale/language
+ *
+ * @param string|Zend_Locale $locale Locale/Language to set for translations
+ */
+ public function setLocale($locale)
+ {
+ $this->_adapter->setLocale($locale);
+ }
+
+
+ /**
+ * Returns the actual set locale/language
+ *
+ * @return Zend_Locale|null
+ */
+ public function getLocale()
+ {
+ return $this->_adapter->getLocale();
+ }
+
+
+ /**
+ * Returns all avaiable locales/languages from this adapter
+ *
+ * @return array
+ */
+ public function getList()
+ {
+ return $this->_adapter->getList();
+ }
+
+
+ /**
+ * Is the wished language avaiable ?
+ *
+ * @param string|Zend_Locale $locale Is the locale/language avaiable
+ * @return boolean
+ */
+ public function isAvailable($locale)
+ {
+ return $this->_adapter->isAvailable($locale);
+ }
+
+
+ /**
+ * Translate the given string
+ *
+ * @param string $messageId Original to translate
+ * @param string|Zend_Locale $locale OPTIONAL locale/language to translate to
+ * @return string
+ */
+ public function _($messageId, $locale = null)
+ {
+ return $this->_adapter->translate($messageId, $locale);
+ }
+
+
+ /**
+ * Translate the given string
+ *
+ * @param string $messageId Original to translate
+ * @param string|Zend_Locale $locale OPTIONAL locale/language to translate to
+ * @return string
+ */
+ public function translate($messageId, $locale = null)
+ {
+ return $this->_adapter->translate($messageId, $locale);
+ }
+
+
+ /**
+ * Checks if a given string can be translated
+ * returns boolean
+ *
+ * @param string $messageId Translation string
+ * @param boolean $original OPTIONAL Allow translation only for original language
+ * when true, a translation for 'en_US' would give false when it can
+ * be translated with 'en' only
+ * @param string|Zend_Locale $locale OPTIONAL Locale/Language to use, identical with locale identifier,
+ * see Zend_Locale for more information
+ * @return boolean
+ */
+ public function isTranslated($messageId, $original = false, $locale = null)
+ {
+ return $this->_adapter->isTranslated($messageId, $original, $locale);
+ }
+}
diff --git a/libs/Zend/Translate/Adapter.php b/libs/Zend/Translate/Adapter.php
new file mode 100755
index 0000000000..2f4cdfdc65
--- /dev/null
+++ b/libs/Zend/Translate/Adapter.php
@@ -0,0 +1,306 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Date.php 2498 2006-12-23 22:13:38Z thomas $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Locale */
+require_once 'Zend/Locale.php';
+
+/** Zend_Translate_Exception */
+require_once 'Zend/Translate/Exception.php';
+
+/**
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Translate_Adapter {
+ /**
+ * Current locale/language
+ *
+ * @var string|null
+ */
+ protected $_locale;
+
+ /**
+ * Table of all supported languages
+ *
+ * @var array
+ */
+ protected $_languages = array();
+
+ /**
+ * Array with all options, each adapter can have own additional options
+ *
+ * @var array
+ */
+ protected $_options = array('clear' => false);
+
+ /**
+ * Translation table
+ *
+ * @var array
+ */
+ protected $_translate = array();
+
+
+ /**
+ * Generates the adapter
+ *
+ * @param string|array $data Translation data for this adapter
+ * @param string|Zend_Locale $locale OPTIONAL Locale/Language to set, identical with Locale identifiers
+ * see Zend_Locale for more information
+ * @param string|array $options Options for the adaptor
+ * @throws Zend_Translate_Exception
+ */
+ public function __construct($data, $locale = null, array $options = array())
+ {
+ if ($locale === null) {
+ $locale = new Zend_Locale();
+ }
+
+ $this->addTranslation($data, $locale, $options);
+ $this->setLocale($locale);
+ }
+
+
+ /**
+ * Sets new adapter options
+ *
+ * @param array $options Adapter options
+ * @throws Zend_Translate_Exception
+ */
+ public function setOptions(array $options = array())
+ {
+ foreach ($options as $key => $option) {
+ $this->_options[strtolower($key)] = $option;
+ }
+ }
+
+ /**
+ * Returns the adapters name and it's options
+ *
+ * @param string|null $optionKey String returns this option
+ * null returns all options
+ * @return integer|string|array
+ */
+ public function getOptions($optionKey = null)
+ {
+ if ($optionKey === null) {
+ return $this->_options;
+ }
+ if (array_key_exists(strtolower($optionKey), $this->_options)) {
+ return $this->_options[strtolower($optionKey)];
+ }
+ return null;
+ }
+
+
+ /**
+ * Gets locale
+ *
+ * @return Zend_Locale|null
+ */
+ public function getLocale()
+ {
+ return $this->_locale;
+ }
+
+
+ /**
+ * Sets locale
+ *
+ * @param string|Zend_Locale $locale Locale to set
+ * @throws Zend_Translate_Exception
+ */
+ public function setLocale($locale)
+ {
+ if ($locale instanceof Zend_Locale) {
+ $locale = $locale->toString();
+ } else if (!$locale = Zend_Locale::isLocale($locale)) {
+ throw new Zend_Translate_Exception("The given Language ({$locale}) does not exist");
+ }
+
+ if (!in_array($locale, $this->_languages)) {
+ throw new Zend_Translate_Exception("Language ({$locale}) has to be added before it can be used.");
+ }
+
+ $this->_locale = $locale;
+ }
+
+
+ /**
+ * Returns the avaiable languages from this adapter
+ *
+ * @return array
+ */
+ public function getList()
+ {
+ return $this->_languages;
+ }
+
+
+ /**
+ * Is the wished language avaiable ?
+ *
+ * @param string|Zend_Locale $locale Language to search for, identical with locale identifier,
+ * see Zend_Locale for more information
+ * @return boolean
+ */
+ public function isAvailable($locale)
+ {
+ if ($locale instanceof Zend_Locale) {
+ $locale = $locale->toString();
+ }
+
+ return in_array($locale, $this->_languages);
+ }
+
+ /**
+ * Load translation data
+ *
+ * @param mixed $data
+ * @param string|Zend_Locale $locale
+ * @param array $options
+ */
+ abstract protected function _loadTranslationData($data, $locale, array $options = array());
+
+ /**
+ * Add translation data
+ *
+ * It may be a new language or additional data for existing language
+ * If $clear parameter is true, then translation data for specified
+ * language is replaced and added otherwise
+ *
+ * @param array|string $data Translation data
+ * @param string|Zend_Locale $locale Locale/Language to add data for, identical with locale identifier,
+ * see Zend_Locale for more information
+ * @param array $options OPTIONAL Option for this Adapter
+ * @throws Zend_Translate_Exception
+ */
+ public function addTranslation($data, $locale, array $options = array())
+ {
+ if (!$locale = Zend_Locale::isLocale($locale)) {
+ throw new Zend_Translate_Exception("The given Language ({$locale}) does not exist");
+ }
+
+ if (!in_array($locale, $this->_languages)) {
+ $this->_languages[$locale] = $locale;
+ }
+
+ $this->_loadTranslationData($data, $locale, $options);
+ }
+
+
+ /**
+ * Translates the given string
+ * returns the translation
+ *
+ * @param string $messageId Translation string
+ * @param string|Zend_Locale $locale OPTIONAL Locale/Language to use, identical with locale identifier,
+ * see Zend_Locale for more information
+ * @return string
+ */
+ public function translate($messageId, $locale = null)
+ {
+ if ($locale === null) {
+ $locale = $this->_locale;
+ } else {
+ if (!$locale = Zend_Locale::isLocale($locale)) {
+ // language does not exist, return original string
+ return $messageId;
+ }
+ }
+
+ if ((array_key_exists($locale, $this->_translate)) and
+ (array_key_exists($messageId, $this->_translate[$locale]))) {
+ // return original translation
+ return $this->_translate[$locale][$messageId];
+ } else if (strlen($locale) != 2) {
+ // faster than creating a new locale and separate the leading part
+ $locale = substr($locale, 0, -strlen(strrchr($locale, '_')));
+
+ if ((array_key_exists($locale, $this->_translate)) and
+ (array_key_exists($messageId, $this->_translate[$locale]))) {
+ // return regionless translation (en_US -> en)
+ return $this->_translate[$locale][$messageId];
+ }
+ }
+
+ // no translation found, return original
+ return $messageId;
+ }
+
+
+ /**
+ * Checks if a string is translated within the source or not
+ * returns boolean
+ *
+ * @param string $messageId Translation string
+ * @param boolean $original OPTIONAL Allow translation only for original language
+ * when true, a translation for 'en_US' would give false when it can
+ * be translated with 'en' only
+ * @param string|Zend_Locale $locale OPTIONAL Locale/Language to use, identical with locale identifier,
+ * see Zend_Locale for more information
+ * @return boolean
+ */
+ public function isTranslated($messageId, $original = false, $locale = null)
+ {
+ if (($original !== false) and ($original !== true)) {
+ $locale = $original;
+ $original = false;
+ }
+ if ($locale === null) {
+ $locale = $this->_locale;
+ } else {
+ if (!$locale = Zend_Locale::isLocale($locale)) {
+ // language does not exist, return original string
+ return false;
+ }
+ }
+
+ if ((array_key_exists($locale, $this->_translate)) and
+ (array_key_exists($messageId, $this->_translate[$locale]))) {
+ // return original translation
+ return true;
+ } else if ((strlen($locale) != 2) and ($original === false)) {
+ // faster than creating a new locale and separate the leading part
+ $locale = substr($locale, 0, -strlen(strrchr($locale, '_')));
+
+ if ((array_key_exists($locale, $this->_translate)) and
+ (array_key_exists($messageId, $this->_translate[$locale]))) {
+ // return regionless translation (en_US -> en)
+ return true;
+ }
+ }
+
+ // no translation found, return original
+ return false;
+ }
+
+
+ /**
+ * Returns the adapter name
+ *
+ * @return string
+ */
+ abstract public function toString();
+}
diff --git a/libs/Zend/Translate/Adapter/Array.php b/libs/Zend/Translate/Adapter/Array.php
new file mode 100755
index 0000000000..b2dd749bb7
--- /dev/null
+++ b/libs/Zend/Translate/Adapter/Array.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Date.php 2498 2006-12-23 22:13:38Z thomas $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Locale */
+require_once 'Zend/Locale.php';
+
+/** Zend_Translate_Exception */
+require_once 'Zend/Translate/Exception.php';
+
+/** Zend_Translate_Adapter */
+require_once 'Zend/Translate/Adapter.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Translate_Adapter_Array extends Zend_Translate_Adapter {
+ /**
+ * Generates the adapter
+ *
+ * @param array $data Translation data
+ * @param string|Zend_Locale $locale OPTIONAL Locale/Language to set, identical with locale identifier,
+ * see Zend_Locale for more information
+ */
+ public function __construct($data, $locale = null)
+ {
+ parent::__construct($data, $locale);
+ }
+
+ /**
+ * Load translation data
+ *
+ * @param string|array $data
+ * @param string $locale Locale/Language to add data for, identical with locale identifier,
+ * see Zend_Locale for more information
+ * @param array $options OPTIONAL Options to use
+ */
+ protected function _loadTranslationData($data, $locale, array $options = array())
+ {
+ $options = array_merge($this->_options, $options);
+ if (($options['clear'] == true) || !isset($this->_translate[$locale])) {
+ $this->_translate[$locale] = array();
+ }
+
+ $this->_translate[$locale] = array_merge($this->_translate[$locale], $data);
+ }
+
+ /**
+ * returns the adapters name
+ *
+ * @return string
+ */
+ public function toString()
+ {
+ return "Array";
+ }
+}
diff --git a/libs/Zend/Translate/Adapter/Csv.php b/libs/Zend/Translate/Adapter/Csv.php
new file mode 100755
index 0000000000..ed141ca62b
--- /dev/null
+++ b/libs/Zend/Translate/Adapter/Csv.php
@@ -0,0 +1,120 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Date.php 2498 2006-12-23 22:13:38Z thomas $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Locale */
+require_once 'Zend/Locale.php';
+
+/** Zend_Translate_Exception */
+require_once 'Zend/Translate/Exception.php';
+
+/** Zend_Translate_Adapter */
+require_once 'Zend/Translate/Adapter.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Translate_Adapter_Csv extends Zend_Translate_Adapter {
+
+ /**
+ * Generates the adapter
+ *
+ * @param string $data Translation data
+ * @param string|Zend_Locale $locale OPTIONAL Locale/Language to set, identical with locale identifier,
+ * see Zend_Locale for more information
+ * @param array $options Options for this adapter
+ */
+ public function __construct($data, $locale = null, array $options = array())
+ {
+ $this->_options['separator'] = ";";
+ $options = array_merge($this->_options, $options);
+
+ parent::__construct($data, $locale, $options);
+ }
+
+ /**
+ * Load translation data
+ *
+ * @param string|array $filename Filename and full path to the translation source
+ * @param string $locale Locale/Language to add data for, identical with locale identifier,
+ * see Zend_Locale for more information
+ * @param array $option OPTIONAL Options to use
+ */
+ protected function _loadTranslationData($filename, $locale, array $options = array())
+ {
+ $options = array_merge($this->_options, $options);
+
+ if ($options['clear'] || !isset($this->_translate[$locale])) {
+ $this->_translate[$locale] = array();
+ }
+
+ $this->_file = @fopen($filename, 'rb');
+ if (!$this->_file) {
+ throw new Zend_Translate_Exception('Error opening translation file \'' . $filename . '\'.');
+ }
+
+ while(!feof($this->_file)) {
+ $content = fgets($this->_file);
+ $content = explode($options['separator'], $content);
+ for ($x = 0; $x < count($content); ++$x) {
+ if (isset($content[$x+1]) and (empty($content[$x+1]))) {
+ $content[$x] .= $options['separator'];
+ $length = 1;
+ if (isset($content[$x+2])) {
+ $content[$x] .= $content[$x+2];
+ $length = 2;
+ }
+ array_splice($content, $x + 1, $length);
+ }
+ }
+ // # marks a comment in the translation source
+ if ((!is_array($content) and (substr(trim($content), 0, 1) == "#")) or
+ (is_array($content) and (substr(trim($content[0]), 0, 1) == "#"))) {
+ continue;
+ }
+ if (!empty($content[1])) {
+ if (feof($this->_file)) {
+ $this->_translate[$locale][$content[0]] = $content[1];
+ } else {
+ if (substr($content[1], -2, 2) == "\r\n") {
+ $this->_translate[$locale][$content[0]] = substr($content[1], 0, -2);
+ } else {
+ $this->_translate[$locale][$content[0]] = substr($content[1], 0, -1);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * returns the adapters name
+ *
+ * @return string
+ */
+ public function toString()
+ {
+ return "Csv";
+ }
+}
diff --git a/libs/Zend/Translate/Adapter/Gettext.php b/libs/Zend/Translate/Adapter/Gettext.php
new file mode 100755
index 0000000000..85d068752b
--- /dev/null
+++ b/libs/Zend/Translate/Adapter/Gettext.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Date.php 2498 2006-12-23 22:13:38Z thomas $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Locale */
+require_once 'Zend/Locale.php';
+
+/** Zend_Translate_Exception */
+require_once 'Zend/Translate/Exception.php';
+
+/** Zend_Translate_Adapter */
+require_once 'Zend/Translate/Adapter.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Translate_Adapter_Gettext extends Zend_Translate_Adapter {
+ // Internal variables
+ private $_bigEndian = false;
+ private $_file = false;
+
+ /**
+ * Generates the adapter
+ *
+ * @param string $data Translation data
+ * @param string|Zend_Locale $locale OPTIONAL Locale/Language to set, identical with locale identifier,
+ * see Zend_Locale for more information
+ */
+ public function __construct($data, $locale = null)
+ {
+ parent::__construct($data, $locale);
+ }
+
+
+ /**
+ * Read values from the MO file
+ *
+ * @param string $bytes
+ */
+ private function _readMOData($bytes)
+ {
+ if ($this->_bigEndian === false) {
+ return unpack('V' . $bytes, fread($this->_file, 4 * $bytes));
+ } else {
+ return unpack('N' . $bytes, fread($this->_file, 4 * $bytes));
+ }
+ }
+
+
+ /**
+ * Load translation data (MO file reader)
+ *
+ * @param string $filename MO file to add, full path must be given for access
+ * @param string $locale New Locale/Language to set, identical with locale identifier,
+ * see Zend_Locale for more information
+ * @param array $option OPTIONAL Options to use
+ * @throws Zend_Translation_Exception
+ */
+ protected function _loadTranslationData($filename, $locale, array $options = array())
+ {
+ $this->_bigEndian = false;
+ $options = array_merge($this->_options, $options);
+
+ if ($options['clear'] || !isset($this->_translate[$locale])) {
+ $this->_translate[$locale] = array();
+ }
+
+ $this->_file = @fopen($filename, 'rb');
+ if (!$this->_file) {
+ throw new Zend_Translate_Exception('Error opening translation file \'' . $filename . '\'.');
+ }
+
+ // get Endian
+ $input = $this->_readMOData(1);
+ if (($input[1] == -1794895138) or ($input[1] == 18446744071914656478)) {
+ $this->_bigEndian = false;
+ } else if ($input[1] == -569244523) {
+ $this->_bigEndian = true;
+ } else {
+ throw new Zend_Translate_Exception('\'' . $filename . '\' is not a gettext file');
+ }
+ // read revision - not supported for now
+ $input = $this->_readMOData(1);
+
+ // number of bytes
+ $input = $this->_readMOData(1);
+ $total = $input[1];
+
+ // number of original strings
+ $input = $this->_readMOData(1);
+ $OOffset = $input[1];
+
+ // number of translation strings
+ $input = $this->_readMOData(1);
+ $TOffset = $input[1];
+
+ // fill the original table
+ fseek($this->_file, $OOffset);
+ $origtemp = $this->_readMOData(2 * $total);
+ fseek($this->_file, $TOffset);
+ $transtemp = $this->_readMOData(2 * $total);
+
+ for($count = 0; $count < $total; ++$count) {
+ if ($origtemp[$count * 2 + 1] != 0) {
+ fseek($this->_file, $origtemp[$count * 2 + 2]);
+ $original = @fread($this->_file, $origtemp[$count * 2 + 1]);
+ } else {
+ $original = '';
+ }
+
+ if ($transtemp[$count * 2 + 1] != 0) {
+ fseek($this->_file, $transtemp[$count * 2 + 2]);
+ $this->_translate[$locale][$original] = fread($this->_file, $transtemp[$count * 2 + 1]);
+ }
+ }
+ }
+
+
+ /**
+ * Returns the adapter name
+ *
+ * @return string
+ */
+ public function toString()
+ {
+ return "Gettext";
+ }
+}
diff --git a/libs/Zend/Translate/Adapter/Qt.php b/libs/Zend/Translate/Adapter/Qt.php
new file mode 100755
index 0000000000..ff5ec8c935
--- /dev/null
+++ b/libs/Zend/Translate/Adapter/Qt.php
@@ -0,0 +1,165 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Date.php 2498 2006-12-23 22:13:38Z thomas $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Locale */
+require_once 'Zend/Locale.php';
+
+/** Zend_Translate_Exception */
+require_once 'Zend/Translate/Exception.php';
+
+/** Zend_Translate_Adapter */
+require_once 'Zend/Translate/Adapter.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Translate_Adapter_Qt extends Zend_Translate_Adapter {
+ // Internal variables
+ private $_file = false;
+ private $_cleared = array();
+ private $_transunit = null;
+ private $_source = null;
+ private $_target = null;
+ private $_scontent = null;
+ private $_tcontent = null;
+ private $_stag = false;
+ private $_ttag = true;
+
+ /**
+ * Generates the Qt adapter
+ * This adapter reads with php's xml_parser
+ *
+ * @param string $data Translation data
+ * @param string|Zend_Locale $locale OPTIONAL Locale/Language to set, identical with locale identifier,
+ * see Zend_Locale for more information
+ */
+ public function __construct($data, $locale = null)
+ {
+ parent::__construct($data, $locale);
+ }
+
+
+ /**
+ * Load translation data (QT file reader)
+ *
+ * @param string $locale Locale/Language to add data for, identical with locale identifier,
+ * see Zend_Locale for more information
+ * @param string $filename QT file to add, full path must be given for access
+ * @param array $option OPTIONAL Options to use
+ * @throws Zend_Translation_Exception
+ */
+ protected function _loadTranslationData($filename, $locale, array $options = array())
+ {
+ $options = array_merge($this->_options, $options);
+
+ if ($options['clear']) {
+ $this->_translate = array();
+ }
+
+ if (!is_readable($filename)) {
+ throw new Zend_Translate_Exception('Translation file \'' . $filename . '\' is not readable.');
+ }
+
+ $this->_target = $locale;
+
+ $this->_file = xml_parser_create();
+ xml_set_object($this->_file, $this);
+ xml_parser_set_option($this->_file, XML_OPTION_CASE_FOLDING, 0);
+ xml_set_element_handler($this->_file, "_startElement", "_endElement");
+ xml_set_character_data_handler($this->_file, "_contentElement");
+
+ if (!xml_parse($this->_file, file_get_contents($filename))) {
+ throw new Zend_Translate_Exception(sprintf('XML error: %s at line %d',
+ xml_error_string(xml_get_error_code($this->_file)),
+ xml_get_current_line_number($this->_file)));
+ xml_parser_free($this->_file);
+ }
+ }
+
+ private function _startElement($file, $name, $attrib)
+ {
+ switch(strtolower($name)) {
+ case 'ts':
+ $this->_translate[$this->_target] = array();
+ break;
+ case 'message':
+ $this->_source = null;
+ $this->_stag = false;
+ $this->_ttag = false;
+ $this->_scontent = null;
+ $this->_tcontent = null;
+ break;
+ case 'source':
+ $this->_stag = true;
+ break;
+ case 'translation':
+ $this->_ttag = true;
+ break;
+ default:
+ break;
+ }
+ }
+
+ private function _endElement($file, $name)
+ {
+ switch (strtolower($name)) {
+ case 'source':
+ $this->_stag = false;
+ break;
+ case 'translation':
+ if (!empty($this->_scontent) and !empty($this->_tcontent) or
+ !array_key_exists($this->_scontent, $this->_translate[$this->_target])) {
+ $this->_translate[$this->_target][$this->_scontent] = $this->_tcontent;
+ }
+ $this->_ttag = false;
+ break;
+ case 'message':
+ default:
+ break;
+ }
+ }
+
+ private function _contentElement($file, $data)
+ {
+ if ($this->_stag === true) {
+ $this->_scontent .= $data;
+ }
+
+ if ($this->_ttag === true) {
+ $this->_tcontent .= $data;
+ }
+ }
+
+ /**
+ * Returns the adapter name
+ *
+ * @return string
+ */
+ public function toString()
+ {
+ return "Qt";
+ }
+}
diff --git a/libs/Zend/Translate/Adapter/Tmx.php b/libs/Zend/Translate/Adapter/Tmx.php
new file mode 100755
index 0000000000..1deeb39a01
--- /dev/null
+++ b/libs/Zend/Translate/Adapter/Tmx.php
@@ -0,0 +1,174 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Date.php 2498 2006-12-23 22:13:38Z thomas $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Locale */
+require_once 'Zend/Locale.php';
+
+/** Zend_Translate_Exception */
+require_once 'Zend/Translate/Exception.php';
+
+/** Zend_Translate_Adapter */
+require_once 'Zend/Translate/Adapter.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Translate_Adapter_Tmx extends Zend_Translate_Adapter {
+ // Internal variables
+ private $_file = false;
+ private $_cleared = array();
+ private $_tu = null;
+ private $_tuv = null;
+ private $_seg = null;
+ private $_content = null;
+ private $_defined = false;
+
+ /**
+ * Generates the tmx adapter
+ * This adapter reads with php's xml_parser
+ *
+ * @param string $data Translation data
+ * @param string|Zend_Locale $locale OPTIONAL Locale/Language to set, identical with locale identifier,
+ * see Zend_Locale for more information
+ */
+ public function __construct($data, $locale = null)
+ {
+ parent::__construct($data, $locale);
+ }
+
+
+ /**
+ * Load translation data (TMX file reader)
+ *
+ * @param string $filename TMX file to add, full path must be given for access
+ * @param string $locale Locale has no effect for TMX because TMX defines all languages within
+ * the source file
+ * @param array $option OPTIONAL Options to use
+ * @throws Zend_Translation_Exception
+ */
+ protected function _loadTranslationData($filename, $locale, array $options = array())
+ {
+ $options = array_merge($this->_options, $options);
+
+ if ($options['clear']) {
+ $this->_translate = array();
+ }
+
+ if ((in_array('defined_language', $options)) and !empty($options['defined_language'])) {
+ $this->_defined = true;
+ }
+
+ if (!is_readable($filename)) {
+ throw new Zend_Translate_Exception('Translation file \'' . $filename . '\' is not readable.');
+ }
+
+ $this->_file = xml_parser_create();
+ xml_set_object($this->_file, $this);
+ xml_parser_set_option($this->_file, XML_OPTION_CASE_FOLDING, 0);
+ xml_set_element_handler($this->_file, "_startElement", "_endElement");
+ xml_set_character_data_handler($this->_file, "_contentElement");
+
+ if (!xml_parse($this->_file, file_get_contents($filename))) {
+ throw new Zend_Translate_Exception(sprintf('XML error: %s at line %d',
+ xml_error_string(xml_get_error_code($this->_file)),
+ xml_get_current_line_number($this->_file)));
+ xml_parser_free($this->_file);
+ }
+
+ if ($this->_defined !== true) {
+ foreach ($this->_translate as $key => $value) {
+ if (!in_array($key, $this->_languages)) {
+ $this->_languages[$key] = $key;
+ }
+ }
+ }
+ }
+
+ private function _startElement($file, $name, $attrib)
+ {
+ switch(strtolower($name)) {
+ case 'tu':
+ if (array_key_exists('tuid', $attrib)) {
+ $this->_tu = $attrib['tuid'];
+ }
+ break;
+ case 'tuv':
+ if (array_key_exists('xml:lang', $attrib)) {
+ $this->_tuv = $attrib['xml:lang'];
+ if (!array_key_exists($this->_tuv, $this->_translate)) {
+ $this->_translate[$this->_tuv] = array();
+ }
+ if (!array_key_exists($this->_tuv, $this->_languages) and ($this->_defined === true)) {
+ $this->_languages[$this->_tuv] = $this->_tuv;
+ }
+ }
+ break;
+ case 'seg':
+ $this->_seg = true;
+ $this->_content = null;
+ break;
+ default:
+ break;
+ }
+ }
+
+ private function _endElement($file, $name)
+ {
+ switch (strtolower($name)) {
+ case 'tu':
+ $this->_tu = null;
+ break;
+ case 'tuv':
+ $this->_tuv = null;
+ break;
+ case 'seg':
+ $this->_seg = null;
+ if (!empty($this->_content) or !array_key_exists($this->_tu, $this->_translate[$this->_tuv])) {
+ $this->_translate[$this->_tuv][$this->_tu] = $this->_content;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ private function _contentElement($file, $data)
+ {
+ if (($this->_seg !== null) and ($this->_tu !== null) and ($this->_tuv !== null)) {
+ $this->_content .= $data;
+ }
+ }
+
+ /**
+ * Returns the adapter name
+ *
+ * @return string
+ */
+ public function toString()
+ {
+ return "Tmx";
+ }
+}
diff --git a/libs/Zend/Translate/Adapter/Xliff.php b/libs/Zend/Translate/Adapter/Xliff.php
new file mode 100755
index 0000000000..fd2673754b
--- /dev/null
+++ b/libs/Zend/Translate/Adapter/Xliff.php
@@ -0,0 +1,178 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Date.php 2498 2006-12-23 22:13:38Z thomas $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_Locale */
+require_once 'Zend/Locale.php';
+
+/** Zend_Translate_Exception */
+require_once 'Zend/Translate/Exception.php';
+
+/** Zend_Translate_Adapter */
+require_once 'Zend/Translate/Adapter.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Translate_Adapter_Xliff extends Zend_Translate_Adapter {
+ // Internal variables
+ private $_file = false;
+ private $_cleared = array();
+ private $_transunit = null;
+ private $_source = null;
+ private $_target = null;
+ private $_scontent = null;
+ private $_tcontent = null;
+ private $_stag = false;
+ private $_ttag = true;
+
+ /**
+ * Generates the xliff adapter
+ * This adapter reads with php's xml_parser
+ *
+ * @param string $data Translation data
+ * @param string|Zend_Locale $locale OPTIONAL Locale/Language to set, identical with locale identifier,
+ * see Zend_Locale for more information
+ */
+ public function __construct($data, $locale = null)
+ {
+ parent::__construct($data, $locale);
+ }
+
+
+ /**
+ * Load translation data (XLIFF file reader)
+ *
+ * @param string $locale Locale/Language to add data for, identical with locale identifier,
+ * see Zend_Locale for more information
+ * @param string $filename XLIFF file to add, full path must be given for access
+ * @param array $option OPTIONAL Options to use
+ * @throws Zend_Translation_Exception
+ */
+ protected function _loadTranslationData($filename, $locale, array $options = array())
+ {
+ $options = array_merge($this->_options, $options);
+
+ if ($options['clear']) {
+ $this->_translate = array();
+ }
+
+ if (!is_readable($filename)) {
+ throw new Zend_Translate_Exception('Translation file \'' . $filename . '\' is not readable.');
+ }
+
+ $this->_file = xml_parser_create();
+ xml_set_object($this->_file, $this);
+ xml_parser_set_option($this->_file, XML_OPTION_CASE_FOLDING, 0);
+ xml_set_element_handler($this->_file, "_startElement", "_endElement");
+ xml_set_character_data_handler($this->_file, "_contentElement");
+
+ if (!xml_parse($this->_file, file_get_contents($filename))) {
+ throw new Zend_Translate_Exception(sprintf('XML error: %s at line %d',
+ xml_error_string(xml_get_error_code($this->_file)),
+ xml_get_current_line_number($this->_file)));
+ xml_parser_free($this->_file);
+ }
+ }
+
+ private function _startElement($file, $name, $attrib)
+ {
+ switch(strtolower($name)) {
+ case 'file':
+ $this->_source = $attrib['source-language'];
+ $this->_target = $attrib['target-language'];
+ $this->_translate[$this->_source] = array();
+ $this->_translate[$this->_target] = array();
+ break;
+ case 'trans-unit':
+ $this->_transunit = true;
+ break;
+ case 'source':
+ if ($this->_transunit === true) {
+ $this->_scontent = null;
+ $this->_stag = true;
+ $this->_ttag = false;
+ }
+ break;
+ case 'target':
+ if ($this->_transunit === true) {
+ $this->_tcontent = null;
+ $this->_ttag = true;
+ $this->_stag = false;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ private function _endElement($file, $name)
+ {
+ switch (strtolower($name)) {
+ case 'trans-unit':
+ $this->_transunit = null;
+ $this->_scontent = null;
+ $this->_tcontent = null;
+ break;
+ case 'source':
+ if (!empty($this->_scontent) and !empty($this->_tcontent) or
+ !array_key_exists($this->_scontent, $this->_translate[$this->_source])) {
+ $this->_translate[$this->_source][$this->_scontent] = $this->_scontent;
+ }
+ $this->_stag = false;
+ break;
+ case 'target':
+ if (!empty($this->_scontent) and !empty($this->_tcontent) or
+ !array_key_exists($this->_scontent, $this->_translate[$this->_source])) {
+ $this->_translate[$this->_target][$this->_scontent] = $this->_tcontent;
+ }
+ $this->_ttag = false;
+ break;
+ default:
+ break;
+ }
+ }
+
+ private function _contentElement($file, $data)
+ {
+ if (($this->_transunit !== null) and ($this->_source !== null) and ($this->_stag === true)) {
+ $this->_scontent .= $data;
+ }
+
+ if (($this->_transunit !== null) and ($this->_target !== null) and ($this->_ttag === true)) {
+ $this->_tcontent .= $data;
+ }
+ }
+
+ /**
+ * Returns the adapter name
+ *
+ * @return string
+ */
+ public function toString()
+ {
+ return "Xliff";
+ }
+}
diff --git a/libs/Zend/Translate/Exception.php b/libs/Zend/Translate/Exception.php
new file mode 100755
index 0000000000..0018ae8ec2
--- /dev/null
+++ b/libs/Zend/Translate/Exception.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Exception.php 1653 2006-11-16 19:53:38Z thomas $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Translate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Translate_Exception extends Zend_Exception
+{
+}
diff --git a/libs/Zend/Uri.php b/libs/Zend/Uri.php
new file mode 100755
index 0000000000..d6246a3f39
--- /dev/null
+++ b/libs/Zend/Uri.php
@@ -0,0 +1,163 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Uri
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Uri.php 5492 2007-06-29 00:51:43Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Uri_Exception
+ */
+require_once 'Zend/Uri/Exception.php';
+
+
+/**
+ * @see Zend_Loader
+ */
+require_once 'Zend/Loader.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Uri
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Uri
+{
+ /**
+ * Scheme of this URI (http, ftp, etc.)
+ * @var string
+ */
+ protected $_scheme = '';
+
+ /**
+ * Return a string representation of this URI.
+ *
+ * @see getUri()
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->getUri();
+ }
+
+ /**
+ * Convenience function, checks that a $uri string is well-formed
+ * by validating it but not returning an object. Returns TRUE if
+ * $uri is a well-formed URI, or FALSE otherwise.
+ *
+ * @param string $uri
+ * @return boolean
+ */
+ public static function check($uri)
+ {
+ try {
+ $uri = self::factory($uri);
+ } catch (Exception $e) {
+ return false;
+ }
+
+ return $uri->valid();
+ }
+
+ /**
+ * Create a new Zend_Uri object for a URI. If building a new URI, then $uri should contain
+ * only the scheme (http, ftp, etc). Otherwise, supply $uri with the complete URI.
+ *
+ * @param string $uri
+ * @throws Zend_Uri_Exception
+ * @return Zend_Uri
+ */
+ public static function factory($uri = 'http')
+ {
+ /**
+ * Separate the scheme from the scheme-specific parts
+ * @link http://www.faqs.org/rfcs/rfc2396.html
+ */
+ $uri = explode(':', $uri, 2);
+ $scheme = strtolower($uri[0]);
+ $schemeSpecific = isset($uri[1]) ? $uri[1] : '';
+
+ if (!strlen($scheme)) {
+ throw new Zend_Uri_Exception('An empty string was supplied for the scheme');
+ }
+
+ // Security check: $scheme is used to load a class file, so only alphanumerics are allowed.
+ if (!ctype_alnum($scheme)) {
+ throw new Zend_Uri_Exception('Illegal scheme supplied, only alphanumeric characters are permitted');
+ }
+
+ /**
+ * Create a new Zend_Uri object for the $uri. If a subclass of Zend_Uri exists for the
+ * scheme, return an instance of that class. Otherwise, a Zend_Uri_Exception is thrown.
+ */
+ switch ($scheme) {
+ case 'http':
+ case 'https':
+ $className = 'Zend_Uri_Http';
+ break;
+ case 'mailto':
+ // @todo
+ default:
+ throw new Zend_Uri_Exception("Scheme \"$scheme\" is not supported");
+ }
+ Zend_Loader::loadClass($className);
+ return new $className($scheme, $schemeSpecific);
+
+ }
+
+ /**
+ * Get the URI's scheme
+ *
+ * @return string|false Scheme or false if no scheme is set.
+ */
+ public function getScheme()
+ {
+ if (!empty($this->_scheme)) {
+ return $this->_scheme;
+ } else {
+ return false;
+ }
+ }
+
+ /******************************************************************************
+ * Abstract Methods
+ *****************************************************************************/
+
+ /**
+ * Zend_Uri and its subclasses cannot be instantiated directly.
+ * Use Zend_Uri::factory() to return a new Zend_Uri object.
+ */
+ abstract protected function __construct($scheme, $schemeSpecific = '');
+
+ /**
+ * Return a string representation of this URI.
+ *
+ * @return string
+ */
+ abstract public function getUri();
+
+ /**
+ * Returns TRUE if this URI is valid, or FALSE otherwise.
+ *
+ * @return boolean
+ */
+ abstract public function valid();
+}
diff --git a/libs/Zend/Uri/Exception.php b/libs/Zend/Uri/Exception.php
new file mode 100755
index 0000000000..4190a30fcb
--- /dev/null
+++ b/libs/Zend/Uri/Exception.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Uri
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Uri
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Uri_Exception extends Zend_Exception
+{}
+
diff --git a/libs/Zend/Uri/Http.php b/libs/Zend/Uri/Http.php
new file mode 100755
index 0000000000..f01c673d9e
--- /dev/null
+++ b/libs/Zend/Uri/Http.php
@@ -0,0 +1,630 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Uri
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Http.php 5051 2007-05-29 19:31:09Z darby $
+ */
+
+
+/**
+ * @see Zend_Uri
+ */
+require_once 'Zend/Uri.php';
+
+
+/**
+ * @see Zend_Validate_Hostname
+ */
+require_once 'Zend/Validate/Hostname.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Uri
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Uri_Http extends Zend_Uri
+{
+ /**
+ * URI parts are divided among these instance variables
+ */
+ protected $_username = '';
+ protected $_password = '';
+ protected $_host = '';
+ protected $_port = '';
+ protected $_path = '';
+ protected $_query = '';
+ protected $_fragment = '';
+
+ /**
+ * Regular expression grammar rules for validation; values added by constructor
+ */
+ protected $_regex = array();
+
+ /**
+ * Constructor accepts a string $scheme (e.g., http, https) and a scheme-specific part of the URI
+ * (e.g., example.com/path/to/resource?query=param#fragment)
+ *
+ * @param string $scheme
+ * @param string $schemeSpecific
+ * @throws Zend_Uri_Exception
+ * @return void
+ */
+ protected function __construct($scheme, $schemeSpecific = '')
+ {
+ // Set the scheme
+ $this->_scheme = $scheme;
+
+ // Set up grammar rules for validation via regular expressions. These
+ // are to be used with slash-delimited regular expression strings.
+ $this->_regex['alphanum'] = '[^\W_]';
+ $this->_regex['escaped'] = '(?:%[\da-fA-F]{2})';
+ $this->_regex['mark'] = '[-_.!~*\'()\[\]]';
+ $this->_regex['reserved'] = '[;\/?:@&=+$,]';
+ $this->_regex['unreserved'] = '(?:' . $this->_regex['alphanum'] . '|' . $this->_regex['mark'] . ')';
+ $this->_regex['segment'] = '(?:(?:' . $this->_regex['unreserved'] . '|' . $this->_regex['escaped']
+ . '|[:@&=+$,;])*)';
+ $this->_regex['path'] = '(?:\/' . $this->_regex['segment'] . '?)+';
+ $this->_regex['uric'] = '(?:' . $this->_regex['reserved'] . '|' . $this->_regex['unreserved'] . '|'
+ . $this->_regex['escaped'] . ')';
+ // If no scheme-specific part was supplied, the user intends to create
+ // a new URI with this object. No further parsing is required.
+ if (strlen($schemeSpecific) == 0) {
+ return;
+ }
+
+ // Parse the scheme-specific URI parts into the instance variables.
+ $this->_parseUri($schemeSpecific);
+
+ // Validate the URI
+ if (!$this->valid()) {
+ throw new Zend_Uri_Exception('Invalid URI supplied');
+ }
+ }
+
+ /**
+ * Parse the scheme-specific portion of the URI and place its parts into instance variables.
+ *
+ * @param string $schemeSpecific
+ * @throws Zend_Uri_Exception
+ * @return void
+ */
+ protected function _parseUri($schemeSpecific)
+ {
+ // High-level decomposition parser
+ $pattern = '~^((//)([^/?#]*))([^?#]*)(\?([^#]*))?(#(.*))?$~';
+ $status = @preg_match($pattern, $schemeSpecific, $matches);
+ if ($status === false) {
+ throw new Zend_Uri_Exception('Internal error: scheme-specific decomposition failed');
+ }
+
+ // Failed decomposition; no further processing needed
+ if (!$status) {
+ return;
+ }
+
+ // Save URI components that need no further decomposition
+ $this->_path = isset($matches[4]) ? $matches[4] : '';
+ $this->_query = isset($matches[6]) ? $matches[6] : '';
+ $this->_fragment = isset($matches[8]) ? $matches[8] : '';
+
+ // Additional decomposition to get username, password, host, and port
+ $combo = isset($matches[3]) ? $matches[3] : '';
+ $pattern = '~^(([^:@]*)(:([^@]*))?@)?([^:]+)(:(.*))?$~';
+ $status = @preg_match($pattern, $combo, $matches);
+ if ($status === false) {
+ throw new Zend_Uri_Exception('Internal error: authority decomposition failed');
+ }
+
+ // Failed decomposition; no further processing needed
+ if (!$status) {
+ return;
+ }
+
+ // Save remaining URI components
+ $this->_username = isset($matches[2]) ? $matches[2] : '';
+ $this->_password = isset($matches[4]) ? $matches[4] : '';
+ $this->_host = isset($matches[5]) ? $matches[5] : '';
+ $this->_port = isset($matches[7]) ? $matches[7] : '';
+
+ }
+
+ /**
+ * Returns a URI based on current values of the instance variables. If any
+ * part of the URI does not pass validation, then an exception is thrown.
+ *
+ * @throws Zend_Uri_Exception
+ * @return string
+ */
+ public function getUri()
+ {
+ if (!$this->valid()) {
+ throw new Zend_Uri_Exception('One or more parts of the URI are invalid');
+ }
+ $password = strlen($this->_password) ? ":$this->_password" : '';
+ $auth = strlen($this->_username) ? "$this->_username$password@" : '';
+ $port = strlen($this->_port) ? ":$this->_port" : '';
+ $query = strlen($this->_query) ? "?$this->_query" : '';
+ $fragment = strlen($this->_fragment) ? "#$this->_fragment" : '';
+ return "$this->_scheme://$auth$this->_host$port$this->_path$query$fragment";
+ }
+
+ /**
+ * Validate the current URI from the instance variables. Returns true if and only if all
+ * parts pass validation.
+ *
+ * @return boolean
+ */
+ public function valid()
+ {
+ /**
+ * Return true if and only if all parts of the URI have passed validation
+ */
+ return $this->validateUsername()
+ && $this->validatePassword()
+ && $this->validateHost()
+ && $this->validatePort()
+ && $this->validatePath()
+ && $this->validateQuery()
+ && $this->validateFragment();
+ }
+
+ /**
+ * Returns the username portion of the URL, or FALSE if none.
+ *
+ * @return string
+ */
+ public function getUsername()
+ {
+ return strlen($this->_username) ? $this->_username : false;
+ }
+
+ /**
+ * Returns true if and only if the username passes validation. If no username is passed,
+ * then the username contained in the instance variable is used.
+ *
+ * @param string $username
+ * @throws Zend_Uri_Exception
+ * @return boolean
+ */
+ public function validateUsername($username = null)
+ {
+ if ($username === null) {
+ $username = $this->_username;
+ }
+
+ // If the username is empty, then it is considered valid
+ if (strlen($username) == 0) {
+ return true;
+ }
+ /**
+ * Check the username against the allowed values
+ *
+ * @link http://www.faqs.org/rfcs/rfc2396.html
+ */
+ $status = @preg_match('/^(' . $this->_regex['alphanum'] . '|' . $this->_regex['mark'] . '|'
+ . $this->_regex['escaped'] . '|[;:&=+$,])+$/', $username);
+ if ($status === false) {
+ throw new Zend_Uri_Exception('Internal error: username validation failed');
+ }
+
+ return $status == 1;
+ }
+
+ /**
+ * Sets the username for the current URI, and returns the old username
+ *
+ * @param string $username
+ * @throws Zend_Uri_Exception
+ * @return string
+ */
+ public function setUsername($username)
+ {
+ if (!$this->validateUsername($username)) {
+ throw new Zend_Uri_Exception("Username \"$username\" is not a valid HTTP username");
+ }
+ $oldUsername = $this->_username;
+ $this->_username = $username;
+ return $oldUsername;
+ }
+
+ /**
+ * Returns the password portion of the URL, or FALSE if none.
+ *
+ * @return string
+ */
+ public function getPassword()
+ {
+ return strlen($this->_password) ? $this->_password : false;
+ }
+
+ /**
+ * Returns true if and only if the password passes validation. If no password is passed,
+ * then the password contained in the instance variable is used.
+ *
+ * @param string $password
+ * @throws Zend_Uri_Exception
+ * @return boolean
+ */
+ public function validatePassword($password = null)
+ {
+ if ($password === null) {
+ $password = $this->_password;
+ }
+
+ // If the password is empty, then it is considered valid
+ if (strlen($password) == 0) {
+ return true;
+ }
+
+ // If the password is nonempty, but there is no username, then it is considered invalid
+ if (strlen($password) > 0 && strlen($this->_username) == 0) {
+ return false;
+ }
+
+ /**
+ * Check the password against the allowed values
+ *
+ * @link http://www.faqs.org/rfcs/rfc2396.html
+ */
+ $status = @preg_match('/^(' . $this->_regex['alphanum'] . '|' . $this->_regex['mark'] . '|'
+ . $this->_regex['escaped'] . '|[;:&=+$,])+$/', $password);
+ if ($status === false) {
+ throw new Zend_Uri_Exception('Internal error: password validation failed.');
+ }
+ return $status == 1;
+ }
+
+ /**
+ * Sets the password for the current URI, and returns the old password
+ *
+ * @param string $password
+ * @throws Zend_Uri_Exception
+ * @return string
+ */
+ public function setPassword($password)
+ {
+ if (!$this->validatePassword($password)) {
+ throw new Zend_Uri_Exception("Password \"$password\" is not a valid HTTP password.");
+ }
+ $oldPassword = $this->_password;
+ $this->_password = $password;
+ return $oldPassword;
+ }
+
+ /**
+ * Returns the domain or host IP portion of the URL, or FALSE if none.
+ *
+ * @return string
+ */
+ public function getHost()
+ {
+ return strlen($this->_host) ? $this->_host : false;
+ }
+
+ /**
+ * Returns true if and only if the host string passes validation. If no host is passed,
+ * then the host contained in the instance variable is used.
+ *
+ * @param string $host
+ * @return boolean
+ * @uses Zend_Filter
+ */
+ public function validateHost($host = null)
+ {
+ if ($host === null) {
+ $host = $this->_host;
+ }
+
+ /**
+ * If the host is empty, then it is considered invalid
+ */
+ if (strlen($host) == 0) {
+ return false;
+ }
+
+ /**
+ * Check the host against the allowed values; delegated to Zend_Filter.
+ */
+ $validate = new Zend_Validate_Hostname(Zend_Validate_Hostname::ALLOW_ALL);
+ return $validate->isValid($host);
+ }
+
+ /**
+ * Sets the host for the current URI, and returns the old host
+ *
+ * @param string $host
+ * @throws Zend_Uri_Exception
+ * @return string
+ */
+ public function setHost($host)
+ {
+ if (!$this->validateHost($host)) {
+ throw new Zend_Uri_Exception("Host \"$host\" is not a valid HTTP host");
+ }
+ $oldHost = $this->_host;
+ $this->_host = $host;
+ return $oldHost;
+ }
+
+ /**
+ * Returns the TCP port, or FALSE if none.
+ *
+ * @return string
+ */
+ public function getPort()
+ {
+ return strlen($this->_port) ? $this->_port : false;
+ }
+
+ /**
+ * Returns true if and only if the TCP port string passes validation. If no port is passed,
+ * then the port contained in the instance variable is used.
+ *
+ * @param string $port
+ * @return boolean
+ */
+ public function validatePort($port = null)
+ {
+ if ($port === null) {
+ $port = $this->_port;
+ }
+
+ // If the port is empty, then it is considered valid
+ if (!strlen($port)) {
+ return true;
+ }
+
+ // Check the port against the allowed values
+ return ctype_digit((string)$port) && 1 <= $port && $port <= 65535;
+ }
+
+ /**
+ * Sets the port for the current URI, and returns the old port
+ *
+ * @param string $port
+ * @throws Zend_Uri_Exception
+ * @return string
+ */
+ public function setPort($port)
+ {
+ if (!$this->validatePort($port)) {
+ throw new Zend_Uri_Exception("Port \"$port\" is not a valid HTTP port.");
+ }
+ $oldPort = $this->_port;
+ $this->_port = $port;
+ return $oldPort;
+ }
+
+ /**
+ * Returns the path and filename portion of the URL, or FALSE if none.
+ *
+ * @return string
+ */
+ public function getPath()
+ {
+ return strlen($this->_path) ? $this->_path : '/';
+ }
+
+ /**
+ * Returns true if and only if the path string passes validation. If no path is passed,
+ * then the path contained in the instance variable is used.
+ *
+ * @param string $path
+ * @throws Zend_Uri_Exception
+ * @return boolean
+ */
+ public function validatePath($path = null)
+ {
+ if ($path === null) {
+ $path = $this->_path;
+ }
+ /**
+ * If the path is empty, then it is considered valid
+ */
+ if (strlen($path) == 0) {
+ return true;
+ }
+ /**
+ * Determine whether the path is well-formed
+ */
+ $pattern = '/^' . $this->_regex['path'] . '$/';
+ $status = @preg_match($pattern, $path);
+ if ($status === false) {
+ throw new Zend_Uri_Exception('Internal error: path validation failed');
+ }
+ if (!$status) {
+ echo "'$path' does not match pattern '$pattern'\n";
+ }
+ return (boolean) $status;
+ }
+
+ /**
+ * Sets the path for the current URI, and returns the old path
+ *
+ * @param string $path
+ * @throws Zend_Uri_Exception
+ * @return string
+ */
+ public function setPath($path)
+ {
+ if (!$this->validatePath($path)) {
+ throw new Zend_Uri_Exception("Path \"$path\" is not a valid HTTP path");
+ }
+ $oldPath = $this->_path;
+ $this->_path = $path;
+ return $oldPath;
+ }
+
+ /**
+ * Returns the query portion of the URL (after ?), or FALSE if none.
+ *
+ * @return string
+ */
+ public function getQuery()
+ {
+ return strlen($this->_query) ? $this->_query : false;
+ }
+
+ /**
+ * Returns true if and only if the query string passes validation. If no query is passed,
+ * then the query string contained in the instance variable is used.
+ *
+ * @param string $query
+ * @throws Zend_Uri_Exception
+ * @return boolean
+ */
+ public function validateQuery($query = null)
+ {
+ if ($query === null) {
+ $query = $this->_query;
+ }
+
+ // If query is empty, it is considered to be valid
+ if (strlen($query) == 0) {
+ return true;
+ }
+
+ /**
+ * Determine whether the query is well-formed
+ *
+ * @link http://www.faqs.org/rfcs/rfc2396.html
+ */
+ $pattern = '/^' . $this->_regex['uric'] . '*$/';
+ $status = @preg_match($pattern, $query);
+ if ($status === false) {
+ throw new Zend_Uri_Exception('Internal error: query validation failed');
+ }
+
+ return $status == 1;
+ }
+
+ /**
+ * Set the query string for the current URI, and return the old query
+ * string This method accepts both strings and arrays.
+ *
+ * @param string|array $query The query string or array
+ * @return string Old query string
+ */
+ public function setQuery($query)
+ {
+ $oldQuery = $this->_query;
+ $this->_query = $this->_parseQuery($query);
+ return $oldQuery;
+ }
+
+ /**
+ * Parse a query string or array, validate it and return it as a query string
+ *
+ * @param string|array $query
+ * @return string
+ */
+ protected function _parseQuery($query)
+ {
+ // If query is empty, return an empty string
+ if (empty($query)) {
+ return '';
+ }
+
+ // If query is an array, make a string out of it
+ if (is_array($query)) {
+ // fails on PHP < 5.1.2
+ $query_str = @http_build_query($query, '', '&');
+ // If it failed, try calling with only 2 args
+ if (!$query_str) {
+ $query_str = http_build_query($query, '');
+ }
+ // Just in case they use &amp; in their php.ini, replace it with &
+ $query_str = str_replace("&amp;", "&", $query_str);
+
+ $query = $query_str;
+ } else {
+ $query = (string) $query;
+ }
+
+ // Make sure the query is valid, and set it
+ if ($this->validateQuery($query)) {
+ return $query;
+ } else {
+ throw new Zend_Uri_Exception("'$query' is not a valid query string");
+ }
+ return $query;
+ }
+
+ /**
+ * Returns the fragment portion of the URL (after #), or FALSE if none.
+ *
+ * @return string|false
+ */
+ public function getFragment()
+ {
+ return strlen($this->_fragment) ? $this->_fragment : false;
+ }
+
+ /**
+ * Returns true if and only if the fragment passes validation. If no fragment is passed,
+ * then the fragment contained in the instance variable is used.
+ *
+ * @param string $fragment
+ * @throws Zend_Uri_Exception
+ * @return boolean
+ */
+ public function validateFragment($fragment = null)
+ {
+ if ($fragment === null) {
+ $fragment = $this->_fragment;
+ }
+
+ // If fragment is empty, it is considered to be valid
+ if (strlen($fragment) == 0) {
+ return true;
+ }
+
+ /**
+ * Determine whether the fragment is well-formed
+ *
+ * @link http://www.faqs.org/rfcs/rfc2396.html
+ */
+ $pattern = '/^' . $this->_regex['uric'] . '*$/';
+ $status = @preg_match($pattern, $fragment);
+ if ($status === false) {
+ throw new Zend_Uri_Exception('Internal error: fragment validation failed');
+ }
+
+ return (boolean) $status;
+ }
+
+ /**
+ * Sets the fragment for the current URI, and returns the old fragment
+ *
+ * @param string $fragment
+ * @throws Zend_Uri_Exception
+ * @return string
+ */
+ public function setFragment($fragment)
+ {
+ if (!$this->validateFragment($fragment)) {
+ throw new Zend_Uri_Exception("Fragment \"$fragment\" is not a valid HTTP fragment");
+ }
+ $oldFragment = $this->_fragment;
+ $this->_fragment = $fragment;
+ return $oldFragment;
+ }
+}
+
diff --git a/libs/Zend/Validate.php b/libs/Zend/Validate.php
new file mode 100755
index 0000000000..96f20cfeae
--- /dev/null
+++ b/libs/Zend/Validate.php
@@ -0,0 +1,160 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Validate.php 4974 2007-05-25 21:11:56Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Validate_Interface
+ */
+require_once 'Zend/Validate/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate implements Zend_Validate_Interface
+{
+ /**
+ * Validator chain
+ *
+ * @var array
+ */
+ protected $_validators = array();
+
+ /**
+ * Array of validation failure messages
+ *
+ * @var array
+ */
+ protected $_messages = array();
+
+ /**
+ * Array of validation failure messages
+ *
+ * @var array
+ */
+ protected $_errors = array();
+
+ /**
+ * Adds a validator to the end of the chain
+ *
+ * If $breakChainOnFailure is true, then if the validator fails, the next validator in the chain,
+ * if one exists, will not be executed.
+ *
+ * @param Zend_Validate_Interface $validator
+ * @param boolean $breakChainOnFailure
+ * @return Zend_Validate Provides a fluent interface
+ */
+ public function addValidator(Zend_Validate_Interface $validator, $breakChainOnFailure = false)
+ {
+ $this->_validators[] = array('instance' => $validator, 'breakChainOnFailure' => $breakChainOnFailure);
+ return $this;
+ }
+
+ /**
+ * Returns true if and only if $value passes all validations in the chain
+ *
+ * Validators are run in the order in which they were added to the chain (FIFO).
+ *
+ * @param mixed $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $this->_messages = array();
+ $this->_errors = array();
+ $result = true;
+ foreach ($this->_validators as $element) {
+ $validator = $element['instance'];
+ if ($validator->isValid($value)) {
+ continue;
+ }
+ $result = false;
+ $this->_messages = array_merge($this->_messages, $validator->getMessages());
+ $this->_errors = array_merge($this->_errors, $validator->getErrors());
+ if ($element['breakChainOnFailure']) {
+ break;
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns array of validation failure messages
+ *
+ * @return array
+ */
+ public function getMessages()
+ {
+ return $this->_messages;
+ }
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns array of validation failure messages
+ *
+ * @return array
+ */
+ public function getErrors()
+ {
+ return $this->_errors;
+ }
+
+ /**
+ * @param mixed $value
+ * @param string $classBaseName
+ * @param array $args OPTIONAL
+ * @param mixed $namespaces OPTIONAL
+ * @return boolean
+ * @throws Zend_Validate_Exception
+ */
+ public static function is($value, $classBaseName, array $args = array(), $namespaces = array())
+ {
+ $namespaces = array_merge(array('Zend_Validate'), (array) $namespaces);
+ foreach ($namespaces as $namespace) {
+ $className = $namespace . '_' . ucfirst($classBaseName);
+ try {
+ require_once 'Zend/Loader.php';
+ Zend_Loader::loadClass($className);
+ $class = new ReflectionClass($className);
+ if ($class->implementsInterface('Zend_Validate_Interface')) {
+ if ($class->hasMethod('__construct')) {
+ $object = $class->newInstanceArgs($args);
+ } else {
+ $object = $class->newInstance();
+ }
+ return $object->isValid($value);
+ }
+ } catch (Zend_Exception $ze) {
+ // fallthrough and continue
+ }
+ }
+ require_once 'Zend/Validate/Exception.php';
+ throw new Zend_Validate_Exception("Validate class not found from basename '$classBaseName'");
+ }
+
+}
diff --git a/libs/Zend/Validate/Abstract.php b/libs/Zend/Validate/Abstract.php
new file mode 100755
index 0000000000..a43975b452
--- /dev/null
+++ b/libs/Zend/Validate/Abstract.php
@@ -0,0 +1,190 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Abstract.php 5411 2007-06-22 14:08:39Z bkarwin $
+ */
+
+/**
+ * @see Zend_Validate_Interface
+ */
+require_once 'Zend/Validate/Interface.php';
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Validate_Abstract implements Zend_Validate_Interface
+{
+
+ /**
+ * @var mixed
+ */
+ protected $_value;
+
+ /**
+ * Additional variables available for validation failure messages
+ *
+ * @var array
+ */
+ protected $_messageVariables = array();
+
+ /**
+ * Validation failure message template definitions
+ *
+ * @var array
+ */
+ protected $_messageTemplates = array();
+
+ /**
+ * @var array
+ */
+ protected $_messages = array();
+
+ /**
+ * @var array
+ */
+ protected $_errors = array();
+
+ /**
+ * @param string $messageKey
+ * @param string $value
+ * @return string
+ */
+ protected function _createMessage($messageKey, $value)
+ {
+ if (!isset($this->_messageTemplates[$messageKey])) {
+ return null;
+ }
+
+ $message = $this->_messageTemplates[$messageKey];
+ $message = str_replace("%value%", (string) $value, $message);
+ foreach ($this->_messageVariables as $ident => $property) {
+ $message = str_replace("%$ident%", $this->$property, $message);
+ }
+ return $message;
+ }
+
+ /**
+ * @param string $messageKey OPTIONAL
+ * @param string $value OPTIONAL
+ * @return void
+ */
+ protected function _error($messageKey = null, $value = null)
+ {
+ if ($messageKey === null) {
+ $keys = array_keys($this->_messageTemplates);
+ $messageKey = current($keys);
+ }
+ if ($value === null) {
+ $value = $this->_value;
+ }
+ $this->_errors[] = $messageKey;
+ $this->_messages[] = $this->_createMessage($messageKey, $value);
+ }
+
+ /**
+ * @param mixed $value
+ * @return void
+ */
+ protected function _setValue($value)
+ {
+ $this->_value = $value;
+ $this->_errors = array();
+ $this->_messages = array();
+ }
+
+ /**
+ * @return array
+ */
+ public function getErrors()
+ {
+ return $this->_errors;
+ }
+
+ /**
+ * @return array
+ */
+ public function getMessages()
+ {
+ return $this->_messages;
+ }
+
+ /**
+ * @return array
+ */
+ public function getMessageVariables()
+ {
+ return array_keys($this->_messageVariables);
+ }
+
+ /**
+ * @param string $messageString
+ * @param string $messageKey OPTIONAL
+ * @return Zend_Validate_Abstract
+ * @throws Zend_Validate_Exception
+ */
+ public function setMessage($messageString, $messageKey = null)
+ {
+ if ($messageKey === null) {
+ $keys = array_keys($this->_messageTemplates);
+ $messageKey = current($keys);
+ }
+ if (!isset($this->_messageTemplates[$messageKey])) {
+ require_once 'Zend/Validate/Exception.php';
+ throw new Zend_Validate_Exception("No message template exists for key '$messageKey'");
+ }
+ $this->_messageTemplates[$messageKey] = $messageString;
+ return $this;
+ }
+
+ /**
+ * @param array $messages
+ * @return Zend_Validate_Abstract
+ */
+ public function setMessages(array $messages)
+ {
+ foreach ($messages as $key => $message) {
+ $this->setMessage($message, $key);
+ }
+ return $this;
+ }
+
+ /**
+ * @param string $property
+ * @return mixed
+ * @throws Zend_Validate_Exception
+ */
+ public function __get($property)
+ {
+ if ($property == 'value') {
+ return $this->_value;
+ }
+ if (array_key_exists($property, $this->_messageVariables)) {
+ return $this->{$this->_messageVariables[$property]};
+ }
+ /**
+ * @see Zend_Validate_Exception
+ */
+ require_once 'Zend/Validate/Exception.php';
+ throw new Zend_Validate_Exception("No property exists by the name '$property'");
+ }
+
+}
diff --git a/libs/Zend/Validate/Alnum.php b/libs/Zend/Validate/Alnum.php
new file mode 100755
index 0000000000..6ceaf7ab8c
--- /dev/null
+++ b/libs/Zend/Validate/Alnum.php
@@ -0,0 +1,120 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Alnum.php 5347 2007-06-15 19:30:56Z darby $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Alnum extends Zend_Validate_Abstract
+{
+ /**
+ * Validation failure message key for when the value contains non-alphabetic or non-digit characters
+ */
+ const NOT_ALNUM = 'notAlnum';
+
+ /**
+ * Validation failure message key for when the value is an empty string
+ */
+ const STRING_EMPTY = 'stringEmpty';
+
+ /**
+ * Whether to allow white space characters; off by default
+ *
+ * @var boolean
+ */
+ public $allowWhiteSpace;
+
+ /**
+ * Alphanumeric filter used for validation
+ *
+ * @var Zend_Filter_Alnum
+ */
+ protected static $_filter = null;
+
+ /**
+ * Validation failure message template definitions
+ *
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::NOT_ALNUM => "'%value%' has not only alphabetic and digit characters",
+ self::STRING_EMPTY => "'%value%' is an empty string"
+ );
+
+ /**
+ * Sets default option values for this instance
+ *
+ * @param boolean $allowWhiteSpace
+ * @return void
+ */
+ public function __construct($allowWhiteSpace = false)
+ {
+ $this->allowWhiteSpace = (boolean) $allowWhiteSpace;
+ }
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value contains only alphabetic and digit characters
+ *
+ * @param string $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $valueString = (string) $value;
+
+ $this->_setValue($valueString);
+
+ if ('' === $valueString) {
+ $this->_error(self::STRING_EMPTY);
+ return false;
+ }
+
+ if (null === self::$_filter) {
+ /**
+ * @see Zend_Filter_Alnum
+ */
+ require_once 'Zend/Filter/Alnum.php';
+ self::$_filter = new Zend_Filter_Alnum();
+ }
+
+ self::$_filter->allowWhiteSpace = $this->allowWhiteSpace;
+
+ if ($valueString !== self::$_filter->filter($valueString)) {
+ $this->_error(self::NOT_ALNUM);
+ return false;
+ }
+
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Validate/Alpha.php b/libs/Zend/Validate/Alpha.php
new file mode 100755
index 0000000000..4775dba7b9
--- /dev/null
+++ b/libs/Zend/Validate/Alpha.php
@@ -0,0 +1,120 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Alpha.php 5347 2007-06-15 19:30:56Z darby $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Alpha extends Zend_Validate_Abstract
+{
+ /**
+ * Validation failure message key for when the value contains non-alphabetic characters
+ */
+ const NOT_ALPHA = 'notAlpha';
+
+ /**
+ * Validation failure message key for when the value is an empty string
+ */
+ const STRING_EMPTY = 'stringEmpty';
+
+ /**
+ * Whether to allow white space characters; off by default
+ *
+ * @var boolean
+ */
+ public $allowWhiteSpace;
+
+ /**
+ * Alphabetic filter used for validation
+ *
+ * @var Zend_Filter_Alpha
+ */
+ protected static $_filter = null;
+
+ /**
+ * Validation failure message template definitions
+ *
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::NOT_ALPHA => "'%value%' has not only alphabetic characters",
+ self::STRING_EMPTY => "'%value%' is an empty string"
+ );
+
+ /**
+ * Sets default option values for this instance
+ *
+ * @param boolean $allowWhiteSpace
+ * @return void
+ */
+ public function __construct($allowWhiteSpace = false)
+ {
+ $this->allowWhiteSpace = (boolean) $allowWhiteSpace;
+ }
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value contains only alphabetic characters
+ *
+ * @param string $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $valueString = (string) $value;
+
+ $this->_setValue($valueString);
+
+ if ('' === $valueString) {
+ $this->_error(self::STRING_EMPTY);
+ return false;
+ }
+
+ if (null === self::$_filter) {
+ /**
+ * @see Zend_Filter_Alpha
+ */
+ require_once 'Zend/Filter/Alpha.php';
+ self::$_filter = new Zend_Filter_Alpha();
+ }
+
+ self::$_filter->allowWhiteSpace = $this->allowWhiteSpace;
+
+ if ($valueString !== self::$_filter->filter($valueString)) {
+ $this->_error(self::NOT_ALPHA);
+ return false;
+ }
+
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Validate/Between.php b/libs/Zend/Validate/Between.php
new file mode 100755
index 0000000000..9f860114b0
--- /dev/null
+++ b/libs/Zend/Validate/Between.php
@@ -0,0 +1,200 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Between.php 5134 2007-06-06 17:54:16Z darby $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Between extends Zend_Validate_Abstract
+{
+ /**
+ * Validation failure message key for when the value is not between the min and max, inclusively
+ */
+ const NOT_BETWEEN = 'notBetween';
+
+ /**
+ * Validation failure message key for when the value is not strictly between the min and max
+ */
+ const NOT_BETWEEN_STRICT = 'notBetweenStrict';
+
+ /**
+ * Validation failure message template definitions
+ *
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::NOT_BETWEEN => "'%value%' is not between '%min%' and '%max%', inclusively",
+ self::NOT_BETWEEN_STRICT => "'%value%' is not strictly between '%min%' and '%max%'"
+ );
+
+ /**
+ * Additional variables available for validation failure messages
+ *
+ * @var array
+ */
+ protected $_messageVariables = array(
+ 'min' => '_min',
+ 'max' => '_max'
+ );
+
+ /**
+ * Minimum value
+ *
+ * @var mixed
+ */
+ protected $_min;
+
+ /**
+ * Maximum value
+ *
+ * @var mixed
+ */
+ protected $_max;
+
+ /**
+ * Whether to do inclusive comparisons, allowing equivalence to min and/or max
+ *
+ * If false, then strict comparisons are done, and the value may equal neither
+ * the min nor max options
+ *
+ * @var boolean
+ */
+ protected $_inclusive;
+
+ /**
+ * Sets validator options
+ *
+ * @param mixed $min
+ * @param mixed $max
+ * @param boolean $inclusive
+ * @return void
+ */
+ public function __construct($min, $max, $inclusive = true)
+ {
+ $this->setMin($min)
+ ->setMax($max)
+ ->setInclusive($inclusive);
+ }
+
+ /**
+ * Returns the min option
+ *
+ * @return mixed
+ */
+ public function getMin()
+ {
+ return $this->_min;
+ }
+
+ /**
+ * Sets the min option
+ *
+ * @param mixed $min
+ * @return Zend_Validate_Between Provides a fluent interface
+ */
+ public function setMin($min)
+ {
+ $this->_min = $min;
+ return $this;
+ }
+
+ /**
+ * Returns the max option
+ *
+ * @return mixed
+ */
+ public function getMax()
+ {
+ return $this->_max;
+ }
+
+ /**
+ * Sets the max option
+ *
+ * @param mixed $max
+ * @return Zend_Validate_Between Provides a fluent interface
+ */
+ public function setMax($max)
+ {
+ $this->_max = $max;
+ return $this;
+ }
+
+ /**
+ * Returns the inclusive option
+ *
+ * @return boolean
+ */
+ public function getInclusive()
+ {
+ return $this->_inclusive;
+ }
+
+ /**
+ * Sets the inclusive option
+ *
+ * @param boolean $inclusive
+ * @return Zend_Validate_Between Provides a fluent interface
+ */
+ public function setInclusive($inclusive)
+ {
+ $this->_inclusive = $inclusive;
+ return $this;
+ }
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value is between min and max options, inclusively
+ * if inclusive option is true.
+ *
+ * @param mixed $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $this->_setValue($value);
+
+ if ($this->_inclusive) {
+ if ($this->_min > $value || $value > $this->_max) {
+ $this->_error(self::NOT_BETWEEN);
+ return false;
+ }
+ } else {
+ if ($this->_min >= $value || $value >= $this->_max) {
+ $this->_error(self::NOT_BETWEEN_STRICT);
+ return false;
+ }
+ }
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Validate/Ccnum.php b/libs/Zend/Validate/Ccnum.php
new file mode 100755
index 0000000000..276dd5141b
--- /dev/null
+++ b/libs/Zend/Validate/Ccnum.php
@@ -0,0 +1,111 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Ccnum.php 5134 2007-06-06 17:54:16Z darby $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Ccnum extends Zend_Validate_Abstract
+{
+ /**
+ * Validation failure message key for when the value is not of valid length
+ */
+ const LENGTH = 'ccnumLength';
+
+ /**
+ * Validation failure message key for when the value fails the mod-10 checksum
+ */
+ const CHECKSUM = 'ccnumChecksum';
+
+ /**
+ * Digits filter for input
+ *
+ * @var Zend_Filter_Digits
+ */
+ protected static $_filter = null;
+
+ /**
+ * Validation failure message template definitions
+ *
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::LENGTH => "'%value%' must contain between 13 and 19 digits",
+ self::CHECKSUM => "Luhn algorithm (mod-10 checksum) failed on '%value%'"
+ );
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value follows the Luhn algorithm (mod-10 checksum)
+ *
+ * @param string $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $this->_setValue($value);
+
+ if (null === self::$_filter) {
+ /**
+ * @see Zend_Filter_Digits
+ */
+ require_once 'Zend/Filter/Digits.php';
+ self::$_filter = new Zend_Filter_Digits();
+ }
+
+ $valueFiltered = self::$_filter->filter($value);
+
+ $length = strlen($valueFiltered);
+
+ if ($length < 13 || $length > 19) {
+ $this->_error(self::LENGTH);
+ return false;
+ }
+
+ $sum = 0;
+ $weight = 2;
+
+ for ($i = $length - 2; $i >= 0; $i--) {
+ $digit = $weight * $valueFiltered[$i];
+ $sum += floor($digit / 10) + $digit % 10;
+ $weight = $weight % 2 + 1;
+ }
+
+ if ((10 - $sum % 10) % 10 != $valueFiltered[$length - 1]) {
+ $this->_error(self::CHECKSUM, $valueFiltered);
+ return false;
+ }
+
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Validate/Date.php b/libs/Zend/Validate/Date.php
new file mode 100755
index 0000000000..1d11d11f45
--- /dev/null
+++ b/libs/Zend/Validate/Date.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Date.php 5134 2007-06-06 17:54:16Z darby $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Date extends Zend_Validate_Abstract
+{
+ /**
+ * Validation failure message key for when the value does not follow the YYYY-MM-DD format
+ */
+ const NOT_YYYY_MM_DD = 'dateNotYYYY-MM-DD';
+
+ /**
+ * Validation failure message key for when the value does not appear to be a valid date
+ */
+ const INVALID = 'dateInvalid';
+
+ /**
+ * Validation failure message template definitions
+ *
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::NOT_YYYY_MM_DD => "'%value%' is not of the format YYYY-MM-DD",
+ self::INVALID => "'%value%' does not appear to be a valid date"
+ );
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value is a valid date of the format YYYY-MM-DD
+ *
+ * @param string $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $valueString = (string) $value;
+
+ $this->_setValue($valueString);
+
+ if (!preg_match('/\d{4}-\d{2}-\d{2}/', $valueString)) {
+ $this->_error(self::NOT_YYYY_MM_DD);
+ return false;
+ }
+
+ list($year, $month, $day) = sscanf($valueString, '%d-%d-%d');
+
+ if (!checkdate($month, $day, $year)) {
+ $this->_error(self::INVALID);
+ return false;
+ }
+
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Validate/Digits.php b/libs/Zend/Validate/Digits.php
new file mode 100755
index 0000000000..8fac652708
--- /dev/null
+++ b/libs/Zend/Validate/Digits.php
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Digits.php 5159 2007-06-07 18:23:05Z darby $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Digits extends Zend_Validate_Abstract
+{
+ /**
+ * Validation failure message key for when the value contains non-digit characters
+ */
+ const NOT_DIGITS = 'notDigits';
+
+ /**
+ * Validation failure message key for when the value is an empty string
+ */
+ const STRING_EMPTY = 'stringEmpty';
+
+ /**
+ * Digits filter used for validation
+ *
+ * @var Zend_Filter_Digits
+ */
+ protected static $_filter = null;
+
+ /**
+ * Validation failure message template definitions
+ *
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::NOT_DIGITS => "'%value%' contains not only digit characters",
+ self::STRING_EMPTY => "'%value%' is an empty string"
+ );
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value only contains digit characters
+ *
+ * @param string $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $valueString = (string) $value;
+
+ $this->_setValue($valueString);
+
+ if ('' === $valueString) {
+ $this->_error(self::STRING_EMPTY);
+ return false;
+ }
+
+ if (null === self::$_filter) {
+ /**
+ * @see Zend_Filter_Digits
+ */
+ require_once 'Zend/Filter/Digits.php';
+ self::$_filter = new Zend_Filter_Digits();
+ }
+
+ if ($valueString !== self::$_filter->filter($valueString)) {
+ $this->_error(self::NOT_DIGITS);
+ return false;
+ }
+
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Validate/EmailAddress.php b/libs/Zend/Validate/EmailAddress.php
new file mode 100755
index 0000000000..d5566bf91b
--- /dev/null
+++ b/libs/Zend/Validate/EmailAddress.php
@@ -0,0 +1,250 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: EmailAddress.php 4974 2007-05-25 21:11:56Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @see Zend_Validate_Hostname
+ */
+require_once 'Zend/Validate/Hostname.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_EmailAddress extends Zend_Validate_Abstract
+{
+
+ const INVALID = 'emailAddressInvalid';
+ const INVALID_HOSTNAME = 'emailAddressInvalidHostname';
+ const INVALID_MX_RECORD = 'emailAddressInvalidMxRecord';
+ const DOT_ATOM = 'emailAddressDotAtom';
+ const QUOTED_STRING = 'emailAddressQuotedString';
+ const INVALID_LOCAL_PART = 'emailAddressInvalidLocalPart';
+
+ /**
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::INVALID => "'%value%' is not a valid email address in the basic format local-part@hostname",
+ self::INVALID_HOSTNAME => "'%hostname%' is not a valid hostname for email address '%value%'",
+ self::INVALID_MX_RECORD => "'%hostname%' does not appear to have a valid MX record for the email address '%value%'",
+ self::DOT_ATOM => "'%localpart%' not matched against dot-atom format",
+ self::QUOTED_STRING => "'%localpart%' not matched against quoted-string format",
+ self::INVALID_LOCAL_PART => "'%localpart%' is not a valid local part for email address '%value%'"
+ );
+
+ /**
+ * @var array
+ */
+ protected $_messageVariables = array(
+ 'hostname' => '_hostname',
+ 'localPart' => '_localPart'
+ );
+
+ /**
+ * Local object for validating the hostname part of an email address
+ *
+ * @var Zend_Validate_Hostname
+ */
+ public $hostnameValidator;
+
+ /**
+ * Whether we check for a valid MX record via DNS
+ *
+ * @var boolean
+ */
+ protected $_validateMx = false;
+
+ /**
+ * @var string
+ */
+ protected $_hostname;
+
+ /**
+ * @var string
+ */
+ protected $_localPart;
+
+ /**
+ * Instantiates hostname validator for local use
+ *
+ * You can pass a bitfield to determine what types of hostnames are allowed.
+ * These bitfields are defined by the ALLOW_* constants in Zend_Validate_Hostname
+ * The default is to allow DNS hostnames only
+ *
+ * @param integer $allow OPTIONAL
+ * @param bool $validateMx OPTIONAL
+ * @param Zend_Validate_Hostname $hostnameValidator OPTIONAL
+ * @return void
+ */
+ public function __construct($allow = Zend_Validate_Hostname::ALLOW_DNS, $validateMx = false, Zend_Validate_Hostname $hostnameValidator = null)
+ {
+ $this->setValidateMx($validateMx);
+ $this->setHostnameValidator($hostnameValidator, $allow);
+ }
+
+ /**
+ * @param Zend_Validate_Hostname $hostnameValidator OPTIONAL
+ * @param int $allow OPTIONAL
+ * @return void
+ */
+ public function setHostnameValidator(Zend_Validate_Hostname $hostnameValidator = null, $allow = Zend_Validate_Hostname::ALLOW_DNS)
+ {
+ if ($hostnameValidator === null) {
+ $hostnameValidator = new Zend_Validate_Hostname($allow);
+ }
+ $this->hostnameValidator = $hostnameValidator;
+ }
+
+ /**
+ * Whether MX checking via dns_get_mx is supported or not
+ *
+ * This currently only works on UNIX systems
+ *
+ * @return boolean
+ */
+ public function validateMxSupported()
+ {
+ return function_exists('dns_get_mx');
+ }
+
+ /**
+ * Set whether we check for a valid MX record via DNS
+ *
+ * This only applies when DNS hostnames are validated
+ *
+ * @param boolean $allowed Set allowed to true to validate for MX records, and false to not validate them
+ */
+ public function setValidateMx($allowed)
+ {
+ $this->_validateMx = (bool) $allowed;
+ }
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value is a valid email address
+ * according to RFC2822
+ *
+ * @link http://www.ietf.org/rfc/rfc2822.txt RFC2822
+ * @link http://www.columbia.edu/kermit/ascii.html US-ASCII characters
+ * @param string $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $valueString = (string) $value;
+
+ $this->_setValue($valueString);
+
+ // Split email address up
+ if (!preg_match('/^(.+)@([^@]+)$/', $valueString, $matches)) {
+ $this->_error(self::INVALID);
+ return false;
+ }
+
+ $this->_localPart = $matches[1];
+ $this->_hostname = $matches[2];
+
+ // Match hostname part
+ $hostnameResult = $this->hostnameValidator->isValid($this->_hostname);
+ if (!$hostnameResult) {
+ $this->_error(self::INVALID_HOSTNAME);
+
+ // Get messages and errors from hostnameValidator
+ foreach ($this->hostnameValidator->getMessages() as $message) {
+ $this->_messages[] = $message;
+ }
+ foreach ($this->hostnameValidator->getErrors() as $error) {
+ $this->_errors[] = $error;
+ }
+ }
+
+ // MX check on hostname via dns_get_record()
+ if ($this->_validateMx) {
+ if ($this->validateMxSupported()) {
+ $result = dns_get_mx($this->_hostname, $mxHosts);
+ if (count($mxHosts) < 1) {
+ $hostnameResult = false;
+ $this->_error(self::INVALID_MX_RECORD);
+ }
+ } else {
+ /**
+ * MX checks are not supported by this system
+ * @see Zend_Validate_Exception
+ */
+ require_once 'Zend/Validate/Exception.php';
+ throw new Zend_Validate_Exception('Internal error: MX checking not available on this system');
+ }
+ }
+
+ // First try to match the local part on the common dot-atom format
+ $localResult = false;
+
+ // Dot-atom characters are: 1*atext *("." 1*atext)
+ // atext: ALPHA / DIGIT / and "!", "#", "$", "%", "&", "'", "*",
+ // "-", "/", "=", "?", "^", "_", "`", "{", "|", "}", "~"
+ $atext = 'a-zA-Z0-9\x21\x23\x24\x25\x26\x27\x2a\x2b\x2d\x2f\x3d\x3f\x5e\x5f\x60\x7b\x7c\x7d';
+ if (preg_match('/^[' . $atext . ']+(\x2e+[' . $atext . ']+)*$/', $this->_localPart)) {
+ $localResult = true;
+ } else {
+ $this->_error(self::DOT_ATOM);
+ }
+
+ // If not matched, try quoted string format
+ if (!$localResult) {
+
+ // Quoted-string characters are: DQUOTE *([FWS] qtext/quoted-pair) [FWS] DQUOTE
+ // qtext: Non white space controls, and the rest of the US-ASCII characters not
+ // including "\" or the quote character
+ $noWsCtl = '\x01-\x08\x0b\x0c\x0e-\x1f\x7f';
+ $qtext = $noWsCtl . '\x21\x23-\x5b\x5d-\x7e';
+ $ws = '\x20\x09';
+ if (preg_match('/^\x22([' . $ws . $qtext . '])*[$ws]?\x22$/', $this->_localPart)) {
+ $localResult = true;
+ } else {
+ $this->_error(self::QUOTED_STRING);
+ }
+ }
+
+ if (!$localResult) {
+ $this->_error(self::INVALID_LOCAL_PART);
+ }
+
+ // If both parts valid, return true
+ if ($localResult && $hostnameResult) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+}
diff --git a/libs/Zend/Validate/Exception.php b/libs/Zend/Validate/Exception.php
new file mode 100755
index 0000000000..6bc3c536d3
--- /dev/null
+++ b/libs/Zend/Validate/Exception.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Exception.php 3278 2007-02-07 21:54:50Z darby $
+ */
+
+
+/**
+ * @see Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Exception extends Zend_Exception
+{}
diff --git a/libs/Zend/Validate/Float.php b/libs/Zend/Validate/Float.php
new file mode 100755
index 0000000000..f42b25bf9a
--- /dev/null
+++ b/libs/Zend/Validate/Float.php
@@ -0,0 +1,75 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Float.php 5229 2007-06-11 20:19:01Z darby $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Float extends Zend_Validate_Abstract
+{
+
+ const NOT_FLOAT = 'notFloat';
+
+ /**
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::NOT_FLOAT => "'%value%' does not appear to be a float"
+ );
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value is a floating-point value
+ *
+ * @param string $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $valueString = (string) $value;
+
+ $this->_setValue($valueString);
+
+ $locale = localeconv();
+
+ $valueFiltered = str_replace($locale['decimal_point'], '.', $valueString);
+ $valueFiltered = str_replace($locale['thousands_sep'], '', $valueFiltered);
+
+ if (strval(floatval($valueFiltered)) != $valueFiltered) {
+ $this->_error();
+ return false;
+ }
+
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Validate/GreaterThan.php b/libs/Zend/Validate/GreaterThan.php
new file mode 100755
index 0000000000..a43d4cc34c
--- /dev/null
+++ b/libs/Zend/Validate/GreaterThan.php
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: GreaterThan.php 4974 2007-05-25 21:11:56Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_GreaterThan extends Zend_Validate_Abstract
+{
+
+ const NOT_GREATER = 'notGreaterThan';
+
+ /**
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::NOT_GREATER => "'%value%' is not greater than '%min%'"
+ );
+
+ /**
+ * @var array
+ */
+ protected $_messageVariables = array(
+ 'min' => '_min'
+ );
+
+ /**
+ * Minimum value
+ *
+ * @var mixed
+ */
+ protected $_min;
+
+ /**
+ * Sets validator options
+ *
+ * @param mixed $min
+ * @return void
+ */
+ public function __construct($min)
+ {
+ $this->setMin($min);
+ }
+
+ /**
+ * Returns the min option
+ *
+ * @return mixed
+ */
+ public function getMin()
+ {
+ return $this->_min;
+ }
+
+ /**
+ * Sets the min option
+ *
+ * @param mixed $min
+ * @return Zend_Validate_GreaterThan Provides a fluent interface
+ */
+ public function setMin($min)
+ {
+ $this->_min = $min;
+ return $this;
+ }
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value is greater than min option
+ *
+ * @param mixed $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $this->_setValue($value);
+
+ if ($this->_min >= $value) {
+ $this->_error();
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Validate/Hex.php b/libs/Zend/Validate/Hex.php
new file mode 100755
index 0000000000..09eb6f2e87
--- /dev/null
+++ b/libs/Zend/Validate/Hex.php
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Hex.php 5134 2007-06-06 17:54:16Z darby $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Hex extends Zend_Validate_Abstract
+{
+ /**
+ * Validation failure message key for when the value contains characters other than hexadecimal digits
+ */
+ const NOT_HEX = 'notHex';
+
+ /**
+ * Validation failure message template definitions
+ *
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::NOT_HEX => "'%value%' has not only hexadecimal digit characters"
+ );
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value contains only hexadecimal digit characters
+ *
+ * @param string $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $valueString = (string) $value;
+
+ $this->_setValue($valueString);
+
+ if (!ctype_xdigit($valueString)) {
+ $this->_error();
+ return false;
+ }
+
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Validate/Hostname.php b/libs/Zend/Validate/Hostname.php
new file mode 100755
index 0000000000..9902e69522
--- /dev/null
+++ b/libs/Zend/Validate/Hostname.php
@@ -0,0 +1,444 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Hostname.php 4974 2007-05-25 21:11:56Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+/**
+ * @see Zend_Loader
+ */
+require_once 'Zend/Loader.php';
+
+/**
+ * @see Zend_Validate_Ip
+ */
+require_once 'Zend/Validate/Ip.php';
+
+/**
+ * Please note there are two standalone test scripts for testing IDN characters due to problems
+ * with file encoding.
+ *
+ * The first is tests/Zend/Validate/HostnameTestStandalone.php which is designed to be run on
+ * the command line.
+ *
+ * The second is tests/Zend/Validate/HostnameTestForm.php which is designed to be run via HTML
+ * to allow users to test entering UTF-8 characters in a form.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Hostname extends Zend_Validate_Abstract
+{
+
+ const IP_ADDRESS_NOT_ALLOWED = 'hostnameIpAddressNotAllowed';
+ const UNKNOWN_TLD = 'hostnameUnknownTld';
+ const INVALID_DASH = 'hostnameDashCharacter';
+ const INVALID_HOSTNAME_SCHEMA = 'hostnameInvalidHostnameSchema';
+ const UNDECIPHERABLE_TLD = 'hostnameUndecipherableTld';
+ const INVALID_HOSTNAME = 'hostnameInvalidHostname';
+ const INVALID_LOCAL_NAME = 'hostnameInvalidLocalName';
+ const LOCAL_NAME_NOT_ALLOWED = 'hostnameLocalNameNotAllowed';
+
+ /**
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::IP_ADDRESS_NOT_ALLOWED => "'%value%' appears to be an IP address, but IP addresses are not allowed",
+ self::UNKNOWN_TLD => "'%value%' appears to be a DNS hostname but cannot match TLD against known list",
+ self::INVALID_DASH => "'%value%' appears to be a DNS hostname but contains a dash (-) in an invalid position",
+ self::INVALID_HOSTNAME_SCHEMA => "'%value%' appears to be a DNS hostname but cannot match against hostname schema for TLD '%tld%'",
+ self::UNDECIPHERABLE_TLD => "'%value%' appears to be a DNS hostname but cannot extract TLD part",
+ self::INVALID_HOSTNAME => "'%value%' does not match the expected structure for a DNS hostname",
+ self::INVALID_LOCAL_NAME => "'%value%' does not appear to be a valid local network name",
+ self::LOCAL_NAME_NOT_ALLOWED => "'%value%' appears to be a local network name but but local network names are not allowed"
+ );
+
+ /**
+ * @var array
+ */
+ protected $_messageVariables = array(
+ 'tld' => '_tld'
+ );
+
+ /**
+ * Allows Internet domain names (e.g., example.com)
+ */
+ const ALLOW_DNS = 1;
+
+ /**
+ * Allows IP addresses
+ */
+ const ALLOW_IP = 2;
+
+ /**
+ * Allows local network names (e.g., localhost, www.localdomain)
+ */
+ const ALLOW_LOCAL = 4;
+
+ /**
+ * Allows all types of hostnames
+ */
+ const ALLOW_ALL = 7;
+
+ /**
+ * Whether IDN domains are validated
+ *
+ * @var boolean
+ */
+ private $_validateIdn = true;
+
+ /**
+ * Whether TLDs are validated against a known list
+ *
+ * @var boolean
+ */
+ private $_validateTld = true;
+
+ /**
+ * Bit field of ALLOW constants; determines which types of hostnames are allowed
+ *
+ * @var integer
+ */
+ protected $_allow;
+
+ /**
+ * Bit field of CHECK constants; determines what additional hostname checks to make
+ *
+ * @var unknown_type
+ */
+ // protected $_check;
+
+ /**
+ * Array of valid top-level-domains
+ *
+ * @var array
+ * @see ftp://data.iana.org/TLD/tlds-alpha-by-domain.txt List of all TLDs by domain
+ */
+ protected $_validTlds = array(
+ 'ac', 'ad', 'ae', 'aero', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao',
+ 'aq', 'ar', 'arpa', 'as', 'at', 'au', 'aw', 'ax', 'az', 'ba', 'bb',
+ 'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'biz', 'bj', 'bm', 'bn', 'bo',
+ 'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cat', 'cc', 'cd',
+ 'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'com', 'coop',
+ 'cr', 'cu', 'cv', 'cx', 'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'do',
+ 'dz', 'ec', 'edu', 'ee', 'eg', 'er', 'es', 'et', 'eu', 'fi', 'fj',
+ 'fk', 'fm', 'fo', 'fr', 'ga', 'gb', 'gd', 'ge', 'gf', 'gg', 'gh',
+ 'gi', 'gl', 'gm', 'gn', 'gov', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu',
+ 'gw', 'gy', 'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il',
+ 'im', 'in', 'info', 'int', 'io', 'iq', 'ir', 'is', 'it', 'je', 'jm',
+ 'jo', 'jobs', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn', 'kr', 'kw',
+ 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt', 'lu',
+ 'lv', 'ly', 'ma', 'mc', 'md', 'mg', 'mh', 'mil', 'mk', 'ml', 'mm',
+ 'mn', 'mo', 'mobi', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv',
+ 'mw', 'mx', 'my', 'mz', 'na', 'name', 'nc', 'ne', 'net', 'nf', 'ng',
+ 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'org', 'pa', 'pe',
+ 'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr', 'pro', 'ps', 'pt',
+ 'pw', 'py', 'qa', 're', 'ro', 'ru', 'rw', 'sa', 'sb', 'sc', 'sd',
+ 'se', 'sg', 'sh', 'si', 'sj', 'sk', 'sl', 'sm', 'sn', 'so', 'sr',
+ 'st', 'su', 'sv', 'sy', 'sz', 'tc', 'td', 'tf', 'tg', 'th', 'tj',
+ 'tk', 'tl', 'tm', 'tn', 'to', 'tp', 'tr', 'travel', 'tt', 'tv', 'tw',
+ 'tz', 'ua', 'ug', 'uk', 'um', 'us', 'uy', 'uz', 'va', 'vc', 've',
+ 'vg', 'vi', 'vn', 'vu', 'wf', 'ws', 'ye', 'yt', 'yu', 'za', 'zm',
+ 'zw'
+ );
+
+ /**
+ * @var string
+ */
+ protected $_tld;
+
+ /**
+ * Sets validator options
+ *
+ * @param integer $allow OPTIONAL Set what types of hostname to allow (default ALLOW_DNS)
+ * @param boolean $validateIdn OPTIONAL Set whether IDN domains are validated (default true)
+ * @param boolean $validateTld OPTIONAL Set whether the TLD element of a hostname is validated (default true)
+ * @param Zend_Validate_Ip $ipValidator OPTIONAL
+ * @return void
+ * @see http://www.iana.org/cctld/specifications-policies-cctlds-01apr02.htm Technical Specifications for ccTLDs
+ */
+ public function __construct($allow = self::ALLOW_DNS, $validateIdn = true, $validateTld = true, Zend_Validate_Ip $ipValidator = null)
+ {
+ // Set allow options
+ $this->setAllow($allow);
+
+ // Set validation options
+ $this->_validateIdn = $validateIdn;
+ $this->_validateTld = $validateTld;
+
+ $this->setIpValidator($ipValidator);
+ }
+
+ /**
+ * @param Zend_Validate_Ip $ipValidator OPTIONAL
+ * @return void;
+ */
+ public function setIpValidator(Zend_Validate_Ip $ipValidator = null)
+ {
+ if ($ipValidator === null) {
+ $ipValidator = new Zend_Validate_Ip();
+ }
+ $this->_ipValidator = $ipValidator;
+ }
+
+ /**
+ * Returns the allow option
+ *
+ * @return integer
+ */
+ public function getAllow()
+ {
+ return $this->_allow;
+ }
+
+ /**
+ * Sets the allow option
+ *
+ * @param integer $allow
+ * @return Zend_Validate_Hostname Provides a fluent interface
+ */
+ public function setAllow($allow)
+ {
+ $this->_allow = $allow;
+ return $this;
+ }
+
+ /**
+ * Set whether IDN domains are validated
+ *
+ * This only applies when DNS hostnames are validated
+ *
+ * @param boolean $allowed Set allowed to true to validate IDNs, and false to not validate them
+ */
+ public function setValidateIdn ($allowed)
+ {
+ $this->_validateIdn = (bool) $allowed;
+ }
+
+ /**
+ * Set whether the TLD element of a hostname is validated
+ *
+ * This only applies when DNS hostnames are validated
+ *
+ * @param boolean $allowed Set allowed to true to validate TLDs, and false to not validate them
+ */
+ public function setValidateTld ($allowed)
+ {
+ $this->_validateTld = (bool) $allowed;
+ }
+
+ /**
+ * Sets the check option
+ *
+ * @param integer $check
+ * @return Zend_Validate_Hostname Provides a fluent interface
+ */
+ /*
+ public function setCheck($check)
+ {
+ $this->_check = $check;
+ return $this;
+ }
+ */
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if the $value is a valid hostname with respect to the current allow option
+ *
+ * @param string $value
+ * @throws Zend_Validate_Exception if a fatal error occurs for validation process
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $valueString = (string) $value;
+
+ $this->_setValue($valueString);
+
+ // Check input against IP address schema
+ if ($this->_ipValidator->isValid($valueString)) {
+ if (!($this->_allow & self::ALLOW_IP)) {
+ $this->_error(self::IP_ADDRESS_NOT_ALLOWED);
+ return false;
+ } else{
+ return true;
+ }
+ }
+
+ // Check input against DNS hostname schema
+ $domainParts = explode('.', $valueString);
+ if ((count($domainParts) > 1) && (strlen($valueString) >= 4) && (strlen($valueString) <= 254)) {
+ $status = false;
+
+ do {
+ // First check TLD
+ if (preg_match('/([a-z]{2,10})$/i', end($domainParts), $matches)) {
+
+ reset($domainParts);
+
+ // Hostname characters are: *(label dot)(label dot label); max 254 chars
+ // label: id-prefix [*ldh{61} id-prefix]; max 63 chars
+ // id-prefix: alpha / digit
+ // ldh: alpha / digit / dash
+
+ // Match TLD against known list
+ $this->_tld = strtolower($matches[1]);
+ if ($this->_validateTld) {
+ if (!in_array($this->_tld, $this->_validTlds)) {
+ $this->_error(self::UNKNOWN_TLD);
+ $status = false;
+ break;
+ }
+ }
+
+ /**
+ * Match against IDN hostnames
+ * @see Zend_Validate_Hostname_Interface
+ */
+ $labelChars = 'a-z0-9';
+ $utf8 = false;
+ $classFile = 'Zend/Validate/Hostname/' . ucfirst($this->_tld) . '.php';
+ if ($this->_validateIdn) {
+ if (Zend_Loader::isReadable($classFile)) {
+
+ // Load additional characters
+ $className = 'Zend_Validate_Hostname_' . ucfirst($this->_tld);
+ Zend_Loader::loadClass($className);
+ $labelChars .= call_user_func(array($className, 'getCharacters'));
+ $utf8 = true;
+ }
+ }
+
+ // Keep label regex short to avoid issues with long patterns when matching IDN hostnames
+ $regexLabel = '/^[' . $labelChars . '\x2d]{1,63}$/i';
+ if ($utf8) {
+ $regexLabel .= 'u';
+ }
+
+ // Check each hostname part
+ $valid = true;
+ foreach ($domainParts as $domainPart) {
+
+ // Check dash (-) does not start, end or appear in 3rd and 4th positions
+ if (strpos($domainPart, '-') === 0 ||
+ (strlen($domainPart) > 2 && strpos($domainPart, '-', 2) == 2 && strpos($domainPart, '-', 3) == 3) ||
+ strrpos($domainPart, '-') === strlen($domainPart) - 1) {
+
+ $this->_error(self::INVALID_DASH);
+ $status = false;
+ break 2;
+ }
+
+ // Check each domain part
+ $status = @preg_match($regexLabel, $domainPart);
+ if ($status === false) {
+ /**
+ * Regex error
+ * @see Zend_Validate_Exception
+ */
+ require_once 'Zend/Validate/Exception.php';
+ throw new Zend_Validate_Exception('Internal error: DNS validation failed');
+ } elseif ($status === 0) {
+ $valid = false;
+ }
+ }
+
+ // If all labels didn't match, the hostname is invalid
+ if (!$valid) {
+ $this->_error(self::INVALID_HOSTNAME_SCHEMA);
+ $status = false;
+ }
+
+ } else {
+ // Hostname not long enough
+ $this->_error(self::UNDECIPHERABLE_TLD);
+ $status = false;
+ }
+ } while (false);
+
+ // If the input passes as an Internet domain name, and domain names are allowed, then the hostname
+ // passes validation
+ if ($status && ($this->_allow & self::ALLOW_DNS)) {
+ return true;
+ }
+ } else {
+ $this->_error(self::INVALID_HOSTNAME);
+ }
+
+ // Check input against local network name schema; last chance to pass validation
+ $regexLocal = "/^(([a-zA-Z0-9\x2d]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}){1,254}$/";
+ $status = @preg_match($regexLocal, $valueString);
+ if (false === $status) {
+ /**
+ * Regex error
+ * @see Zend_Validate_Exception
+ */
+ require_once 'Zend/Validate/Exception.php';
+ throw new Zend_Validate_Exception('Internal error: local network name validation failed');
+ }
+
+ // If the input passes as a local network name, and local network names are allowed, then the
+ // hostname passes validation
+ $allowLocal = $this->_allow & self::ALLOW_LOCAL;
+ if ($status && $allowLocal) {
+ return true;
+ }
+
+ // If the input does not pass as a local network name, add a message
+ if (!$status) {
+ $this->_error(self::INVALID_LOCAL_NAME);
+ }
+
+ // If local network names are not allowed, add a message
+ if (!$allowLocal) {
+ $this->_error(self::LOCAL_NAME_NOT_ALLOWED);
+ }
+
+ return false;
+ }
+
+ /**
+ * Throws an exception if a regex for $type does not exist
+ *
+ * @param string $type
+ * @throws Zend_Validate_Exception
+ * @return Zend_Validate_Hostname Provides a fluent interface
+ */
+ /*
+ protected function _checkRegexType($type)
+ {
+ if (!isset($this->_regex[$type])) {
+ require_once 'Zend/Validate/Exception.php';
+ throw new Zend_Validate_Exception("'$type' must be one of ('" . implode(', ', array_keys($this->_regex))
+ . "')");
+ }
+ return $this;
+ }
+ */
+
+}
diff --git a/libs/Zend/Validate/Hostname/At.php b/libs/Zend/Validate/Hostname/At.php
new file mode 100755
index 0000000000..2965cbd16d
--- /dev/null
+++ b/libs/Zend/Validate/Hostname/At.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: At.php 4011 2007-03-16 08:46:49Z studio24 $
+ */
+
+
+/**
+ * @see Zend_Validate_Hostname_Interface
+ */
+require_once 'Zend/Validate/Hostname/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Hostname_At implements Zend_Validate_Hostname_Interface
+{
+
+ /**
+ * Returns UTF-8 characters allowed in DNS hostnames for the specified Top-Level-Domain
+ *
+ * @see http://www.nic.at/en/service/technical_information/idn/charset_converter/ Austria (.AT)
+ * @return string
+ */
+ static function getCharacters()
+ {
+ return '\x{00EO}-\x{00F6}\x{00F8}-\x{00FF}\x{0153}\x{0161}\x{017E}';
+ }
+
+} \ No newline at end of file
diff --git a/libs/Zend/Validate/Hostname/Ch.php b/libs/Zend/Validate/Hostname/Ch.php
new file mode 100755
index 0000000000..64ec38de49
--- /dev/null
+++ b/libs/Zend/Validate/Hostname/Ch.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Ch.php 4011 2007-03-16 08:46:49Z studio24 $
+ */
+
+
+/**
+ * @see Zend_Validate_Hostname_Interface
+ */
+require_once 'Zend/Validate/Hostname/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Hostname_Ch implements Zend_Validate_Hostname_Interface
+{
+
+ /**
+ * Returns UTF-8 characters allowed in DNS hostnames for the specified Top-Level-Domain
+ *
+ * @see https://nic.switch.ch/reg/ocView.action?res=EF6GW2JBPVTG67DLNIQXU234MN6SC33JNQQGI7L6#anhang1 Switzerland (.CH)
+ * @return string
+ */
+ static function getCharacters()
+ {
+ return '\x{00EO}-\x{00F6}\x{00F8}-\x{00FF}\x{0153}';
+ }
+
+} \ No newline at end of file
diff --git a/libs/Zend/Validate/Hostname/De.php b/libs/Zend/Validate/Hostname/De.php
new file mode 100755
index 0000000000..d01472fefd
--- /dev/null
+++ b/libs/Zend/Validate/Hostname/De.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: De.php 4011 2007-03-16 08:46:49Z studio24 $
+ */
+
+
+/**
+ * @see Zend_Validate_Hostname_Interface
+ */
+require_once 'Zend/Validate/Hostname/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Hostname_De implements Zend_Validate_Hostname_Interface
+{
+
+ /**
+ * Returns UTF-8 characters allowed in DNS hostnames for the specified Top-Level-Domain
+ *
+ * @see http://www.denic.de/en/domains/idns/liste.html Germany (.DE) alllowed characters
+ * @return string
+ */
+ static function getCharacters()
+ {
+ return '\x{00E1}\x{00E0}\x{0103}\x{00E2}\x{00E5}\x{00E4}\x{00E3}\x{0105}\x{0101}\x{00E6}\x{0107}' .
+ '\x{0109}\x{010D}\x{010B}\x{00E7}\x{010F}\x{0111}\x{00E9}\x{00E8}\x{0115}\x{00EA}\x{011B}' .
+ '\x{00EB}\x{0117}\x{0119}\x{0113}\x{011F}\x{011D}\x{0121}\x{0123}\x{0125}\x{0127}\x{00ED}' .
+ '\x{00EC}\x{012D}\x{00EE}\x{00EF}\x{0129}\x{012F}\x{012B}\x{0131}\x{0135}\x{0137}\x{013A}' .
+ '\x{013E}\x{013C}\x{0142}\x{0144}\x{0148}\x{00F1}\x{0146}\x{014B}\x{00F3}\x{00F2}\x{014F}' .
+ '\x{00F4}\x{00F6}\x{0151}\x{00F5}\x{00F8}\x{014D}\x{0153}\x{0138}\x{0155}\x{0159}\x{0157}' .
+ '\x{015B}\x{015D}\x{0161}\x{015F}\x{0165}\x{0163}\x{0167}\x{00FA}\x{00F9}\x{016D}\x{00FB}' .
+ '\x{016F}\x{00FC}\x{0171}\x{0169}\x{0173}\x{016B}\x{0175}\x{00FD}\x{0177}\x{00FF}\x{017A}' .
+ '\x{017E}\x{017C}\x{00F0}\x{00FE}';
+ }
+
+} \ No newline at end of file
diff --git a/libs/Zend/Validate/Hostname/Fi.php b/libs/Zend/Validate/Hostname/Fi.php
new file mode 100755
index 0000000000..d88d1d1cff
--- /dev/null
+++ b/libs/Zend/Validate/Hostname/Fi.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Fi.php 4011 2007-03-16 08:46:49Z studio24 $
+ */
+
+
+/**
+ * @see Zend_Validate_Hostname_Interface
+ */
+require_once 'Zend/Validate/Hostname/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Hostname_Fi implements Zend_Validate_Hostname_Interface
+{
+
+ /**
+ * Returns UTF-8 characters allowed in DNS hostnames for the specified Top-Level-Domain
+ *
+ * @see http://www.ficora.fi/en/index/palvelut/fiverkkotunnukset/aakkostenkaytto.html Finland (.FI)
+ * @return string
+ */
+ static function getCharacters()
+ {
+ return '\x{00E5}\x{00E4}\x{00F6}';
+ }
+
+} \ No newline at end of file
diff --git a/libs/Zend/Validate/Hostname/Hu.php b/libs/Zend/Validate/Hostname/Hu.php
new file mode 100755
index 0000000000..23c80bd4a4
--- /dev/null
+++ b/libs/Zend/Validate/Hostname/Hu.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Hu.php 4011 2007-03-16 08:46:49Z studio24 $
+ */
+
+
+/**
+ * @see Zend_Validate_Hostname_Interface
+ */
+require_once 'Zend/Validate/Hostname/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Hostname_Hu implements Zend_Validate_Hostname_Interface
+{
+
+ /**
+ * Returns UTF-8 characters allowed in DNS hostnames for the specified Top-Level-Domain
+ *
+ * @see http://www.domain.hu/domain/English/szabalyzat.html Hungary (.HU)
+ * @return string
+ */
+ static function getCharacters()
+ {
+ return '\x{00E1}\x{00E9}\x{00ED}\x{00F3}\x{00F6}\x{0151}\x{00FA}\x{00FC}\x{0171}';
+ }
+
+} \ No newline at end of file
diff --git a/libs/Zend/Validate/Hostname/Interface.php b/libs/Zend/Validate/Hostname/Interface.php
new file mode 100755
index 0000000000..71f9b903b5
--- /dev/null
+++ b/libs/Zend/Validate/Hostname/Interface.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 4011 2007-03-16 08:46:49Z studio24 $
+ */
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Validate_Hostname_Interface
+{
+
+ /**
+ * Returns UTF-8 characters allowed in DNS hostnames for the specified Top-Level-Domain
+ *
+ * UTF-8 characters should be written as four character hex codes \x{XXXX}
+ * For example é (lowercase e with acute) is represented by the hex code \x{00E9}
+ *
+ * You only need to include lower-case equivalents of characters since the hostname
+ * check is case-insensitive
+ *
+ * Please document the supported TLDs in the documentation file at:
+ * manual/en/module_specs/Zend_Validate-Hostname.xml
+ *
+ * @see http://en.wikipedia.org/wiki/Internationalized_domain_name
+ * @see http://www.iana.org/cctld/ Country-Code Top-Level Domains (TLDs)
+ * @see http://www.columbia.edu/kermit/utf8-t1.html UTF-8 characters
+ * @return string
+ */
+ static function getCharacters();
+
+} \ No newline at end of file
diff --git a/libs/Zend/Validate/Hostname/Li.php b/libs/Zend/Validate/Hostname/Li.php
new file mode 100755
index 0000000000..e6446dfcaf
--- /dev/null
+++ b/libs/Zend/Validate/Hostname/Li.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Li.php 4011 2007-03-16 08:46:49Z studio24 $
+ */
+
+
+/**
+ * @see Zend_Validate_Hostname_Interface
+ */
+require_once 'Zend/Validate/Hostname/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Hostname_Li implements Zend_Validate_Hostname_Interface
+{
+
+ /**
+ * Returns UTF-8 characters allowed in DNS hostnames for the specified Top-Level-Domain
+ *
+ * @see https://nic.switch.ch/reg/ocView.action?res=EF6GW2JBPVTG67DLNIQXU234MN6SC33JNQQGI7L6#anhang1 Liechtenstein (.LI)
+ * @return string
+ */
+ static function getCharacters()
+ {
+ return '\x{00EO}-\x{00F6}\x{00F8}-\x{00FF}\x{0153}';
+ }
+
+} \ No newline at end of file
diff --git a/libs/Zend/Validate/Hostname/No.php b/libs/Zend/Validate/Hostname/No.php
new file mode 100755
index 0000000000..ed638a825d
--- /dev/null
+++ b/libs/Zend/Validate/Hostname/No.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: No.php 4011 2007-03-16 08:46:49Z studio24 $
+ */
+
+
+/**
+ * @see Zend_Validate_Hostname_Interface
+ */
+require_once 'Zend/Validate/Hostname/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Hostname_No implements Zend_Validate_Hostname_Interface
+{
+
+ /**
+ * Returns UTF-8 characters allowed in DNS hostnames for the specified Top-Level-Domain
+ *
+ * @see http://www.norid.no/domeneregistrering/idn/idn_nyetegn.en.html Norway (.NO)
+ * @return string
+ */
+ static function getCharacters()
+ {
+ return '\x00E1\x00E0\x00E4\x010D\x00E7\x0111\x00E9\x00E8\x00EA\x\x014B' .
+ '\x0144\x00F1\x00F3\x00F2\x00F4\x00F6\x0161\x0167\x00FC\x017E\x00E6' .
+ '\x00F8\x00E5';
+ }
+
+}
diff --git a/libs/Zend/Validate/Hostname/Se.php b/libs/Zend/Validate/Hostname/Se.php
new file mode 100755
index 0000000000..a60144f0ed
--- /dev/null
+++ b/libs/Zend/Validate/Hostname/Se.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Se.php 4011 2007-03-16 08:46:49Z studio24 $
+ */
+
+
+/**
+ * @see Zend_Validate_Hostname_Interface
+ */
+require_once 'Zend/Validate/Hostname/Interface.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Hostname_Se implements Zend_Validate_Hostname_Interface
+{
+
+ /**
+ * Returns UTF-8 characters allowed in DNS hostnames for the specified Top-Level-Domain
+ *
+ * @see http://www.iis.se/english/IDN_campaignsite.shtml?lang=en Sweden (.SE)
+ * @return string
+ */
+ static function getCharacters()
+ {
+ return '\x{00E5}\x{00E4}\x{00F6}\x{00FC}\x{00E9}';
+ }
+
+} \ No newline at end of file
diff --git a/libs/Zend/Validate/InArray.php b/libs/Zend/Validate/InArray.php
new file mode 100755
index 0000000000..02044d3aaa
--- /dev/null
+++ b/libs/Zend/Validate/InArray.php
@@ -0,0 +1,138 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: InArray.php 4974 2007-05-25 21:11:56Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_InArray extends Zend_Validate_Abstract
+{
+
+ const NOT_IN_ARRAY = 'notInArray';
+
+ /**
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::NOT_IN_ARRAY => "'%value%' was not found in the haystack"
+ );
+
+ /**
+ * Haystack of possible values
+ *
+ * @var array
+ */
+ protected $_haystack;
+
+ /**
+ * Whether a strict in_array() invocation is used
+ *
+ * @var boolean
+ */
+ protected $_strict;
+
+ /**
+ * Sets validator options
+ *
+ * @param array $haystack
+ * @param boolean $strict
+ * @return void
+ */
+ public function __construct(array $haystack, $strict = false)
+ {
+ $this->setHaystack($haystack)
+ ->setStrict($strict);
+ }
+
+ /**
+ * Returns the haystack option
+ *
+ * @return mixed
+ */
+ public function getHaystack()
+ {
+ return $this->_haystack;
+ }
+
+ /**
+ * Sets the haystack option
+ *
+ * @param mixed $haystack
+ * @return Zend_Validate_InArray Provides a fluent interface
+ */
+ public function setHaystack(array $haystack)
+ {
+ $this->_haystack = $haystack;
+ return $this;
+ }
+
+ /**
+ * Returns the strict option
+ *
+ * @return boolean
+ */
+ public function getStrict()
+ {
+ return $this->_strict;
+ }
+
+ /**
+ * Sets the strict option
+ *
+ * @param boolean $strict
+ * @return Zend_Validate_InArray Provides a fluent interface
+ */
+ public function setStrict($strict)
+ {
+ $this->_strict = $strict;
+ return $this;
+ }
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value is contained in the haystack option. If the strict
+ * option is true, then the type of $value is also checked.
+ *
+ * @param mixed $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $this->_setValue($value);
+ if (!in_array($value, $this->_haystack, $this->_strict)) {
+ $this->_error();
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Validate/Int.php b/libs/Zend/Validate/Int.php
new file mode 100755
index 0000000000..dc1d7de831
--- /dev/null
+++ b/libs/Zend/Validate/Int.php
@@ -0,0 +1,75 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Int.php 4974 2007-05-25 21:11:56Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Int extends Zend_Validate_Abstract
+{
+
+ const NOT_INT = 'notInt';
+
+ /**
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::NOT_INT => "'%value%' does not appear to be an integer"
+ );
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value is a valid integer
+ *
+ * @param string $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $valueString = (string) $value;
+
+ $this->_setValue($valueString);
+
+ $locale = localeconv();
+
+ $valueFiltered = str_replace($locale['decimal_point'], '.', $valueString);
+ $valueFiltered = str_replace($locale['thousands_sep'], '', $valueFiltered);
+
+ if (strval(intval($valueFiltered)) != $valueFiltered) {
+ $this->_error();
+ return false;
+ }
+
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Validate/Interface.php b/libs/Zend/Validate/Interface.php
new file mode 100755
index 0000000000..23ac3e0fa8
--- /dev/null
+++ b/libs/Zend/Validate/Interface.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Interface.php 4974 2007-05-25 21:11:56Z bkarwin $
+ */
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_Validate_Interface
+{
+ /**
+ * Returns true if and only if $value meets the validation requirements
+ *
+ * If $value fails validation, then this method returns false, and
+ * $messages will contain an array of messages that explain why the
+ * validation failed.
+ *
+ * @param mixed $value
+ * @return boolean
+ * @throws Zend_Valid_Exception If validation of $value is impossible
+ */
+ public function isValid($value);
+
+ /**
+ * Returns an array of messages that explain why a previous isValid()
+ * call returned false.
+ *
+ * If isValid() was never called or if the most recent isValid() call
+ * returned true, then this method returns an empty array.
+ *
+ * @return array
+ */
+ public function getMessages();
+
+ /**
+ * Returns an array of errors that explain why a previous isValid() call
+ * returned false.
+ *
+ * If isValid() was never called or if the most recent isValid() call
+ * returned true, then this method returns an empty array.
+ *
+ * @return array
+ */
+ public function getErrors();
+
+}
diff --git a/libs/Zend/Validate/Ip.php b/libs/Zend/Validate/Ip.php
new file mode 100755
index 0000000000..8094296caa
--- /dev/null
+++ b/libs/Zend/Validate/Ip.php
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Ip.php 4974 2007-05-25 21:11:56Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Ip extends Zend_Validate_Abstract
+{
+
+ const NOT_IP_ADDRESS = 'notIpAddress';
+
+ /**
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::NOT_IP_ADDRESS => "'%value%' does not appear to be a valid IP address"
+ );
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value is a valid IP address
+ *
+ * @param mixed $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $valueString = (string) $value;
+
+ $this->_setValue($valueString);
+
+ if (!ip2long($valueString)) {
+ $this->_error();
+ return false;
+ }
+
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Validate/LessThan.php b/libs/Zend/Validate/LessThan.php
new file mode 100755
index 0000000000..6b8a72f8fb
--- /dev/null
+++ b/libs/Zend/Validate/LessThan.php
@@ -0,0 +1,113 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: LessThan.php 5152 2007-06-07 14:19:06Z darby $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_LessThan extends Zend_Validate_Abstract
+{
+
+ const NOT_LESS = 'notLessThan';
+
+ /**
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::NOT_LESS => "'%value%' is not less than '%max%'"
+ );
+
+ /**
+ * @var array
+ */
+ protected $_messageVariables = array(
+ 'max' => '_max'
+ );
+
+ /**
+ * Maximum value
+ *
+ * @var mixed
+ */
+ protected $_max;
+
+ /**
+ * Sets validator options
+ *
+ * @param mixed $max
+ * @return void
+ */
+ public function __construct($max)
+ {
+ $this->setMax($max);
+ }
+
+ /**
+ * Returns the max option
+ *
+ * @return mixed
+ */
+ public function getMax()
+ {
+ return $this->_max;
+ }
+
+ /**
+ * Sets the max option
+ *
+ * @param mixed $max
+ * @return Zend_Validate_LessThan Provides a fluent interface
+ */
+ public function setMax($max)
+ {
+ $this->_max = $max;
+ return $this;
+ }
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value is less than max option
+ *
+ * @param mixed $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $this->_setValue($value);
+ if ($this->_max <= $value) {
+ $this->_error();
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Validate/NotEmpty.php b/libs/Zend/Validate/NotEmpty.php
new file mode 100755
index 0000000000..9b3b06c2ca
--- /dev/null
+++ b/libs/Zend/Validate/NotEmpty.php
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: NotEmpty.php 5134 2007-06-06 17:54:16Z darby $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_NotEmpty extends Zend_Validate_Abstract
+{
+
+ const IS_EMPTY = 'isEmpty';
+
+ /**
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::IS_EMPTY => "Value is empty, but a non-empty value is required"
+ );
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value is not an empty value.
+ *
+ * @param string $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $valueString = (string) $value;
+
+ $this->_setValue($valueString);
+
+ if (empty($value)) {
+ $this->_error();
+ return false;
+ }
+
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Validate/Regex.php b/libs/Zend/Validate/Regex.php
new file mode 100755
index 0000000000..61a92698ff
--- /dev/null
+++ b/libs/Zend/Validate/Regex.php
@@ -0,0 +1,125 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Regex.php 4974 2007-05-25 21:11:56Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_Regex extends Zend_Validate_Abstract
+{
+
+ const NOT_MATCH = 'regexNotMatch';
+
+ /**
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::NOT_MATCH => "'%value%' does not match against pattern '%pattern%'"
+ );
+
+ /**
+ * @var array
+ */
+ protected $_messageVariables = array(
+ 'pattern' => '_pattern'
+ );
+
+ /**
+ * Regular expression pattern
+ *
+ * @var string
+ */
+ protected $_pattern;
+
+ /**
+ * Sets validator options
+ *
+ * @param string $pattern
+ * @return void
+ */
+ public function __construct($pattern)
+ {
+ $this->setPattern($pattern);
+ }
+
+ /**
+ * Returns the pattern option
+ *
+ * @return string
+ */
+ public function getPattern()
+ {
+ return $this->_pattern;
+ }
+
+ /**
+ * Sets the pattern option
+ *
+ * @param string $pattern
+ * @return Zend_Validate_Regex Provides a fluent interface
+ */
+ public function setPattern($pattern)
+ {
+ $this->_pattern = (string) $pattern;
+ return $this;
+ }
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if $value matches against the pattern option
+ *
+ * @param string $value
+ * @throws Zend_Validate_Exception if there is a fatal error in pattern matching
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $valueString = (string) $value;
+
+ $this->_setValue($valueString);
+
+ $status = @preg_match($this->_pattern, $valueString);
+ if (false === $status) {
+ /**
+ * @see Zend_Validate_Exception
+ */
+ require_once 'Zend/Validate/Exception.php';
+ throw new Zend_Validate_Exception("Internal error matching pattern '$this->_pattern' against value '$valueString'");
+ }
+ if (!$status) {
+ $this->_error();
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/libs/Zend/Validate/StringLength.php b/libs/Zend/Validate/StringLength.php
new file mode 100755
index 0000000000..5f96068c11
--- /dev/null
+++ b/libs/Zend/Validate/StringLength.php
@@ -0,0 +1,163 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: StringLength.php 4974 2007-05-25 21:11:56Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Validate_Abstract
+ */
+require_once 'Zend/Validate/Abstract.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_Validate
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_Validate_StringLength extends Zend_Validate_Abstract
+{
+
+ const TOO_SHORT = 'stringLengthTooShort';
+ const TOO_LONG = 'stringLengthTooLong';
+
+ /**
+ * @var array
+ */
+ protected $_messageTemplates = array(
+ self::TOO_SHORT => "'%value%' is less than %min% characters long",
+ self::TOO_LONG => "'%value%' is greater than %max% characters long"
+ );
+
+ /**
+ * @var array
+ */
+ protected $_messageVariables = array(
+ 'min' => '_min',
+ 'max' => '_max'
+ );
+
+ /**
+ * Minimum length
+ *
+ * @var integer
+ */
+ protected $_min;
+
+ /**
+ * Maximum length
+ *
+ * If null, there is no maximum length
+ *
+ * @var integer|null
+ */
+ protected $_max;
+
+ /**
+ * Sets validator options
+ *
+ * @param integer $min
+ * @param integer $max
+ * @return void
+ */
+ public function __construct($min = 0, $max = null)
+ {
+ $this->setMin($min);
+ $this->setMax($max);
+ }
+
+ /**
+ * Returns the min option
+ *
+ * @return integer
+ */
+ public function getMin()
+ {
+ return $this->_min;
+ }
+
+ /**
+ * Sets the min option
+ *
+ * @param integer $min
+ * @return Zend_Validate_StringLength Provides a fluent interface
+ */
+ public function setMin($min)
+ {
+ $this->_min = max(0, (integer) $min);
+ return $this;
+ }
+
+ /**
+ * Returns the max option
+ *
+ * @return integer|null
+ */
+ public function getMax()
+ {
+ return $this->_max;
+ }
+
+ /**
+ * Sets the max option
+ *
+ * @param integer|null $max
+ * @return Zend_Validate_StringLength Provides a fluent interface
+ */
+ public function setMax($max)
+ {
+ if (null === $max) {
+ $this->_max = null;
+ } else {
+ $this->_max = (integer) $max;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Defined by Zend_Validate_Interface
+ *
+ * Returns true if and only if the string length of $value is at least the min option and
+ * no greater than the max option (when the max option is not null).
+ *
+ * @param string $value
+ * @return boolean
+ */
+ public function isValid($value)
+ {
+ $valueString = (string) $value;
+ $this->_setValue($valueString);
+ $length = strlen($valueString);
+ if ($length < $this->_min) {
+ $this->_error(self::TOO_SHORT);
+ }
+ if (null !== $this->_max && $this->_max < $length) {
+ $this->_error(self::TOO_LONG);
+ }
+ if (count($this->_messages)) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+}
diff --git a/libs/Zend/Version.php b/libs/Zend/Version.php
new file mode 100755
index 0000000000..daedf13ebc
--- /dev/null
+++ b/libs/Zend/Version.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Version
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Class to store and retrieve the version of Zend Framework.
+ *
+ * @category Zend
+ * @package Zend_Version
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+final class Zend_Version
+{
+ /**
+ * Zend Framework version identification - see compareVersion()
+ */
+ const VERSION = '1.0.0';
+
+ /**
+ * Compare the specified Zend Framework version string $version
+ * with the current Zend_Version::VERSION of the Zend Framework.
+ *
+ * @param string $version A version string (e.g. "0.7.1").
+ * @return boolean -1 if the $version is older,
+ * 0 if they are the same,
+ * and +1 if $version is newer.
+ *
+ */
+ public static function compareVersion($version)
+ {
+ return version_compare($version, self::VERSION);
+ }
+}
diff --git a/libs/Zend/View.php b/libs/Zend/View.php
new file mode 100755
index 0000000000..7c291d20cf
--- /dev/null
+++ b/libs/Zend/View.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Abstract master class for extension.
+ */
+require_once 'Zend/View/Abstract.php';
+
+
+/**
+ * Concrete class for handling view scripts.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View extends Zend_View_Abstract
+{
+
+ /**
+ * Includes the view script in a scope with only public $this variables.
+ *
+ * @param string The view script to execute.
+ */
+ protected function _run()
+ {
+ include func_get_arg(0);
+ }
+}
diff --git a/libs/Zend/View/Abstract.php b/libs/Zend/View/Abstract.php
new file mode 100755
index 0000000000..213a7943b1
--- /dev/null
+++ b/libs/Zend/View/Abstract.php
@@ -0,0 +1,1041 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend
+ */
+require_once 'Zend/Loader.php';
+
+/**
+ * Zend_View_Interface
+ */
+require_once 'Zend/View/Interface.php';
+
+/**
+ * Abstract class for Zend_View to help enforce private constructs.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_View_Abstract implements Zend_View_Interface
+{
+ /**
+ * Path stack for script, helper, and filter directories.
+ *
+ * @var array
+ */
+ private $_path = array(
+ 'script' => array(),
+ 'helper' => array(),
+ 'filter' => array(),
+ );
+
+ /**
+ * Script file name to execute
+ *
+ * @var string
+ */
+ private $_file = null;
+
+ /**
+ * Instances of helper objects.
+ *
+ * @var array
+ */
+ private $_helper = array();
+
+ /**
+ * Map of helper => class pairs to help in determining helper class from
+ * name
+ * @var array
+ */
+ private $_helperLoaded = array();
+
+ /**
+ * Map of helper => classfile pairs to aid in determining helper classfile
+ * @var array
+ */
+ private $_helperLoadedDir = array();
+
+ /**
+ * Stack of Zend_View_Filter names to apply as filters.
+ * @var array
+ */
+ private $_filter = array();
+
+ /**
+ * Stack of Zend_View_Filter objects that have been loaded
+ * @var array
+ */
+ private $_filterClass = array();
+
+ /**
+ * Map of filter => class pairs to help in determining filter class from
+ * name
+ * @var array
+ */
+ private $_filterLoaded = array();
+
+ /**
+ * Map of filter => classfile pairs to aid in determining filter classfile
+ * @var array
+ */
+ private $_filterLoadedDir = array();
+
+ /**
+ * Callback for escaping.
+ *
+ * @var string
+ */
+ private $_escape = 'htmlspecialchars';
+
+ /**
+ * Encoding to use in escaping mechanisms; defaults to latin1 (ISO-8859-1)
+ * @var string
+ */
+ private $_encoding = 'ISO-8859-1';
+
+ /**
+ * Strict variables flag; when on, undefined variables accessed in the view
+ * scripts will trigger notices
+ * @var boolean
+ */
+ private $_strictVars = false;
+
+ /**
+ * Constructor.
+ *
+ * @param array $config Configuration key-value pairs.
+ */
+ public function __construct($config = array())
+ {
+ // set inital paths and properties
+ $this->setScriptPath(null);
+ $this->setHelperPath(null);
+ $this->setFilterPath(null);
+
+ // user-defined escaping callback
+ if (array_key_exists('escape', $config)) {
+ $this->setEscape($config['escape']);
+ }
+
+ // encoding
+ if (array_key_exists('encoding', $config)) {
+ $this->setEncoding($config['encoding']);
+ }
+
+ // base path
+ if (array_key_exists('basePath', $config)) {
+ $prefix = 'Zend_View';
+ if (array_key_exists('basePathPrefix', $config)) {
+ $prefix = $config['basePathPrefix'];
+ }
+ $this->setBasePath($config['basePath'], $prefix);
+ }
+
+ // user-defined view script path
+ if (array_key_exists('scriptPath', $config)) {
+ $this->addScriptPath($config['scriptPath']);
+ }
+
+ // user-defined helper path
+ if (array_key_exists('helperPath', $config)) {
+ $prefix = 'Zend_View_Helper';
+ if (array_key_exists('helperPathPrefix', $config)) {
+ $prefix = $config['helperPathPrefix'];
+ }
+ $this->addHelperPath($config['helperPath'], $prefix);
+ }
+
+ // user-defined filter path
+ if (array_key_exists('filterPath', $config)) {
+ $prefix = 'Zend_View_Filter';
+ if (array_key_exists('filterPathPrefix', $config)) {
+ $prefix = $config['filterPathPrefix'];
+ }
+ $this->addFilterPath($config['filterPath'], $prefix);
+ }
+
+ // user-defined filters
+ if (array_key_exists('filter', $config)) {
+ $this->addFilter($config['filter']);
+ }
+
+ // strict vars
+ if (array_key_exists('strictVars', $config)) {
+ $this->strictVars($config['strictVars']);
+ }
+
+ $this->init();
+ }
+
+ /**
+ * Return the template engine object
+ *
+ * Returns the object instance, as it is its own template engine
+ *
+ * @return Zend_View_Abstract
+ */
+ public function getEngine()
+ {
+ return $this;
+ }
+
+ /**
+ * Allow custom object initialization when extending Zend_View_Abstract or
+ * Zend_View
+ *
+ * Triggered by {@link __construct() the constructor} as its final action.
+ *
+ * @return void
+ */
+ public function init()
+ {
+ }
+
+ /**
+ * Prevent E_NOTICE for nonexistent values
+ *
+ * If {@link strictVars()} is on, raises a notice.
+ *
+ * @param string $key
+ * @return null
+ */
+ public function __get($key)
+ {
+ if ($this->_strictVars) {
+ trigger_error('Key "' . $key . '" does not exist', E_USER_NOTICE);
+ }
+
+ return null;
+ }
+
+ /**
+ * Allows testing with empty() and isset() to work inside
+ * templates.
+ *
+ * @param string $key
+ * @return boolean
+ */
+ public function __isset($key)
+ {
+ if ('_' != substr($key, 0, 1)) {
+ return isset($this->$key);
+ }
+
+ return false;
+ }
+
+ /**
+ * Directly assigns a variable to the view script.
+ *
+ * Checks first to ensure that the caller is not attempting to set a
+ * protected or private member (by checking for a prefixed underscore); if
+ * not, the public member is set; otherwise, an exception is raised.
+ *
+ * @param string $key The variable name.
+ * @param mixed $val The variable value.
+ * @return void
+ * @throws Zend_View_Exception if an attempt to set a private or protected
+ * member is detected
+ */
+ public function __set($key, $val)
+ {
+ if ('_' != substr($key, 0, 1)) {
+ $this->$key = $val;
+ return;
+ }
+
+ require_once 'Zend/View/Exception.php';
+ throw new Zend_View_Exception('Setting private or protected class members is not allowed', $this);
+ }
+
+ /**
+ * Allows unset() on object properties to work
+ *
+ * @param string $key
+ * @return void
+ */
+ public function __unset($key)
+ {
+ if ('_' != substr($key, 0, 1) && isset($this->$key)) {
+ unset($this->$key);
+ }
+ }
+
+ /**
+ * Accesses a helper object from within a script.
+ *
+ * If the helper class has a 'view' property, sets it with the current view
+ * object.
+ *
+ * @param string $name The helper name.
+ * @param array $args The parameters for the helper.
+ * @return string The result of the helper output.
+ */
+ public function __call($name, $args)
+ {
+ // is the helper already loaded?
+ $helper = $this->getHelper($name);
+
+ // call the helper method
+ return call_user_func_array(
+ array($helper, $name),
+ $args
+ );
+ }
+
+ /**
+ * Given a base path, sets the script, helper, and filter paths relative to it
+ *
+ * Assumes a directory structure of:
+ * <code>
+ * basePath/
+ * scripts/
+ * helpers/
+ * filters/
+ * </code>
+ *
+ * @param string $path
+ * @param string $prefix Prefix to use for helper and filter paths
+ * @return Zend_View_Abstract
+ */
+ public function setBasePath($path, $classPrefix = 'Zend_View')
+ {
+ $path = rtrim($path, '/');
+ $path = rtrim($path, '\\');
+ $path .= DIRECTORY_SEPARATOR;
+ $classPrefix = rtrim($classPrefix, '_') . '_';
+ $this->setScriptPath($path . 'scripts');
+ $this->setHelperPath($path . 'helpers', $classPrefix . 'Helper');
+ $this->setFilterPath($path . 'filters', $classPrefix . 'Filter');
+ return $this;
+ }
+
+ /**
+ * Given a base path, add script, helper, and filter paths relative to it
+ *
+ * Assumes a directory structure of:
+ * <code>
+ * basePath/
+ * scripts/
+ * helpers/
+ * filters/
+ * </code>
+ *
+ * @param string $path
+ * @param string $prefix Prefix to use for helper and filter paths
+ * @return Zend_View_Abstract
+ */
+ public function addBasePath($path, $classPrefix = 'Zend_View')
+ {
+ $path = rtrim($path, '/');
+ $path = rtrim($path, '\\');
+ $path .= DIRECTORY_SEPARATOR;
+ $classPrefix = rtrim($classPrefix, '_') . '_';
+ $this->addScriptPath($path . 'scripts');
+ $this->addHelperPath($path . 'helpers', $classPrefix . 'Helper');
+ $this->addFilterPath($path . 'filters', $classPrefix . 'Filter');
+ return $this;
+ }
+
+ /**
+ * Adds to the stack of view script paths in LIFO order.
+ *
+ * @param string|array The directory (-ies) to add.
+ * @return Zend_View_Abstract
+ */
+ public function addScriptPath($path)
+ {
+ $this->_addPath('script', $path);
+ return $this;
+ }
+
+ /**
+ * Resets the stack of view script paths.
+ *
+ * To clear all paths, use Zend_View::setScriptPath(null).
+ *
+ * @param string|array The directory (-ies) to set as the path.
+ * @return Zend_View_Abstract
+ */
+ public function setScriptPath($path)
+ {
+ $this->_path['script'] = array();
+ $this->_addPath('script', $path);
+ return $this;
+ }
+
+ /**
+ * Return full path to a view script specified by $name
+ *
+ * @param string $name
+ * @return false|string False if script not found
+ * @throws Zend_View_Exception if no script directory set
+ */
+ public function getScriptPath($name)
+ {
+ try {
+ $path = $this->_script($name);
+ return $path;
+ } catch (Zend_View_Exception $e) {
+ if (strstr($e->getMessage(), 'no view script directory set')) {
+ throw $e;
+ }
+
+ return false;
+ }
+ }
+
+ /**
+ * Returns an array of all currently set script paths
+ *
+ * @return array
+ */
+ public function getScriptPaths()
+ {
+ return $this->_getPaths('script');
+ }
+
+ /**
+ * Adds to the stack of helper paths in LIFO order.
+ *
+ * @param string|array The directory (-ies) to add.
+ * @param string $classPrefix Class prefix to use with classes in this
+ * directory; defaults to Zend_View_Helper
+ * @return Zend_View_Abstract
+ */
+ public function addHelperPath($path, $classPrefix = 'Zend_View_Helper_')
+ {
+ if (!empty($classPrefix) && ('_' != substr($classPrefix, -1))) {
+ $classPrefix .= '_';
+ }
+
+ $this->_addPath('helper', $path, $classPrefix);
+ return $this;
+ }
+
+ /**
+ * Resets the stack of helper paths.
+ *
+ * To clear all paths, use Zend_View::setHelperPath(null).
+ *
+ * @param string|array $path The directory (-ies) to set as the path.
+ * @param string $classPrefix The class prefix to apply to all elements in
+ * $path; defaults to Zend_View_Helper
+ * @return Zend_View_Abstract
+ */
+ public function setHelperPath($path, $classPrefix = 'Zend_View_Helper_')
+ {
+ if (!empty($classPrefix) && ('_' != substr($classPrefix, -1))) {
+ $classPrefix .= '_';
+ }
+
+ $this->_setPath('helper', $path, $classPrefix);
+ return $this;
+ }
+
+ /**
+ * Get full path to a helper class file specified by $name
+ *
+ * @param string $name
+ * @return string|false False on failure, path on success
+ */
+ public function getHelperPath($name)
+ {
+ if (isset($this->_helperLoadedDir[$name])) {
+ return $this->_helperLoadedDir[$name];
+ }
+
+ try {
+ $this->_loadClass('helper', $name);
+ return $this->_helperLoadedDir[$name];
+ } catch (Zend_View_Exception $e) {
+ return false;
+ }
+ }
+
+ /**
+ * Returns an array of all currently set helper paths
+ *
+ * @return array
+ */
+ public function getHelperPaths()
+ {
+ return $this->_getPaths('helper');
+ }
+
+ /**
+ * Get a helper by name
+ *
+ * @param string $name
+ * @return object
+ */
+ public function getHelper($name)
+ {
+ if (!isset($this->_helper[$name])) {
+ $class = $this->_loadClass('helper', $name);
+ $this->_helper[$name] = new $class();
+ if (method_exists($this->_helper[$name], 'setView')) {
+ $this->_helper[$name]->setView($this);
+ }
+ }
+
+ return $this->_helper[$name];
+ }
+
+ /**
+ * Get array of all active helpers
+ *
+ * Only returns those that have already been instantiated.
+ *
+ * @return array
+ */
+ public function getHelpers()
+ {
+ return $this->_helper;
+ }
+
+ /**
+ * Adds to the stack of filter paths in LIFO order.
+ *
+ * @param string|array The directory (-ies) to add.
+ * @param string $classPrefix Class prefix to use with classes in this
+ * directory; defaults to Zend_View_Filter
+ * @return Zend_View_Abstract
+ */
+ public function addFilterPath($path, $classPrefix = 'Zend_View_Filter_')
+ {
+ if (!empty($classPrefix) && ('_' != substr($classPrefix, -1))) {
+ $classPrefix .= '_';
+ }
+
+ $this->_addPath('filter', $path, $classPrefix);
+ return $this;
+ }
+
+ /**
+ * Resets the stack of filter paths.
+ *
+ * To clear all paths, use Zend_View::setFilterPath(null).
+ *
+ * @param string|array The directory (-ies) to set as the path.
+ * @param string $classPrefix The class prefix to apply to all elements in
+ * $path; defaults to Zend_View_Filter
+ * @return Zend_View_Abstract
+ */
+ public function setFilterPath($path, $classPrefix = 'Zend_View_Filter_')
+ {
+ if (!empty($classPrefix) && ('_' != substr($classPrefix, -1))) {
+ $classPrefix .= '_';
+ }
+
+ $this->_setPath('filter', $path, $classPrefix);
+ return $this;
+ }
+
+ /**
+ * Get full path to a filter class file specified by $name
+ *
+ * @param string $name
+ * @return string|false False on failure, path on success
+ */
+ public function getFilterPath($name)
+ {
+ if (isset($this->_filterLoadedDir[$name])) {
+ return $this->_filterLoadedDir[$name];
+ }
+
+ try {
+ $this->_loadClass('filter', $name);
+ return $this->_filterLoadedDir[$name];
+ } catch (Zend_View_Exception $e) {
+ return false;
+ }
+ }
+
+ /**
+ * Get a filter object by name
+ *
+ * @param string $name
+ * @return object
+ */
+ public function getFilter($name)
+ {
+ if (!isset($this->_filterClass[$name])) {
+ $class = $this->_loadClass('filter', $name);
+ $this->_filterClass[$name] = new $class();
+ if (method_exists($this->_filterClass[$name], 'setView')) {
+ $this->_filterClass[$name]->setView($this);
+ }
+ }
+
+ return $this->_filterClass[$name];
+ }
+
+ /**
+ * Return array of all currently active filters
+ *
+ * Only returns those that have already been instantiated.
+ *
+ * @return array
+ */
+ public function getFilters()
+ {
+ return $this->_filter;
+ }
+
+ /**
+ * Returns an array of all currently set filter paths
+ *
+ * @return array
+ */
+ public function getFilterPaths()
+ {
+ return $this->_getPaths('filter');
+ }
+
+ /**
+ * Return associative array of path types => paths
+ *
+ * @return array
+ */
+ public function getAllPaths()
+ {
+ return $this->_path;
+ }
+
+ /**
+ * Add one or more filters to the stack in FIFO order.
+ *
+ * @param string|array One or more filters to add.
+ * @return Zend_View_Abstract
+ */
+ public function addFilter($name)
+ {
+ foreach ((array) $name as $val) {
+ $this->_filter[] = $val;
+ }
+ return $this;
+ }
+
+ /**
+ * Resets the filter stack.
+ *
+ * To clear all filters, use Zend_View::setFilter(null).
+ *
+ * @param string|array One or more filters to set.
+ * @return Zend_View_Abstract
+ */
+ public function setFilter($name)
+ {
+ $this->_filter = array();
+ $this->addFilter($name);
+ return $this;
+ }
+
+ /**
+ * Sets the _escape() callback.
+ *
+ * @param mixed $spec The callback for _escape() to use.
+ * @return Zend_View_Abstract
+ */
+ public function setEscape($spec)
+ {
+ $this->_escape = $spec;
+ return $this;
+ }
+
+ /**
+ * Assigns variables to the view script via differing strategies.
+ *
+ * Zend_View::assign('name', $value) assigns a variable called 'name'
+ * with the corresponding $value.
+ *
+ * Zend_View::assign($array) assigns the array keys as variable
+ * names (with the corresponding array values).
+ *
+ * @see __set()
+ * @param string|array The assignment strategy to use.
+ * @param mixed (Optional) If assigning a named variable, use this
+ * as the value.
+ * @return Zend_View_Abstract Fluent interface
+ * @throws Zend_View_Exception if $spec is neither a string nor an array,
+ * or if an attempt to set a private or protected member is detected
+ */
+ public function assign($spec, $value = null)
+ {
+ // which strategy to use?
+ if (is_string($spec)) {
+ // assign by name and value
+ if ('_' == substr($spec, 0, 1)) {
+ require_once 'Zend/View/Exception.php';
+ throw new Zend_View_Exception('Setting private or protected class members is not allowed', $this);
+ }
+ $this->$spec = $value;
+ } elseif (is_array($spec)) {
+ // assign from associative array
+ $error = false;
+ foreach ($spec as $key => $val) {
+ if ('_' == substr($key, 0, 1)) {
+ $error = true;
+ break;
+ }
+ $this->$key = $val;
+ }
+ if ($error) {
+ require_once 'Zend/View/Exception.php';
+ throw new Zend_View_Exception('Setting private or protected class members is not allowed', $this);
+ }
+ } else {
+ require_once 'Zend/View/Exception.php';
+ throw new Zend_View_Exception('assign() expects a string or array, received ' . gettype($spec), $this);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Return list of all assigned variables
+ *
+ * Returns all public properties of the object. Reflection is not used
+ * here as testing reflection properties for visibility is buggy.
+ *
+ * @return array
+ */
+ public function getVars()
+ {
+ $vars = get_object_vars($this);
+ foreach ($vars as $key => $value) {
+ if ('_' == substr($key, 0, 1)) {
+ unset($vars[$key]);
+ }
+ }
+
+ return $vars;
+ }
+
+ /**
+ * Clear all assigned variables
+ *
+ * Clears all variables assigned to Zend_View either via {@link assign()} or
+ * property overloading ({@link __set()}).
+ *
+ * @return void
+ */
+ public function clearVars()
+ {
+ $vars = get_object_vars($this);
+ foreach ($vars as $key => $value) {
+ if ('_' != substr($key, 0, 1)) {
+ unset($this->$key);
+ }
+ }
+ }
+
+ /**
+ * Processes a view script and returns the output.
+ *
+ * @param string $name The script script name to process.
+ * @return string The script output.
+ */
+ public function render($name)
+ {
+ // find the script file name using the parent private method
+ $this->_file = $this->_script($name);
+ unset($name); // remove $name from local scope
+
+ ob_start();
+ $this->_run($this->_file);
+
+ return $this->_filter(ob_get_clean()); // filter output
+ }
+
+ /**
+ * Escapes a value for output in a view script.
+ *
+ * If escaping mechanism is one of htmlspecialchars or htmlentities, uses
+ * {@link $_encoding} setting.
+ *
+ * @param mixed $var The output to escape.
+ * @return mixed The escaped value.
+ */
+ public function escape($var)
+ {
+ if (in_array($this->_escape, array('htmlspecialchars', 'htmlentities'))) {
+ return call_user_func($this->_escape, $var, ENT_COMPAT, $this->_encoding);
+ }
+
+ return call_user_func($this->_escape, $var);
+ }
+
+ /**
+ * Set encoding to use with htmlentities() and htmlspecialchars()
+ *
+ * @param string $encoding
+ * @return Zend_View_Abstract
+ */
+ public function setEncoding($encoding)
+ {
+ $this->_encoding = $encoding;
+ return $this;
+ }
+
+ /**
+ * Return current escape encoding
+ *
+ * @return string
+ */
+ public function getEncoding()
+ {
+ return $this->_encoding;
+ }
+
+ /**
+ * Enable or disable strict vars
+ *
+ * If strict variables are enabled, {@link __get()} will raise a notice
+ * when a variable is not defined.
+ *
+ * Use in conjunction with {@link Zend_View_Helper_DeclareVars the declareVars() helper}
+ * to enforce strict variable handling in your view scripts.
+ *
+ * @param boolean $flag
+ * @return Zend_View_Abstract
+ */
+ public function strictVars($flag = true)
+ {
+ $this->_strictVars = ($flag) ? true : false;
+
+ return $this;
+ }
+
+ /**
+ * Finds a view script from the available directories.
+ *
+ * @param $name string The base name of the script.
+ * @return void
+ */
+ protected function _script($name)
+ {
+ if (0 == count($this->_path['script'])) {
+ require_once 'Zend/View/Exception.php';
+ throw new Zend_View_Exception('no view script directory set; unable to determine location for view script',
+ $this);
+ }
+
+ foreach ($this->_path['script'] as $dir) {
+ if (is_readable($dir . $name)) {
+ return $dir . $name;
+ }
+ }
+
+ require_once 'Zend/View/Exception.php';
+ $message = "script '$name' not found in path ("
+ . implode(PATH_SEPARATOR, $this->_path['script'])
+ . ")";
+ throw new Zend_View_Exception($message, $this);
+ }
+
+ /**
+ * Applies the filter callback to a buffer.
+ *
+ * @param string $buffer The buffer contents.
+ * @return string The filtered buffer.
+ */
+ private function _filter($buffer)
+ {
+ // loop through each filter class
+ foreach ($this->_filter as $name) {
+ // load and apply the filter class
+ $filter = $this->getFilter($name);
+ $buffer = call_user_func(array($filter, 'filter'), $buffer);
+ }
+
+ // done!
+ return $buffer;
+ }
+
+ /**
+ * Adds paths to the path stack in LIFO order.
+ *
+ * Zend_View::_addPath($type, 'dirname') adds one directory
+ * to the path stack.
+ *
+ * Zend_View::_addPath($type, $array) adds one directory for
+ * each array element value.
+ *
+ * In the case of filter and helper paths, $prefix should be used to
+ * specify what class prefix to use with the given path.
+ *
+ * @param string $type The path type ('script', 'helper', or 'filter').
+ * @param string|array $path The path specification.
+ * @param string $prefix Class prefix to use with path (helpers and filters
+ * only)
+ * @return void
+ */
+ private function _addPath($type, $path, $prefix = null)
+ {
+ foreach ((array) $path as $dir) {
+ // attempt to strip any possible separator and
+ // append the system directory separator
+ $dir = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $dir);
+ $dir = rtrim($dir, DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR)
+ . DIRECTORY_SEPARATOR;
+
+ switch ($type) {
+ case 'script':
+ // add to the top of the stack.
+ array_unshift($this->_path[$type], $dir);
+ break;
+ case 'filter':
+ case 'helper':
+ default:
+ // add as array with prefix and dir keys
+ array_unshift($this->_path[$type], array('prefix' => $prefix, 'dir' => $dir));
+ break;
+ }
+ }
+ }
+
+ /**
+ * Resets the path stack for helpers and filters.
+ *
+ * @param string $type The path type ('helper' or 'filter').
+ * @param string|array $path The directory (-ies) to set as the path.
+ * @param string $classPrefix Class prefix to apply to elements of $path
+ */
+ private function _setPath($type, $path, $classPrefix = null)
+ {
+ $dir = DIRECTORY_SEPARATOR . ucfirst($type) . DIRECTORY_SEPARATOR;
+
+ switch ($type) {
+ case 'script':
+ $this->_path[$type] = array(dirname(__FILE__) . $dir);
+ $this->_addPath($type, $path);
+ break;
+ case 'filter':
+ case 'helper':
+ default:
+ $this->_path[$type] = array(array(
+ 'prefix' => 'Zend_View_' . ucfirst($type) . '_',
+ 'dir' => dirname(__FILE__) . $dir
+ ));
+ $this->_addPath($type, $path, $classPrefix);
+ break;
+ }
+ }
+
+ /**
+ * Return all paths for a given path type
+ *
+ * @param string $type The path type ('helper', 'filter', 'script')
+ * @return array
+ */
+ private function _getPaths($type)
+ {
+ return $this->_path[$type];
+ }
+
+ /**
+ * Loads a helper or filter class.
+ *
+ * @param string $type The class type ('helper' or 'filter').
+ * @param string $name The base name.
+ * @param string The full class name.
+ * @return string class name loaded
+ * @throws Zend_View_Exception if unable to load class
+ */
+ private function _loadClass($type, $name)
+ {
+ // check to see if name => class mapping exists for helper/filter
+ $classLoaded = '_' . $type . 'Loaded';
+ $classAccess = '_set' . ucfirst($type) . 'Class';
+ if (isset($this->$classLoaded[$name])) {
+ return $this->$classLoaded[$name];
+ }
+
+ // only look for "$Name.php"
+ $file = ucfirst($name) . '.php';
+
+ // do LIFO search for helper
+ foreach ($this->_path[$type] as $info) {
+ $dir = $info['dir'];
+ $prefix = $info['prefix'];
+
+ $class = $prefix . ucfirst($name);
+
+ if (class_exists($class, false)) {
+ $reflection = new ReflectionClass($class);
+ $file = $reflection->getFileName();
+ $this->$classAccess($name, $class, $file);
+ return $class;
+ } elseif (Zend_Loader::isReadable($dir . $file)) {
+ include_once $dir . $file;
+
+ if (class_exists($class, false)) {
+ $this->$classAccess($name, $class, $dir . $file);
+ return $class;
+ }
+ }
+ }
+
+ require_once 'Zend/View/Exception.php';
+ throw new Zend_View_Exception("$type '$name' not found in path", $this);
+ }
+
+ /**
+ * Register helper class as loaded
+ *
+ * @param string $name
+ * @param string $class
+ * @param string $file path to class file
+ * @return void
+ */
+ private function _setHelperClass($name, $class, $file)
+ {
+ $this->_helperLoadedDir[$name] = $file;
+ $this->_helperLoaded[$name] = $class;
+ }
+
+ /**
+ * Register filter class as loaded
+ *
+ * @param string $name
+ * @param string $class
+ * @param string $file path to class file
+ * @return void
+ */
+ private function _setFilterClass($name, $class, $file)
+ {
+ $this->_filterLoadedDir[$name] = $file;
+ $this->_filterLoaded[$name] = $class;
+ }
+
+ /**
+ * Use to include the view script in a scope that only allows public
+ * members.
+ *
+ * @return mixed
+ */
+ abstract protected function _run();
+}
diff --git a/libs/Zend/View/Exception.php b/libs/Zend/View/Exception.php
new file mode 100755
index 0000000000..11ccd8947c
--- /dev/null
+++ b/libs/Zend/View/Exception.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Date
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Exception.php 4196 2007-03-23 00:57:04Z gavin $
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * Exception for Zend_View class.
+ *
+ * @category Zend
+ * @package Zend_Date
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Exception extends Zend_Exception
+{
+ protected $view = null;
+
+ public function __construct($message, Zend_View_Interface $view = null)
+ {
+ $this->view = $view;
+ parent::__construct($message);
+ }
+
+ public function getView()
+ {
+ return $this->view;
+ }
+}
diff --git a/libs/Zend/View/Helper/DeclareVars.php b/libs/Zend/View/Helper/DeclareVars.php
new file mode 100755
index 0000000000..e14337b1c4
--- /dev/null
+++ b/libs/Zend/View/Helper/DeclareVars.php
@@ -0,0 +1,103 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_View
+ * @subpackage Helpers
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: DeclareVars.php 4332 2007-04-03 19:59:46Z matthew $
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * Helper for declaring default values of template variables
+ *
+ * @package Zend_View
+ * @subpackage Helpers
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_View_Helper_DeclareVars
+{
+ /**
+ * The view object that created this helper object.
+ * @var Zend_View
+ */
+ public $view;
+
+ /**
+ * Declare template vars to set default values and avoid notices when using strictVars
+ *
+ * Primarily for use when using {@link Zend_View_Abstract::strictVars() Zend_View strictVars()},
+ * this helper can be used to declare template variables that may or may
+ * not already be set in the view object, as well as to set default values.
+ * Arrays passed as arguments to the method will be used to set default
+ * values; otherwise, if the variable does not exist, it is set to an empty
+ * string.
+ *
+ * Usage:
+ * <code>
+ * $this->declareVars(
+ * 'varName1',
+ * 'varName2',
+ * array('varName3' => 'defaultValue',
+ * 'varName4' => array()
+ * )
+ * );
+ * </code>
+ *
+ * @param string|array variable number of arguments, all string names of variables to test
+ * @return void
+ */
+ public function declareVars()
+ {
+ $args = func_get_args();
+ foreach($args as $key) {
+ if (is_array($key)) {
+ foreach ($key as $name => $value) {
+ $this->_declareVar($name, $value);
+ }
+ } else if (!isset($view->$key)) {
+ $this->_declareVar($key);
+ }
+ }
+ }
+
+ /**
+ * Set a view variable
+ *
+ * Checks to see if a $key is set in the view object; if not, sets it to $value.
+ *
+ * @param string $key
+ * @param string $value Defaults to an empty string
+ * @return void
+ */
+ protected function _declareVar($key, $value = '')
+ {
+ if (!isset($this->view->$key)) {
+ $this->view->$key = $value;
+ }
+ }
+
+ /**
+ * Set view object
+ *
+ * @param Zend_View_Interface $view
+ * @return Zend_View_Helper_DeclareVars
+ */
+ public function setView(Zend_View_Interface $view)
+ {
+ $this->view = $view;
+ return $this;
+ }
+}
diff --git a/libs/Zend/View/Helper/FormButton.php b/libs/Zend/View/Helper/FormButton.php
new file mode 100755
index 0000000000..d81bc73088
--- /dev/null
+++ b/libs/Zend/View/Helper/FormButton.php
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Abstract class for extension
+ */
+require_once 'Zend/View/Helper/FormElement.php';
+
+
+/**
+ * Helper to generate a "button" element
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Helper_FormButton extends Zend_View_Helper_FormElement
+{
+ /**
+ * Generates a 'button' element.
+ *
+ * @access public
+ *
+ * @param string|array $name If a string, the element name. If an
+ * array, all other parameters are ignored, and the array elements
+ * are extracted in place of added parameters.
+ *
+ * @param mixed $value The element value.
+ *
+ * @param array $attribs Attributes for the element tag.
+ *
+ * @return string The element XHTML.
+ */
+ public function formButton($name, $value = null, $attribs = null)
+ {
+ $info = $this->_getInfo($name, $value, $attribs);
+ extract($info); // name, id, value, attribs, options, listsep, disable
+
+ // build the element
+ if ($disable) {
+
+ // disabled. no hidden value because it can't be clicked.
+ $xhtml = '[' . $this->view->escape($value) . ']';
+
+ } else {
+
+ // enabled
+ $xhtml = '<input type="button"'
+ . ' name="' . $this->view->escape($name) . '"'
+ . ' id="' . $this->view->escape($id) . '"';
+
+ // add a value if one is given
+ if (! empty($value)) {
+ $xhtml .= ' value="' . $this->view->escape($value) . '"';
+ }
+
+ // add attributes and close
+ $xhtml .= $this->_htmlAttribs($attribs) . ' />';
+ }
+
+ return $xhtml;
+ }
+}
diff --git a/libs/Zend/View/Helper/FormCheckbox.php b/libs/Zend/View/Helper/FormCheckbox.php
new file mode 100755
index 0000000000..c54b9efab5
--- /dev/null
+++ b/libs/Zend/View/Helper/FormCheckbox.php
@@ -0,0 +1,107 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Abstract class for extension
+ */
+require_once 'Zend/View/Helper/FormElement.php';
+
+
+/**
+ * Helper to generate a "checkbox" element
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Helper_FormCheckbox extends Zend_View_Helper_FormElement
+{
+ /**
+ * Generates a 'checkbox' element.
+ *
+ * @access public
+ *
+ * @param string|array $name If a string, the element name. If an
+ * array, all other parameters are ignored, and the array elements
+ * are extracted in place of added parameters.
+ * @param mixed $value The element value.
+ * @param array $attribs Attributes for the element tag.
+ * @param mixed $options If a scalar (single value), the value of the
+ * checkbox when checked; if an array, element 0 is the value when
+ * checked, and element 1 is the value when not-checked.
+ * @return string The element XHTML.
+ */
+ public function formCheckbox($name, $value = null, $attribs = null,
+ $options = array(1,0))
+ {
+ $info = $this->_getInfo($name, $value, $attribs, $options);
+ extract($info); // name, id, value, attribs, options, listsep, disable
+
+ // make sure attribs don't overwrite name and value
+ unset($attribs['name']);
+ unset($attribs['value']);
+
+ // set up checked/unchecked options
+ if (empty($options)) {
+ $options = array(1, 0);
+ } else {
+ settype($options, 'array');
+ if (! isset($options[1])) {
+ $options[1] = null;
+ }
+ }
+
+ // build the element
+ if ($disable) {
+ // disabled.
+ if ($value == $options[0]) {
+ // checked
+ $xhtml = $this->_hidden($name, $options[0]) . '[x]';
+ } else {
+ // not checked
+ $xhtml = $this->_hidden($name, $options[1]) . '[&nbsp;]';
+ }
+ } else {
+ // enabled. add the hidden "unchecked" option first, then
+ // the the checkbox itself) next. this way, if not-checked,
+ // the "unchecked" option is returned to the server instead.
+ $checkboxValue = (null === $value) ? $options[0] : $value;
+ $xhtml = $this->_hidden($name, $options[1])
+ . '<input type="checkbox"'
+ . ' name="' . $this->view->escape($name) . '"'
+ . ' id="' . $this->view->escape($id) . '"'
+ . ' value="' . $this->view->escape($checkboxValue) . '"';
+
+ // is it checked already?
+ if ($value == $options[0]) {
+ $xhtml .= ' checked="checked"';
+ }
+
+ // add attributes and close.
+ $xhtml .= ' ' . $this->_htmlAttribs($attribs) . ' />';
+ }
+
+ return $xhtml;
+ }
+}
diff --git a/libs/Zend/View/Helper/FormElement.php b/libs/Zend/View/Helper/FormElement.php
new file mode 100755
index 0000000000..7955dfb4ef
--- /dev/null
+++ b/libs/Zend/View/Helper/FormElement.php
@@ -0,0 +1,174 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Base helper for form elements. Extend this, don't use it on its own.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_View_Helper_FormElement
+{
+ /**
+ * @var Zend_View_Interface
+ */
+ public $view;
+
+ /**
+ * Converts an associative array to a string of tag attributes.
+ *
+ * @access public
+ *
+ * @param array $attribs From this array, each key-value pair is
+ * converted to an attribute name and value.
+ *
+ * @return string The XHTML for the attributes.
+ */
+ protected function _htmlAttribs($attribs)
+ {
+ $xhtml = '';
+ foreach ((array) $attribs as $key => $val) {
+ $key = $this->view->escape($key);
+ if (is_array($val)) {
+ $val = implode(' ', $val);
+ }
+ $val = $this->view->escape($val);
+ $xhtml .= " $key=\"$val\"";
+ }
+ return $xhtml;
+ }
+
+ /**
+ * Converts parameter arguments to an element info array.
+ *
+ * E.g, formExample($name, $value, $attribs, $options, $listsep) is
+ * the same thing as formExample(array('name' => ...)).
+ *
+ * Note that you cannot pass a 'disable' param; you need to pass
+ * it as an 'attribs' key.
+ *
+ * @access protected
+ *
+ * @return array An element info array with keys for name, value,
+ * attribs, options, listsep, and disable.
+ */
+ protected function _getInfo($name, $value = null, $attribs = null,
+ $options = null, $listsep = null)
+ {
+ // the baseline info. note that $name serves a dual purpose;
+ // if an array, it's an element info array that will override
+ // these baseline values. as such, ignore it for the 'name'
+ // if it's an array.
+ $info = array(
+ 'name' => is_array($name) ? '' : $name,
+ 'id' => is_array($name) ? '' : $name,
+ 'value' => $value,
+ 'attribs' => $attribs,
+ 'options' => $options,
+ 'listsep' => $listsep,
+ 'disable' => false,
+ );
+
+ // override with named args
+ if (is_array($name)) {
+ // only set keys that are already in info
+ foreach ($info as $key => $val) {
+ if (isset($name[$key])) {
+ $info[$key] = $name[$key];
+ }
+ }
+ }
+
+ // force attribs to an array, per note from Orjan Persson.
+ settype($info['attribs'], 'array');
+
+ // disable if readonly
+ if (isset($info['attribs']['readonly']) &&
+ $info['attribs']['readonly'] == 'readonly') {
+ }
+
+ // normal disable, overrides readonly
+ if (isset($info['attribs']['disable']) &&
+ $info['attribs']['disable']) {
+ // disable the element
+ $info['disable'] = true;
+ unset($info['attribs']['disable']);
+ }
+
+ // Set ID for element
+ if (isset($info['attribs']['id'])) {
+ $info['id'] = (string) $info['attribs']['id'];
+ } elseif (!isset($info['attribs']['id']) && !empty($info['name'])) {
+ $info['id'] = $info['name'];
+ }
+
+ // remove attribs that might overwrite the other keys.
+ // we do this LAST because we needed the other attribs
+ // values earlier.
+ foreach ($info as $key => $val) {
+ if (isset($info['attribs'][$key])) {
+ unset($info['attribs'][$key]);
+ }
+ }
+
+ // done!
+ return $info;
+ }
+
+ /**
+ * Creates a hidden element.
+ *
+ * We have this as a common method because other elements often
+ * need hidden elements for their operation.
+ *
+ * @access protected
+ *
+ * @param $name The element name.
+ *
+ * @param $value The element value.
+ *
+ * @param $attribs Attributes for the element.
+ *
+ * @return string A hidden element.
+ */
+ protected function _hidden($name, $value = null, $attribs = null)
+ {
+ return '<input type="hidden"'
+ . ' name="' . $this->view->escape($name) . '"'
+ . ' value="' . $this->view->escape($value) . '"'
+ . $this->_htmlAttribs($attribs) . ' />';
+ }
+
+ /**
+ * Set the view object
+ *
+ * @param Zend_View_Interface $view
+ * @return void
+ */
+ public function setView(Zend_View_Interface $view)
+ {
+ $this->view = $view;
+ }
+}
diff --git a/libs/Zend/View/Helper/FormFile.php b/libs/Zend/View/Helper/FormFile.php
new file mode 100755
index 0000000000..d43147b31b
--- /dev/null
+++ b/libs/Zend/View/Helper/FormFile.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Abstract class for extension
+ */
+require_once 'Zend/View/Helper/FormElement.php';
+
+
+/**
+ * Helper to generate a "file" element
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Helper_FormFile extends Zend_View_Helper_FormElement
+{
+ /**
+ * Generates a 'file' element.
+ *
+ * @access public
+ *
+ * @param string|array $name If a string, the element name. If an
+ * array, all other parameters are ignored, and the array elements
+ * are extracted in place of added parameters.
+ *
+ * @param mixed $value The element value.
+ *
+ * @param array $attribs Attributes for the element tag.
+ *
+ * @return string The element XHTML.
+ */
+ public function formFile($name, $value = null, $attribs = null)
+ {
+ $info = $this->_getInfo($name, $value, $attribs);
+ extract($info); // name, id, value, attribs, options, listsep, disable
+
+ // build the element
+ if ($disable) {
+ // disabled
+ $xhtml = $this->_hidden($name, $value) . $this->view->escape($value);
+ } else {
+ // enabled
+ $xhtml = '<input type="file"'
+ . ' name="' . $this->view->escape($name) . '"'
+ . ' id="' . $this->view->escape($id) . '"'
+ . ' value="' . $this->view->escape($value) . '"'
+ . $this->_htmlAttribs($attribs) . ' />';
+ }
+
+ return $xhtml;
+ }
+}
diff --git a/libs/Zend/View/Helper/FormHidden.php b/libs/Zend/View/Helper/FormHidden.php
new file mode 100755
index 0000000000..b7d4468bca
--- /dev/null
+++ b/libs/Zend/View/Helper/FormHidden.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Abstract class for extension
+ */
+require_once 'Zend/View/Helper/FormElement.php';
+
+
+/**
+ * Helper to generate a "hidden" element
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Helper_FormHidden extends Zend_View_Helper_FormElement
+{
+ /**
+ * Generates a 'hidden' element.
+ *
+ * @access public
+ *
+ * @param string|array $name If a string, the element name. If an
+ * array, all other parameters are ignored, and the array elements
+ * are extracted in place of added parameters.
+ * @param mixed $value The element value.
+ * @param array $attribs Attributes for the element tag.
+ * @return string The element XHTML.
+ */
+ public function formHidden($name, $value = null, array $attribs = null)
+ {
+ $info = $this->_getInfo($name, $value, $attribs);
+ extract($info); // name, value, attribs, options, listsep, disable
+ if (isset($id)) {
+ if (isset($attribs) && is_array($attribs)) {
+ $attribs['id'] = $id;
+ } else {
+ $attribs = array('id' => $id);
+ }
+ }
+ return $this->_hidden($name, $value, $attribs);
+ }
+}
diff --git a/libs/Zend/View/Helper/FormImage.php b/libs/Zend/View/Helper/FormImage.php
new file mode 100755
index 0000000000..fb1f9f4ddf
--- /dev/null
+++ b/libs/Zend/View/Helper/FormImage.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Abstract class for extension
+ */
+require_once 'Zend/View/Helper/FormElement.php';
+
+
+/**
+ * Helper to generate an "image" element
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Helper_FormImage extends Zend_View_Helper_FormElement
+{
+ /**
+ * Generates an 'image' element.
+ *
+ * @access public
+ *
+ * @param string|array $name If a string, the element name. If an
+ * array, all other parameters are ignored, and the array elements
+ * are extracted in place of added parameters.
+ *
+ * @param mixed $value The source ('src="..."') for the image.
+ *
+ * @param array $attribs Attributes for the element tag.
+ *
+ * @return string The element XHTML.
+ */
+ public function formImage($name, $value = null, $attribs = null)
+ {
+ $info = $this->_getInfo($name, $value, $attribs);
+ extract($info); // name, value, attribs, options, listsep, disable
+
+ // unset any 'src' attrib
+ if (isset($attribs['src'])) {
+ unset($attribs['src']);
+ }
+
+ // unset any 'alt' attrib
+ if (isset($attribs['alt'])) {
+ unset($attribs['alt']);
+ }
+
+ // build the element
+ if ($disable) {
+ // disabled, just an image tag
+ $xhtml = '<image'
+ . ' alt="' . $this->view->escape($name) . '"'
+ . ' src="' . $this->view->escape($value) . '"'
+ . $this->_htmlAttribs($attribs) . ' />';
+ } else {
+ // enabled
+ $xhtml = '<input type="image"'
+ . ' name="' . $this->view->escape($name) . '"'
+ . ' id="' . $this->view->escape($id) . '"'
+ . ' src="' . $this->view->escape($value) . '"'
+ . $this->_htmlAttribs($attribs) . ' />';
+ }
+
+ return $xhtml;
+ }
+}
diff --git a/libs/Zend/View/Helper/FormLabel.php b/libs/Zend/View/Helper/FormLabel.php
new file mode 100755
index 0000000000..121ccb0bde
--- /dev/null
+++ b/libs/Zend/View/Helper/FormLabel.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_View_Helper_FormElement **/
+require_once 'Zend/View/Helper/FormElement.php';
+
+/**
+ * Form label helper
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Helper_FormLabel extends Zend_View_Helper_FormElement
+{
+ /**
+ * Generates a 'label' element.
+ *
+ * @param string $name The form element name for which the label is being generated
+ * @param string $value The label text
+ * @param array $attribs Form element attributes (used to determine if disabled)
+ * @return string The element XHTML.
+ */
+ public function formLabel($name, $value, array $attribs = array())
+ {
+ $info = $this->_getInfo($name, $value, $attribs);
+ extract($info); // name, value, attribs, options, listsep, disable
+
+ // build the element
+ if ($disable) {
+ // disabled; do nothing
+ } else {
+ // enabled; display label
+ $xhtml = '<label'
+ . ' for="' . $this->view->escape($name) . '"'
+ . $this->_htmlAttribs($attribs)
+ . '>' . $this->view->escape($value) . '</label>';
+ }
+
+ return $xhtml;
+ }
+}
diff --git a/libs/Zend/View/Helper/FormNote.php b/libs/Zend/View/Helper/FormNote.php
new file mode 100755
index 0000000000..030c227615
--- /dev/null
+++ b/libs/Zend/View/Helper/FormNote.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Abstract class for extension
+ */
+require_once 'Zend/View/Helper/FormElement.php';
+
+
+/**
+ * Helper to show an HTML note
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Helper_FormNote extends Zend_View_Helper_FormElement
+{
+ /**
+ * Helper to show a "note" based on a hidden value.
+ *
+ * @access public
+ *
+ * @param string|array $name If a string, the element name. If an
+ * array, all other parameters are ignored, and the array elements
+ * are extracted in place of added parameters.
+ *
+ * @param array $value The note to display. HTML is *not* escaped; the
+ * note is displayed as-is.
+ *
+ * @return string The element XHTML.
+ */
+ public function formNote($name, $value = null)
+ {
+ $info = $this->_getInfo($name, $value);
+ extract($info); // name, value, attribs, options, listsep, disable
+ return $value;
+ }
+}
diff --git a/libs/Zend/View/Helper/FormPassword.php b/libs/Zend/View/Helper/FormPassword.php
new file mode 100755
index 0000000000..416f91f20b
--- /dev/null
+++ b/libs/Zend/View/Helper/FormPassword.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Abstract class for extension
+ */
+require_once 'Zend/View/Helper/FormElement.php';
+
+
+/**
+ * Helper to generate a "password" element
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Helper_FormPassword extends Zend_View_Helper_FormElement
+{
+ /**
+ * Generates a 'password' element.
+ *
+ * @access public
+ *
+ * @param string|array $name If a string, the element name. If an
+ * array, all other parameters are ignored, and the array elements
+ * are extracted in place of added parameters.
+ *
+ * @param mixed $value The element value.
+ *
+ * @param array $attribs Attributes for the element tag.
+ *
+ * @return string The element XHTML.
+ */
+ public function formPassword($name, $value = null, $attribs = null)
+ {
+ $info = $this->_getInfo($name, $value, $attribs);
+ extract($info); // name, value, attribs, options, listsep, disable
+
+ // build the element
+ if ($disable) {
+ // disabled
+ $xhtml = $this->_hidden($name, $value) . 'xxxxxxxx';
+ } else {
+ // enabled
+ $xhtml = '<input type="password"'
+ . ' name="' . $this->view->escape($name) . '"'
+ . ' id="' . $this->view->escape($id) . '"'
+ . ' value="' . $this->view->escape($value) . '"'
+ . $this->_htmlAttribs($attribs)
+ . ' />';
+ }
+
+ return $xhtml;
+ }
+
+}
diff --git a/libs/Zend/View/Helper/FormRadio.php b/libs/Zend/View/Helper/FormRadio.php
new file mode 100755
index 0000000000..4da7d06e7c
--- /dev/null
+++ b/libs/Zend/View/Helper/FormRadio.php
@@ -0,0 +1,139 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Abstract class for extension
+ */
+require_once 'Zend/View/Helper/FormElement.php';
+
+
+/**
+ * Helper to generate a set of radio button elements
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Helper_FormRadio extends Zend_View_Helper_FormElement
+{
+ /**
+ * Generates a set of radio button elements.
+ *
+ * @access public
+ *
+ * @param string|array $name If a string, the element name. If an
+ * array, all other parameters are ignored, and the array elements
+ * are extracted in place of added parameters.
+ *
+ * @param mixed $value The radio value to mark as 'checked'.
+ *
+ * @param array $options An array of key-value pairs where the array
+ * key is the radio value, and the array value is the radio text.
+ *
+ * @param array|string $attribs Attributes added to each radio.
+ *
+ * @return string The radio buttons XHTML.
+ */
+ public function formRadio($name, $value = null, $attribs = null,
+ $options = null, $listsep = "<br />\n")
+ {
+
+ $info = $this->_getInfo($name, $value, $attribs, $options, $listsep);
+ extract($info); // name, value, attribs, options, listsep, disable
+
+ // retrieve attributes for labels (prefixed with 'label_')
+ $label_attribs = array('style' => 'white-space: nowrap;');
+ foreach ($attribs as $key => $val) {
+ if (substr($key, 0, 6) == 'label_') {
+ $tmp = substr($key, 6);
+ $label_attribs[$tmp] = $val;
+ unset($attribs[$key]);
+ }
+ }
+
+ // the radio button values and labels
+ settype($options, 'array');
+
+ // default value if none are checked
+ $xhtml = $this->_hidden($name, null);
+
+ // build the element
+ if ($disable) {
+
+ // disabled.
+ // show the radios as a plain list.
+ $list = array();
+
+ // create the list of radios.
+ foreach ($options as $opt_value => $opt_label) {
+ if ($opt_value == $value) {
+ // add a return value, and a checked text.
+ $opt = $this->_hidden($name, $opt_value) . '[x]';
+ } else {
+ // not checked
+ $opt = '[&nbsp;]';
+ }
+ $list[] = $opt . '&nbsp;' . $opt_label;
+ }
+
+ $xhtml .= implode($listsep, $list);
+
+ } else {
+
+ // enabled.
+ // the array of all radios.
+ $list = array();
+
+ // add radio buttons to the list.
+ foreach ($options as $opt_value => $opt_label) {
+
+ // begin the label wrapper
+ $radio = '<label'
+ . $this->_htmlAttribs($label_attribs) . '>'
+ . '<input type="radio"'
+ . ' name="' . $this->view->escape($name) . '"'
+ . ' value="' . $this->view->escape($opt_value) . '"';
+
+ // is it checked?
+ if ($opt_value == $value) {
+ $radio .= ' checked="checked"';
+ }
+
+ // add attribs, end the radio, end the label
+ $radio .= $this->_htmlAttribs($attribs) .
+ ' />' .
+ $this->view->escape($opt_label) .
+ '</label>';
+
+ // add to the array of radio buttons
+ $list[] = $radio;
+ }
+
+ // done!
+ $xhtml .= implode($listsep, $list);
+ }
+
+ return $xhtml;
+ }
+}
diff --git a/libs/Zend/View/Helper/FormReset.php b/libs/Zend/View/Helper/FormReset.php
new file mode 100755
index 0000000000..1d75a65ff7
--- /dev/null
+++ b/libs/Zend/View/Helper/FormReset.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Abstract class for extension
+ */
+require_once 'Zend/View/Helper/FormElement.php';
+
+
+/**
+ * Helper to generate a "reset" button
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Helper_FormReset extends Zend_View_Helper_FormElement
+{
+ /**
+ * Generates a 'reset' button.
+ *
+ * @access public
+ *
+ * @param string|array $name If a string, the element name. If an
+ * array, all other parameters are ignored, and the array elements
+ * are extracted in place of added parameters.
+ *
+ * @param mixed $value The element value.
+ *
+ * @param array $attribs Attributes for the element tag.
+ *
+ * @return string The element XHTML.
+ */
+ public function formReset($name = '', $value = 'Reset', $attribs = null)
+ {
+ $info = $this->_getInfo($name, $value, $attribs);
+ extract($info); // name, value, attribs, options, listsep, disable
+
+ // always enabled
+ $xhtml = '<input type="reset"'
+ . ' name="' . $this->view->escape($name) . '"'
+ . ' id="' . $this->view->escape($id) . '"';
+
+ // add a value if one is given
+ if (! empty($value)) {
+ $xhtml .= ' value="' . $this->view->escape($value) . '"';
+ }
+
+ // add attributes, close, and return
+ $xhtml .= $this->_htmlAttribs($attribs) . ' />';
+ return $xhtml;
+ }
+}
diff --git a/libs/Zend/View/Helper/FormSelect.php b/libs/Zend/View/Helper/FormSelect.php
new file mode 100755
index 0000000000..4ffd440026
--- /dev/null
+++ b/libs/Zend/View/Helper/FormSelect.php
@@ -0,0 +1,163 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Abstract class for extension
+ */
+require_once 'Zend/View/Helper/FormElement.php';
+
+
+/**
+ * Helper to generate "select" list of options
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Helper_FormSelect extends Zend_View_Helper_FormElement
+{
+ /**
+ * Generates 'select' list of options.
+ *
+ * @access public
+ *
+ * @param string|array $name If a string, the element name. If an
+ * array, all other parameters are ignored, and the array elements
+ * are extracted in place of added parameters.
+ *
+ * @param mixed $value The option value to mark as 'selected'; if an
+ * array, will mark all values in the array as 'selected' (used for
+ * multiple-select elements).
+ *
+ * @param array|string $attribs Attributes added to the 'select' tag.
+ *
+ * @param array $options An array of key-value pairs where the array
+ * key is the radio value, and the array value is the radio text.
+ *
+ * @param string $listsep When disabled, use this list separator string
+ * between list values.
+ *
+ * @return string The select tag and options XHTML.
+ */
+ public function formSelect($name, $value = null, $attribs = null,
+ $options = null, $listsep = "<br />\n")
+ {
+ $info = $this->_getInfo($name, $value, $attribs, $options, $listsep);
+ extract($info); // name, id, value, attribs, options, listsep, disable
+
+ // force $value to array so we can compare multiple values
+ // to multiple options.
+ settype($value, 'array');
+
+ // check for multiple attrib and change name if needed
+ if (isset($attribs['multiple']) &&
+ $attribs['multiple'] == 'multiple' &&
+ substr($name, -2) != '[]') {
+ $name .= '[]';
+ }
+
+ // check for multiple implied by the name and set attrib if
+ // needed
+ if (substr($name, -2) == '[]') {
+ $attribs['multiple'] = 'multiple';
+ }
+
+ // now start building the XHTML.
+ if ($disable) {
+
+ // disabled.
+ // generate a plain list of selected options.
+ // show the label, not the value, of the option.
+ $list = array();
+ foreach ($options as $opt_value => $opt_label) {
+ if (in_array($opt_value, $value)) {
+ // add the hidden value
+ $opt = $this->_hidden($name, $opt_value);
+ // add the display label
+ $opt .= $this->view->escape($opt_label);
+ // add to the list
+ $list[] = $opt;
+ }
+ }
+ $xhtml = implode($listsep, $list);
+
+ } else {
+
+ // enabled.
+ // the surrounding select element first.
+ $xhtml = '<select'
+ . ' name="' . $this->view->escape($name) . '"'
+ . ' id="' . $this->view->escape($id) . '"'
+ . $this->_htmlAttribs($attribs)
+ . ">\n\t";
+
+ // build the list of options
+ $list = array();
+ foreach ($options as $opt_value => $opt_label) {
+
+ if (is_array($opt_label)) {
+ $list[] = '<optgroup '
+ . 'label="' . $this->view->escape($opt_value) .'">';
+ foreach ($opt_label as $val => $lab) {
+ $list[] = $this->_build($val, $lab, $value);
+ }
+ $list[] = '</optgroup>';
+ } else {
+ $list[] = $this->_build($opt_value, $opt_label, $value);
+ }
+ }
+
+ // add the options to the xhtml and close the select
+ $xhtml .= implode("\n\t", $list) . "\n</select>";
+
+ }
+
+ return $xhtml;
+ }
+
+ /**
+ * Builds the actual <option> tag
+ *
+ * @param string $value Options Value
+ * @param string $label Options Label
+ * @param array $selected The option value(s) to mark as 'selected'
+ * @return string Option Tag XHTML
+ */
+ protected function _build($value, $label, $selected)
+ {
+ $opt = '<option'
+ . ' value="' . $this->view->escape($value) . '"'
+ . ' label="' . $this->view->escape($label) . '"';
+
+ // selected?
+ if (in_array($value, $selected)) {
+ $opt .= ' selected="selected"';
+ }
+
+ $opt .= '>' . $this->view->escape($label) . "</option>";
+
+ return $opt;
+ }
+
+}
diff --git a/libs/Zend/View/Helper/FormSubmit.php b/libs/Zend/View/Helper/FormSubmit.php
new file mode 100755
index 0000000000..f63ffa05b5
--- /dev/null
+++ b/libs/Zend/View/Helper/FormSubmit.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Abstract class for extension
+ */
+require_once 'Zend/View/Helper/FormElement.php';
+
+
+/**
+ * Helper to generate a "submit" button
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Helper_FormSubmit extends Zend_View_Helper_FormElement
+{
+ /**
+ * Generates a 'submit' button.
+ *
+ * @access public
+ *
+ * @param string|array $name If a string, the element name. If an
+ * array, all other parameters are ignored, and the array elements
+ * are extracted in place of added parameters.
+ *
+ * @param mixed $value The element value.
+ *
+ * @param array $attribs Attributes for the element tag.
+ *
+ * @return string The element XHTML.
+ */
+ public function formSubmit($name, $value = null, $attribs = null)
+ {
+ $info = $this->_getInfo($name, $value, $attribs);
+ extract($info); // name, value, attribs, options, listsep, disable
+
+ // ignore disable/enable, always show the button.
+ $xhtml = '<input type="submit"'
+ . ' name="' . $this->view->escape($name) . '"'
+ . ' id="' . $this->view->escape($id) . '"';
+
+ // add a value if one is given
+ if (! empty($value)) {
+ $xhtml .= ' value="' . $this->view->escape($value) . '"';
+ }
+
+ // add attributes, close, and return
+ $xhtml .= $this->_htmlAttribs($attribs) . ' />';
+ return $xhtml;
+ }
+}
diff --git a/libs/Zend/View/Helper/FormText.php b/libs/Zend/View/Helper/FormText.php
new file mode 100755
index 0000000000..c98da38b5b
--- /dev/null
+++ b/libs/Zend/View/Helper/FormText.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Abstract class for extension
+ */
+require_once 'Zend/View/Helper/FormElement.php';
+
+
+/**
+ * Helper to generate a "text" element
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Helper_FormText extends Zend_View_Helper_FormElement
+{
+ /**
+ * Generates a 'text' element.
+ *
+ * @access public
+ *
+ * @param string|array $name If a string, the element name. If an
+ * array, all other parameters are ignored, and the array elements
+ * are used in place of added parameters.
+ *
+ * @param mixed $value The element value.
+ *
+ * @param array $attribs Attributes for the element tag.
+ *
+ * @return string The element XHTML.
+ */
+ public function formText($name, $value = null, $attribs = null)
+ {
+ $info = $this->_getInfo($name, $value, $attribs);
+ extract($info); // name, value, attribs, options, listsep, disable
+
+ // build the element
+ if ($disable) {
+ // disabled
+ $xhtml = $this->_hidden($name, $value)
+ . $this->view->escape($value);
+ } else {
+ // enabled
+ $xhtml = '<input type="text"'
+ . ' name="' . $this->view->escape($name) . '"'
+ . ' id="' . $this->view->escape($id) . '"'
+ . ' value="' . $this->view->escape($value) . '"'
+ . $this->_htmlAttribs($attribs)
+ . ' />';
+ }
+
+ return $xhtml;
+ }
+}
diff --git a/libs/Zend/View/Helper/FormTextarea.php b/libs/Zend/View/Helper/FormTextarea.php
new file mode 100755
index 0000000000..0fdef620cb
--- /dev/null
+++ b/libs/Zend/View/Helper/FormTextarea.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Abstract class for extension
+ */
+require_once 'Zend/View/Helper/FormElement.php';
+
+
+/**
+ * Helper to generate a "textarea" element
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Helper_FormTextarea extends Zend_View_Helper_FormElement
+{
+ /**
+ * The default number of rows for a textarea.
+ *
+ * @access public
+ *
+ * @var int
+ */
+ public $rows = 24;
+
+ /**
+ * The default number of columns for a textarea.
+ *
+ * @access public
+ *
+ * @var int
+ */
+ public $cols = 80;
+
+ /**
+ * Generates a 'textarea' element.
+ *
+ * @access public
+ *
+ * @param string|array $name If a string, the element name. If an
+ * array, all other parameters are ignored, and the array elements
+ * are extracted in place of added parameters.
+ *
+ * @param mixed $value The element value.
+ *
+ * @param array $attribs Attributes for the element tag.
+ *
+ * @return string The element XHTML.
+ */
+ public function formTextarea($name, $value = null, $attribs = null)
+ {
+ $info = $this->_getInfo($name, $value, $attribs);
+ extract($info); // name, value, attribs, options, listsep, disable
+
+ // build the element
+ if ($disable) {
+
+ // disabled.
+ $xhtml = $this->_hidden($name, $value)
+ . nl2br($this->view->escape($value));
+
+ } else {
+
+ // enabled.
+
+ // first, make sure that there are 'rows' and 'cols' values
+ // as required by the spec. noted by Orjan Persson.
+ if (empty($attribs['rows'])) {
+ $attribs['rows'] = (int) $this->rows;
+ }
+
+ if (empty($attribs['cols'])) {
+ $attribs['cols'] = (int) $this->cols;
+ }
+
+ // now build the element.
+ $xhtml = '<textarea name="' . $this->view->escape($name) . '"'
+ . ' id="' . $this->view->escape($id) . '"'
+ . $this->_htmlAttribs($attribs) . '>'
+ . $this->view->escape($value) . '</textarea>';
+
+ }
+
+ return $xhtml;
+ }
+}
diff --git a/libs/Zend/View/Helper/HtmlList.php b/libs/Zend/View/Helper/HtmlList.php
new file mode 100755
index 0000000000..3aff28c2b0
--- /dev/null
+++ b/libs/Zend/View/Helper/HtmlList.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_View_Helper_FormELement
+ */
+require_once 'Zend/View/Helper/FormElement.php';
+
+/**
+ * Helper for ordered and unordered lists
+ *
+ * @uses Zend_View_Helper_FormElement
+ * @category Zend
+ * @package Zend_View
+ * @subpackage Helper
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_View_Helper_HtmlList extends Zend_View_Helper_FormElement
+{
+
+ /**
+ * Generates a 'List' element.
+ *
+ * @param array $items Array with the elements of the list
+ * @param boolean $ordered Specifies ordered/unordered list; default unordered
+ * @param array $attribs Attributes for the ol/ul tag.
+ * @return string The list XHTML.
+ */
+ public function htmlList(array $items, $ordered = false, $attribs = false)
+ {
+ if (!is_array($items)) {
+ require_once 'Zend/View/Exception.php';
+ throw new Zend_View_Exception('First param must be an array', $this);
+ }
+
+ $list = '';
+
+ foreach ($items as $item) {
+ if (!is_array($item)) {
+ $list .= '<li>' . $item . '</li>';
+ } else {
+ if (5 < strlen($list)) {
+ $list = substr($list, 0, strlen($list) - 5) . $this->htmlList($item, $ordered) . '</li>';
+ } else {
+ $list .= '<li>' . $this->htmlList($item, $ordered) . '</li>';
+ }
+ }
+ }
+
+ if ($attribs) {
+ $attribs = $this->_htmlAttribs($attribs);
+ } else {
+ $attribs = '';
+ }
+
+ $tag = 'ul';
+ if ($ordered) {
+ $tag = 'ol';
+ }
+
+ return '<' . $tag . $attribs . '>' . $list . '</' . $tag . '>';
+ }
+}
diff --git a/libs/Zend/View/Helper/TODO.txt b/libs/Zend/View/Helper/TODO.txt
new file mode 100755
index 0000000000..d405503bbe
--- /dev/null
+++ b/libs/Zend/View/Helper/TODO.txt
@@ -0,0 +1,2 @@
+- Take a closer look at use of extract() in these classes and probably
+ remove it as a best practice
diff --git a/libs/Zend/View/Helper/Url.php b/libs/Zend/View/Helper/Url.php
new file mode 100755
index 0000000000..ca7f84d949
--- /dev/null
+++ b/libs/Zend/View/Helper/Url.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_View
+ * @subpackage Helpers
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @version $Id: Url.php 4802 2007-05-15 17:03:58Z matthew $
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * Helper for making easy links and getting urls that depend on the routes and router
+ *
+ * @package Zend_View
+ * @subpackage Helpers
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_View_Helper_Url {
+
+ /**
+ * Generates an url given the name of a route.
+ *
+ * @access public
+ *
+ * @param array $urlOptions Options passed to the assemble method of the Route object.
+ * @param mixed $name The name of a Route to use. If null it will use the current Route
+ * @param bool $reset Whether or not to reset the route defaults with those provided
+ * @return string Url for the link href attribute.
+ */
+ public function url(array $urlOptions = array(), $name = null, $reset = false)
+ {
+
+ $ctrl = Zend_Controller_Front::getInstance();
+
+ $router = $ctrl->getRouter();
+
+ if (empty($name)) {
+ try {
+ $name = $router->getCurrentRouteName();
+ } catch (Zend_Controller_Router_Exception $e) {
+ if ($router->hasRoute('default')) {
+ $name = 'default';
+ }
+ }
+ }
+
+ $route = $router->getRoute($name);
+
+ $request = $ctrl->getRequest();
+
+ $url = rtrim($request->getBaseUrl(), '/') . '/';
+ $url .= $route->assemble($urlOptions, $reset);
+
+ return $url;
+
+ }
+
+}
diff --git a/libs/Zend/View/Interface.php b/libs/Zend/View/Interface.php
new file mode 100755
index 0000000000..51e0128e60
--- /dev/null
+++ b/libs/Zend/View/Interface.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_View
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Interface class for Zend_View compatible template engine implementations
+ *
+ * @category Zend
+ * @package Zend_View
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+interface Zend_View_Interface
+{
+ /**
+ * Return the template engine object, if any
+ *
+ * If using a third-party template engine, such as Smarty, patTemplate,
+ * phplib, etc, return the template engine object. Useful for calling
+ * methods on these objects, such as for setting filters, modifiers, etc.
+ *
+ * @return mixed
+ */
+ public function getEngine();
+
+ /**
+ * Set the path to find the view script used by render()
+ *
+ * @param string|array The directory (-ies) to set as the path. Note that
+ * the concrete view implentation may not necessarily support multiple
+ * directories.
+ * @return void
+ */
+ public function setScriptPath($path);
+
+ /**
+ * Retrieve all view script paths
+ *
+ * @return array
+ */
+ public function getScriptPaths();
+
+ /**
+ * Set a base path to all view resources
+ *
+ * @param string $path
+ * @param string $classPrefix
+ * @return void
+ */
+ public function setBasePath($path, $classPrefix = 'Zend_View');
+
+ /**
+ * Add an additional path to view resources
+ *
+ * @param string $path
+ * @param string $classPrefix
+ * @return void
+ */
+ public function addBasePath($path, $classPrefix = 'Zend_View');
+
+ /**
+ * Assign a variable to the view
+ *
+ * @param string $key The variable name.
+ * @param mixed $val The variable value.
+ * @return void
+ */
+ public function __set($key, $val);
+
+ /**
+ * Allows testing with empty() and isset() to work
+ *
+ * @param string $key
+ * @return boolean
+ */
+ public function __isset($key);
+
+ /**
+ * Allows unset() on object properties to work
+ *
+ * @param string $key
+ * @return void
+ */
+ public function __unset($key);
+
+ /**
+ * Assign variables to the view script via differing strategies.
+ *
+ * Suggested implementation is to allow setting a specific key to the
+ * specified value, OR passing an array of key => value pairs to set en
+ * masse.
+ *
+ * @see __set()
+ * @param string|array $spec The assignment strategy to use (key or array of key
+ * => value pairs)
+ * @param mixed $value (Optional) If assigning a named variable, use this
+ * as the value.
+ * @return void
+ */
+ public function assign($spec, $value = null);
+
+ /**
+ * Clear all assigned variables
+ *
+ * Clears all variables assigned to Zend_View either via {@link assign()} or
+ * property overloading ({@link __get()}/{@link __set()}).
+ *
+ * @return void
+ */
+ public function clearVars();
+
+ /**
+ * Processes a view script and returns the output.
+ *
+ * @param string $name The script script name to process.
+ * @return string The script output.
+ */
+ public function render($name);
+}
diff --git a/libs/Zend/XmlRpc/Client.php b/libs/Zend/XmlRpc/Client.php
new file mode 100755
index 0000000000..7e2cbb569e
--- /dev/null
+++ b/libs/Zend/XmlRpc/Client.php
@@ -0,0 +1,267 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * For handling the HTTP connection to the XML-RPC service
+ */
+require_once 'Zend/Http/Client.php';
+
+/**
+ * Exception thrown when an HTTP error occurs
+ */
+require_once 'Zend/XmlRpc/Client/HttpException.php';
+
+/**
+ * Exception thrown when an XML-RPC fault is returned
+ */
+require_once 'Zend/XmlRpc/Client/FaultException.php';
+
+/**
+ * Enables object chaining for calling namespaced XML-RPC methods.
+ */
+require_once 'Zend/XmlRpc/Client/ServerProxy.php';
+
+/**
+ * Introspects remote servers using the XML-RPC de facto system.* methods
+ */
+require_once 'Zend/XmlRpc/Client/ServerIntrospection.php';
+
+/**
+ * Represent a native XML-RPC value, used both in sending parameters
+ * to methods and as the parameters retrieve from method calls
+ */
+require_once 'Zend/XmlRpc/Value.php';
+
+/**
+ * XML-RPC Request
+ */
+require_once 'Zend/XmlRpc/Request.php';
+
+/**
+ * XML-RPC Response
+ */
+require_once 'Zend/XmlRpc/Response.php';
+
+/**
+ * XML-RPC Fault
+ */
+require_once 'Zend/XmlRpc/Fault.php';
+
+
+/**
+ * An XML-RPC client implementation
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Client
+{
+ /** @var string */
+ private $_serverAddress;
+
+ /** @var Zend_Http_Client */
+ private $_httpClient = null;
+
+ /** @var Zend_Http_Client_Introspector */
+ private $_introspector = null;
+
+ /** @var Zend_XmlRpc_Request */
+ private $_lastRequest = null;
+
+ /** @var Zend_XmlRpc_Response */
+ private $_lastResponse = null;
+
+ /** @var array of Zend_XmlRpc_Client_ServerProxy */
+ private $_proxyCache = array();
+
+
+ /**
+ * Create a new XML-RPC client to a remote server
+ *
+ * @param string $server Full address of the XML-RPC service
+ * (e.g. http://time.xmlrpc.com/RPC2)
+ * @param Zend_Http_Client $httpClient HTTP Client to use for requests
+ * @return void
+ */
+ public function __construct($server, Zend_Http_Client $httpClient = null)
+ {
+ if ($httpClient === null) {
+ $this->_httpClient = new Zend_Http_Client();
+ } else {
+ $this->_httpClient = $httpClient;
+ }
+
+ $this->_introspector = new Zend_XmlRpc_Client_ServerIntrospection($this);
+ $this->_serverAddress = $server;
+ }
+
+
+ /**
+ * Sets the HTTP client object to use for connecting the XML-RPC server.
+ *
+ * @param Zend_Http_Client $httpClient
+ * @return Zend_Http_Client
+ */
+ public function setHttpClient(Zend_Http_Client $httpClient)
+ {
+ return $this->_httpClient = $httpClient;
+ }
+
+
+ /**
+ * Gets the HTTP client object.
+ *
+ * @return Zend_Http_Client
+ */
+ public function getHttpClient()
+ {
+ return $this->_httpClient;
+ }
+
+
+ /**
+ * Sets the object used to introspect remote servers
+ *
+ * @param Zend_XmlRpc_Client_ServerIntrospection
+ * @return Zend_XmlRpc_Client_ServerIntrospection
+ */
+ public function setIntrospector(Zend_XmlRpc_Client_ServerIntrospection $introspector)
+ {
+ return $this->_introspector = $introspector;
+ }
+
+
+ /**
+ * Gets the introspection object.
+ *
+ * @return Zend_XmlRpc_Client_ServerIntrospection
+ */
+ public function getIntrospector()
+ {
+ return $this->_introspector;
+ }
+
+
+ /**
+ * The request of the last method call
+ *
+ * @return Zend_XmlRpc_Request
+ */
+ public function getLastRequest()
+ {
+ return $this->_lastRequest;
+ }
+
+
+ /**
+ * The response received from the last method call
+ *
+ * @return Zend_XmlRpc_Response
+ */
+ public function getLastResponse()
+ {
+ return $this->_lastResponse;
+ }
+
+
+ /**
+ * Returns a proxy object for more convenient method calls
+ *
+ * @param $namespace Namespace to proxy or empty string for none
+ * @return Zend_XmlRpc_Client_ServerProxy
+ */
+ public function getProxy($namespace = '')
+ {
+ if (empty($this->_proxyCache[$namespace])) {
+ $proxy = new Zend_XmlRpc_Client_ServerProxy($this, $namespace);
+ $this->_proxyCache[$namespace] = $proxy;
+ }
+ return $this->_proxyCache[$namespace];
+ }
+
+
+ /**
+ * Perform an XML-RPC request and return a response.
+ *
+ * @param Zend_XmlRpc_Request $request
+ * @param null|Zend_XmlRpc_Response $response
+ * @return void
+ */
+ public function doRequest($request, $response = null)
+ {
+ $this->_lastRequest = $request;
+
+ iconv_set_encoding('input_encoding', 'UTF-8');
+ iconv_set_encoding('output_encoding', 'UTF-8');
+ iconv_set_encoding('internal_encoding', 'UTF-8');
+
+ $http = $this->getHttpClient();
+ $http->setUri($this->_serverAddress);
+
+ $http->setHeaders(array(
+ 'Content-Type: text/xml; charset=utf-8',
+ 'User-Agent: Zend_XmlRpc_Client'
+ ));
+
+ $xml = $this->_lastRequest->__toString();
+ $http->setRawData($xml);
+ $httpResponse = $http->request(Zend_Http_Client::POST);
+
+ if (! $httpResponse->isSuccessful()) {
+ throw new Zend_XmlRpc_Client_HttpException(
+ $httpResponse->getMessage(),
+ $httpResponse->getStatus());
+ }
+
+ if ($response === null) {
+ $response = new Zend_XmlRpc_Response();
+ }
+ $this->_lastResponse = $response;
+ $this->_lastResponse->loadXml($httpResponse->getBody());
+ }
+
+
+ /**
+ * Send an XML-RPC request to the service (for a specific method)
+ *
+ * @param string $method Name of the method we want to call
+ * @param array $params Array of parameters for the method
+ * @throws Zend_Http_Client_FaultException
+ */
+ public function call($method, $params=array())
+ {
+ $request = new Zend_XmlRpc_Request($method, $params);
+
+ $this->doRequest($request);
+
+ if ($this->_lastResponse->isFault()) {
+ $fault = $this->_lastResponse->getFault();
+ throw new Zend_XmlRpc_Client_FaultException($fault->getMessage(),
+ $fault->getCode());
+ }
+
+ return $this->_lastResponse->getReturnValue();
+ }
+}
diff --git a/libs/Zend/XmlRpc/Client/Exception.php b/libs/Zend/XmlRpc/Client/Exception.php
new file mode 100755
index 0000000000..2527b3a099
--- /dev/null
+++ b/libs/Zend/XmlRpc/Client/Exception.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_XmlRpc_Exception
+ */
+require_once 'Zend/XmlRpc/Exception.php';
+
+
+/**
+ * Base class for all Zend_XmlRpc_Client_* exceptions
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Client_Exception extends Zend_XmlRpc_Exception
+{}
diff --git a/libs/Zend/XmlRpc/Client/FaultException.php b/libs/Zend/XmlRpc/Client/FaultException.php
new file mode 100755
index 0000000000..c31e5bde62
--- /dev/null
+++ b/libs/Zend/XmlRpc/Client/FaultException.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_XmlRpc_Client_Exception */
+require_once 'Zend/XmlRpc/Client/Exception.php';
+
+
+/**
+ * Thrown by Zend_XmlRpc_Client when an XML-RPC fault response is returned.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Client_FaultException extends Zend_XmlRpc_Client_Exception
+{}
diff --git a/libs/Zend/XmlRpc/Client/HttpException.php b/libs/Zend/XmlRpc/Client/HttpException.php
new file mode 100755
index 0000000000..8b3f001660
--- /dev/null
+++ b/libs/Zend/XmlRpc/Client/HttpException.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_XmlRpc_Exception
+ */
+require_once 'Zend/XmlRpc/Client/Exception.php';
+
+
+/**
+ * Thrown by Zend_XmlRpc_Client when an HTTP error occurs during an
+ * XML-RPC method call.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Client_HttpException extends Zend_XmlRpc_Client_Exception
+{}
diff --git a/libs/Zend/XmlRpc/Client/IntrospectException.php b/libs/Zend/XmlRpc/Client/IntrospectException.php
new file mode 100755
index 0000000000..d947086873
--- /dev/null
+++ b/libs/Zend/XmlRpc/Client/IntrospectException.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_XmlRpc_Client_Exception
+ */
+require_once 'Zend/XmlRpc/Client/Exception.php';
+
+
+/**
+ * Thrown by Zend_XmlRpc_Client_Introspection when any error occurs.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Client_IntrospectException extends Zend_XmlRpc_Client_Exception
+{}
diff --git a/libs/Zend/XmlRpc/Client/ServerIntrospection.php b/libs/Zend/XmlRpc/Client/ServerIntrospection.php
new file mode 100755
index 0000000000..efba08ef6a
--- /dev/null
+++ b/libs/Zend/XmlRpc/Client/ServerIntrospection.php
@@ -0,0 +1,162 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/** Zend_XmlRpc_Client_IntrospectException */
+require_once 'Zend/XmlRpc/Client/IntrospectException.php';
+
+
+/**
+ * Wraps the XML-RPC system.* introspection methods
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Client_ServerIntrospection
+{
+ /**
+ * @var Zend_XmlRpc_Client_ServerProxy
+ */
+ private $_system = null;
+
+
+ /**
+ * @param Zend_XmlRpc_Client $client
+ */
+ public function __construct(Zend_XmlRpc_Client $client)
+ {
+ $this->_system = $client->getProxy('system');
+ }
+
+ /**
+ * Returns the signature for each method on the server,
+ * autodetecting whether system.multicall() is supported and
+ * using it if so.
+ *
+ * @return array
+ */
+ public function getSignatureForEachMethod()
+ {
+ $methods = $this->listMethods();
+
+ try {
+ $signatures = $this->getSignatureForEachMethodByMulticall($methods);
+ } catch (Zend_XmlRpc_Client_FaultException $e) {
+ // degrade to looping
+ }
+
+ if (empty($signatures)) {
+ $signatures = $this->getSignatureForEachMethodByLooping($methods);
+ }
+
+ return $signatures;
+ }
+
+ /**
+ * Attempt to get the method signatures in one request via system.multicall().
+ * This is a boxcar feature of XML-RPC and is found on fewer servers. However,
+ * can significantly improve performance if present.
+ *
+ * @param array $methods
+ * @return array array(array(return, param, param, param...))
+ */
+ public function getSignatureForEachMethodByMulticall($methods = null)
+ {
+ if ($methods === null) {
+ $methods = $this->listMethods();
+ }
+
+ $multicallParams = array();
+ foreach ($methods as $method) {
+ $multicallParams[] = array('methodName' => 'system.methodSignature',
+ 'params' => array($method));
+ }
+
+ $serverSignatures = $this->_system->multicall($multicallParams);
+
+ if (! is_array($serverSignatures)) {
+ $type = gettype($serverSignatures);
+ $error = "Multicall return is malformed. Expected array, got $type";
+ throw new Zend_XmlRpc_Client_IntrospectException($error);
+ }
+
+ if (count($serverSignatures) != count($methods)) {
+ $error = 'Bad number of signatures received from multicall';
+ throw new Zend_XmlRpc_Client_IntrospectException($error);
+ }
+
+ // Create a new signatures array with the methods name as keys and the signature as value
+ $signatures = array();
+ foreach ($serverSignatures as $i => $signature) {
+ $signatures[$methods[$i]] = $signature;
+ }
+
+ return $signatures;
+ }
+
+ /**
+ * Get the method signatures for every method by
+ * successively calling system.methodSignature
+ *
+ * @param array $methods
+ * @return array
+ */
+ public function getSignatureForEachMethodByLooping($methods = null)
+ {
+ if ($methods === null) {
+ $methods = $this->listMethods();
+ }
+
+ $signatures = array();
+ foreach ($methods as $method) {
+ $signatures[$method] = $this->getMethodSignature($method);
+ }
+
+ return $signatures;
+ }
+
+ /**
+ * Call system.methodSignature() for the given method
+ *
+ * @param array $method
+ * @return array array(array(return, param, param, param...))
+ */
+ public function getMethodSignature($method)
+ {
+ $signature = $this->_system->methodSignature($method);
+ return $signature;
+ }
+
+ /**
+ * Call system.listMethods()
+ *
+ * @param array $method
+ * @return array array(method, method, method...)
+ */
+ public function listMethods()
+ {
+ return $this->_system->listMethods();
+ }
+
+}
diff --git a/libs/Zend/XmlRpc/Client/ServerProxy.php b/libs/Zend/XmlRpc/Client/ServerProxy.php
new file mode 100755
index 0000000000..e057390fda
--- /dev/null
+++ b/libs/Zend/XmlRpc/Client/ServerProxy.php
@@ -0,0 +1,94 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * The namespace decorator enables object chaining to permit
+ * calling XML-RPC namespaced functions like "foo.bar.baz()"
+ * as "$remote->foo->bar->baz()".
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Client
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Client_ServerProxy
+{
+ /**
+ * @var Zend_XmlRpc_Client
+ */
+ private $_client = null;
+
+ /**
+ * @var string
+ */
+ private $_namespace = '';
+
+
+ /**
+ * @var array of Zend_XmlRpc_Client_ServerProxy
+ */
+ private $_cache = array();
+
+
+ /**
+ * Class constructor
+ *
+ * @param string $namespace
+ * @param Zend_XmlRpc_Client $client
+ */
+ public function __construct($client, $namespace = '')
+ {
+ $this->_namespace = $namespace;
+ $this->_client = $client;
+ }
+
+
+ /**
+ * Get the next successive namespace
+ *
+ * @param string $name
+ * @return Zend_XmlRpc_Client_ServerProxy
+ */
+ public function __get($namespace)
+ {
+ $namespace = ltrim("$this->_namespace.$namespace", '.');
+ if (!isset($this->_cache[$namespace])) {
+ $this->_cache[$namespace] = new $this($this->_client, $namespace);
+ }
+ return $this->_cache[$namespace];
+ }
+
+
+ /**
+ * Call a method in this namespace.
+ *
+ * @param string $methodN
+ * @param array $args
+ * @return mixed
+ */
+ public function __call($method, $args)
+ {
+ $method = ltrim("$this->_namespace.$method", '.');
+ return $this->_client->call($method, $args);
+ }
+}
diff --git a/libs/Zend/XmlRpc/Exception.php b/libs/Zend/XmlRpc/Exception.php
new file mode 100755
index 0000000000..5f4ce41570
--- /dev/null
+++ b/libs/Zend/XmlRpc/Exception.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_Exception
+ */
+require_once 'Zend/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Exception extends Zend_Exception
+{}
+
diff --git a/libs/Zend/XmlRpc/Fault.php b/libs/Zend/XmlRpc/Fault.php
new file mode 100755
index 0000000000..949ec5a57f
--- /dev/null
+++ b/libs/Zend/XmlRpc/Fault.php
@@ -0,0 +1,307 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_XmlRpc
+ * @subpackage Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * Zend_XmlRpc_Value
+ */
+require_once 'Zend/XmlRpc/Value.php';
+
+/**
+ * Zend_XmlRpc_Exception
+ */
+require_once 'Zend/XmlRpc/Exception.php';
+
+/**
+ * XMLRPC Faults
+ *
+ * Container for XMLRPC faults, containing both a code and a message;
+ * additionally, has methods for determining if an XML response is an XMLRPC
+ * fault, as well as generating the XML for an XMLRPC fault response.
+ *
+ * To allow method chaining, you may only use the {@link getInstance()} factory
+ * to instantiate a Zend_XmlRpc_Server_Fault.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_XmlRpc_Fault
+{
+ /**
+ * Fault code
+ * @var int
+ */
+ protected $_code;
+
+ /**
+ * Fault character encoding
+ * @var string
+ */
+ protected $_encoding = 'UTF-8';
+
+ /**
+ * Fault message
+ * @var string
+ */
+ protected $_message;
+
+ /**
+ * Internal fault codes => messages
+ * @var array
+ */
+ protected $_internal = array(
+ 404 => 'Unknown Error',
+
+ // 610 - 619 reflection errors
+ 610 => 'Invalid method class',
+ 611 => 'Unable to attach function or callback; not callable',
+ 612 => 'Unable to load array; not an array',
+ 613 => 'One or more method records are corrupt or otherwise unusable',
+
+ // 620 - 629 dispatch errors
+ 620 => 'Method does not exist',
+ 621 => 'Error instantiating class to invoke method',
+ 622 => 'Method missing implementation',
+ 623 => 'Calling parameters do not match signature',
+
+ // 630 - 639 request errors
+ 630 => 'Unable to read request',
+ 631 => 'Failed to parse request',
+ 632 => 'Invalid request, no method passed; request must contain a \'methodName\' tag',
+ 633 => 'Param must contain a value',
+ 634 => 'Invalid method name',
+ 635 => 'Invalid XML provided to request',
+ 636 => 'Error creating xmlrpc value',
+
+ // 640 - 649 system.* errors
+ 640 => 'Method does not exist',
+
+ // 650 - 659 response errors
+ 650 => 'Invalid XML provided for response',
+ 651 => 'Failed to parse response',
+ 652 => 'Invalid response',
+ 653 => 'Invalid XMLRPC value in response',
+ );
+
+ /**
+ * Constructor
+ *
+ * @return Zend_XmlRpc_Fault
+ */
+ public function __construct($code = 404, $message = '')
+ {
+ $this->setCode($code);
+ $code = $this->getCode();
+
+ if (empty($message) && isset($this->_internal[$code])) {
+ $message = $this->_internal[$code];
+ } elseif (empty($message)) {
+ $message = 'Unknown error';
+ }
+ $this->setMessage($message);
+ }
+
+ /**
+ * Set the fault code
+ *
+ * @param int $code
+ * @return Zend_XmlRpc_Fault
+ */
+ public function setCode($code)
+ {
+ $this->_code = (int) $code;
+ return $this;
+ }
+
+ /**
+ * Return fault code
+ *
+ * @return int
+ */
+ public function getCode()
+ {
+ return $this->_code;
+ }
+
+ /**
+ * Retrieve fault message
+ *
+ * @param string
+ * @return Zend_XmlRpc_Fault
+ */
+ public function setMessage($message)
+ {
+ $this->_message = (string) $message;
+ return $this;
+ }
+
+ /**
+ * Retrieve fault message
+ *
+ * @return string
+ */
+ public function getMessage()
+ {
+ return $this->_message;
+ }
+
+ /**
+ * Set encoding to use in fault response
+ *
+ * @param string $encoding
+ * @return Zend_XmlRpc_Fault
+ */
+ public function setEncoding($encoding)
+ {
+ $this->_encoding = $encoding;
+ return $this;
+ }
+
+ /**
+ * Retrieve current fault encoding
+ *
+ * @return string
+ */
+ public function getEncoding()
+ {
+ return $this->_encoding;
+ }
+
+ /**
+ * Load an XMLRPC fault from XML
+ *
+ * @param string $fault
+ * @return boolean Returns true if successfully loaded fault response, false
+ * if response was not a fault response
+ * @throws Zend_XmlRpc_Exception if no or faulty XML provided, or if fault
+ * response does not contain either code or message
+ */
+ public function loadXml($fault)
+ {
+ if (!is_string($fault)) {
+ throw new Zend_XmlRpc_Exception('Invalid XML provided to fault');
+ }
+
+ try {
+ $xml = @new SimpleXMLElement($fault);
+ } catch (Exception $e) {
+ // Not valid XML
+ throw new Zend_XmlRpc_Exception('Failed to parse XML fault: ' . $e->getMessage(), 500);
+ }
+
+ // Check for fault
+ if (!$xml->fault) {
+ // Not a fault
+ return false;
+ }
+
+ if (!$xml->fault->value->struct) {
+ // not a proper fault
+ throw new Zend_XmlRpc_Exception('Invalid fault structure', 500);
+ }
+
+ $structXml = $xml->fault->value->asXML();
+ $structXml = preg_replace('/<\?xml version=.*?\?>/i', '', $structXml);
+ $struct = Zend_XmlRpc_Value::getXmlRpcValue(trim($structXml), Zend_XmlRpc_Value::XML_STRING);
+ $struct = $struct->getValue();
+
+ if (isset($struct['faultCode'])) {
+ $code = $struct['faultCode'];
+ }
+ if (isset($struct['faultString'])) {
+ $message = $struct['faultString'];
+ }
+
+ if (empty($code) && empty($message)) {
+ throw new Zend_XmlRpc_Exception('Fault code and string required');
+ }
+
+ if (empty($code)) {
+ $code = '404';
+ }
+
+ if (empty($message)) {
+ if (isset($this->_internal[$code])) {
+ $message = $this->_internal[$code];
+ } else {
+ $message = 'Unknown Error';
+ }
+ }
+
+ $this->setCode($code);
+ $this->setMessage($message);
+
+ return true;
+ }
+
+ /**
+ * Determine if an XML response is an XMLRPC fault
+ *
+ * @param string $xml
+ * @return boolean
+ */
+ public static function isFault($xml)
+ {
+ $fault = new self();
+ try {
+ $isFault = $fault->loadXml($xml);
+ } catch (Zend_XmlRpc_Exception $e) {
+ $isFault = false;
+ }
+
+ return $isFault;
+ }
+
+ /**
+ * Serialize fault to XML
+ *
+ * @return string
+ */
+ public function saveXML()
+ {
+ // Create fault value
+ $faultStruct = array(
+ 'faultCode' => $this->getCode(),
+ 'faultString' => $this->getMessage()
+ );
+ $value = Zend_XmlRpc_Value::getXmlRpcValue($faultStruct);
+ $valueDOM = new DOMDocument('1.0', $this->getEncoding());
+ $valueDOM->loadXML($value->saveXML());
+
+ // Build response XML
+ $dom = new DOMDocument('1.0', 'ISO-8859-1');
+ $r = $dom->appendChild($dom->createElement('methodResponse'));
+ $f = $r->appendChild($dom->createElement('fault'));
+ $f->appendChild($dom->importNode($valueDOM->documentElement, 1));
+
+ return $dom->saveXML();
+ }
+
+ /**
+ * Return XML fault response
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->saveXML();
+ }
+}
diff --git a/libs/Zend/XmlRpc/Request.php b/libs/Zend/XmlRpc/Request.php
new file mode 100755
index 0000000000..54177e1bbd
--- /dev/null
+++ b/libs/Zend/XmlRpc/Request.php
@@ -0,0 +1,381 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_XmlRpc_Exception
+ */
+require_once 'Zend/XmlRpc/Exception.php';
+
+/**
+ * Zend_XmlRpc_Value
+ */
+require_once 'Zend/XmlRpc/Value.php';
+
+/**
+ * Zend_XmlRpc_Fault
+ */
+require_once 'Zend/XmlRpc/Fault.php';
+
+/**
+ * XmlRpc Request object
+ *
+ * Encapsulates an XmlRpc request, holding the method call and all parameters.
+ * Provides accessors for these, as well as the ability to load from XML and to
+ * create the XML request string.
+ *
+ * Additionally, if errors occur setting the method or parsing XML, a fault is
+ * generated and stored in {@link $_fault}; developers may check for it using
+ * {@link isFault()} and {@link getFault()}.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Request.php 4901 2007-05-23 15:46:16Z matthew $
+ */
+class Zend_XmlRpc_Request
+{
+ /**
+ * Request character encoding
+ * @var string
+ */
+ protected $_encoding = 'UTF-8';
+
+ /**
+ * Method to call
+ * @var string
+ */
+ protected $_method;
+
+ /**
+ * XML request
+ * @var string
+ */
+ protected $_xml;
+
+ /**
+ * Method parameters
+ * @var array
+ */
+ protected $_params = array();
+
+ /**
+ * Fault object, if any
+ * @var Zend_XmlRpc_Fault
+ */
+ protected $_fault = null;
+
+
+ /**
+ * Create a new XML-RPC request
+ *
+ * @param string method (optional)
+ * @param array params (optional)
+ */
+ public function __construct($method = null, $params = null)
+ {
+ if ($method !== null) {
+ $this->setMethod($method);
+ }
+
+ if ($params !== null) {
+ $this->setParams($params);
+ }
+ }
+
+
+ /**
+ * Set encoding to use in request
+ *
+ * @param string $encoding
+ * @return Zend_XmlRpc_Request
+ */
+ public function setEncoding($encoding)
+ {
+ $this->_encoding = $encoding;
+ return $this;
+ }
+
+ /**
+ * Retrieve current request encoding
+ *
+ * @return string
+ */
+ public function getEncoding()
+ {
+ return $this->_encoding;
+ }
+
+ /**
+ * Set method to call
+ *
+ * @param string $method
+ * @return boolean Returns true on success, false if method name is invalid
+ */
+ public function setMethod($method)
+ {
+ if (!is_string($method) || !preg_match('/^[a-z0-9_.:\/]+$/i', $method)) {
+ $this->_fault = new Zend_XmlRpc_Fault(634, 'Invalid method name ("' . $method . '")');
+ $this->_fault->setEncoding($this->getEncoding());
+ return false;
+ }
+
+ $this->_method = $method;
+ return true;
+ }
+
+ /**
+ * Retrieve call method
+ *
+ * @return string
+ */
+ public function getMethod()
+ {
+ return $this->_method;
+ }
+
+ /**
+ * Add a parameter to the parameter stack
+ *
+ * Adds a parameter to the parameter stack, associating it with the type
+ * $type if provided
+ *
+ * @param mixed $value
+ * @param string $type Optional; type hinting
+ * @return void
+ */
+ public function addParam($value, $type = null)
+ {
+ $this->_params[] = $value;
+ $this->_xmlRpcParams[] = array('value' => $value, 'type' => $type);
+ }
+
+ /**
+ * Set the parameters array
+ *
+ * If called with a single, array value, that array is used to set the
+ * parameters stack. If called with multiple values or a single non-array
+ * value, the arguments are used to set the parameters stack.
+ *
+ * Best is to call with array of the format, in order to allow type hinting
+ * when creating the XMLRPC values for each parameter:
+ * <code>
+ * $array = array(
+ * array(
+ * 'value' => $value,
+ * 'type' => $type
+ * )[, ... ]
+ * );
+ * </code>
+ *
+ * @access public
+ * @return void
+ */
+ public function setParams()
+ {
+ $argc = func_num_args();
+ $argv = func_get_args();
+ if (0 == $argc) {
+ return;
+ }
+
+ if ((1 == $argc) && is_array($argv[0])) {
+ $params = array();
+ $wellFormed = true;
+ foreach ($argv[0] as $arg) {
+ if (!is_array($arg) || !isset($arg['value'])) {
+ $wellFormed = false;
+ break;
+ }
+ $params[] = $arg['value'];
+ }
+ if ($wellFormed) {
+ $this->_xmlRpcParams = $argv[0];
+ $this->_params = $params;
+ } else {
+ $this->_params = $argv[0];
+ $xmlRpcParams = array();
+ foreach ($argv[0] as $arg) {
+ $xmlRpcParams[]= array('value' => $arg, 'type' => null);
+ }
+ $this->_xmlRpcParams = $xmlRpcParams;
+ }
+ return;
+ }
+
+ $this->_params = $argv;
+ $xmlRpcParams = array();
+ foreach ($argv as $arg) {
+ $xmlRpcParams[]= array('value' => $arg, 'type' => null);
+ }
+ $this->_xmlRpcParams = $xmlRpcParams;
+ }
+
+ /**
+ * Retrieve the array of parameters
+ *
+ * @return array
+ */
+ public function getParams()
+ {
+ return $this->_params;
+ }
+
+ /**
+ * Load XML and parse into request components
+ *
+ * @param string $request
+ * @return boolean True on success, false if an error occurred.
+ */
+ public function loadXml($request)
+ {
+ if (!is_string($request)) {
+ $this->_fault = new Zend_XmlRpc_Fault(635);
+ $this->_fault->setEncoding($this->getEncoding());
+ return false;
+ }
+
+ try {
+ $xml = @new SimpleXMLElement($request);
+ } catch (Exception $e) {
+ // Not valid XML
+ $this->_fault = new Zend_XmlRpc_Fault(631);
+ $this->_fault->setEncoding($this->getEncoding());
+ return false;
+ }
+
+ // Check for method name
+ if (empty($xml->methodName)) {
+ // Missing method name
+ $this->_fault = new Zend_XmlRpc_Fault(632);
+ $this->_fault->setEncoding($this->getEncoding());
+ return false;
+ }
+
+ $this->_method = (string) $xml->methodName;
+
+ // Check for parameters
+ if (!empty($xml->params)) {
+ $argv = array();
+ foreach ($xml->params->children() as $param) {
+ if (! $param->value instanceof SimpleXMLElement) {
+ $this->_fault = new Zend_XmlRpc_Fault(633);
+ $this->_fault->setEncoding($this->getEncoding());
+ return false;
+ }
+
+ try {
+ $argv[] = Zend_XmlRpc_Value::getXmlRpcValue($param->value, Zend_XmlRpc_Value::XML_STRING)->getValue();
+ } catch (Exception $e) {
+ $this->_fault = new Zend_XmlRpc_Fault(636);
+ $this->_fault->setEncoding($this->getEncoding());
+ return false;
+ }
+ }
+
+ $this->_params = $argv;
+ }
+
+ $this->_xml = $request;
+
+ return true;
+ }
+
+ /**
+ * Does the current request contain errors and should it return a fault
+ * response?
+ *
+ * @return boolean
+ */
+ public function isFault()
+ {
+ return $this->_fault instanceof Zend_XmlRpc_Fault;
+ }
+
+ /**
+ * Retrieve the fault response, if any
+ *
+ * @return null|Zend_XmlRpc_Fault
+ */
+ public function getFault()
+ {
+ return $this->_fault;
+ }
+
+ /**
+ * Retrieve method parameters as XMLRPC values
+ *
+ * @return array
+ */
+ protected function _getXmlRpcParams()
+ {
+ $params = array();
+ if (is_array($this->_xmlRpcParams)) {
+ foreach ($this->_xmlRpcParams as $param) {
+ $value = $param['value'];
+ $type = isset($param['type']) ? $param['type'] : Zend_XmlRpc_Value::AUTO_DETECT_TYPE;
+
+ $params[] = Zend_XmlRpc_Value::getXmlRpcValue($value, $type);
+ }
+ }
+
+ return $params;
+ }
+
+ /**
+ * Create XML request
+ *
+ * @return string
+ */
+ public function saveXML()
+ {
+ $args = $this->_getXmlRpcParams();
+ $method = $this->getMethod();
+
+ $dom = new DOMDocument('1.0', $this->getEncoding());
+ $mCall = $dom->appendChild($dom->createElement('methodCall'));
+ $mName = $mCall->appendChild($dom->createElement('methodName', $method));
+
+ if (is_array($args) && count($args)) {
+ $params = $mCall->appendChild($dom->createElement('params'));
+
+ foreach ($args as $arg) {
+ /* @var $arg Zend_XmlRpc_Value */
+ $argDOM = new DOMDocument('1.0', $this->getEncoding());
+ $argDOM->loadXML($arg->saveXML());
+
+ $param = $params->appendChild($dom->createElement('param'));
+ $param->appendChild($dom->importNode($argDOM->documentElement, 1));
+ }
+ }
+
+ return $dom->saveXML();
+ }
+
+ /**
+ * Return XML request
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->saveXML();
+ }
+}
diff --git a/libs/Zend/XmlRpc/Request/Http.php b/libs/Zend/XmlRpc/Request/Http.php
new file mode 100755
index 0000000000..f9dc1bdf9e
--- /dev/null
+++ b/libs/Zend/XmlRpc/Request/Http.php
@@ -0,0 +1,129 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_XmlRpc_Request
+ */
+require_once 'Zend/XmlRpc/Request.php';
+
+/**
+ * XmlRpc Request object -- Request via HTTP
+ *
+ * Extends {@link Zend_XmlRpc_Request} to accept a request via HTTP. Request is
+ * built at construction time using a raw POST; if no data is available, the
+ * request is declared a fault.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Http.php 3833 2007-03-09 05:01:14Z matthew $
+ */
+class Zend_XmlRpc_Request_Http extends Zend_XmlRpc_Request
+{
+ /**
+ * Array of headers
+ * @var array
+ */
+ protected $_headers;
+
+ /**
+ * Raw XML as received via request
+ * @var string
+ */
+ protected $_xml;
+
+ /**
+ * Constructor
+ *
+ * Attempts to read from php://input to get raw POST request; if an error
+ * occurs in doing so, or if the XML is invalid, the request is declared a
+ * fault.
+ *
+ * @return void
+ */
+ public function __construct()
+ {
+ $fh = fopen('php://input', 'r');
+ if (!$fh) {
+ $this->_fault = new Zend_XmlRpc_Server_Exception(630);
+ return;
+ }
+
+ $xml = '';
+ while (!feof($fh)) {
+ $xml .= fgets($fh);
+ }
+ fclose($fh);
+
+ $this->_xml = $xml;
+
+ $this->loadXml($xml);
+ }
+
+ /**
+ * Retrieve the raw XML request
+ *
+ * @return string
+ */
+ public function getRawRequest()
+ {
+ return $this->_xml;
+ }
+
+ /**
+ * Get headers
+ *
+ * Gets all headers as key => value pairs and returns them.
+ *
+ * @return array
+ */
+ public function getHeaders()
+ {
+ if (null === $this->_headers) {
+ $this->_headers = array();
+ foreach ($_SERVER as $key => $value) {
+ if ('HTTP_' == substr($key, 0, 5)) {
+ $header = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($key, 5)))));
+ $this->_headers[$header] = $value;
+ }
+ }
+ }
+
+ return $this->_headers;
+ }
+
+ /**
+ * Retrieve the full HTTP request, including headers and XML
+ *
+ * @return string
+ */
+ public function getFullRequest()
+ {
+ $request = '';
+ foreach ($this->getHeaders() as $key => $value) {
+ $request .= $key . ': ' . $value . "\n";
+ }
+
+ $request .= $this->_xml;
+
+ return $request;
+ }
+}
diff --git a/libs/Zend/XmlRpc/Request/Stdin.php b/libs/Zend/XmlRpc/Request/Stdin.php
new file mode 100755
index 0000000000..e28a12ea5a
--- /dev/null
+++ b/libs/Zend/XmlRpc/Request/Stdin.php
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_XmlRpc_Request
+ */
+require_once 'Zend/XmlRpc/Request.php';
+
+/**
+ * XmlRpc Request object -- Request via STDIN
+ *
+ * Extends {@link Zend_XmlRpc_Request} to accept a request via STDIN. Request is
+ * built at construction time using data from STDIN; if no data is available, the
+ * request is declared a fault.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Stdin.php 2810 2007-01-16 01:40:21Z bkarwin $
+ */
+class Zend_XmlRpc_Request_Stdin extends Zend_XmlRpc_Request
+{
+ /**
+ * Raw XML as received via request
+ * @var string
+ */
+ protected $_xml;
+
+ /**
+ * Constructor
+ *
+ * Attempts to read from php://stdin to get raw POST request; if an error
+ * occurs in doing so, or if the XML is invalid, the request is declared a
+ * fault.
+ *
+ * @return void
+ */
+ public function __construct()
+ {
+ $fh = fopen('php://stdin', 'r');
+ if (!$fh) {
+ $this->_fault = new Zend_XmlRpc_Server_Exception(630);
+ return;
+ }
+
+ $xml = '';
+ while (!feof($fh)) {
+ $xml .= fgets($fh);
+ }
+ fclose($fh);
+
+ $this->_xml = $xml;
+
+ $this->loadXml($xml);
+ }
+
+ /**
+ * Retrieve the raw XML request
+ *
+ * @return string
+ */
+ public function getRawRequest()
+ {
+ return $this->_xml;
+ }
+}
diff --git a/libs/Zend/XmlRpc/Response.php b/libs/Zend/XmlRpc/Response.php
new file mode 100755
index 0000000000..cfb306500a
--- /dev/null
+++ b/libs/Zend/XmlRpc/Response.php
@@ -0,0 +1,249 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_XmlRpc_Value
+ */
+require_once 'Zend/XmlRpc/Value.php';
+
+/**
+ * Zend_XmlRpc_Fault
+ */
+require_once 'Zend/XmlRpc/Fault.php';
+
+/**
+ * XmlRpc Response
+ *
+ * Container for accessing an XMLRPC return value and creating the XML response.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Response.php 5478 2007-06-28 20:20:08Z matthew $
+ */
+class Zend_XmlRpc_Response
+{
+ /**
+ * Return value
+ * @var mixed
+ */
+ protected $_return;
+
+ /**
+ * Return type
+ * @var string
+ */
+ protected $_type;
+
+ /**
+ * Response character encoding
+ * @var string
+ */
+ protected $_encoding = 'UTF-8';
+
+ /**
+ * Fault, if response is a fault response
+ * @var null|Zend_XmlRpc_Fault
+ */
+ protected $_fault = null;
+
+ /**
+ * Constructor
+ *
+ * Can optionally pass in the return value and type hinting; otherwise, the
+ * return value can be set via {@link setReturnValue()}.
+ *
+ * @param mixed $return
+ * @param string $type
+ * @return void
+ */
+ public function __construct($return = null, $type = null)
+ {
+ $this->setReturnValue($return, $type);
+ }
+
+ /**
+ * Set encoding to use in response
+ *
+ * @param string $encoding
+ * @return Zend_XmlRpc_Response
+ */
+ public function setEncoding($encoding)
+ {
+ $this->_encoding = $encoding;
+ return $this;
+ }
+
+ /**
+ * Retrieve current response encoding
+ *
+ * @return string
+ */
+ public function getEncoding()
+ {
+ return $this->_encoding;
+ }
+
+ /**
+ * Set the return value
+ *
+ * Sets the return value, with optional type hinting if provided.
+ *
+ * @param mixed $value
+ * @param string $type
+ * @return void
+ */
+ public function setReturnValue($value, $type = null)
+ {
+ $this->_return = $value;
+ $this->_type = (string) $type;
+ }
+
+ /**
+ * Retrieve the return value
+ *
+ * @return mixed
+ */
+ public function getReturnValue()
+ {
+ return $this->_return;
+ }
+
+ /**
+ * Retrieve the XMLRPC value for the return value
+ *
+ * @return Zend_XmlRpc_Value
+ */
+ protected function _getXmlRpcReturn()
+ {
+ return Zend_XmlRpc_Value::getXmlRpcValue($this->_return);
+ }
+
+ /**
+ * Is the response a fault response?
+ *
+ * @return boolean
+ */
+ public function isFault()
+ {
+ return $this->_fault instanceof Zend_XmlRpc_Fault;
+ }
+
+ /**
+ * Returns the fault, if any.
+ *
+ * @return null|Zend_XmlRpc_Fault
+ */
+ public function getFault()
+ {
+ return $this->_fault;
+ }
+
+ /**
+ * Load a response from an XML response
+ *
+ * Attempts to load a response from an XMLRPC response, autodetecting if it
+ * is a fault response.
+ *
+ * @param string $response
+ * @return boolean True if a valid XMLRPC response, false if a fault
+ * response or invalid input
+ */
+ public function loadXml($response)
+ {
+ if (!is_string($response)) {
+ $this->_fault = new Zend_XmlRpc_Fault(650);
+ $this->_fault->setEncoding($this->getEncoding());
+ return false;
+ }
+
+ try {
+ $xml = @new SimpleXMLElement($response);
+ } catch (Exception $e) {
+ // Not valid XML
+ $this->_fault = new Zend_XmlRpc_Fault(651);
+ $this->_fault->setEncoding($this->getEncoding());
+ return false;
+ }
+
+ if (!empty($xml->fault)) {
+ // fault response
+ $this->_fault = new Zend_XmlRpc_Fault();
+ $this->_fault->setEncoding($this->getEncoding());
+ $this->_fault->loadXml($response);
+ return false;
+ }
+
+ if (empty($xml->params)) {
+ // Invalid response
+ $this->_fault = new Zend_XmlRpc_Fault(652);
+ $this->_fault->setEncoding($this->getEncoding());
+ return false;
+ }
+
+ try {
+ if (!isset($xml->params) || !isset($xml->params->param) || !isset($xml->params->param->value)) {
+ throw new Zend_XmlRpc_Value_Exception('Missing XML-RPC value in XML');
+ }
+ $valueXml = $xml->params->param->value->asXML();
+ $valueXml = preg_replace('/<\?xml version=.*?\?>/i', '', $valueXml);
+ $value = Zend_XmlRpc_Value::getXmlRpcValue(trim($valueXml), Zend_XmlRpc_Value::XML_STRING);
+ } catch (Zend_XmlRpc_Value_Exception $e) {
+ $this->_fault = new Zend_XmlRpc_Fault(653);
+ $this->_fault->setEncoding($this->getEncoding());
+ return false;
+ }
+
+ $this->setReturnValue($value->getValue());
+ return true;
+ }
+
+ /**
+ * Return response as XML
+ *
+ * @return string
+ */
+ public function saveXML()
+ {
+ $value = $this->_getXmlRpcReturn();
+ $valueDOM = new DOMDocument('1.0', $this->getEncoding());
+ $valueDOM->loadXML($value->saveXML());
+
+ $dom = new DOMDocument('1.0', $this->getEncoding());
+ $response = $dom->appendChild($dom->createElement('methodResponse'));
+ $params = $response->appendChild($dom->createElement('params'));
+ $param = $params->appendChild($dom->createElement('param'));
+
+ $param->appendChild($dom->importNode($valueDOM->documentElement, true));
+
+ return $dom->saveXML();
+ }
+
+ /**
+ * Return XML response
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->saveXML();
+ }
+}
diff --git a/libs/Zend/XmlRpc/Response/Http.php b/libs/Zend/XmlRpc/Response/Http.php
new file mode 100755
index 0000000000..b5d94087cf
--- /dev/null
+++ b/libs/Zend/XmlRpc/Response/Http.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Controller
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/**
+ * Zend_XmlRpc_Response
+ */
+require_once 'Zend/XmlRpc/Response.php';
+
+/**
+ * HTTP response
+ *
+ * @uses Zend_XmlRpc_Response
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id: Http.php 2810 2007-01-16 01:40:21Z bkarwin $
+ */
+class Zend_XmlRpc_Response_Http extends Zend_XmlRpc_Response
+{
+ /**
+ * Override __toString() to send HTTP Content-Type header
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ if (!headers_sent()) {
+ header('Content-Type: application/xml; charset=' . strtolower($this->getEncoding()));
+ }
+
+ return parent::__toString();
+ }
+}
diff --git a/libs/Zend/XmlRpc/Server.php b/libs/Zend/XmlRpc/Server.php
new file mode 100755
index 0000000000..b33f4a1474
--- /dev/null
+++ b/libs/Zend/XmlRpc/Server.php
@@ -0,0 +1,728 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_XmlRpc
+ * @subpackage Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * Implement Zend_Server_Interface
+ */
+require_once 'Zend/Server/Interface.php';
+
+/**
+ * Exception this class throws
+ */
+require_once 'Zend/XmlRpc/Server/Exception.php';
+
+/**
+ * XMLRPC Request
+ */
+require_once 'Zend/XmlRpc/Request.php';
+
+/**
+ * XMLRPC Response
+ */
+require_once 'Zend/XmlRpc/Response.php';
+
+/**
+ * XMLRPC HTTP Response
+ */
+require_once 'Zend/XmlRpc/Response/Http.php';
+
+/**
+ * XMLRPC server fault class
+ */
+require_once 'Zend/XmlRpc/Server/Fault.php';
+
+/**
+ * Convert PHP to and from xmlrpc native types
+ */
+require_once 'Zend/XmlRpc/Value.php';
+
+/**
+ * Reflection API for function/method introspection
+ */
+require_once 'Zend/Server/Reflection.php';
+
+/**
+ * Zend_Server_Reflection_Function_Abstract
+ */
+require_once 'Zend/Server/Reflection/Function/Abstract.php';
+
+/**
+ * Specifically grab the Zend_Server_Reflection_Method for manually setting up
+ * system.* methods and handling callbacks in {@link loadFunctions()}.
+ */
+require_once 'Zend/Server/Reflection/Method.php';
+
+/**
+ * An XML-RPC server implementation
+ *
+ * Example:
+ * <code>
+ * require_once 'Zend/XmlRpc/Server.php';
+ * require_once 'Zend/XmlRpc/Server/Cache.php';
+ * require_once 'Zend/XmlRpc/Server/Fault.php';
+ * require_once 'My/Exception.php';
+ * require_once 'My/Fault/Observer.php';
+ *
+ * // Instantiate server
+ * $server = new Zend_XmlRpc_Server();
+ *
+ * // Allow some exceptions to report as fault responses:
+ * Zend_XmlRpc_Server_Fault::attachFaultException('My_Exception');
+ * Zend_XmlRpc_Server_Fault::attachObserver('My_Fault_Observer');
+ *
+ * // Get or build dispatch table:
+ * if (!Zend_XmlRpc_Server_Cache::get($filename, $server)) {
+ * require_once 'Some/Service/Class.php';
+ * require_once 'Another/Service/Class.php';
+ *
+ * // Attach Some_Service_Class in 'some' namespace
+ * $server->setClass('Some_Service_Class', 'some');
+ *
+ * // Attach Another_Service_Class in 'another' namespace
+ * $server->setClass('Another_Service_Class', 'another');
+ *
+ * // Create dispatch table cache file
+ * Zend_XmlRpc_Server_Cache::save($filename, $server);
+ * }
+ *
+ * $response = $server->handle();
+ * echo $response;
+ * </code>
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_XmlRpc_Server
+{
+ /**
+ * Character encoding
+ * @var string
+ */
+ protected $_encoding = 'UTF-8';
+
+ /**
+ * Array of dispatchables
+ * @var array
+ */
+ protected $_methods = array();
+
+ /**
+ * Request processed
+ * @var null|Zend_XmlRpc_Request
+ */
+ protected $_request = null;
+
+ /**
+ * Class to use for responses; defaults to {@link Zend_XmlRpc_Response_Http}
+ * @var string
+ */
+ protected $_responseClass = 'Zend_XmlRpc_Response_Http';
+
+ /**
+ * Dispatch table of name => method pairs
+ * @var array
+ */
+ protected $_table = array();
+
+ /**
+ * PHP types => XML-RPC types
+ * @var array
+ */
+ protected $_typeMap = array(
+ 'i4' => 'i4',
+ 'int' => 'int',
+ 'integer' => 'int',
+ 'double' => 'double',
+ 'float' => 'double',
+ 'real' => 'double',
+ 'boolean' => 'boolean',
+ 'bool' => 'boolean',
+ 'true' => 'boolean',
+ 'false' => 'boolean',
+ 'string' => 'string',
+ 'str' => 'string',
+ 'base64' => 'base64',
+ 'dateTime.iso8601' => 'dateTime.iso8601',
+ 'date' => 'dateTime.iso8601',
+ 'time' => 'dateTime.iso8601',
+ 'time' => 'dateTime.iso8601',
+ 'array' => 'array',
+ 'struct' => 'struct',
+ 'null' => 'void',
+ 'void' => 'void',
+ 'mixed' => 'struct'
+ );
+
+ /**
+ * Constructor
+ *
+ * Creates system.* methods.
+ *
+ * @return void
+ */
+ public function __construct()
+ {
+ // Setup system.* methods
+ $system = array(
+ 'listMethods',
+ 'methodHelp',
+ 'methodSignature',
+ 'multicall'
+ );
+
+ $class = Zend_Server_Reflection::reflectClass($this);
+ foreach ($system as $method) {
+ $reflection = new Zend_Server_Reflection_Method($class, new ReflectionMethod($this, $method), 'system');
+ $reflection->system = true;
+ $this->_methods[] = $reflection;
+ }
+
+ $this->_buildDispatchTable();
+ }
+
+ /**
+ * Map PHP parameter types to XML-RPC types
+ *
+ * @param Zend_Server_Reflection_Function_Abstract $method
+ * @return void
+ */
+ protected function _fixTypes(Zend_Server_Reflection_Function_Abstract $method)
+ {
+ foreach ($method->getPrototypes() as $prototype) {
+ foreach ($prototype->getParameters() as $param) {
+ $pType = $param->getType();
+ if (isset($this->_typeMap[$pType])) {
+ $param->setType($this->_typeMap[$pType]);
+ } else {
+ $param->setType('void');
+ }
+ }
+ }
+ }
+
+ /**
+ * Re/Build the dispatch table
+ *
+ * The dispatch table consists of a an array of method name =>
+ * Zend_Server_Reflection_Function_Abstract pairs
+ *
+ * @return void
+ */
+ protected function _buildDispatchTable()
+ {
+ $table = array();
+ foreach ($this->_methods as $dispatchable) {
+ if ($dispatchable instanceof Zend_Server_Reflection_Function_Abstract) {
+ // function/method call
+ $ns = $dispatchable->getNamespace();
+ $name = $dispatchable->getName();
+ $name = empty($ns) ? $name : $ns . '.' . $name;
+
+ if (isset($table[$name])) {
+ throw new Zend_XmlRpc_Server_Exception('Duplicate method registered: ' . $name);
+ }
+ $table[$name] = $dispatchable;
+ $this->_fixTypes($dispatchable);
+
+ continue;
+ }
+
+ if ($dispatchable instanceof Zend_Server_Reflection_Class) {
+ foreach ($dispatchable->getMethods() as $method) {
+ $ns = $method->getNamespace();
+ $name = $method->getName();
+ $name = empty($ns) ? $name : $ns . '.' . $name;
+
+ if (isset($table[$name])) {
+ throw new Zend_XmlRpc_Server_Exception('Duplicate method registered: ' . $name);
+ }
+ $table[$name] = $method;
+ $this->_fixTypes($method);
+ continue;
+ }
+ }
+ }
+
+ $this->_table = $table;
+ }
+
+ /**
+ * Set encoding
+ *
+ * @param string $encoding
+ * @return Zend_XmlRpc_Server
+ */
+ public function setEncoding($encoding)
+ {
+ $this->_encoding = $encoding;
+ return $this;
+ }
+
+ /**
+ * Retrieve current encoding
+ *
+ * @return string
+ */
+ public function getEncoding()
+ {
+ return $this->_encoding;
+ }
+
+ /**
+ * Attach a callback as an XMLRPC method
+ *
+ * Attaches a callback as an XMLRPC method, prefixing the XMLRPC method name
+ * with $namespace, if provided. Reflection is done on the callback's
+ * docblock to create the methodHelp for the XMLRPC method.
+ *
+ * Additional arguments to pass to the function at dispatch may be passed;
+ * any arguments following the namespace will be aggregated and passed at
+ * dispatch time.
+ *
+ * @param string|array $function Valid callback
+ * @param string $namespace Optional namespace prefix
+ * @return void
+ * @throws Zend_XmlRpc_Server_Exception
+ */
+ public function addFunction($function, $namespace = '')
+ {
+ if (!is_string($function) && !is_array($function)) {
+ throw new Zend_XmlRpc_Server_Exception('Unable to attach function; invalid', 611);
+ }
+
+ $argv = null;
+ if (2 < func_num_args()) {
+ $argv = func_get_args();
+ $argv = array_slice($argv, 2);
+ }
+
+ $function = (array) $function;
+ foreach ($function as $func) {
+ if (!is_string($func) || !function_exists($func)) {
+ throw new Zend_XmlRpc_Server_Exception('Unable to attach function; invalid', 611);
+ }
+ $this->_methods[] = Zend_Server_Reflection::reflectFunction($func, $argv, $namespace);
+ }
+
+ $this->_buildDispatchTable();
+ }
+
+ /**
+ * Load methods as returned from {@link getFunctions}
+ *
+ * Typically, you will not use this method; it will be called using the
+ * results pulled from {@link Zend_XmlRpc_Server_Cache::get()}.
+ *
+ * @param array $array
+ * @return void
+ * @throws Zend_XmlRpc_Server_Exception on invalid input
+ */
+ public function loadFunctions($array)
+ {
+ if (!is_array($array)) {
+ throw new Zend_XmlRpc_Server_Exception('Unable to load array; not an array', 612);
+ }
+
+ foreach ($array as $key => $value) {
+ if (!$value instanceof Zend_Server_Reflection_Function_Abstract
+ && !$value instanceof Zend_Server_Reflection_Class)
+ {
+ throw new Zend_XmlRpc_Server_Exception('One or more method records are corrupt or otherwise unusable', 613);
+ }
+
+ if ($value->system) {
+ unset($array[$key]);
+ }
+ }
+
+ foreach ($array as $dispatchable) {
+ $this->_methods[] = $dispatchable;
+ }
+
+ $this->_buildDispatchTable();
+ }
+
+ /**
+ * Do nothing; persistence is handled via {@link Zend_XmlRpc_Server_Cache}
+ *
+ * @param mixed $class
+ * @return void
+ */
+ public function setPersistence($class = null)
+ {
+ }
+
+ /**
+ * Attach class methods as XMLRPC method handlers
+ *
+ * $class may be either a class name or an object. Reflection is done on the
+ * class or object to determine the available public methods, and each is
+ * attached to the server as an available method; if a $namespace has been
+ * provided, that namespace is used to prefix the XMLRPC method names.
+ *
+ * Any additional arguments beyond $namespace will be passed to a method at
+ * invocation.
+ *
+ * @param string|object $class
+ * @param string $namespace Optional
+ * @param mixed $argv Optional arguments to pass to methods
+ * @return void
+ * @throws Zend_XmlRpc_Server_Exception on invalid input
+ */
+ public function setClass($class, $namespace = '', $argv = null)
+ {
+ if (is_string($class) && !class_exists($class)) {
+ if (!class_exists($class)) {
+ throw new Zend_XmlRpc_Server_Exception('Invalid method class', 610);
+ }
+ }
+
+ $argv = null;
+ if (3 < func_num_args()) {
+ $argv = func_get_args();
+ $argv = array_slice($argv, 3);
+ }
+
+ $this->_methods[] = Zend_Server_Reflection::reflectClass($class, $argv, $namespace);
+ $this->_buildDispatchTable();
+ }
+
+ /**
+ * Set the request object
+ *
+ * @param string|Zend_XmlRpc_Request $request
+ * @return Zend_XmlRpc_Server
+ * @throws Zend_XmlRpc_Server_Exception on invalid request class or object
+ */
+ public function setRequest($request)
+ {
+ if (is_string($request) && class_exists($request)) {
+ $request = new $request();
+ if (!$request instanceof Zend_XmlRpc_Request) {
+ throw new Zend_XmlRpc_Server_Exception('Invalid request class');
+ }
+ $request->setEncoding($this->getEncoding());
+ } elseif (!$request instanceof Zend_XmlRpc_Request) {
+ throw new Zend_XmlRpc_Server_Exception('Invalid request object');
+ }
+
+ $this->_request = $request;
+ return $this;
+ }
+
+ /**
+ * Return currently registered request object
+ *
+ * @return null|Zend_XmlRpc_Request
+ */
+ public function getRequest()
+ {
+ return $this->_request;
+ }
+
+ /**
+ * Raise an xmlrpc server fault
+ *
+ * @param string|Exception $fault
+ * @param int $code
+ * @return Zend_XmlRpc_Server_Fault
+ */
+ public function fault($fault, $code = 404)
+ {
+ if (!$fault instanceof Exception) {
+ $fault = (string) $fault;
+ $fault = new Zend_XmlRpc_Server_Exception($fault, $code);
+ }
+
+ return Zend_XmlRpc_Server_Fault::getInstance($fault);
+ }
+
+ /**
+ * Handle an xmlrpc call (actual work)
+ *
+ * @param Zend_XmlRpc_Request $request
+ * @return Zend_XmlRpc_Response
+ * @throws Zend_XmlRpcServer_Exception|Exception
+ * Zend_XmlRpcServer_Exceptions are thrown for internal errors; otherwise,
+ * any other exception may be thrown by the callback
+ */
+ protected function _handle(Zend_XmlRpc_Request $request)
+ {
+ $method = $request->getMethod();
+
+ // Check for valid method
+ if (!isset($this->_table[$method])) {
+ throw new Zend_XmlRpc_Server_Exception('Method "' . $method . '" does not exist', 620);
+ }
+
+ $info = $this->_table[$method];
+ $params = $request->getParams();
+ $argv = $info->getInvokeArguments();
+ if (0 < count($argv)) {
+ $params = array_merge($params, $argv);
+ }
+
+ // Check calling parameters against signatures
+ $matched = false;
+ $sigCalled = array();
+ foreach ($params as $param) {
+ $value = Zend_XmlRpc_Value::getXmlRpcValue($param);
+ $sigCalled[] = $value->getType();
+ }
+ $signatures = $info->getPrototypes();
+ foreach ($signatures as $signature) {
+ $sigParams = $signature->getParameters();
+ $tmpParams = array();
+ foreach ($sigParams as $param) {
+ $tmpParams[] = $param->getType();
+ }
+ if ($sigCalled === $tmpParams) {
+ $matched = true;
+ break;
+ }
+ }
+ if (!$matched) {
+ throw new Zend_XmlRpc_Server_Exception('Calling parameters do not match signature', 623);
+ }
+
+ if ($info instanceof Zend_Server_Reflection_Function) {
+ $func = $info->getName();
+ $return = call_user_func_array($func, $params);
+ } elseif (($info instanceof Zend_Server_Reflection_Method) && $info->system) {
+ // System methods
+ $return = $info->invokeArgs($this, $params);
+ } elseif ($info instanceof Zend_Server_Reflection_Method) {
+ // Get class
+ $class = $info->getDeclaringClass()->getName();
+
+ if ('static' == $info->isStatic()) {
+ // for some reason, invokeArgs() does not work the same as
+ // invoke(), and expects the first argument to be an object.
+ // So, using a callback if the method is static.
+ $return = call_user_func_array(array($class, $info->getName()), $params);
+ } else {
+ // Object methods
+ try {
+ $object = $info->getDeclaringClass()->newInstance();
+ } catch (Exception $e) {
+ throw new Zend_XmlRpc_Server_Exception('Error instantiating class ' . $class . ' to invoke method ' . $info->getName(), 621);
+ }
+
+ $return = $info->invokeArgs($object, $params);
+ }
+ } else {
+ throw new Zend_XmlRpc_Server_Exception('Method missing implementation ' . get_class($info), 622);
+ }
+
+ $response = new ReflectionClass($this->_responseClass);
+ return $response->newInstance($return);
+ }
+
+ /**
+ * Handle an xmlrpc call
+ *
+ * @param Zend_XmlRpc_Request $request Optional
+ * @return Zend_XmlRpc_Response|Zend_XmlRpc_Fault
+ */
+ public function handle(Zend_XmlRpc_Request $request = null)
+ {
+ // Get request
+ if ((null === $request) && (null === ($request = $this->getRequest()))) {
+ require_once 'Zend/XmlRpc/Request/Http.php';
+ $request = new Zend_XmlRpc_Request_Http();
+ $request->setEncoding($this->getEncoding());
+ }
+
+ $this->setRequest($request);
+
+ if ($request->isFault()) {
+ $response = $request->getFault();
+ } else {
+ try {
+ $response = $this->_handle($request);
+ } catch (Exception $e) {
+ $response = $this->fault($e);
+ }
+ }
+
+ // Set output encoding
+ $response->setEncoding($this->getEncoding());
+
+ return $response;
+ }
+
+ /**
+ * Set the class to use for the response
+ *
+ * @param string $class
+ * @return boolean True if class was set, false if not
+ */
+ public function setResponseClass($class)
+ {
+ if (class_exists($class)) {
+ $reflection = new ReflectionClass($class);
+ if ($reflection->isSubclassOf(new ReflectionClass('Zend_XmlRpc_Response'))) {
+ $this->_responseClass = $class;
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns a list of registered methods
+ *
+ * Returns an array of dispatchables (Zend_Server_Reflection_Function,
+ * _Method, and _Class items).
+ *
+ * @return array
+ */
+ public function getFunctions()
+ {
+ $return = array();
+ foreach ($this->_methods as $method) {
+ if ($method instanceof Zend_Server_Reflection_Class
+ && ($method->system))
+ {
+ continue;
+ }
+
+ $return[] = $method;
+ }
+
+ return $return;
+ }
+
+ /**
+ * List all available XMLRPC methods
+ *
+ * Returns an array of methods.
+ *
+ * @return array
+ */
+ public function listMethods()
+ {
+ return array_keys($this->_table);
+ }
+
+ /**
+ * Display help message for an XMLRPC method
+ *
+ * @param string $method
+ * @return string
+ */
+ public function methodHelp($method)
+ {
+ if (!isset($this->_table[$method])) {
+ throw new Zend_Server_Exception('Method "' . $method . '"does not exist', 640);
+ }
+
+ return $this->_table[$method]->getDescription();
+ }
+
+ /**
+ * Return a method signature
+ *
+ * @param string $method
+ * @return array
+ */
+ public function methodSignature($method)
+ {
+ if (!isset($this->_table[$method])) {
+ throw new Zend_Server_Exception('Method "' . $method . '"does not exist', 640);
+ }
+ $prototypes = $this->_table[$method]->getPrototypes();
+
+ $signatures = array();
+ foreach ($prototypes as $prototype) {
+ $signature = array($prototype->getReturnType());
+ foreach ($prototype->getParameters() as $parameter) {
+ $signature[] = $parameter->getType();
+ }
+ $signatures[] = $signature;
+ }
+
+ return $signatures;
+ }
+
+ /**
+ * Multicall - boxcar feature of XML-RPC for calling multiple methods
+ * in a single request.
+ *
+ * Expects a an array of structs representing method calls, each element
+ * having the keys:
+ * - methodName
+ * - params
+ *
+ * Returns an array of responses, one for each method called, with the value
+ * returned by the method. If an error occurs for a given method, returns a
+ * struct with a fault response.
+ *
+ * @see http://www.xmlrpc.com/discuss/msgReader$1208
+ * @param array $methods
+ * @return array
+ */
+ public function multicall($methods)
+ {
+ $responses = array();
+ foreach ($methods as $method) {
+ $fault = false;
+ if (!is_array($method)) {
+ $fault = $this->fault('system.multicall expects each method to be a struct', 601);
+ } elseif (!isset($method['methodName'])) {
+ $fault = $this->fault('Missing methodName', 602);
+ } elseif (!isset($method['params'])) {
+ $fault = $this->fault('Missing params', 603);
+ } elseif (!is_array($method['params'])) {
+ $fault = $this->fault('Params must be an array', 604);
+ } else {
+ if ('system.multicall' == $method['methodName']) {
+ // don't allow recursive calls to multicall
+ $fault = $this->fault('Recursive system.multicall forbidden', 605);
+ }
+ }
+
+ if (!$fault) {
+ try {
+ $request = new Zend_XmlRpc_Request();
+ $request->setMethod($method['methodName']);
+ $request->setParams($method['params']);
+ $response = $this->_handle($request);
+ $responses[] = $response->getReturnValue();
+ } catch (Exception $e) {
+ $fault = $this->fault($e);
+ }
+ }
+
+ if ($fault) {
+ $responses[] = array(
+ 'faultCode' => $fault->getCode(),
+ 'faultString' => $fault->getMessage()
+ );
+ }
+ }
+
+ return $responses;
+ }
+}
diff --git a/libs/Zend/XmlRpc/Server/Cache.php b/libs/Zend/XmlRpc/Server/Cache.php
new file mode 100755
index 0000000000..1a78edb865
--- /dev/null
+++ b/libs/Zend/XmlRpc/Server/Cache.php
@@ -0,0 +1,140 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_XmlRpc
+ * @subpackage Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * class hinting
+ */
+require_once 'Zend/XmlRpc/Server.php';
+
+/**
+ * Zend_XmlRpc_Server_Cache: cache Zend_XmlRpc_Server dispatch tables
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_XmlRpc_Server_Cache
+{
+ /**
+ * Cache a file containing the dispatch list.
+ *
+ * Serializes the XMLRPC server callbacks array and stores the information
+ * in $filename.
+ *
+ * Returns false on any error (typically, inability to write to file), true
+ * on success.
+ *
+ * @param string $filename
+ * @param Zend_XmlRpc_Server $server
+ * @return bool
+ */
+ public static function save($filename, Zend_XmlRpc_Server $server)
+ {
+ if (!is_string($filename)
+ || (!file_exists($filename) && !is_writable(dirname($filename))))
+ {
+ return false;
+ }
+
+ // Remove system.* methods
+ $methods = $server->getFunctions();
+ foreach ($methods as $name => $method) {
+ if ($method->system) {
+ unset($methods[$name]);
+ }
+ }
+
+ // Store
+ if (0 === @file_put_contents($filename, serialize($methods))) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Add dispatch table from a file
+ *
+ * Unserializes a stored dispatch table from $filename. Returns false if it
+ * fails in any way, true on success.
+ *
+ * Useful to prevent needing to build the dispatch list on each XMLRPC
+ * request. Sample usage:
+ *
+ * <code>
+ * if (!Zend_XmlRpc_Server_Cache::get($filename, $server)) {
+ * require_once 'Some/Service/Class.php';
+ * require_once 'Another/Service/Class.php';
+ *
+ * // Attach Some_Service_Class with namespace 'some'
+ * $server->attach('Some_Service_Class', 'some');
+ *
+ * // Attach Another_Service_Class with namespace 'another'
+ * $server->attach('Another_Service_Class', 'another');
+ *
+ * Zend_XmlRpc_Server_Cache::save($filename, $server);
+ * }
+ *
+ * $response = $server->handle();
+ * echo $response;
+ * </code>
+ *
+ * @param string $filename
+ * @param Zend_XmlRpc_Server $server
+ * @return bool
+ */
+ public static function get($filename, Zend_XmlRpc_Server $server)
+ {
+ if (!is_string($filename)
+ || !file_exists($filename)
+ || !is_readable($filename))
+ {
+ return false;
+ }
+
+ if (false === ($dispatch = @file_get_contents($filename))) {
+ return false;
+ }
+
+ $dispatchArray = @unserialize($dispatch);
+
+ $server->loadFunctions($dispatchArray);
+
+ return true;
+ }
+
+ /**
+ * Remove a cache file
+ *
+ * @param string $filename
+ * @return boolean
+ */
+ public static function delete($filename)
+ {
+ if (is_string($filename) && file_exists($filename)) {
+ unlink($filename);
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/libs/Zend/XmlRpc/Server/Exception.php b/libs/Zend/XmlRpc/Server/Exception.php
new file mode 100755
index 0000000000..8018c2cbf5
--- /dev/null
+++ b/libs/Zend/XmlRpc/Server/Exception.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_XmlRpc
+ * @subpackage Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/**
+ * Zend_XmlRpc_Exception
+ */
+require_once 'Zend/XmlRpc/Exception.php';
+
+
+/**
+ * Zend_XmlRpc_Server_Exception
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_XmlRpc_Server_Exception extends Zend_XmlRpc_Exception
+{
+}
+
diff --git a/libs/Zend/XmlRpc/Server/Fault.php b/libs/Zend/XmlRpc/Server/Fault.php
new file mode 100755
index 0000000000..e0da7c27f0
--- /dev/null
+++ b/libs/Zend/XmlRpc/Server/Fault.php
@@ -0,0 +1,196 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_XmlRpc
+ * @subpackage Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+/**
+ * Zend_XmlRpc_Fault
+ */
+require_once 'Zend/XmlRpc/Fault.php';
+
+
+/**
+ * XMLRPC Server Faults
+ *
+ * Encapsulates an exception for use as an XMLRPC fault response. Valid
+ * exception classes that may be used for generating the fault code and fault
+ * string can be attached using {@link attachFaultException()}; all others use a
+ * generic '404 Unknown error' response.
+ *
+ * You may also attach fault observers, which would allow you to monitor
+ * particular fault cases; this is done via {@link attachObserver()}. Observers
+ * need only implement a static 'observe' method.
+ *
+ * To allow method chaining, you may use the {@link getInstance()} factory
+ * to instantiate a Zend_XmlRpc_Server_Fault.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Server
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_XmlRpc_Server_Fault extends Zend_XmlRpc_Fault
+{
+ /**
+ * @var Exception
+ */
+ protected $_exception;
+
+ /**
+ * @var array Array of exception classes that may define xmlrpc faults
+ */
+ protected static $_faultExceptionClasses = array('Zend_XmlRpc_Server_Exception' => true);
+
+ /**
+ * @var array Array of fault observers
+ */
+ protected static $_observers = array();
+
+ /**
+ * Constructor
+ *
+ * @param Exception $e
+ * @return Zend_XmlRpc_Server_Fault
+ */
+ public function __construct(Exception $e)
+ {
+ $this->_exception = $e;
+ $code = 404;
+ $message = 'Unknown error';
+ $exceptionClass = get_class($e);
+
+ if (isset(self::$_faultExceptionClasses[$exceptionClass])) {
+ $code = $e->getCode();
+ $message = $e->getMessage();
+ }
+
+ parent::__construct($code, $message);
+
+ // Notify exception observers, if present
+ if (!empty(self::$_observers)) {
+ foreach (array_keys(self::$_observers) as $observer) {
+ call_user_func(array($observer, 'observe'), $this);
+ }
+ }
+ }
+
+ /**
+ * Return Zend_XmlRpc_Server_Fault instance
+ *
+ * @param Exception $e
+ * @return Zend_XmlRpc_Server_Fault
+ */
+ public static function getInstance(Exception $e)
+ {
+ return new self($e);
+ }
+
+ /**
+ * Attach valid exceptions that can be used to define xmlrpc faults
+ *
+ * @param string|array $classes Class name or array of class names
+ * @return void
+ */
+ public static function attachFaultException($classes)
+ {
+ if (!is_array($classes)) {
+ $classes = (array) $classes;
+ }
+
+ foreach ($classes as $class) {
+ if (is_string($class) && class_exists($class)) {
+ self::$_faultExceptionClasses[$class] = true;
+ }
+ }
+ }
+
+ /**
+ * Detach fault exception classes
+ *
+ * @param string|array $classes Class name or array of class names
+ * @return void
+ */
+ public static function detachFaultException($classes)
+ {
+ if (!is_array($classes)) {
+ $classes = (array) $classes;
+ }
+
+ foreach ($classes as $class) {
+ if (is_string($class) && isset(self::$_faultExceptionClasses[$class])) {
+ unset(self::$_faultExceptionClasses[$class]);
+ }
+ }
+ }
+
+ /**
+ * Attach an observer class
+ *
+ * Allows observation of xmlrpc server faults, thus allowing logging or mail
+ * notification of fault responses on the xmlrpc server.
+ *
+ * Expects a valid class name; that class must have a public static method
+ * 'observe' that accepts an exception as its sole argument.
+ *
+ * @param string $class
+ * @return boolean
+ */
+ public static function attachObserver($class)
+ {
+ if (!is_string($class)
+ || !class_exists($class)
+ || !is_callable(array($class, 'observe')))
+ {
+ return false;
+ }
+
+ if (!isset(self::$_observers[$class])) {
+ self::$_observers[$class] = true;
+ }
+
+ return true;
+ }
+
+ /**
+ * Detach an observer
+ *
+ * @param string $class
+ * @return boolean
+ */
+ public static function detachObserver($class)
+ {
+ if (!isset(self::$_observers[$class])) {
+ return false;
+ }
+
+ unset(self::$_observers[$class]);
+ return true;
+ }
+
+ /**
+ * Retrieve the exception
+ *
+ * @access public
+ * @return Exception
+ */
+ public function getException()
+ {
+ return $this->_exception;
+ }
+}
diff --git a/libs/Zend/XmlRpc/Value.php b/libs/Zend/XmlRpc/Value.php
new file mode 100755
index 0000000000..8d07686f61
--- /dev/null
+++ b/libs/Zend/XmlRpc/Value.php
@@ -0,0 +1,377 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/** Zend_XmlRpc_Value_Exception */
+require_once 'Zend/XmlRpc/Value/Exception.php';
+
+/** Zend_XmlRpc_Value_Scalar */
+require_once 'Zend/XmlRpc/Value/Scalar.php';
+
+/** Zend_XmlRpc_Value_Base64 */
+require_once 'Zend/XmlRpc/Value/Base64.php';
+
+/** Zend_XmlRpc_Value_Boolean */
+require_once 'Zend/XmlRpc/Value/Boolean.php';
+
+/** Zend_XmlRpc_Value_DateTime */
+require_once 'Zend/XmlRpc/Value/DateTime.php';
+
+/** Zend_XmlRpc_Value_Double */
+require_once 'Zend/XmlRpc/Value/Double.php';
+
+/** Zend_XmlRpc_Value_Integer */
+require_once 'Zend/XmlRpc/Value/Integer.php';
+
+/** Zend_XmlRpc_Value_String */
+require_once 'Zend/XmlRpc/Value/String.php';
+
+/** Zend_XmlRpc_Value_Collection */
+require_once 'Zend/XmlRpc/Value/Collection.php';
+
+/** Zend_XmlRpc_Value_Array */
+require_once 'Zend/XmlRpc/Value/Array.php';
+
+/** Zend_XmlRpc_Value_Struct */
+require_once 'Zend/XmlRpc/Value/Struct.php';
+
+
+/**
+ * Represent a native XML-RPC value entity, used as parameters for the methods
+ * called by the Zend_XmlRpc_Client object and as the return value for those calls.
+ *
+ * This object as a very important static function Zend_XmlRpc_Value::getXmlRpcValue, this
+ * function acts likes a factory for the Zend_XmlRpc_Value objects
+ *
+ * Using this function, users/Zend_XmlRpc_Client object can create the Zend_XmlRpc_Value objects
+ * from PHP variables, XML string or by specifing the exact XML-RPC natvie type
+ *
+ * @package Zend_XmlRpc
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+abstract class Zend_XmlRpc_Value
+{
+ /**
+ * The native XML-RPC representation of this object's value
+ *
+ * If the native type of this object is array or struct, this will be an array
+ * of Zend_XmlRpc_Value objects
+ */
+ protected $_value;
+
+ /**
+ * The native XML-RPC type of this object
+ * One of the XMLRPC_TYPE_* constants
+ */
+ protected $_type;
+
+ /**
+ * XML code representation of this object (will be calculated only once)
+ */
+ protected $_as_xml;
+
+ /**
+ * DOMElement representation of object (will be calculated only once)
+ */
+ protected $_as_dom;
+
+ /**
+ * Specify that the XML-RPC native type will be auto detected from a PHP variable type
+ */
+ const AUTO_DETECT_TYPE = 'auto_detect';
+
+ /**
+ * Specify that the XML-RPC value will be parsed out from a given XML code
+ */
+ const XML_STRING = 'xml';
+
+ /**
+ * All the XML-RPC native types
+ */
+ const XMLRPC_TYPE_I4 = 'i4';
+ const XMLRPC_TYPE_INTEGER = 'int';
+ const XMLRPC_TYPE_DOUBLE = 'double';
+ const XMLRPC_TYPE_BOOLEAN = 'boolean';
+ const XMLRPC_TYPE_STRING = 'string';
+ const XMLRPC_TYPE_DATETIME = 'dateTime.iso8601';
+ const XMLRPC_TYPE_BASE64 = 'base64';
+ const XMLRPC_TYPE_ARRAY = 'array';
+ const XMLRPC_TYPE_STRUCT = 'struct';
+
+
+ /**
+ * Get the native XML-RPC type (the type is one of the Zend_XmlRpc_Value::XMLRPC_TYPE_* constants)
+ *
+ * @return string
+ */
+ public function getType()
+ {
+ return $this->_type;
+ }
+
+
+ /**
+ * Return the value of this object, convert the XML-RPC native value into a PHP variable
+ *
+ * @return mixed
+ */
+ abstract public function getValue();
+
+
+ /**
+ * Return the XML code that represent a native MXL-RPC value
+ *
+ * @return string
+ */
+ abstract public function saveXML();
+
+ /**
+ * Return DOMElement representation of object
+ *
+ * @return DOMElement
+ */
+ public function getAsDOM()
+ {
+ if (!$this->_as_dom) {
+ $doc = new DOMDocument('1.0');
+ $doc->loadXML($this->saveXML());
+ $this->_as_dom = $doc->documentElement;
+ }
+
+ return $this->_as_dom;
+ }
+
+ protected function _stripXmlDeclaration(DOMDocument $dom)
+ {
+ return preg_replace('/<\?xml version="1.0"( encoding="[^\"]*")?\?>\n/u', '', $dom->saveXML());
+ }
+
+ /**
+ * Creates a Zend_XmlRpc_Value* object, representing a native XML-RPC value
+ * A XmlRpcValue object can be created in 3 ways:
+ * 1. Autodetecting the native type out of a PHP variable
+ * (if $type is not set or equal to Zend_XmlRpc_Value::AUTO_DETECT_TYPE)
+ * 2. By specifing the native type ($type is one of the Zend_XmlRpc_Value::XMLRPC_TYPE_* constants)
+ * 3. From a XML string ($type is set to Zend_XmlRpc_Value::XML_STRING)
+ *
+ * By default the value type is autodetected according to it's PHP type
+ *
+ * @param mixed $value
+ * @param Zend_XmlRpc_Value::constant $type
+ *
+ * @return Zend_XmlRpc_Value
+ * @static
+ */
+ public static function getXmlRpcValue($value, $type = self::AUTO_DETECT_TYPE)
+ {
+ switch ($type) {
+ case self::AUTO_DETECT_TYPE:
+ // Auto detect the XML-RPC native type from the PHP type of $value
+ return self::_phpVarToNativeXmlRpc($value);
+
+ case self::XML_STRING:
+ // Parse the XML string given in $value and get the XML-RPC value in it
+ return self::_xmlStringToNativeXmlRpc($value);
+
+ case self::XMLRPC_TYPE_I4:
+ // fall through to the next case
+ case self::XMLRPC_TYPE_INTEGER:
+ return new Zend_XmlRpc_Value_Integer($value);
+
+ case self::XMLRPC_TYPE_DOUBLE:
+ return new Zend_XmlRpc_Value_Double($value);
+
+ case self::XMLRPC_TYPE_BOOLEAN:
+ return new Zend_XmlRpc_Value_Boolean($value);
+
+ case self::XMLRPC_TYPE_STRING:
+ return new Zend_XmlRpc_Value_String($value);
+
+ case self::XMLRPC_TYPE_BASE64:
+ return new Zend_XmlRpc_Value_Base64($value);
+
+ case self::XMLRPC_TYPE_DATETIME:
+ return new Zend_XmlRpc_Value_DateTime($value);
+
+ case self::XMLRPC_TYPE_ARRAY:
+ return new Zend_XmlRpc_Value_Array($value);
+
+ case self::XMLRPC_TYPE_STRUCT:
+ return new Zend_XmlRpc_Value_Struct($value);
+
+ default:
+ throw new Zend_XmlRpc_Value_Exception('Given type is not a '. __CLASS__ .' constant');
+ }
+ }
+
+
+ /**
+ * Transform a PHP native variable into a XML-RPC native value
+ *
+ * @param mixed $value The PHP variable for convertion
+ *
+ * @return Zend_XmlRpc_Value
+ * @static
+ */
+ private static function _phpVarToNativeXmlRpc($value)
+ {
+ switch (gettype($value)) {
+ case 'object':
+ // We convert the object into a struct
+ $value = get_object_vars($value);
+ // Break intentionally omitted
+ case 'array':
+ // Default native type for a PHP array (a simple numeric array) is 'array'
+ // If the PHP array is an assosiative array the native type will be 'struct'
+ $obj = 'Zend_XmlRpc_Value_Array';
+
+ // Go over the elements in the array, if the key is different than the index
+ // it means this array has associative keys and it's a struct
+ if (is_array($value)) { // If the value is not array, it can't be an associated array
+ $i = 0;
+ foreach ($value as $key => $element) {
+ if ($i !== $key) {
+ $obj = 'Zend_XmlRpc_Value_Struct';
+ break;
+ }
+ ++$i;
+ }
+ }
+ return new $obj($value);
+
+ case 'integer':
+ return new Zend_XmlRpc_Value_Integer($value);
+
+ case 'double':
+ return new Zend_XmlRpc_Value_Double($value);
+
+ case 'boolean':
+ return new Zend_XmlRpc_Value_Boolean($value);
+
+ case 'string':
+ // Fall through to the next case
+ default:
+ // If type isn't identified (or identified as string), it treated as string
+ return new Zend_XmlRpc_Value_String($value);
+ }
+ }
+
+
+ /**
+ * Transform an XML string into a XML-RPC native value
+ *
+ * @param string|SimpleXMLElement $simple_xml A SimpleXMLElement object represent the XML string
+ * It can be also a valid XML string for convertion
+ *
+ * @return Zend_XmlRpc_Value
+ * @static
+ */
+ private static function _xmlStringToNativeXmlRpc($simple_xml)
+ {
+ if (!$simple_xml instanceof SimpleXMLElement) {
+ try {
+ $simple_xml = @new SimpleXMLElement($simple_xml);
+ } catch (Exception $e) {
+ // The given string is not a valid XML
+ throw new Zend_XmlRpc_Value_Exception('Failed to create XML-RPC value from XML string: '.$e->getMessage(),$e->getCode());
+ }
+ }
+
+ // Get the key (tag name) and value from the simple xml object and convert the value to an XML-RPC native value
+ list($type, $value) = each($simple_xml);
+ if (!$type) { // If no type was specified, the default is string
+ $type = self::XMLRPC_TYPE_STRING;
+ }
+
+ switch ($type) {
+ // All valid and known XML-RPC native values
+ case self::XMLRPC_TYPE_I4:
+ // Fall through to the next case
+ case self::XMLRPC_TYPE_INTEGER:
+ $xmlrpc_val = new Zend_XmlRpc_Value_Integer($value);
+ break;
+ case self::XMLRPC_TYPE_DOUBLE:
+ $xmlrpc_val = new Zend_XmlRpc_Value_Double($value);
+ break;
+ case self::XMLRPC_TYPE_BOOLEAN:
+ $xmlrpc_val = new Zend_XmlRpc_Value_Boolean($value);
+ break;
+ case self::XMLRPC_TYPE_STRING:
+ $xmlrpc_val = new Zend_XmlRpc_Value_String($value);
+ break;
+ case self::XMLRPC_TYPE_DATETIME: // The value should already be in a iso8601 format
+ $xmlrpc_val = new Zend_XmlRpc_Value_DateTime($value);
+ break;
+ case self::XMLRPC_TYPE_BASE64: // The value should already be base64 encoded
+ $xmlrpc_val = new Zend_XmlRpc_Value_Base64($value ,true);
+ break;
+ case self::XMLRPC_TYPE_ARRAY:
+ // If the XML is valid, $value must be an SimpleXML element and contain the <data> tag
+ if (!$value instanceof SimpleXMLElement) {
+ throw new Zend_XmlRpc_Value_Exception('XML string is invalid for XML-RPC native '. self::XMLRPC_TYPE_ARRAY .' type');
+ } elseif (empty($value->data)) {
+ throw new Zend_XmlRpc_Value_Exception('Invalid XML for XML-RPC native '. self::XMLRPC_TYPE_ARRAY .' type: ARRAY tag must contain DATA tag');
+ }
+ $values = array();
+ // Parse all the elements of the array from the XML string
+ // (simple xml element) to Zend_XmlRpc_Value objects
+ foreach ($value->data->value as $element) {
+ $values[] = self::_xmlStringToNativeXmlRpc($element);
+ }
+ $xmlrpc_val = new Zend_XmlRpc_Value_Array($values);
+ break;
+ case self::XMLRPC_TYPE_STRUCT:
+ // If the XML is valid, $value must be an SimpleXML
+ if ((!$value instanceof SimpleXMLElement)) {
+ throw new Zend_XmlRpc_Value_Exception('XML string is invalid for XML-RPC native '. self::XMLRPC_TYPE_STRUCT .' type');
+ }
+ $values = array();
+ // Parse all the memebers of the struct from the XML string
+ // (simple xml element) to Zend_XmlRpc_Value objects
+ foreach ($value->member as $member) {
+ // @todo? If a member doesn't have a <value> tag, we don't add it to the struct
+ // Maybe we want to throw an exception here ?
+ if ((!$member->value instanceof SimpleXMLElement) || empty($member->value)) {
+ continue;
+ //throw new Zend_XmlRpc_Value_Exception('Member of the '. self::XMLRPC_TYPE_STRUCT .' XML-RPC native type must contain a VALUE tag');
+ }
+ $values[(string)$member->name] = self::_xmlStringToNativeXmlRpc($member->value);
+ }
+ $xmlrpc_val = new Zend_XmlRpc_Value_Struct($values);
+ break;
+ default:
+ throw new Zend_XmlRpc_Value_Exception('Value type \''. $type .'\' parsed from the XML string is not a known XML-RPC native type');
+ break;
+ }
+ $xmlrpc_val->_setXML($simple_xml->asXML());
+
+ return $xmlrpc_val;
+ }
+
+
+ private function _setXML($xml)
+ {
+ $this->_as_xml = $xml;
+ }
+
+}
+
+
diff --git a/libs/Zend/XmlRpc/Value/Array.php b/libs/Zend/XmlRpc/Value/Array.php
new file mode 100755
index 0000000000..c3d012b6d3
--- /dev/null
+++ b/libs/Zend/XmlRpc/Value/Array.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_XmlRpc_Value_Collection
+ */
+require_once 'Zend/XmlRpc/Value/Collection.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Value_Array extends Zend_XmlRpc_Value_Collection
+{
+ /**
+ * Set the value of an array native type
+ *
+ * @param array $value
+ */
+ public function __construct($value)
+ {
+ $this->_type = self::XMLRPC_TYPE_ARRAY;
+ parent::__construct($value);
+ }
+
+
+ /**
+ * Return the XML code that represent an array native MXL-RPC value
+ *
+ * @return string
+ */
+ public function saveXML()
+ {
+ if (!$this->_as_xml) { // The XML code was not calculated yet
+ $dom = new DOMDocument('1.0');
+ $value = $dom->appendChild($dom->createElement('value'));
+ $array = $value->appendChild($dom->createElement('array'));
+ $data = $array->appendChild($dom->createElement('data'));
+
+ if (is_array($this->_value)) {
+ foreach ($this->_value as $val) {
+ /* @var $val Zend_XmlRpc_Value */
+ $data->appendChild($dom->importNode($val->getAsDOM(), true));
+ }
+ }
+
+ $this->_as_dom = $value;
+ $this->_as_xml = $this->_stripXmlDeclaration($dom);
+ }
+
+ return $this->_as_xml;
+ }
+}
+
diff --git a/libs/Zend/XmlRpc/Value/Base64.php b/libs/Zend/XmlRpc/Value/Base64.php
new file mode 100755
index 0000000000..d02b32393c
--- /dev/null
+++ b/libs/Zend/XmlRpc/Value/Base64.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_XmlRpc_Value_Scalar
+ */
+require_once 'Zend/XmlRpc/Value/Scalar.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Value_Base64 extends Zend_XmlRpc_Value_Scalar
+{
+
+ /**
+ * Set the value of a base64 native type
+ * We keep this value in base64 encoding
+ *
+ * @param string $value
+ * @param bool $already_encoded If set, it means that the given string is already base64 encoded
+ */
+ public function __construct($value, $already_encoded=false)
+ {
+ $this->_type = self::XMLRPC_TYPE_BASE64;
+
+ $value = (string)$value; // Make sure this value is string
+ if (!$already_encoded) {
+ $value = base64_encode($value); // We encode it in base64
+ }
+ $this->_value = $value;
+ }
+
+ /**
+ * Return the value of this object, convert the XML-RPC native base64 value into a PHP string
+ * We return this value decoded (a normal string)
+ *
+ * @return string
+ */
+ public function getValue()
+ {
+ return base64_decode($this->_value);
+ }
+
+}
+
diff --git a/libs/Zend/XmlRpc/Value/Boolean.php b/libs/Zend/XmlRpc/Value/Boolean.php
new file mode 100755
index 0000000000..d4772257a0
--- /dev/null
+++ b/libs/Zend/XmlRpc/Value/Boolean.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_XmlRpc_Value_Scalar
+ */
+require_once 'Zend/XmlRpc/Value/Scalar.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Value_Boolean extends Zend_XmlRpc_Value_Scalar
+{
+
+ /**
+ * Set the value of a boolean native type
+ * We hold the boolean type as an integer (0 or 1)
+ *
+ * @param bool $value
+ */
+ public function __construct($value)
+ {
+ $this->_type = self::XMLRPC_TYPE_BOOLEAN;
+ // Make sure the value is boolean and then convert it into a integer
+ // The double convertion is because a bug in the ZendOptimizer in PHP version 5.0.4
+ $this->_value = (int)(bool)$value;
+ }
+
+ /**
+ * Return the value of this object, convert the XML-RPC native boolean value into a PHP boolean
+ *
+ * @return bool
+ */
+ public function getValue()
+ {
+ return (bool)$this->_value;
+ }
+
+ /**
+ * Return the XML-RPC serialization of the boolean value
+ *
+ * @return string
+ */
+ public function saveXML()
+ {
+ if (! $this->_as_xml) { // The XML was not generated yet
+ $dom = new DOMDocument('1.0', 'UTF-8');
+ $value = $dom->appendChild($dom->createElement('value'));
+ $type = $value->appendChild($dom->createElement($this->_type));
+ $type->appendChild($dom->createTextNode($this->_value));
+
+ $this->_as_dom = $value;
+ $this->_as_xml = $this->_stripXmlDeclaration($dom);
+ }
+
+ return $this->_as_xml;
+ }
+}
+
diff --git a/libs/Zend/XmlRpc/Value/Collection.php b/libs/Zend/XmlRpc/Value/Collection.php
new file mode 100755
index 0000000000..9e75ff32b0
--- /dev/null
+++ b/libs/Zend/XmlRpc/Value/Collection.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_XmlRpc_Value
+ */
+require_once 'Zend/XmlRpc/Value.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_XmlRpc_Value_Collection extends Zend_XmlRpc_Value
+{
+
+ /**
+ * Set the value of a collection type (array and struct) native types
+ *
+ * @param array $value
+ */
+ public function __construct($value)
+ {
+ $values = (array)$value; // Make sure that the value is an array
+ foreach ($values as $key => $value) {
+ // If the elements of the given array are not Zend_XmlRpc_Value objects,
+ // we need to convert them as such (using auto-detection from PHP value)
+ if (!$value instanceof parent) {
+ $value = self::getXmlRpcValue($value, self::AUTO_DETECT_TYPE);
+ }
+ $this->_value[$key] = $value;
+ }
+ }
+
+
+ /**
+ * Return the value of this object, convert the XML-RPC native collection values into a PHP array
+ *
+ * @return arary
+ */
+ public function getValue()
+ {
+ $values = (array)$this->_value;
+ foreach ($values as $key => $value) {
+ /* @var $value Zend_XmlRpc_Value */
+
+ if (!$value instanceof parent) {
+ throw new Zend_Xml_Rpc_Value_Exception('Values of '. get_class($this) .' type must be Zend_XmlRpc_Value objects');
+ }
+ $values[$key] = $value->getValue();
+ }
+ return $values;
+ }
+
+}
+
diff --git a/libs/Zend/XmlRpc/Value/DateTime.php b/libs/Zend/XmlRpc/Value/DateTime.php
new file mode 100755
index 0000000000..ee91dbff80
--- /dev/null
+++ b/libs/Zend/XmlRpc/Value/DateTime.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_XmlRpc_Value_Scalar
+ */
+require_once 'Zend/XmlRpc/Value/Scalar.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Value_DateTime extends Zend_XmlRpc_Value_Scalar
+{
+
+ /**
+ * Set the value of a dateTime.iso8601 native type
+ *
+ * The value is in iso8601 format, minus any timezone information or dashes
+ *
+ * @param mixed $value Integer of the unix timestamp or any string that can be parsed
+ * to a unix timestamp using the PHP strtotime() function
+ */
+ public function __construct($value)
+ {
+ $this->_type = self::XMLRPC_TYPE_DATETIME;
+
+ // If the value is not numeric, we try to convert it to a timestamp (using the strtotime function)
+ if (is_numeric($value)) { // The value is numeric, we make sure it is an integer
+ $value = (int)$value;
+ } else {
+ $value = strtotime($value);
+ if ($value === false || $value == -1) { // cannot convert the value to a timestamp
+ throw new Zend_XmlRpc_Value_Exception('Cannot convert given value \''. $value .'\' to a timestamp');
+ }
+ }
+ $value = date('c', $value); // Convert the timestamp to iso8601 format
+
+ // Strip out TZ information and dashes
+ $value = preg_replace('/(\+|-)\d{2}:\d{2}$/', '', $value);
+ $value = str_replace('-', '', $value);
+
+ $this->_value = $value;
+ }
+
+ /**
+ * Return the value of this object as iso8601 dateTime value
+ *
+ * @return int As a Unix timestamp
+ */
+ public function getValue()
+ {
+ return $this->_value;
+ }
+
+}
+
diff --git a/libs/Zend/XmlRpc/Value/Double.php b/libs/Zend/XmlRpc/Value/Double.php
new file mode 100755
index 0000000000..47bc741b0b
--- /dev/null
+++ b/libs/Zend/XmlRpc/Value/Double.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_XmlRpc_Value_Scalar
+ */
+require_once 'Zend/XmlRpc/Value/Scalar.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Value_Double extends Zend_XmlRpc_Value_Scalar
+{
+
+ /**
+ * Set the value of a double native type
+ *
+ * @param float $value
+ */
+ public function __construct($value)
+ {
+ $this->_type = self::XMLRPC_TYPE_DOUBLE;
+ $this->_value = sprintf('%f',(float)$value); // Make sure this value is float (double) and without the scientific notation
+ }
+
+ /**
+ * Return the value of this object, convert the XML-RPC native double value into a PHP float
+ *
+ * @return float
+ */
+ public function getValue()
+ {
+ return (float)$this->_value;
+ }
+
+}
+
diff --git a/libs/Zend/XmlRpc/Value/Exception.php b/libs/Zend/XmlRpc/Value/Exception.php
new file mode 100755
index 0000000000..931a2d150b
--- /dev/null
+++ b/libs/Zend/XmlRpc/Value/Exception.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_XmlRpc_Exception
+ */
+require_once 'Zend/XmlRpc/Exception.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Value_Exception extends Zend_XmlRpc_Exception
+{}
+
diff --git a/libs/Zend/XmlRpc/Value/Integer.php b/libs/Zend/XmlRpc/Value/Integer.php
new file mode 100755
index 0000000000..4371746f1c
--- /dev/null
+++ b/libs/Zend/XmlRpc/Value/Integer.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_XmlRpc_Value_Scalar
+ */
+require_once 'Zend/XmlRpc/Value/Scalar.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Value_Integer extends Zend_XmlRpc_Value_Scalar
+{
+
+ /**
+ * Set the value of an integer native type
+ *
+ * @param int $value
+ */
+ public function __construct($value)
+ {
+ $this->_type = self::XMLRPC_TYPE_INTEGER;
+ $this->_value = (int)$value; // Make sure this value is integer
+ }
+
+ /**
+ * Return the value of this object, convert the XML-RPC native integer value into a PHP integer
+ *
+ * @return int
+ */
+ public function getValue()
+ {
+ return $this->_value;
+ }
+
+}
+
diff --git a/libs/Zend/XmlRpc/Value/Scalar.php b/libs/Zend/XmlRpc/Value/Scalar.php
new file mode 100755
index 0000000000..fc38326d84
--- /dev/null
+++ b/libs/Zend/XmlRpc/Value/Scalar.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_XmlRpc_Value
+ */
+require_once 'Zend/XmlRpc/Value.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_XmlRpc_Value_Scalar extends Zend_XmlRpc_Value
+{
+
+ /**
+ * Return the XML code that represent a scalar native MXL-RPC value
+ *
+ * @return string
+ */
+ public function saveXML()
+ {
+ if (!$this->_as_xml) { // The XML code was not calculated yet
+ $dom = new DOMDocument('1.0');
+ $value = $dom->appendChild($dom->createElement('value'));
+ $type = $value->appendChild($dom->createElement($this->_type));
+ $type->appendChild($dom->createTextNode($this->getValue()));
+
+ $this->_as_dom = $value;
+ $this->_as_xml = $this->_stripXmlDeclaration($dom);
+ }
+
+ return $this->_as_xml;
+ }
+}
+
diff --git a/libs/Zend/XmlRpc/Value/String.php b/libs/Zend/XmlRpc/Value/String.php
new file mode 100755
index 0000000000..df14d43d6d
--- /dev/null
+++ b/libs/Zend/XmlRpc/Value/String.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/**
+ * Zend_XmlRpc_Value_Scalar
+ */
+require_once 'Zend/XmlRpc/Value/Scalar.php';
+
+/**
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_XmlRpc_Value_String extends Zend_XmlRpc_Value_Scalar
+{
+
+ /**
+ * Set the value of a string native type
+ *
+ * @param string $value
+ */
+ public function __construct($value)
+ {
+ $this->_type = self::XMLRPC_TYPE_STRING;
+
+ // Make sure this value is string and all XML characters are encoded
+ $this->_value = $this->_xml_entities($value);
+ }
+
+ /**
+ * Return the value of this object, convert the XML-RPC native string value into a PHP string
+ * Decode all encoded risky XML entities back to normal characters
+ *
+ * @return string
+ */
+ public function getValue()
+ {
+ return html_entity_decode($this->_value, ENT_QUOTES, 'UTF-8');
+ }
+
+ /**
+ * Make sure a string will be safe for XML, convert risky characters to HTML entities
+ *
+ * @param string $str
+ * @return string
+ */
+ private function _xml_entities($str)
+ {
+ return htmlentities($str, ENT_QUOTES, 'UTF-8');
+ }
+
+}
+
diff --git a/libs/Zend/XmlRpc/Value/Struct.php b/libs/Zend/XmlRpc/Value/Struct.php
new file mode 100755
index 0000000000..ad3d469d2a
--- /dev/null
+++ b/libs/Zend/XmlRpc/Value/Struct.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+
+/**
+ * Zend_XmlRpc_Value_Collection
+ */
+require_once 'Zend/XmlRpc/Value/Collection.php';
+
+
+/**
+ * @category Zend
+ * @package Zend_XmlRpc
+ * @subpackage Value
+ * @copyright Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_XmlRpc_Value_Struct extends Zend_XmlRpc_Value_Collection
+{
+ /**
+ * Set the value of an struct native type
+ *
+ * @param array $value
+ */
+ public function __construct($value)
+ {
+ $this->_type = self::XMLRPC_TYPE_STRUCT;
+ parent::__construct($value);
+ }
+
+
+ /**
+ * Return the XML code that represent struct native MXL-RPC value
+ *
+ * @return string
+ */
+ public function saveXML()
+ {
+ if (!$this->_as_xml) { // The XML code was not calculated yet
+ $dom = new DOMDocument('1.0');
+ $value = $dom->appendChild($dom->createElement('value'));
+ $struct = $value->appendChild($dom->createElement('struct'));
+
+ if (is_array($this->_value)) {
+ foreach ($this->_value as $name => $val) {
+ /* @var $val Zend_XmlRpc_Value */
+ $member = $struct->appendChild($dom->createElement('member'));
+ $member->appendChild($dom->createElement('name', $name));
+ $member->appendChild($dom->importNode($val->getAsDOM(), 1));
+ }
+ }
+
+ $this->_as_dom = $value;
+ $this->_as_xml = $this->_stripXmlDeclaration($dom);
+ }
+
+ return $this->_as_xml;
+ }
+}
+
diff --git a/misc/db-schema-README b/misc/db-schema-README
new file mode 100755
index 0000000000..c101338462
--- /dev/null
+++ b/misc/db-schema-README
@@ -0,0 +1,11 @@
+Schema edited with DBDESIGNER
+=============================
+
+DBdesigner is a great tool for designing Database schema, generating the SQL associated,
+and editing beautiful database schema images so that you’re proud and happy to show your
+ design to your fellow developer friends.
+
+ How to install DBDesigner on Linux
+ http://noteplog.com/how-to-install-dbdesigner-on-linux/
+
+ Also available for windows \ No newline at end of file
diff --git a/misc/db-schema.xml b/misc/db-schema.xml
new file mode 100755
index 0000000000..1b5a8dea2c
--- /dev/null
+++ b/misc/db-schema.xml
@@ -0,0 +1,1589 @@
+<?xml version="1.0" standalone="yes" ?>
+<DBMODEL Version="4.0">
+<SETTINGS>
+<GLOBALSETTINGS ModelName="db-schema" IDModel="0" IDVersion="0" VersionStr="1.0.0.0" Comments="" UseVersionHistroy="1" AutoIncVersion="1" DatabaseType="MySQL" ZoomFac="74.67" XPos="6" YPos="0" DefaultDataType="5" DefaultTablePrefix="0" DefSaveDBConn="" DefSyncDBConn="" DefQueryDBConn="" Printer="" HPageCount="4.0" PageAspectRatio="1.440892512336408" PageOrientation="1" PageFormat="A4 (210x297 mm, 8.26x11.7 inches)" SelectedPages="" UsePositionGrid="0" PositionGridX="20" PositionGridY="20" TableNameInRefs="0" DefaultTableType="0" ActivateRefDefForNewRelations="1" FKPrefix="" FKPostfix="" CreateFKRefDefIndex="0" DBQuoteCharacter="`" CreateSQLforLinkedObjects="0" DefModelFont="Tahoma" CanvasWidth="4096" CanvasHeight="2842" />
+<DATATYPEGROUPS>
+<DATATYPEGROUP Name="Numeric Types" Icon="1" />
+<DATATYPEGROUP Name="Date and Time Types" Icon="2" />
+<DATATYPEGROUP Name="String Types" Icon="3" />
+<DATATYPEGROUP Name="Blob and Text Types" Icon="4" />
+<DATATYPEGROUP Name="User defined Types" Icon="5" />
+<DATATYPEGROUP Name="Geographic Types" Icon="6" />
+</DATATYPEGROUPS>
+<DATATYPES>
+<DATATYPE ID="1" IDGroup="0" TypeName="TINYINT" Description="A very small integer. The signed range is -128 to 127. The unsigned range is 0 to 255." ParamCount="1" OptionCount="2" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+</PARAMS>
+<OPTIONS>
+<OPTION Name="UNSIGNED" Default="1" />
+<OPTION Name="ZEROFILL" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="2" IDGroup="0" TypeName="SMALLINT" Description="A small integer. The signed range is -32768 to 32767. The unsigned range is 0 to 65535." ParamCount="1" OptionCount="2" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+</PARAMS>
+<OPTIONS>
+<OPTION Name="UNSIGNED" Default="1" />
+<OPTION Name="ZEROFILL" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="3" IDGroup="0" TypeName="MEDIUMINT" Description="A medium-size integer. The signed range is -8388608 to 8388607. The unsigned range is 0 to 16777215." ParamCount="1" OptionCount="2" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+</PARAMS>
+<OPTIONS>
+<OPTION Name="UNSIGNED" Default="1" />
+<OPTION Name="ZEROFILL" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="4" IDGroup="0" TypeName="INT" Description="A normal-size integer. The signed range is -2147483648 to 2147483647. The unsigned range is 0 to 4294967295." ParamCount="1" OptionCount="2" ParamRequired="0" EditParamsAsString="0" SynonymGroup="1" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+</PARAMS>
+<OPTIONS>
+<OPTION Name="UNSIGNED" Default="0" />
+<OPTION Name="ZEROFILL" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="5" IDGroup="0" TypeName="INTEGER" Description="A normal-size integer. The signed range is -2147483648 to 2147483647. The unsigned range is 0 to 4294967295." ParamCount="1" OptionCount="2" ParamRequired="0" EditParamsAsString="0" SynonymGroup="1" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+</PARAMS>
+<OPTIONS>
+<OPTION Name="UNSIGNED" Default="1" />
+<OPTION Name="ZEROFILL" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="6" IDGroup="0" TypeName="BIGINT" Description="A large integer. The signed range is -9223372036854775808 to 9223372036854775807. The unsigned range is 0 to 18446744073709551615." ParamCount="1" OptionCount="2" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+</PARAMS>
+<OPTIONS>
+<OPTION Name="UNSIGNED" Default="0" />
+<OPTION Name="ZEROFILL" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="7" IDGroup="0" TypeName="FLOAT" Description="A small (single-precision) floating-point number. Cannot be unsigned. Allowable values are -3.402823466E+38 to -1.175494351E-38, 0, and 1.175494351E-38 to 3.402823466E+38." ParamCount="1" OptionCount="1" ParamRequired="1" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="precision" />
+</PARAMS>
+<OPTIONS>
+<OPTION Name="ZEROFILL" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="8" IDGroup="0" TypeName="FLOAT" Description="A small (single-precision) floating-point number. Cannot be unsigned. Allowable values are -3.402823466E+38 to -1.175494351E-38, 0, and 1.175494351E-38 to 3.402823466E+38." ParamCount="2" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+<PARAM Name="decimals" />
+</PARAMS>
+<OPTIONS>
+<OPTION Name="ZEROFILL" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="9" IDGroup="0" TypeName="DOUBLE" Description="A normal-size (double-precision) floating-point number. Cannot be unsigned. Allowable values are -1.7976931348623157E+308 to -2.2250738585072014E-308, 0, and 2.2250738585072014E-308 to 1.7976931348623157E+308." ParamCount="2" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="2" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+<PARAM Name="decimals" />
+</PARAMS>
+<OPTIONS>
+<OPTION Name="ZEROFILL" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="10" IDGroup="0" TypeName="DOUBLE PRECISION" Description="This is a synonym for DOUBLE." ParamCount="2" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="2" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+<PARAM Name="decimals" />
+</PARAMS>
+<OPTIONS>
+<OPTION Name="ZEROFILL" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="11" IDGroup="0" TypeName="REAL" Description="This is a synonym for DOUBLE." ParamCount="2" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="2" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+<PARAM Name="decimals" />
+</PARAMS>
+<OPTIONS>
+<OPTION Name="ZEROFILL" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="12" IDGroup="0" TypeName="DECIMAL" Description="An unpacked floating-point number. Cannot be unsigned. Behaves like a CHAR column." ParamCount="2" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="3" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+<PARAM Name="decimals" />
+</PARAMS>
+<OPTIONS>
+<OPTION Name="ZEROFILL" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="13" IDGroup="0" TypeName="NUMERIC" Description="This is a synonym for DECIMAL." ParamCount="2" OptionCount="1" ParamRequired="1" EditParamsAsString="0" SynonymGroup="3" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+<PARAM Name="decimals" />
+</PARAMS>
+<OPTIONS>
+<OPTION Name="ZEROFILL" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="14" IDGroup="1" TypeName="DATE" Description="A date. The supported range is \a1000-01-01\a to \a9999-12-31\a." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="15" IDGroup="1" TypeName="DATETIME" Description="A date and time combination. The supported range is \a1000-01-01 00:00:00\a to \a9999-12-31 23:59:59\a." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="16" IDGroup="1" TypeName="TIMESTAMP" Description="A timestamp. The range is \a1970-01-01 00:00:00\a to sometime in the year 2037. The length can be 14 (or missing), 12, 10, 8, 6, 4, or 2 representing YYYYMMDDHHMMSS, ... , YYYYMMDD, ... , YY formats." ParamCount="1" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+</PARAMS>
+</DATATYPE>
+<DATATYPE ID="17" IDGroup="1" TypeName="TIME" Description="A time. The range is \a-838:59:59\a to \a838:59:59\a." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="18" IDGroup="1" TypeName="YEAR" Description="A year in 2- or 4-digit format (default is 4-digit)." ParamCount="1" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+</PARAMS>
+</DATATYPE>
+<DATATYPE ID="19" IDGroup="2" TypeName="CHAR" Description="A fixed-length string (1 to 255 characters) that is always right-padded with spaces to the specified length when stored. values are sorted and compared in case-insensitive fashion according to the default character set unless the BINARY keyword is given." ParamCount="1" OptionCount="1" ParamRequired="1" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+</PARAMS>
+<OPTIONS>
+<OPTION Name="BINARY" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="20" IDGroup="2" TypeName="VARCHAR" Description="A variable-length string (1 to 255 characters). Values are sorted and compared in case-sensitive fashion unless the BINARY keyword is given." ParamCount="1" OptionCount="1" ParamRequired="1" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="length" />
+</PARAMS>
+<OPTIONS>
+<OPTION Name="BINARY" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="21" IDGroup="2" TypeName="BIT" Description="This is a synonym for CHAR(1)." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="22" IDGroup="2" TypeName="BOOL" Description="This is a synonym for CHAR(1)." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="23" IDGroup="3" TypeName="TINYBLOB" Description="A column maximum length of 255 (2^8 - 1) characters. Values are sorted and compared in case-sensitive fashion." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="24" IDGroup="3" TypeName="BLOB" Description="A column maximum length of 65535 (2^16 - 1) characters. Values are sorted and compared in case-sensitive fashion." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="25" IDGroup="3" TypeName="MEDIUMBLOB" Description="A column maximum length of 16777215 (2^24 - 1) characters. Values are sorted and compared in case-sensitive fashion." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="26" IDGroup="3" TypeName="LONGBLOB" Description="A column maximum length of 4294967295 (2^32 - 1) characters. Values are sorted and compared in case-sensitive fashion." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="27" IDGroup="3" TypeName="TINYTEXT" Description="A column maximum length of 255 (2^8 - 1) characters." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="28" IDGroup="3" TypeName="TEXT" Description="A column maximum length of 65535 (2^16 - 1) characters." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="29" IDGroup="3" TypeName="MEDIUMTEXT" Description="A column maximum length of 16777215 (2^24 - 1) characters." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="30" IDGroup="3" TypeName="LONGTEXT" Description="A column maximum length of 4294967295 (2^32 - 1) characters." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="31" IDGroup="3" TypeName="ENUM" Description="An enumeration. A string object that can have only one value, chosen from the list of values." ParamCount="1" OptionCount="0" ParamRequired="1" EditParamsAsString="1" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="values" />
+</PARAMS>
+</DATATYPE>
+<DATATYPE ID="32" IDGroup="3" TypeName="SET" Description="A set. A string object that can have zero or more values, each of which must be chosen from the list of values." ParamCount="1" OptionCount="0" ParamRequired="1" EditParamsAsString="1" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+<PARAMS>
+<PARAM Name="values" />
+</PARAMS>
+</DATATYPE>
+<DATATYPE ID="33" IDGroup="4" TypeName="Varchar(20)" Description="" ParamCount="0" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+<OPTIONS>
+<OPTION Name="BINARY" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="34" IDGroup="4" TypeName="Varchar(45)" Description="" ParamCount="0" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+<OPTIONS>
+<OPTION Name="BINARY" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="35" IDGroup="4" TypeName="Varchar(255)" Description="" ParamCount="0" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+<OPTIONS>
+<OPTION Name="BINARY" Default="0" />
+</OPTIONS>
+</DATATYPE>
+<DATATYPE ID="36" IDGroup="5" TypeName="GEOMETRY" Description="Geographic Datatype" ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="38" IDGroup="5" TypeName="LINESTRING" Description="Geographic Datatype" ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="39" IDGroup="5" TypeName="POLYGON" Description="Geographic Datatype" ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="40" IDGroup="5" TypeName="MULTIPOINT" Description="Geographic Datatype" ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="41" IDGroup="5" TypeName="MULTILINESTRING" Description="Geographic Datatype" ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="42" IDGroup="5" TypeName="MULTIPOLYGON" Description="Geographic Datatype" ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+<DATATYPE ID="43" IDGroup="5" TypeName="GEOMETRYCOLLECTION" Description="Geographic Datatype" ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
+</DATATYPE>
+</DATATYPES>
+<COMMON_DATATYPES>
+<COMMON_DATATYPE ID="5" />
+<COMMON_DATATYPE ID="8" />
+<COMMON_DATATYPE ID="20" />
+<COMMON_DATATYPE ID="15" />
+<COMMON_DATATYPE ID="22" />
+<COMMON_DATATYPE ID="28" />
+<COMMON_DATATYPE ID="26" />
+<COMMON_DATATYPE ID="33" />
+<COMMON_DATATYPE ID="34" />
+<COMMON_DATATYPE ID="35" />
+</COMMON_DATATYPES>
+<TABLEPREFIXES>
+<TABLEPREFIX Name="Default (no prefix)" />
+</TABLEPREFIXES>
+<REGIONCOLORS>
+<REGIONCOLOR Color="Red=#FFEEEC" />
+<REGIONCOLOR Color="Yellow=#FEFDED" />
+<REGIONCOLOR Color="Green=#EAFFE5" />
+<REGIONCOLOR Color="Cyan=#ECFDFF" />
+<REGIONCOLOR Color="Blue=#F0F1FE" />
+<REGIONCOLOR Color="Magenta=#FFEBFA" />
+</REGIONCOLORS>
+<POSITIONMARKERS>
+<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
+<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
+<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
+<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
+<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
+<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
+<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
+<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
+<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
+<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
+<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
+</POSITIONMARKERS>
+</SETTINGS>
+<METADATA>
+<REGIONS>
+<REGION ID="2065" RegionName="Authentification \+ Access" XPos="46" YPos="143" Width="281" Height="375" RegionColor="3" TablePrefix="0" TableType="0" OverwriteTablePrefix="0" OverwriteTableType="0" Comments="" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="38" />
+<REGION ID="2064" RegionName="Region_03" XPos="821" YPos="751" Width="635" Height="998" RegionColor="2" TablePrefix="0" TableType="0" OverwriteTablePrefix="0" OverwriteTableType="0" Comments="" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="37" />
+<REGION ID="2063" RegionName="Site" XPos="493" YPos="155" Width="682" Height="552" RegionColor="1" TablePrefix="0" TableType="0" OverwriteTablePrefix="0" OverwriteTableType="0" Comments="" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="41" />
+<REGION ID="2062" RegionName="Region_01" XPos="73" YPos="720" Width="628" Height="1251" RegionColor="0" TablePrefix="0" TableType="0" OverwriteTablePrefix="0" OverwriteTableType="0" Comments="" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="40" />
+</REGIONS>
+<TABLES>
+<TABLE ID="1735" Tablename="phpmv_a_category" PrevTableName="" XPos="461" YPos="932" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="3" >
+<COLUMNS>
+<COLUMN ID="1772" ColName="id" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1773" ColName="name" PrevColName="" Pos="2" idDatatype="20" DatatypeParams="(100)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1774" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1772" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1736" Tablename="phpmv_a_config" PrevTableName="" XPos="452" YPos="1495" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="4" >
+<COLUMNS>
+<COLUMN ID="1775" ColName="id" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1776" ColName="name" PrevColName="" Pos="2" idDatatype="20" DatatypeParams="(100)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1777" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1775" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1737" Tablename="phpmv_a_file" PrevTableName="" XPos="479" YPos="1566" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="5" >
+<COLUMNS>
+<COLUMN ID="1778" ColName="id" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1779" ColName="name" PrevColName="" Pos="2" idDatatype="28" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1780" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1778" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1738" Tablename="phpmv_a_keyword" PrevTableName="" XPos="471" YPos="868" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="6" >
+<COLUMNS>
+<COLUMN ID="1781" ColName="id" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1782" ColName="name" PrevColName="" Pos="2" idDatatype="28" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1783" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1781" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1739" Tablename="phpmv_a_newsletter" PrevTableName="" XPos="452" YPos="1623" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="7" >
+<COLUMNS>
+<COLUMN ID="1784" ColName="id" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1785" ColName="name" PrevColName="" Pos="2" idDatatype="20" DatatypeParams="(60)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1786" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1784" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1740" Tablename="phpmv_a_page" PrevTableName="" XPos="459" YPos="810" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="8" >
+<COLUMNS>
+<COLUMN ID="1787" ColName="id" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1788" ColName="name" PrevColName="" Pos="2" idDatatype="28" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1789" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1787" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1741" Tablename="phpmv_a_partner_name" PrevTableName="" XPos="454" YPos="1698" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="9" >
+<COLUMNS>
+<COLUMN ID="1790" ColName="id" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1791" ColName="name" PrevColName="" Pos="2" idDatatype="20" DatatypeParams="(100)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1792" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1790" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1742" Tablename="phpmv_a_partner_url" PrevTableName="" XPos="457" YPos="1760" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="10" >
+<COLUMNS>
+<COLUMN ID="1793" ColName="id" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1794" ColName="name" PrevColName="" Pos="2" idDatatype="28" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1795" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1793" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1743" Tablename="phpmv_a_provider" PrevTableName="" XPos="463" YPos="1825" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="11" >
+<COLUMNS>
+<COLUMN ID="1796" ColName="id" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1797" ColName="name" PrevColName="" Pos="2" idDatatype="20" DatatypeParams="(100)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1798" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1796" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+<INDEX ID="1799" IndexName="name" IndexKind="1" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1797" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1744" Tablename="phpmv_a_resolution" PrevTableName="" XPos="470" YPos="1241" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="12" >
+<COLUMNS>
+<COLUMN ID="1800" ColName="id" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1801" ColName="name" PrevColName="" Pos="2" idDatatype="20" DatatypeParams="(20)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1802" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1800" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1745" Tablename="phpmv_a_search_engine" PrevTableName="" XPos="436" YPos="1146" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="13" >
+<COLUMNS>
+<COLUMN ID="1803" ColName="id" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1804" ColName="name" PrevColName="" Pos="2" idDatatype="20" DatatypeParams="(100)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1805" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1803" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1746" Tablename="phpmv_a_site" PrevTableName="" XPos="479" YPos="1038" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="14" >
+<COLUMNS>
+<COLUMN ID="1806" ColName="id" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1807" ColName="name" PrevColName="" Pos="2" idDatatype="28" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1808" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1806" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1747" Tablename="phpmv_a_vars_name" PrevTableName="" XPos="448" YPos="1302" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="15" >
+<COLUMNS>
+<COLUMN ID="1809" ColName="id" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1810" ColName="name" PrevColName="" Pos="2" idDatatype="20" DatatypeParams="(255)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1811" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1809" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1748" Tablename="phpmv_a_vars_value" PrevTableName="" XPos="461" YPos="1402" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="16" >
+<COLUMNS>
+<COLUMN ID="1812" ColName="id" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1813" ColName="name" PrevColName="" Pos="2" idDatatype="20" DatatypeParams="(255)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1814" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1812" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1749" Tablename="phpmv_archives" PrevTableName="" XPos="91" YPos="763" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="17" >
+<COLUMNS>
+<COLUMN ID="1815" ColName="idarchives" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1816" ColName="idsite" PrevColName="" Pos="2" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1817" ColName="done" PrevColName="" Pos="3" idDatatype="1" DatatypeParams="(4)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1818" ColName="period" PrevColName="" Pos="4" idDatatype="1" DatatypeParams="(1)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1819" ColName="simple" PrevColName="" Pos="5" idDatatype="1" DatatypeParams="(4)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1820" ColName="date1" PrevColName="" Pos="6" idDatatype="20" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="00:00:00" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1821" ColName="date2" PrevColName="" Pos="7" idDatatype="20" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="00:00:00" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1822" ColName="nb_uniq_vis" PrevColName="" Pos="8" idDatatype="3" DatatypeParams="(8)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1823" ColName="nb_vis" PrevColName="" Pos="9" idDatatype="3" DatatypeParams="(8)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1824" ColName="nb_vis_returning" PrevColName="" Pos="10" idDatatype="5" DatatypeParams="(8)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1825" ColName="nb_uniq_vis_returning" PrevColName="" Pos="11" idDatatype="5" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1826" ColName="nb_pag" PrevColName="" Pos="12" idDatatype="3" DatatypeParams="(8)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1827" ColName="nb_pag_returning" PrevColName="" Pos="13" idDatatype="5" DatatypeParams="(8)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1828" ColName="nb_uniq_pag" PrevColName="" Pos="14" idDatatype="2" DatatypeParams="(5)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1829" ColName="nb_max_pag" PrevColName="" Pos="15" idDatatype="2" DatatypeParams="(5)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1830" ColName="nb_vis_1pag" PrevColName="" Pos="16" idDatatype="3" DatatypeParams="(8)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1831" ColName="nb_vis_1pag_returning" PrevColName="" Pos="17" idDatatype="3" DatatypeParams="(8)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1832" ColName="sum_vis_lth" PrevColName="" Pos="18" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1833" ColName="sum_vis_lth_returning" PrevColName="" Pos="19" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1834" ColName="nb_direct" PrevColName="" Pos="20" idDatatype="3" DatatypeParams="(8)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1835" ColName="nb_search_engine" PrevColName="" Pos="21" idDatatype="3" DatatypeParams="(8)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1836" ColName="nb_site" PrevColName="" Pos="22" idDatatype="3" DatatypeParams="(8)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1837" ColName="nb_newsletter" PrevColName="" Pos="23" idDatatype="3" DatatypeParams="(8)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1838" ColName="nb_partner" PrevColName="" Pos="24" idDatatype="3" DatatypeParams="(8)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1839" ColName="vis_period" PrevColName="" Pos="25" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1840" ColName="vis_nb_vis" PrevColName="" Pos="26" idDatatype="24" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1841" ColName="vis_st" PrevColName="" Pos="27" idDatatype="24" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1842" ColName="vis_lt" PrevColName="" Pos="28" idDatatype="24" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1843" ColName="pag_st" PrevColName="" Pos="29" idDatatype="24" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1844" ColName="pag_lt" PrevColName="" Pos="30" idDatatype="24" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1845" ColName="vis_lth" PrevColName="" Pos="31" idDatatype="24" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1846" ColName="vis_nb_pag" PrevColName="" Pos="32" idDatatype="24" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1847" ColName="vis_pag_grp" PrevColName="" Pos="33" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1848" ColName="vis_country" PrevColName="" Pos="34" idDatatype="24" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1849" ColName="vis_continent" PrevColName="" Pos="35" idDatatype="24" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1850" ColName="vis_provider" PrevColName="" Pos="36" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1851" ColName="vis_config" PrevColName="" Pos="37" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1852" ColName="vis_os" PrevColName="" Pos="38" idDatatype="24" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1853" ColName="vis_browser" PrevColName="" Pos="39" idDatatype="24" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1854" ColName="vis_browser_type" PrevColName="" Pos="40" idDatatype="24" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1855" ColName="vis_resolution" PrevColName="" Pos="41" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1856" ColName="vis_plugin" PrevColName="" Pos="42" idDatatype="24" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1857" ColName="vis_search_engine" PrevColName="" Pos="43" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1858" ColName="vis_keyword" PrevColName="" Pos="44" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1859" ColName="vis_site" PrevColName="" Pos="45" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1860" ColName="vis_partner" PrevColName="" Pos="46" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1861" ColName="vis_newsletter" PrevColName="" Pos="47" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1862" ColName="int_lt" PrevColName="" Pos="48" idDatatype="24" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1863" ColName="int_st" PrevColName="" Pos="49" idDatatype="24" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1864" ColName="int_referer_type" PrevColName="" Pos="50" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1865" ColName="int_search_engine" PrevColName="" Pos="51" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1866" ColName="int_keyword" PrevColName="" Pos="52" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1867" ColName="int_site" PrevColName="" Pos="53" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1868" ColName="int_partner" PrevColName="" Pos="54" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1869" ColName="int_newsletter" PrevColName="" Pos="55" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1870" ColName="int_country" PrevColName="" Pos="56" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1871" ColName="int_continent" PrevColName="" Pos="57" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1872" ColName="int_config" PrevColName="" Pos="58" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1873" ColName="int_os" PrevColName="" Pos="59" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1874" ColName="int_browser" PrevColName="" Pos="60" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1875" ColName="int_resolution" PrevColName="" Pos="61" idDatatype="26" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1876" ColName="compressed" PrevColName="" Pos="62" idDatatype="1" DatatypeParams="(4)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1877" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1815" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+<INDEX ID="1878" IndexName="pmvindex1" IndexKind="1" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1816" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+<INDEX ID="1879" IndexName="pmvindex2" IndexKind="1" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1817" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1750" Tablename="phpmv_category" PrevTableName="" XPos="903" YPos="1246" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="18" >
+<COLUMNS>
+<COLUMN ID="1880" ColName="idcategory" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1881" ColName="complete_name" PrevColName="" Pos="2" idDatatype="20" DatatypeParams="(255)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1882" ColName="name" PrevColName="" Pos="3" idDatatype="20" DatatypeParams="(100)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1883" ColName="level" PrevColName="" Pos="4" idDatatype="2" DatatypeParams="(5)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1884" ColName="idparent" PrevColName="" Pos="5" idDatatype="2" DatatypeParams="(5)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1885" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1880" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1751" Tablename="role" PrevTableName="phpmv_groups" XPos="98" YPos="371" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="\n" TableOptions="DelayKeyTblUpdates=0\nPackKeys=0\nRowChecksum=0\nRowFormat=0\nUseRaid=0\nRaidType=0\n" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="19" >
+<COLUMNS>
+<COLUMN ID="1887" ColName="login" PrevColName="name" Pos="2" idDatatype="20" DatatypeParams="(20)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2079" ColName="idsite" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="" Width="-1" Prec="-1" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2080" ColName="role" PrevColName="" Pos="2" idDatatype="20" DatatypeParams="(10)" Width="-1" Prec="-1" PrimaryKey="0" NotNull="0" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="2074" IndexName="PRIMARY" IndexKind="1" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1887" LengthParam="0" />
+<INDEXCOLUMN idColumn="2079" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1752" Tablename="phpmv_ip_ignore" PrevTableName="" XPos="913" YPos="514" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="20" >
+<COLUMNS>
+<COLUMN ID="1891" ColName="idip_ignore" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1892" ColName="idsite" PrevColName="" Pos="2" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1893" ColName="ip_min" PrevColName="" Pos="3" idDatatype="6" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1894" ColName="ip_max" PrevColName="" Pos="4" idDatatype="6" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1895" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1891" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+<INDEX ID="1896" IndexName="pmvindex" IndexKind="1" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1892" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1753" Tablename="phpmv_link_vp" PrevTableName="" XPos="896" YPos="1057" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="21" >
+<COLUMNS>
+<COLUMN ID="1897" ColName="idlink_vp" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1898" ColName="idvisit" PrevColName="" Pos="2" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1899" ColName="idpage" PrevColName="" Pos="3" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1900" ColName="idpage_ref" PrevColName="" Pos="4" idDatatype="5" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1901" ColName="total_time_page_ref" PrevColName="" Pos="5" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1902" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1897" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+<INDEX ID="1903" IndexName="pmvindex" IndexKind="1" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1898" LengthParam="0" />
+<INDEXCOLUMN idColumn="1899" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1754" Tablename="phpmv_link_vpv" PrevTableName="" XPos="923" YPos="980" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="22" >
+<COLUMNS>
+<COLUMN ID="1904" ColName="idlink_vp" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1905" ColName="idvars" PrevColName="" Pos="2" idDatatype="5" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1906" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1904" LengthParam="0" />
+<INDEXCOLUMN idColumn="1905" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1755" Tablename="phpmv_newsletter" PrevTableName="" XPos="870" YPos="288" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="23" >
+<COLUMNS>
+<COLUMN ID="1907" ColName="idnewsletter" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1908" ColName="idsite" PrevColName="" Pos="2" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1909" ColName="name" PrevColName="" Pos="3" idDatatype="20" DatatypeParams="(90)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1910" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1907" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+<INDEX ID="1911" IndexName="pmvindex" IndexKind="1" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1908" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1756" Tablename="phpmv_page" PrevTableName="" XPos="903" YPos="1567" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="24" >
+<COLUMNS>
+<COLUMN ID="1912" ColName="idpage" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1913" ColName="idcategory" PrevColName="" Pos="2" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1914" ColName="name" PrevColName="" Pos="3" idDatatype="20" DatatypeParams="(255)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1915" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1912" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+<INDEX ID="1916" IndexName="pmvindex" IndexKind="1" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1913" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1757" Tablename="phpmv_page_md5url" PrevTableName="" XPos="885" YPos="1381" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="25" >
+<COLUMNS>
+<COLUMN ID="1917" ColName="idpage_md5url" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1918" ColName="idpage" PrevColName="" Pos="2" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1919" ColName="md5url" PrevColName="" Pos="3" idDatatype="19" DatatypeParams="(32)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1920" ColName="idpage_url" PrevColName="" Pos="4" idDatatype="5" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1921" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1917" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+<INDEX ID="1922" IndexName="idpage" IndexKind="1" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1918" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+<INDEX ID="1923" IndexName="url" IndexKind="1" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1919" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1758" Tablename="phpmv_page_url" PrevTableName="" XPos="909" YPos="889" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="26" >
+<COLUMNS>
+<COLUMN ID="1924" ColName="idpage_url" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1925" ColName="url" PrevColName="" Pos="2" idDatatype="28" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1926" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1924" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1763" Tablename="site" PrevTableName="phpmv_site" XPos="501" YPos="311" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="\n" TableOptions="DelayKeyTblUpdates=0\nPackKeys=0\nRowChecksum=0\nRowFormat=0\nUseRaid=0\nRaidType=0\n" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="31" >
+<COLUMNS>
+<COLUMN ID="1945" ColName="idsite" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="1" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1946" ColName="name" PrevColName="" Pos="2" idDatatype="20" DatatypeParams="(90)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2093" ColName="main_url" PrevColName="" Pos="2" idDatatype="20" DatatypeParams="(255)" Width="-1" Prec="-1" PrimaryKey="0" NotNull="0" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1952" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1945" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1764" Tablename="phpmv_site_partner" PrevTableName="" XPos="865" YPos="170" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="32" >
+<COLUMNS>
+<COLUMN ID="1953" ColName="idsite_partner" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1954" ColName="idsite" PrevColName="" Pos="2" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1955" ColName="name" PrevColName="" Pos="3" idDatatype="20" DatatypeParams="(90)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1956" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1953" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+<INDEX ID="1957" IndexName="pmvindex" IndexKind="1" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1954" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1765" Tablename="phpmv_site_partner_url" PrevTableName="" XPos="885" YPos="422" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="33" >
+<COLUMNS>
+<COLUMN ID="1958" ColName="idsite_partner_url" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1959" ColName="idsite_partner" PrevColName="" Pos="2" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1960" ColName="url" PrevColName="" Pos="3" idDatatype="20" DatatypeParams="(200)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1961" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1958" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1766" Tablename="site_url" PrevTableName="phpmv_site_url" XPos="498" YPos="400" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="\n" TableOptions="DelayKeyTblUpdates=0\nPackKeys=0\nRowChecksum=0\nRowFormat=0\nUseRaid=0\nRaidType=0\n" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="34" >
+<COLUMNS>
+<COLUMN ID="1963" ColName="idsite" PrevColName="" Pos="2" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1964" ColName="url" PrevColName="" Pos="3" idDatatype="20" DatatypeParams="(255)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="2090" IndexName="PRIMARY" IndexKind="1" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1963" LengthParam="0" />
+<INDEXCOLUMN idColumn="1964" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1767" Tablename="user" PrevTableName="phpmv_users" XPos="74" YPos="201" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="\n" TableOptions="DelayKeyTblUpdates=0\nPackKeys=0\nRowChecksum=0\nRowFormat=0\nUseRaid=0\nRaidType=0\n" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="35" >
+<COLUMNS>
+<COLUMN ID="1967" ColName="login" PrevColName="" Pos="1" idDatatype="20" DatatypeParams="(20)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1968" ColName="password" PrevColName="" Pos="2" idDatatype="20" DatatypeParams="(255)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1969" ColName="alias" PrevColName="" Pos="3" idDatatype="20" DatatypeParams="(45)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1970" ColName="email" PrevColName="" Pos="4" idDatatype="20" DatatypeParams="(100)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1972" ColName="token_auth" PrevColName="rss_hash" Pos="6" idDatatype="19" DatatypeParams="(32)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1973" ColName="date_registered" PrevColName="" Pos="7" idDatatype="16" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="1974" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1967" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+<TABLE ID="1770" Tablename="phpmv_version" PrevTableName="" XPos="954" YPos="71" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="38" >
+<COLUMNS>
+<COLUMN ID="1985" ColName="version" PrevColName="" Pos="1" idDatatype="20" DatatypeParams="(255)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+</TABLE>
+<TABLE ID="1771" Tablename="phpmv_visit" PrevTableName="" XPos="1165" YPos="864" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="39" >
+<COLUMNS>
+<COLUMN ID="1986" ColName="idvisit" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1987" ColName="idsite" PrevColName="" Pos="2" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1988" ColName="idcookie" PrevColName="" Pos="3" idDatatype="20" DatatypeParams="(32)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1989" ColName="returning" PrevColName="" Pos="4" idDatatype="1" DatatypeParams="(1)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1990" ColName="last_visit_time" PrevColName="" Pos="5" idDatatype="17" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="00:00:00" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1991" ColName="server_date" PrevColName="" Pos="6" idDatatype="14" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1992" ColName="server_time" PrevColName="" Pos="7" idDatatype="17" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="00:00:00" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1993" ColName="referer" PrevColName="" Pos="8" idDatatype="28" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1994" ColName="os" PrevColName="" Pos="9" idDatatype="19" DatatypeParams="(3)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1995" ColName="browser_name" PrevColName="" Pos="10" idDatatype="20" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1996" ColName="browser_version" PrevColName="" Pos="11" idDatatype="20" DatatypeParams="(20)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1997" ColName="resolution" PrevColName="" Pos="12" idDatatype="20" DatatypeParams="(9)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1998" ColName="color_depth" PrevColName="" Pos="13" idDatatype="1" DatatypeParams="(2)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="1999" ColName="pdf" PrevColName="" Pos="14" idDatatype="1" DatatypeParams="(1)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2000" ColName="flash" PrevColName="" Pos="15" idDatatype="1" DatatypeParams="(1)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2001" ColName="java" PrevColName="" Pos="16" idDatatype="1" DatatypeParams="(1)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2002" ColName="javascript" PrevColName="" Pos="17" idDatatype="1" DatatypeParams="(1)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2003" ColName="director" PrevColName="" Pos="18" idDatatype="1" DatatypeParams="(1)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2004" ColName="quicktime" PrevColName="" Pos="19" idDatatype="1" DatatypeParams="(1)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2005" ColName="realplayer" PrevColName="" Pos="20" idDatatype="1" DatatypeParams="(1)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2006" ColName="windowsmedia" PrevColName="" Pos="21" idDatatype="1" DatatypeParams="(1)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2007" ColName="cookie" PrevColName="" Pos="22" idDatatype="1" DatatypeParams="(1)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2008" ColName="local_time" PrevColName="" Pos="23" idDatatype="17" DatatypeParams="" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="00:00:00" Comments="">
+<OPTIONSELECTED>
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2009" ColName="ip" PrevColName="" Pos="24" idDatatype="5" DatatypeParams="(10)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2010" ColName="hostname_ext" PrevColName="" Pos="25" idDatatype="20" DatatypeParams="(100)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2011" ColName="browser_lang" PrevColName="" Pos="26" idDatatype="20" DatatypeParams="(60)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2012" ColName="total_pages" PrevColName="" Pos="27" idDatatype="2" DatatypeParams="(5)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2013" ColName="total_time" PrevColName="" Pos="28" idDatatype="2" DatatypeParams="(5)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="1" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2014" ColName="country" PrevColName="" Pos="29" idDatatype="19" DatatypeParams="(3)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2015" ColName="continent" PrevColName="" Pos="30" idDatatype="19" DatatypeParams="(3)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2016" ColName="exit_idpage" PrevColName="" Pos="31" idDatatype="5" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2017" ColName="entry_idpage" PrevColName="" Pos="32" idDatatype="5" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2018" ColName="entry_idpageurl" PrevColName="" Pos="33" idDatatype="5" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+<COLUMN ID="2019" ColName="md5config" PrevColName="" Pos="34" idDatatype="20" DatatypeParams="(32)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<OPTIONSELECTED>
+<OPTIONSELECT Value="0" />
+</OPTIONSELECTED>
+</COLUMN>
+</COLUMNS>
+<INDICES>
+<INDEX ID="2020" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1986" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+<INDEX ID="2021" IndexName="idsite" IndexKind="1" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1987" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+<INDEX ID="2022" IndexName="server_date" IndexKind="1" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="1991" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+<INDEX ID="2023" IndexName="md5config" IndexKind="1" FKRefDef_Obj_id="-1">
+<INDEXCOLUMNS>
+<INDEXCOLUMN idColumn="2019" LengthParam="0" />
+</INDEXCOLUMNS>
+</INDEX>
+</INDICES>
+</TABLE>
+</TABLES>
+<RELATIONS>
+</RELATIONS>
+<NOTES>
+</NOTES>
+<IMAGES>
+</IMAGES>
+</METADATA>
+<PLUGINDATA>
+<PLUGINDATARECORDS>
+</PLUGINDATARECORDS>
+</PLUGINDATA>
+<QUERYDATA>
+<QUERYRECORDS>
+</QUERYRECORDS>
+</QUERYDATA>
+<LINKEDMODELS>
+</LINKEDMODELS>
+</DBMODEL>
diff --git a/modules/Access.php b/modules/Access.php
new file mode 100755
index 0000000000..7f1e9c4744
--- /dev/null
+++ b/modules/Access.php
@@ -0,0 +1,167 @@
+<?php
+class Piwik_Access
+{
+ private $acl = null;
+ private $rolesByIdsite = null;
+ private $idsitesByRole = null;
+ private $identity = null; //login
+ private $isSuperUser = false;
+
+ const SUCCESS_SUPERUSER_AUTH_CODE = 42;
+
+ static private $availableRoles = array('anonymous', 'view', 'admin', 'superuser');
+
+ public function __construct( $auth)
+ {
+ $this->auth = $auth;
+ $this->loadRoles();
+ }
+
+ private function loadRoles()
+ {
+ $rolesByIdsite = $idsitesByRole = array();
+
+ // roles = array ( idsite => roleIdSite, idsite2 => roleIdSite2)
+ $result = $this->auth->authenticate();
+
+ // case the superUser is logged in
+ if($result->getCode() == Piwik_Access::SUCCESS_SUPERUSER_AUTH_CODE)
+ {
+ $this->isSuperUser = true;
+ $sitesId = Piwik_SitesManager::getAllSitesId();
+ foreach($sitesId as $idSite)
+ {
+ $rolesByIdsite[$idSite] = 'superuser';
+ $idsitesByRole['superuser'][] = $idSite;
+ }
+ }
+ // valid authentification (normal user logged in)
+ elseif($result->isValid())
+ {
+ $this->identity = $result->getIdentity();
+
+ $db = Zend_Registry::get('db');
+ $rolesRaw = $db->fetchAll("SELECT role, idsite FROM ".Piwik::prefixTable('role').
+ " WHERE login=?", $this->identity);
+
+ foreach($rolesRaw as $role)
+ {
+ $rolesByIdsite[$role['idsite']] = $role['role'];
+ $idsitesByRole[$role['role']][] = $role['idsite'];
+ }
+ }
+
+ $this->rolesByIdsite = $rolesByIdsite;
+ $this->idsitesByRole = $idsitesByRole;
+ }
+
+ static public function getListRoles()
+ {
+ return self::$availableRoles;
+ }
+
+ private function isRoleAllowed( $roleRequired, $idSite )
+ {
+ // if no role specified, the current role is anonymous
+ $role = 'anonymous';
+
+ if(isset($this->rolesByIdsite[$idSite]))
+ {
+ $role = $this->rolesByIdsite[$idSite];
+ }
+
+ switch($roleRequired)
+ {
+ case 'anonymous':
+ return true;
+ break;
+
+ case 'view':
+ return ($role == 'view' || $role == 'admin' || $role == 'superuser');
+ break;
+
+ case 'admin':
+ return ($role == 'admin' || $role == 'superuser');
+ break;
+
+ case 'superuser':
+ return ($role == 'superuser');
+ break;
+ }
+ }
+
+ public function getIdsitesWithViewAccess()
+ {
+ return $this->idsitesByRole['view'];
+ }
+ public function getIdsitesWithAdminAccess()
+ {
+ return array_merge(
+ $this->idsitesByRole['view'],
+ $this->idsitesByRole['admin']);
+
+ }
+ // is the current authentificated user allowed to access
+ // the method with the idsite given the minimumRole
+ // false means no IdSite provided to the method. null means apply the method to all the websites on which the user has
+ // the access required.
+ public function isAllowed( $minimumRole, $idSites = false )
+ {
+ // *use cases
+ // view + 1/2/3 with 1/2 view and 3 anonymous => refused
+ // view + 1/2/3 with 1/2 view and 3 admin => allowed
+ // view + 1/2/3 with 1/2 anonymous and 3 admin => refused
+ // view + null with 1/2 anonymous and 3 admin => allowed
+ // admin + null with 1/2 view => refused
+ // admin + 1 with 1 view => refused
+ // admin + 1 with 1 admin => allowed
+ // admin + null with 1 admin => allowed
+ // superuser + 1 with 1 admin => refused
+ if(is_null($idSites))
+ {
+ if(isset($this->idsitesByRole[$minimumRole]))
+ {
+ $idSites = $this->idsitesByRole[$minimumRole];
+ }
+ else
+ {
+ $idSites = array();
+ }
+ }
+
+ // when the method called doesn't accept an IdSite parameter, then we must be a superUser
+ if($idSites === false)
+ {
+ if(!$this->isSuperUser)
+ {
+ throw new Exception("Access to this resource requires a 'superuser' role.");
+ }
+ }
+ else
+ {
+ if(!is_array($idSites))
+ {
+ $idSites = array($idSites);
+ }
+
+ // when the method called accepts an IdSite parameter, then we test that the user has a minimumRole matching
+ // for at least one website. For example, if the minimumRole is "admin" then the user must have at least
+ // one "admin" role for a website to be allowed to execute the method.
+ // Then the method itself must take care of restricting its scope on the website with the "admin" right.
+ elseif(count($idSites) > 0)
+ {
+ foreach($idSites as $idsite)
+ {
+ if(!$this->isRoleAllowed($minimumRole, $idsite))
+ {
+ throw new Exception("Access to this resource requires a '$minimumRole' role for the idsite = $idsite.");
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+}
+
+?>
diff --git a/modules/Apiable.php b/modules/Apiable.php
new file mode 100755
index 0000000000..824f2d8aee
--- /dev/null
+++ b/modules/Apiable.php
@@ -0,0 +1,21 @@
+<?php
+class Piwik_Apiable
+{
+ protected function __construct()
+ {
+ }
+
+ public function getMinimumRoleRequired( $methodName )
+ {
+ if(isset($this->roles[$methodName]))
+ {
+ $minimumRole = $this->roles[$methodName];
+ }
+ else
+ {
+ $minimumRole = 'superuser';
+ }
+ return $minimumRole;
+ }
+}
+?> \ No newline at end of file
diff --git a/modules/Config.php b/modules/Config.php
new file mode 100755
index 0000000000..267a71e3ba
--- /dev/null
+++ b/modules/Config.php
@@ -0,0 +1,26 @@
+<?php
+class Piwik_Config extends Zend_Config_Ini
+{
+ function __construct()
+ {
+ $pathIniFile = PIWIK_INCLUDE_PATH . '/config/config.ini';
+
+ parent::__construct($pathIniFile, null, true);
+
+ Zend_Registry::set('config', $this);
+
+ $this->setPrefixTables();
+ }
+
+ public function setTestEnvironment()
+ {
+ $this->database = $this->database_tests;
+ $this->setPrefixTables();
+ }
+
+ public function setPrefixTables()
+ {
+ Zend_Registry::set('tablesPrefix', $this->database->tables_prefix);
+ }
+}
+?>
diff --git a/modules/ErrorHandler.php b/modules/ErrorHandler.php
new file mode 100755
index 0000000000..5a30682815
--- /dev/null
+++ b/modules/ErrorHandler.php
@@ -0,0 +1,35 @@
+<?php
+function Piwik_ErrorHandler($errno, $errstr, $errfile, $errline)
+{
+ $errno = $errno & error_reporting();
+ if($errno == 0) return;
+ if(!defined('E_STRICT')) define('E_STRICT', 2048);
+ if(!defined('E_RECOVERABLE_ERROR')) define('E_RECOVERABLE_ERROR', 4096);
+ print "\n<div style='word-wrap: break-word; border: 3px solid red; padding:4px; width:70%; background-color:#FFFF96;'><b>";
+ switch($errno){
+ case E_ERROR: print "Error"; break;
+ case E_WARNING: print "Warning"; break;
+ case E_PARSE: print "Parse Error"; break;
+ case E_NOTICE: print "Notice"; break;
+ case E_CORE_ERROR: print "Core Error"; break;
+ case E_CORE_WARNING: print "Core Warning"; break;
+ case E_COMPILE_ERROR: print "Compile Error"; break;
+ case E_COMPILE_WARNING: print "Compile Warning"; break;
+ case E_USER_ERROR: print "User Error"; break;
+ case E_USER_WARNING: print "User Warning"; break;
+ case E_USER_NOTICE: print "User Notice"; break;
+ case E_STRICT: print "Strict Notice"; break;
+ case E_RECOVERABLE_ERROR: print "Recoverable Error"; break;
+ default: print "Unknown error ($errno)"; break;
+ }
+ print ":</b> <i>$errstr</i> in <b>$errfile</b> on line <b>$errline</b>\n";
+ print("<br><br>Backtrace --><DIV style='font-family:Courier;font-size:10pt'>");
+
+ ob_start();
+ debug_print_backtrace();
+ $out1 = ob_get_clean();
+ print(str_replace("\n", "<br>", $out1));
+ print("</div><br><br>");
+ print "\n</pre></div><br>";
+}
+?>
diff --git a/modules/Log.php b/modules/Log.php
new file mode 100755
index 0000000000..169364e388
--- /dev/null
+++ b/modules/Log.php
@@ -0,0 +1,20 @@
+<?php
+Zend_Loader::loadClass('Zend_Log');
+Zend_Loader::loadClass('Zend_Registry');
+
+class Piwik_Log extends Zend_Log
+{
+ function __construct()
+ {
+ parent::__construct();
+
+ Zend_Loader::loadClass('Zend_Log_Writer_Stream');
+ $writer = new Zend_Log_Writer_Stream('php://output');
+ $formatter = new Zend_Log_Formatter_Simple('%message% <br>' . PHP_EOL);
+ $writer->setFormatter($formatter);
+ $this->addWriter($writer);
+ Zend_Registry::set('logger', $this);
+ }
+}
+
+?>
diff --git a/modules/Piwik.php b/modules/Piwik.php
new file mode 100755
index 0000000000..b5b7b20afd
--- /dev/null
+++ b/modules/Piwik.php
@@ -0,0 +1,166 @@
+<?php
+
+class Piwik
+{
+ const CLASSES_PREFIX = "Piwik_";
+
+ static public function log($message, $priority = Zend_Log::NOTICE)
+ {
+ Zend_Registry::get('logger')->log($message . PHP_EOL, $priority);
+ }
+
+ static public function getTablesCreateSql()
+ {
+ $config = Zend_Registry::get('config');
+ $prefixTables = $config->database->tables_prefix;
+ $tables = array(
+ 'user' => "CREATE TABLE {$prefixTables}user (
+ login VARCHAR(20) NOT NULL,
+ password CHAR(32) NOT NULL,
+ alias VARCHAR(45) NOT NULL,
+ email VARCHAR(100) NOT NULL,
+ token_auth CHAR(32) NOT NULL,
+ date_registered TIMESTAMP NOT NULL,
+ PRIMARY KEY(login)
+ )
+ ",
+
+ 'role' => "CREATE TABLE {$prefixTables}role (
+ login VARCHAR(20) NOT NULL,
+ idsite INTEGER UNSIGNED NOT NULL,
+ role VARCHAR(10) NULL,
+ PRIMARY KEY(login, idsite)
+ )
+ ",
+
+ 'site' => "CREATE TABLE {$prefixTables}site (
+ idsite INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+ name VARCHAR(90) NOT NULL,
+ main_url VARCHAR(255) NOT NULL,
+ PRIMARY KEY(idsite)
+ )
+ ",
+
+ 'site_url' => "CREATE TABLE {$prefixTables}site_url (
+ idsite INTEGER(10) UNSIGNED NOT NULL,
+ url VARCHAR(255) NOT NULL,
+ PRIMARY KEY(idsite, url)
+ )
+ ",
+
+ );
+ return $tables;
+ }
+
+ static public function prefixClass( $class )
+ {
+ if(substr_count($class, Piwik::CLASSES_PREFIX) > 0)
+ {
+ return $class;
+ }
+ return Piwik::CLASSES_PREFIX.$class;
+ }
+
+ static public function prefixTable( $table )
+ {
+ $config = Zend_Registry::get('config');
+ $prefixTables = $config->database->tables_prefix;
+ return $prefixTables . $table;
+ }
+
+ static public function getTablesNames()
+ {
+ $aTables = array_keys(self::getTablesCreateSql());
+ $config = Zend_Registry::get('config');
+ $prefixTables = $config->database->tables_prefix;
+ $return = array();
+ foreach($aTables as $table)
+ {
+ $return[] = $prefixTables.$table;
+ }
+ return $return;
+ }
+
+ static public function getTablesInstalled()
+ {
+ $allMyTables = self::getTablesNames();
+
+ $db = Zend_Registry::get('db');
+ $allTables = $db->fetchCol('SHOW TABLES');
+
+ $intersect = array_intersect($allTables, $allMyTables);
+
+ return $intersect;
+ }
+
+ static public function createDatabase()
+ {
+ $db = Zend_Registry::get('db');
+ $dbName = Zend_Registry::get('config')->database->dbname;
+ $db->query("CREATE DATABASE IF NOT EXISTS ".$dbName);
+ }
+
+ static public function dropDatabase()
+ {
+ $db = Zend_Registry::get('db');
+ $dbName = Zend_Registry::get('config')->database->dbname;
+ $db->query("DROP DATABASE IF EXISTS ".$dbName);
+ }
+
+
+ static public function createDatabaseObject()
+ {
+ $config = Zend_Registry::get('config');
+ $db = Zend_Db::factory($config->database->adapter, $config->database->toArray());
+ Zend_Db_Table::setDefaultAdapter($db);
+ Zend_Registry::set('db', $db);
+ }
+
+ static public function createLogObject()
+ {
+ $log = new Piwik_Log;
+ }
+ static public function createConfigObject()
+ {
+ $config = new Piwik_Config;
+
+ assert(count($config) != 0);
+ }
+
+ static public function createTables()
+ {
+ $db = Zend_Registry::get('db');
+
+ $config = Zend_Registry::get('config');
+ $prefixTables = $config->database->tables_prefix;
+
+ Piwik::log("Creating ". implode(", ", self::getTablesNames()));
+
+ $tablesToCreate = self::getTablesCreateSql();
+
+ $tablesAlreadyInstalled = self::getTablesInstalled();
+
+ foreach($tablesToCreate as $tableName => $tableSql)
+ {
+ $tableName = $prefixTables . $tableName;
+
+ // if the table doesn't exist already
+ if(!in_array($tableName, $tablesAlreadyInstalled))
+ {
+ $db->query( $tableSql );
+ }
+ }
+ }
+
+ static public function uninstall()
+ {
+ // delete tables
+ //create tables
+ $db = Zend_Registry::get('db');
+
+ Piwik::log("Droping ". implode(", ", self::getTablesNames()));
+
+ $db->query( "DROP TABLE IF EXISTS ". implode(", ", self::getTablesNames()) );
+ }
+}
+?>
diff --git a/modules/PublicApi.php b/modules/PublicApi.php
new file mode 100755
index 0000000000..c536e1025b
--- /dev/null
+++ b/modules/PublicApi.php
@@ -0,0 +1,217 @@
+<?php
+class Piwik_PublicApi
+{
+ static $classCalled = null;
+ private $api = null;
+
+ private $methodsNotToPublish = array('getMinimumRoleRequired');
+
+ static private $instance = null;
+ protected function __construct()
+ {}
+
+ static public function getInstance()
+ {
+ if (self::$instance == null)
+ {
+ $c = __CLASS__;
+ self::$instance = new $c();
+ }
+ return self::$instance;
+ }
+
+ public function registerClass( $class )
+ {
+ Zend_Loader::loadClass($class);
+
+ $rClass = new ReflectionClass($class);
+
+ if(!$rClass->isSubclassOf(new ReflectionClass("Piwik_Apiable")))
+ {
+ throw new Exception("To publish its public methods in the API, the class '$class' must be a subclass of 'Piwik_Apiable'.");
+ }
+
+ Piwik::log("List of the public methods for the class $class");
+
+ $rMethods = $rClass->getMethods();
+ foreach($rMethods as $method)
+ {
+ if($method->isPublic()
+ && !$method->isConstructor()
+ && !in_array($method->getName(), $this->methodsNotToPublish )
+ )
+ {
+ $name = $method->getName();
+
+ $parameters = $method->getParameters();
+
+ $aParameters = array();
+ foreach($parameters as $parameter)
+ {
+ $nameVariable = $parameter->getName();
+
+ $defaultValue = '';
+ if($parameter->isDefaultValueAvailable())
+ {
+ $defaultValue = $parameter->getDefaultValue();
+ }
+
+ $aParameters[$nameVariable] = $defaultValue;
+ }
+ $this->api[$class][$name]['parameters'] = $aParameters;
+ $this->api[$class][$name]['numberOfRequiredParameters'] = $method->getNumberOfRequiredParameters();
+
+ Piwik::log("- $name is public ".$this->getStrListParameters($class, $name));
+ }
+ }
+ }
+
+ private function getStrListParameters($class, $name)
+ {
+ $aParameters = $this->getParametersList($class, $name);
+ $asParameters = array();
+ foreach($aParameters as $nameVariable=> $defaultValue)
+ {
+ $str = $nameVariable;
+ if(!empty($defaultValue))
+ {
+ $str .= " = $defaultValue";
+ }
+ $asParameters[] = $str;
+ }
+ $sParameters = implode(", ", $asParameters);
+ return "[$sParameters]";
+ }
+ private function getParametersList($class, $name)
+ {
+ return $this->api[$class][$name]['parameters'];
+ }
+ private function getNumberOfRequiredParameters($class, $name)
+ {
+ return $this->api[$class][$name]['numberOfRequiredParameters'];
+ }
+
+ private function isMethodAvailable( $className, $methodName)
+ {
+ return isset($this->api[$className][$methodName]);
+ }
+ public function __get($name)
+ {
+ self::$classCalled = $name;
+ return $this;
+ }
+
+ private function getIdSitesParameter($class, $name, $parameters)
+ {
+ $paramsDefaultValues = $this->getParametersList($class, $name);
+ $parametersNames = array_keys($paramsDefaultValues);
+ $parametersNames = array_map("strtolower", $parametersNames);
+
+ $sitesIdToLookFor = array("idsites", "idsite", "sitesid", "siteid", "siteids");
+
+ $newlyFound = false;
+ $found = false;
+ foreach($sitesIdToLookFor as $strIdSite)
+ {
+ $newlyFound = array_search($strIdSite, $parametersNames);
+ if($newlyFound !== false
+ && $found !== false)
+ {
+ throw new Exception("
+ It seems that the parameters list ".$this->getStrListParameters($class, $name)." contains two potential IdSite parameters.
+ Please rename the method parameters so that only one IdSite can be found in the method parameters list.
+ The following string are considered as being idSite parameter names : [".implode(", ", $sitesIdToLookFor)."]" );
+ }
+ elseif($newlyFound !== false)
+ {
+ $found = $newlyFound;
+ }
+ }
+
+ if($found===false)
+ {
+ return false;
+ }
+ else
+ {
+ if(isset($parameters[$found]))
+ {
+ $parameters[$found];
+ }
+ else
+ {
+ $values = array_values($paramsDefaultValues);
+ if(isset($values[$found]))
+ {
+ return $values[$found];
+ }
+ else
+ {
+ exit("must test this case and the other ones...");
+ }
+ }
+ }
+ }
+
+ private function checkNumberOfParametersMatch($className, $methodName, $parameters)
+ {
+ $nbParamsGiven = count($parameters);
+ $nbParamsRequired = $this->getNumberOfRequiredParameters($className, $methodName);
+
+ if($nbParamsGiven < $nbParamsRequired)
+ {
+ throw new Exception("The number of parameters provided ($nbParamsGiven) is less than the number of required parameters ($nbParamsRequired) for this method.
+ Please check the method API.");
+ }
+ elseif($nbParamsGiven > $nbParamsRequired)
+ {
+ throw new Exception("The number of parameters provided ($nbParamsGiven) is greater than the number of required parameters ($nbParamsRequired) for this method.
+ Please check the method API.");
+ }
+ return true;
+
+ }
+ public function __call($methodName, $parameters )
+ {
+ assert(!is_null(self::$classCalled));
+
+ $args = @implode(", ", $parameters);
+
+ $className = Piwik::prefixClass(self::$classCalled);
+ if(!method_exists("$className", "getInstance"))
+ {
+ throw new Exception("Objects that provide an API must be Singleton and have a 'static public function getInstance()' method.");
+ }
+ $object = null;
+ eval("\$object = $className::getInstance();");
+
+ // check method exists
+ if(!$this->isMethodAvailable($className, $methodName))
+ {
+ throw new Exception("The method '$methodName' does not exist or is not available in the module '".self::$classCalled."'.");
+ }
+ Piwik::log("Calling ".self::$classCalled.".$methodName [$args]");
+
+ try {
+ // first check number of parameters do match
+ $this->checkNumberOfParametersMatch($className, $methodName, $parameters);
+
+ $idSites = $this->getIdSitesParameter($className, $methodName, $parameters);
+
+ $access = Zend_Registry::get('access');
+ $access->isAllowed( $object->getMinimumRoleRequired($methodName), $idSites);
+ Piwik::log('Access granted!');
+
+ // call the method
+ call_user_func(array($object, $methodName), $parameters);
+ }
+ catch( Exception $e)
+ {
+ Piwik::log("Error during API call...". $e->getMessage());
+ exit;
+ }
+
+ self::$classCalled = null;
+ }
+}
+?> \ No newline at end of file
diff --git a/modules/SitesManager.php b/modules/SitesManager.php
new file mode 100755
index 0000000000..9ffd74b61f
--- /dev/null
+++ b/modules/SitesManager.php
@@ -0,0 +1,194 @@
+<?php
+
+class Piwik_SitesManager extends Piwik_APIable
+{
+ static private $instance = null;
+ protected function __construct()
+ {
+ parent::__construct();
+ }
+
+ static public function getInstance()
+ {
+ if (self::$instance == null)
+ {
+ $c = __CLASS__;
+ self::$instance = new $c();
+ }
+ return self::$instance;
+ }
+
+ protected $roles = array(
+ 'getSites' => 'anonymous',
+ 'getSitesId' => 'anonymous',
+ 'getSiteUrlsFromId' => 'view',
+ 'replaceSiteUrls' => 'admin',
+ 'siteExists' => 'anonymous',
+ );
+
+ static private function checkName($name)
+ {
+ if(empty($name))
+ {
+ throw new Exception("The site name can't be empty.");
+ }
+ }
+
+ static private function checkUrls($aUrls)
+ {
+ foreach($aUrls as $url)
+ {
+ if(!self::isValidUrl($url))
+ {
+ throw new Exception("The url '$url' is not a valid URL.");
+ }
+ }
+ }
+
+ static private function cleanParameterUrls( $aUrls )
+ {
+ if(!is_array($aUrls))
+ {
+ $aUrls = array($aUrls);
+ }
+ foreach($aUrls as &$url)
+ {
+ $url = self::removeTrailingSlash($url);
+ }
+ return $aUrls;
+ }
+
+ static private function checkIdsite($idsite)
+ {
+ if(!is_int($idsite)
+ || $idsite <= 0)
+ {
+ throw new Exception("Idsite must be an integer > 0.");
+ }
+
+ if(!self::siteExists($idsite))
+ {
+ throw new Exception("The site with Idsite = $idsite doesn't exist.");
+ }
+ }
+
+ static public function addSite( $name, $aUrls )
+ {
+ self::checkName($name);
+ $aUrls = self::cleanParameterUrls($aUrls);
+ self::checkUrls($aUrls);
+
+ if(count($aUrls) == 0)
+ {
+ throw new Exception("You must specify at least one URL for the site.");
+ }
+
+ $db = Zend_Registry::get('db');
+
+ $url = $aUrls[0];
+ $aUrls = array_slice($aUrls, 1);
+
+ $db->insert(Piwik::prefixTable("site"), array(
+ 'name' => $name,
+ 'main_url' => $url,
+ )
+ );
+
+ $idSite = $db->lastInsertId();
+
+ self::insertSiteUrls($idSite, $aUrls);
+ }
+
+ static private function insertSiteUrls($idSite, $aUrls)
+ {
+ $db = Zend_Registry::get('db');
+ foreach($aUrls as $url)
+ {
+ $db->insert(Piwik::prefixTable("site_url"), array(
+ 'idsite' => $idSite,
+ 'url' => $url
+ )
+ );
+ }
+ }
+
+ static public function addSiteUrls( $idsite, $aUrls)
+ {
+ $urls = self::getSiteUrlsFromId($idsite);
+ $toInsert = array_diff($aUrls, $urls);
+ self::insertSiteUrls($idsite, $toInsert);
+ }
+
+ static public function replaceSiteUrls( $idsite, $aUrls)
+ {
+ self::checkIdsite($idsite);
+ $aUrls = self::cleanParameterUrls($aUrls);
+ self::checkUrls($aUrls);
+
+ self::deleteSiteUrls($idsite);
+ self::addSiteUrls($idsite, $aUrls);
+ }
+
+ static private function deleteSiteUrls($idsite)
+ {
+ $db = Zend_Registry::get('db');
+ $db->query("DELETE FROM ".Piwik::prefixTable("site_url") ." WHERE idsite = ?", $idsite);
+ }
+
+ static public function getSites()
+ {
+ $db = Zend_Registry::get('db');
+ $sites = $db->fetchAll("SELECT * FROM ".Piwik::prefixTable("site"));
+ return $sites;
+ }
+
+ static public function getSiteUrlsFromId( $idsite )
+ {
+ $db = Zend_Registry::get('db');
+ $urls = $db->fetchCol("SELECT url FROM ".Piwik::prefixTable("site_url"). " WHERE idsite = ?", $idsite);
+ return $urls;
+ }
+ static public function getSitesId()
+ {
+ $sites = self::getSites();
+ $aSitesId = array();
+ foreach($sites as $site)
+ {
+ $aSitesId[] = $site["idsite"];
+ }
+ return $aSitesId;
+ }
+
+ static public function getAllSitesId()
+ {
+ $db = Zend_Registry::get('db');
+ $idSites = $db->fetchCol("SELECT idsite FROM ".Piwik::prefixTable('site'));
+ return $idSites;
+ }
+
+ static public function getSitesIdWithAdminAccess()
+ {
+ return array();
+ }
+
+ static public function siteExists( $idsite )
+ {
+ $sites = self::getSitesId();
+ return in_array($idsite, $sites);
+ }
+
+ static private function removeTrailingSlash($url)
+ {
+ // if there is a final slash, we take the URL without this slash (expected URL format)
+ if($url[strlen($url)-1] == '/')
+ {
+ $url = substr($url,0,strlen($url)-1);
+ }
+ return $url;
+ }
+ static private function isValidUrl( $url )
+ {
+ return ereg('^http[s]?://[A-Za-z0-9\/_.-]', $url);
+ }
+}
+?>
diff --git a/modules/UsersManager.php b/modules/UsersManager.php
new file mode 100755
index 0000000000..a09fd57f28
--- /dev/null
+++ b/modules/UsersManager.php
@@ -0,0 +1,190 @@
+<?php
+//
+// getSiteFromId( id )
+// getSiteFromUrl( mainUrl )
+// getSites( accessType )
+// getNumberOfSites()
+// getNumberOfSitesWithAdminAccess()
+Zend_Loader::loadClass("Piwik_Access");
+
+
+class Piwik_UsersManager extends Piwik_APIable
+{
+//
+// getUsersExtended()
+//
+// getUserFromLogin( login )
+// getUserFromEmail( email )
+//
+ static private $instance = null;
+ protected function __construct()
+ {
+ parent::__construct();
+ }
+
+ static public function getInstance()
+ {
+ if (self::$instance == null)
+ {
+ $c = __CLASS__;
+ self::$instance = new $c();
+ }
+ return self::$instance;
+ }
+
+ static public function getUsers()
+ {
+ $db = Zend_Registry::get('db');
+ $prefix = Zend_Registry::get("tablesPrefix");
+ $users = $db->fetchCol("SELECT login FROM ".Piwik::prefixTable("user"));
+ return $users;
+ }
+
+ static public function addUser( $userLogin, $password, $alias, $email )
+ {
+ if(self::userExists($userLogin))
+ {
+ throw new Exception("Login $login already exists.");
+ }
+ if(!self::isValidLoginString($userLogin))
+ {
+ throw new Exception("The login must contain only letters, numbers, or the characters '_' or '-' or '.'.");
+ }
+ if(!self::isValidPasswordString($password))
+ {
+ throw new Exception("The password must contain at least 6 characters including at least one number.");
+ }
+ if(!self::isValidEmailString($email))
+ {
+ throw new Exception("The email doesn't have a valid format.");
+ }
+
+ $db = Zend_Registry::get('db');
+
+ $db->insert( Piwik::prefixTable("user"), array(
+ 'login' => $userLogin,
+ 'password' => md5($password),
+ 'alias' => $alias,
+ 'email' => $email,
+ 'token_auth' => self::getTokenAuth($userLogin,$password)
+ )
+ );
+
+
+ }
+
+ static public function deleteUser( $userLogin )
+ {
+ if(!self::userExists($userLogin))
+ {
+ throw new Exception("User $userLogin doesn't exist therefore it can't be deleted.");
+ }
+
+ $db = Zend_Registry::get('db');
+ $db->query("DELETE FROM ".Piwik::prefixTable("user")." WHERE login = ?", $userLogin);
+
+ }
+
+ static public function userExists( $userLogin )
+ {
+ $aLogins = self::getUsers();
+ return in_array($userLogin, $aLogins);
+ }
+
+ // role = anonymous / view / admin / superuser
+ static public function setUserRole( $role, $userLogin, $idSites = null)
+ {
+ $roles = Piwik_Access::getListRoles();
+ // do not allow to set the superUser role
+ unset($roles[array_search("superuser", $roles)]);
+
+ if(!in_array($role,$roles))
+ {
+ throw new Exception("The parameter role must have one of the following values : [ ". implode(", ", $roles)." ]");
+ }
+ if(!self::userExists($userLogin))
+ {
+ throw new Exception("User '$userLogin' doesn't exist.");
+ }
+
+ if(is_null($idSites))
+ {
+ $idSites = Piwik_SitesManager::getSitesIdWithAdminAccess();
+ }
+ elseif(!is_array($idSites))
+ {
+ $idSites = array($idSites);
+ }
+
+ foreach($idSites as $idsite)
+ {
+ if( !is_null($idsite)
+ && !Piwik_SitesManager::siteExists($idsite))
+ {
+ throw new Exception("Site id = $idsite doesn't exist.");
+ }
+ }
+
+ // delete UserRole
+ $db = Zend_Registry::get('db');
+
+ foreach($idSites as $idsite)
+ {
+ $db->query( "DELETE FROM ".Piwik::prefixTable("role").
+ " WHERE idsite = ? AND login = ?",
+ array($idsite, $userLogin)
+ );
+ }
+
+ // if the role is anonymous then we don't save it as this is the default value
+ // when no role are specified
+ if($role != "anonymous")
+ {
+ foreach($idSites as $idsite)
+ {
+ $db->insert( Piwik::prefixTable("role"),
+ array( "idsite" => $idsite,
+ "login" => $userLogin,
+ "role" => $role)
+ );
+ }
+ }
+
+ }
+
+ static private function getTokenAuth($userLogin, $password)
+ {
+ return md5($userLogin . $password . time());
+
+ }
+ static private function isValidEmailString( $email )
+ {
+ return (preg_match('/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z]{2,4}$/', $email) > 0);
+ }
+
+ static private function isValidLoginString( $input )
+ {
+ return preg_match('/^[A-Za-z0-9\_\.-]*$/', $input) > 0;
+ }
+
+ static private function isValidPasswordString( $input )
+ {
+ $isNumeric = false;
+
+ $l = strlen($input);
+ if( $l < 6)
+ {
+ return false;
+ }
+
+ for($i = 0; $i < $l ; $i++)
+ {
+ if(is_numeric($input[$i]))
+ {
+ $isNumeric=true;
+ }
+ }
+ return $isNumeric;
+ }
+
+} \ No newline at end of file
diff --git a/tests/all_tests.php b/tests/all_tests.php
new file mode 100755
index 0000000000..ca86d5da33
--- /dev/null
+++ b/tests/all_tests.php
@@ -0,0 +1,52 @@
+<?php
+if(!defined("PATH_TEST_TO_ROOT")) {
+ define('PATH_TEST_TO_ROOT', '..');
+}
+require_once PATH_TEST_TO_ROOT . "/tests/config_test.php";
+
+/*
+assertTrue($x) Fail if $x is false
+assertFalse($x) Fail if $x is true
+assertNull($x) Fail if $x is set
+assertNotNull($x) Fail if $x not set
+assertIsA($x, $t) Fail if $x is not the class or type $t
+assertNotA($x, $t) Fail if $x is of the class or type $t
+assertEqual($x, $y) Fail if $x == $y is false
+assertNotEqual($x, $y) Fail if $x == $y is true
+assertWithinMargin($x, $y, $m) Fail if abs($x - $y) < $m is false
+assertOutsideMargin($x, $y, $m) Fail if abs($x - $y) < $m is true
+assertIdentical($x, $y) Fail if $x == $y is false or a type mismatch
+assertNotIdentical($x, $y) Fail if $x == $y is true and types match
+assertReference($x, $y) Fail unless $x and $y are the same variable
+assertClone($x, $y) Fail unless $x and $y are identical copies
+assertPattern($p, $x) Fail unless the regex $p matches $x
+assertNoPattern($p, $x) Fail if the regex $p matches $x
+expectError($x) Swallows any upcoming matching error
+assert($e) Fail on failed expectation object $e
+ */
+require_once(SIMPLE_TEST . 'unit_tester.php');
+require_once(SIMPLE_TEST . 'reporter.php');
+
+$test = &new GroupTest('All Piwik Tests');
+
+$toInclude = array();
+
+foreach(glob("*/*.php") as $file)
+{
+ if(!ereg("simpletest/",$file))
+ {
+ $toInclude[] = $file;
+ }
+}
+
+foreach($toInclude as $file)
+{
+ if(substr_count($file,"test.php")==0)
+ {
+ print("The file $file doesn't end with the '.test.php' extension. \n<br>");
+ }
+
+ $test->addFile($file);
+}
+$test->run(new HtmlReporter());
+?> \ No newline at end of file
diff --git a/tests/config_test.php b/tests/config_test.php
new file mode 100755
index 0000000000..ed1e80750b
--- /dev/null
+++ b/tests/config_test.php
@@ -0,0 +1,48 @@
+<?php
+if(!defined("PATH_TEST_TO_ROOT"))
+{
+ define('PATH_TEST_TO_ROOT', '..');
+}
+
+if(!defined('PIWIK_INCLUDE_PATH'))
+{
+ define('PIWIK_INCLUDE_PATH', PATH_TEST_TO_ROOT);
+}
+
+if (! defined('SIMPLE_TEST'))
+{
+ define('SIMPLE_TEST', PATH_TEST_TO_ROOT . '/tests/simpletest/');
+}
+
+require_once SIMPLE_TEST . 'autorun.php';
+SimpleTest :: prefer(new HtmlReporter());
+
+error_reporting(E_ALL|E_NOTICE);
+date_default_timezone_set('Europe/London');
+
+set_include_path(PATH_TEST_TO_ROOT
+ . PATH_SEPARATOR . PATH_TEST_TO_ROOT . '/libs/'
+ . PATH_SEPARATOR . PATH_TEST_TO_ROOT . '/core/'
+ . PATH_SEPARATOR . PATH_TEST_TO_ROOT . '/modules'
+ . PATH_SEPARATOR . PATH_TEST_TO_ROOT . '/core/models'
+ . PATH_SEPARATOR . get_include_path());
+
+
+require_once PIWIK_INCLUDE_PATH . "/modules/ErrorHandler.php";
+set_error_handler('Piwik_ErrorHandler');
+
+require_once "Zend/Exception.php";
+require_once "Zend/Loader.php";
+
+Zend_Loader::loadClass('Zend_Config_Ini');
+Zend_Loader::loadClass('Zend_Db');
+Zend_Loader::loadClass('Zend_Db_Table');
+Zend_Loader::loadClass('Piwik_Config');
+Zend_Loader::loadClass('Piwik_Log');
+Zend_Loader::loadClass('Piwik');
+Piwik::createLogObject();
+
+assert_options(ASSERT_ACTIVE, 1);
+assert_options(ASSERT_WARNING, 1);
+assert_options(ASSERT_BAIL, 0);
+?>
diff --git a/tests/modules/Database.test.php b/tests/modules/Database.test.php
new file mode 100755
index 0000000000..b1ce6d63f9
--- /dev/null
+++ b/tests/modules/Database.test.php
@@ -0,0 +1,33 @@
+<?php
+if(!defined("PATH_TEST_TO_ROOT")) {
+ define('PATH_TEST_TO_ROOT', '../..');
+}
+require_once PATH_TEST_TO_ROOT ."/tests/config_test.php";
+
+class Test_Database extends UnitTestCase
+{
+ function __construct( $title = '')
+ {
+ parent::__construct( $title );
+ }
+
+ function setUp()
+ {
+ Piwik::log("Setup database...");
+ Piwik::createConfigObject();
+
+ // setup database
+ Piwik::createDatabaseObject();
+ Zend_Registry::get('config')->setTestEnvironment();
+
+ Piwik::createDatabase();
+ Piwik::createTables();
+ }
+
+ function tearDown()
+ {
+ Piwik::log("TearDown database...");
+ Piwik::dropDatabase();
+ }
+}
+
diff --git a/tests/modules/SitesManager.test.php b/tests/modules/SitesManager.test.php
new file mode 100755
index 0000000000..e1a0c99523
--- /dev/null
+++ b/tests/modules/SitesManager.test.php
@@ -0,0 +1,21 @@
+<?php
+if(!defined("PATH_TEST_TO_ROOT")) {
+ define('PATH_TEST_TO_ROOT', '../..');
+}
+require_once PATH_TEST_TO_ROOT ."/tests/config_test.php";
+
+require_once('Database.test.php');
+
+class Test_Piwik_SitesManager extends Test_Database
+{
+ function __construct()
+ {
+ parent::__construct('Log class test');
+ }
+
+ function testToAdd()
+ {
+
+ }
+}
+?>
diff --git a/tests/modules/blank.test.php b/tests/modules/blank.test.php
new file mode 100755
index 0000000000..a06c97b156
--- /dev/null
+++ b/tests/modules/blank.test.php
@@ -0,0 +1,20 @@
+<?php
+if (! defined('SIMPLE_TEST')) {
+ define('SIMPLE_TEST', '../simpletest/');
+}
+require_once(SIMPLE_TEST.'autorun.php');
+SimpleTest :: prefer(new HtmlReporter());
+
+class Test_Piwik_Blank extends UnitTestCase
+{
+ function __construct()
+ {
+ parent::__construct('Log class test');
+ }
+
+ function testToAdd()
+ {
+
+ }
+}
+?>
diff --git a/tests/simpletest/HELP_MY_TESTS_DONT_WORK_ANYMORE b/tests/simpletest/HELP_MY_TESTS_DONT_WORK_ANYMORE
new file mode 100755
index 0000000000..8ac9cf2aa5
--- /dev/null
+++ b/tests/simpletest/HELP_MY_TESTS_DONT_WORK_ANYMORE
@@ -0,0 +1,348 @@
+Simple Test interface changes
+=============================
+Because the SimpleTest tool set is still evolving it is likely that tests
+written with earlier versions will fail with the newest ones. The most
+dramatic changes are in the alpha releases. Here is a list of possible
+problems and their fixes...
+
+No method getRelativeUrls() or getAbsoluteUrls()
+------------------------------------------------
+These methods were always a bit weird anyway, and
+the new parsing of the base tag makes them more so.
+They have been replaced with getUrls() instead. If
+you want the old functionality then simply chop
+off the current domain from getUrl().
+
+Method setWildcard() removed in mocks
+-------------------------------------
+Even setWildcard() has been removed in 1.0.1beta now.
+If you want to test explicitely for a '*' string, then
+simply pass in new IdenticalExpectation('*') instead.
+
+No method _getTest() on mocks
+-----------------------------
+This has finally been removed. It was a pretty esoteric
+flex point anyway. It was there to allow the mocks to
+work with other test tools, but no one does this.
+
+No method assertError(), assertNoErrors(), swallowErrors()
+----------------------------------------------------------
+These have been deprecated in 1.0.1beta in favour of
+expectError() and expectException(). assertNoErrors() is
+redundant if you use expectError() as failures are now reported
+immediately.
+
+No method TestCase::signal()
+----------------------------
+This has been deprecated in favour of triggering an error or
+throwing an exception. Deprecated as of 1.0.1beta.
+
+No method TestCase::sendMessage()
+---------------------------------
+This has been deprecated as of 1.0.1beta.
+
+Failure to connect now emits failures
+-------------------------------------
+It used to be that you would have to use the
+getTransferError() call on the web tester to see if
+there was a socket level error in a fetch. This check
+is now always carried out by the WebTestCase unless
+the fetch is prefaced with WebTestCase::ignoreErrors().
+The ignore directive only lasts for test case fetching
+action such as get() and click().
+
+No method SimpleTestOptions::ignore()
+-------------------------------------
+This is deprecated in version 1.0.1beta and has been moved
+to SimpleTest::ignore() as that is more readable. In
+addition, parent classes are also ignored automatically.
+If you are using PHP5 you can skip this directive simply
+by marking your test case as abstract.
+
+No method assertCopy()
+----------------------
+This is deprecated in 1.0.1 in favour of assertClone().
+The assertClone() method is slightly different in that
+the objects must be identical, but without being a
+reference. It is thus not a strict inversion of
+assertReference().
+
+Constructor wildcard override has no effect in mocks
+----------------------------------------------------
+As of 1.0.1beta this is now set with setWildcard() instead
+of in the constructor.
+
+No methods setStubBaseClass()/getStubBaseClass()
+------------------------------------------------
+As mocks are now used instead of stubs, these methods
+stopped working and are now removed as of the 1.0.1beta
+release. The mock objects may be freely used instead.
+
+No method addPartialMockCode()
+------------------------------
+The ability to insert arbitrary partial mock code
+has been removed. This was a low value feature
+causing needless complications. It was removed
+in the 1.0.1beta release.
+
+No method setMockBaseClass()
+----------------------------
+The ability to change the mock base class has been
+scheduled for removal and is deprecated since the
+1.0.1beta version. This was a rarely used feature
+except as a workaround for PHP5 limitations. As
+these limitations are being resolved it's hoped
+that the bundled mocks can be used directly.
+
+No class Stub
+-------------
+Server stubs are deprecated from 1.0.1 as the mocks now
+have exactly the same interface. Just use mock objects
+instead.
+
+No class SimpleTestOptions
+--------------------------
+This was replced by the shorter SimpleTest in 1.0.1beta1
+and is since deprecated.
+
+No file simple_test.php
+-----------------------
+This was renamed test_case.php in 1.0.1beta to more accurately
+reflect it's purpose. This file should never be directly
+included in test suites though, as it's part of the
+underlying mechanics and has a tendency to be refactored.
+
+No class WantedPatternExpectation
+---------------------------------
+This was deprecated in 1.0.1alpha in favour of the simpler
+name PatternExpectation.
+
+No class NoUnwantedPatternExpectation
+-------------------------------------
+This was deprecated in 1.0.1alpha in favour of the simpler
+name NoPatternExpectation.
+
+No method assertNoUnwantedPattern()
+-----------------------------------
+This has been renamed to assertNoPattern() in 1.0.1alpha and
+the old form is deprecated.
+
+No method assertWantedPattern()
+-------------------------------
+This has been renamed to assertPattern() in 1.0.1alpha and
+the old form is deprecated.
+
+No method assertExpectation()
+-----------------------------
+This was renamed as assert() in 1.0.1alpha and the old form
+has been deprecated.
+
+No class WildcardExpectation
+----------------------------
+This was a mostly internal class for the mock objects. It was
+renamed AnythingExpectation to bring it closer to JMock and
+NMock in version 1.0.1alpha.
+
+Missing UnitTestCase::assertErrorPattern()
+------------------------------------------
+This method is deprecated for version 1.0.1 onwards.
+This method has been subsumed by assertError() that can now
+take an expectation. Simply pass a PatternExpectation
+into assertError() to simulate the old behaviour.
+
+No HTML when matching page elements
+-----------------------------------
+This behaviour has been switched to using plain text as if it
+were seen by the user of the browser. This means that HTML tags
+are suppressed, entities are converted and whitespace is
+normalised. This should make it easier to match items in forms.
+Also images are replaced with their "alt" text so that they
+can be matched as well.
+
+No method SimpleRunner::_getTestCase()
+--------------------------------------
+This was made public as getTestCase() in 1.0RC2.
+
+No method restartSession()
+--------------------------
+This was renamed to restart() in the WebTestCase, SimpleBrowser
+and the underlying SimpleUserAgent in 1.0RC2. Because it was
+undocumented anyway, no attempt was made at backward
+compatibility.
+
+My custom test case ignored by tally()
+--------------------------------------
+The _assertTrue method has had it's signature changed due to a bug
+in the PHP 5.0.1 release. You must now use getTest() from within
+that method to get the test case. Mock compatibility with other
+unit testers is now deprecated as of 1.0.1alpha as PEAR::PHPUnit2
+should soon have mock support of it's own.
+
+Broken code extending SimpleRunner
+----------------------------------
+This was replaced with SimpleScorer so that I could use the runner
+name in another class. This happened in RC1 development and there
+is no easy backward compatibility fix. The solution is simply to
+extend SimpleScorer instead.
+
+Missing method getBaseCookieValue()
+-----------------------------------
+This was renamed getCurrentCookieValue() in RC1.
+
+Missing files from the SimpleTest suite
+---------------------------------------
+Versions of SimpleTest prior to Beta6 required a SIMPLE_TEST constant
+to point at the SimpleTest folder location before any of the toolset
+was loaded. This is no longer documented as it is now unnecessary
+for later versions. If you are using an earlier version you may
+need this constant. Consult the documentation that was bundled with
+the release that you are using or upgrade to Beta6 or later.
+
+No method SimpleBrowser::getCurrentUrl()
+--------------------------------------
+This is replaced with the more versatile showRequest() for
+debugging. It only existed in this context for version Beta5.
+Later versions will have SimpleBrowser::getHistory() for tracking
+paths through pages. It is renamed as getUrl() since 1.0RC1.
+
+No method Stub::setStubBaseClass()
+----------------------------------
+This method has finally been removed in 1.0RC1. Use
+SimpleTestOptions::setStubBaseClass() instead.
+
+No class CommandLineReporter
+----------------------------
+This was renamed to TextReporter in Beta3 and the deprecated version
+was removed in 1.0RC1.
+
+No method requireReturn()
+-------------------------
+This was deprecated in Beta3 and is now removed.
+
+No method expectCookie()
+------------------------
+This method was abruptly removed in Beta4 so as to simplify the internals
+until another mechanism can replace it. As a workaround it is necessary
+to assert that the cookie has changed by setting it before the page
+fetch and then assert the desired value.
+
+No method clickSubmitByFormId()
+-------------------------------
+This method had an incorrect name as no button was involved. It was
+renamed to submitByFormId() in Beta4 and the old version deprecated.
+Now removed.
+
+No method paintStart() or paintEnd()
+------------------------------------
+You should only get this error if you have subclassed the lower level
+reporting and test runner machinery. These methods have been broken
+down into events for test methods, events for test cases and events
+for group tests. The new methods are...
+
+paintStart() --> paintMethodStart(), paintCaseStart(), paintGroupStart()
+paintEnd() --> paintMethodEnd(), paintCaseEnd(), paintGroupEnd()
+
+This change was made in Beta3, ironically to make it easier to subclass
+the inner machinery. Simply duplicating the code you had in the previous
+methods should provide a temporary fix.
+
+No class TestDisplay
+--------------------
+This has been folded into SimpleReporter in Beta3 and is now deprecated.
+It was removed in RC1.
+
+No method WebTestCase::fetch()
+------------------------------
+This was renamed get() in Alpha8. It is removed in Beta3.
+
+No method submit()
+------------------
+This has been renamed clickSubmit() in Beta1. The old method was
+removed in Beta2.
+
+No method clearHistory()
+------------------------
+This method is deprecated in Beta2 and removed in RC1.
+
+No method getCallCount()
+------------------------
+This method has been deprecated since Beta1 and has now been
+removed. There are now more ways to set expectations on counts
+and so this method should be unecessery. Removed in RC1.
+
+Cannot find file *
+------------------
+The following public name changes have occoured...
+
+simple_html_test.php --> reporter.php
+simple_mock.php --> mock_objects.php
+simple_unit.php --> unit_tester.php
+simple_web.php --> web_tester.php
+
+The old names were deprecated in Alpha8 and removed in Beta1.
+
+No method attachObserver()
+--------------------------
+Prior to the Alpha8 release the old internal observer pattern was
+gutted and replaced with a visitor. This is to trade flexibility of
+test case expansion against the ease of writing user interfaces.
+
+Code such as...
+
+$test = &new MyTestCase();
+$test->attachObserver(new TestHtmlDisplay());
+$test->run();
+
+...should be rewritten as...
+
+$test = &new MyTestCase();
+$test->run(new HtmlReporter());
+
+If you previously attached multiple observers then the workaround
+is to run the tests twice, once with each, until they can be combined.
+For one observer the old method is simulated in Alpha 8, but is
+removed in Beta1.
+
+No class TestHtmlDisplay
+------------------------
+This class has been renamed to HtmlReporter in Alpha8. It is supported,
+but deprecated in Beta1 and removed in Beta2. If you have subclassed
+the display for your own design, then you will have to extend this
+class (HtmlReporter) instead.
+
+If you have accessed the event queue by overriding the notify() method
+then I am afraid you are in big trouble :(. The reporter is now
+carried around the test suite by the runner classes and the methods
+called directly. In the unlikely event that this is a problem and
+you don't want to upgrade the test tool then simplest is to write your
+own runner class and invoke the tests with...
+
+$test->accept(new MyRunner(new MyReporter()));
+
+...rather than the run method. This should be easier to extend
+anyway and gives much more control. Even this method is overhauled
+in Beta3 where the runner class can be set within the test case. Really
+the best thing to do is to upgrade to this version as whatever you were
+trying to achieve before should now be very much easier.
+
+Missing set options method
+--------------------------
+All test suite options are now in one class called SimpleTestOptions.
+This means that options are set differently...
+
+GroupTest::ignore() --> SimpleTestOptions::ignore()
+Mock::setMockBaseClass() --> SimpleTestOptions::setMockBaseClass()
+
+These changed in Alpha8 and the old versions are now removed in RC1.
+
+No method setExpected*()
+------------------------
+The mock expectations changed their names in Alpha4 and the old names
+ceased to be supported in Alpha8. The changes are...
+
+setExpectedArguments() --> expectArguments()
+setExpectedArgumentsSequence() --> expectArgumentsAt()
+setExpectedCallCount() --> expectCallCount()
+setMaximumCallCount() --> expectMaximumCallCount()
+
+The parameters remained the same.
diff --git a/tests/simpletest/LICENSE b/tests/simpletest/LICENSE
new file mode 100755
index 0000000000..09f465ab70
--- /dev/null
+++ b/tests/simpletest/LICENSE
@@ -0,0 +1,502 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/tests/simpletest/README b/tests/simpletest/README
new file mode 100755
index 0000000000..b8d1979205
--- /dev/null
+++ b/tests/simpletest/README
@@ -0,0 +1,108 @@
+SimpleTest
+==========
+You probably got this package from...
+http://simpletest.sourceforge.net/projects/simpletest/
+
+If there is no licence agreement with this package please download
+a version from the location above. You must read and accept that
+licence to use this software. The file is titled simply LICENSE.
+
+What is it? It's a framework for unit testing, web site testing and
+mock objects for PHP 4.2.0+.
+
+If you have used JUnit you will find this PHP unit testing version very
+similar. Also included is a mock objects and server stubs generator.
+The stubs can have return values set for different arguments, can have
+sequences set also by arguments and can return items by reference.
+The mocks inherit all of this functionality and can also have
+expectations set, again in sequences and for different arguments.
+
+A web tester similar in concept to JWebUnit is also included. There is no
+JavaScript or tables support, but forms, authentication, cookies and
+frames are handled.
+
+You can see a release schedule at http://www.lastcraft.com/overview.php
+which is also copied to the documentation folder with this release.
+A full PHPDocumenter API documentation exists at
+http://simpletest.sourceforge.net/.
+
+The user interface is minimal
+in the extreme, but a lot of information flows from the test suite.
+After version 1.0 we will release a better web UI, but we are leaving XUL
+and GTk versions to volunteers as everybody has their own opinion
+on a good GUI, and we don't want to discourage development by shipping
+one with the toolkit.
+
+You are looking at a first full release. The unit tests for SimpleTest
+itself can be run here...
+
+simpletest/test/unit_tests.php
+
+And tests involving live network connections as well are here...
+
+simpletest/test/all_tests.php
+
+The full tests will typically overrun the 8Mb limit usually allowed
+to a PHP process. A workaround is to run the tests on the command
+with a custom php.ini file if you do not have access to your server
+version.
+
+You will have to edit the all_tests.php file if you are accesssing
+the internet through a proxy server. See the comments in all_tests.php
+for instructions.
+
+The full tests read some test data from the LastCraft site. If the site
+is down or has been modified for a later version then you will get
+spurious errors. A unit_tests.php failure on the other hand would be
+very serious. As far as we know we haven't yet managed to check in any
+unit test failures so please correct us if you find one.
+
+Even if all of the tests run please verify that your existing test suites
+also function as expected. If they don't see the file...
+
+HELP_MY_TESTS_DONT_WORK_ANYMORE
+
+This contains information on interface changes. It also points out
+deprecated interfaces so you should read this even if all of
+your current tests appear to run.
+
+There is a documentation folder which contains the core reference information
+in English and French, although this information is fairly basic.
+You can find a tutorial on...
+
+http://www.lastcraft.com/first_test_tutorial.php
+
+...to get you started and this material will eventually become included
+with the project documentation. A French translation exists at...
+
+http://www.onpk.net/index.php/2005/01/12/254-tutoriel-simpletest-decouvrir-les-tests-unitaires.
+
+If you download and use and possibly even extend this tool, please let us
+know. Any feedback, even bad, is always welcome and we will work to get
+your suggestions into the next release. Ideally please send your
+comments to...
+
+simpletest-support@lists.sourceforge.net
+
+...so that others can read them too. We usually try to respond within 48
+hours.
+
+There is no change log as yet except at Sourceforge. You can visit the
+release notes to see the completed TODO list after each cycle and also the
+status of any bugs, but if the bug is recent then it will be fixed in CVS only.
+The CVS check-ins always have all the tests passing and so CVS snapshots should
+be pretty usable, although the code may not look so good internally.
+
+Oh, yes. It is called "Simple" because it should be simple to
+use. We intend to add a complete set of tools for a test first
+and "test as you code" type of development. "Simple" does not
+mean "Lite" in this context.
+
+Thanks to everyone who has sent comments and offered suggestions. They
+really are invaluable, but sadly you are too many to mention in full.
+Thanks to all on the advanced PHP forum on SitePoint, especially Harry
+Feucks. Early adopters are always an inspiration.
+
+yours Marcus Baker, Jason Sweat, Travis Swicegood and Perrick Penet.
+--
+marcus@lastcraft.com
diff --git a/tests/simpletest/VERSION b/tests/simpletest/VERSION
new file mode 100755
index 0000000000..5f05a2a0d6
--- /dev/null
+++ b/tests/simpletest/VERSION
@@ -0,0 +1 @@
+1.0.1beta2 \ No newline at end of file
diff --git a/tests/simpletest/authentication.php b/tests/simpletest/authentication.php
new file mode 100755
index 0000000000..dcfee8ac6c
--- /dev/null
+++ b/tests/simpletest/authentication.php
@@ -0,0 +1,238 @@
+<?php
+ /**
+ * Base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage WebTester
+ * @version $Id: authentication.php,v 1.10 2005/07/26 01:27:18 lastcraft Exp $
+ */
+ /**
+ * include http class
+ */
+ require_once(dirname(__FILE__) . '/http.php');
+
+ /**
+ * Represents a single security realm's identity.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleRealm {
+ var $_type;
+ var $_root;
+ var $_username;
+ var $_password;
+
+ /**
+ * Starts with the initial entry directory.
+ * @param string $type Authentication type for this
+ * realm. Only Basic authentication
+ * is currently supported.
+ * @param SimpleUrl $url Somewhere in realm.
+ * @access public
+ */
+ function SimpleRealm($type, $url) {
+ $this->_type = $type;
+ $this->_root = $url->getBasePath();
+ $this->_username = false;
+ $this->_password = false;
+ }
+
+ /**
+ * Adds another location to the realm.
+ * @param SimpleUrl $url Somewhere in realm.
+ * @access public
+ */
+ function stretch($url) {
+ $this->_root = $this->_getCommonPath($this->_root, $url->getPath());
+ }
+
+ /**
+ * Finds the common starting path.
+ * @param string $first Path to compare.
+ * @param string $second Path to compare.
+ * @return string Common directories.
+ * @access private
+ */
+ function _getCommonPath($first, $second) {
+ $first = explode('/', $first);
+ $second = explode('/', $second);
+ for ($i = 0; $i < min(count($first), count($second)); $i++) {
+ if ($first[$i] != $second[$i]) {
+ return implode('/', array_slice($first, 0, $i)) . '/';
+ }
+ }
+ return implode('/', $first) . '/';
+ }
+
+ /**
+ * Sets the identity to try within this realm.
+ * @param string $username Username in authentication dialog.
+ * @param string $username Password in authentication dialog.
+ * @access public
+ */
+ function setIdentity($username, $password) {
+ $this->_username = $username;
+ $this->_password = $password;
+ }
+
+ /**
+ * Accessor for current identity.
+ * @return string Last succesful username.
+ * @access public
+ */
+ function getUsername() {
+ return $this->_username;
+ }
+
+ /**
+ * Accessor for current identity.
+ * @return string Last succesful password.
+ * @access public
+ */
+ function getPassword() {
+ return $this->_password;
+ }
+
+ /**
+ * Test to see if the URL is within the directory
+ * tree of the realm.
+ * @param SimpleUrl $url URL to test.
+ * @return boolean True if subpath.
+ * @access public
+ */
+ function isWithin($url) {
+ if ($this->_isIn($this->_root, $url->getBasePath())) {
+ return true;
+ }
+ if ($this->_isIn($this->_root, $url->getBasePath() . $url->getPage() . '/')) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Tests to see if one string is a substring of
+ * another.
+ * @param string $part Small bit.
+ * @param string $whole Big bit.
+ * @return boolean True if the small bit is
+ * in the big bit.
+ * @access private
+ */
+ function _isIn($part, $whole) {
+ return strpos($whole, $part) === 0;
+ }
+ }
+
+ /**
+ * Manages security realms.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleAuthenticator {
+ var $_realms;
+
+ /**
+ * Clears the realms.
+ * @access public
+ */
+ function SimpleAuthenticator() {
+ $this->restartSession();
+ }
+
+ /**
+ * Starts with no realms set up.
+ * @access public
+ */
+ function restartSession() {
+ $this->_realms = array();
+ }
+
+ /**
+ * Adds a new realm centered the current URL.
+ * Browsers vary wildly on their behaviour in this
+ * regard. Mozilla ignores the realm and presents
+ * only when challenged, wasting bandwidth. IE
+ * just carries on presenting until a new challenge
+ * occours. SimpleTest tries to follow the spirit of
+ * the original standards committee and treats the
+ * base URL as the root of a file tree shaped realm.
+ * @param SimpleUrl $url Base of realm.
+ * @param string $type Authentication type for this
+ * realm. Only Basic authentication
+ * is currently supported.
+ * @param string $realm Name of realm.
+ * @access public
+ */
+ function addRealm($url, $type, $realm) {
+ $this->_realms[$url->getHost()][$realm] = new SimpleRealm($type, $url);
+ }
+
+ /**
+ * Sets the current identity to be presented
+ * against that realm.
+ * @param string $host Server hosting realm.
+ * @param string $realm Name of realm.
+ * @param string $username Username for realm.
+ * @param string $password Password for realm.
+ * @access public
+ */
+ function setIdentityForRealm($host, $realm, $username, $password) {
+ if (isset($this->_realms[$host][$realm])) {
+ $this->_realms[$host][$realm]->setIdentity($username, $password);
+ }
+ }
+
+ /**
+ * Finds the name of the realm by comparing URLs.
+ * @param SimpleUrl $url URL to test.
+ * @return SimpleRealm Name of realm.
+ * @access private
+ */
+ function _findRealmFromUrl($url) {
+ if (! isset($this->_realms[$url->getHost()])) {
+ return false;
+ }
+ foreach ($this->_realms[$url->getHost()] as $name => $realm) {
+ if ($realm->isWithin($url)) {
+ return $realm;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Presents the appropriate headers for this location.
+ * @param SimpleHttpRequest $request Request to modify.
+ * @param SimpleUrl $url Base of realm.
+ * @access public
+ */
+ function addHeaders(&$request, $url) {
+ if ($url->getUsername() && $url->getPassword()) {
+ $username = $url->getUsername();
+ $password = $url->getPassword();
+ } elseif ($realm = $this->_findRealmFromUrl($url)) {
+ $username = $realm->getUsername();
+ $password = $realm->getPassword();
+ } else {
+ return;
+ }
+ $this->addBasicHeaders($request, $username, $password);
+ }
+
+ /**
+ * Presents the appropriate headers for this
+ * location for basic authentication.
+ * @param SimpleHttpRequest $request Request to modify.
+ * @param string $username Username for realm.
+ * @param string $password Password for realm.
+ * @access public
+ * @static
+ */
+ function addBasicHeaders(&$request, $username, $password) {
+ if ($username && $password) {
+ $request->addHeaderLine(
+ 'Authorization: Basic ' . base64_encode("$username:$password"));
+ }
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/autorun.php b/tests/simpletest/autorun.php
new file mode 100755
index 0000000000..e2844d1aeb
--- /dev/null
+++ b/tests/simpletest/autorun.php
@@ -0,0 +1,63 @@
+<?php
+ /**
+ * Autorunner which runs all tests cases found in a file
+ * that includes this module.
+ * @package SimpleTest
+ * @version $Id: autorun.php,v 1.9 2007/07/07 00:31:03 lastcraft Exp $
+ */
+ require_once dirname(__FILE__) . '/unit_tester.php';
+ require_once dirname(__FILE__) . '/mock_objects.php';
+ require_once dirname(__FILE__) . '/collector.php';
+ require_once dirname(__FILE__) . '/default_reporter.php';
+
+ $GLOBALS['SIMPLETEST_AUTORUNNER_INITIAL_CLASSES'] = get_declared_classes();
+ register_shutdown_function('simpletest_autorun');
+
+ function simpletest_autorun() {
+ if (tests_have_run()) {
+ return;
+ }
+ $candidates = array_intersect(
+ capture_new_classes(),
+ classes_defined_in_initial_file());
+ $loader = new SimpleFileLoader();
+ $suite = $loader->createSuiteFromClasses(
+ basename(initial_file()),
+ $loader->selectRunnableTests($candidates));
+ $result = $suite->run(new DefaultReporter());
+ if (SimpleReporter::inCli()) {
+ exit($result ? 0 : 1);
+ }
+ }
+
+ function tests_have_run() {
+ if ($context = SimpleTest::getContext()) {
+ if ($context->getTest()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ function initial_file() {
+ static $file = false;
+ if (! $file) {
+ $file = reset(get_included_files());
+ }
+ return $file;
+ }
+
+ function classes_defined_in_initial_file() {
+ if (! preg_match_all('~class\s+(\w+)~', file_get_contents(initial_file()), $matches)) {
+ return array();
+ }
+ return array_map('strtolower', $matches[1]);
+ }
+
+ function capture_new_classes() {
+ global $SIMPLETEST_AUTORUNNER_INITIAL_CLASSES;
+ return array_map('strtolower', array_diff(get_declared_classes(),
+ $SIMPLETEST_AUTORUNNER_INITIAL_CLASSES ?
+ $SIMPLETEST_AUTORUNNER_INITIAL_CLASSES : array()));
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/browser.php b/tests/simpletest/browser.php
new file mode 100755
index 0000000000..7c10b5cfde
--- /dev/null
+++ b/tests/simpletest/browser.php
@@ -0,0 +1,1097 @@
+<?php
+ /**
+ * Base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage WebTester
+ * @version $Id: browser.php,v 1.165 2007/07/16 18:13:23 lastcraft Exp $
+ */
+
+ /**#@+
+ * include other SimpleTest class files
+ */
+ require_once(dirname(__FILE__) . '/simpletest.php');
+ require_once(dirname(__FILE__) . '/http.php');
+ require_once(dirname(__FILE__) . '/encoding.php');
+ require_once(dirname(__FILE__) . '/page.php');
+ require_once(dirname(__FILE__) . '/selector.php');
+ require_once(dirname(__FILE__) . '/frames.php');
+ require_once(dirname(__FILE__) . '/user_agent.php');
+ /**#@-*/
+
+ if (!defined('DEFAULT_MAX_NESTED_FRAMES')) {
+ define('DEFAULT_MAX_NESTED_FRAMES', 3);
+ }
+
+ /**
+ * Browser history list.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleBrowserHistory {
+ var $_sequence;
+ var $_position;
+
+ /**
+ * Starts empty.
+ * @access public
+ */
+ function SimpleBrowserHistory() {
+ $this->_sequence = array();
+ $this->_position = -1;
+ }
+
+ /**
+ * Test for no entries yet.
+ * @return boolean True if empty.
+ * @access private
+ */
+ function _isEmpty() {
+ return ($this->_position == -1);
+ }
+
+ /**
+ * Test for being at the beginning.
+ * @return boolean True if first.
+ * @access private
+ */
+ function _atBeginning() {
+ return ($this->_position == 0) && ! $this->_isEmpty();
+ }
+
+ /**
+ * Test for being at the last entry.
+ * @return boolean True if last.
+ * @access private
+ */
+ function _atEnd() {
+ return ($this->_position + 1 >= count($this->_sequence)) && ! $this->_isEmpty();
+ }
+
+ /**
+ * Adds a successfully fetched page to the history.
+ * @param SimpleUrl $url URL of fetch.
+ * @param SimpleEncoding $parameters Any post data with the fetch.
+ * @access public
+ */
+ function recordEntry($url, $parameters) {
+ $this->_dropFuture();
+ array_push(
+ $this->_sequence,
+ array('url' => $url, 'parameters' => $parameters));
+ $this->_position++;
+ }
+
+ /**
+ * Last fully qualified URL for current history
+ * position.
+ * @return SimpleUrl URL for this position.
+ * @access public
+ */
+ function getUrl() {
+ if ($this->_isEmpty()) {
+ return false;
+ }
+ return $this->_sequence[$this->_position]['url'];
+ }
+
+ /**
+ * Parameters of last fetch from current history
+ * position.
+ * @return SimpleFormEncoding Post parameters.
+ * @access public
+ */
+ function getParameters() {
+ if ($this->_isEmpty()) {
+ return false;
+ }
+ return $this->_sequence[$this->_position]['parameters'];
+ }
+
+ /**
+ * Step back one place in the history. Stops at
+ * the first page.
+ * @return boolean True if any previous entries.
+ * @access public
+ */
+ function back() {
+ if ($this->_isEmpty() || $this->_atBeginning()) {
+ return false;
+ }
+ $this->_position--;
+ return true;
+ }
+
+ /**
+ * Step forward one place. If already at the
+ * latest entry then nothing will happen.
+ * @return boolean True if any future entries.
+ * @access public
+ */
+ function forward() {
+ if ($this->_isEmpty() || $this->_atEnd()) {
+ return false;
+ }
+ $this->_position++;
+ return true;
+ }
+
+ /**
+ * Ditches all future entries beyond the current
+ * point.
+ * @access private
+ */
+ function _dropFuture() {
+ if ($this->_isEmpty()) {
+ return;
+ }
+ while (! $this->_atEnd()) {
+ array_pop($this->_sequence);
+ }
+ }
+ }
+
+ /**
+ * Simulated web browser. This is an aggregate of
+ * the user agent, the HTML parsing, request history
+ * and the last header set.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleBrowser {
+ var $_user_agent;
+ var $_page;
+ var $_history;
+ var $_ignore_frames;
+ var $_maximum_nested_frames;
+
+ /**
+ * Starts with a fresh browser with no
+ * cookie or any other state information. The
+ * exception is that a default proxy will be
+ * set up if specified in the options.
+ * @access public
+ */
+ function SimpleBrowser() {
+ $this->_user_agent = &$this->_createUserAgent();
+ $this->_user_agent->useProxy(
+ SimpleTest::getDefaultProxy(),
+ SimpleTest::getDefaultProxyUsername(),
+ SimpleTest::getDefaultProxyPassword());
+ $this->_page = &new SimplePage();
+ $this->_history = &$this->_createHistory();
+ $this->_ignore_frames = false;
+ $this->_maximum_nested_frames = DEFAULT_MAX_NESTED_FRAMES;
+ }
+
+ /**
+ * Creates the underlying user agent.
+ * @return SimpleFetcher Content fetcher.
+ * @access protected
+ */
+ function &_createUserAgent() {
+ $user_agent = &new SimpleUserAgent();
+ return $user_agent;
+ }
+
+ /**
+ * Creates a new empty history list.
+ * @return SimpleBrowserHistory New list.
+ * @access protected
+ */
+ function &_createHistory() {
+ $history = &new SimpleBrowserHistory();
+ return $history;
+ }
+
+ /**
+ * Disables frames support. Frames will not be fetched
+ * and the frameset page will be used instead.
+ * @access public
+ */
+ function ignoreFrames() {
+ $this->_ignore_frames = true;
+ }
+
+ /**
+ * Enables frames support. Frames will be fetched from
+ * now on.
+ * @access public
+ */
+ function useFrames() {
+ $this->_ignore_frames = false;
+ }
+
+ /**
+ * Switches off cookie sending and recieving.
+ * @access public
+ */
+ function ignoreCookies() {
+ $this->_user_agent->ignoreCookies();
+ }
+
+ /**
+ * Switches back on the cookie sending and recieving.
+ * @access public
+ */
+ function useCookies() {
+ $this->_user_agent->useCookies();
+ }
+
+ /**
+ * Parses the raw content into a page. Will load further
+ * frame pages unless frames are disabled.
+ * @param SimpleHttpResponse $response Response from fetch.
+ * @param integer $depth Nested frameset depth.
+ * @return SimplePage Parsed HTML.
+ * @access private
+ */
+ function &_parse($response, $depth = 0) {
+ $page = &$this->_buildPage($response);
+ if ($this->_ignore_frames || ! $page->hasFrames() || ($depth > $this->_maximum_nested_frames)) {
+ return $page;
+ }
+ $frameset = &new SimpleFrameset($page);
+ foreach ($page->getFrameset() as $key => $url) {
+ $frame = &$this->_fetch($url, new SimpleGetEncoding(), $depth + 1);
+ $frameset->addFrame($frame, $key);
+ }
+ return $frameset;
+ }
+
+ /**
+ * Assembles the parsing machinery and actually parses
+ * a single page. Frees all of the builder memory and so
+ * unjams the PHP memory management.
+ * @param SimpleHttpResponse $response Response from fetch.
+ * @return SimplePage Parsed top level page.
+ * @access protected
+ */
+ function &_buildPage($response) {
+ $builder = &new SimplePageBuilder();
+ $page = &$builder->parse($response);
+ $builder->free();
+ unset($builder);
+ return $page;
+ }
+
+ /**
+ * Fetches a page. Jointly recursive with the _parse()
+ * method as it descends a frameset.
+ * @param string/SimpleUrl $url Target to fetch.
+ * @param SimpleEncoding $encoding GET/POST parameters.
+ * @param integer $depth Nested frameset depth protection.
+ * @return SimplePage Parsed page.
+ * @access private
+ */
+ function &_fetch($url, $encoding, $depth = 0) {
+ $response = &$this->_user_agent->fetchResponse($url, $encoding);
+ if ($response->isError()) {
+ $page = &new SimplePage($response);
+ } else {
+ $page = &$this->_parse($response, $depth);
+ }
+ return $page;
+ }
+
+ /**
+ * Fetches a page or a single frame if that is the current
+ * focus.
+ * @param SimpleUrl $url Target to fetch.
+ * @param SimpleEncoding $parameters GET/POST parameters.
+ * @return string Raw content of page.
+ * @access private
+ */
+ function _load($url, $parameters) {
+ $frame = $url->getTarget();
+ if (! $frame || ! $this->_page->hasFrames() || (strtolower($frame) == '_top')) {
+ return $this->_loadPage($url, $parameters);
+ }
+ return $this->_loadFrame(array($frame), $url, $parameters);
+ }
+
+ /**
+ * Fetches a page and makes it the current page/frame.
+ * @param string/SimpleUrl $url Target to fetch as string.
+ * @param SimplePostEncoding $parameters POST parameters.
+ * @return string Raw content of page.
+ * @access private
+ */
+ function _loadPage($url, $parameters) {
+ $this->_page = &$this->_fetch($url, $parameters);
+ $this->_history->recordEntry(
+ $this->_page->getUrl(),
+ $this->_page->getRequestData());
+ return $this->_page->getRaw();
+ }
+
+ /**
+ * Fetches a frame into the existing frameset replacing the
+ * original.
+ * @param array $frames List of names to drill down.
+ * @param string/SimpleUrl $url Target to fetch as string.
+ * @param SimpleFormEncoding $parameters POST parameters.
+ * @return string Raw content of page.
+ * @access private
+ */
+ function _loadFrame($frames, $url, $parameters) {
+ $page = &$this->_fetch($url, $parameters);
+ $this->_page->setFrame($frames, $page);
+ }
+
+ /**
+ * Removes expired and temporary cookies as if
+ * the browser was closed and re-opened.
+ * @param string/integer $date Time when session restarted.
+ * If omitted then all persistent
+ * cookies are kept.
+ * @access public
+ */
+ function restart($date = false) {
+ $this->_user_agent->restart($date);
+ }
+
+ /**
+ * Adds a header to every fetch.
+ * @param string $header Header line to add to every
+ * request until cleared.
+ * @access public
+ */
+ function addHeader($header) {
+ $this->_user_agent->addHeader($header);
+ }
+
+ /**
+ * Ages the cookies by the specified time.
+ * @param integer $interval Amount in seconds.
+ * @access public
+ */
+ function ageCookies($interval) {
+ $this->_user_agent->ageCookies($interval);
+ }
+
+ /**
+ * Sets an additional cookie. If a cookie has
+ * the same name and path it is replaced.
+ * @param string $name Cookie key.
+ * @param string $value Value of cookie.
+ * @param string $host Host upon which the cookie is valid.
+ * @param string $path Cookie path if not host wide.
+ * @param string $expiry Expiry date.
+ * @access public
+ */
+ function setCookie($name, $value, $host = false, $path = '/', $expiry = false) {
+ $this->_user_agent->setCookie($name, $value, $host, $path, $expiry);
+ }
+
+ /**
+ * Reads the most specific cookie value from the
+ * browser cookies.
+ * @param string $host Host to search.
+ * @param string $path Applicable path.
+ * @param string $name Name of cookie to read.
+ * @return string False if not present, else the
+ * value as a string.
+ * @access public
+ */
+ function getCookieValue($host, $path, $name) {
+ return $this->_user_agent->getCookieValue($host, $path, $name);
+ }
+
+ /**
+ * Reads the current cookies for the current URL.
+ * @param string $name Key of cookie to find.
+ * @return string Null if there is no current URL, false
+ * if the cookie is not set.
+ * @access public
+ */
+ function getCurrentCookieValue($name) {
+ return $this->_user_agent->getBaseCookieValue($name, $this->_page->getUrl());
+ }
+
+ /**
+ * Sets the maximum number of redirects before
+ * a page will be loaded anyway.
+ * @param integer $max Most hops allowed.
+ * @access public
+ */
+ function setMaximumRedirects($max) {
+ $this->_user_agent->setMaximumRedirects($max);
+ }
+
+ /**
+ * Sets the maximum number of nesting of framed pages
+ * within a framed page to prevent loops.
+ * @param integer $max Highest depth allowed.
+ * @access public
+ */
+ function setMaximumNestedFrames($max) {
+ $this->_maximum_nested_frames = $max;
+ }
+
+ /**
+ * Sets the socket timeout for opening a connection.
+ * @param integer $timeout Maximum time in seconds.
+ * @access public
+ */
+ function setConnectionTimeout($timeout) {
+ $this->_user_agent->setConnectionTimeout($timeout);
+ }
+
+ /**
+ * Sets proxy to use on all requests for when
+ * testing from behind a firewall. Set URL
+ * to false to disable.
+ * @param string $proxy Proxy URL.
+ * @param string $username Proxy username for authentication.
+ * @param string $password Proxy password for authentication.
+ * @access public
+ */
+ function useProxy($proxy, $username = false, $password = false) {
+ $this->_user_agent->useProxy($proxy, $username, $password);
+ }
+
+ /**
+ * Fetches the page content with a HEAD request.
+ * Will affect cookies, but will not change the base URL.
+ * @param string/SimpleUrl $url Target to fetch as string.
+ * @param hash/SimpleHeadEncoding $parameters Additional parameters for
+ * HEAD request.
+ * @return boolean True if successful.
+ * @access public
+ */
+ function head($url, $parameters = false) {
+ if (! is_object($url)) {
+ $url = new SimpleUrl($url);
+ }
+ if ($this->getUrl()) {
+ $url = $url->makeAbsolute($this->getUrl());
+ }
+ $response = &$this->_user_agent->fetchResponse($url, new SimpleHeadEncoding($parameters));
+ return ! $response->isError();
+ }
+
+ /**
+ * Fetches the page content with a simple GET request.
+ * @param string/SimpleUrl $url Target to fetch.
+ * @param hash/SimpleFormEncoding $parameters Additional parameters for
+ * GET request.
+ * @return string Content of page or false.
+ * @access public
+ */
+ function get($url, $parameters = false) {
+ if (! is_object($url)) {
+ $url = new SimpleUrl($url);
+ }
+ if ($this->getUrl()) {
+ $url = $url->makeAbsolute($this->getUrl());
+ }
+ return $this->_load($url, new SimpleGetEncoding($parameters));
+ }
+
+ /**
+ * Fetches the page content with a POST request.
+ * @param string/SimpleUrl $url Target to fetch as string.
+ * @param hash/SimpleFormEncoding $parameters POST parameters.
+ * @return string Content of page.
+ * @access public
+ */
+ function post($url, $parameters = false) {
+ if (! is_object($url)) {
+ $url = new SimpleUrl($url);
+ }
+ if ($this->getUrl()) {
+ $url = $url->makeAbsolute($this->getUrl());
+ }
+ return $this->_load($url, new SimplePostEncoding($parameters));
+ }
+
+ /**
+ * Equivalent to hitting the retry button on the
+ * browser. Will attempt to repeat the page fetch. If
+ * there is no history to repeat it will give false.
+ * @return string/boolean Content if fetch succeeded
+ * else false.
+ * @access public
+ */
+ function retry() {
+ $frames = $this->_page->getFrameFocus();
+ if (count($frames) > 0) {
+ $this->_loadFrame(
+ $frames,
+ $this->_page->getUrl(),
+ $this->_page->getRequestData());
+ return $this->_page->getRaw();
+ }
+ if ($url = $this->_history->getUrl()) {
+ $this->_page = &$this->_fetch($url, $this->_history->getParameters());
+ return $this->_page->getRaw();
+ }
+ return false;
+ }
+
+ /**
+ * Equivalent to hitting the back button on the
+ * browser. The browser history is unchanged on
+ * failure. The page content is refetched as there
+ * is no concept of content caching in SimpleTest.
+ * @return boolean True if history entry and
+ * fetch succeeded
+ * @access public
+ */
+ function back() {
+ if (! $this->_history->back()) {
+ return false;
+ }
+ $content = $this->retry();
+ if (! $content) {
+ $this->_history->forward();
+ }
+ return $content;
+ }
+
+ /**
+ * Equivalent to hitting the forward button on the
+ * browser. The browser history is unchanged on
+ * failure. The page content is refetched as there
+ * is no concept of content caching in SimpleTest.
+ * @return boolean True if history entry and
+ * fetch succeeded
+ * @access public
+ */
+ function forward() {
+ if (! $this->_history->forward()) {
+ return false;
+ }
+ $content = $this->retry();
+ if (! $content) {
+ $this->_history->back();
+ }
+ return $content;
+ }
+
+ /**
+ * Retries a request after setting the authentication
+ * for the current realm.
+ * @param string $username Username for realm.
+ * @param string $password Password for realm.
+ * @return boolean True if successful fetch. Note
+ * that authentication may still have
+ * failed.
+ * @access public
+ */
+ function authenticate($username, $password) {
+ if (! $this->_page->getRealm()) {
+ return false;
+ }
+ $url = $this->_page->getUrl();
+ if (! $url) {
+ return false;
+ }
+ $this->_user_agent->setIdentity(
+ $url->getHost(),
+ $this->_page->getRealm(),
+ $username,
+ $password);
+ return $this->retry();
+ }
+
+ /**
+ * Accessor for a breakdown of the frameset.
+ * @return array Hash tree of frames by name
+ * or index if no name.
+ * @access public
+ */
+ function getFrames() {
+ return $this->_page->getFrames();
+ }
+
+ /**
+ * Accessor for current frame focus. Will be
+ * false if no frame has focus.
+ * @return integer/string/boolean Label if any, otherwise
+ * the position in the frameset
+ * or false if none.
+ * @access public
+ */
+ function getFrameFocus() {
+ return $this->_page->getFrameFocus();
+ }
+
+ /**
+ * Sets the focus by index. The integer index starts from 1.
+ * @param integer $choice Chosen frame.
+ * @return boolean True if frame exists.
+ * @access public
+ */
+ function setFrameFocusByIndex($choice) {
+ return $this->_page->setFrameFocusByIndex($choice);
+ }
+
+ /**
+ * Sets the focus by name.
+ * @param string $name Chosen frame.
+ * @return boolean True if frame exists.
+ * @access public
+ */
+ function setFrameFocus($name) {
+ return $this->_page->setFrameFocus($name);
+ }
+
+ /**
+ * Clears the frame focus. All frames will be searched
+ * for content.
+ * @access public
+ */
+ function clearFrameFocus() {
+ return $this->_page->clearFrameFocus();
+ }
+
+ /**
+ * Accessor for last error.
+ * @return string Error from last response.
+ * @access public
+ */
+ function getTransportError() {
+ return $this->_page->getTransportError();
+ }
+
+ /**
+ * Accessor for current MIME type.
+ * @return string MIME type as string; e.g. 'text/html'
+ * @access public
+ */
+ function getMimeType() {
+ return $this->_page->getMimeType();
+ }
+
+ /**
+ * Accessor for last response code.
+ * @return integer Last HTTP response code received.
+ * @access public
+ */
+ function getResponseCode() {
+ return $this->_page->getResponseCode();
+ }
+
+ /**
+ * Accessor for last Authentication type. Only valid
+ * straight after a challenge (401).
+ * @return string Description of challenge type.
+ * @access public
+ */
+ function getAuthentication() {
+ return $this->_page->getAuthentication();
+ }
+
+ /**
+ * Accessor for last Authentication realm. Only valid
+ * straight after a challenge (401).
+ * @return string Name of security realm.
+ * @access public
+ */
+ function getRealm() {
+ return $this->_page->getRealm();
+ }
+
+ /**
+ * Accessor for current URL of page or frame if
+ * focused.
+ * @return string Location of current page or frame as
+ * a string.
+ */
+ function getUrl() {
+ $url = $this->_page->getUrl();
+ return $url ? $url->asString() : false;
+ }
+
+ /**
+ * Accessor for base URL of page if set via BASE tag
+ * @return string base URL
+ */
+ function getBaseUrl() {
+ $url = $this->_page->getBaseUrl();
+ return $url ? $url->asString() : false;
+ }
+
+ /**
+ * Accessor for raw bytes sent down the wire.
+ * @return string Original text sent.
+ * @access public
+ */
+ function getRequest() {
+ return $this->_page->getRequest();
+ }
+
+ /**
+ * Accessor for raw header information.
+ * @return string Header block.
+ * @access public
+ */
+ function getHeaders() {
+ return $this->_page->getHeaders();
+ }
+
+ /**
+ * Accessor for raw page information.
+ * @return string Original text content of web page.
+ * @access public
+ */
+ function getContent() {
+ return $this->_page->getRaw();
+ }
+
+ /**
+ * Accessor for plain text version of the page.
+ * @return string Normalised text representation.
+ * @access public
+ */
+ function getContentAsText() {
+ return $this->_page->getText();
+ }
+
+ /**
+ * Accessor for parsed title.
+ * @return string Title or false if no title is present.
+ * @access public
+ */
+ function getTitle() {
+ return $this->_page->getTitle();
+ }
+
+ /**
+ * Accessor for a list of all links in current page.
+ * @return array List of urls with scheme of
+ * http or https and hostname.
+ * @access public
+ */
+ function getUrls() {
+ return $this->_page->getUrls();
+ }
+
+ /**
+ * Sets all form fields with that name.
+ * @param string $label Name or label of field in forms.
+ * @param string $value New value of field.
+ * @return boolean True if field exists, otherwise false.
+ * @access public
+ */
+ function setField($label, $value) {
+ return $this->_page->setField(new SimpleByLabelOrName($label), $value);
+ }
+
+ /**
+ * Sets all form fields with that name. Will use label if
+ * one is available (not yet implemented).
+ * @param string $name Name of field in forms.
+ * @param string $value New value of field.
+ * @return boolean True if field exists, otherwise false.
+ * @access public
+ */
+ function setFieldByName($name, $value) {
+ return $this->_page->setField(new SimpleByName($name), $value);
+ }
+
+ /**
+ * Sets all form fields with that id attribute.
+ * @param string/integer $id Id of field in forms.
+ * @param string $value New value of field.
+ * @return boolean True if field exists, otherwise false.
+ * @access public
+ */
+ function setFieldById($id, $value) {
+ return $this->_page->setField(new SimpleById($id), $value);
+ }
+
+ /**
+ * Accessor for a form element value within the page.
+ * Finds the first match.
+ * @param string $label Field label.
+ * @return string/boolean A value if the field is
+ * present, false if unchecked
+ * and null if missing.
+ * @access public
+ */
+ function getField($label) {
+ return $this->_page->getField(new SimpleByLabelOrName($label));
+ }
+
+ /**
+ * Accessor for a form element value within the page.
+ * Finds the first match.
+ * @param string $name Field name.
+ * @return string/boolean A string if the field is
+ * present, false if unchecked
+ * and null if missing.
+ * @access public
+ */
+ function getFieldByName($name) {
+ return $this->_page->getField(new SimpleByName($name));
+ }
+
+ /**
+ * Accessor for a form element value within the page.
+ * @param string/integer $id Id of field in forms.
+ * @return string/boolean A string if the field is
+ * present, false if unchecked
+ * and null if missing.
+ * @access public
+ */
+ function getFieldById($id) {
+ return $this->_page->getField(new SimpleById($id));
+ }
+
+ /**
+ * Clicks the submit button by label. The owning
+ * form will be submitted by this.
+ * @param string $label Button label. An unlabeled
+ * button can be triggered by 'Submit'.
+ * @param hash $additional Additional form data.
+ * @return string/boolean Page on success.
+ * @access public
+ */
+ function clickSubmit($label = 'Submit', $additional = false) {
+ if (! ($form = &$this->_page->getFormBySubmit(new SimpleByLabel($label)))) {
+ return false;
+ }
+ $success = $this->_load(
+ $form->getAction(),
+ $form->submitButton(new SimpleByLabel($label), $additional));
+ return ($success ? $this->getContent() : $success);
+ }
+
+ /**
+ * Clicks the submit button by name attribute. The owning
+ * form will be submitted by this.
+ * @param string $name Button name.
+ * @param hash $additional Additional form data.
+ * @return string/boolean Page on success.
+ * @access public
+ */
+ function clickSubmitByName($name, $additional = false) {
+ if (! ($form = &$this->_page->getFormBySubmit(new SimpleByName($name)))) {
+ return false;
+ }
+ $success = $this->_load(
+ $form->getAction(),
+ $form->submitButton(new SimpleByName($name), $additional));
+ return ($success ? $this->getContent() : $success);
+ }
+
+ /**
+ * Clicks the submit button by ID attribute of the button
+ * itself. The owning form will be submitted by this.
+ * @param string $id Button ID.
+ * @param hash $additional Additional form data.
+ * @return string/boolean Page on success.
+ * @access public
+ */
+ function clickSubmitById($id, $additional = false) {
+ if (! ($form = &$this->_page->getFormBySubmit(new SimpleById($id)))) {
+ return false;
+ }
+ $success = $this->_load(
+ $form->getAction(),
+ $form->submitButton(new SimpleById($id), $additional));
+ return ($success ? $this->getContent() : $success);
+ }
+
+ /**
+ * Tests to see if a submit button exists with this
+ * label.
+ * @param string $label Button label.
+ * @return boolean True if present.
+ * @access public
+ */
+ function isSubmit($label) {
+ return (boolean)$this->_page->getFormBySubmit(new SimpleByLabel($label));
+ }
+
+ /**
+ * Clicks the submit image by some kind of label. Usually
+ * the alt tag or the nearest equivalent. The owning
+ * form will be submitted by this. Clicking outside of
+ * the boundary of the coordinates will result in
+ * a failure.
+ * @param string $label ID attribute of button.
+ * @param integer $x X-coordinate of imaginary click.
+ * @param integer $y Y-coordinate of imaginary click.
+ * @param hash $additional Additional form data.
+ * @return string/boolean Page on success.
+ * @access public
+ */
+ function clickImage($label, $x = 1, $y = 1, $additional = false) {
+ if (! ($form = &$this->_page->getFormByImage(new SimpleByLabel($label)))) {
+ return false;
+ }
+ $success = $this->_load(
+ $form->getAction(),
+ $form->submitImage(new SimpleByLabel($label), $x, $y, $additional));
+ return ($success ? $this->getContent() : $success);
+ }
+
+ /**
+ * Clicks the submit image by the name. Usually
+ * the alt tag or the nearest equivalent. The owning
+ * form will be submitted by this. Clicking outside of
+ * the boundary of the coordinates will result in
+ * a failure.
+ * @param string $name Name attribute of button.
+ * @param integer $x X-coordinate of imaginary click.
+ * @param integer $y Y-coordinate of imaginary click.
+ * @param hash $additional Additional form data.
+ * @return string/boolean Page on success.
+ * @access public
+ */
+ function clickImageByName($name, $x = 1, $y = 1, $additional = false) {
+ if (! ($form = &$this->_page->getFormByImage(new SimpleByName($name)))) {
+ return false;
+ }
+ $success = $this->_load(
+ $form->getAction(),
+ $form->submitImage(new SimpleByName($name), $x, $y, $additional));
+ return ($success ? $this->getContent() : $success);
+ }
+
+ /**
+ * Clicks the submit image by ID attribute. The owning
+ * form will be submitted by this. Clicking outside of
+ * the boundary of the coordinates will result in
+ * a failure.
+ * @param integer/string $id ID attribute of button.
+ * @param integer $x X-coordinate of imaginary click.
+ * @param integer $y Y-coordinate of imaginary click.
+ * @param hash $additional Additional form data.
+ * @return string/boolean Page on success.
+ * @access public
+ */
+ function clickImageById($id, $x = 1, $y = 1, $additional = false) {
+ if (! ($form = &$this->_page->getFormByImage(new SimpleById($id)))) {
+ return false;
+ }
+ $success = $this->_load(
+ $form->getAction(),
+ $form->submitImage(new SimpleById($id), $x, $y, $additional));
+ return ($success ? $this->getContent() : $success);
+ }
+
+ /**
+ * Tests to see if an image exists with this
+ * title or alt text.
+ * @param string $label Image text.
+ * @return boolean True if present.
+ * @access public
+ */
+ function isImage($label) {
+ return (boolean)$this->_page->getFormByImage(new SimpleByLabel($label));
+ }
+
+ /**
+ * Submits a form by the ID.
+ * @param string $id The form ID. No submit button value
+ * will be sent.
+ * @return string/boolean Page on success.
+ * @access public
+ */
+ function submitFormById($id) {
+ if (! ($form = &$this->_page->getFormById($id))) {
+ return false;
+ }
+ $success = $this->_load(
+ $form->getAction(),
+ $form->submit());
+ return ($success ? $this->getContent() : $success);
+ }
+
+ /**
+ * Finds a URL by label. Will find the first link
+ * found with this link text by default, or a later
+ * one if an index is given. The match ignores case and
+ * white space issues.
+ * @param string $label Text between the anchor tags.
+ * @param integer $index Link position counting from zero.
+ * @return string/boolean URL on success.
+ * @access public
+ */
+ function getLink($label, $index = 0) {
+ $urls = $this->_page->getUrlsByLabel($label);
+ if (count($urls) == 0) {
+ return false;
+ }
+ if (count($urls) < $index + 1) {
+ return false;
+ }
+ return $urls[$index];
+ }
+
+ /**
+ * Follows a link by label. Will click the first link
+ * found with this link text by default, or a later
+ * one if an index is given. The match ignores case and
+ * white space issues.
+ * @param string $label Text between the anchor tags.
+ * @param integer $index Link position counting from zero.
+ * @return string/boolean Page on success.
+ * @access public
+ */
+ function clickLink($label, $index = 0) {
+ $url = $this->getLink($label, $index);
+ if ($url === false) {
+ return false;
+ }
+ $this->_load($url, new SimpleGetEncoding());
+ return $this->getContent();
+ }
+
+ /**
+ * Finds a link by id attribute.
+ * @param string $id ID attribute value.
+ * @return string/boolean URL on success.
+ * @access public
+ */
+ function getLinkById($id) {
+ return $this->_page->getUrlById($id);
+ }
+
+ /**
+ * Follows a link by id attribute.
+ * @param string $id ID attribute value.
+ * @return string/boolean Page on success.
+ * @access public
+ */
+ function clickLinkById($id) {
+ if (! ($url = $this->getLinkById($id))) {
+ return false;
+ }
+ $this->_load($url, new SimpleGetEncoding());
+ return $this->getContent();
+ }
+
+ /**
+ * Clicks a visible text item. Will first try buttons,
+ * then links and then images.
+ * @param string $label Visible text or alt text.
+ * @return string/boolean Raw page or false.
+ * @access public
+ */
+ function click($label) {
+ $raw = $this->clickSubmit($label);
+ if (! $raw) {
+ $raw = $this->clickLink($label);
+ }
+ if (! $raw) {
+ $raw = $this->clickImage($label);
+ }
+ return $raw;
+ }
+
+ /**
+ * Tests to see if a click target exists.
+ * @param string $label Visible text or alt text.
+ * @return boolean True if target present.
+ * @access public
+ */
+ function isClickable($label) {
+ return $this->isSubmit($label) || ($this->getLink($label) !== false) || $this->isImage($label);
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/collector.php b/tests/simpletest/collector.php
new file mode 100755
index 0000000000..03a4432718
--- /dev/null
+++ b/tests/simpletest/collector.php
@@ -0,0 +1,122 @@
+<?php
+ /**
+ * This file contains the following classes: {@link SimpleCollector},
+ * {@link SimplePatternCollector}.
+ *
+ * @author Travis Swicegood <development@domain51.com>
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: collector.php,v 1.12 2007/03/27 13:09:35 lastcraft Exp $
+ */
+
+ /**
+ * The basic collector for {@link GroupTest}
+ *
+ * @see collect(), GroupTest::collect()
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class SimpleCollector {
+
+ /**
+ * Strips off any kind of slash at the end so as to normalise the path.
+ * @param string $path Path to normalise.
+ * @return string Path without trailing slash.
+ */
+ function _removeTrailingSlash($path) {
+ if (substr($path, -1) == DIRECTORY_SEPARATOR) {
+ return substr($path, 0, -1);
+ } elseif (substr($path, -1) == '/') {
+ return substr($path, 0, -1);
+ } else {
+ return $path;
+ }
+ }
+
+ /**
+ * Scans the directory and adds what it can.
+ * @param object $test Group test with {@link GroupTest::addTestFile()} method.
+ * @param string $path Directory to scan.
+ * @see _attemptToAdd()
+ */
+ function collect(&$test, $path) {
+ $path = $this->_removeTrailingSlash($path);
+ if ($handle = opendir($path)) {
+ while (($entry = readdir($handle)) !== false) {
+ if ($this->_isHidden($entry)) {
+ continue;
+ }
+ $this->_handle($test, $path . DIRECTORY_SEPARATOR . $entry);
+ }
+ closedir($handle);
+ }
+ }
+
+ /**
+ * This method determines what should be done with a given file and adds
+ * it via {@link GroupTest::addTestFile()} if necessary.
+ *
+ * This method should be overriden to provide custom matching criteria,
+ * such as pattern matching, recursive matching, etc. For an example, see
+ * {@link SimplePatternCollector::_handle()}.
+ *
+ * @param object $test Group test with {@link GroupTest::addTestFile()} method.
+ * @param string $filename A filename as generated by {@link collect()}
+ * @see collect()
+ * @access protected
+ */
+ function _handle(&$test, $file) {
+ if (is_dir($file)) {
+ return;
+ }
+ $test->addTestFile($file);
+ }
+
+ /**
+ * Tests for hidden files so as to skip them. Currently
+ * only tests for Unix hidden files.
+ * @param string $filename Plain filename.
+ * @return boolean True if hidden file.
+ * @access private
+ */
+ function _isHidden($filename) {
+ return strncmp($filename, '.', 1) == 0;
+ }
+ }
+
+ /**
+ * An extension to {@link SimpleCollector} that only adds files matching a
+ * given pattern.
+ *
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @see SimpleCollector
+ */
+ class SimplePatternCollector extends SimpleCollector {
+ var $_pattern;
+
+ /**
+ *
+ * @param string $pattern Perl compatible regex to test name against
+ * See {@link http://us4.php.net/manual/en/reference.pcre.pattern.syntax.php PHP's PCRE}
+ * for full documentation of valid pattern.s
+ */
+ function SimplePatternCollector($pattern = '/php$/i') {
+ $this->_pattern = $pattern;
+ }
+
+ /**
+ * Attempts to add files that match a given pattern.
+ *
+ * @see SimpleCollector::_handle()
+ * @param object $test Group test with {@link GroupTest::addTestFile()} method.
+ * @param string $path Directory to scan.
+ * @access protected
+ */
+ function _handle(&$test, $filename) {
+ if (preg_match($this->_pattern, $filename)) {
+ parent::_handle($test, $filename);
+ }
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/compatibility.php b/tests/simpletest/compatibility.php
new file mode 100755
index 0000000000..ceb8b8ae00
--- /dev/null
+++ b/tests/simpletest/compatibility.php
@@ -0,0 +1,173 @@
+<?php
+ /**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @version $Id: compatibility.php,v 1.11 2006/11/08 16:15:06 lastcraft Exp $
+ */
+
+ /**
+ * Static methods for compatibility between different
+ * PHP versions.
+ * @package SimpleTest
+ */
+ class SimpleTestCompatibility {
+
+ /**
+ * Creates a copy whether in PHP5 or PHP4.
+ * @param object $object Thing to copy.
+ * @return object A copy.
+ * @access public
+ * @static
+ */
+ function copy($object) {
+ if (version_compare(phpversion(), '5') >= 0) {
+ eval('$copy = clone $object;');
+ return $copy;
+ }
+ return $object;
+ }
+
+ /**
+ * Identity test. Drops back to equality + types for PHP5
+ * objects as the === operator counts as the
+ * stronger reference constraint.
+ * @param mixed $first Test subject.
+ * @param mixed $second Comparison object.
+ * @return boolean True if identical.
+ * @access public
+ * @static
+ */
+ function isIdentical($first, $second) {
+ if ($first != $second) {
+ return false;
+ }
+ if (version_compare(phpversion(), '5') >= 0) {
+ return SimpleTestCompatibility::_isIdenticalType($first, $second);
+ }
+ return ($first === $second);
+ }
+
+ /**
+ * Recursive type test.
+ * @param mixed $first Test subject.
+ * @param mixed $second Comparison object.
+ * @return boolean True if same type.
+ * @access private
+ * @static
+ */
+ function _isIdenticalType($first, $second) {
+ if (gettype($first) != gettype($second)) {
+ return false;
+ }
+ if (is_object($first) && is_object($second)) {
+ if (get_class($first) != get_class($second)) {
+ return false;
+ }
+ return SimpleTestCompatibility::_isArrayOfIdenticalTypes(
+ get_object_vars($first),
+ get_object_vars($second));
+ }
+ if (is_array($first) && is_array($second)) {
+ return SimpleTestCompatibility::_isArrayOfIdenticalTypes($first, $second);
+ }
+ if ($first !== $second) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Recursive type test for each element of an array.
+ * @param mixed $first Test subject.
+ * @param mixed $second Comparison object.
+ * @return boolean True if identical.
+ * @access private
+ * @static
+ */
+ function _isArrayOfIdenticalTypes($first, $second) {
+ if (array_keys($first) != array_keys($second)) {
+ return false;
+ }
+ foreach (array_keys($first) as $key) {
+ $is_identical = SimpleTestCompatibility::_isIdenticalType(
+ $first[$key],
+ $second[$key]);
+ if (! $is_identical) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Test for two variables being aliases.
+ * @param mixed $first Test subject.
+ * @param mixed $second Comparison object.
+ * @return boolean True if same.
+ * @access public
+ * @static
+ */
+ function isReference(&$first, &$second) {
+ if (version_compare(phpversion(), '5', '>=') && is_object($first)) {
+ return ($first === $second);
+ }
+ if (is_object($first) && is_object($second)) {
+ $id = uniqid("test");
+ $first->$id = true;
+ $is_ref = isset($second->$id);
+ unset($first->$id);
+ return $is_ref;
+ }
+ $temp = $first;
+ $first = uniqid("test");
+ $is_ref = ($first === $second);
+ $first = $temp;
+ return $is_ref;
+ }
+
+ /**
+ * Test to see if an object is a member of a
+ * class hiearchy.
+ * @param object $object Object to test.
+ * @param string $class Root name of hiearchy.
+ * @return boolean True if class in hiearchy.
+ * @access public
+ * @static
+ */
+ function isA($object, $class) {
+ if (version_compare(phpversion(), '5') >= 0) {
+ if (! class_exists($class, false)) {
+ if (function_exists('interface_exists')) {
+ if (! interface_exists($class, false)) {
+ return false;
+ }
+ }
+ }
+ eval("\$is_a = \$object instanceof $class;");
+ return $is_a;
+ }
+ if (function_exists('is_a')) {
+ return is_a($object, $class);
+ }
+ return ((strtolower($class) == get_class($object))
+ or (is_subclass_of($object, $class)));
+ }
+
+ /**
+ * Sets a socket timeout for each chunk.
+ * @param resource $handle Socket handle.
+ * @param integer $timeout Limit in seconds.
+ * @access public
+ * @static
+ */
+ function setTimeout($handle, $timeout) {
+ if (function_exists('stream_set_timeout')) {
+ stream_set_timeout($handle, $timeout, 0);
+ } elseif (function_exists('socket_set_timeout')) {
+ socket_set_timeout($handle, $timeout, 0);
+ } elseif (function_exists('set_socket_timeout')) {
+ set_socket_timeout($handle, $timeout, 0);
+ }
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/cookies.php b/tests/simpletest/cookies.php
new file mode 100755
index 0000000000..b4c076d04e
--- /dev/null
+++ b/tests/simpletest/cookies.php
@@ -0,0 +1,380 @@
+<?php
+ /**
+ * Base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage WebTester
+ * @version $Id: cookies.php,v 1.4 2005/12/05 04:47:03 lastcraft Exp $
+ */
+
+ /**#@+
+ * include other SimpleTest class files
+ */
+ require_once(dirname(__FILE__) . '/url.php');
+ /**#@-*/
+
+ /**
+ * Cookie data holder. Cookie rules are full of pretty
+ * arbitary stuff. I have used...
+ * http://wp.netscape.com/newsref/std/cookie_spec.html
+ * http://www.cookiecentral.com/faq/
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleCookie {
+ var $_host;
+ var $_name;
+ var $_value;
+ var $_path;
+ var $_expiry;
+ var $_is_secure;
+
+ /**
+ * Constructor. Sets the stored values.
+ * @param string $name Cookie key.
+ * @param string $value Value of cookie.
+ * @param string $path Cookie path if not host wide.
+ * @param string $expiry Expiry date as string.
+ * @param boolean $is_secure Currently ignored.
+ */
+ function SimpleCookie($name, $value = false, $path = false, $expiry = false, $is_secure = false) {
+ $this->_host = false;
+ $this->_name = $name;
+ $this->_value = $value;
+ $this->_path = ($path ? $this->_fixPath($path) : "/");
+ $this->_expiry = false;
+ if (is_string($expiry)) {
+ $this->_expiry = strtotime($expiry);
+ } elseif (is_integer($expiry)) {
+ $this->_expiry = $expiry;
+ }
+ $this->_is_secure = $is_secure;
+ }
+
+ /**
+ * Sets the host. The cookie rules determine
+ * that the first two parts are taken for
+ * certain TLDs and three for others. If the
+ * new host does not match these rules then the
+ * call will fail.
+ * @param string $host New hostname.
+ * @return boolean True if hostname is valid.
+ * @access public
+ */
+ function setHost($host) {
+ if ($host = $this->_truncateHost($host)) {
+ $this->_host = $host;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Accessor for the truncated host to which this
+ * cookie applies.
+ * @return string Truncated hostname.
+ * @access public
+ */
+ function getHost() {
+ return $this->_host;
+ }
+
+ /**
+ * Test for a cookie being valid for a host name.
+ * @param string $host Host to test against.
+ * @return boolean True if the cookie would be valid
+ * here.
+ */
+ function isValidHost($host) {
+ return ($this->_truncateHost($host) === $this->getHost());
+ }
+
+ /**
+ * Extracts just the domain part that determines a
+ * cookie's host validity.
+ * @param string $host Host name to truncate.
+ * @return string Domain or false on a bad host.
+ * @access private
+ */
+ function _truncateHost($host) {
+ $tlds = SimpleUrl::getAllTopLevelDomains();
+ if (preg_match('/[a-z\-]+\.(' . $tlds . ')$/i', $host, $matches)) {
+ return $matches[0];
+ } elseif (preg_match('/[a-z\-]+\.[a-z\-]+\.[a-z\-]+$/i', $host, $matches)) {
+ return $matches[0];
+ }
+ return false;
+ }
+
+ /**
+ * Accessor for name.
+ * @return string Cookie key.
+ * @access public
+ */
+ function getName() {
+ return $this->_name;
+ }
+
+ /**
+ * Accessor for value. A deleted cookie will
+ * have an empty string for this.
+ * @return string Cookie value.
+ * @access public
+ */
+ function getValue() {
+ return $this->_value;
+ }
+
+ /**
+ * Accessor for path.
+ * @return string Valid cookie path.
+ * @access public
+ */
+ function getPath() {
+ return $this->_path;
+ }
+
+ /**
+ * Tests a path to see if the cookie applies
+ * there. The test path must be longer or
+ * equal to the cookie path.
+ * @param string $path Path to test against.
+ * @return boolean True if cookie valid here.
+ * @access public
+ */
+ function isValidPath($path) {
+ return (strncmp(
+ $this->_fixPath($path),
+ $this->getPath(),
+ strlen($this->getPath())) == 0);
+ }
+
+ /**
+ * Accessor for expiry.
+ * @return string Expiry string.
+ * @access public
+ */
+ function getExpiry() {
+ if (! $this->_expiry) {
+ return false;
+ }
+ return gmdate("D, d M Y H:i:s", $this->_expiry) . " GMT";
+ }
+
+ /**
+ * Test to see if cookie is expired against
+ * the cookie format time or timestamp.
+ * Will give true for a session cookie.
+ * @param integer/string $now Time to test against. Result
+ * will be false if this time
+ * is later than the cookie expiry.
+ * Can be either a timestamp integer
+ * or a cookie format date.
+ * @access public
+ */
+ function isExpired($now) {
+ if (! $this->_expiry) {
+ return true;
+ }
+ if (is_string($now)) {
+ $now = strtotime($now);
+ }
+ return ($this->_expiry < $now);
+ }
+
+ /**
+ * Ages the cookie by the specified number of
+ * seconds.
+ * @param integer $interval In seconds.
+ * @public
+ */
+ function agePrematurely($interval) {
+ if ($this->_expiry) {
+ $this->_expiry -= $interval;
+ }
+ }
+
+ /**
+ * Accessor for the secure flag.
+ * @return boolean True if cookie needs SSL.
+ * @access public
+ */
+ function isSecure() {
+ return $this->_is_secure;
+ }
+
+ /**
+ * Adds a trailing and leading slash to the path
+ * if missing.
+ * @param string $path Path to fix.
+ * @access private
+ */
+ function _fixPath($path) {
+ if (substr($path, 0, 1) != '/') {
+ $path = '/' . $path;
+ }
+ if (substr($path, -1, 1) != '/') {
+ $path .= '/';
+ }
+ return $path;
+ }
+ }
+
+ /**
+ * Repository for cookies. This stuff is a
+ * tiny bit browser dependent.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleCookieJar {
+ var $_cookies;
+
+ /**
+ * Constructor. Jar starts empty.
+ * @access public
+ */
+ function SimpleCookieJar() {
+ $this->_cookies = array();
+ }
+
+ /**
+ * Removes expired and temporary cookies as if
+ * the browser was closed and re-opened.
+ * @param string/integer $now Time to test expiry against.
+ * @access public
+ */
+ function restartSession($date = false) {
+ $surviving_cookies = array();
+ for ($i = 0; $i < count($this->_cookies); $i++) {
+ if (! $this->_cookies[$i]->getValue()) {
+ continue;
+ }
+ if (! $this->_cookies[$i]->getExpiry()) {
+ continue;
+ }
+ if ($date && $this->_cookies[$i]->isExpired($date)) {
+ continue;
+ }
+ $surviving_cookies[] = $this->_cookies[$i];
+ }
+ $this->_cookies = $surviving_cookies;
+ }
+
+ /**
+ * Ages all cookies in the cookie jar.
+ * @param integer $interval The old session is moved
+ * into the past by this number
+ * of seconds. Cookies now over
+ * age will be removed.
+ * @access public
+ */
+ function agePrematurely($interval) {
+ for ($i = 0; $i < count($this->_cookies); $i++) {
+ $this->_cookies[$i]->agePrematurely($interval);
+ }
+ }
+
+ /**
+ * Sets an additional cookie. If a cookie has
+ * the same name and path it is replaced.
+ * @param string $name Cookie key.
+ * @param string $value Value of cookie.
+ * @param string $host Host upon which the cookie is valid.
+ * @param string $path Cookie path if not host wide.
+ * @param string $expiry Expiry date.
+ * @access public
+ */
+ function setCookie($name, $value, $host = false, $path = '/', $expiry = false) {
+ $cookie = new SimpleCookie($name, $value, $path, $expiry);
+ if ($host) {
+ $cookie->setHost($host);
+ }
+ $this->_cookies[$this->_findFirstMatch($cookie)] = $cookie;
+ }
+
+ /**
+ * Finds a matching cookie to write over or the
+ * first empty slot if none.
+ * @param SimpleCookie $cookie Cookie to write into jar.
+ * @return integer Available slot.
+ * @access private
+ */
+ function _findFirstMatch($cookie) {
+ for ($i = 0; $i < count($this->_cookies); $i++) {
+ $is_match = $this->_isMatch(
+ $cookie,
+ $this->_cookies[$i]->getHost(),
+ $this->_cookies[$i]->getPath(),
+ $this->_cookies[$i]->getName());
+ if ($is_match) {
+ return $i;
+ }
+ }
+ return count($this->_cookies);
+ }
+
+ /**
+ * Reads the most specific cookie value from the
+ * browser cookies. Looks for the longest path that
+ * matches.
+ * @param string $host Host to search.
+ * @param string $path Applicable path.
+ * @param string $name Name of cookie to read.
+ * @return string False if not present, else the
+ * value as a string.
+ * @access public
+ */
+ function getCookieValue($host, $path, $name) {
+ $longest_path = '';
+ foreach ($this->_cookies as $cookie) {
+ if ($this->_isMatch($cookie, $host, $path, $name)) {
+ if (strlen($cookie->getPath()) > strlen($longest_path)) {
+ $value = $cookie->getValue();
+ $longest_path = $cookie->getPath();
+ }
+ }
+ }
+ return (isset($value) ? $value : false);
+ }
+
+ /**
+ * Tests cookie for matching against search
+ * criteria.
+ * @param SimpleTest $cookie Cookie to test.
+ * @param string $host Host must match.
+ * @param string $path Cookie path must be shorter than
+ * this path.
+ * @param string $name Name must match.
+ * @return boolean True if matched.
+ * @access private
+ */
+ function _isMatch($cookie, $host, $path, $name) {
+ if ($cookie->getName() != $name) {
+ return false;
+ }
+ if ($host && $cookie->getHost() && ! $cookie->isValidHost($host)) {
+ return false;
+ }
+ if (! $cookie->isValidPath($path)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Uses a URL to sift relevant cookies by host and
+ * path. Results are list of strings of form "name=value".
+ * @param SimpleUrl $url Url to select by.
+ * @return array Valid name and value pairs.
+ * @access public
+ */
+ function selectAsPairs($url) {
+ $pairs = array();
+ foreach ($this->_cookies as $cookie) {
+ if ($this->_isMatch($cookie, $url->getHost(), $url->getPath(), $cookie->getName())) {
+ $pairs[] = $cookie->getName() . '=' . $cookie->getValue();
+ }
+ }
+ return $pairs;
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/default_reporter.php b/tests/simpletest/default_reporter.php
new file mode 100755
index 0000000000..cdeabc7417
--- /dev/null
+++ b/tests/simpletest/default_reporter.php
@@ -0,0 +1,96 @@
+<?php
+ /**
+ * Optional include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: default_reporter.php,v 1.4 2007/07/07 00:31:03 lastcraft Exp $
+ */
+
+ /**#@+
+ * include other SimpleTest class files
+ */
+ require_once(dirname(__FILE__) . '/simpletest.php');
+ require_once(dirname(__FILE__) . '/scorer.php');
+ require_once(dirname(__FILE__) . '/reporter.php');
+ require_once(dirname(__FILE__) . '/xml.php');
+ /**#@-*/
+
+ /**
+ * Parser for command line arguments. Extracts
+ * the a specific test to run and engages XML
+ * reporting when necessary.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class SimpleCommandLineParser {
+ var $_to_property = array(
+ 'case' => '_case', 'c' => '_case',
+ 'test' => '_test', 't' => '_test',
+ 'xml' => '_xml', 'x' => '_xml');
+ var $_case = '';
+ var $_test = '';
+ var $_xml = false;
+
+ function SimpleCommandLineParser($arguments) {
+ if (! is_array($arguments)) {
+ return;
+ }
+ foreach ($arguments as $i => $argument) {
+ if (preg_match('/^--?(test|case|t|c)=(.+)$/', $argument, $matches)) {
+ $property = $this->_to_property[$matches[1]];
+ $this->$property = $matches[2];
+ } elseif (preg_match('/^--?(test|case|t|c)$/', $argument, $matches)) {
+ $property = $this->_to_property[$matches[1]];
+ if (isset($arguments[$i + 1])) {
+ $this->$property = $arguments[$i + 1];
+ }
+ } elseif (preg_match('/^--?(xml|x)$/', $argument)) {
+ $this->_xml = true;
+ }
+ }
+ }
+
+ function getTest() {
+ return $this->_test;
+ }
+
+ function getTestCase() {
+ return $this->_case;
+ }
+
+ function isXml() {
+ return $this->_xml;
+ }
+ }
+
+ /**
+ * The default reporter used by SimpleTest's autorun
+ * feature. The actual reporters used are dependency
+ * injected and can be overridden.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class DefaultReporter extends SimpleReporterDecorator {
+
+ /**
+ * Assembles the appopriate reporter for the environment.
+ */
+ function DefaultReporter() {
+ if (SimpleReporter::inCli()) {
+ global $argv;
+ $parser = new SimpleCommandLineParser($argv);
+ $interfaces = $parser->isXml() ? array('XmlReporter') : array('TextReporter');
+ $reporter = &new SelectiveReporter(
+ SimpleTest::preferred($interfaces),
+ $parser->getTestCase(),
+ $parser->getTest());
+ } else {
+ $reporter = &new SelectiveReporter(
+ SimpleTest::preferred('HtmlReporter'),
+ @$_GET['c'],
+ @$_GET['t']);
+ }
+ $this->SimpleReporterDecorator($reporter);
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/detached.php b/tests/simpletest/detached.php
new file mode 100755
index 0000000000..3f5ff95261
--- /dev/null
+++ b/tests/simpletest/detached.php
@@ -0,0 +1,96 @@
+<?php
+ /**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: detached.php,v 1.1 2005/12/08 19:35:06 lastcraft Exp $
+ */
+
+ /**#@+
+ * include other SimpleTest class files
+ */
+ require_once(dirname(__FILE__) . '/xml.php');
+ require_once(dirname(__FILE__) . '/shell_tester.php');
+ /**#@-*/
+
+ /**
+ * Runs an XML formated test in a separate process.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class DetachedTestCase {
+ var $_command;
+ var $_dry_command;
+ var $_size;
+
+ /**
+ * Sets the location of the remote test.
+ * @param string $command Test script.
+ * @param string $dry_command Script for dry run.
+ * @access public
+ */
+ function DetachedTestCase($command, $dry_command = false) {
+ $this->_command = $command;
+ $this->_dry_command = $dry_command ? $dry_command : $command;
+ $this->_size = false;
+ }
+
+ /**
+ * Accessor for the test name for subclasses.
+ * @return string Name of the test.
+ * @access public
+ */
+ function getLabel() {
+ return $this->_command;
+ }
+
+ /**
+ * Runs the top level test for this class. Currently
+ * reads the data as a single chunk. I'll fix this
+ * once I have added iteration to the browser.
+ * @param SimpleReporter $reporter Target of test results.
+ * @returns boolean True if no failures.
+ * @access public
+ */
+ function run(&$reporter) {
+ $shell = &new SimpleShell();
+ $shell->execute($this->_command);
+ $parser = &$this->_createParser($reporter);
+ if (! $parser->parse($shell->getOutput())) {
+ trigger_error('Cannot parse incoming XML from [' . $this->_command . ']');
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Accessor for the number of subtests.
+ * @return integer Number of test cases.
+ * @access public
+ */
+ function getSize() {
+ if ($this->_size === false) {
+ $shell = &new SimpleShell();
+ $shell->execute($this->_dry_command);
+ $reporter = &new SimpleReporter();
+ $parser = &$this->_createParser($reporter);
+ if (! $parser->parse($shell->getOutput())) {
+ trigger_error('Cannot parse incoming XML from [' . $this->_dry_command . ']');
+ return false;
+ }
+ $this->_size = $reporter->getTestCaseCount();
+ }
+ return $this->_size;
+ }
+
+ /**
+ * Creates the XML parser.
+ * @param SimpleReporter $reporter Target of test results.
+ * @return SimpleTestXmlListener XML reader.
+ * @access protected
+ */
+ function &_createParser(&$reporter) {
+ return new SimpleTestXmlParser($reporter);
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/docs/en/authentication_documentation.html b/tests/simpletest/docs/en/authentication_documentation.html
new file mode 100755
index 0000000000..acea6cee70
--- /dev/null
+++ b/tests/simpletest/docs/en/authentication_documentation.html
@@ -0,0 +1,373 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>SimpleTest documentation for testing log-in and authentication</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <span class="chosen">Authentication</span>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Authentication documentation</h1>
+ This page...
+ <ul>
+<li>
+ Getting through <a href="#basic">Basic HTTP authentication</a>
+ </li>
+<li>
+ Testing <a href="#cookies">cookie based authentication</a>
+ </li>
+<li>
+ Managing <a href="#session">browser sessions</a> and timeouts
+ </li>
+</ul>
+<div class="content">
+
+ <p>
+ One of the trickiest, and yet most important, areas
+ of testing web sites is the security.
+ Testing these schemes is one of the core goals of
+ the SimpleTest web tester.
+ </p>
+
+ <p>
+<a class="target" name="basic">
+<h2>Basic HTTP authentication</h2>
+</a>
+</p>
+ <p>
+ If you fetch a page protected by basic authentication then
+ rather than receiving content, you will instead get a 401
+ header.
+ We can illustrate this with this test...
+<pre>
+class AuthenticationTest extends WebTestCase {<strong>
+ function test401Header() {
+ $this-&gt;get('http://www.lastcraft.com/protected/');
+ $this-&gt;showHeaders();
+ }</strong>
+}
+</pre>
+ This allows us to see the challenge header...
+ <div class="demo">
+ <h1>File test</h1>
+<pre style="background-color: lightgray; color: black">
+HTTP/1.1 401 Authorization Required
+Date: Sat, 18 Sep 2004 19:25:18 GMT
+Server: Apache/1.3.29 (Unix) PHP/4.3.4
+WWW-Authenticate: Basic realm="SimpleTest basic authentication"
+Connection: close
+Content-Type: text/html; charset=iso-8859-1
+</pre>
+ <div style="padding: 8px; margin-top: 1em; background-color: green; color: white;">1/1 test cases complete.
+ <strong>0</strong> passes, <strong>0</strong> fails and <strong>0</strong> exceptions.</div>
+ </div>
+ We are trying to get away from visual inspection though, and so SimpleTest
+ allows to make automated assertions against the challenge.
+ Here is a thorough test of our header...
+<pre>
+class AuthenticationTest extends WebTestCase {
+ function test401Header() {
+ $this-&gt;get('http://www.lastcraft.com/protected/');<strong>
+ $this-&gt;assertAuthentication('Basic');
+ $this-&gt;assertResponse(401);
+ $this-&gt;assertRealm('SimpleTest basic authentication');</strong>
+ }
+}
+</pre>
+ Any one of these tests would normally do on it's own depending
+ on the amount of detail you want to see.
+ </p>
+ <p>
+ One theme that runs through SimpleTest is the ability to use
+ <span class="new_code">SimpleExpectation</span> objects wherever a simple
+ match is not enough.
+ If you want only an approximate match to the realm for
+ example, you can do this...
+<pre>
+class AuthenticationTest extends WebTestCase {
+ function test401Header() {
+ $this-&gt;get('http://www.lastcraft.com/protected/');
+ $this-&gt;assertRealm(<strong>new PatternExpectation('/simpletest/i')</strong>);
+ }
+}
+</pre>
+ Most of the time we are not interested in testing the
+ authentication itself, but want to get past it to test
+ the pages underneath.
+ As soon as the challenge has been issued we can reply with
+ an authentication response...
+<pre>
+class AuthenticationTest extends WebTestCase {
+ function testCanAuthenticate() {
+ $this-&gt;get('http://www.lastcraft.com/protected/');<strong>
+ $this-&gt;authenticate('Me', 'Secret');</strong>
+ $this-&gt;assertTitle(...);
+ }
+}
+</pre>
+ The username and password will now be sent with every
+ subsequent request to that directory and subdirectories.
+ You will have to authenticate again if you step outside
+ the authenticated directory, but SimpleTest is smart enough
+ to merge subdirectories into a common realm.
+ </p>
+ <p>
+ You can shortcut this step further by encoding the log in
+ details straight into the URL...
+<pre>
+class AuthenticationTest extends WebTestCase {
+ function testCanReadAuthenticatedPages() {
+ $this-&gt;get('http://<strong>Me:Secret@</strong>www.lastcraft.com/protected/');
+ $this-&gt;assertTitle(...);
+ }
+}
+</pre>
+ If your username or password has special characters, then you
+ will have to URL encode them or the request will not be parsed
+ correctly.
+ Also this header will not be sent on subsequent requests if
+ you request a page with a fully qualified URL.
+ If you navigate with relative URLs though, the authentication
+ information will be preserved.
+ </p>
+ <p>
+ Only basic authentication is currently supported and this is
+ only really secure in tandem with HTTPS connections.
+ This is usually enough to protect test server from prying eyes,
+ however.
+ Digest authentication and NTLM authentication may be added
+ in the future.
+ </p>
+
+ <p>
+<a class="target" name="cookies">
+<h2>Cookies</h2>
+</a>
+</p>
+ <p>
+ Basic authentication doesn't give enough control over the
+ user interface for web developers.
+ More likely this functionality will be coded directly into
+ the web architecture using cookies and complicated timeouts.
+ </p>
+ <p>
+ Starting with a simple log-in form...
+<pre>
+&lt;form&gt;
+ Username:
+ &lt;input type="text" name="u" value="" /&gt;&lt;br /&gt;
+ Password:
+ &lt;input type="password" name="p" value="" /&gt;&lt;br /&gt;
+ &lt;input type="submit" value="Log in" /&gt;
+&lt;/form&gt;
+</pre>
+ Which looks like...
+ </p>
+ <p>
+ <form class="demo">
+ Username:
+ <input type="text" name="u" value="">
+<br>
+ Password:
+ <input type="password" name="p" value="">
+<br>
+ <input type="submit" value="Log in">
+ </form>
+ </p>
+ <p>
+ Let's suppose that in fetching this page a cookie has been
+ set with a session ID.
+ We are not going to fill the form in yet, just test that
+ we are tracking the user.
+ Here is the test...
+<pre>
+class LogInTest extends WebTestCase {
+ function testSessionCookieSetBeforeForm() {
+ $this-&gt;get('http://www.my-site.com/login.php');<strong>
+ $this-&gt;assertCookie('SID');</strong>
+ }
+}
+</pre>
+ All we are doing is confirming that the cookie is set.
+ As the value is likely to be rather cryptic it's not
+ really worth testing this with...
+<pre>
+class LogInTest extends WebTestCase {
+ function testSessionCookieIsCorrectPattern() {
+ $this-&gt;get('http://www.my-site.com/login.php');
+ $this-&gt;assertCookie('SID', <strong>new PatternExpectation('/[a-f0-9]{32}/i')</strong>);
+ }
+}
+</pre>
+ The rest of the test would be the same as any other form,
+ but we might want to confirm that we still have the same
+ cookie after log-in as before we entered.
+ We wouldn't want to lose track of this after all.
+ Here is a possible test for this...
+<pre>
+class LogInTest extends WebTestCase {
+ ...
+ function testSessionCookieSameAfterLogIn() {
+ $this-&gt;get('http://www.my-site.com/login.php');<strong>
+ $session = $this-&gt;getCookie('SID');
+ $this-&gt;setField('u', 'Me');
+ $this-&gt;setField('p', 'Secret');
+ $this-&gt;click('Log in');
+ $this-&gt;assertText('Welcome Me');
+ $this-&gt;assertCookie('SID', $session);</strong>
+ }
+}
+</pre>
+ This confirms that the session identifier is maintained
+ afer log-in.
+ </p>
+ <p>
+ We could even attempt to spoof our own system by setting
+ arbitrary cookies to gain access...
+<pre>
+class LogInTest extends WebTestCase {
+ ...
+ function testSessionCookieSameAfterLogIn() {
+ $this-&gt;get('http://www.my-site.com/login.php');<strong>
+ $this-&gt;setCookie('SID', 'Some other session');
+ $this-&gt;get('http://www.my-site.com/restricted.php');</strong>
+ $this-&gt;assertText('Access denied');
+ }
+}
+</pre>
+ Is your site protected from this attack?
+ </p>
+
+ <p>
+<a class="target" name="session">
+<h2>Browser sessions</h2>
+</a>
+</p>
+ <p>
+ If you are testing an authentication system a critical piece
+ of behaviour is what happens when a user logs back in.
+ We would like to simulate closing and reopening a browser...
+<pre>
+class LogInTest extends WebTestCase {
+ ...
+ function testLoseAuthenticationAfterBrowserClose() {
+ $this-&gt;get('http://www.my-site.com/login.php');
+ $this-&gt;setField('u', 'Me');
+ $this-&gt;setField('p', 'Secret');
+ $this-&gt;click('Log in');
+ $this-&gt;assertText('Welcome Me');<strong>
+
+ $this-&gt;restart();
+ $this-&gt;get('http://www.my-site.com/restricted.php');
+ $this-&gt;assertText('Access denied');</strong>
+ }
+}
+</pre>
+ The <span class="new_code">WebTestCase::restart()</span> method will
+ preserve cookies that have unexpired timeouts, but throw away
+ those that are temporary or expired.
+ You can optionally specify the time and date that the restart
+ happened.
+ </p>
+ <p>
+ Expiring cookies can be a problem.
+ After all, if you have a cookie that expires after an hour,
+ you don't want to stall the test for an hour while the
+ cookie passes it's timeout.
+ </p>
+ <p>
+ To push the cookies over the hour limit you can age them
+ before you restart the session...
+<pre>
+class LogInTest extends WebTestCase {
+ ...
+ function testLoseAuthenticationAfterOneHour() {
+ $this-&gt;get('http://www.my-site.com/login.php');
+ $this-&gt;setField('u', 'Me');
+ $this-&gt;setField('p', 'Secret');
+ $this-&gt;click('Log in');
+ $this-&gt;assertText('Welcome Me');
+ <strong>
+ $this-&gt;ageCookies(3600);</strong>
+ $this-&gt;restart();
+ $this-&gt;get('http://www.my-site.com/restricted.php');
+ $this-&gt;assertText('Access denied');
+ }
+}
+</pre>
+ After the restart it will appear that cookies are an
+ hour older and any that pass their expiry will have
+ disappeared.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ SimpleTest project page on <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ SimpleTest download page on <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+<li>
+ The <a href="http://simpletest.sourceforge.net/">developer's API for SimpleTest</a>
+ gives full detail on the classes and assertions available.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <span class="chosen">Authentication</span>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/en/browser_documentation.html b/tests/simpletest/docs/en/browser_documentation.html
new file mode 100755
index 0000000000..748d7fa052
--- /dev/null
+++ b/tests/simpletest/docs/en/browser_documentation.html
@@ -0,0 +1,428 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>SimpleTest documentation for the scriptable web browser component</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <span class="chosen">Scriptable browser</span>
+</div>
+</div>
+<h1>PHP Scriptable Web Browser</h1>
+ This page...
+ <ul>
+<li>
+ Using the bundled <a href="#scripting">web browser in scripts</a>
+ </li>
+<li>
+ <a href="#debug">Debugging</a> failed pages
+ </li>
+<li>
+ Complex <a href="#unit">tests with multiple web browsers</a>
+ </li>
+</ul>
+<div class="content">
+
+ <p>
+ SimpleTest's web browser component can be used not just
+ outside of the <span class="new_code">WebTestCase</span> class, but also
+ independently of the SimpleTest framework itself.
+ </p>
+
+ <p>
+<a class="target" name="scripting">
+<h2>The Scriptable Browser</h2>
+</a>
+</p>
+ <p>
+ You can use the web browser in PHP scripts to confirm
+ services are up and running, or to extract information
+ from them at a regular basis.
+ For example, here is a small script to extract the current number of
+ open PHP 5 bugs from the <a href="http://www.php.net/">PHP web site</a>...
+<pre>
+<strong>&lt;?php
+ require_once('simpletest/browser.php');
+
+ $browser = &amp;new SimpleBrowser();
+ $browser-&gt;get('http://php.net/');
+ $browser-&gt;click('reporting bugs');
+ $browser-&gt;click('statistics');
+ $page = $browser-&gt;click('PHP 5 bugs only');
+ preg_match('/status=Open.*?by=Any.*?(\d+)&lt;\/a&gt;/', $page, $matches);
+ print $matches[1];
+?&gt;</strong>
+</pre>
+ There are simpler methods to do this particular example in PHP
+ of course.
+ For example you can just use the PHP <span class="new_code">file()</span>
+ command against what here is a pretty fixed page.
+ However, using the web browser for scripts allows authentication,
+ correct handling of cookies, automatic loading of frames, redirects,
+ form submission and the ability to examine the page headers.
+ Such methods are fragile against a site that is constantly
+ evolving and you would want a more direct way of accessing
+ data in a permanent set up, but for simple tasks this can provide
+ a very rapid solution.
+ </p>
+ <p>
+ All of the navigation methods used in the
+ <a href="web_tester_documentation.html">WebTestCase</a>
+ are present in the <span class="new_code">SimpleBrowser</span> class, but
+ the assertions are replaced with simpler accessors.
+ Here is a full list of the page navigation methods...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">addHeader($header)</span></td><td>Adds a header to every fetch</td>
+</tr>
+ <tr>
+<td><span class="new_code">useProxy($proxy, $username, $password)</span></td><td>Use this proxy from now on</td>
+</tr>
+ <tr>
+<td><span class="new_code">head($url, $parameters)</span></td><td>Perform a HEAD request</td>
+</tr>
+ <tr>
+<td><span class="new_code">get($url, $parameters)</span></td><td>Fetch a page with GET</td>
+</tr>
+ <tr>
+<td><span class="new_code">post($url, $parameters)</span></td><td>Fetch a page with POST</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickLink($label)</span></td><td>Follows a link by label</td>
+</tr>
+ <tr>
+<td><span class="new_code">isLink($label)</span></td><td>See if a link is present by label</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickLinkById($id)</span></td><td>Follows a link by attribute</td>
+</tr>
+ <tr>
+<td><span class="new_code">isLinkById($id)</span></td><td>See if a link is present by attribut</td>
+</tr>
+ <tr>
+<td><span class="new_code">getUrl()</span></td><td>Current URL of page or frame</td>
+</tr>
+ <tr>
+<td><span class="new_code">getTitle()</span></td><td>Page title</td>
+</tr>
+ <tr>
+<td><span class="new_code">getContent()</span></td><td>Raw page or frame</td>
+</tr>
+ <tr>
+<td><span class="new_code">getContentAsText()</span></td><td>HTML removed except for alt text</td>
+</tr>
+ <tr>
+<td><span class="new_code">retry()</span></td><td>Repeat the last request</td>
+</tr>
+ <tr>
+<td><span class="new_code">back()</span></td><td>Use the browser back button</td>
+</tr>
+ <tr>
+<td><span class="new_code">forward()</span></td><td>Use the browser forward button</td>
+</tr>
+ <tr>
+<td><span class="new_code">authenticate($username, $password)</span></td><td>Retry page or frame after a 401 response</td>
+</tr>
+ <tr>
+<td><span class="new_code">restart($date)</span></td><td>Restarts the browser for a new session</td>
+</tr>
+ <tr>
+<td><span class="new_code">ageCookies($interval)</span></td><td>Ages the cookies by the specified time</td>
+</tr>
+ <tr>
+<td><span class="new_code">setCookie($name, $value)</span></td><td>Sets an additional cookie</td>
+</tr>
+ <tr>
+<td><span class="new_code">getCookieValue($host, $path, $name)</span></td><td>Reads the most specific cookie</td>
+</tr>
+ <tr>
+<td><span class="new_code">getCurrentCookieValue($name)</span></td><td>Reads cookie for the current context</td>
+</tr>
+ </tbody>
+</table>
+ The methods <span class="new_code">SimpleBrowser::useProxy()</span> and
+ <span class="new_code">SimpleBrowser::addHeader()</span> are special.
+ Once called they continue to apply to all subsequent fetches.
+ </p>
+ <p>
+ Navigating forms is similar to the
+ <a href="form_testing_documentation.html">WebTestCase form navigation</a>...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">setField($name, $value)</span></td><td>Sets all form fields with that name</td>
+</tr>
+ <tr>
+<td><span class="new_code">setFieldById($id, $value)</span></td><td>Sets all form fields with that id</td>
+</tr>
+ <tr>
+<td><span class="new_code">getField($name)</span></td><td>Accessor for a form element value</td>
+</tr>
+ <tr>
+<td><span class="new_code">getFieldById($id)</span></td><td>Accessor for a form element value</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickSubmit($label)</span></td><td>Submits form by button label</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickSubmitByName($name)</span></td><td>Submits form by button attribute</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickSubmitById($id)</span></td><td>Submits form by button attribute</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickImage($label, $x, $y)</span></td><td>Clicks the image by alt text</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickImageByName($name, $x, $y)</span></td><td>Clicks the image by attribute</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickImageById($id, $x, $y)</span></td><td>Clicks the image by attribute</td>
+</tr>
+ <tr>
+<td><span class="new_code">submitFormById($id)</span></td><td>Submits by the form tag attribute</td>
+</tr>
+ </tbody>
+</table>
+ At the moment there aren't any methods to list available forms
+ and fields.
+ This will probably be added to later versions of SimpleTest.
+ </p>
+ <p>
+ Within a page, individual frames can be selected.
+ If no selection is made then all the frames are merged together
+ in one large conceptual page.
+ The content of the current page will be a concatenation of all of the
+ frames in the order that they were specified in the "frameset"
+ tags.
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">getFrames()</span></td><td>A dump of the current frame structure</td>
+</tr>
+ <tr>
+<td><span class="new_code">getFrameFocus()</span></td><td>Current frame label or index</td>
+</tr>
+ <tr>
+<td><span class="new_code">setFrameFocusByIndex($choice)</span></td><td>Select a frame numbered from 1</td>
+</tr>
+ <tr>
+<td><span class="new_code">setFrameFocus($name)</span></td><td>Select frame by label</td>
+</tr>
+ <tr>
+<td><span class="new_code">clearFrameFocus()</span></td><td>Treat all the frames as a single page</td>
+</tr>
+ </tbody>
+</table>
+ When focused on a single frame, the content will come from
+ that frame only.
+ This includes links to click and forms to submit.
+ </p>
+
+ <p>
+<a class="target" name="debug">
+<h2>What went wrong?</h2>
+</a>
+</p>
+ <p>
+ All of this functionality is great when we actually manage to fetch pages,
+ but that doesn't always happen.
+ To help figure out what went wrong, the browser has some methods to
+ aid in debugging...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">setConnectionTimeout($timeout)</span></td><td>Close the socket on overrun</td>
+</tr>
+ <tr>
+<td><span class="new_code">getRequest()</span></td><td>Raw request header of page or frame</td>
+</tr>
+ <tr>
+<td><span class="new_code">getHeaders()</span></td><td>Raw response header of page or frame</td>
+</tr>
+ <tr>
+<td><span class="new_code">getTransportError()</span></td><td>Any socket level errors in the last fetch</td>
+</tr>
+ <tr>
+<td><span class="new_code">getResponseCode()</span></td><td>HTTP response of page or frame</td>
+</tr>
+ <tr>
+<td><span class="new_code">getMimeType()</span></td><td>Mime type of page or frame</td>
+</tr>
+ <tr>
+<td><span class="new_code">getAuthentication()</span></td><td>Authentication type in 401 challenge header</td>
+</tr>
+ <tr>
+<td><span class="new_code">getRealm()</span></td><td>Authentication realm in 401 challenge header</td>
+</tr>
+ <tr>
+<td><span class="new_code">setMaximumRedirects($max)</span></td><td>Number of redirects before page is loaded anyway</td>
+</tr>
+ <tr>
+<td><span class="new_code">setMaximumNestedFrames($max)</span></td><td>Protection against recursive framesets</td>
+</tr>
+ <tr>
+<td><span class="new_code">ignoreFrames()</span></td><td>Disables frames support</td>
+</tr>
+ <tr>
+<td><span class="new_code">useFrames()</span></td><td>Enables frames support</td>
+</tr>
+ <tr>
+<td><span class="new_code">ignoreCookies()</span></td><td>Disables sending and receiving of cookies</td>
+</tr>
+ <tr>
+<td><span class="new_code">useCookies()</span></td><td>Enables cookie support</td>
+</tr>
+ </tbody>
+</table>
+ The methods <span class="new_code">SimpleBrowser::setConnectionTimeout()</span>
+ <span class="new_code">SimpleBrowser::setMaximumRedirects()</span>,
+ <span class="new_code">SimpleBrowser::setMaximumNestedFrames()</span>,
+ <span class="new_code">SimpleBrowser::ignoreFrames()</span>,
+ <span class="new_code">SimpleBrowser::useFrames()</span>,
+ <span class="new_code">SimpleBrowser::ignoreCookies()</span> and
+ <span class="new_code">SimpleBrowser::useCokies()</span> continue to apply
+ to every subsequent request.
+ The other methods are frames aware.
+ This means that if you have an individual frame that is not
+ loading, navigate to it using <span class="new_code">SimpleBrowser::setFrameFocus()</span>
+ and you can then use <span class="new_code">SimpleBrowser::getRequest()</span>, etc to
+ see what happened.
+ </p>
+
+ <p>
+<a class="target" name="unit">
+<h2>Complex unit tests with multiple browsers</h2>
+</a>
+</p>
+ <p>
+ Anything that could be done in a
+ <a href="web_tester_documentation.html">WebTestCase</a> can
+ now be done in a <a href="unit_tester_documentation.html">UnitTestCase</a>.
+ This means that we can freely mix domain object testing with the
+ web interface...
+<pre>
+<strong>
+class TestOfRegistration extends UnitTestCase {
+ function testNewUserAddedToAuthenticator() {</strong>
+ $browser = &amp;new SimpleBrowser();
+ $browser-&gt;get('http://my-site.com/register.php');
+ $browser-&gt;setField('email', 'me@here');
+ $browser-&gt;setField('password', 'Secret');
+ $browser-&gt;click('Register');
+ <strong>
+ $authenticator = &amp;new Authenticator();
+ $member = &amp;$authenticator-&gt;findByEmail('me@here');
+ $this-&gt;assertEqual($member-&gt;getPassword(), 'Secret');
+ }
+}</strong>
+</pre>
+ While this may be a useful temporary expediency, I am not a fan
+ of this type of testing.
+ The testing has cut across application layers, make it twice as
+ likely it will need refactoring when the code changes.
+ </p>
+ <p>
+ A more useful case of where using the browser directly can be helpful
+ is where the <span class="new_code">WebTestCase</span> cannot cope.
+ An example is where two browsers are needed at the same time.
+ </p>
+ <p>
+ For example, say we want to disallow multiple simultaneous
+ usage of a site with the same username.
+ This test case will do the job...
+<pre>
+class TestOfSecurity extends UnitTestCase {
+ function testNoMultipleLoginsFromSameUser() {<strong>
+ $first = &amp;new SimpleBrowser();
+ $first-&gt;get('http://my-site.com/login.php');
+ $first-&gt;setField('name', 'Me');
+ $first-&gt;setField('password', 'Secret');
+ $first-&gt;click('Enter');
+ $this-&gt;assertEqual($first-&gt;getTitle(), 'Welcome');
+
+ $second = &amp;new SimpleBrowser();
+ $second-&gt;get('http://my-site.com/login.php');
+ $second-&gt;setField('name', 'Me');
+ $second-&gt;setField('password', 'Secret');
+ $second-&gt;click('Enter');
+ $this-&gt;assertEqual($second-&gt;getTitle(), 'Access Denied');</strong>
+ }
+}
+</pre>
+ You can also use the <span class="new_code">SimpleBrowser</span> class
+ directly when you want to write test cases using a different
+ test tool than SimpleTest.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ SimpleTest project page on <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ SimpleTest download page on <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+<li>
+ The <a href="http://simpletest.sourceforge.net/">developer's API for SimpleTest</a>
+ gives full detail on the classes and assertions available.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <span class="chosen">Scriptable browser</span>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/en/docs.css b/tests/simpletest/docs/en/docs.css
new file mode 100755
index 0000000000..6ee7160d96
--- /dev/null
+++ b/tests/simpletest/docs/en/docs.css
@@ -0,0 +1,121 @@
+body {
+ padding-left: 3%;
+ padding-right: 3%;
+}
+h1, h2, h3 {
+ font-family: sans-serif;
+}
+h1 {
+ text-align: center;
+}
+pre {
+ font-family: courier, typewriter, monospace;
+ font-size: 90%;
+ border: 1px solid;
+ border-color: #999966;
+ background-color: #ffffcc;
+ padding: 5px;
+ margin-left: 20px;
+ margin-right: 40px;
+}
+.code, .new_code, pre.new_code {
+ font-family: courier, typewriter, monospace;
+ font-weight: bold;
+}
+div.copyright {
+ font-size: 80%;
+ color: gray;
+}
+div.copyright a {
+ margin-top: 1em;
+ color: gray;
+}
+ul.api {
+ border: 2px outset;
+ border-color: gray;
+ background-color: white;
+ margin: 5px;
+ margin-left: 5%;
+ margin-right: 5%;
+}
+ul.api li {
+ margin-top: 0.2em;
+ margin-bottom: 0.2em;
+ list-style: none;
+ text-indent: -3em;
+ padding-left: 1em;
+}
+div.demo {
+ border: 4px ridge;
+ border-color: gray;
+ padding: 10px;
+ margin: 5px;
+ margin-left: 20px;
+ margin-right: 40px;
+ background-color: white;
+}
+div.demo span.fail {
+ color: red;
+}
+div.demo span.pass {
+ color: green;
+}
+div.demo h1 {
+ font-size: 12pt;
+ text-align: left;
+ font-weight: bold;
+}
+div.menu {
+ text-align: center;
+}
+table {
+ border: 2px outset;
+ border-color: gray;
+ background-color: white;
+ margin: 5px;
+ margin-left: 5%;
+ margin-right: 5%;
+}
+td {
+ font-size: 90%;
+}
+.shell {
+ color: white;
+}
+pre.shell {
+ border: 4px ridge;
+ border-color: gray;
+ padding: 10px;
+ margin: 5px;
+ margin-left: 20px;
+ margin-right: 40px;
+ background-color: #000100;
+ color: #99ff99;
+ font-size: 90%;
+}
+pre.file {
+ color: black;
+ border: 1px solid;
+ border-color: black;
+ padding: 10px;
+ margin: 5px;
+ margin-left: 20px;
+ margin-right: 40px;
+ background-color: white;
+ font-size: 90%;
+}
+form.demo {
+ background-color: lightgray;
+ border: 4px outset;
+ border-color: lightgray;
+ padding: 10px;
+ margin-right: 40%;
+}
+dl, dd {
+ margin: 10px;
+ margin-left: 30px;
+}
+em {
+ font-weight: bold;
+ font-family: courier, typewriter, monospace;
+}
diff --git a/tests/simpletest/docs/en/expectation_documentation.html b/tests/simpletest/docs/en/expectation_documentation.html
new file mode 100755
index 0000000000..6c82a6fdf5
--- /dev/null
+++ b/tests/simpletest/docs/en/expectation_documentation.html
@@ -0,0 +1,431 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>
+ Extending the SimpleTest unit tester with additional expectation classes
+ </title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <span class="chosen">Expectations</span>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Expectation documentation</h1>
+ This page...
+ <ul>
+<li>
+ Using expectations for
+ <a href="#mock">more precise testing with mock objects</a>
+ </li>
+<li>
+ <a href="#behaviour">Changing mock object behaviour</a> with expectations
+ </li>
+<li>
+ <a href="#extending">Extending the expectations</a>
+ </li>
+<li>
+ Underneath SimpleTest <a href="#unit">uses expectation classes</a>
+ </li>
+</ul>
+<div class="content">
+ <p>
+<a class="target" name="mock">
+<h2>More control over mock objects</h2>
+</a>
+</p>
+ <p>
+ The default behaviour of the
+ <a href="mock_objects_documentation.html">mock objects</a>
+ in
+ <a href="http://sourceforge.net/projects/simpletest/">SimpleTest</a>
+ is either an identical match on the argument or to allow any argument at all.
+ For almost all tests this is sufficient.
+ Sometimes, though, you want to weaken a test case.
+ </p>
+ <p>
+ One place where a test can be too tightly coupled is with
+ text matching.
+ Suppose we have a component that outputs a helpful error
+ message when something goes wrong.
+ You want to test that the correct error was sent, but the actual
+ text may be rather long.
+ If you test for the text exactly, then every time the exact wording
+ of the message changes, you will have to go back and edit the test suite.
+ </p>
+ <p>
+ For example, suppose we have a news service that has failed
+ to connect to its remote source.
+<pre>
+<strong>class NewsService {
+ ...
+ function publish(&amp;$writer) {
+ if (! $this-&gt;isConnected()) {
+ $writer-&gt;write('Cannot connect to news service "' .
+ $this-&gt;_name . '" at this time. ' .
+ 'Please try again later.');
+ }
+ ...
+ }
+}</strong>
+</pre>
+ Here it is sending its content to a
+ <span class="new_code">Writer</span> class.
+ We could test this behaviour with a
+ <span class="new_code">MockWriter</span> like so...
+<pre>
+class TestOfNewsService extends UnitTestCase {
+ ...
+ function testConnectionFailure() {<strong>
+ $writer = &amp;new MockWriter();
+ $writer-&gt;expectOnce('write', array(
+ 'Cannot connect to news service ' .
+ '"BBC News" at this time. ' .
+ 'Please try again later.'));
+
+ $service = &amp;new NewsService('BBC News');
+ $service-&gt;publish($writer);</strong>
+ }
+}
+</pre>
+ This is a good example of a brittle test.
+ If we decide to add additional instructions, such as
+ suggesting an alternative news source, we will break
+ our tests even though no underlying functionality
+ has been altered.
+ </p>
+ <p>
+ To get around this, we would like to do a regular expression
+ test rather than an exact match.
+ We can actually do this with...
+<pre>
+class TestOfNewsService extends UnitTestCase {
+ ...
+ function testConnectionFailure() {
+ $writer = &amp;new MockWriter();<strong>
+ $writer-&gt;expectOnce(
+ 'write',
+ array(new PatternExpectation('/cannot connect/i')));</strong>
+
+ $service = &amp;new NewsService('BBC News');
+ $service-&gt;publish($writer);
+ }
+}
+</pre>
+ Instead of passing in the expected parameter to the
+ <span class="new_code">MockWriter</span> we pass an
+ expectation class called
+ <span class="new_code">WantedPatternExpectation</span>.
+ The mock object is smart enough to recognise this as special
+ and to treat it differently.
+ Rather than simply comparing the incoming argument to this
+ object, it uses the expectation object itself to
+ perform the test.
+ </p>
+ <p>
+ The <span class="new_code">WantedPatternExpectation</span> takes
+ the regular expression to match in its constructor.
+ Whenever a comparison is made by the <span class="new_code">MockWriter</span>
+ against this expectation class, it will do a
+ <span class="new_code">preg_match()</span> with this pattern.
+ With our test case above, as long as "cannot connect"
+ appears in the text of the string, the mock will issue a pass
+ to the unit tester.
+ The rest of the text does not matter.
+ </p>
+ <p>
+ The possible expectation classes are...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">AnythingExpectation</span></td><td>Will always match</td>
+</tr>
+ <tr>
+<td><span class="new_code">EqualExpectation</span></td><td>An equality, rather than the stronger identity comparison</td>
+</tr>
+ <tr>
+<td><span class="new_code">NotEqualExpectation</span></td><td>An inequality comparison</td>
+</tr>
+ <tr>
+<td><span class="new_code">IndenticalExpectation</span></td><td>The default mock object check which must match exactly</td>
+</tr>
+ <tr>
+<td><span class="new_code">NotIndenticalExpectation</span></td><td>Inverts the mock object logic</td>
+</tr>
+ <tr>
+<td><span class="new_code">WithinMarginExpectation</span></td><td>Compares a value to within a margin</td>
+</tr>
+ <tr>
+<td><span class="new_code">OutsideMarginExpectation</span></td><td>Checks that a value is out side the margin</td>
+</tr>
+ <tr>
+<td><span class="new_code">PatternExpectation</span></td><td>Uses a Perl Regex to match a string</td>
+</tr>
+ <tr>
+<td><span class="new_code">NoPatternExpectation</span></td><td>Passes only if failing a Perl Regex</td>
+</tr>
+ <tr>
+<td><span class="new_code">IsAExpectation</span></td><td>Checks the type or class name only</td>
+</tr>
+ <tr>
+<td><span class="new_code">NotAExpectation</span></td><td>Opposite of the <span class="new_code">IsAExpectation</span></td>
+</tr>
+ <tr>
+<td><span class="new_code">MethodExistsExpectation</span></td><td>Checks a method is available on an object</td>
+</tr>
+ </tbody>
+</table>
+ Most take the expected value in the constructor.
+ The exceptions are the pattern matchers, which take a regular expression,
+ and the <span class="new_code">IsAExpectation</span> and <span class="new_code">NotAExpectation</span> which takes a type
+ or class name as a string.
+ </p>
+ <p>
+ Some examples...
+ </p>
+ <p>
+<pre>
+$mock-&gt;expectOnce('method', array(new IdenticalExpectation(14)));
+</pre>
+ This is the same as <span class="new_code">$mock-&gt;expectOnce('method', array(14))</span>.
+<pre>
+$mock-&gt;expectOnce('method', array(new EqualExpectation(14)));
+</pre>
+ This is different from the previous version in that the string
+ <span class="new_code">"14"</span> as a parameter will also pass.
+ Sometimes the additional type checks of SimpleTest are too restrictive.
+<pre>
+$mock-&gt;expectOnce('method', array(new AnythingExpectation(14)));
+</pre>
+ This is the same as <span class="new_code">$mock-&gt;expectOnce('method', array('*'))</span>.
+<pre>
+$mock-&gt;expectOnce('method', array(new IdenticalExpectation('*')));
+</pre>
+ This is handy if you want to assert a literal <span class="new_code">"*"</span>.
+<pre>
+new NotIdenticalExpectation(14)
+</pre>
+ This matches on anything other than integer 14.
+ Even the string <span class="new_code">"14"</span> would pass.
+<pre>
+new WithinMarginExpectation(14.0, 0.001)
+</pre>
+ This will accept any value from 13.999 to 14.001 inclusive.
+ </p>
+
+ <p>
+<a class="target" name="behaviour">
+<h2>Using expectations to control stubs</h2>
+</a>
+</p>
+ <p>
+ The expectation classes can be used not just for sending assertions
+ from mock objects, but also for selecting behaviour for the
+ <a href="mock_objects_documentation.html">mock objects</a>.
+ Anywhere a list of arguments is given, a list of expectation objects
+ can be inserted instead.
+ </p>
+ <p>
+ Suppose we want a mock authorisation server to simulate a successful login,
+ but only if it receives a valid session object.
+ We can do this as follows...
+<pre>
+Mock::generate('Authorisation');
+<strong>
+$authorisation = new MockAuthorisation();
+$authorisation-&gt;setReturnValue(
+ 'isAllowed',
+ true,
+ array(new IsAExpectation('Session', 'Must be a session')));
+$authorisation-&gt;setReturnValue('isAllowed', false);</strong>
+</pre>
+ We have set the default mock behaviour to return false when
+ <span class="new_code">isAllowed</span> is called.
+ When we call the method with a single parameter that
+ is a <span class="new_code">Session</span> object, it will return true.
+ We have also added a second parameter as a message.
+ This will be displayed as part of the mock object
+ failure message if this expectation is the cause of
+ a failure.
+ </p>
+ <p>
+ This kind of sophistication is rarely useful, but is included for
+ completeness.
+ </p>
+
+ <p>
+<a class="target" name="extending">
+<h2>Creating your own expectations</h2>
+</a>
+</p>
+ <p>
+ The expectation classes have a very simple structure.
+ So simple that it is easy to create your own versions for
+ commonly used test logic.
+ </p>
+ <p>
+ As an example here is the creation of a class to test for
+ valid IP addresses.
+ In order to work correctly with the stubs and mocks the new
+ expectation class should extend
+ <span class="new_code">SimpleExpectation</span>...
+<pre>
+<strong>class ValidIp extends SimpleExpectation {
+
+ function test($ip) {
+ return (ip2long($ip) != -1);
+ }
+
+ function testMessage($ip) {
+ return "Address [$ip] should be a valid IP address";
+ }
+}</strong>
+</pre>
+ There are only two methods to implement.
+ The <span class="new_code">test()</span> method should
+ evaluate to true if the expectation is to pass, and
+ false otherwise.
+ The <span class="new_code">testMessage()</span> method
+ should simply return some helpful text explaining the test
+ that was carried out.
+ </p>
+ <p>
+ This class can now be used in place of the earlier expectation
+ classes.
+ </p>
+
+ <p>
+<a class="target" name="unit">
+<h2>Under the bonnet of the unit tester</h2>
+</a>
+</p>
+ <p>
+ The <a href="http://sourceforge.net/projects/simpletest/">SimpleTest unit testing framework</a>
+ also uses the expectation classes internally for the
+ <a href="unit_test_documentation.html">UnitTestCase class</a>.
+ We can also take advantage of these mechanisms to reuse our
+ homebrew expectation classes within the test suites directly.
+ </p>
+ <p>
+ The most crude way of doing this is to use the
+ <span class="new_code">SimpleTest::assert()</span> method to
+ test against it directly...
+<pre>
+<strong>class TestOfNetworking extends UnitTestCase {
+ ...
+ function testGetValidIp() {
+ $server = &amp;new Server();
+ $this-&gt;assert(
+ new ValidIp(),
+ $server-&gt;getIp(),
+ 'Server IP address-&gt;%s');
+ }
+}</strong>
+</pre>
+ This is a little untidy compared with our usual
+ <span class="new_code">assert...()</span> syntax.
+ </p>
+ <p>
+ For such a simple case we would normally create a
+ separate assertion method on our test case rather
+ than bother using the expectation class.
+ If we pretend that our expectation is a little more
+ complicated for a moment, so that we want to reuse it,
+ we get...
+<pre>
+class TestOfNetworking extends UnitTestCase {
+ ...<strong>
+ function assertValidIp($ip, $message = '%s') {
+ $this-&gt;assert(new ValidIp(), $ip, $message);
+ }</strong>
+
+ function testGetValidIp() {
+ $server = &amp;new Server();<strong>
+ $this-&gt;assertValidIp(
+ $server-&gt;getIp(),
+ 'Server IP address-&gt;%s');</strong>
+ }
+}
+</pre>
+ It is unlikely we would ever need this degree of control
+ over the testing machinery.
+ It is rare to need the expectations for more than pattern
+ matching.
+ Also, complex expectation classes could make the tests
+ harder to read and debug.
+ These mechanisms are really of most use to authors of systems
+ that will extend the test framework to create their own tool set.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ SimpleTest project page on <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ SimpleTest download page on <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+<li>
+ The expectations mimic the constraints in <a href="http://www.jmock.org/">JMock</a>.
+ </li>
+<li>
+ <a href="http://simpletest.sourceforge.net/">Full API for SimpleTest</a>
+ from the PHPDoc.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <span class="chosen">Expectations</span>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/en/form_testing_documentation.html b/tests/simpletest/docs/en/form_testing_documentation.html
new file mode 100755
index 0000000000..f981570b5c
--- /dev/null
+++ b/tests/simpletest/docs/en/form_testing_documentation.html
@@ -0,0 +1,316 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Simple Test documentation for testing HTML forms</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <span class="chosen">Testing forms</span>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Form testing documentation</h1>
+ This page...
+ <ul>
+<li>
+ Changing form values and successfully
+ <a href="#submit">Submitting a simple form</a>
+ </li>
+<li>
+ Handling <a href="#multiple">widgets with multiple values</a>
+ by setting lists.
+ </li>
+<li>
+ <a href="#raw">Raw posting</a> when you don't have a button
+ to click.
+ </li>
+</ul>
+<div class="content">
+ <p>
+<a class="target" name="submit">
+<h2>Submitting a simple form</h2>
+</a>
+</p>
+ <p>
+ When a page is fetched by the <span class="new_code">WebTestCase</span>
+ using <span class="new_code">get()</span> or
+ <span class="new_code">post()</span> the page content is
+ automatically parsed.
+ This results in any form controls that are inside &lt;form&gt; tags
+ being available from within the test case.
+ For example, if we have this snippet of HTML...
+<pre>
+&lt;form&gt;
+ &lt;input type="text" name="a" value="A default" /&gt;
+ &lt;input type="submit" value="Go" /&gt;
+&lt;/form&gt;
+</pre>
+ Which looks like this...
+ </p>
+ <p>
+ <form class="demo">
+ <input type="text" name="a" value="A default">
+ <input type="submit" value="Go">
+ </form>
+ </p>
+ <p>
+ We can navigate to this code, via the
+ <a href="http://www.lastcraft.com/form_testing_documentation.php">LastCraft</a>
+ site, with the following test...
+<pre>
+class SimpleFormTests extends WebTestCase {
+ <strong>
+ function testDefaultValue() {
+ $this-&gt;get('http://www.lastcraft.com/form_testing_documentation.php');
+ $this-&gt;assertField('a', 'A default');
+ }</strong>
+}
+</pre>
+ Immediately after loading the page all of the HTML controls are set at
+ their default values just as they would appear in the web browser.
+ The assertion tests that a HTML widget exists in the page with the
+ name "a" and that it is currently set to the value
+ "A default".
+ As usual, we could use a pattern expectation instead if a fixed
+ string.
+ </p>
+ <p>
+ We could submit the form straight away, but first we'll change
+ the value of the text field and only then submit it...
+<pre>
+class SimpleFormTests extends WebTestCase {
+
+ function testDefaultValue() {
+ $this-&gt;get('http://www.my-site.com/');
+ $this-&gt;assertField('a', 'A default');<strong>
+ $this-&gt;setField('a', 'New value');
+ $this-&gt;click('Go');</strong>
+ }
+}
+</pre>
+ Because we didn't specify a method attribute on the form tag, and
+ didn't specify an action either, the test case will follow
+ the usual browser behaviour of submitting the form data as a <em>GET</em>
+ request back to the same location.
+ SimpleTest tries to emulate typical browser behaviour as much as possible,
+ rather than attempting to catch missing attributes on tags.
+ This is because the target of the testing framework is the PHP application
+ logic, not syntax or other errors in the HTML code.
+ For HTML errors, other tools such as
+ <a href="http://www.w3.org/People/Raggett/tidy/">HTMLTidy</a> should be used.
+ </p>
+ <p>
+ If a field is not present in any form, or if an option is unavailable,
+ then <span class="new_code">WebTestCase::setField()</span> will return
+ <span class="new_code">false</span>.
+ For example, suppose we wish to verify that a "Superuser"
+ option is not present in this form...
+<pre>
+&lt;strong&gt;Select type of user to add:&lt;/strong&gt;
+&lt;select name="type"&gt;
+ &lt;option&gt;Subscriber&lt;/option&gt;
+ &lt;option&gt;Author&lt;/option&gt;
+ &lt;option&gt;Administrator&lt;/option&gt;
+&lt;/select&gt;
+</pre>
+ Which looks like...
+ </p>
+ <p>
+ <form class="demo">
+ <strong>Select type of user to add:</strong>
+ <select name="type">
+ <option>Subscriber</option>
+ <option>Author</option>
+ <option>Administrator</option>
+ </select>
+ </form>
+ </p>
+ <p>
+ The following test will confirm it...
+<pre>
+class SimpleFormTests extends WebTestCase {
+ ...
+ function testNoSuperuserChoiceAvailable() {<strong>
+ $this-&gt;get('http://www.lastcraft.com/form_testing_documentation.php');
+ $this-&gt;assertFalse($this-&gt;setField('type', 'Superuser'));</strong>
+ }
+}
+</pre>
+ The selection will not be changed on a failure to set
+ a widget value.
+ </p>
+ <p>
+ Here is the full list of widgets currently supported...
+ <ul>
+ <li>Text fields, including hidden and password fields.</li>
+ <li>Submit buttons including the button tag, although not yet reset buttons</li>
+ <li>Text area. This includes text wrapping behaviour.</li>
+ <li>Checkboxes, including multiple checkboxes in the same form.</li>
+ <li>Drop down selections, including multiple selects.</li>
+ <li>Radio buttons.</li>
+ <li>Images.</li>
+ </ul>
+ </p>
+ <p>
+ Although most standard HTML widgets are catered for by <em>SimpleTest</em>'s
+ built in parser, it is unlikely that JavaScript will be implemented
+ anytime soon.
+ </p>
+
+ <p>
+<a class="target" name="multiple">
+<h2>Fields with multiple values</h2>
+</a>
+</p>
+ <p>
+ SimpleTest can cope with two types of multivalue controls: Multiple
+ selection drop downs, and multiple checkboxes with the same name
+ within a form.
+ The multivalue nature of these means that setting and testing
+ are slightly different.
+ Using checkboxes as an example...
+<pre>
+&lt;form class="demo"&gt;
+ &lt;strong&gt;Create privileges allowed:&lt;/strong&gt;
+ &lt;input type="checkbox" name="crud" value="c" checked&gt;&lt;br&gt;
+ &lt;strong&gt;Retrieve privileges allowed:&lt;/strong&gt;
+ &lt;input type="checkbox" name="crud" value="r" checked&gt;&lt;br&gt;
+ &lt;strong&gt;Update privileges allowed:&lt;/strong&gt;
+ &lt;input type="checkbox" name="crud" value="u" checked&gt;&lt;br&gt;
+ &lt;strong&gt;Destroy privileges allowed:&lt;/strong&gt;
+ &lt;input type="checkbox" name="crud" value="d" checked&gt;&lt;br&gt;
+ &lt;input type="submit" value="Enable Privileges"&gt;
+&lt;/form&gt;
+</pre>
+ Which renders as...
+ </p>
+ <p>
+ <form class="demo">
+ <strong>Create privileges allowed:</strong>
+ <input type="checkbox" name="crud" value="c" checked>
+<br>
+ <strong>Retrieve privileges allowed:</strong>
+ <input type="checkbox" name="crud" value="r" checked>
+<br>
+ <strong>Update privileges allowed:</strong>
+ <input type="checkbox" name="crud" value="u" checked>
+<br>
+ <strong>Destroy privileges allowed:</strong>
+ <input type="checkbox" name="crud" value="d" checked>
+<br>
+ <input type="submit" value="Enable Privileges">
+ </form>
+ </p>
+ <p>
+ If we wish to disable all but the retrieval privileges and
+ submit this information we can do it like this...
+<pre>
+class SimpleFormTests extends WebTestCase {
+ ...<strong>
+ function testDisableNastyPrivileges() {
+ $this-&gt;get('http://www.lastcraft.com/form_testing_documentation.php');
+ $this-&gt;assertField('crud', array('c', 'r', 'u', 'd'));
+ $this-&gt;setField('crud', array('r'));
+ $this-&gt;click('Enable Privileges');
+ }</strong>
+}
+</pre>
+ Instead of setting the field to a single value, we give it a list
+ of values.
+ We do the same when testing expected values.
+ We can then write other test code to confirm the effect of this, perhaps
+ by logging in as that user and attempting an update.
+ </p>
+ <p>
+ <a class="target" name="raw">
+<h2>Raw posting</h2>
+</a>
+ </p>
+ <p>
+ If you want to test a form handler, but have not yet written
+ or do not have access to the form itself, you can create a
+ form submission by hand.
+<pre>
+class SimpleFormTests extends WebTestCase {
+ ...<strong>
+ function testAttemptedHack() {
+ $this-&gt;post(
+ 'http://www.my-site.com/add_user.php',
+ array('type' =&gt; 'superuser'));
+ $this-&gt;assertNoText('user created');
+ }</strong>
+}
+</pre>
+ By adding data to the <span class="new_code">WebTestCase::post()</span>
+ method, we are attempting to fetch the page as a form submission.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ SimpleTest project page on <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ SimpleTest download page on <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+<li>
+ The <a href="http://simpletest.sourceforge.net/">developer's API for SimpleTest</a>
+ gives full detail on the classes and assertions available.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <span class="chosen">Testing forms</span>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/en/group_test_documentation.html b/tests/simpletest/docs/en/group_test_documentation.html
new file mode 100755
index 0000000000..5334036fba
--- /dev/null
+++ b/tests/simpletest/docs/en/group_test_documentation.html
@@ -0,0 +1,401 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>SimpleTest for PHP test suites</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <span class="chosen">Group tests</span>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Test suite documentation</h1>
+ This page...
+ <ul>
+<li>
+ Different ways to <a href="#group">group tests</a> together.
+ </li>
+<li>
+ Combining group tests into <a href="#higher">larger groups</a>.
+ </li>
+<li>
+ Integrating <a href="#legacy">legacy test cases</a> from other
+ types of PHPUnit.
+ </li>
+</ul>
+<div class="content">
+ <p>
+<a class="target" name="group">
+<h2>Grouping tests into suites</h2>
+</a>
+</p>
+ <p>
+ To run test cases as part of a group, the test cases should really
+ be placed in files without the runner code...
+<pre>
+<strong>&lt;?php
+ require_once('../classes/io.php');
+
+ class FileTester extends UnitTestCase {
+ ...
+ }
+
+ class SocketTester extends UnitTestCase {
+ ...
+ }
+?&gt;</strong>
+</pre>
+ As many cases as needed can appear in a single file.
+ They should include any code they need, such as the library
+ being tested, but none of the simple test libraries.
+ </p>
+ <p>
+ If you have extended any test cases, you can include them
+ as well. In PHP 4...
+<pre>
+&lt;?php
+ require_once('../classes/io.php');
+<strong>
+ class MyFileTestCase extends UnitTestCase {
+ ...
+ }
+ SimpleTest::ignore('MyFileTestCase');</strong>
+
+ class FileTester extends MyFileTestCase { ... }
+
+ class SocketTester extends UnitTestCase { ... }
+?&gt;
+</pre>
+ The <span class="new_code">FileTester</span> class does
+ not contain any actual tests, but is a base class for other
+ test cases.
+ For this reason we use the
+ <span class="new_code">SimpleTestOptions::ignore()</span> directive
+ to tell the upcoming group test to ignore it.
+ This directive can appear anywhere in the file and works
+ when a whole file of test cases is loaded (see below).
+ </p>
+ <p>
+ If you are using PHP 5, you do not need this special directive at all.
+ Simply mark any test cases that should not be run as abstract...
+<pre>
+<strong>abstract</strong> class MyFileTestCase extends UnitTestCase {
+ ...
+}
+
+class FileTester extends MyFileTestCase { ... }
+
+class SocketTester extends UnitTestCase { ... }
+</pre>
+ </p>
+ <p>
+ We will call this sample <em>file_test.php</em>.
+ Next we create a group test file, called say <em>my_group_test.php</em>.
+ You will think of a better name I am sure.
+ </p>
+ <p>
+ We will add the test file using a safe method...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');<strong>
+ require_once('file_test.php');
+
+ $test = &amp;new TestSuite('All file tests');
+ $test-&gt;addTestCase(new FileTestCase());
+ $test-&gt;run(new HtmlReporter());</strong>
+?&gt;
+</pre>
+ This instantiates the test case before the test suite is
+ run.
+ This could get a little expensive with a large number of test
+ cases, and can be surprising behaviour.
+ </p>
+ <p>
+ The main problem is that for every test case
+ that we add we will have
+ to <span class="new_code">require_once()</span> the test code
+ file and manually instantiate each and every test case.
+ </p>
+ <p>
+ We can save a lot of typing with...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');
+
+ $test = &amp;new TestSuite('All file tests');<strong>
+ $test-&gt;addTestFile('file_test.php');</strong>
+ $test-&gt;run(new HtmlReporter());
+?&amp;gt;
+</pre>
+ What happens here is that the <span class="new_code">TestSuite</span>
+ class has done the <span class="new_code">require_once()</span>
+ for us.
+ It then checks to see if any new test case classes
+ have been created by the new file and automatically adds
+ them to the group test.
+ Now all we have to do is add each new file.
+ </p>
+ <p>
+ No only that, but you can guarantee that the constructor is run
+ just before the first test method and, in PHP 5, the destructor
+ is run just after the last test method.
+ </p>
+ <p>
+ There are two things that could go wrong and which require care...
+ <ol>
+ <li>
+ The file could already have been parsed by PHP, and so no
+ new classes will have been added. You should make
+ sure that the test cases are only included in this file
+ and no others.
+ </li>
+ <li>
+ New test case extension classes that get included will be
+ placed in the group test and run also.
+ You will need to add a <span class="new_code">SimpleTestOptions::ignore()</span>
+ directive for these classes, or make sure that they are included
+ before the <span class="new_code">TestSuite::addTestFile()</span>
+ line, or make sure that they are abstract classes.
+ </li>
+ </ol>
+ </p>
+
+ <p>
+<a class="target" name="higher">
+<h2>Composite suites</h2>
+</a>
+</p>
+ <p>
+ The above method places all of the test cases into one large group.
+ For larger projects though this may not be flexible enough; you
+ may want to group the tests in all sorts of ways.
+ </p>
+ <p>
+ To get a more flexible group test we can subclass
+ <span class="new_code">TestSuite</span> and then instantiate it as needed...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');
+ <strong>
+ class FileTestSuite extends TestSuite {
+ function FileTestSuite() {
+ $this-&gt;TestSuite('All file tests');
+ $this-&gt;addTestFile('file_test.php');
+ }
+ }</strong>
+?&gt;
+</pre>
+ This effectively names the test in the constructor and then
+ adds our test cases and a single group below.
+ Of course we can add more than one group at this point.
+ We can now invoke the tests from a separate runner file...
+<pre>
+&lt;?php
+ require_once('file_test_suite.php');
+ <strong>
+ $test = &amp;new FileTestSuite();
+ $test-&gt;run(new HtmlReporter());</strong>
+?&gt;
+</pre>
+ ...or we can group them into even larger group tests.
+ We can even mix groups and test cases freely as long as
+ we are careful about double includes...
+<pre>
+&lt;?php
+ <strong>
+ $test = &amp;new BigTestSuite('Big group');
+ $test-&gt;addTestFile('file_test_suite.php');
+ $test-&gt;addTestFile('some_test_case.php');</strong>
+ $test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ In the event of a double include, ony the first instance
+ of the test case will be run.
+ </p>
+ <p>
+ If we still wish to run the original group test, and we
+ don't want all of these little runner files, we can
+ put the test runner code around guard bars when we create
+ each group.
+<pre>
+&lt;?php
+ class FileTestSuite extends TestSuite {
+ function FileTestSuite() {
+ $this-&gt;TestSuite('All file tests');
+ $test-&gt;addTestFile('file_test.php');
+ }
+ }
+ <strong>
+ if (! defined('RUNNER')) {
+ define('RUNNER', true);</strong>
+ $test = &amp;new FileTestSuite();
+ $test-&gt;run(new HtmlReporter());
+ }
+?&gt;
+</pre>
+ This approach requires the guard to be set when including
+ the group test file, but this is still less hassle than
+ lots of separate runner files.
+ You include the same guard on the top level tests to make sure
+ that <span class="new_code">run()</span> will run once only
+ from the top level script that has been invoked.
+<pre>
+&lt;?php<strong>
+ define('RUNNER', true);</strong>
+ require_once('file_test_suite.php');
+
+ $test = &amp;new BigTestSuite('Big group');
+ $test-&gt;addTestCase(new FileTestSuite());
+ $test-&gt;addTestCase(...);
+ $test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ As with the normal test cases, a <span class="new_code">TestSuite</span> can
+ be loaded with the <span class="new_code">TestSuite::addTestFile()</span> method.
+<pre>
+&lt;?php
+ define('RUNNER', true);
+
+ $test = &amp;new BigTestSuite('Big group');<strong>
+ $test-&gt;addTestFile('file_test_suite.php');
+ $test-&gt;addTestFile(...);</strong>
+ $test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ </p>
+
+ <p>
+<a class="target" name="legacy">
+<h2>Integrating legacy test cases</h2>
+</a>
+</p>
+ <p>
+ If you already have unit tests for your code or are extending external
+ classes that have tests, it is unlikely that all of the test cases
+ are in SimpleTest format.
+ Fortunately it is possible to incorporate test cases from other
+ unit testers directly into SimpleTest group tests.
+ </p>
+ <p>
+ Say we have the following
+ <a href="http://sourceforge.net/projects/phpunit">PhpUnit</a>
+ test case in the file <em>config_test.php</em>...
+<pre>
+<strong>class ConfigFileTest extends TestCase {
+ function ConfigFileTest() {
+ $this-&gt;TestCase('Config file test');
+ }
+
+ function testContents() {
+ $config = new ConfigFile('test.conf');
+ $this-&gt;assertRegexp('/me/', $config-&gt;getValue('username'));
+ }
+}</strong>
+</pre>
+ The group test can recognise this as long as we include
+ the appropriate adapter class before we add the test
+ file...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');<strong>
+ require_once('simpletest/adapters/phpunit_test_case.php');</strong>
+
+ $test = &amp;new TestSuite('All file tests');<strong>
+ $test-&gt;addTestFile('config_test.php');</strong>
+ $test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ There are only two adapters, the other is for the
+ <a href="http://pear.php.net/manual/en/package.php.phpunit.php">PEAR</a>
+ 1.0 unit tester...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');<strong>
+ require_once('simpletest/adapters/pear_test_case.php');</strong>
+
+ $test = &amp;new TestSuite('All file tests');<strong>
+ $test-&gt;addTestFile('some_pear_test_cases.php');</strong>
+ $test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ The PEAR test cases can be freely mixed with SimpleTest
+ ones even in the same test file,
+ but you cannot use SimpleTest assertions in the legacy
+ test case versions.
+ This is done as a check that you are not accidently making
+ your test cases completely dependent on SimpleTest.
+ You may want to do a PEAR release of your library for example,
+ which would mean shipping it with valid PEAR::PhpUnit test
+ cases.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ SimpleTest project page on <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ SimpleTest download page on <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <span class="chosen">Group tests</span>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/en/index.html b/tests/simpletest/docs/en/index.html
new file mode 100755
index 0000000000..38a3a73206
--- /dev/null
+++ b/tests/simpletest/docs/en/index.html
@@ -0,0 +1,503 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>
+ Download the Simple Test testing framework -
+ Unit tests and mock objects for PHP
+ </title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<span class="chosen">SimpleTest</span>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Simple Test for PHP</h1>
+ This page...
+ <ul>
+<li>
+ <a href="#unit">Using unit tester</a>
+ with an example.
+ </li>
+<li>
+ <a href="#group">Grouping tests</a>
+ for testing with one click.
+ </li>
+<li>
+ <a href="#mock">Using mock objects</a>
+ to ease testing and gain tighter control.
+ </li>
+<li>
+ <a href="#web">Testing web pages</a>
+ at the browser level.
+ </li>
+</ul>
+<div class="content">
+
+
+ <p>
+ The following assumes that you are familiar with the concept
+ of unit testing as well as the PHP web development language.
+ It is a guide for the impatient new user of
+ <a href="https://sourceforge.net/project/showfiles.php?group_id=76550">SimpleTest</a>.
+ For fuller documentation, especially if you are new
+ to unit testing see the ongoing
+ <a href="unit_test_documentation.html">documentation</a>, and for
+ example test cases see the
+ <a href="http://www.lastcraft.com/first_test_tutorial.php">unit testing tutorial</a>.
+ </p>
+
+ <p>
+<a class="target" name="unit">
+<h2>Using the tester quickly</h2>
+</a>
+</p>
+ <p>
+ Amongst software testing tools, a unit tester is the one
+ closest to the developer.
+ In the context of agile development the test code sits right
+ next to the source code as both are written simultaneously.
+ In this context SimpleTest aims to be a complete PHP developer
+ test solution and is called "Simple" because it
+ should be easy to use and extend.
+ It wasn't a good choice of name really.
+ It includes all of the typical functions you would expect from
+ <a href="http://www.junit.org/">JUnit</a> and the
+ <a href="http://sourceforge.net/projects/phpunit/">PHPUnit</a>
+ ports, but also adds
+ <a href="http://www.mockobjects.com">mock objects</a>.
+ It has some <a href="http://sourceforge.net/projects/jwebunit/">JWebUnit</a>
+ functionality as well.
+ This includes web page navigation, cookie testing and form submission.
+ </p>
+ <p>
+ The quickest way to demonstrate is with an example.
+ </p>
+ <p>
+ Let us suppose we are testing a simple file logging class called
+ <span class="new_code">Log</span> in <em>classes/log.php</em>.
+ We start by creating a test script which we will call
+ <em>tests/log_test.php</em> and populate it as follows...
+<pre>
+&lt;?php<strong>
+require_once('simpletest/unit_tester.php');
+require_once('simpletest/reporter.php');
+require_once('../classes/log.php');
+
+class TestOfLogging extends UnitTestCase {
+}</strong>
+?&gt;
+</pre>
+ Here the <em>simpletest</em> folder is either local or in the path.
+ You would have to edit these locations depending on where you
+ placed the toolset.
+ The <span class="new_code">TestOfLogging</span> is our frst test case and it's
+ currently empty.
+ </p>
+ <p>
+ Now we have five lines of scaffolding code and still no tests.
+ However from this part on we get return on our investment very quickly.
+ We'll assume that the <span class="new_code">Log</span> class
+ takes the file name to write to in the constructor and we have
+ a temporary folder in which to place this file...
+<pre>
+&lt;?php
+require_once('simpletest/unit_tester.php');
+require_once('simpletest/reporter.php');
+require_once('../classes/log.php');
+
+class TestOfLogging extends UnitTestCase {
+ <strong>
+ function testCreatingNewFile() {
+ @unlink('/temp/test.log');
+ $log = new Log('/temp/test.log');
+ $this-&gt;assertFalse(file_exists('/temp/test.log'));
+ $log-&gt;message('Should write this to a file');
+ $this-&gt;assertTrue(file_exists('/temp/test.log'));
+ }</strong>
+}
+?&gt;
+</pre>
+ When a test case runs it will search for any method that
+ starts with the string <span class="new_code">test</span>
+ and execute that method.
+ We would normally have more than one test method of course.
+ Assertions within the test methods trigger messages to the
+ test framework which displays the result immediately.
+ This immediate response is important, not just in the event
+ of the code causing a crash, but also so that
+ <span class="new_code">print</span> statements can display
+ their content right next to the test case concerned.
+ </p>
+ <p>
+ To see these results we have to actually run the tests.
+ If this is the only test case we wish to run we can achieve
+ it with...
+<pre>
+&lt;?php
+require_once('simpletest/unit_tester.php');
+require_once('simpletest/reporter.php');
+require_once('../classes/log.php');
+
+class TestOfLogging extends UnitTestCase {
+
+ function testCreatingNewFile() {
+ @unlink('/temp/test.log');
+ $log = new Log('/temp/test.log');
+ $this-&gt;assertFalse(file_exists('/temp/test.log'));
+ $log-&gt;message('Should write this to a file');
+ $this-&gt;assertTrue(file_exists('/temp/test.log'));
+ }
+}
+<strong>
+$test = &amp;new TestOfLogging();
+$test-&gt;run(new HtmlReporter());</strong>
+?&gt;
+</pre>
+ </p>
+ <p>
+ On failure the display looks like this...
+ <div class="demo">
+ <h1>testoflogging</h1>
+ <span class="fail">Fail</span>: testcreatingnewfile-&gt;True assertion failed.<br>
+ <div style="padding: 8px; margin-top: 1em; background-color: red; color: white;">1/1 test cases complete.
+ <strong>1</strong> passes and <strong>1</strong> fails.</div>
+ </div>
+ ...and if it passes like this...
+ <div class="demo">
+ <h1>testoflogging</h1>
+ <div style="padding: 8px; margin-top: 1em; background-color: green; color: white;">1/1 test cases complete.
+ <strong>2</strong> passes and <strong>0</strong> fails.</div>
+ </div>
+ And if you get this...
+ <div class="demo">
+ <b>Fatal error</b>: Failed opening required '../classes/log.php' (include_path='') in <b>/home/marcus/projects/lastcraft/tutorial_tests/Log/tests/log_test.php</b> on line <b>7</b>
+ </div>
+ it means you're missing the <em>classes/Log.php</em> file that could look like...
+<pre>
+&lt;?php
+class Log {
+
+ function Log($file_path) {
+ }
+
+ function message() {
+ }
+}
+?&gt;;
+</pre>
+ </p>
+
+ <p>
+<a class="target" name="group">
+<h2>Building group tests</h2>
+</a>
+</p>
+ <p>
+ It is unlikely in a real application that we will only ever run
+ one test case.
+ This means that we need a way of grouping cases into a test
+ script that can, if need be, run every test in the application.
+ </p>
+ <p>
+ Our first step is to strip the includes and to undo our
+ previous hack...
+<pre>
+&lt;?php<strong>
+require_once('../classes/log.php');</strong>
+
+class TestOfLogging extends UnitTestCase {
+
+ function testCreatingNewFile() {
+ @unlink('/temp/test.log');
+ $log = new Log('/temp/test.log');
+ $this-&gt;assertFalse(file_exists('/temp/test.log'));
+ $log-&gt;message('Should write this to a file');
+ $this-&gt;assertTrue(file_exists('/temp/test.log'));<strong>
+ }
+}
+?&gt;</strong>
+</pre>
+ Next we create a new file called <em>tests/all_tests.php</em>
+ and insert the following code...
+<pre>
+<strong>&lt;?php
+require_once('simpletest/unit_tester.php');
+require_once('simpletest/reporter.php');
+
+$test = &amp;new TestSuite('All tests');
+$test-&gt;addTestFile('log_test.php');
+$test-&gt;run(new HtmlReporter());
+?&gt;</strong>
+</pre>
+ The method <span class="new_code">TestSuite::addTestFile()</span>
+ will include the test case file and read any new classes created
+ that are descended from <span class="new_code">SimpleTestCase</span>, of which
+ <span class="new_code">UnitTestCase</span> is one example.
+ Just the class names are stored for now, so that the test runner
+ can instantiate the class when it works its way
+ through your test suite.
+ </p>
+ <p>
+ For this to work properly the test case file should not blindly include
+ any other test case extensions that do not actually run tests.
+ This could result in extra test cases being counted during the test
+ run.
+ Hardly a major problem, but to avoid this inconvenience simply add
+ a <span class="new_code">SimpleTestOptions::ignore()</span> directive
+ somewhere in the test case file.
+ Also the test case file should not have been included
+ elsewhere or no cases will be added to this group test.
+ This would be a more serious error as if the test case classes are
+ already loaded by PHP the <span class="new_code">TestSuite::addTestFile()</span>
+ method will not detect them.
+ </p>
+ <p>
+ To display the results it is necessary only to invoke
+ <em>tests/all_tests.php</em> from the web server.
+ </p>
+
+ <p>
+<a class="target" name="mock">
+<h2>Using mock objects</h2>
+</a>
+</p>
+ <p>
+ Let's move further into the future.
+ </p>
+ <p>
+ Assume that our logging class is tested and completed.
+ Assume also that we are testing another class that is
+ required to write log messages, say a
+ <span class="new_code">SessionPool</span>.
+ We want to test a method that will probably end up looking
+ like this...
+<pre>
+<strong>
+class SessionPool {
+ ...
+ function logIn($username) {
+ ...
+ $this-&gt;_log-&gt;message("User $username logged in.");
+ ...
+ }
+ ...
+}
+</strong>
+</pre>
+ In the spirit of reuse we are using our
+ <span class="new_code">Log</span> class.
+ A conventional test case might look like this...
+<pre>
+<strong>
+&lt;?php
+require_once('../classes/log.php');
+require_once('../classes/session_pool.php');
+
+class TestOfSessionLogging extends UnitTestCase {
+
+ function setUp() {
+ @unlink('/temp/test.log');
+ }
+
+ function tearDown() {
+ @unlink('/temp/test.log');
+ }
+
+ function testLogInIsLogged() {
+ $log = new Log('/temp/test.log');
+ $session_pool = &amp;new SessionPool($log);
+ $session_pool-&gt;logIn('fred');
+ $messages = file('/temp/test.log');
+ $this-&gt;assertEqual($messages[0], "User fred logged in.\n");
+ }
+}
+?&gt;</strong>
+</pre>
+ This test case design is not all bad, but it could be improved.
+ We are spending time fiddling with log files which are
+ not part of our test. Worse, we have created close ties
+ with the <span class="new_code">Log</span> class and
+ this test.
+ What if we don't use files any more, but use ths
+ <em>syslog</em> library instead?
+ Did you notice the extra carriage return in the message?
+ Was that added by the logger?
+ What if it also added a time stamp or other data?
+ </p>
+ <p>
+ The only part that we really want to test is that a particular
+ message was sent to the logger.
+ We reduce coupling if we can pass in a fake logging class
+ that simply records the message calls for testing, but
+ takes no action.
+ It would have to look exactly like our original though.
+ </p>
+ <p>
+ If the fake object doesn't write to a file then we save on deleting
+ the file before and after each test. We could save even more
+ test code if the fake object would kindly run the assertion for us.
+ <p>
+ </p>
+ Too good to be true?
+ Luckily we can create such an object easily...
+<pre>
+&lt;?php
+require_once('../classes/log.php');
+require_once('../classes/session_pool.php');<strong>
+Mock::generate('Log');</strong>
+
+class TestOfSessionLogging extends UnitTestCase {
+
+ function testLogInIsLogged() {<strong>
+ $log = &amp;new MockLog();
+ $log-&gt;expectOnce('message', array('User fred logged in.'));</strong>
+ $session_pool = &amp;new SessionPool($log);
+ $session_pool-&gt;logIn('fred');
+ }
+}
+?&gt;
+</pre>
+ The test will be triggered when the call to
+ <span class="new_code">message()</span> is invoked on the
+ <span class="new_code">MockLog</span> object.
+ The mock call will trigger a parameter comparison and then send the
+ resulting pass or fail event to the test display.
+ Wildcards can be included here too so as to prevent tests
+ becoming too specific.
+ </p>
+ <p>
+ If the mock reaches the end of the test case without the
+ method being called, the <span class="new_code">expectOnce()</span>
+ expectation will trigger a test failure.
+ In other words the mocks can detect the absence of
+ behaviour as well as the presence.
+ </p>
+ <p>
+ The mock objects in the SimpleTest suite can have arbitrary
+ return values set, sequences of returns, return values
+ selected according to the incoming arguments, sequences of
+ parameter expectations and limits on the number of times
+ a method is to be invoked.
+ </p>
+ <p>
+ For this test to run the mock objects library must have been
+ included in the test suite, say in <em>all_tests.php</em>.
+ </p>
+
+ <p>
+<a class="target" name="web">
+<h2>Web page testing</h2>
+</a>
+</p>
+ <p>
+ One of the requirements of web sites is that they produce web
+ pages.
+ If you are building a project top-down and you want to fully
+ integrate testing along the way then you will want a way of
+ automatically navigating a site and examining output for
+ correctness.
+ This is the job of a web tester.
+ </p>
+ <p>
+ The web testing in SimpleTest is fairly primitive, there is
+ no JavaScript for example.
+ To give an idea here is a trivial example where a home
+ page is fetched, from which we navigate to an "about"
+ page and then test some client determined content.
+<pre>
+&lt;?php<strong>
+require_once('simpletest/web_tester.php');</strong>
+require_once('simpletest/reporter.php');
+<strong>
+class TestOfAbout extends WebTestCase {
+
+ function setUp() {
+ $this-&gt;get('http://test-server/index.php');
+ $this-&gt;click('About');
+ }
+
+ function testSearchEngineOptimisations() {
+ $this-&gt;assertTitle('A long title about us for search engines');
+ $this-&gt;assertPattern('/a popular keyphrase/i');
+ }
+}</strong>
+$test = &amp;new TestOfAbout();
+$test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ With this code as an acceptance test you can ensure that
+ the content always meets the specifications of both the
+ developers and the other project stakeholders.
+ </p>
+ <p>
+ <a href="http://sourceforge.net/projects/simpletest/"><img src="http://sourceforge.net/sflogo.php?group_id=76550&amp;type=5" width="210" height="62" border="0" alt="SourceForge.net Logo"></a>
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ <a href="https://sourceforge.net/project/showfiles.php?group_id=76550&amp;release_id=153280">Download PHP Simple Test</a>
+ from <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ The <a href="http://simpletest.sourceforge.net/">developer's API for SimpleTest</a>
+ gives full detail on the classes and assertions available.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<span class="chosen">SimpleTest</span>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/en/mock_objects_documentation.html b/tests/simpletest/docs/en/mock_objects_documentation.html
new file mode 100755
index 0000000000..6c97d0cd8a
--- /dev/null
+++ b/tests/simpletest/docs/en/mock_objects_documentation.html
@@ -0,0 +1,770 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>SimpleTest for PHP mock objects documentation</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <span class="chosen">Mock objects</span>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Mock objects documentation</h1>
+ This page...
+ <ul>
+<li>
+ <a href="#what">What are mock objects?</a>
+ </li>
+<li>
+ <a href="#creation">Creating mock objects</a>.
+ </li>
+<li>
+ <a href="#stub">Mocks as actors</a> or stubs.
+ </li>
+<li>
+ <a href="#expectations">Mocks as critics</a> with expectations.
+ </li>
+<li>
+ <a href="#approaches">Other approaches</a> including mock libraries.
+ </li>
+</ul>
+<div class="content">
+ <p>
+<a class="target" name="what">
+<h2>What are mock objects?</h2>
+</a>
+</p>
+ <p>
+ Mock objects have two roles during a test case: actor and critic.
+ </p>
+ <p>
+ The actor behaviour is to simulate objects that are difficult to
+ set up or time consuming to set up for a test.
+ The classic example is a database connection.
+ Setting up a test database at the start of each test would slow
+ testing to a crawl and would require the installation of the
+ database engine and test data on the test machine.
+ If we can simulate the connection and return data of our
+ choosing we not only win on the pragmatics of testing, but can
+ also feed our code spurious data to see how it responds.
+ We can simulate databases being down or other extremes
+ without having to create a broken database for real.
+ In other words, we get greater control of the test environment.
+ </p>
+ <p>
+ If mock objects only behaved as actors they would simply be
+ known as server stubs.
+ This was originally a pattern named by Robert Binder (Testing
+ object-oriented systems: models, patterns, and tools,
+ Addison-Wesley) in 1999.
+ </p>
+ <p>
+ A server stub is a simulation of an object or component.
+ It should exactly replace a component in a system for test
+ or prototyping purposes, but remain lightweight.
+ This allows tests to run more quickly, or if the simulated
+ class has not been written, to run at all.
+ </p>
+ <p>
+ However, the mock objects not only play a part (by supplying chosen
+ return values on demand) they are also sensitive to the
+ messages sent to them (via expectations).
+ By setting expected parameters for a method call they act
+ as a guard that the calls upon them are made correctly.
+ If expectations are not met they save us the effort of
+ writing a failed test assertion by performing that duty on our
+ behalf.
+ </p>
+ <p>
+ In the case of an imaginary database connection they can
+ test that the query, say SQL, was correctly formed by
+ the object that is using the connection.
+ Set them up with fairly tight expectations and you will
+ hardly need manual assertions at all.
+ </p>
+
+ <p>
+<a class="target" name="creation">
+<h2>Creating mock objects</h2>
+</a>
+</p>
+ <p>
+ In the same way that we create server stubs, all we need is an
+ existing class, say a database connection that looks like this...
+<pre>
+<strong>class DatabaseConnection {
+ function DatabaseConnection() {
+ }
+
+ function query() {
+ }
+
+ function selectQuery() {
+ }
+}</strong>
+</pre>
+ The class does not need to have been implemented yet.
+ To create a mock version of the class we need to include the
+ mock object library and run the generator...
+<pre>
+<strong>require_once('simpletest/unit_tester.php');
+require_once('simpletest/mock_objects.php');
+require_once('database_connection.php');
+
+Mock::generate('DatabaseConnection');</strong>
+</pre>
+ This generates a clone class called
+ <span class="new_code">MockDatabaseConnection</span>.
+ We can now create instances of the new class within
+ our test case...
+<pre>
+require_once('simpletest/unit_tester.php');
+require_once('simpletest/mock_objects.php');
+require_once('database_connection.php');
+
+Mock::generate('DatabaseConnection');
+<strong>
+class MyTestCase extends UnitTestCase {
+
+ function testSomething() {
+ $connection = &amp;new MockDatabaseConnection();
+ }
+}</strong>
+</pre>
+ Unlike the generated stubs the mock constructor needs a reference
+ to the test case so that it can dispatch passes and failures while
+ checking its expectations.
+ This means that mock objects can only be used within test cases.
+ Despite this their extra power means that stubs are hardly ever used
+ if mocks are available.
+ </p>
+ <p>
+ <a class="target" name="stub">
+<h2>Mocks as actors</h2>
+</a>
+ </p>
+ <p>
+ The mock version of a class has all the methods of the original,
+ so that operations like
+ <span class="new_code">$connection-&gt;query()</span> are still
+ legal.
+ The return value will be <span class="new_code">null</span>,
+ but we can change that with...
+<pre>
+<strong>$connection-&gt;setReturnValue('query', 37)</strong>
+</pre>
+ Now every time we call
+ <span class="new_code">$connection-&gt;query()</span> we get
+ the result of 37.
+ We can set the return value to anything, say a hash of
+ imaginary database results or a list of persistent objects.
+ Parameters are irrelevant here, we always get the same
+ values back each time once they have been set up this way.
+ That may not sound like a convincing replica of a
+ database connection, but for the half a dozen lines of
+ a test method it is usually all you need.
+ </p>
+ <p>
+ We can also add extra methods to the mock when generating it
+ and choose our own class name...
+<pre>
+<strong>Mock::generate('DatabaseConnection', 'MyMockDatabaseConnection', array('setOptions'));</strong>
+</pre>
+ Here the mock will behave as if the <span class="new_code">setOptions()</span>
+ existed in the original class.
+ This is handy if a class has used the PHP <span class="new_code">overload()</span>
+ mechanism to add dynamic methods.
+ You can create a special mock to simulate this situation.
+ </p>
+ <p>
+ Things aren't always that simple though.
+ One common problem is iterators, where constantly returning
+ the same value could cause an endless loop in the object
+ being tested.
+ For these we need to set up sequences of values.
+ Let's say we have a simple iterator that looks like this...
+<pre>
+class Iterator {
+ function Iterator() {
+ }
+
+ function next() {
+ }
+}
+</pre>
+ This is about the simplest iterator you could have.
+ Assuming that this iterator only returns text until it
+ reaches the end, when it returns false, we can simulate it
+ with...
+<pre>
+Mock::generate('Iterator');
+
+class IteratorTest extends UnitTestCase() {
+
+ function testASequence() {<strong>
+ $iterator = &amp;new MockIterator();
+ $iterator-&gt;setReturnValue('next', false);
+ $iterator-&gt;setReturnValueAt(0, 'next', 'First string');
+ $iterator-&gt;setReturnValueAt(1, 'next', 'Second string');</strong>
+ ...
+ }
+}
+</pre>
+ When <span class="new_code">next()</span> is called on the
+ mock iterator it will first return "First string",
+ on the second call "Second string" will be returned
+ and on any other call <span class="new_code">false</span> will
+ be returned.
+ The sequenced return values take precedence over the constant
+ return value.
+ The constant one is a kind of default if you like.
+ </p>
+ <p>
+ Another tricky situation is an overloaded
+ <span class="new_code">get()</span> operation.
+ An example of this is an information holder with name/value pairs.
+ Say we have a configuration class like...
+<pre>
+class Configuration {
+ function Configuration() {
+ }
+
+ function getValue($key) {
+ }
+}
+</pre>
+ This is a classic situation for using mock objects as
+ actual configuration will vary from machine to machine,
+ hardly helping the reliability of our tests if we use it
+ directly.
+ The problem though is that all the data comes through the
+ <span class="new_code">getValue()</span> method and yet
+ we want different results for different keys.
+ Luckily the mocks have a filter system...
+<pre>
+<strong>$config = &amp;new MockConfiguration();
+$config-&gt;setReturnValue('getValue', 'primary', array('db_host'));
+$config-&gt;setReturnValue('getValue', 'admin', array('db_user'));
+$config-&gt;setReturnValue('getValue', 'secret', array('db_password'));</strong>
+</pre>
+ The extra parameter is a list of arguments to attempt
+ to match.
+ In this case we are trying to match only one argument which
+ is the look up key.
+ Now when the mock object has the
+ <span class="new_code">getValue()</span> method invoked
+ like this...
+<pre>
+$config-&gt;getValue('db_user')
+</pre>
+ ...it will return "admin".
+ It finds this by attempting to match the calling arguments
+ to its list of returns one after another until
+ a complete match is found.
+ </p>
+ <p>
+ You can set a default argument argument like so...
+<pre>
+<strong>
+$config-&gt;setReturnValue('getValue', false, array('*'));</strong>
+</pre>
+ This is not the same as setting the return value without
+ any argument requirements like this...
+<pre>
+<strong>
+$config-&gt;setReturnValue('getValue', false);</strong>
+</pre>
+ In the first case it will accept any single argument,
+ but exactly one is required.
+ In the second case any number of arguments will do and
+ it acts as a catchall after all other matches.
+ Note that if we add further single parameter options after
+ the wildcard in the first case, they will be ignored as the wildcard
+ will match first.
+ With complex parameter lists the ordering could be important
+ or else desired matches could be masked by earlier wildcard
+ ones.
+ Declare the most specific matches first if you are not sure.
+ </p>
+ <p>
+ There are times when you want a specific object to be
+ dished out by the mock rather than a copy.
+ The PHP4 copy semantics force us to use a different method
+ for this.
+ You might be simulating a container for example...
+<pre>
+class Thing {
+}
+
+class Vector {
+ function Vector() {
+ }
+
+ function get($index) {
+ }
+}
+</pre>
+ In this case you can set a reference into the mock's
+ return list...
+<pre>
+$thing = &amp;new Thing();<strong>
+$vector = &amp;new MockVector();
+$vector-&gt;setReturnReference('get', $thing, array(12));</strong>
+</pre>
+ With this arrangement you know that every time
+ <span class="new_code">$vector-&gt;get(12)</span> is
+ called it will return the same
+ <span class="new_code">$thing</span> each time.
+ This is compatible with PHP5 as well.
+ </p>
+ <p>
+ These three factors, timing, parameters and whether to copy,
+ can be combined orthogonally.
+ For example...
+<pre>
+$complex = &amp;new MockComplexThing();
+$stuff = &amp;new Stuff();<strong>
+$complex-&gt;setReturnReferenceAt(3, 'get', $stuff, array('*', 1));</strong>
+</pre>
+ This will return the <span class="new_code">$stuff</span> only on the third
+ call and only if two parameters were set the second of
+ which must be the integer 1.
+ That should cover most simple prototyping situations.
+ </p>
+ <p>
+ A final tricky case is one object creating another, known
+ as a factory pattern.
+ Suppose that on a successful query to our imaginary
+ database, a result set is returned as an iterator with
+ each call to <span class="new_code">next()</span> giving
+ one row until false.
+ This sounds like a simulation nightmare, but in fact it can all
+ be mocked using the mechanics above.
+ </p>
+ <p>
+ Here's how...
+<pre>
+Mock::generate('DatabaseConnection');
+Mock::generate('ResultIterator');
+
+class DatabaseTest extends UnitTestCase {
+
+ function testUserFinder() {<strong>
+ $result = &amp;new MockResultIterator();
+ $result-&gt;setReturnValue('next', false);
+ $result-&gt;setReturnValueAt(0, 'next', array(1, 'tom'));
+ $result-&gt;setReturnValueAt(1, 'next', array(3, 'dick'));
+ $result-&gt;setReturnValueAt(2, 'next', array(6, 'harry'));
+
+ $connection = &amp;new MockDatabaseConnection();
+ $connection-&gt;setReturnValue('query', false);
+ $connection-&gt;setReturnReference(
+ 'query',
+ $result,
+ array('select id, name from users'));</strong>
+
+ $finder = &amp;new UserFinder($connection);
+ $this-&gt;assertIdentical(
+ $finder-&gt;findNames(),
+ array('tom', 'dick', 'harry'));
+ }
+}
+</pre>
+ Now only if our
+ <span class="new_code">$connection</span> is called with the correct
+ <span class="new_code">query()</span> will the
+ <span class="new_code">$result</span> be returned that is
+ itself exhausted after the third call to <span class="new_code">next()</span>.
+ This should be enough
+ information for our <span class="new_code">UserFinder</span> class,
+ the class actually
+ being tested here, to come up with goods.
+ A very precise test and not a real database in sight.
+ </p>
+
+ <p>
+<a class="target" name="expectations">
+<h2>Mocks as critics</h2>
+</a>
+</p>
+ <p>
+ Although the server stubs approach insulates your tests from
+ real world disruption, it is only half the benefit.
+ You can have the class under test receiving the required
+ messages, but is your new class sending correct ones?
+ Testing this can get messy without a mock objects library.
+ </p>
+ <p>
+ By way of example, suppose we have a
+ <span class="new_code">SessionPool</span> class that we
+ want to add logging to.
+ Rather than grow the original class into something more
+ complicated, we want to add this behaviour with a decorator (GOF).
+ The <span class="new_code">SessionPool</span> code currently looks
+ like this...
+<pre>
+<strong>class SessionPool {
+ function SessionPool() {
+ ...
+ }
+
+ function &amp;findSession($cookie) {
+ ...
+ }
+ ...
+}
+
+class Session {
+ ...
+}</strong>
+&lt;/php&gt;
+ While our logging code looks like this...
+&lt;php&gt;<strong>
+class Log {
+ function Log() {
+ ...
+ }
+
+ function message() {
+ ...
+ }
+}
+
+class LoggingSessionPool {
+ function LoggingSessionPool(&amp;$session_pool, &amp;$log) {
+ ...
+ }
+
+ function &amp;findSession(\$cookie) {
+ ...
+ }
+ ...
+}</strong>
+</pre>
+ Out of all of this, the only class we want to test here
+ is the <span class="new_code">LoggingSessionPool</span>.
+ In particular we would like to check that the
+ <span class="new_code">findSession()</span> method is
+ called with the correct session ID in the cookie and that
+ it sent the message "Starting session $cookie"
+ to the logger.
+ </p>
+ <p>
+ Despite the fact that we are testing only a few lines of
+ production code, here is what we would have to do in a
+ conventional test case:
+ <ol>
+ <li>Create a log object.</li>
+ <li>Set a directory to place the log file.</li>
+ <li>Set the directory permissions so we can write the log.</li>
+ <li>Create a <span class="new_code">SessionPool</span> object.</li>
+ <li>Hand start a session, which probably does lot's of things.</li>
+ <li>Invoke <span class="new_code">findSession()</span>.</li>
+ <li>Read the new Session ID (hope there is an accessor!).</li>
+ <li>Raise a test assertion to confirm that the ID matches the cookie.</li>
+ <li>Read the last line of the log file.</li>
+ <li>Pattern match out the extra logging timestamps, etc.</li>
+ <li>Assert that the session message is contained in the text.</li>
+ </ol>
+ It is hardly surprising that developers hate writing tests
+ when they are this much drudgery.
+ To make things worse, every time the logging format changes or
+ the method of creating new sessions changes, we have to rewrite
+ parts of this test even though this test does not officially
+ test those parts of the system.
+ We are creating headaches for the writers of these other classes.
+ </p>
+ <p>
+ Instead, here is the complete test method using mock object magic...
+<pre>
+Mock::generate('Session');
+Mock::generate('SessionPool');
+Mock::generate('Log');
+
+class LoggingSessionPoolTest extends UnitTestCase {
+ ...
+ function testFindSessionLogging() {<strong>
+ $session = &amp;new MockSession();
+ $pool = &amp;new MockSessionPool();
+ $pool-&gt;setReturnReference('findSession', $session);
+ $pool-&gt;expectOnce('findSession', array('abc'));
+
+ $log = &amp;new MockLog();
+ $log-&gt;expectOnce('message', array('Starting session abc'));
+
+ $logging_pool = &amp;new LoggingSessionPool($pool, $log);
+ $this-&gt;assertReference($logging_pool-&gt;findSession('abc'), $session);</strong>
+ }
+}
+</pre>
+ We start by creating a dummy session.
+ We don't have to be too fussy about this as the check
+ for which session we want is done elsewhere.
+ We only need to check that it was the same one that came
+ from the session pool.
+ </p>
+ <p>
+ <span class="new_code">findSession()</span> is a factory
+ method the simulation of which is described <a href="#stub">above</a>.
+ The point of departure comes with the first
+ <span class="new_code">expectOnce()</span> call.
+ This line states that whenever
+ <span class="new_code">findSession()</span> is invoked on the
+ mock, it will test the incoming arguments.
+ If it receives the single argument of a string "abc"
+ then a test pass is sent to the unit tester, otherwise a fail is
+ generated.
+ This was the part where we checked that the right session was asked for.
+ The argument list follows the same format as the one for setting
+ return values.
+ You can have wildcards and sequences and the order of
+ evaluation is the same.
+ </p>
+ <p>
+ We use the same pattern to set up the mock logger.
+ We tell it that it should have
+ <span class="new_code">message()</span> invoked
+ once only with the argument "Starting session abc".
+ By testing the calling arguments, rather than the logger output,
+ we insulate the test from any display changes in the logger.
+ </p>
+ <p>
+ We start to run our tests when we create the new
+ <span class="new_code">LoggingSessionPool</span> and feed
+ it our preset mock objects.
+ Everything is now under our control.
+ </p>
+ <p>
+ This is still quite a bit of test code, but the code is very
+ strict.
+ If it still seems rather daunting there is a lot less of it
+ than if we tried this without mocks and this particular test,
+ interactions rather than output, is always more work to set
+ up.
+ More often you will be testing more complex situations without
+ needing this level or precision.
+ Also some of this can be refactored into a test case
+ <span class="new_code">setUp()</span> method.
+ </p>
+ <p>
+ Here is the full list of expectations you can set on a mock object
+ in <a href="http://www.lastcraft.com/simple_test.php">SimpleTest</a>...
+ <table>
+<thead>
+ <tr>
+<th>Expectation</th><th>Needs <span class="new_code">tally()</span></th>
+</tr>
+ </thead>
+<tbody>
+<tr>
+ <td><span class="new_code">expect($method, $args)</span></td>
+ <td style="text-align: center">No</td>
+ </tr>
+ <tr>
+ <td><span class="new_code">expectAt($timing, $method, $args)</span></td>
+ <td style="text-align: center">No</td>
+ </tr>
+ <tr>
+ <td><span class="new_code">expectCallCount($method, $count)</span></td>
+ <td style="text-align: center">Yes</td>
+ </tr>
+ <tr>
+ <td><span class="new_code">expectMaximumCallCount($method, $count)</span></td>
+ <td style="text-align: center">No</td>
+ </tr>
+ <tr>
+ <td><span class="new_code">expectMinimumCallCount($method, $count)</span></td>
+ <td style="text-align: center">Yes</td>
+ </tr>
+ <tr>
+ <td><span class="new_code">expectNever($method)</span></td>
+ <td style="text-align: center">No</td>
+ </tr>
+ <tr>
+ <td><span class="new_code">expectOnce($method, $args)</span></td>
+ <td style="text-align: center">Yes</td>
+ </tr>
+ <tr>
+ <td><span class="new_code">expectAtLeastOnce($method, $args)</span></td>
+ <td style="text-align: center">Yes</td>
+ </tr>
+ </tbody>
+</table>
+ Where the parameters are...
+ <dl>
+ <dt class="new_code">$method</dt>
+ <dd>The method name, as a string, to apply the condition to.</dd>
+ <dt class="new_code">$args</dt>
+ <dd>
+ The arguments as a list. Wildcards can be included in the same
+ manner as for <span class="new_code">setReturn()</span>.
+ This argument is optional for <span class="new_code">expectOnce()</span>
+ and <span class="new_code">expectAtLeastOnce()</span>.
+ </dd>
+ <dt class="new_code">$timing</dt>
+ <dd>
+ The only point in time to test the condition.
+ The first call starts at zero.
+ </dd>
+ <dt class="new_code">$count</dt>
+ <dd>The number of calls expected.</dd>
+ </dl>
+ The method <span class="new_code">expectMaximumCallCount()</span>
+ is slightly different in that it will only ever generate a failure.
+ It is silent if the limit is never reached.
+ </p>
+ <p>
+ Like the assertions within test cases, all of the expectations
+ can take a message override as an extra parameter.
+ Also the original failure message can be embedded in the output
+ as "%s".
+ </p>
+
+ <p>
+<a class="target" name="approaches">
+<h2>Other approaches</h2>
+</a>
+</p>
+ <p>
+ There are three approaches to creating mocks including the one
+ that SimpleTest employs.
+ Coding them by hand using a base class, generating them to
+ a file and dynamically generating them on the fly.
+ </p>
+ <p>
+ Mock objects generated with <a href="simple_test.html">SimpleTest</a>
+ are dynamic.
+ They are created at run time in memory, using
+ <span class="new_code">eval()</span>, rather than written
+ out to a file.
+ This makes the mocks easy to create, a one liner,
+ especially compared with hand
+ crafting them in a parallel class hierarchy.
+ The problem is that the behaviour is usually set up in the tests
+ themselves.
+ If the original objects change the mock versions
+ that the tests rely on can get out of sync.
+ This can happen with the parallel hierarchy approach as well,
+ but is far more quickly detected.
+ </p>
+ <p>
+ The solution, of course, is to add some real integration
+ tests.
+ You don't need very many and the convenience gained
+ from the mocks more than outweighs the small amount of
+ extra testing.
+ You cannot trust code that was only tested with mocks.
+ </p>
+ <p>
+ If you are still determined to build static libraries of mocks
+ because you want to simulate very specific behaviour, you can
+ achieve the same effect using the SimpleTest class generator.
+ In your library file, say <em>mocks/connection.php</em> for a
+ database connection, create a mock and inherit to override
+ special methods or add presets...
+<pre>
+&lt;?php
+ require_once('simpletest/mock_objects.php');
+ require_once('../classes/connection.php');
+<strong>
+ Mock::generate('Connection', 'BasicMockConnection');
+ class MockConnection extends BasicMockConnection {
+ function MockConnection() {
+ $this-&gt;BasicMockConnection();
+ $this-&gt;setReturn('query', false);
+ }
+ }</strong>
+?&gt;
+</pre>
+ The generate call tells the class generator to create
+ a class called <span class="new_code">BasicMockConnection</span>
+ rather than the usual <span class="new_code">MockConnection</span>.
+ We then inherit from this to get our version of
+ <span class="new_code">MockConnection</span>.
+ By intercepting in this way we can add behaviour, here setting
+ the default value of <span class="new_code">query()</span> to be false.
+ By using the default name we make sure that the mock class
+ generator will not recreate a different one when invoked elsewhere in the
+ tests.
+ It never creates a class if it already exists.
+ As long as the above file is included first then all tests
+ that generated <span class="new_code">MockConnection</span> should
+ now be using our one instead.
+ If we don't get the order right and the mock library
+ creates one first then the class creation will simply fail.
+ </p>
+ <p>
+ Use this trick if you find you have a lot of common mock behaviour
+ or you are getting frequent integration problems at later
+ stages of testing.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ The original
+ <a href="http://www.mockobjects.com/">Mock objects</a> paper.
+ </li>
+<li>
+ SimpleTest project page on <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ SimpleTest home page on <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <span class="chosen">Mock objects</span>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/en/overview.html b/tests/simpletest/docs/en/overview.html
new file mode 100755
index 0000000000..9b677b416b
--- /dev/null
+++ b/tests/simpletest/docs/en/overview.html
@@ -0,0 +1,491 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>
+ Overview and feature list for the SimpleTest PHP unit tester and web tester
+ </title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <span class="chosen">Overview</span>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Overview of SimpleTest</h1>
+ This page...
+ <ul>
+<li>
+ <a href="#summary">Quick summary</a>
+ of the SimpleTest tool for PHP.
+ </li>
+<li>
+ <a href="#features">List of features</a>,
+ both current ones and those planned.
+ </li>
+<li>
+ There are plenty of <a href="#resources">unit testing resources</a>
+ on the web.
+ </li>
+</ul>
+<div class="content">
+ <p>
+<a class="target" name="summary">
+<h2>What is SimpleTest?</h2>
+</a>
+</p>
+ <p>
+ The heart of SimpleTest is a testing framework built around
+ test case classes.
+ These are written as extensions of base test case classes,
+ each extended with methods that actually contain test code.
+ Top level test scripts then invoke the <span class="new_code">run()</span>
+ methods on every one of these test cases in order.
+ Each test method is written to invoke various assertions that
+ the developer expects to be true such as
+ <span class="new_code">assertEqual()</span>.
+ If the expectation is correct, then a successful result is dispatched to the
+ observing test reporter, but any failure triggers an alert
+ and a description of the mismatch.
+ </p>
+ <p>
+ A <a href="unit_test_documentation.html">test case</a> looks like this...
+<pre>
+&lt;?php
+class <strong>MyTestCase</strong> extends UnitTestCase {
+ <strong>
+ function testLogWroteMessage() {
+ $log = &amp;new Log('my.log');
+ $log-&gt;message('Hello');
+ $this-&gt;assertTrue(file_exists('my.log'));
+ }</strong>
+}
+?&gt;
+</pre>
+ </p>
+ <p>
+ These tools are designed for the developer.
+ Tests are written in the PHP language itself more or less
+ as the application itself is built.
+ The advantage of using PHP itself as the testing language is that
+ there are no new languages to learn, testing can start straight away,
+ and the developer can test any part of the code.
+ Basically, all parts that can be accessed by the application code can also be
+ accessed by the test code, if they are in the same programming language.
+ </p>
+ <p>
+ The simplest type of test case is the
+ <a href="unit_tester_documentation.html">UnitTestCase</a>.
+ This class of test case includes standard tests for equality,
+ references and pattern matching.
+ All these test the typical expectations of what you would
+ expect the result of a function or method to be.
+ This is by far the most common type of test in the daily
+ routine of development, making up about 95% of test cases.
+ </p>
+ <p>
+ The top level task of a web application though is not to
+ produce correct output from its methods and objects, but
+ to generate web pages.
+ The <a href="web_tester_documentation.html">WebTestCase</a> class tests web
+ pages.
+ It simulates a web browser requesting a page, complete with
+ cookies, proxies, secure connections, authentication, forms, frames and most
+ navigation elements.
+ With this type of test case, the developer can assert that
+ information is present in the page and that forms and
+ sessions are handled correctly.
+ </p>
+ <p>
+ A <a href="web_tester_documentation.html">WebTestCase</a> looks like this...
+<pre>
+&lt;?php
+class <strong>MySiteTest</strong> extends WebTestCase {
+ <strong>
+ function testHomePage() {
+ $this-&gt;get('http://www.my-site.com/index.php');
+ $this-&gt;assertTitle('My Home Page');
+ $this-&gt;clickLink('Contact');
+ $this-&gt;assertTitle('Contact me');
+ $this-&gt;assertPattern('/Email me at/');
+ }</strong>
+}
+?&gt;
+</pre>
+ </p>
+
+ <p>
+<a class="target" name="features">
+<h2>Feature list</h2>
+</a>
+</p>
+ <p>
+ The following is a very rough outline of past and future features
+ and their expected point of release.
+ I am afraid it is liable to change without warning as meeting the
+ milestones rather depends on time available.
+ Green stuff has been coded, but not necessarily released yet.
+ If you have a pressing need for a green but unreleased feature
+ then you should check-out the code from Sourceforge CVS directly.
+ <table>
+<thead>
+ <tr>
+<th>Feature</th><th>Description</th><th>Release</th>
+</tr>
+ </thead>
+<tbody>
+<tr>
+ <td>Unit test case</td>
+ <td>Core test case class and assertions</td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>Html display</td>
+ <td>Simplest possible display</td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>Autoloading of test cases</td>
+ <td>
+ Reading a file with test cases and loading them into a
+ group test automatically
+ </td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>Mock objects</td>
+ <td>
+ Objects capable of simulating other objects removing
+ test dependencies
+ </td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>Web test case</td>
+ <td>Allows link following and title tag matching</td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>Partial mocks</td>
+ <td>
+ Mocking parts of a class for testing less than a class
+ or for complex simulations
+ </td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>Web cookie handling</td>
+ <td>Correct handling of cookies when fetching pages</td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>Following redirects</td>
+ <td>Page fetching automatically follows 300 redirects</td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>Form parsing</td>
+ <td>Ability to submit simple forms and read default form values</td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>Command line interface</td>
+ <td>Test display without the need of a web browser</td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>Exposure of expectation classes</td>
+ <td>Can create precise tests with mocks as well as test cases</td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>XML output and parsing</td>
+ <td>
+ Allows multi host testing and the integration of acceptance
+ testing extensions
+ </td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>Browser component</td>
+ <td>
+ Exposure of lower level web browser interface for more
+ detailed test cases
+ </td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>HTTP authentication</td>
+ <td>
+ Fetching protected web pages with basic authentication
+ only
+ </td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>SSL support</td>
+ <td>Can connect to https: pages</td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>Proxy support</td>
+ <td>Can connect via. common proxies</td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>Frames support</td>
+ <td>Handling of frames in web test cases</td>
+ <td style="color: green;">1.0</td>
+ </tr>
+ <tr>
+ <td>File upload testing</td>
+ <td>Can simulate the input type file tag</td>
+ <td style="color: green;">1.0.1</td>
+ </tr>
+ <tr>
+ <td>Mocking interfaces</td>
+ <td>
+ Can generate mock objects to interfaces as well as classes
+ and class interfaces are carried for type hints
+ </td>
+ <td style="color: green;">1.0.1</td>
+ </tr>
+ <tr>
+ <td>Testing exceptions</td>
+ <td>Similar to testing PHP errors</td>
+ <td style="color: green;">1.0.1</td>
+ </tr>
+ <tr>
+ <td>HTML label support</td>
+ <td>Can access all controls using the visual label</td>
+ <td style="color: green;">1.0.1</td>
+ </tr>
+ <tr>
+ <td>Base tag support</td>
+ <td>Respects page base tag when clicking</td>
+ <td style="color: green;">1.0.1</td>
+ </tr>
+ <tr>
+ <td>PHP 5 E_STRICT compliant</td>
+ <td>PHP 5 only version that works with the E_STRICT error level</td>
+ <td style="color: red;">1.1</td>
+ </tr>
+ <tr>
+ <td>BDD style fixtures</td>
+ <td>Can import fixtures using a mixin like given() method</td>
+ <td style="color: red;">1.5</td>
+ </tr>
+ <tr>
+ <td>Reporting machinery enhancements</td>
+ <td>Improved message passing for better cooperation with IDEs</td>
+ <td style="color: red;">1.5</td>
+ </tr>
+ <tr>
+ <td>Fluent mock interface</td>
+ <td>More flexible and concise mock objects</td>
+ <td style="color: red;">1.6</td>
+ </tr>
+ <tr>
+ <td>Localisation</td>
+ <td>Messages abstracted and code generated</td>
+ <td style="color: red;">1.6</td>
+ </tr>
+ <tr>
+ <td>CSS selectors</td>
+ <td>HTML content can be examined using CSS selectors</td>
+ <td style="color: red;">1.7</td>
+ </tr>
+ <tr>
+ <td>HTML table assertions</td>
+ <td>Can match HTML or table elements to expectations</td>
+ <td style="color: red;">1.7</td>
+ </tr>
+ <tr>
+ <td>Unified acceptance testing model</td>
+ <td>Content searchable through selectors combined with expectations</td>
+ <td style="color: red;">1.7</td>
+ </tr>
+ <tr>
+ <td>DatabaseTestCase</td>
+ <td>SQL selectors and DB drivers</td>
+ <td style="color: red;">1.7</td>
+ </tr>
+ <tr>
+ <td>IFrame support</td>
+ <td>Reads IFrame content that can be refreshed</td>
+ <td style="color: red;">1.8</td>
+ </tr>
+ <tr>
+ <td>Alternate HTML parsers</td>
+ <td>Can detect compiled parsers for performance improvements</td>
+ <td style="color: red;">1.8</td>
+ </tr>
+ <tr>
+ <td>Integrated Selenium support</td>
+ <td>Easy to use built in Selenium driver and tutorial</td>
+ <td style="color: red;">1.9</td>
+ </tr>
+ <tr>
+ <td>Code coverage</td>
+ <td>Reports using the bundled tool when using XDebug</td>
+ <td style="color: red;">1.9</td>
+ </tr>
+ <tr>
+ <td>Deprecation of old methods</td>
+ <td>Simpler interface for SimpleTest2</td>
+ <td style="color: red;">2.0</td>
+ </tr>
+ <tr>
+ <td>Javascript suport</td>
+ <td>Use of PECL module to add Javascript to the native browser</td>
+ <td style="color: red;">3.0</td>
+ </tr>
+ </tbody>
+</table>
+ PHP5 migraton will start straight after the version 1.0.1 series,
+ whereupon only PHP 5.1+ will be supported.
+ SimpleTest is currently compatible with PHP 5, but will not
+ make use of all of the new features until version 1.1.
+ </p>
+
+ <p>
+<a class="target" name="resources">
+<h2>Web resources for testing</h2>
+</a>
+</p>
+ <p>
+ Process is at least as important as tools.
+ The type of process that makes the heaviest use of a developer's
+ testing tool is of course
+ <a href="http://www.extremeprogramming.org/">Extreme Programming</a>.
+ This is one of the
+ <a href="http://www.agilealliance.com/articles/index">Agile Methodologies</a>
+ which combine various practices to "flatten the cost curve" of software development.
+ More extreme still is <a href="http://www.testdriven.com/modules/news/">Test Driven Development</a>,
+ where you very strictly adhere to the rule of no coding until you have a test.
+ If you're more of a planner, or believe that experience trumps evolution,
+ you may prefer the
+ <a href="http://www.therationaledge.com/content/dec_01/f_spiritOfTheRUP_pk.html">RUP</a> approach.
+ I haven't tried it, but even I can see that you will need test tools (see figure 9).
+ </p>
+ <p>
+ Most unit testers clone <a href="http://www.junit.org/">JUnit</a> to some degree,
+ as far as the interface at least. There is a wealth of information on the
+ JUnit site including the
+ <a href="http://junit.sourceforge.net/doc/faq/faq.htm">FAQ</a>
+ which contains plenty of general advice on testing.
+ Once you get bitten by the bug you will certainly appreciate the phrase
+ <a href="http://junit.sourceforge.net/doc/testinfected/testing.htm">test infected</a>
+ coined by Eric Gamma.
+ If you are still reviewing which unit tester to use the main choices
+ are <a href="http://phpunit.sourceforge.net/">PHPUnit</a>
+ and <a href="http://pear.php.net/manual/en/package.php.phpunit.php">Pear PHP::PHPUnit</a>.
+ They currently lack a lot of features found in
+ <a href="http://www.lastcraft.com/simple_test.php">SimpleTest</a>, but the PEAR
+ version at least has been upgraded for PHP5 and is recommended if you are porting
+ existing <a href="http://www.junit.org/">JUnit</a> test cases.
+ </p>
+ <p>
+ There is currently a sad lack of material on mock objects, which is a shame
+ as unit testing without them is a lot more work.
+ The <a href="http://www.sidewize.com/company/mockobjects.pdf">original mock objects paper</a>
+ is very Java focused, but still worth a read.
+ As a new technology there are plenty of discussions and debate on how to use mocks,
+ often on Wikis such as
+ <a href="http://xpdeveloper.com/cgi-bin/oldwiki.cgi?MockObjects">Extreme Tuesday</a>
+ or <a href="http://www.mockobjects.com/MocksObjectsPaper.html">www.mockobjects.com</a>
+ or <a href="http://c2.com/cgi/wiki?MockObject">the original C2 Wiki</a>.
+ Injecting mocks into a class is the main area of debate for which this
+ <a href="http://www-106.ibm.com/developerworks/java/library/j-mocktest.html">paper on IBM</a>
+ makes a good starting point.
+ </p>
+ <p>
+ There are plenty of web testing tools, but the scriptable ones
+ are mostly are written in Java and
+ tutorials and advice are rather thin on the ground.
+ The only hope is to look at the documentation for
+ <a href="http://httpunit.sourceforge.net/">HTTPUnit</a>,
+ <a href="http://htmlunit.sourceforge.net/">HTMLUnit</a>
+ or <a href="http://jwebunit.sourceforge.net/">JWebUnit</a> and hope for clues.
+ There are some XML driven test frameworks, but again most
+ require Java to run.
+ </p>
+ <p>
+ A new generation of tools that run directly in the web browser
+ are now available.
+ These include
+ <a href="http://www.openqa.org/selenium/">Selenium</a> and
+ <a href="http://wtr.rubyforge.org/">Watir</a>.
+ As SimpleTest does not support JavaScript you would probably
+ have to look at these tools anyway if you have highly dynamic
+ pages.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ <a href="unit_test_documentation.html">Documentation for SimpleTest</a>.
+ </li>
+<li>
+ <a href="http://www.lastcraft.com/first_test_tutorial.php">How to write PHP test cases</a>
+ is a fairly advanced tutorial.
+ </li>
+<li>
+ <a href="http://simpletest.sourceforge.net/">SimpleTest API</a> from phpdoc.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <span class="chosen">Overview</span>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/en/partial_mocks_documentation.html b/tests/simpletest/docs/en/partial_mocks_documentation.html
new file mode 100755
index 0000000000..39ba2c79bd
--- /dev/null
+++ b/tests/simpletest/docs/en/partial_mocks_documentation.html
@@ -0,0 +1,465 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>SimpleTest for PHP partial mocks documentation</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <span class="chosen">Partial mocks</span>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Partial mock objects documentation</h1>
+ This page...
+ <ul>
+<li>
+ <a href="#inject">The mock injection problem</a>.
+ </li>
+<li>
+ Moving creation to a <a href="#creation">protected factory</a> method.
+ </li>
+<li>
+ <a href="#partial">Partial mocks</a> generate subclasses.
+ </li>
+<li>
+ Partial mocks <a href="#less">test less than a class</a>.
+ </li>
+</ul>
+<div class="content">
+
+ <p>
+ A partial mock is simply a pattern to alleviate a specific problem
+ in testing with mock objects,
+ that of getting mock objects into tight corners.
+ It's quite a limited tool and possibly not even a good idea.
+ It is included with SimpleTest because I have found it useful
+ on more than one occasion and has saved a lot of work at that point.
+ </p>
+
+ <p>
+<a class="target" name="inject">
+<h2>The mock injection problem</h2>
+</a>
+</p>
+ <p>
+ When one object uses another it is very simple to just pass a mock
+ version in already set up with its expectations.
+ Things are rather tricker if one object creates another and the
+ creator is the one you want to test.
+ This means that the created object should be mocked, but we can
+ hardly tell our class under test to create a mock instead.
+ The tested class doesn't even know it is running inside a test
+ after all.
+ </p>
+ <p>
+ For example, suppose we are building a telnet client and it
+ needs to create a network socket to pass its messages.
+ The connection method might look something like...
+<pre>
+<strong>&lt;?php
+ require_once('socket.php');
+
+ class Telnet {
+ ...
+ function &amp;connect($ip, $port, $username, $password) {
+ $socket = &amp;new Socket($ip, $port);
+ $socket-&gt;read( ... );
+ ...
+ }
+ }
+?&gt;</strong>
+</pre>
+ We would really like to have a mock object version of the socket
+ here, what can we do?
+ </p>
+ <p>
+ The first solution is to pass the socket in as a parameter,
+ forcing the creation up a level.
+ Having the client handle this is actually a very good approach
+ if you can manage it and should lead to factoring the creation from
+ the doing.
+ In fact, this is one way in which testing with mock objects actually
+ forces you to code more tightly focused solutions.
+ They improve your programming.
+ </p>
+ <p>
+ Here this would be...
+<pre>
+&lt;?php
+ require_once('socket.php');
+
+ class Telnet {
+ ...
+ <strong>function &amp;connect(&amp;$socket, $username, $password) {
+ $socket-&gt;read( ... );
+ ...
+ }</strong>
+ }
+?&gt;
+</pre>
+ This means that the test code is typical for a test involving
+ mock objects.
+<pre>
+class TelnetTest extends UnitTestCase {
+ ...
+ function testConnection() {<strong>
+ $socket = &amp;new MockSocket($this);
+ ...
+ $telnet = &amp;new Telnet();
+ $telnet-&gt;connect($socket, 'Me', 'Secret');
+ ...</strong>
+ }
+}
+</pre>
+ It is pretty obvious though that one level is all you can go.
+ You would hardly want your top level application creating
+ every low level file, socket and database connection ever
+ needed.
+ It wouldn't know the constructor parameters anyway.
+ </p>
+ <p>
+ The next simplest compromise is to have the created object passed
+ in as an optional parameter...
+<pre>
+&lt;?php
+ require_once('socket.php');
+
+ class Telnet {
+ ...<strong>
+ function &amp;connect($ip, $port, $username, $password, $socket = false) {
+ if (!$socket) {
+ $socket = &amp;new Socket($ip, $port);
+ }
+ $socket-&gt;read( ... );</strong>
+ ...
+ return $socket;
+ }
+ }
+?&gt;
+</pre>
+ For a quick solution this is usually good enough.
+ The test now looks almost the same as if the parameter
+ was formally passed...
+<pre>
+class TelnetTest extends UnitTestCase {
+ ...
+ function testConnection() {<strong>
+ $socket = &amp;new MockSocket($this);
+ ...
+ $telnet = &amp;new Telnet();
+ $telnet-&gt;connect('127.0.0.1', 21, 'Me', 'Secret', &amp;$socket);
+ ...</strong>
+ }
+}
+</pre>
+ The problem with this approach is its untidiness.
+ There is test code in the main class and parameters passed
+ in the test case that are never used.
+ This is a quick and dirty approach, but nevertheless effective
+ in most situations.
+ </p>
+ <p>
+ The next method is to pass in a factory object to do the creation...
+<pre>
+&lt;?php
+ require_once('socket.php');
+
+ class Telnet {<strong>
+ function Telnet(&amp;$network) {
+ $this-&gt;_network = &amp;$network;
+ }</strong>
+ ...
+ function &amp;connect($ip, $port, $username, $password) {<strong>
+ $socket = &amp;$this-&gt;_network-&gt;createSocket($ip, $port);
+ $socket-&gt;read( ... );</strong>
+ ...
+ return $socket;
+ }
+ }
+?&gt;
+</pre>
+ This is probably the most highly factored answer as creation
+ is now moved into a small specialist class.
+ The networking factory can now be tested separately, but mocked
+ easily when we are testing the telnet class...
+<pre>
+class TelnetTest extends UnitTestCase {
+ ...
+ function testConnection() {<strong>
+ $socket = &amp;new MockSocket($this);
+ ...
+ $network = &amp;new MockNetwork($this);
+ $network-&gt;setReturnReference('createSocket', $socket);
+ $telnet = &amp;new Telnet($network);
+ $telnet-&gt;connect('127.0.0.1', 21, 'Me', 'Secret');
+ ...</strong>
+ }
+}
+</pre>
+ The downside is that we are adding a lot more classes to the
+ library.
+ Also we are passing a lot of factories around which will
+ make the code a little less intuitive.
+ The most flexible solution, but the most complex.
+ </p>
+ <p>
+ Is there a middle ground?
+ </p>
+
+ <p>
+<a class="target" name="creation">
+<h2>Protected factory method</h2>
+</a>
+</p>
+ <p>
+ There is a way we can circumvent the problem without creating
+ any new application classes, but it involves creating a subclass
+ when we do the actual testing.
+ Firstly we move the socket creation into its own method...
+<pre>
+&lt;?php
+ require_once('socket.php');
+
+ class Telnet {
+ ...
+ function &amp;connect($ip, $port, $username, $password) {<strong>
+ $socket = &amp;$this-&gt;_createSocket($ip, $port);</strong>
+ $socket-&gt;read( ... );
+ ...
+ }<strong>
+
+ function &amp;_createSocket($ip, $port) {
+ return new Socket($ip, $port);
+ }</strong>
+ }
+?&gt;
+</pre>
+ This is the only change we make to the application code.
+ </p>
+ <p>
+ For the test case we have to create a subclass so that
+ we can intercept the socket creation...
+<pre>
+<strong>class TelnetTestVersion extends Telnet {
+ var $_mock;
+
+ function TelnetTestVersion(&amp;$mock) {
+ $this-&gt;_mock = &amp;$mock;
+ $this-&gt;Telnet();
+ }
+
+ function &amp;_createSocket() {
+ return $this-&gt;_mock;
+ }
+}</strong>
+</pre>
+ Here I have passed the mock in the constructor, but a
+ setter would have done just as well.
+ Note that the mock was set into the object variable
+ before the constructor was chained.
+ This is necessary in case the constructor calls
+ <span class="new_code">connect()</span>.
+ Otherwise it could get a null value from
+ <span class="new_code">_createSocket()</span>.
+ </p>
+ <p>
+ After the completion of all of this extra work the
+ actual test case is fairly easy.
+ We just test our new class instead...
+<pre>
+class TelnetTest extends UnitTestCase {
+ ...
+ function testConnection() {<strong>
+ $socket = &amp;new MockSocket($this);
+ ...
+ $telnet = &amp;new TelnetTestVersion($socket);
+ $telnet-&gt;connect('127.0.0.1', 21, 'Me', 'Secret');
+ ...</strong>
+ }
+}
+</pre>
+ The new class is very simple of course.
+ It just sets up a return value, rather like a mock.
+ It would be nice if it also checked the incoming parameters
+ as well.
+ Just like a mock.
+ It seems we are likely to do this often, can
+ we automate the subclass creation?
+ </p>
+
+ <p>
+<a class="target" name="partial">
+<h2>A partial mock</h2>
+</a>
+</p>
+ <p>
+ Of course the answer is "yes" or I would have stopped writing
+ this by now!
+ The previous test case was a lot of work, but we can
+ generate the subclass using a similar approach to the mock objects.
+ </p>
+ <p>
+ Here is the partial mock version of the test...
+<pre>
+<strong>Mock::generatePartial(
+ 'Telnet',
+ 'TelnetTestVersion',
+ array('_createSocket'));</strong>
+
+class TelnetTest extends UnitTestCase {
+ ...
+ function testConnection() {<strong>
+ $socket = &amp;new MockSocket($this);
+ ...
+ $telnet = &amp;new TelnetTestVersion($this);
+ $telnet-&gt;setReturnReference('_createSocket', $socket);
+ $telnet-&gt;Telnet();
+ $telnet-&gt;connect('127.0.0.1', 21, 'Me', 'Secret');
+ ...</strong>
+ }
+}
+</pre>
+ The partial mock is a subclass of the original with
+ selected methods "knocked out" with test
+ versions.
+ The <span class="new_code">generatePartial()</span> call
+ takes three parameters: the class to be subclassed,
+ the new test class name and a list of methods to mock.
+ </p>
+ <p>
+ Instantiating the resulting objects is slightly tricky.
+ The only constructor parameter of a partial mock is
+ the unit tester reference.
+ As with the normal mock objects this is needed for sending
+ test results in response to checked expectations.
+ </p>
+ <p>
+ The original constructor is not run yet.
+ This is necessary in case the constructor is going to
+ make use of the as yet unset mocked methods.
+ We set any return values at this point and then run the
+ constructor with its normal parameters.
+ This three step construction of "new", followed
+ by setting up the methods, followed by running the constructor
+ proper is what distinguishes the partial mock code.
+ </p>
+ <p>
+ Apart from construction, all of the mocked methods have
+ the same features as mock objects and all of the unmocked
+ methods behave as before.
+ We can set expectations very easily...
+<pre>
+class TelnetTest extends UnitTestCase {
+ ...
+ function testConnection() {
+ $socket = &amp;new MockSocket($this);
+ ...
+ $telnet = &amp;new TelnetTestVersion($this);
+ $telnet-&gt;setReturnReference('_createSocket', $socket);<strong>
+ $telnet-&gt;expectOnce('_createSocket', array('127.0.0.1', 21));</strong>
+ $telnet-&gt;Telnet();
+ $telnet-&gt;connect('127.0.0.1', 21, 'Me', 'Secret');
+ ...<strong>
+ $telnet-&gt;tally();</strong>
+ }
+}
+</pre>
+ </p>
+
+ <p>
+<a class="target" name="less">
+<h2>Testing less than a class</h2>
+</a>
+</p>
+ <p>
+ The mocked out methods don't have to be factory methods,
+ they could be any sort of method.
+ In this way partial mocks allow us to take control of any part of
+ a class except the constructor.
+ We could even go as far as to mock every method
+ except one we actually want to test.
+ </p>
+ <p>
+ This last situation is all rather hypothetical, as I haven't
+ tried it.
+ I am open to the possibility, but a little worried that
+ forcing object granularity may be better for the code quality.
+ I personally use partial mocks as a way of overriding creation
+ or for occasional testing of the TemplateMethod pattern.
+ </p>
+ <p>
+ It's all going to come down to the coding standards of your
+ project to decide which mechanism you use.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ SimpleTest project page on <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ <a href="http://simpletest.sourceforge.net/">Full API for SimpleTest</a>
+ from the PHPDoc.
+ </li>
+<li>
+ The protected factory is described in
+ <a href="http://www-106.ibm.com/developerworks/java/library/j-mocktest.html">this paper from IBM</a>.
+ This is the only formal comment I have seen on this problem.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <span class="chosen">Partial mocks</span>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/en/reporter_documentation.html b/tests/simpletest/docs/en/reporter_documentation.html
new file mode 100755
index 0000000000..3998320bb5
--- /dev/null
+++ b/tests/simpletest/docs/en/reporter_documentation.html
@@ -0,0 +1,553 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>SimpleTest for PHP test runner and display documentation</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <span class="chosen">Reporting</span>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Test reporter documentation</h1>
+ This page...
+ <ul>
+<li>
+ Displaying <a href="#html">results in HTML</a>
+ </li>
+<li>
+ Displaying and <a href="#other">reporting results</a>
+ in other formats
+ </li>
+<li>
+ Using <a href="#cli">SimpleTest from the command line</a>
+ </li>
+<li>
+ Using <a href="#xml">Using XML</a> for remote testing
+ </li>
+</ul>
+<div class="content">
+
+ <p>
+ SimpleTest pretty much follows the MVC pattern
+ (Model-View-Controller).
+ The reporter classes are the view and the model is your
+ test cases and their hiearchy.
+ The controller is mostly hidden from the user of
+ SimpleTest unless you want to change how the test cases
+ are actually run, in which case it is possible to
+ override the runner objects from within the test case.
+ As usual with MVC, the controller is mostly undefined
+ and there are other places to control the test run.
+ </p>
+
+ <p>
+<a class="target" name="html">
+<h2>Reporting results in HTML</h2>
+</a>
+</p>
+ <p>
+ The default test display is minimal in the extreme.
+ It reports success and failure with the conventional red and
+ green bars and shows a breadcrumb trail of test groups
+ for every failed assertion.
+ Here's a fail...
+ <div class="demo">
+ <h1>File test</h1>
+ <span class="fail">Fail</span>: createnewfile-&gt;True assertion failed.<br>
+ <div style="padding: 8px; margin-top: 1em; background-color: red; color: white;">1/1 test cases complete.
+ <strong>0</strong> passes, <strong>1</strong> fails and <strong>0</strong> exceptions.</div>
+ </div>
+ And here all tests passed...
+ <div class="demo">
+ <h1>File test</h1>
+ <div style="padding: 8px; margin-top: 1em; background-color: green; color: white;">1/1 test cases complete.
+ <strong>1</strong> passes, <strong>0</strong> fails and <strong>0</strong> exceptions.</div>
+ </div>
+ The good news is that there are several points in the display
+ hiearchy for subclassing.
+ </p>
+ <p>
+ For web page based displays there is the
+ <span class="new_code">HtmlReporter</span> class with the following
+ signature...
+<pre>
+class HtmlReporter extends SimpleReporter {
+ public HtmlReporter($encoding) { ... }
+ public makeDry(boolean $is_dry) { ... }
+ public void paintHeader(string $test_name) { ... }
+ public void sendNoCacheHeaders() { ... }
+ public void paintFooter(string $test_name) { ... }
+ public void paintGroupStart(string $test_name, integer $size) { ... }
+ public void paintGroupEnd(string $test_name) { ... }
+ public void paintCaseStart(string $test_name) { ... }
+ public void paintCaseEnd(string $test_name) { ... }
+ public void paintMethodStart(string $test_name) { ... }
+ public void paintMethodEnd(string $test_name) { ... }
+ public void paintFail(string $message) { ... }
+ public void paintPass(string $message) { ... }
+ public void paintError(string $message) { ... }
+ public void paintException(string $message) { ... }
+ public void paintMessage(string $message) { ... }
+ public void paintFormattedMessage(string $message) { ... }
+ protected string _getCss() { ... }
+ public array getTestList() { ... }
+ public integer getPassCount() { ... }
+ public integer getFailCount() { ... }
+ public integer getExceptionCount() { ... }
+ public integer getTestCaseCount() { ... }
+ public integer getTestCaseProgress() { ... }
+}
+</pre>
+ Here is what some of these methods mean. First the display methods
+ that you will probably want to override...
+ <ul class="api">
+ <li>
+ <span class="new_code">HtmlReporter(string $encoding)</span>
+<br>
+ is the constructor.
+ Note that the unit test sets up the link to the display
+ rather than the other way around.
+ The display is a mostly passive receiver of test events.
+ This allows easy adaption of the display for other test
+ systems beside unit tests, such as monitoring servers.
+ The encoding is the character encoding you wish to
+ display the test output in.
+ In order to correctly render debug output when
+ using the web tester, this should match the encoding
+ of the site you are trying to test.
+ The available character set strings are described in
+ the PHP <a href="http://www.php.net/manual/en/function.htmlentities.php">html_entities()</a>
+ function.
+ </li>
+ <li>
+ <span class="new_code">void paintHeader(string $test_name)</span>
+<br>
+ is called once at the very start of the test when the first
+ start event arrives.
+ The first start event is usually delivered by the top level group
+ test and so this is where <span class="new_code">$test_name</span>
+ comes from.
+ It paints the page titles, CSS, body tag, etc.
+ It returns nothing (<span class="new_code">void</span>).
+ </li>
+ <li>
+ <span class="new_code">void paintFooter(string $test_name)</span>
+<br>
+ Called at the very end of the test to close any tags opened
+ by the page header.
+ By default it also displays the red/green bar and the final
+ count of results.
+ Actually the end of the test happens when a test end event
+ comes in with the same name as the one that started it all
+ at the same level.
+ The tests nest you see.
+ Closing the last test finishes the display.
+ </li>
+ <li>
+ <span class="new_code">void paintMethodStart(string $test_name)</span>
+<br>
+ is called at the start of each test method.
+ The name normally comes from method name.
+ The other test start events behave the same way except
+ that the group test one tells the reporter how large
+ it is in number of held test cases.
+ This is so that the reporter can display a progress bar
+ as the runner churns through the test cases.
+ </li>
+ <li>
+ <span class="new_code">void paintMethodEnd(string $test_name)</span>
+<br>
+ backs out of the test started with the same name.
+ </li>
+ <li>
+ <span class="new_code">void paintFail(string $message)</span>
+<br>
+ paints a failure.
+ By default it just displays the word fail, a breadcrumbs trail
+ showing the current test nesting and the message issued by
+ the assertion.
+ </li>
+ <li>
+ <span class="new_code">void paintPass(string $message)</span>
+<br>
+ by default does nothing.
+ </li>
+ <li>
+ <span class="new_code">string _getCss()</span>
+<br>
+ Returns the CSS styles as a string for the page header
+ method.
+ Additional styles have to be appended here if you are
+ not overriding the page header.
+ You will want to use this method in an overriden page header
+ if you want to include the original CSS.
+ </li>
+ </ul>
+ There are also some accessors to get information on the current
+ state of the test suite.
+ Use these to enrich the display...
+ <ul class="api">
+ <li>
+ <span class="new_code">array getTestList()</span>
+<br>
+ is the first convenience method for subclasses.
+ Lists the current nesting of the tests as a list
+ of test names.
+ The first, most deeply nested test, is first in the
+ list and the current test method will be last.
+ </li>
+ <li>
+ <span class="new_code">integer getPassCount()</span>
+<br>
+ returns the number of passes chalked up so far.
+ Needed for the display at the end.
+ </li>
+ <li>
+ <span class="new_code">integer getFailCount()</span>
+<br>
+ is likewise the number of fails so far.
+ </li>
+ <li>
+ <span class="new_code">integer getExceptionCount()</span>
+<br>
+ is likewise the number of errors so far.
+ </li>
+ <li>
+ <span class="new_code">integer getTestCaseCount()</span>
+<br>
+ is the total number of test cases in the test run.
+ This includes the grouping tests themselves.
+ </li>
+ <li>
+ <span class="new_code">integer getTestCaseProgress()</span>
+<br>
+ is the number of test cases completed so far.
+ </li>
+ </ul>
+ One simple modification is to get the HtmlReporter to display
+ the passes as well as the failures and errors...
+<pre>
+<strong>class ShowPasses extends HtmlReporter {
+
+ function paintPass($message) {
+ parent::paintPass($message);
+ print "&amp;&lt;span class=\"pass\"&gt;Pass&lt;/span&gt;: ";
+ $breadcrumb = $this-&gt;getTestList();
+ array_shift($breadcrumb);
+ print implode("-&amp;gt;", $breadcrumb);
+ print "-&amp;gt;$message&lt;br /&gt;\n";
+ }
+
+ function _getCss() {
+ return parent::_getCss() . ' .pass { color: green; }';
+ }
+}</strong>
+</pre>
+ </p>
+ <p>
+ One method that was glossed over was the <span class="new_code">makeDry()</span>
+ method.
+ If you run this method, with no parameters, on the reporter
+ before the test suite is run no actual test methods
+ will be called.
+ You will still get the events of entering and leaving the
+ test methods and test cases, but no passes or failures etc,
+ because the test code will not actually be executed.
+ </p>
+ <p>
+ The reason for this is to allow for more sophistcated
+ GUI displays that allow the selection of individual test
+ cases.
+ In order to build a list of possible tests they need a
+ report on the test structure for drawing, say a tree view
+ of the test suite.
+ With a reporter set to dry run that just sends drawing events
+ this is easily accomplished.
+ </p>
+
+ <p>
+<a class="target" name="other">
+<h2>Extending the reporter</h2>
+</a>
+</p>
+ <p>
+ Rather than simply modifying the existing display, you might want to
+ produce a whole new HTML look, or even generate text or XML.
+ Rather than override every method in
+ <span class="new_code">HtmlReporter</span> we can take one
+ step up the class hiearchy to <span class="new_code">SimpleReporter</span>
+ in the <em>simple_test.php</em> source file.
+ </p>
+ <p>
+ A do nothing display, a blank canvas for your own creation, would
+ be...
+<pre>
+<strong>require_once('simpletest/simple_test.php');</strong>
+
+class MyDisplay extends SimpleReporter {<strong>
+ </strong>
+ function paintHeader($test_name) {
+ }
+
+ function paintFooter($test_name) {
+ }
+
+ function paintStart($test_name, $size) {<strong>
+ parent::paintStart($test_name, $size);</strong>
+ }
+
+ function paintEnd($test_name, $size) {<strong>
+ parent::paintEnd($test_name, $size);</strong>
+ }
+
+ function paintPass($message) {<strong>
+ parent::paintPass($message);</strong>
+ }
+
+ function paintFail($message) {<strong>
+ parent::paintFail($message);</strong>
+ }
+}
+</pre>
+ No output would come from this class until you add it.
+ </p>
+
+ <p>
+<a class="target" name="cli">
+<h2>The command line reporter</h2>
+</a>
+</p>
+ <p>
+ SimpleTest also ships with a minimal command line reporter.
+ The interface mimics JUnit to some extent, but paints the
+ failure messages as they arrive.
+ To use the command line reporter simply substitute it
+ for the HTML version...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');
+
+ $test = &amp;new TestSuite('File test');
+ $test-&gt;addTestFile('tests/file_test.php');
+ $test-&gt;run(<strong>new TextReporter()</strong>);
+?&gt;
+</pre>
+ Then invoke the test suite from the command line...
+<pre class="shell">
+php file_test.php
+</pre>
+ You will need the command line version of PHP installed
+ of course.
+ A passing test suite looks like this...
+<pre class="shell">
+File test
+OK
+Test cases run: 1/1, Failures: 0, Exceptions: 0
+</pre>
+ A failure triggers a display like this...
+<pre class="shell">
+File test
+1) True assertion failed.
+ in createnewfile
+FAILURES!!!
+Test cases run: 1/1, Failures: 1, Exceptions: 0
+</pre>
+ </p>
+ <p>
+ One of the main reasons for using a command line driven
+ test suite is of using the tester as part of some automated
+ process.
+ To function properly in shell scripts the test script should
+ return a non-zero exit code on failure.
+ If a test suite fails the value <span class="new_code">false</span>
+ is returned from the <span class="new_code">SimpleTest::run()</span>
+ method.
+ We can use that result to exit the script with the desired return
+ code...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');
+
+ $test = &amp;new TestSuite('File test');
+ $test-&gt;addTestFile('tests/file_test.php');
+ <strong>exit ($test-&gt;run(new TextReporter()) ? 0 : 1);</strong>
+?&gt;
+</pre>
+ Of course we don't really want to create two test scripts,
+ a command line one and a web browser one, for each test suite.
+ The command line reporter includes a method to sniff out the
+ run time environment...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');
+
+ $test = &amp;new TestSuite('File test');
+ $test-&gt;addTestFile('tests/file_test.php');
+ <strong>if (TextReporter::inCli()) {</strong>
+ exit ($test-&gt;run(new TextReporter()) ? 0 : 1);
+ <strong>}</strong>
+ $test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ This is the form used within SimpleTest itself.
+ </p>
+
+ <p>
+<a class="target" name="xml">
+<h2>Remote testing</h2>
+</a>
+</p>
+ <p>
+ SimpleTest ships with an <span class="new_code">XmlReporter</span> class
+ used for internal communication.
+ When run the output looks like...
+<pre class="shell">
+&lt;?xml version="1.0"?&gt;
+&lt;run&gt;
+ &lt;group size="4"&gt;
+ &lt;name&gt;Remote tests&lt;/name&gt;
+ &lt;group size="4"&gt;
+ &lt;name&gt;Visual test with 48 passes, 48 fails and 4 exceptions&lt;/name&gt;
+ &lt;case&gt;
+ &lt;name&gt;testofunittestcaseoutput&lt;/name&gt;
+ &lt;test&gt;
+ &lt;name&gt;testofresults&lt;/name&gt;
+ &lt;pass&gt;This assertion passed&lt;/pass&gt;
+ &lt;fail&gt;This assertion failed&lt;/fail&gt;
+ &lt;/test&gt;
+ &lt;test&gt;
+ ...
+ &lt;/test&gt;
+ &lt;/case&gt;
+ &lt;/group&gt;
+ &lt;/group&gt;
+&lt;/run&gt;
+</pre>
+ You can make use of this format with the parser
+ supplied as part of SimpleTest itself.
+ This is called <span class="new_code">SimpleTestXmlParser</span> and
+ resides in <em>xml.php</em> within the SimpleTest package...
+<pre>
+&lt;?php
+ require_once('simpletest/xml.php');
+
+ ...
+ $parser = &amp;new SimpleTestXmlParser(new HtmlReporter());
+ $parser-&gt;parse($test_output);
+?&gt;
+</pre>
+ The <span class="new_code">$test_output</span> should be the XML format
+ from the XML reporter, and could come from say a command
+ line run of a test case.
+ The parser sends events to the reporter just like any
+ other test run.
+ There are some odd occasions where this is actually useful.
+ </p>
+ <p>
+ A problem with large test suites is thet they can exhaust
+ the default 8Mb memory limit on a PHP process.
+ By having the test groups output in XML and run in
+ separate processes, the output can be reparsed to
+ aggregate the results into a much smaller footprint top level
+ test.
+ </p>
+ <p>
+ Because the XML output can come from anywhere, this opens
+ up the possibility of aggregating test runs from remote
+ servers.
+ A test case already exists to do this within the SimpleTest
+ framework, but it is currently experimental...
+<pre>
+&lt;?php
+ <strong>require_once('../remote.php');</strong>
+ require_once('../reporter.php');
+
+ $test_url = ...;
+ $dry_url = ...;
+
+ $test = &amp;new TestSuite('Remote tests');
+ $test-&gt;addTestCase(<strong>new RemoteTestCase($test_url, $dry_url)</strong>);
+ $test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ The <span class="new_code">RemoteTestCase</span> takes the actual location
+ of the test runner, basically a web page in XML format.
+ It also takes the URL of a reporter set to do a dry run.
+ This is so that progress can be reported upward correctly.
+ The <span class="new_code">RemoteTestCase</span> can be added to test suites
+ just like any other group test.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ SimpleTest project page on <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ SimpleTest download page on <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+<li>
+ The <a href="http://simpletest.sourceforge.net/">developer's API for SimpleTest</a>
+ gives full detail on the classes and assertions available.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <span class="chosen">Reporting</span>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/en/unit_test_documentation.html b/tests/simpletest/docs/en/unit_test_documentation.html
new file mode 100755
index 0000000000..0dc0a55ebf
--- /dev/null
+++ b/tests/simpletest/docs/en/unit_test_documentation.html
@@ -0,0 +1,419 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>SimpleTest for PHP regression test documentation</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <span class="chosen">Unit tester</span>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>PHP Unit Test documentation</h1>
+ This page...
+ <ul>
+<li>
+ <a href="#unit">Unit test cases</a> and basic assertions.
+ </li>
+<li>
+ <a href="#extending_unit">Extending test cases</a> to
+ customise them for your own project.
+ </li>
+<li>
+ <a href="#running_unit">Running a single case</a> as
+ a single script.
+ </li>
+</ul>
+<div class="content">
+ <p>
+<a class="target" name="unit">
+<h2>Unit test cases</h2>
+</a>
+</p>
+ <p>
+ The core system is a regression testing framework built around
+ test cases.
+ A sample test case looks like this...
+<pre>
+<strong>class FileTestCase extends UnitTestCase {
+}</strong>
+</pre>
+ Actual tests are added as methods in the test case whose names
+ by default start with the string "test" and
+ when the test case is invoked all such methods are run in
+ the order that PHP introspection finds them.
+ As many test methods can be added as needed.
+ </p>
+ <p>
+ For example...
+<pre>
+require_once('../classes/writer.php');
+
+class FileTestCase extends UnitTestCase {
+ function FileTestCase() {
+ $this-&gt;UnitTestCase('File test');
+ }<strong>
+
+ function setUp() {
+ @unlink('../temp/test.txt');
+ }
+
+ function tearDown() {
+ @unlink('../temp/test.txt');
+ }
+
+ function testCreation() {
+ $writer = &amp;new FileWriter('../temp/test.txt');
+ $writer-&gt;write('Hello');
+ $this-&gt;assertTrue(file_exists('../temp/test.txt'), 'File created');
+ }</strong>
+}
+</pre>
+ The constructor is optional and usually omitted.
+ Without a name, the class name is taken as the name of the test case.
+ </p>
+ <p>
+ Our only test method at the moment is <span class="new_code">testCreation()</span>
+ where we check that a file has been created by our
+ <span class="new_code">Writer</span> object.
+ We could have put the <span class="new_code">unlink()</span>
+ code into this method as well, but by placing it in
+ <span class="new_code">setUp()</span> and
+ <span class="new_code">tearDown()</span> we can use it with
+ other test methods that we add.
+ </p>
+ <p>
+ The <span class="new_code">setUp()</span> method is run
+ just before each and every test method.
+ <span class="new_code">tearDown()</span> is run just after
+ each and every test method.
+ </p>
+ <p>
+ You can place some test case set up into the constructor to
+ be run once for all the methods in the test case, but
+ you risk test inteference that way.
+ This way is slightly slower, but it is safer.
+ Note that if you come from a JUnit background this will not
+ be the behaviour you are used to.
+ JUnit surprisingly reinstantiates the test case for each test
+ method to prevent such interference.
+ SimpleTest requires the end user to use <span class="new_code">setUp()</span>, but
+ supplies additional hooks for library writers.
+ </p>
+ <p>
+ The means of reporting test results (see below) are by a
+ visiting display class
+ that is notified by various <span class="new_code">assert...()</span>
+ methods.
+ Here is the full list for the <span class="new_code">UnitTestCase</span>
+ class, the default for SimpleTest...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">assertTrue($x)</span></td><td>Fail if $x is false</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertFalse($x)</span></td><td>Fail if $x is true</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNull($x)</span></td><td>Fail if $x is set</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNotNull($x)</span></td><td>Fail if $x not set</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertIsA($x, $t)</span></td><td>Fail if $x is not the class or type $t</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNotA($x, $t)</span></td><td>Fail if $x is of the class or type $t</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertEqual($x, $y)</span></td><td>Fail if $x == $y is false</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNotEqual($x, $y)</span></td><td>Fail if $x == $y is true</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertWithinMargin($x, $y, $m)</span></td><td>Fail if abs($x - $y) &lt; $m is false</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertOutsideMargin($x, $y, $m)</span></td><td>Fail if abs($x - $y) &lt; $m is true</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertIdentical($x, $y)</span></td><td>Fail if $x == $y is false or a type mismatch</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNotIdentical($x, $y)</span></td><td>Fail if $x == $y is true and types match</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertReference($x, $y)</span></td><td>Fail unless $x and $y are the same variable</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertClone($x, $y)</span></td><td>Fail unless $x and $y are identical copies</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertPattern($p, $x)</span></td><td>Fail unless the regex $p matches $x</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNoPattern($p, $x)</span></td><td>Fail if the regex $p matches $x</td>
+</tr>
+ <tr>
+<td><span class="new_code">expectError($x)</span></td><td>Swallows any upcoming matching error</td>
+</tr>
+ <tr>
+<td><span class="new_code">assert($e)</span></td><td>Fail on failed <a href="expectation_documentation.html">expectation</a> object $e</td>
+</tr>
+ </tbody>
+</table>
+ All assertion methods can take an optional description as a
+ last parameter.
+ This is to label the displayed result with.
+ If omitted a default message is sent instead, which is usually
+ sufficient.
+ This default message can still be embedded in your own message
+ if you include "%s" within the string.
+ All the assertions return true on a pass or false on failure.
+ </p>
+ <p>
+ Some examples...
+<pre>
+$variable = null;
+<strong>$this-&gt;assertNull($variable, 'Should be cleared');</strong>
+</pre>
+ ...will pass and normally show no message.
+ If you have
+ <a href="http://www.lastcraft.com/display_subclass_tutorial.php">set up the tester to display passes</a>
+ as well then the message will be displayed as is.
+<pre>
+<strong>$this-&gt;assertIdentical(0, false, 'Zero is not false [%s]');</strong>
+</pre>
+ This will fail as it performs a type
+ check, as well as a comparison, between the two values.
+ The "%s" part is replaced by the default
+ error message that would have been shown if we had not
+ supplied our own.
+<pre>
+$a = 1;
+$b = $a;
+<strong>$this-&gt;assertReference($a, $b);</strong>
+</pre>
+ Will fail as the variable <span class="new_code">$a</span> is a copy of <span class="new_code">$b</span>.
+<pre>
+<strong>$this-&gt;assertPattern('/hello/i', 'Hello world');</strong>
+</pre>
+ This will pass as using a case insensitive match the string
+ <span class="new_code">hello</span> is contained in <span class="new_code">Hello world</span>.
+<pre>
+<strong>$this-&gt;expectError();</strong>
+trigger_error('Catastrophe');
+</pre>
+ Here the check catches the "Catastrophe"
+ message without checking the text and passes.
+ This removes the error from the queue.
+<pre>
+<strong>$this-&gt;expectError('Catastrophe');</strong>
+trigger_error('Catastrophe');
+</pre>
+ The next error check tests not only the existence of the error,
+ but also the text which, here matches so another pass.
+ If any unchecked errors are left at the end of a test method then
+ an exception will be reported in the test.
+ </p>
+ <p>
+ Note that SimpleTest cannot catch compile time PHP errors.
+ </p>
+ <p>
+ The test cases also have some convenience methods for debugging
+ code or extending the suite...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">setUp()</span></td><td>Runs this before each test method</td>
+</tr>
+ <tr>
+<td><span class="new_code">tearDown()</span></td><td>Runs this after each test method</td>
+</tr>
+ <tr>
+<td><span class="new_code">pass()</span></td><td>Sends a test pass</td>
+</tr>
+ <tr>
+<td><span class="new_code">fail()</span></td><td>Sends a test failure</td>
+</tr>
+ <tr>
+<td><span class="new_code">error()</span></td><td>Sends an exception event</td>
+</tr>
+ <tr>
+<td><span class="new_code">signal($type, $payload)</span></td><td>Sends a user defined message to the test reporter</td>
+</tr>
+ <tr>
+<td><span class="new_code">dump($var)</span></td><td>Does a formatted <span class="new_code">print_r()</span> for quick and dirty debugging</td>
+</tr>
+ </tbody>
+</table>
+ </p>
+
+ <p>
+<a class="target" name="extending_unit">
+<h2>Extending test cases</h2>
+</a>
+</p>
+ <p>
+ Of course additional test methods can be added to create
+ specific types of test case, so as to extend framework...
+<pre>
+require_once('simpletest/unit_tester.php');
+<strong>
+class FileTester extends UnitTestCase {
+ function FileTester($name = false) {
+ $this-&gt;UnitTestCase($name);
+ }
+
+ function assertFileExists($filename, $message = '%s') {
+ $this-&gt;assertTrue(
+ file_exists($filename),
+ sprintf($message, 'File [$filename] existence check'));
+ }</strong>
+}
+</pre>
+ Here the SimpleTest library is held in a folder called
+ <em>simpletest</em> that is local.
+ Substitute your own path for this.
+ </p>
+ <p>
+ To prevent this test case being run accidently, it is
+ advisable to mark it as <span class="new_code">abstract</span>.
+ </p>
+ <p>
+ This new case can be now be inherited just like
+ a normal test case...
+<pre>
+class FileTestCase extends <strong>FileTester</strong> {
+
+ function setUp() {
+ @unlink('../temp/test.txt');
+ }
+
+ function tearDown() {
+ @unlink('../temp/test.txt');
+ }
+
+ function testCreation() {
+ $writer = &amp;new FileWriter('../temp/test.txt');
+ $writer-&gt;write('Hello');<strong>
+ $this-&gt;assertFileExists('../temp/test.txt');</strong>
+ }
+}
+</pre>
+ </p>
+ <p>
+ If you want a test case that does not have all of the
+ <span class="new_code">UnitTestCase</span> assertions,
+ only your own and a few basics,
+ you need to extend the <span class="new_code">SimpleTestCase</span>
+ class instead.
+ It is found in <em>simple_test.php</em> rather than
+ <em>unit_tester.php</em>.
+ See <a href="group_test_documentation.html">later</a> if you
+ want to incorporate other unit tester's
+ test cases in your test suites.
+ </p>
+
+ <p>
+<a class="target" name="running_unit">
+<h2>Running a single test case</h2>
+</a>
+</p>
+ <p>
+ You won't often run single test cases except when bashing
+ away at a module that is having difficulty, and you don't
+ want to upset the main test suite.
+ Here is the scaffolding needed to run a lone test case...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');<strong>
+ require_once('simpletest/reporter.php');</strong>
+ require_once('../classes/writer.php');
+
+ class FileTestCase extends UnitTestCase {
+ function FileTestCase() {
+ $this-&gt;UnitTestCase('File test');
+ }
+ }<strong>
+
+ $test = &amp;new FileTestCase();
+ $test-&gt;run(new HtmlReporter());</strong>
+?&gt;
+</pre>
+ This script will run as is, but of course will output zero passes
+ and zero failures until test methods are added.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ SimpleTest project page on <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ SimpleTest download page on <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+<li>
+ <a href="http://simpletest.sourceforge.net/">Full API for SimpleTest</a>
+ from the PHPDoc.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <span class="chosen">Unit tester</span>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/en/web_tester_documentation.html b/tests/simpletest/docs/en/web_tester_documentation.html
new file mode 100755
index 0000000000..af63662303
--- /dev/null
+++ b/tests/simpletest/docs/en/web_tester_documentation.html
@@ -0,0 +1,552 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Simple Test for PHP web script testing documentation</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <span class="chosen">Web tester</span>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Web tester documentation</h1>
+ This page...
+ <ul>
+<li>
+ Successfully <a href="#fetch">fetching a web page</a>
+ </li>
+<li>
+ Testing the <a href="#content">page content</a>
+ </li>
+<li>
+ <a href="#navigation">Navigating a web site</a>
+ while testing
+ </li>
+<li>
+ <a href="#request">Raw request modifications</a> and debugging methods
+ </li>
+</ul>
+<div class="content">
+ <p>
+<a class="target" name="fetch">
+<h2>Fetching a page</h2>
+</a>
+</p>
+ <p>
+ Testing classes is all very well, but PHP is predominately
+ a language for creating functionality within web pages.
+ How do we test the front end presentation role of our PHP
+ applications?
+ Well the web pages are just text, so we should be able to
+ examine them just like any other test data.
+ </p>
+ <p>
+ This leads to a tricky issue.
+ If we test at too low a level, testing for matching tags
+ in the page with pattern matching for example, our tests will
+ be brittle.
+ The slightest change in layout could break a large number of
+ tests.
+ If we test at too high a level, say using mock versions of a
+ template engine, then we lose the ability to automate some classes
+ of test.
+ For example, the interaction of forms and navigation will
+ have to be tested manually.
+ These types of test are extremely repetitive and error prone.
+ </p>
+ <p>
+ SimpleTest includes a special form of test case for the testing
+ of web page actions.
+ The <span class="new_code">WebTestCase</span> includes facilities
+ for navigation, content and cookie checks and form handling.
+ Usage of these test cases is similar to the
+ <a href="unit_tester_documentation.html">UnitTestCase</a>...
+<pre>
+<strong>class TestOfLastcraft extends WebTestCase {
+}</strong>
+</pre>
+ Here we are about to test the
+ <a href="http://www/lastcraft.com/">Last Craft</a> site itself.
+ If this test case is in a file called <em>lastcraft_test.php</em>
+ then it can be loaded in a runner script just like unit tests...
+<pre>
+&lt;?php<strong>
+ require_once('simpletest/web_tester.php');</strong>
+ require_once('simpletest/reporter.php');
+
+ $test = &amp;new TestSuite('Web site tests');<strong>
+ $test-&gt;addTestFile('lastcraft_test.php');</strong>
+ exit ($test-&gt;run(new TextReporter()) ? 0 : 1);
+?&gt;
+</pre>
+ I am using the text reporter here to more clearly
+ distinguish the web content from the test output.
+ </p>
+ <p>
+ Nothing is being tested yet.
+ We can fetch the home page by using the
+ <span class="new_code">get()</span> method...
+<pre>
+class TestOfLastcraft extends WebTestCase {
+ <strong>
+ function testHomepage() {
+ $this-&gt;assertTrue($this-&gt;get('http://www.lastcraft.com/'));
+ }</strong>
+}
+</pre>
+ The <span class="new_code">get()</span> method will
+ return true only if page content was successfully
+ loaded.
+ It is a simple, but crude way to check that a web page
+ was actually delivered by the web server.
+ However that content may be a 404 response and yet
+ our <span class="new_code">get()</span> method will still return true.
+ </p>
+ <p>
+ Assuming that the web server for the Last Craft site is up
+ (sadly not always the case), we should see...
+<pre class="shell">
+Web site tests
+OK
+Test cases run: 1/1, Failures: 0, Exceptions: 0
+</pre>
+ All we have really checked is that any kind of page was
+ returned.
+ We don't yet know if it was the right one.
+ </p>
+
+ <p>
+<a class="target" name="content">
+<h2>Testing page content</h2>
+</a>
+</p>
+ <p>
+ To confirm that the page we think we are on is actually the
+ page we are on, we need to verify the page content.
+<pre>
+class TestOfLastcraft extends WebTestCase {
+
+ function testHomepage() {<strong>
+ $this-&gt;get('http://www.lastcraft.com/');
+ $this-&gt;assertText('Why the last craft');</strong>
+ }
+}
+</pre>
+ The page from the last fetch is held in a buffer in
+ the test case, so there is no need to refer to it directly.
+ The pattern match is always made against the buffer.
+ </p>
+ <p>
+ Here is the list of possible content assertions...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">assertTitle($title)</span></td><td>Pass if title is an exact match</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertText($text)</span></td><td>Pass if matches visible and "alt" text</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNoText($text)</span></td><td>Pass if doesn't match visible and "alt" text</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertPattern($pattern)</span></td><td>A Perl pattern match against the page content</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNoPattern($pattern)</span></td><td>A Perl pattern match to not find content</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertLink($label)</span></td><td>Pass if a link with this text is present</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNoLink($label)</span></td><td>Pass if no link with this text is present</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertLinkById($id)</span></td><td>Pass if a link with this id attribute is present</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNoLinkById($id)</span></td><td>Pass if no link with this id attribute is present</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertField($name, $value)</span></td><td>Pass if an input tag with this name has this value</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertFieldById($id, $value)</span></td><td>Pass if an input tag with this id has this value</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertResponse($codes)</span></td><td>Pass if HTTP response matches this list</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertMime($types)</span></td><td>Pass if MIME type is in this list</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertAuthentication($protocol)</span></td><td>Pass if the current challenge is this protocol</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNoAuthentication()</span></td><td>Pass if there is no current challenge</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertRealm($name)</span></td><td>Pass if the current challenge realm matches</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertHeader($header, $content)</span></td><td>Pass if a header was fetched matching this value</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNoHeader($header)</span></td><td>Pass if a header was not fetched</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertCookie($name, $value)</span></td><td>Pass if there is currently a matching cookie</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNoCookie($name)</span></td><td>Pass if there is currently no cookie of this name</td>
+</tr>
+ </tbody>
+</table>
+ As usual with the SimpleTest assertions, they all return
+ false on failure and true on pass.
+ They also allow an optional test message and you can embed
+ the original test message inside using "%s" inside
+ your custom message.
+ </p>
+ <p>
+ So now we could instead test against the title tag with...
+<pre>
+<strong>$this-&gt;assertTitle('The Last Craft? Web developer tutorials on PHP, Extreme programming and Object Oriented development');</strong>
+</pre>
+ ...or, if that is too long and fragile...
+<pre>
+<strong>$this-&gt;assertTitle(new PatternExpectation('/The Last Craft/'));</strong>
+</pre>
+ As well as the simple HTML content checks we can check
+ that the MIME type is in a list of allowed types with...
+<pre>
+<strong>$this-&gt;assertMime(array('text/plain', 'text/html'));</strong>
+</pre>
+ More interesting is checking the HTTP response code.
+ Like the MIME type, we can assert that the response code
+ is in a list of allowed values...
+<pre>
+class TestOfLastcraft extends WebTestCase {
+
+ function testRedirects() {
+ $this-&gt;get('http://www.lastcraft.com/test/redirect.php');
+ $this-&gt;assertResponse(200);&lt;/strong&gt;
+ }
+}
+</pre>
+ Here we are checking that the fetch is successful by
+ allowing only a 200 HTTP response.
+ This test will pass, but it is not actually correct to do so.
+ There is no page, instead the server issues a redirect.
+ The <span class="new_code">WebTestCase</span> will
+ automatically follow up to three such redirects.
+ The tests are more robust this way and we are usually
+ interested in the interaction with the pages rather
+ than their delivery.
+ If the redirects are of interest then this ability must
+ be disabled...
+<pre>
+class TestOfLastcraft extends WebTestCase {
+
+ function testHomepage() {<strong>
+ $this-&gt;setMaximumRedirects(0);</strong>
+ $this-&gt;get('http://www.lastcraft.com/test/redirect.php');
+ $this-&gt;assertResponse(200);
+ }
+}
+</pre>
+ The assertion now fails as expected...
+<pre class="shell">
+Web site tests
+1) Expecting response in [200] got [302]
+ in testhomepage
+ in testoflastcraft
+ in lastcraft_test.php
+FAILURES!!!
+Test cases run: 1/1, Failures: 1, Exceptions: 0
+</pre>
+ We can modify the test to correctly assert redirects with...
+<pre>
+class TestOfLastcraft extends WebTestCase {
+
+ function testHomepage() {
+ $this-&gt;setMaximumRedirects(0);
+ $this-&gt;get('http://www.lastcraft.com/test/redirect.php');
+ $this-&gt;assertResponse(<strong>array(301, 302, 303, 307)</strong>);
+ }
+}
+</pre>
+ This now passes.
+ </p>
+
+ <p>
+<a class="target" name="navigation">
+<h2>Navigating a web site</h2>
+</a>
+</p>
+ <p>
+ Users don't often navigate sites by typing in URLs, but by
+ clicking links and buttons.
+ Here we confirm that the contact details can be reached
+ from the home page...
+<pre>
+class TestOfLastcraft extends WebTestCase {
+ ...
+ function testContact() {
+ $this-&gt;get('http://www.lastcraft.com/');<strong>
+ $this-&gt;clickLink('About');
+ $this-&gt;assertTitle(new PatternExpectation('/About Last Craft/'));</strong>
+ }
+}
+</pre>
+ The parameter is the text of the link.
+ </p>
+ <p>
+ If the target is a button rather than an anchor tag, then
+ <span class="new_code">clickSubmit()</span> can be used
+ with the button title...
+<pre>
+<strong>$this-&gt;clickSubmit('Go!');</strong>
+</pre>
+ If you are not sure or don't care, the usual case, then just
+ use the <span class="new_code">click()</span> method...
+<pre>
+<strong>$this-&gt;click('Go!');</strong>
+</pre>
+ </p>
+ <p>
+ The list of navigation methods is...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">getUrl()</span></td><td>The current location</td>
+</tr>
+ <tr>
+<td><span class="new_code">get($url, $parameters)</span></td><td>Send a GET request with these parameters</td>
+</tr>
+ <tr>
+<td><span class="new_code">post($url, $parameters)</span></td><td>Send a POST request with these parameters</td>
+</tr>
+ <tr>
+<td><span class="new_code">head($url, $parameters)</span></td><td>Send a HEAD request without replacing the page content</td>
+</tr>
+ <tr>
+<td><span class="new_code">retry()</span></td><td>Reload the last request</td>
+</tr>
+ <tr>
+<td><span class="new_code">back()</span></td><td>Like the browser back button</td>
+</tr>
+ <tr>
+<td><span class="new_code">forward()</span></td><td>Like the browser forward button</td>
+</tr>
+ <tr>
+<td><span class="new_code">authenticate($name, $password)</span></td><td>Retry after a challenge</td>
+</tr>
+ <tr>
+<td><span class="new_code">restart()</span></td><td>Restarts the browser as if a new session</td>
+</tr>
+ <tr>
+<td><span class="new_code">getCookie($name)</span></td><td>Gets the cookie value for the current context</td>
+</tr>
+ <tr>
+<td><span class="new_code">ageCookies($interval)</span></td><td>Ages current cookies prior to a restart</td>
+</tr>
+ <tr>
+<td><span class="new_code">clearFrameFocus()</span></td><td>Go back to treating all frames as one page</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickSubmit($label)</span></td><td>Click the first button with this label</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickSubmitByName($name)</span></td><td>Click the button with this name attribute</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickSubmitById($id)</span></td><td>Click the button with this ID attribute</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickImage($label, $x, $y)</span></td><td>Click an input tag of type image by title or alt text</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickImageByName($name, $x, $y)</span></td><td>Click an input tag of type image by name</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickImageById($id, $x, $y)</span></td><td>Click an input tag of type image by ID attribute</td>
+</tr>
+ <tr>
+<td><span class="new_code">submitFormById($id)</span></td><td>Submit a form without the submit value</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickLink($label, $index)</span></td><td>Click an anchor by the visible label text</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickLinkById($id)</span></td><td>Click an anchor by the ID attribute</td>
+</tr>
+ <tr>
+<td><span class="new_code">getFrameFocus()</span></td><td>The name of the currently selected frame</td>
+</tr>
+ <tr>
+<td><span class="new_code">setFrameFocusByIndex($choice)</span></td><td>Focus on a frame counting from 1</td>
+</tr>
+ <tr>
+<td><span class="new_code">setFrameFocus($name)</span></td><td>Focus on a frame by name</td>
+</tr>
+ </tbody>
+</table>
+ </p>
+ <p>
+ The parameters in the <span class="new_code">get()</span>, <span class="new_code">post()</span> or
+ <span class="new_code">head()</span> methods are optional.
+ The HTTP HEAD fetch does not change the browser context, only loads
+ cookies.
+ This can be useful for when an image or stylesheet sets a cookie
+ for crafty robot blocking.
+ </p>
+ <p>
+ The <span class="new_code">retry()</span>, <span class="new_code">back()</span> and
+ <span class="new_code">forward()</span> commands work as they would on
+ your web browser.
+ They use the history to retry pages.
+ This can be handy for checking the effect of hitting the
+ back button on your forms.
+ </p>
+ <p>
+ The frame methods need a little explanation.
+ By default a framed page is treated just like any other.
+ Content will be searced for throughout the entire frameset,
+ so clicking a link will work no matter which frame
+ the anchor tag is in.
+ You can override this behaviour by focusing on a single
+ frame.
+ If you do that, all searches and actions will apply to that
+ frame alone, such as authentication and retries.
+ If a link or button is not in a focused frame then it cannot
+ be clicked.
+ </p>
+ <p>
+ Testing navigation on fixed pages only tells you when you
+ have broken an entire script.
+ For highly dynamic pages, such as for bulletin boards, this can
+ be crucial for verifying the correctness of the application.
+ For most applications though, the really tricky logic is usually in
+ the handling of forms and sessions.
+ Fortunately SimpleTest includes
+ <a href="form_testing_documentation.html">tools for testing web forms</a>
+ as well.
+ </p>
+
+ <p>
+<a class="target" name="request">
+<h2>Modifying the request</h2>
+</a>
+</p>
+ <p>
+ Although SimpleTest does not have the goal of testing networking
+ problems, it does include some methods to modify and debug
+ the requests it makes.
+ Here is another method list...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">getTransportError()</span></td><td>The last socket error</td>
+</tr>
+ <tr>
+<td><span class="new_code">showRequest()</span></td><td>Dump the outgoing request</td>
+</tr>
+ <tr>
+<td><span class="new_code">showHeaders()</span></td><td>Dump the incoming headers</td>
+</tr>
+ <tr>
+<td><span class="new_code">showSource()</span></td><td>Dump the raw HTML page content</td>
+</tr>
+ <tr>
+<td><span class="new_code">ignoreFrames()</span></td><td>Do not load framesets</td>
+</tr>
+ <tr>
+<td><span class="new_code">setCookie($name, $value)</span></td><td>Set a cookie from now on</td>
+</tr>
+ <tr>
+<td><span class="new_code">addHeader($header)</span></td><td>Always add this header to the request</td>
+</tr>
+ <tr>
+<td><span class="new_code">setMaximumRedirects($max)</span></td><td>Stop after this many redirects</td>
+</tr>
+ <tr>
+<td><span class="new_code">setConnectionTimeout($timeout)</span></td><td>Kill the connection after this time between bytes</td>
+</tr>
+ <tr>
+<td><span class="new_code">useProxy($proxy, $name, $password)</span></td><td>Make requests via this proxy URL</td>
+</tr>
+ </tbody>
+</table>
+ These methods are principally for debugging.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ SimpleTest project page on <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ SimpleTest download page on <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+<li>
+ The <a href="http://simpletest.sourceforge.net/">developer's API for SimpleTest</a>
+ gives full detail on the classes and assertions available.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <span class="chosen">Web tester</span>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/fr/authentication_documentation.html b/tests/simpletest/docs/fr/authentication_documentation.html
new file mode 100755
index 0000000000..15d3870ba0
--- /dev/null
+++ b/tests/simpletest/docs/fr/authentication_documentation.html
@@ -0,0 +1,297 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Documentation Simple Test : tester l'authentification</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Documentation sur l'authentification</h1>
+ This page...
+ <ul>
+<li>
+ Passer au travers d'une <a href="#basique">authentification HTTP basique</a>
+ </li>
+<li>
+ Tester l'<a href="#cookies">authentification bas&eacute;e sur des cookies</a>
+ </li>
+<li>
+ G&eacute;rer les <a href="#session">sessions du navigateur</a> et les timeouts
+ </li>
+</ul>
+<div class="content">
+
+ <p>
+ Un des secteurs &agrave; la fois d&eacute;licat et important lors d'un test de site web reste la s&eacute;curit&eacute;. Tester ces sch&eacute;mas est au coeur des objectifs du testeur web de SimpleTest.
+ </p>
+
+ <p>
+<a class="target" name="basique">
+<h2>Authentification HTTP basique</h2>
+</a>
+</p>
+ <p>
+ Si vous allez chercher une page web prot&eacute;g&eacute;e par une authentification basique, vous h&eacute;riterez d'une ent&ecirc;te 401. Nous pouvons repr&eacute;senter ceci par ce test...
+<pre>
+class AuthenticationTest extends WebTestCase {<strong>
+ function test401Header() {
+ $this-&gt;get('http://www.lastcraft.com/protected/');
+ $this-&gt;showHeaders();
+ }</strong>
+}
+</pre>
+ Ce qui nous permet de voir les ent&ecirc;tes re&ccedil;ues...
+ <div class="demo">
+ <h1>File test</h1>
+<pre style="background-color: lightgray; color: black">
+HTTP/1.1 401 Authorization Required
+Date: Sat, 18 Sep 2004 19:25:18 GMT
+Server: Apache/1.3.29 (Unix) PHP/4.3.4
+WWW-Authenticate: Basic realm="SimpleTest basic authentication"
+Connection: close
+Content-Type: text/html; charset=iso-8859-1
+</pre>
+ <div style="padding: 8px; margin-top: 1em; background-color: green; color: white;">1/1 test cases complete.
+ <strong>0</strong> passes, <strong>0</strong> fails and <strong>0</strong> exceptions.</div>
+ </div>
+ Sauf que nous voulons &eacute;viter l'inspection visuelle, on souhaite que SimpleTest puisse nous dire si oui ou non la page est prot&eacute;g&eacute;e. Voici un test en profondeur sur nos ent&ecirc;tes...
+<pre>
+class AuthenticationTest extends WebTestCase {
+ function test401Header() {
+ $this-&gt;get('http://www.lastcraft.com/protected/');<strong>
+ $this-&gt;assertAuthentication('Basic');
+ $this-&gt;assertResponse(401);
+ $this-&gt;assertRealm('SimpleTest basic authentication');</strong>
+ }
+}
+</pre>
+ N'importe laquelle de ces assertions suffirait, tout d&eacute;pend de la masse de d&eacute;tails que vous souhaitez voir.
+ </p>
+ <p>
+ La plupart du temps, nous ne souhaitons pas tester l'authentification en elle-m&ecirc;me, mais plut&ocirc;t les pages prot&eacute;g&eacute;es par cette authentification. D&egrave;s que la tentative d'authentification est re&ccedil;ue, nous pouvons y r&eacute;pondre &agrave; l'aide d'une r&eacute;ponse d'authentification :
+<pre>
+class AuthenticationTest extends WebTestCase {
+ function testAuthentication() {
+ $this-&gt;get('http://www.lastcraft.com/protected/');<strong>
+ $this-&gt;authenticate('Me', 'Secret');</strong>
+ $this-&gt;assertTitle(...);
+ }
+}
+</pre>
+ Le nom d'utilisateur et le mot de passe seront d&eacute;sormais envoy&eacute;s &agrave; chaque requ&ecirc;te vers ce r&eacute;pertoire et ses sous r&eacute;pertoires. En revanche vous devrez vous authentifier &agrave; nouveau si vous sortez de ce r&eacute;pertoire.
+ </p>
+ <p>
+ Vous pouvez gagner une ligne en d&eacute;finissant l'authentification au niveau de l'URL...
+<pre>
+class AuthenticationTest extends WebTestCase {
+ function testCanReadAuthenticatedPages() {
+ $this-&gt;get('http://<strong>Me:Secret@</strong>www.lastcraft.com/protected/');
+ $this-&gt;assertTitle(...);
+ }
+}
+</pre>
+ Si votre nom d'utilisateur ou mot de passe comporte des caract&egrave;res sp&eacute;ciaux, alors n'oubliez pas de les encoder, sinon la requ&ecirc;te ne sera pas analys&eacute;e correctement. De plus cette ent&ecirc;te ne sera pas envoy&eacute;e aux sous requ&ecirc;tes si vous la d&eacute;finissez avec une URL absolue. Par contre si vous naviguez avec des URL relatives, l'information d'authentification sera pr&eacute;serv&eacute;e.
+ </p>
+ <p>
+ Pour l'instant, seule l'authentification de base est impl&eacute;ment&eacute;e et elle n'est r&eacute;ellement fiable qu'en tandem avec une connexion HTTPS. C'est g&eacute;n&eacute;ralement suffisant pour prot&eacute;ger le serveur test&eacute; des regards malveillants. Les authentifications Digest et NTLM pourraient &ecirc;tre ajout&eacute;es prochainement.
+ </p>
+
+ <p>
+<a class="target" name="cookies">
+<h2>Cookies</h2>
+</a>
+</p>
+ <p>
+ L'authentification de base ne donne pas assez de contr&ocirc;le au d&eacute;veloppeur Web sur l'interface utilisateur. Il y a de forte chance pour que cette fonctionnalit&eacute; soit cod&eacute;e directement dans l'architecture web &agrave; grand renfort de cookies et de timeouts compliqu&eacute;s.
+ </p>
+ <p>
+ Commen&ccedil;ons par un simple formulaire de connexion...
+<pre>
+&lt;form&gt;
+ Username:
+ &lt;input type="text" name="u" value="" /&gt;&lt;br /&gt;
+ Password:
+ &lt;input type="password" name="p" value="" /&gt;&lt;br /&gt;
+ &lt;input type="submit" value="Log in" /&gt;
+&lt;/form&gt;
+</pre>
+ Lequel doit ressembler &agrave;...
+ </p>
+ <p>
+ <form class="demo">
+ Username:
+ <input type="text" name="u" value="">
+<br>
+ Password:
+ <input type="password" name="p" value="">
+<br>
+ <input type="submit" value="Log in">
+ </form>
+ </p>
+ <p>
+ Supposons que, durant le chargement de la page, un cookie ait &eacute;t&eacute; inscrit avec un num&eacute;ro d'identifiant de session. Nous n'allons pas encore remplir le formulaire, juste tester que nous pistons bien l'utilisateur. Voici le test...
+<pre>
+class LogInTest extends WebTestCase {
+ function testSessionCookieSetBeforeForm() {
+ $this-&gt;get('http://www.my-site.com/login.php');<strong>
+ $this-&gt;assertCookie('SID');</strong>
+ }
+}
+</pre>
+ Nous nous contentons ici de v&eacute;rifier que le cookie a bien &eacute;t&eacute; d&eacute;fini. Etant donn&eacute; que sa valeur est plut&ocirc;t &eacute;nigmatique, elle ne vaut pas la peine d'&ecirc;tre test&eacute;e.
+ </p>
+ <p>
+ Le reste du test est le m&ecirc;me que dans n'importe quel autre formulaire, mais nous pourrions souhaiter nous assurer que le cookie n'a pas &eacute;t&eacute; modifi&eacute; depuis la phase de connexion. Voici comment cela pourrait &ecirc;tre test&eacute; :
+<pre>
+class LogInTest extends WebTestCase {
+ ...
+ function testSessionCookieSameAfterLogIn() {
+ $this-&gt;get('http://www.my-site.com/login.php');<strong>
+ $session = $this-&gt;getCookie('SID');
+ $this-&gt;setField('u', 'Me');
+ $this-&gt;setField('p', 'Secret');
+ $this-&gt;clickSubmit('Log in');
+ $this-&gt;assertWantedPattern('/Welcome Me/');
+ $this-&gt;assertCookie('SID', $session);</strong>
+ }
+}
+</pre>
+ Ceci confirme que l'identifiant de session est identique avant et apr&egrave;s la connexion.
+ </p>
+ <p>
+ Nous pouvons m&ecirc;me essayer de duper notre propre syst&egrave;me en cr&eacute;ant un cookie arbitraire pour se connecter...
+<pre>
+class LogInTest extends WebTestCase {
+ ...
+ function testSessionCookieSameAfterLogIn() {
+ $this-&gt;get('http://www.my-site.com/login.php');<strong>
+ $this-&gt;setCookie('SID', 'Some other session');
+ $this-&gt;get('http://www.my-site.com/restricted.php');</strong>
+ $this-&gt;assertWantedPattern('/Access denied/');
+ }
+}
+</pre>
+ Votre site est-il prot&eacute;g&eacute; contre ce type d'attaque ?
+ </p>
+
+ <p>
+<a class="target" name="session">
+<h2>Sessions de navigateur</h2>
+</a>
+</p>
+ <p>
+ Si vous testez un syst&egrave;me d'authentification, la reconnexion par un utilisateur est un point sensible. Essayons de simuler ce qui se passe dans ce cas :
+<pre>
+class LogInTest extends WebTestCase {
+ ...
+ function testLoseAuthenticationAfterBrowserClose() {
+ $this-&gt;get('http://www.my-site.com/login.php');
+ $this-&gt;setField('u', 'Me');
+ $this-&gt;setField('p', 'Secret');
+ $this-&gt;clickSubmit('Log in');
+ $this-&gt;assertWantedPattern('/Welcome Me/');<strong>
+
+ $this-&gt;restart();
+ $this-&gt;get('http://www.my-site.com/restricted.php');
+ $this-&gt;assertWantedPattern('/Access denied/');</strong>
+ }
+}
+</pre>
+ La m&eacute;thode <span class="new_code">WebTestCase::restart()</span> pr&eacute;serve les cookies dont le timeout a expir&eacute;, mais conserve les cookies temporaires ou expir&eacute;s. Vous pouvez sp&eacute;cifier l'heure et la date de leur r&eacute;activation.
+ </p>
+ <p>
+ L'expiration des cookies peut &ecirc;tre un probl&egrave;me. Si vous avez un cookie qui doit expirer au bout d'une heure, nous n'allons pas mettre le test en veille en attendant que le cookie expire...
+ </p>
+ <p>
+ Afin de provoquer leur expiration, vous pouvez dater manuellement les cookies, avant le d&eacute;but de la session.
+<pre>
+class LogInTest extends WebTestCase {
+ ...
+ function testLoseAuthenticationAfterOneHour() {
+ $this-&gt;get('http://www.my-site.com/login.php');
+ $this-&gt;setField('u', 'Me');
+ $this-&gt;setField('p', 'Secret');
+ $this-&gt;clickSubmit('Log in');
+ $this-&gt;assertWantedPattern('/Welcome Me/');
+ <strong>
+ $this-&gt;ageCookies(3600);</strong>
+ $this-&gt;restart();
+ $this-&gt;get('http://www.my-site.com/restricted.php');
+ $this-&gt;assertWantedPattern('/Access denied/');
+ }
+}
+</pre>
+ Apr&egrave;s le red&eacute;marrage, les cookies seront plus vieux d'une heure et que tous ceux dont la date d'expiration sera pass&eacute;e auront disparus.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ La page du projet SimpleTest sur <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ La page de t&eacute;l&eacute;chargement de SimpleTest sur <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+<li>
+ <a href="http://simpletest.sourceforge.net/">L'API du d&eacute;veloppeur pour SimpleTest</a> donne tous les d&eacute;tails sur les classes et les assertions disponibles.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/fr/browser_documentation.html b/tests/simpletest/docs/fr/browser_documentation.html
new file mode 100755
index 0000000000..ae1bf7fa42
--- /dev/null
+++ b/tests/simpletest/docs/fr/browser_documentation.html
@@ -0,0 +1,362 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Documentation SimpleTest : le composant de navigation web scriptable</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Documentation sur le navigateur scriptable</h1>
+ This page...
+ <ul>
+<li>
+ Utiliser le <a href="#scripting">navigateur web dans des scripts</a>
+ </li>
+<li>
+ <a href="#deboguer">D&eacute;boguer</a> les erreurs sur les pages
+ </li>
+<li>
+ <a href="#unit">Tests complexes avec des navigateurs web multiples</a>
+ </li>
+</ul>
+<div class="content">
+
+ <p>
+ Le composant de navigation web de SimpleTest peut &ecirc;tre utilis&eacute; non seulement &agrave; l'ext&eacute;rieur de la classe <span class="new_code">WebTestCase</span>, mais aussi ind&eacute;pendamment du framework SimpleTest lui-m&ecirc;me.
+ </p>
+
+ <p>
+<a class="target" name="script">
+<h2>Le navigateur scriptable</h2>
+</a>
+</p>
+ <p>
+ Vous pouvez utiliser le navigateur web dans des scripts PHP pour confirmer que des services marchent bien comme il faut ou pour extraire des informations &agrave; partir de ceux-ci de fa&ccedil;on r&eacute;guli&egrave;re.
+ Par exemple, voici un petit script pour extraire le nombre de bogues ouverts dans PHP 5 &agrave; partir du <a href="http://www.php.net/">site web PHP</a>...
+<pre>
+&lt;?php
+ require_once('simpletest/browser.php');
+
+ $browser = &amp;new SimpleBrowser();
+ $browser-&gt;get('http://php.net/');
+ $browser-&gt;clickLink('reporting bugs');
+ $browser-&gt;clickLink('statistics');
+ $browser-&gt;clickLink('PHP 5 bugs only');
+ $page = $browser-&gt;getContent();
+ preg_match('/status=Open.*?by=Any.*?(\d+)&lt;\/a&gt;/', $page, $matches);
+ print $matches[1];
+?&gt;
+</pre>
+ Bien s&ucirc;r Il y a des m&eacute;thodes plus simple pour r&eacute;aliser cet exemple en PHP. Par exemple, vous pourriez juste utiliser la commande PHP <span class="new_code">file()</span> sur ce qui est ici une page fixe. Cependant, en utilisant des scripts avec le navigateur web vous vous autorisez l'authentification, la gestion des cookies, le chargement automatique des fen&ecirc;tres, les redirections, la transmission de formulaires et la capacit&eacute; d'examiner les ent&ecirc;tes. De telles m&eacute;thodes sont fragiles dans un site en constante &eacute;volution et vous voudrez employer une m&eacute;thode plus directe pour acc&eacute;der aux donn&eacute;es de fa&ccedil;on permanente, mais pour des t&acirc;ches simples cette technique peut s'av&eacute;rer une solution tr&egrave;s rapide.
+ </p>
+ <p>
+ Toutes les m&eacute;thode de navigation utilis&eacute;es dans <a href="web_tester_documentation.html">WebTestCase</a> sont pr&eacute;sente dans la classe <span class="new_code">SimpleBrowser</span>, mais les assertions sont remplac&eacute;es par de simples accesseurs. Voici une liste compl&egrave;te des m&eacute;thodes de navigation de page &agrave; page...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">addHeader($header)</span></td><td>Ajouter une ent&ecirc;te &agrave; chaque t&eacute;l&eacute;chargement</td>
+</tr>
+ <tr>
+<td><span class="new_code">useProxy($proxy, $username, $password)</span></td><td>Utilise ce proxy &agrave; partir de maintenant</td>
+</tr>
+ <tr>
+<td><span class="new_code">head($url, $parameters)</span></td><td>Effectue une requ&ecirc;te HEAD</td>
+</tr>
+ <tr>
+<td><span class="new_code">get($url, $parameters)</span></td><td>T&eacute;l&eacute;charge une page avec un GET</td>
+</tr>
+ <tr>
+<td><span class="new_code">post($url, $parameters)</span></td><td>T&eacute;l&eacute;charge une page avec un POST</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickLink($label)</span></td><td>Suit un lien par son &eacute;tiquette</td>
+</tr>
+ <tr>
+<td><span class="new_code">isLink($label)</span></td><td>V&eacute;rifie si un lien avec cette &eacute;tiquette existe</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickLinkById($id)</span></td><td>Suit un lien par son attribut d'identification</td>
+</tr>
+ <tr>
+<td><span class="new_code">isLinkById($id)</span></td><td>V&eacute;rifie si un lien avec cet attribut d'identification existe</td>
+</tr>
+ <tr>
+<td><span class="new_code">getUrl()</span></td><td>La page ou la fen&ecirc;tre URL en cours</td>
+</tr>
+ <tr>
+<td><span class="new_code">getTitle()</span></td><td>Le titre de la page</td>
+</tr>
+ <tr>
+<td><span class="new_code">getContent()</span></td><td>Le page ou la fen&ecirc;tre brute</td>
+</tr>
+ <tr>
+<td><span class="new_code">getContentAsText()</span></td><td>Sans code HTML &agrave; l'exception du text "alt"</td>
+</tr>
+ <tr>
+<td><span class="new_code">retry()</span></td><td>R&eacute;p&egrave;te la derni&egrave;re requ&ecirc;te</td>
+</tr>
+ <tr>
+<td><span class="new_code">back()</span></td><td>Utilise le bouton "pr&eacute;c&eacute;dent" du navigateur</td>
+</tr>
+ <tr>
+<td><span class="new_code">forward()</span></td><td>Utilise le bouton "suivant" du navigateur</td>
+</tr>
+ <tr>
+<td><span class="new_code">authenticate($username, $password)</span></td><td>Retente la page ou la fen&ecirc;tre apr&egrave;s une r&eacute;ponse 401</td>
+</tr>
+ <tr>
+<td><span class="new_code">restart($date)</span></td><td>Relance le navigateur pour une nouvelle session</td>
+</tr>
+ <tr>
+<td><span class="new_code">ageCookies($interval)</span></td><td>Change la date des cookies</td>
+</tr>
+ <tr>
+<td><span class="new_code">setCookie($name, $value)</span></td><td>Lance un nouveau cookie</td>
+</tr>
+ <tr>
+<td><span class="new_code">getCookieValue($host, $path, $name)</span></td><td>Lit le cookie le plus sp&eacute;cifique</td>
+</tr>
+ <tr>
+<td><span class="new_code">getCurrentCookieValue($name)</span></td><td>Lit le contenue du cookie en cours</td>
+</tr>
+ </tbody>
+</table>
+ Les m&eacute;thode <span class="new_code">SimpleBrowser::useProxy()</span> et <span class="new_code">SimpleBrowser::addHeader()</span> sont sp&eacute;ciales. Une fois appel&eacute;es, elles continuent &agrave; s'appliquer sur les t&eacute;l&eacute;chargements suivants.
+ </p>
+ <p>
+ Naviguer dans les formulaires est similaire &agrave; la <a href="form_testing_documentation.html">navigation des formulaires via WebTestCase</a>...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">setField($name, $value)</span></td><td>Modifie tous les champs avec ce nom</td>
+</tr>
+ <tr>
+<td><span class="new_code">setFieldById($id, $value)</span></td><td>Modifie tous les champs avec cet identifiant</td>
+</tr>
+ <tr>
+<td><span class="new_code">getField($name)</span></td><td>Accesseur de la valeur d'un &eacute;l&eacute;ment de formulaire</td>
+</tr>
+ <tr>
+<td><span class="new_code">getFieldById($id)</span></td><td>Accesseur de la valeur de l'&eacute;l&eacute;ment de formulaire avec cet identifiant</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickSubmit($label)</span></td><td>Transmet le formulaire avec l'&eacute;tiquette de son bouton</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickSubmitByName($name)</span></td><td>Transmet le formulaire avec l'attribut de son bouton</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickSubmitById($id)</span></td><td>Transmet le formulaire avec l'identifiant de son bouton</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickImage($label, $x, $y)</span></td><td>Clique sur l'image par son texte alternatif</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickImageByName($name, $x, $y)</span></td><td>Clique sur l'image par son attribut</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickImageById($id, $x, $y)</span></td><td>Clique sur l'image par son identifiant</td>
+</tr>
+ <tr>
+<td><span class="new_code">submitFormById($id)</span></td><td>Transmet le formulaire par son identifiant propre</td>
+</tr>
+ </tbody>
+</table>
+ Au jourd d'aujourd'hui il n'existe aucune m&eacute;thode pour lister les formulaires et les champs disponibles : ce sera probablement ajout&eacute; dans des versions successives de SimpleTest.
+ </p>
+ <p>
+ A l'int&eacute;rieur d'une page, les fen&ecirc;tres individuelles peuvent &ecirc;tre s&eacute;lectionn&eacute;es. Si aucune s&eacute;lection n'est r&eacute;alis&eacute;e alors toutes les fen&ecirc;tres sont fusionn&eacute;es ensemble dans une unique et grande page. Le contenu de la page en cours sera une concat&eacute;nation des toutes les fen&ecirc;tres dans l'ordre sp&eacute;cifi&eacute; par les balises "frameset".
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">getFrames()</span></td><td>Un d&eacute;chargement de la structure de la fen&ecirc;tre courante</td>
+</tr>
+ <tr>
+<td><span class="new_code">getFrameFocus()</span></td><td>L'index ou l'&eacute;tiquette de la fen&ecirc;tre en courante</td>
+</tr>
+ <tr>
+<td><span class="new_code">setFrameFocusByIndex($choice)</span></td><td>S&eacute;lectionne la fen&ecirc;tre num&eacute;rot&eacute;e &agrave; partir de 1</td>
+</tr>
+ <tr>
+<td><span class="new_code">setFrameFocus($name)</span></td><td>S&eacute;lectionne une fen&ecirc;tre par son &eacute;tiquette</td>
+</tr>
+ <tr>
+<td><span class="new_code">clearFrameFocus()</span></td><td>Traite toutes les fen&ecirc;tres comme une seule page</td>
+</tr>
+ </tbody>
+</table>
+ Lorsqu'on est focalis&eacute; sur une fen&ecirc;tre unique, le contenu viendra de celle-ci uniquement. Cela comprend les liens &agrave; cliquer et les formulaires &agrave; transmettre.
+ </p>
+
+ <p>
+<a class="target" name="deboguer">
+<h2>O&ugrave; sont les erreurs ?</h2>
+</a>
+</p>
+ <p>
+ Toute cette masse de fonctionnalit&eacute;s est g&eacute;niale lorsqu'on arrive &agrave; bien t&eacute;l&eacute;charger les pages, mais ce n'est pas toujours &eacute;vident. Pour aider &agrave; d&eacute;couvrir les erreurs, le navigateur a aussi des m&eacute;thodes pour aider au d&eacute;bogage.
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">setConnectionTimeout($timeout)</span></td><td>Ferme la socket avec un d&eacute;lai trop long</td>
+</tr>
+ <tr>
+<td><span class="new_code">getRequest()</span></td><td>L'ent&ecirc;te de la requ&ecirc;te brute de la page ou de la fen&ecirc;tre</td>
+</tr>
+ <tr>
+<td><span class="new_code">getHeaders()</span></td><td>L'ent&ecirc;te de r&eacute;ponse de la page ou de la fen&ecirc;tre</td>
+</tr>
+ <tr>
+<td><span class="new_code">getTransportError()</span></td><td>N'importe quel erreur au niveau de la socket dans le dernier t&eacute;l&eacute;chargement</td>
+</tr>
+ <tr>
+<td><span class="new_code">getResponseCode()</span></td><td>La r&eacute;ponse HTTP de la page ou de la fen&ecirc;tre</td>
+</tr>
+ <tr>
+<td><span class="new_code">getMimeType()</span></td><td>Le type Mime de la page our de la fen&ecirc;tre</td>
+</tr>
+ <tr>
+<td><span class="new_code">getAuthentication()</span></td><td>Le type d'authentification dans l'ent&ecirc;te d'une provocation 401</td>
+</tr>
+ <tr>
+<td><span class="new_code">getRealm()</span></td><td>Le realm d'authentification dans l'ent&ecirc;te d'une provocation 401</td>
+</tr>
+ <tr>
+<td><span class="new_code">setMaximumRedirects($max)</span></td><td>Nombre de redirections avant que la page ne soit charg&eacute;e automatiquement</td>
+</tr>
+ <tr>
+<td><span class="new_code">setMaximumNestedFrames($max)</span></td><td>Protection contre des framesets r&eacute;cursifs</td>
+</tr>
+ <tr>
+<td><span class="new_code">ignoreFrames()</span></td><td>Neutralise le support des fen&ecirc;tres</td>
+</tr>
+ <tr>
+<td><span class="new_code">useFrames()</span></td><td>Autorise le support des fen&ecirc;tres</td>
+</tr>
+ </tbody>
+</table>
+ Les m&eacute;thodes <span class="new_code">SimpleBrowser::setConnectionTimeout()</span>, <span class="new_code">SimpleBrowser::setMaximumRedirects()</span>,<span class="new_code">SimpleBrowser::setMaximumNestedFrames()</span>, <span class="new_code">SimpleBrowser::ignoreFrames()</span> et <span class="new_code">SimpleBrowser::useFrames()</span> continuent &agrave; s'appliquer sur toutes les requ&ecirc;tes suivantes. Les autres m&eacute;thodes tiennent compte des fen&ecirc;tres. Cela veut dire que si une fen&ecirc;tre individuelle ne se charge pas, il suffit de se diriger vers elle avec <span class="new_code">SimpleBrowser::setFrameFocus()</span> : ensuite on utilisera <span class="new_code">SimpleBrowser::getRequest()</span>, etc. pour voir ce qui se passe.
+ </p>
+
+ <p>
+<a class="target" name="unit">
+<h2>Tests unitaires complexes avec des navigateurs multiples</h2>
+</a>
+</p>
+ <p>
+ Tout ce qui peut &ecirc;tre fait dans <a href="web_tester_documentation.html">WebTestCase</a> peut maintenant &ecirc;tre fait dans un <a href="unit_tester_documentation.html">UnitTestCase</a>. Ce qui revient &agrave; dire que nous pouvons librement m&eacute;langer des tests sur des objets de domaine avec l'interface web...
+<pre>
+class TestOfRegistration extends UnitTestCase {
+ function testNewUserAddedToAuthenticator() {
+ $browser = &amp;new SimpleBrowser();
+ $browser-&gt;get('http://my-site.com/register.php');
+ $browser-&gt;setField('email', 'me@here');
+ $browser-&gt;setField('password', 'Secret');
+ $browser-&gt;clickSubmit('Register');
+
+ $authenticator = &amp;new Authenticator();
+ $member = &amp;$authenticator-&gt;findByEmail('me@here');
+ $this-&gt;assertEqual($member-&gt;getPassword(), 'Secret');
+ }
+}
+</pre>
+ Bien que &ccedil;a puisse &ecirc;tre utile par convenance temporaire, je ne suis pas fan de ce genre de test. Ce test s'applique &agrave; plusieurs couches de l'application, &ccedil;a implique qu'il est plus que probable qu'il faudra le remanier lorsque le code changera.
+ </p>
+ <p>
+ Un cas plus utile d'utilisation directe du navigateur est le moment o&ugrave; le <span class="new_code">WebTestCase</span> ne peut plus suivre. Un exemple ? Quand deux navigateurs doivent &ecirc;tre utilis&eacute;s en m&ecirc;me temps.
+ </p>
+ <p>
+ Par exemple, supposons que nous voulions interdire des usages simultan&eacute;s d'un site avec le m&ecirc;me login d'identification. Ce sc&eacute;nario de test le v&eacute;rifie...
+<pre>
+class TestOfSecurity extends UnitTestCase {
+ function testNoMultipleLoginsFromSameUser() {
+ $first = &amp;new SimpleBrowser();
+ $first-&gt;get('http://my-site.com/login.php');
+ $first-&gt;setField('name', 'Me');
+ $first-&gt;setField('password', 'Secret');
+ $first-&gt;clickSubmit('Enter');
+ $this-&gt;assertEqual($first-&gt;getTitle(), 'Welcome');
+
+ $second = &amp;new SimpleBrowser();
+ $second-&gt;get('http://my-site.com/login.php');
+ $second-&gt;setField('name', 'Me');
+ $second-&gt;setField('password', 'Secret');
+ $second-&gt;clickSubmit('Enter');
+ $this-&gt;assertEqual($second-&gt;getTitle(), 'Access Denied');
+ }
+}
+</pre>
+ Vous pouvez aussi utiliser la classe <span class="new_code">SimpleBrowser</span> quand vous souhaitez &eacute;crire des sc&eacute;narios de test en utilisant un autre outil que SimpleTest.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ La page du projet SimpleTest sur <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ La page de t&eacute;l&eacute;chargement de SimpleTest sur <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+<li>
+ <a href="http://simpletest.sourceforge.net/">L'API de d&eacute;veloppeur pour SimpleTest</a> donne tous les d&eacute;tails sur les classes et les assertions disponibles.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/fr/docs.css b/tests/simpletest/docs/fr/docs.css
new file mode 100755
index 0000000000..93226cd7cd
--- /dev/null
+++ b/tests/simpletest/docs/fr/docs.css
@@ -0,0 +1,84 @@
+body {
+ padding-left: 3%;
+ padding-right: 3%;
+}
+pre {
+ font-family: courier;
+ font-size: 80%;
+ border: 1px solid;
+ background-color: #cccccc;
+ padding: 5px;
+ margin-left: 5%;
+ margin-right: 8%;
+}
+.code, .new_code, pre.new_code {
+ font-weight: bold;
+}
+div.copyright {
+ font-size: 80%;
+ color: gray;
+}
+div.copyright a {
+ color: gray;
+}
+ul.api {
+ padding-left: 0em;
+ padding-right: 25%;
+}
+ul.api li {
+ margin-top: 0.2em;
+ margin-bottom: 0.2em;
+ list-style: none;
+ text-indent: -3em;
+ padding-left: 3em;
+}
+div.demo {
+ border: 4px ridge;
+ border-color: gray;
+ padding: 10px;
+ margin: 5px;
+ margin-left: 20px;
+ margin-right: 40px;
+ background-color: white;
+}
+div.demo span.fail {
+ color: red;
+}
+div.demo span.pass {
+ color: green;
+}
+div.demo h1 {
+ font-size: 12pt;
+ text-align: left;
+ font-weight: bold;
+}
+table {
+ border: 2px outset;
+ border-color: gray;
+ background-color: white;
+ margin: 5px;
+ margin-left: 5%;
+ margin-right: 5%;
+}
+td {
+ font-size: 80%;
+}
+.shell {
+ color: white;
+}
+pre.shell {
+ border: 4px ridge;
+ border-color: gray;
+ padding: 10px;
+ margin: 5px;
+ margin-left: 20px;
+ margin-right: 40px;
+ background-color: black;
+}
+form.demo {
+ background-color: lightgray;
+ border: 4px outset;
+ border-color: lightgray;
+ padding: 10px;
+ margin-right: 40%;
+}
diff --git a/tests/simpletest/docs/fr/expectation_documentation.html b/tests/simpletest/docs/fr/expectation_documentation.html
new file mode 100755
index 0000000000..9c2a7295c5
--- /dev/null
+++ b/tests/simpletest/docs/fr/expectation_documentation.html
@@ -0,0 +1,302 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Documentation SimpleTest : &eacute;tendre le testeur unitaire avec des classes d'attentes suppl&eacute;mentaires</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Documentation sur les attentes</h1>
+ This page...
+ <ul>
+<li>
+ Utiliser les attentes <a href="#fantaisie">pour des tests plus pr&eacute;cis avec des objets fantaisie</a>
+ </li>
+<li>
+ <a href="#comportement">Changer le comportement d'un objet fantaisie</a> avec des attentes
+ </li>
+<li>
+ <a href="#etendre">Cr&eacute;er des attentes</a>
+ </li>
+<li>
+ Par dessous SimpleTest <a href="#unitaire">utilise des classes d'attente</a>
+ </li>
+</ul>
+<div class="content">
+ <p>
+<a class="target" name="fantaisie">
+<h2>Plus de contr&ocirc;le sur les objets fantaisie</h2>
+</a>
+</p>
+ <p>
+ Le comportement par d&eacute;faut des <a href="mock_objects_documentation.html">objets fantaisie</a> dans <a href="http://sourceforge.net/projects/simpletest/">SimpleTest</a> est soit une correspondance identique sur l'argument, soit l'acceptation de n'importe quel argument. Pour la plupart des tests, c'est suffisant. Cependant il est parfois n&eacute;cessaire de ramollir un sc&eacute;nario de test.
+ </p>
+ <p>
+ Un des endroits o&ugrave; un test peut &ecirc;tre trop serr&eacute; est la reconnaissance textuelle. Prenons l'exemple d'un composant qui produirait un message d'erreur utile lorsque quelque chose plante. Il serait utile de tester que l'erreur correcte est renvoy&eacute;e, mais le texte proprement dit risque d'&ecirc;tre plut&ocirc;t long. Si vous testez le texte dans son ensemble alors &agrave; chaque modification de ce m&ecirc;me message -- m&ecirc;me un point ou une virgule -- vous aurez &agrave; revenir sur la suite de test pour la modifier.
+ </p>
+ <p>
+ Voici un cas concret, nous avons un service d'actualit&eacute;s qui a &eacute;chou&eacute; dans sa tentative de connexion &agrave; sa source distante.
+<pre>
+<strong>class NewsService {
+ ...
+ function publish(&amp;$writer) {
+ if (! $this-&gt;isConnected()) {
+ $writer-&gt;write('Cannot connect to news service "' .
+ $this-&gt;_name . '" at this time. ' .
+ 'Please try again later.');
+ }
+ ...
+ }
+}</strong>
+</pre>
+ L&agrave; il envoie son contenu vers un classe <span class="new_code">Writer</span>. Nous pourrions tester ce comportement avec un <span class="new_code">MockWriter</span>...
+<pre>
+class TestOfNewsService extends UnitTestCase {
+ ...
+ function testConnectionFailure() {<strong>
+ $writer = &amp;new MockWriter($this);
+ $writer-&gt;expectOnce('write', array(
+ 'Cannot connect to news service ' .
+ '"BBC News" at this time. ' .
+ 'Please try again later.'));
+
+ $service = &amp;new NewsService('BBC News');
+ $service-&gt;publish($writer);
+
+ $writer-&gt;tally();</strong>
+ }
+}
+</pre>
+ C'est un bon exemple d'un test fragile. Si nous d&eacute;cidons d'ajouter des instructions compl&eacute;mentaires, par exemple proposer une source d'actualit&eacute;s alternative, nous casserons nos tests par la m&ecirc;me occasion sans pourtant avoir modifi&eacute; une seule fonctionnalit&eacute;.
+ </p>
+ <p>
+ Pour contourner ce probl&egrave;me, nous voudrions utiliser un test avec une expression rationnelle plut&ocirc;t qu'une correspondance exacte. Nous pouvons y parvenir avec...
+<pre>
+class TestOfNewsService extends UnitTestCase {
+ ...
+ function testConnectionFailure() {
+ $writer = &amp;new MockWriter($this);<strong>
+ $writer-&gt;expectOnce(
+ 'write',
+ array(new WantedPatternExpectation('/cannot connect/i')));</strong>
+
+ $service = &amp;new NewsService('BBC News');
+ $service-&gt;publish($writer);
+
+ $writer-&gt;tally();
+ }
+}
+</pre>
+ Plut&ocirc;t que de transmettre le param&egrave;tre attendu au <span class="new_code">MockWriter</span>, nous envoyons une classe d'attente appel&eacute;e <span class="new_code">WantedPatternExpectation</span>. L'objet fantaisie est suffisamment &eacute;l&eacute;gant pour reconna&icirc;tre qu'il s'agit d'un truc sp&eacute;cial et pour le traiter diff&eacute;remment. Plut&ocirc;t que de comparer l'argument entrant &agrave; cet objet, il utilise l'objet attente lui-m&ecirc;me pour ex&eacute;cuter le test.
+ </p>
+ <p>
+ <span class="new_code">WantedPatternExpectation</span> utilise l'expression rationnelle pour la comparaison avec son constructeur. A chaque fois qu'une comparaison est fait &agrave; travers <span class="new_code">MockWriter</span> par rapport &agrave; cette classe attente, elle fera un <span class="new_code">preg_match()</span> avec ce motif. Dans notre sc&eacute;nario de test ci-dessus, aussi longtemps que la cha&icirc;ne "cannot connect" appara&icirc;t dans le texte, la fantaisie transmettra un succ&egrave;s au testeur unitaire. Peu importe le reste du texte.
+ </p>
+ <p>
+ Les classes attente possibles sont...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">EqualExpectation</span></td><td>Une &eacute;galit&eacute;, plut&ocirc;t que la plus forte comparaison &agrave; l'identique</td>
+</tr>
+ <tr>
+<td><span class="new_code">NotEqualExpectation</span></td><td>Une comparaison sur la non-&eacute;galit&eacute;</td>
+</tr>
+ <tr>
+<td><span class="new_code">IndenticalExpectation</span></td><td>La v&eacute;rification par d&eacute;faut de l'objet fantaisie qui doit correspondre exactement</td>
+</tr>
+ <tr>
+<td><span class="new_code">NotIndenticalExpectation</span></td><td>Inverse la logique de l'objet fantaisie</td>
+</tr>
+ <tr>
+<td><span class="new_code">WantedPatternExpectation</span></td><td>Utilise une expression rationnelle Perl pour comparer une cha&icirc;ne</td>
+</tr>
+ <tr>
+<td><span class="new_code">NoUnwantedPatternExpectation</span></td><td>Passe seulement si l'expression rationnelle Perl &eacute;choue</td>
+</tr>
+ <tr>
+<td><span class="new_code">IsAExpectation</span></td><td>V&eacute;rifie le type ou le nom de la classe uniquement</td>
+</tr>
+ <tr>
+<td><span class="new_code">NotAExpectation</span></td><td>L'oppos&eacute; de <span class="new_code">IsAExpectation</span></td>
+</tr>
+ <tr>
+<td><span class="new_code">MethodExistsExpectation</span></td><td>V&eacute;rifie si la m&eacute;thode est disponible sur un objet</td>
+</tr>
+ </tbody>
+</table>
+ La plupart utilisent la valeur attendue dans le constructeur. Les exceptions sont les v&eacute;rifications sur motif, qui utilisent une expression rationnelle, ainsi que <span class="new_code">IsAExpectation</span> et <span class="new_code">NotAExpectation</span>, qui prennent un type ou un nom de classe comme cha&icirc;ne.
+ </p>
+
+ <p>
+<a class="target" name="comportement">
+<h2>Utiliser les attentes pour contr&ocirc;ler les bouchons serveur</h2>
+</a>
+</p>
+ <p>
+ Les classes attente peuvent servir &agrave; autre chose que l'envoi d'assertions depuis les objets fantaisie, afin de choisir le comportement d'un <a href="mock_objects_documentation.html">objet fantaisie</a> ou celui d'un <a href="server_stubs_documentation.html">bouchon serveur</a>. A chaque fois qu'une liste d'arguments est donn&eacute;e, une liste d'objets d'attente peut &ecirc;tre ins&eacute;r&eacute;e &agrave; la place.
+ </p>
+ <p>
+ Mettons que nous voulons qu'un bouchon serveur d'autorisation simule une connexion r&eacute;ussie seulement si il re&ccedil;oit un objet de session valide. Nous pouvons y arriver avec ce qui suit...
+<pre>
+Stub::generate('Authorisation');
+<strong>
+$authorisation = new StubAuthorisation();
+$authorisation-&gt;setReturnValue(
+ 'isAllowed',
+ true,
+ array(new IsAExpectation('Session', 'Must be a session')));
+$authorisation-&gt;setReturnValue('isAllowed', false);</strong>
+</pre>
+ Le comportement par d&eacute;faut du bouchon serveur est d&eacute;fini pour renvoyer <span class="new_code">false</span> quand <span class="new_code">isAllowed</span> est appel&eacute;. Lorsque nous appelons cette m&eacute;thode avec un unique param&egrave;tre qui est un objet <span class="new_code">Session</span>, il renverra <span class="new_code">true</span>. Nous avons aussi ajout&eacute; un deuxi&egrave;me param&egrave;tre comme message. Il sera affich&eacute; dans le message d'erreur de l'objet fantaisie si l'attente est la cause de l'&eacute;chec.
+ </p>
+ <p>
+ Ce niveau de sophistication est rarement utile : il n'est inclut que pour &ecirc;tre complet.
+ </p>
+
+ <p>
+<a class="target" name="etendre">
+<h2>Cr&eacute;er vos propres attentes</h2>
+</a>
+</p>
+ <p>
+ Les classes d'attentes ont une structure tr&egrave;s simple. Tellement simple qu'il devient tr&egrave;s simple de cr&eacute;er vos propres version de logique pour des tests utilis&eacute;s couramment.
+ </p>
+ <p>
+ Par exemple voici la cr&eacute;ation d'une classe pour tester la validit&eacute; d'adresses IP. Pour fonctionner correctement avec les bouchons serveurs et les objets fantaisie, cette nouvelle classe d'attente devrait &eacute;tendre <span class="new_code">SimpleExpectation</span>...
+<pre>
+<strong>class ValidIp extends SimpleExpectation {
+
+ function test($ip) {
+ return (ip2long($ip) != -1);
+ }
+
+ function testMessage($ip) {
+ return "Address [$ip] should be a valid IP address";
+ }
+}</strong>
+</pre>
+ Il n'y a v&eacute;ritablement que deux m&eacute;thodes &agrave; mettre en place. La m&eacute;thode <span class="new_code">test()</span> devrait renvoyer un <span class="new_code">true</span> si l'attente doit passer, et une erreur <span class="new_code">false</span> dans le cas contraire. La m&eacute;thode <span class="new_code">testMessage()</span> ne devrait renvoyer que du texte utile &agrave; la compr&eacute;hension du test en lui-m&ecirc;me.
+ </p>
+ <p>
+ Cette classe peut d&eacute;sormais &ecirc;tre employ&eacute;e &agrave; la place des classes d'attente pr&eacute;c&eacute;dentes.
+ </p>
+
+ <p>
+<a class="target" name="unitaire">
+<h2>Sous le capot du testeur unitaire</h2>
+</a>
+</p>
+ <p>
+ Le <a href="http://sourceforge.net/projects/simpletest/">framework de test unitaire SimpleTest</a> utilise aussi dans son coeur des classes d'attente pour la <a href="unit_test_documentation.html">classe UnitTestCase</a>. Nous pouvons aussi tirer parti de ces m&eacute;canismes pour r&eacute;utiliser nos propres classes attente &agrave; l'int&eacute;rieur m&ecirc;me des suites de test.
+ </p>
+ <p>
+ La m&eacute;thode la plus directe est d'utiliser la m&eacute;thode <span class="new_code">SimpleTest::assertExpectation()</span> pour effectuer le test...
+<pre>
+<strong>class TestOfNetworking extends UnitTestCase {
+ ...
+ function testGetValidIp() {
+ $server = &amp;new Server();
+ $this-&gt;assertExpectation(
+ new ValidIp(),
+ $server-&gt;getIp(),
+ 'Server IP address-&gt;%s');
+ }
+}</strong>
+</pre>
+ C'est plut&ocirc;t sale par rapport &agrave; notre syntaxe habituelle du type <span class="new_code">assert...()</span>.
+ </p>
+ <p>
+ Pour un cas aussi simple, nous cr&eacute;ons d'ordinaire une m&eacute;thode d'assertion distincte en utilisant la classe d'attente. Supposons un instant que notre attente soit un peu plus compliqu&eacute;e et que par cons&eacute;quent nous souhaitions la r&eacute;utiliser, nous obtenons...
+<pre>
+class TestOfNetworking extends UnitTestCase {
+ ...<strong>
+ function assertValidIp($ip, $message = '%s') {
+ $this-&gt;assertExpectation(new ValidIp(), $ip, $message);
+ }</strong>
+
+ function testGetValidIp() {
+ $server = &amp;new Server();<strong>
+ $this-&gt;assertValidIp(
+ $server-&gt;getIp(),
+ 'Server IP address-&gt;%s');</strong>
+ }
+}
+</pre>
+ Il est peu probable que nous ayons besoin de ce niveau de contr&ocirc;le sur la machinerie de test. Il est assez rare que le besoin d'une attente d&eacute;passe le stade de la reconnaissance d'un motif. De plus, les classes d'attente complexes peuvent rendre les tests difficiles &agrave; lire et &agrave; d&eacute;boguer. Ces m&eacute;canismes sont v&eacute;ritablement l&agrave; pour les auteurs de syst&egrave;me qui &eacute;tendront le framework de test pour leurs propres outils de test.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ La page du projet SimpleTest sur <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ La page de t&eacute;l&eacute;chargement de SimpleTest sur <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+<li>
+ Les attentes imitent les contraintes dans <a href="http://www.jmock.org/">JMock</a>.
+ </li>
+<li>
+ <a href="http://simpletest.sourceforge.net/">L'API compl&egrave;te pour SimpleTest</a> r&eacute;alis&eacute; avec PHPDoc.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/fr/form_testing_documentation.html b/tests/simpletest/docs/fr/form_testing_documentation.html
new file mode 100755
index 0000000000..f3f407c604
--- /dev/null
+++ b/tests/simpletest/docs/fr/form_testing_documentation.html
@@ -0,0 +1,268 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Documentation SimpleTest : tester des formulaires HTML</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Documentation sur les tests de formulaire</h1>
+ This page...
+ <ul>
+<li>
+ Modifier les valeurs d'un formulaire et <a href="#submit">r&eacute;ussir &agrave; transmettre un simple formulaire</a>
+ </li>
+<li>
+ G&eacute;rer des <a href="#multiple">objets &agrave; valeurs multiples</a> en initialisant des listes.
+ </li>
+<li>
+ <a href="#brut">Envoi brut</a> quand il n'existe pas de bouton &agrave; cliquer.
+ </li>
+</ul>
+<div class="content">
+ <p>
+<a class="target" name="submit">
+<h2>Valider un formulaire simple</h2>
+</a>
+</p>
+ <p>
+ Lorsqu'une page est t&eacute;l&eacute;charg&eacute;e par <span class="new_code">WebTestCase</span> en utilisant <span class="new_code">get()</span> ou <span class="new_code">post()</span> le contenu de la page est automatiquement analys&eacute;. De cette analyse d&eacute;coule le fait que toutes les commandes &agrave; l'int&eacute;rieur de la balise &lt;form&gt; sont disponibles depuis l'int&eacute;rieur du sc&eacute;nario de test. Prenons par exemple cet extrait de code HTML...
+<pre>
+&lt;form&gt;
+ &lt;input type="text" name="a" value="A default" /&gt;
+ &lt;input type="submit" value="Go" /&gt;
+&lt;/form&gt;
+</pre>
+ Il ressemble &agrave;...
+ </p>
+ <p>
+ <form class="demo">
+ <input type="text" name="a" value="A default">
+ <input type="submit" value="Go">
+ </form>
+ </p>
+ <p>
+ Nous pouvons naviguer vers ce code, via le site <a href="http://www.lastcraft.com/form_testing_documentation.php">LastCraft</a>, avec le test suivant...
+<pre>
+class SimpleFormTests extends WebTestCase {
+ <strong>
+ function testDefaultValue() {
+ $this-&gt;get('http://www.lastcraft.com/form_testing_documentation.php');
+ $this-&gt;assertField('a', 'A default');
+ }</strong>
+}
+</pre>
+ Directement apr&egrave;s le chargement de la page toutes les commandes HTML sont initi&eacute;es avec leur valeur par d&eacute;faut, comme elles appara&icirc;traient dans un navigateur web. L'assertion teste qu'un objet HTML avec le nom "a" existe dans la page et qu'il contient la valeur "A default".
+ </p>
+ <p>
+ Nous pourrions retourner le formulaire tout de suite, mais d'abord nous allons changer la valeur du champ texte. Ce n'est qu'apr&egrave;s que nous le transmettrons...
+<pre>
+class SimpleFormTests extends WebTestCase {
+
+ function testDefaultValue() {
+ $this-&gt;get('http://www.my-site.com/');
+ $this-&gt;assertField('a', 'A default');<strong>
+ $this-&gt;setField('a', 'New value');
+ $this-&gt;clickSubmit('Go');</strong>
+ }
+}
+</pre>
+ Parce que nous n'avons sp&eacute;cifi&eacute; ni attribut "method" sur la balise form, ni attribut "action", le sc&eacute;nario de test suivra le comportement classique d'un navigateur : transmission des donn&eacute;es avec une requ&ecirc;te <em>GET</em> vers la m&ecirc;me page. SimpleTest essaie d'&eacute;muler le comportement typique d'un navigateur autant que possible, plut&ocirc;t que d'essayer d'attraper des attributs manquants sur les balises. La raison est simple : la cible d'un framework de test est la logique d'une application PHP, pas les erreurs -- de syntaxe ou autres -- du code HTML. Pour les erreurs HTML, d'autres outils tel <a href="http://www.w3.org/People/Raggett/tidy/">HTMLTidy</a> devraient &ecirc;tre employ&eacute;s.
+ </p>
+ <p>
+ Si un champ manque dans n'importe quel formulaire ou si une option est indisponible alors <span class="new_code">WebTestCase::setField()</span> renverra <span class="new_code">false</span>. Par exemple, supposons que nous souhaitons v&eacute;rifier qu'une option "Superuser" n'est pas pr&eacute;sente dans ce formulaire...
+<pre>
+&lt;strong&gt;Select type of user to add:&lt;/strong&gt;
+&lt;select name="type"&gt;
+ &lt;option&gt;Subscriber&lt;/option&gt;
+ &lt;option&gt;Author&lt;/option&gt;
+ &lt;option&gt;Administrator&lt;/option&gt;
+&lt;/select&gt;
+</pre>
+ Qui ressemble &agrave;...
+ </p>
+ <p>
+ <form class="demo">
+ <strong>Select type of user to add:</strong>
+ <select name="type">
+ <option>Subscriber</option>
+ <option>Author</option>
+ <option>Administrator</option>
+ </select>
+ </form>
+ </p>
+ <p>
+ Le test suivant le confirmera...
+<pre>
+class SimpleFormTests extends WebTestCase {
+ ...
+ function testNoSuperuserChoiceAvailable() {<strong>
+ $this-&gt;get('http://www.lastcraft.com/form_testing_documentation.php');
+ $this-&gt;assertFalse($this-&gt;setField('type', 'Superuser'));</strong>
+ }
+}
+</pre>
+ La s&eacute;lection ne sera pas chang&eacute;e suite &agrave; un &eacute;chec d'initialisation d'une valeur sur un objet.
+ </p>
+ <p>
+ Voici la liste compl&egrave;te des objets support&eacute;s &agrave; aujourd'hui...
+ <ul>
+ <li>Champs texte, y compris les champs masqu&eacute;s (hidden) ou crypt&eacute;s (password).</li>
+ <li>Boutons submit, en incluant aussi la balise button, mais pas encore les boutons reset</li>
+ <li>Aires texte (textarea) avec leur gestion des retours &agrave; la ligne (wrap).</li>
+ <li>Cases &agrave; cocher, y compris les cases &agrave; cocher multiples dans un m&ecirc;me formulaire.</li>
+ <li>Listes &agrave; menu d&eacute;roulant, y compris celles &agrave; s&eacute;lections multiples.</li>
+ <li>Boutons radio.</li>
+ <li>Images.</li>
+ </ul>
+ </p>
+ <p>
+ Bien que la plupart des objets HTML standards soient couvert par le parseur de <em>SimpleTest</em>, il est peu probable que JavaScript soit impl&eacute;ment&eacute; dans un futur proche.
+ </p>
+
+ <p>
+<a class="target" name="multiple">
+<h2>Champs &agrave; valeurs multiples</h2>
+</a>
+</p>
+ <p>
+ SimpleTest peut g&eacute;rer deux types de commandes &agrave; valeur multiple : les menus d&eacute;roulants &agrave; s&eacute;lection multiple et les cases &agrave; cocher avec le m&ecirc;me nom &agrave; l'int&eacute;rieur m&ecirc;me d'un formulaire. La nature de ceux-ci implique que leur initialisation et leur test sont l&eacute;g&egrave;rement diff&eacute;rents. Voici un exemple avec des cases &agrave; cocher...
+<pre>
+&lt;form class="demo"&gt;
+ &lt;strong&gt;Create privileges allowed:&lt;/strong&gt;
+ &lt;input type="checkbox" name="crud" value="c" checked&gt;&lt;br&gt;
+ &lt;strong&gt;Retrieve privileges allowed:&lt;/strong&gt;
+ &lt;input type="checkbox" name="crud" value="r" checked&gt;&lt;br&gt;
+ &lt;strong&gt;Update privileges allowed:&lt;/strong&gt;
+ &lt;input type="checkbox" name="crud" value="u" checked&gt;&lt;br&gt;
+ &lt;strong&gt;Destroy privileges allowed:&lt;/strong&gt;
+ &lt;input type="checkbox" name="crud" value="d" checked&gt;&lt;br&gt;
+ &lt;input type="submit" value="Enable Privileges"&gt;
+&lt;/form&gt;
+</pre>
+ Qui se traduit par...
+ </p>
+ <p>
+ <form class="demo">
+ <strong>Create privileges allowed:</strong>
+ <input type="checkbox" name="crud" value="c" checked>
+<br>
+ <strong>Retrieve privileges allowed:</strong>
+ <input type="checkbox" name="crud" value="r" checked>
+<br>
+ <strong>Update privileges allowed:</strong>
+ <input type="checkbox" name="crud" value="u" checked>
+<br>
+ <strong>Destroy privileges allowed:</strong>
+ <input type="checkbox" name="crud" value="d" checked>
+<br>
+ <input type="submit" value="Enable Privileges">
+ </form>
+ </p>
+ <p>
+ Si nous souhaitons d&eacute;sactiver tous les privil&egrave;ges sauf ceux de t&eacute;l&eacute;chargement (Retrieve) et transmettre cette information, nous pouvons y arriver par...
+<pre>
+class SimpleFormTests extends WebTestCase {
+ ...<strong>
+ function testDisableNastyPrivileges() {
+ $this-&gt;get('http://www.lastcraft.com/form_testing_documentation.php');
+ $this-&gt;assertField('crud', array('c', 'r', 'u', 'd'));
+ $this-&gt;setField('crud', array('r'));
+ $this-&gt;clickSubmit('Enable Privileges');
+ }</strong>
+}
+</pre>
+ Plut&ocirc;t que d'initier le champ &agrave; une valeur unique, nous lui donnons une liste de valeurs. Nous faisons la m&ecirc;me chose pour tester les valeurs attendues. Nous pouvons &eacute;crire d'autres bouts de code de test pour confirmer cet effet, peut-&ecirc;tre en nous connectant comme utilisateur et en essayant d'effectuer une mise &agrave; jour.
+ </p>
+ <p>
+ <a class="target" name="brut">
+<h2>Envoi brut</h2>
+</a>
+ </p>
+ <p>
+ Si vous souhaitez tester un gestionnaire de formulaire mais que vous ne l'avez pas &eacute;crit ou que vous n'y avez pas encore acc&egrave;s, vous pouvez cr&eacute;er un envoi de formulaire &agrave; la main.
+<pre>
+class SimpleFormTests extends WebTestCase {
+ ...<strong>
+ function testAttemptedHack() {
+ $this-&gt;post(
+ 'http://www.my-site.com/add_user.php',
+ array('type' =&gt; 'superuser'));
+ $this-&gt;assertNoUnwantedPattern('/user created/i');
+ }</strong>
+}
+</pre>
+ En ajoutant des donn&eacute;es &agrave; la m&eacute;thode <span class="new_code">WebTestCase::post()</span>, nous essayons de t&eacute;l&eacute;charger la page via la transmission d'un formulaire.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ La page du projet SimpleTest sur <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ La page de t&eacute;l&eacute;chargement de SimpleTest sur <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+<li>
+ <a href="http://simpletest.sourceforge.net/">L'API du d&eacute;veloppeur pour SimpleTest</a> donne tous les d&eacute;tails sur les classes et les assertions disponibles.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/fr/group_test_documentation.html b/tests/simpletest/docs/fr/group_test_documentation.html
new file mode 100755
index 0000000000..e553d0ac2e
--- /dev/null
+++ b/tests/simpletest/docs/fr/group_test_documentation.html
@@ -0,0 +1,318 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Documentation SimpleTest : Grouper des tests</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Documentation sur le groupement des tests</h1>
+ This page...
+ <ul>
+<li>
+ Plusieurs approches pour <a href="#group">grouper des tests</a> ensemble.
+ </li>
+<li>
+ Combiner des groupes des tests dans des <a href="#plus-haut">groupes plus grands</a>.
+ </li>
+<li>
+ Int&eacute;grer des <a href="#heritage">sc&eacute;narios de test h&eacute;rit&eacute;s</a> d'un autre type de PHPUnit.
+ </li>
+</ul>
+<div class="content">
+ <p>
+<a class="target" name="grouper">
+<h2>Grouper des tests</h2>
+</a>
+</p>
+ <p>
+ Pour lancer les sc&eacute;narios de tests en tant que groupe, ils devraient &ecirc;tre plac&eacute;s dans des fichiers sans le code du lanceur...
+<pre>
+<strong>&lt;?php
+ require_once('../classes/io.php');
+
+ class FileTester extends UnitTestCase {
+ ...
+ }
+
+ class SocketTester extends UnitTestCase {
+ ...
+ }
+?&gt;</strong>
+</pre>
+ Autant de sc&eacute;narios que n&eacute;cessaires peuvent &ecirc;tre mis dans un fichier unique. Ils doivent contenir tout le code n&eacute;cessaire, entre autres la biblioth&egrave;que test&eacute;e, mais aucune des biblioth&egrave;ques de SimpleTest.
+ </p>
+ <p>
+ Si vous avez &eacute;tendu l'un ou l'autre des sc&eacute;narios de test, vous pouvez aussi les inclure.
+<pre>
+&lt;?php
+ require_once('../classes/io.php');
+<strong>
+ class MyFileTestCase extends UnitTestCase {
+ ...
+ }
+ SimpleTestOptions::ignore('MyFileTestCase');</strong>
+
+ class FileTester extends MyFileTestCase {
+ ...
+ }
+
+ class SocketTester extends UnitTestCase {
+ ...
+ }
+?&gt;
+</pre>
+ La classe <span class="new_code">FileTester</span> ne contient aucun test v&eacute;ritable, il s'agit d'une classe de base pour d'autres sc&eacute;narios de test. Pour cette raison nous utilisons la directive <span class="new_code">SimpleTestOptions::ignore()</span> pour indiquer au prochain groupe de tests de l'ignorer. Cette directive peut se placer n'importe o&ugrave; dans le fichier et fonctionne quand un fichier complet des sc&eacute;narios de test est charg&eacute; (cf. ci-dessous). Nous l'appelons <em>file_test.php</em>.
+ </p>
+ <p>
+ Ensuite nous cr&eacute;ons un fichier de groupe de tests, disons <em>group_test.php</em>. Vous penserez &agrave; un nom plus convaincant, j'en suis s&ucirc;r. Nous lui ajoutons le fichier de test avec une m&eacute;thode sans risque...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');<strong>
+ require_once('file_test.php');
+
+ $test = &amp;new GroupTest('All file tests');
+ $test-&gt;addTestCase(new FileTestCase());
+ $test-&gt;run(new HtmlReporter());</strong>
+?&gt;
+</pre>
+ Ceci instancie le sc&eacute;nario de test avant que la suite de test ne soit lanc&eacute;e. &Ccedil;a pourrait devenir assez on&eacute;reux avec un grand nombre de sc&eacute;narios de test : il existe donc une autre m&eacute;thode qui instancie la classe uniquement quand elle devient n&eacute;cessaire...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');
+ require_once('file_test.php');
+
+ $test = &amp;new GroupTest('All file tests');<strong>
+ $test-&gt;addTestClass('FileTestCase');</strong>
+ $test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ Le probl&egrave;me de cette technique est que pour chaque sc&eacute;nario de test suppl&eacute;mentaire nous aurons &agrave; importer (via <span class="new_code">require_once()</span>) le fichier de code de test et &agrave; instancier manuellement chaque sc&eacute;nario de test. Nous pouvons nous &eacute;pargner beaucoup de dactylographie avec...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');
+
+ $test = &amp;new GroupTest('All file tests');<strong>
+ $test-&gt;addTestFile('file_test.php');</strong>
+ $test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ Voici ce qui vient de se passer : la classe <span class="new_code">GroupTest</span> a r&eacute;alis&eacute; le <span class="new_code">require_once()</span> pour nous. Ensuite elle v&eacute;rifie si de nouvelles classes de sc&eacute;nario de test ont &eacute;t&eacute; cr&eacute;&eacute;es par ce nouveau fichier et les ajoute automatiquement au groupe de tests. D&eacute;sormais tout ce qu'il nous reste &agrave; faire, c'est d'ajouter chaque nouveau fichier.
+ </p>
+ <p>
+ Il y a deux choses qui peuvent planter et qui demandent un minimum d'attention...
+ <ol>
+ <li>
+ Le fichier peut d&eacute;j&agrave; avoir &eacute;t&eacute; analys&eacute; par PHP et dans ce cas aucune classe ne sera ajout&eacute;e. Pensez &agrave; bien v&eacute;rifier que les sc&eacute;narios de test ne sont inclus que dans ce fichier et dans aucun autre.
+ </li>
+ <li>
+ Les nouvelles classes d'extension de sc&eacute;nario de test qui sont incluses seront plac&eacute;es dans le groupe de tests et ex&eacute;cut&eacute;es par la m&ecirc;me occasion. Vous aurez &agrave; ajouter une directive <span class="new_code">SimpleTestOptions::ignore()</span> pour ces classes ou alors pensez &agrave; les ajouter avant la ligne <span class="new_code">GroupTest::addTestFile()</span>.
+ </li>
+ </ol>
+ </p>
+
+ <p>
+<a class="target" name="plus-haut">
+<h2>Groupements de plus haut niveau</h2>
+</a>
+</p>
+ <p>
+ La technique ci-dessus place tous les sc&eacute;narios de test dans un unique et grand groupe. Sauf que pour des projets plus cons&eacute;quents, ce n'est probablement pas assez souple ; vous voudriez peut-&ecirc;tre grouper les tests tout &agrave; fait diff&eacute;remment.
+ </p>
+ <p>
+ Pour obtenir un groupe de tests plus souple nous pouvons sous classer <span class="new_code">GroupTest</span> et ensuite l'instancier au cas par cas...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');
+ <strong>
+ class FileGroupTest extends GroupTest {
+ function FileGroupTest() {
+ $this-&gt;GroupTest('All file tests');
+ $this-&gt;addTestFile('file_test.php');
+ }
+ }</strong>
+?&gt;
+</pre>
+ Ceci nomme le test dans le constructeur et ensuite ajoute &agrave; la fois nos sc&eacute;narios de test et un unique groupe en dessous. Bien s&ucirc;r nous pouvons ajouter plus d'un groupe &agrave; cet instant. Nous pouvons maintenant invoquer les tests &agrave; partir d'un autre fichier d'ex&eacute;cution...
+<pre>
+&lt;?php
+ require_once('file_group_test.php');
+ <strong>
+ $test = &amp;new FileGroupTest();
+ $test-&gt;run(new HtmlReporter());</strong>
+?&gt;
+</pre>
+ ...ou alors nous pouvons les grouper dans un groupe de tests encore plus grand...
+<pre>
+&lt;?php
+ require_once('file_group_test.php');
+ <strong>
+ $test = &amp;new BigGroupTest('Big group');
+ $test-&gt;addTestCase(new FileGroupTest());
+ $test-&gt;addTestCase(...);
+ $test-&gt;run(new HtmlReporter());</strong>
+?&gt;
+</pre>
+ Si nous souhaitons lancer le groupe de tests original sans utiliser ses petits fichiers d'ex&eacute;cution, nous pouvons mettre le code du lanceur de test derri&egrave;re des barreaux quand nous cr&eacute;ons chaque groupe.
+<pre>
+&lt;?php
+ class FileGroupTest extends GroupTest {
+ function FileGroupTest() {
+ $this-&gt;GroupTest('All file tests');
+ $test-&gt;addTestFile('file_test.php');
+ }
+ }
+ <strong>
+ if (! defined('RUNNER')) {
+ define('RUNNER', true);</strong>
+ $test = &amp;new FileGroupTest();
+ $test-&gt;run(new HtmlReporter());
+ }
+?&gt;
+</pre>
+ Cette approche exige aux barri&egrave;res d'&ecirc;tre activ&eacute;es &agrave; l'inclusion du fichier de groupe de tests, mais c'est quand m&ecirc;me moins de tracas que beaucoup de fichiers de lancement &eacute;parpill&eacute;s. Reste &agrave; inclure des barreaux identiques au niveau sup&eacute;rieur afin de s'assurer que le <span class="new_code">run()</span> ne sera lanc&eacute; qu'une seule fois &agrave; partir du script de haut niveau qui l'a invoqu&eacute;.
+<pre>
+&lt;?php
+ define('RUNNER', true);
+
+ require_once('file_group_test.php');
+ $test = &amp;new BigGroupTest('Big group');
+ $test-&gt;addTestCase(new FileGroupTest());
+ $test-&gt;addTestCase(...);
+ $test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ Comme les sc&eacute;narios de test normaux, un <span class="new_code">GroupTest</span> peut &ecirc;tre charg&eacute; avec la m&eacute;thode <span class="new_code">GroupTest::addTestFile()</span>.
+<pre>
+&lt;?php
+ define('RUNNER', true);
+
+ $test = &amp;new BigGroupTest('Big group');<strong>
+ $test-&gt;addTestFile('file_group_test.php');
+ $test-&gt;addTestFile(...);</strong>
+ $test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ </p>
+
+ <p>
+<a class="target" name="heritage">
+<h2>Int&eacute;grer des sc&eacute;narios de test h&eacute;rit&eacute;s</h2>
+</a>
+</p>
+ <p>
+ Si vous avez d&eacute;j&agrave; des tests unitaires pour votre code ou alors si vous &eacute;tendez des classes externes qui ont d&eacute;j&agrave; leurs propres tests, il y a peu de chances pour que ceux-ci soient d&eacute;j&agrave; au format SimpleTest. Heureusement il est possible d'incorporer ces sc&eacute;narios de test en provenance d'autres testeurs unitaires directement dans des groupes de test SimpleTest.
+ </p>
+ <p>
+ Par exemple, supposons que nous ayons ce sc&eacute;nario de test pr&eacute;vu pour <a href="http://sourceforge.net/projects/phpunit">PhpUnit</a> dans le fichier <em>config_test.php</em>...
+<pre>
+<strong>class ConfigFileTest extends TestCase {
+ function ConfigFileTest() {
+ $this-&gt;TestCase('Config file test');
+ }
+
+ function testContents() {
+ $config = new ConfigFile('test.conf');
+ $this-&gt;assertRegexp('/me/', $config-&gt;getValue('username'));
+ }
+}</strong>
+</pre>
+ Le groupe de tests peut le reconna&icirc;tre &agrave; partir du moment o&ugrave; nous mettons l'adaptateur appropri&eacute; avant d'ajouter le fichier de test...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');<strong>
+ require_once('simpletest/adapters/phpunit_test_case.php');</strong>
+
+ $test = &amp;new GroupTest('All file tests');<strong>
+ $test-&gt;addTestFile('config_test.php');</strong>
+ $test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ Il n'y a que deux adaptateurs, l'autre est pour le paquet testeur unitaire de <a href="http://pear.php.net/manual/en/package.php.phpunit.php">PEAR</a>...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');<strong>
+ require_once('simpletest/adapters/pear_test_case.php');</strong>
+
+ $test = &amp;new GroupTest('All file tests');<strong>
+ $test-&gt;addTestFile('some_pear_test_cases.php');</strong>
+ $test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ Les sc&eacute;narios de test de PEAR peuvent &ecirc;tre librement m&eacute;lang&eacute;s avec ceux de SimpleTest mais vous ne pouvez pas utiliser les assertions de SimpleTest au sein des versions h&eacute;rit&eacute;es des sc&eacute;narios de test. La raison ? Une simple v&eacute;rification que vous ne rendez pas par accident vos sc&eacute;narios de test compl&egrave;tement d&eacute;pendants de SimpleTest. Peut-&ecirc;tre que vous souhaitez publier votre biblioth&egrave;que sur PEAR par exemple : &ccedil;a voudrait dire la livrer avec des sc&eacute;narios de test compatibles avec PEAR::PhpUnit.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ La page du projet SimpleTest sur <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ La page de t&eacute;l&eacute;chargement de SimpleTest sur <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/fr/index.html b/tests/simpletest/docs/fr/index.html
new file mode 100755
index 0000000000..fdaa000130
--- /dev/null
+++ b/tests/simpletest/docs/fr/index.html
@@ -0,0 +1,382 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>
+ Prise en main rapide de SimpleTest pour PHP - Tests unitaire et objets fantaisie pour PHP
+ </title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Prise en main rapide de SimpleTest</h1>
+ This page...
+ <ul>
+<li>
+ <a href="#unit">Utiliser le testeur rapidement</a>
+ avec un exemple.
+ </li>
+<li>
+ <a href="#group">Groupes de tests</a>
+ pour tester en un seul clic.
+ </li>
+<li>
+ <a href="#mock">Utiliser les objets fantaisie</a>
+ pour faciliter les tests et gagner en contr&ocirc;le.
+ </li>
+<li>
+ <a href="#web">Tester des pages web</a>
+ au niveau de l'HTML.
+ </li>
+</ul>
+<div class="content">
+
+ <p>
+ Le pr&eacute;sent article pr&eacute;suppose que vous soyez familier avec le concept de tests unitaires ainsi que celui de d&eacute;veloppement web avec le langage PHP. Il s'agit d'un guide pour le nouvel et impatient utilisateur de <a href="https://sourceforge.net/project/showfiles.php?group_id=76550">SimpleTest</a>. Pour une documentation plus compl&egrave;te, particuli&egrave;rement si vous d&eacute;couvrez les tests unitaires, consultez la <a href="http://www.lastcraft.com/unit_test_documentation.php">documentation en cours</a>, et pour des exemples de sc&eacute;narios de test, consultez le <a href="http://www.lastcraft.com/first_test_tutorial.php">tutorial sur les tests unitaires</a>.
+ </p>
+
+ <p>
+<a class="target" name="unit">
+<h2>Utiliser le testeur rapidement</h2>
+</a>
+</p>
+ <p>
+ Parmi les outils de test pour logiciel, le testeur unitaire est le plus proche du d&eacute;veloppeur. Dans un contexte de d&eacute;veloppement agile, le code de test se place juste &agrave; c&ocirc;t&eacute; du code source &eacute;tant donn&eacute; que tous les deux sont &eacute;crits simultan&eacute;ment. Dans ce contexte, SimpleTest aspire &agrave; &ecirc;tre une solution compl&egrave;te de test pour un d&eacute;veloppeur PHP et s'appelle "Simple" parce qu'elle devrait &ecirc;tre simple &agrave; utiliser et &agrave; &eacute;tendre. Ce nom n'&eacute;tait pas vraiment un bon choix. Non seulement cette solution inclut toutes les fonctions classiques qu'on est en droit d'attendre de la part des portages de <a href="http://www.junit.org/">JUnit</a> et des <a href="http://sourceforge.net/projects/phpunit/">PHPUnit</a>, mais elle inclut aussi les <a href="http://www.mockobjects.com/">objets fantaisie ou "mock objects"</a>. Sans compter quelques fonctionnalit&eacute;s de <a href="http://sourceforge.net/projects/jwebunit/">JWebUnit</a> : parmi celles-ci la navigation sur des pages web, les tests sur les cookies et l'envoi de formulaire.
+ </p>
+ <p>
+ La d&eacute;monstration la plus rapide : l'exemple
+ </p>
+ <p>
+ Supposons que nous sommes en train de tester une simple classe de log dans un fichier : elle s'appelle <span class="new_code">Log</span> dans <em>classes/Log.php</em>. Commen&ccedil;ons par cr&eacute;er un script de test, appel&eacute; <em>tests/log_test.php</em>. Son contenu est le suivant...
+<pre>
+<strong>&lt;?php
+require_once('simpletest/unit_tester.php');
+require_once('simpletest/reporter.php');
+require_once('../classes/log.php');
+?&gt;</strong>
+</pre>
+ Ici le r&eacute;pertoire <em>simpletest</em> est soit dans le dossier courant, soit dans les dossiers pour fichiers inclus. Vous auriez &agrave; &eacute;diter ces arborescences suivant l'endroit o&ugrave; vous avez install&eacute; SimpleTest. Ensuite cr&eacute;ons un sc&eacute;nario de test...
+<pre>
+&lt;?php
+require_once('simpletest/unit_tester.php');
+require_once('simpletest/reporter.php');
+require_once('../classes/log.php');
+<strong>
+class TestOfLogging extends UnitTestCase {
+}</strong>
+?&gt;
+</pre>
+ A pr&eacute;sent il y a 5 lignes de code d'&eacute;chafaudage et toujours pas de test. Cependant &agrave; partir de cet instant le retour sur investissement arrive tr&egrave;s rapidement. Supposons que la classe <span class="new_code">Log</span> prenne le nom du fichier &agrave; &eacute;crire dans le constructeur et que nous ayons un r&eacute;pertoire temporaire dans lequel placer ce fichier...
+<pre>
+&lt;?php
+require_once('simpletest/unit_tester.php');
+require_once('simpletest/reporter.php');
+require_once('../classes/log.php');
+
+class TestOfLogging extends UnitTestCase {
+ <strong>
+ function testCreatingNewFile() {
+ @unlink('/temp/test.log');
+ $log = new Log('/temp/test.log');
+ $this-&gt;assertFalse(file_exists('/temp/test.log'));
+ $log-&gt;message('Should write this to a file');
+ $this-&gt;assertTrue(file_exists('/temp/test.log'));
+ }</strong>
+}
+?&gt;
+</pre>
+ Au lancement du sc&eacute;nario de test, toutes les m&eacute;thodes qui commencent avec la cha&icirc;ne <span class="new_code">test</span> sont identifi&eacute;es puis ex&eacute;cut&eacute;es. D'ordinaire nous avons bien plusieurs m&eacute;thodes de tests. Les assertions dans les m&eacute;thodes de test envoient des messages vers le framework de test qui affiche imm&eacute;diatement le r&eacute;sultat. Cette r&eacute;ponse imm&eacute;diate est importante, non seulement lors d'un crash caus&eacute; par le code, mais aussi de mani&egrave;re &agrave; rapprocher l'affichage de l'erreur au plus pr&egrave;s du sc&eacute;nario de test concern&eacute;.
+ </p>
+ <p>
+ Pour voir ces r&eacute;sultats lan&ccedil;ons effectivement les tests. S'il s'agit de l'unique sc&eacute;nario de test &agrave; lancer, on peut y arriver avec...
+<pre>
+&lt;?php
+require_once('simpletest/unit_tester.php');
+require_once('simpletest/reporter.php');
+require_once('../classes/log.php');
+
+class TestOfLogging extends UnitTestCase {
+
+ function testCreatingNewFile() {
+ @unlink('/temp/test.log');
+ $log = new Log('/temp/test.log');
+ $this-&gt;assertFalse(file_exists('/temp/test.log'));
+ $log-&gt;message('Should write this to a file');
+ $this-&gt;assertTrue(file_exists('/temp/test.log'));
+ }
+}
+<strong>
+$test = &amp;new TestOfLogging();
+$test-&gt;run(new HtmlReporter());</strong>
+?&gt;
+</pre>
+ </p>
+ <p>
+ En cas &eacute;chec, l'affichage ressemble &agrave;...
+ <div class="demo">
+ <h1>testoflogging</h1>
+ <span class="fail">Fail</span>: testcreatingnewfile-&gt;True assertion failed.<br>
+ <div style="padding: 8px; margin-top: 1em; background-color: red; color: white;">1/1 test cases complete.
+ <strong>1</strong> passes and <strong>1</strong> fails.</div>
+ </div>
+ ...et si &ccedil;a passe, on obtient...
+ <div class="demo">
+ <h1>testoflogging</h1>
+ <div style="padding: 8px; margin-top: 1em; background-color: green; color: white;">1/1 test cases complete.
+ <strong>2</strong> passes and <strong>0</strong> fails.</div>
+ </div>
+ Et si vous obtenez &ccedil;a...
+ <div class="demo">
+ <b>Fatal error</b>: Failed opening required '../classes/log.php' (include_path='') in <b>/home/marcus/projects/lastcraft/tutorial_tests/Log/tests/log_test.php</b> on line <b>7</b>
+ </div>
+ c'est qu'il vous manque le fichier <em>classes/Log.php</em> qui pourrait ressembler &agrave; :
+<pre>
+&lt;?php
+class Log {
+
+ function Log($file_path) {
+ }
+}
+?&gt;;
+</pre>
+ </p>
+
+ <p>
+<a class="target" name="group">
+<h2>Construire des groupes de tests</h2>
+</a>
+</p>
+ <p>
+ Il est peu probable que dans une v&eacute;ritable application on ait uniquement besoin de passer un seul sc&eacute;nario de test. Cela veut dire que nous avons besoin de grouper les sc&eacute;narios dans un script de test qui peut, si n&eacute;cessaire, lancer tous les tests de l'application.
+ </p>
+ <p>
+ Notre premi&egrave;re &eacute;tape est de supprimer les includes et de d&eacute;faire notre hack pr&eacute;c&eacute;dent...
+<pre>
+&lt;?php<strong>
+require_once('../classes/log.php');</strong>
+
+class TestOfLogging extends UnitTestCase {
+
+ function testCreatingNewFile() {
+ @unlink('/temp/test.log');
+ $log = new Log('/temp/test.log');
+ $this-&gt;assertFalse(file_exists('/temp/test.log'));
+ $log-&gt;message('Should write this to a file');
+ $this-&gt;assertTrue(file_exists('/temp/test.log'));<strong>
+ }
+}
+?&gt;</strong>
+</pre>
+ Ensuite nous cr&eacute;ons un nouveau fichier appel&eacute; <em>tests/all_tests.php</em>. On y ins&egrave;re le code suivant...
+<pre>
+<strong>&lt;?php
+require_once('simpletest/unit_tester.php');
+require_once('simpletest/reporter.php');
+
+$test = &amp;new GroupTest('All tests');
+$test-&gt;addTestFile('log_test.php');
+$test-&gt;run(new HtmlReporter());
+?&gt;</strong>
+</pre>
+ Cette m&eacute;thode <span class="new_code">GroupTest::addTestFile()</span> va inclure le fichier de sc&eacute;narios de test et lire parmi toutes les nouvelles classes cr&eacute;&eacute;es celles qui sont issues de <span class="new_code">TestCase</span>. Dans un premier temps, seuls les noms sont stock&eacute;s, de la sorte le lanceur de test peut instancier la classe au fur et &agrave; mesure qu'il ex&eacute;cute votre suite de tests.
+ </p>
+ <p>
+ Pour que &ccedil;a puisse marcher proprement le fichier de suite de tests ne devrait pas inclure aveuglement d'autres extensions de sc&eacute;narios de test qui n'ex&eacute;cuteraient pas effectivement de test. Le r&eacute;sultat pourrait &ecirc;tre que des tests suppl&eacute;mentaires soient alors comptabilis&eacute;s pendant l'ex&eacute;cution des tests. Ce n'est pas un probl&egrave;me grave mais pour &eacute;viter ce d&eacute;sagr&eacute;ment, il suffit d'ajouter la commande <span class="new_code">SimpleTestOptions::ignore()</span> quelque part dans le fichier de sc&eacute;nario de test. Par ailleurs le sc&eacute;nario de test ne devrait pas avoir &eacute;t&eacute; inclus ailleurs ou alors aucun sc&eacute;nario ne sera ajout&eacute; aux groupes de test. Il s'agirait l&agrave; d'une erreur autrement s&eacute;rieuse : si toutes les classes de sc&eacute;nario de test sont charg&eacute;es par PHP, alors la m&eacute;thode <span class="new_code">GroupTest::addTestFile()</span> ne pourra pas les d&eacute;tecter.
+ </p>
+ <p>
+ Pour afficher les r&eacute;sultats, il est seulement n&eacute;cessaire d'invoquer <em>tests/all_tests.php</em> &agrave; partir du serveur web.
+ </p>
+
+ <p>
+<a class="target" name="mock">
+<h2>Utiliser les objets fantaisie</h2>
+</a>
+</p>
+ <p>
+ Avan&ccedil;ons un peu plus dans le futur.
+ </p>
+ <p>
+ Supposons que notre class logging soit test&eacute;e et termin&eacute;e. Supposons aussi que nous testons une autre classe qui ait besoin d'&eacute;crire des messages de log, disons <span class="new_code">SessionPool</span>. Nous voulons tester une m&eacute;thode qui ressemblera probablement &agrave; quelque chose comme...
+<pre>
+<strong>
+class SessionPool {
+ ...
+ function logIn($username) {
+ ...
+ $this-&gt;_log-&gt;message('User $username logged in.');
+ ...
+ }
+ ...
+}
+</strong>
+</pre>
+ Avec le concept de "r&eacute;utilisation de code" comme fil conducteur, nous utilisons notre class <span class="new_code">Log</span>. Un sc&eacute;nario de test classique ressemblera peut-&ecirc;tre &agrave;...
+<pre>
+<strong>
+&lt;?php
+require_once('../classes/log.php');
+require_once('../classes/session_pool.php');
+
+class TestOfSessionLogging extends UnitTestCase {
+
+ function setUp() {
+ @unlink('/temp/test.log');
+ }
+
+ function tearDown() {
+ @unlink('/temp/test.log');
+ }
+
+ function testLogInIsLogged() {
+ $log = new Log('/temp/test.log');
+ $session_pool = &amp;new SessionPool($log);
+ $session_pool-&gt;logIn('fred');
+ $messages = file('/temp/test.log');
+ $this-&gt;assertEqual($messages[0], "User fred logged in.\n");
+ }
+}
+?&gt;</strong>
+</pre>
+ Le design de ce sc&eacute;nario de test n'est pas compl&egrave;tement mauvais, mais on peut l'am&eacute;liorer. Nous passons du temps &agrave; tripoter les fichiers de log qui ne font pas partie de notre test. Pire, nous avons cr&eacute;&eacute; des liens de proximit&eacute; entre la classe <span class="new_code">Log</span> et ce test. Que se passerait-il si nous n'utilisions plus de fichiers, mais la biblioth&egrave;que <em>syslog</em> &agrave; la place ? Avez-vous remarqu&eacute; le retour chariot suppl&eacute;mentaire &agrave; la fin du message ? A-t-il &eacute;t&eacute; ajout&eacute; par le loggueur ? Et si il ajoutait aussi un timestamp ou d'autres donn&eacute;es ?
+ </p>
+ <p>
+ L'unique partie &agrave; tester r&eacute;ellement est l'envoi d'un message pr&eacute;cis au loggueur. Nous r&eacute;duisons le couplage en cr&eacute;ant une fausse classe de logging : elle ne fait qu'enregistrer le message pour le test, mais ne produit aucun r&eacute;sultat. Sauf qu'elle doit ressembler exactement &agrave; l'original.
+ </p>
+ <p>
+ Si l'objet fantaisie n'&eacute;crit pas dans un fichier alors nous nous &eacute;pargnons la suppression du fichier avant et apr&egrave;s le test. Nous pourrions m&ecirc;me nous &eacute;pargner quelques lignes de code suppl&eacute;mentaires si l'objet fantaisie pouvait ex&eacute;cuter l'assertion.
+ <p>
+ </p>
+ Trop beau pour &ecirc;tre vrai ? Par chance on peut cr&eacute;er un tel objet tr&egrave;s facilement...
+<pre>
+&lt;?php
+require_once('../classes/log.php');
+require_once('../classes/session_pool.php');<strong>
+Mock::generate('Log');</strong>
+
+class TestOfSessionLogging extends UnitTestCase {
+
+ function testLogInIsLogged() {<strong>
+ $log = &amp;new MockLog($this);
+ $log-&gt;expectOnce('message', array('User fred logged in.'));</strong>
+ $session_pool = &amp;new SessionPool($log);
+ $session_pool-&gt;logIn('fred');<strong>
+ $log-&gt;tally();</strong>
+ }
+}
+?&gt;
+</pre>
+ L'appel <span class="new_code">tally()</span> est n&eacute;cessaire pour annoncer &agrave; l'objet fantaisie qu'il n'y aura plus d'appels ult&eacute;rieurs. Sans &ccedil;a l'objet fantaisie pourrait attendre pendant une &eacute;ternit&eacute; l'appel de la m&eacute;thode sans jamais pr&eacute;venir le sc&eacute;nario de test. Les autres tests sont d&eacute;clench&eacute;s automatiquement quand l'appel &agrave; <span class="new_code">message()</span> est invoqu&eacute; sur l'objet <span class="new_code">MockLog</span>. L'appel <span class="new_code">mock</span> va d&eacute;clencher une comparaison des param&egrave;tres et ensuite envoyer le message "pass" ou "fail" au test pour l'affichage. Des jokers peuvent &ecirc;tre inclus ici aussi afin d'emp&ecirc;cher que les tests ne deviennent trop sp&eacute;cifiques.
+ </p>
+ <p>
+ Les objets fantaisie dans la suite SimpleTest peuvent avoir un ensemble de valeurs de sortie arbitraires, des s&eacute;quences de sorties, des valeurs de sortie s&eacute;lectionn&eacute;es &agrave; partir des arguments d'entr&eacute;e, des s&eacute;quences de param&egrave;tres attendus et des limites sur le nombre de fois qu'une m&eacute;thode peut &ecirc;tre invoqu&eacute;e.
+ </p>
+ <p>
+ Pour que ce test fonctionne la librairie avec les objets fantaisie doit &ecirc;tre incluse dans la suite de tests, par exemple dans <em>all_tests.php</em>.
+ </p>
+
+ <p>
+<a class="target" name="web">
+<h2>Tester une page web</h2>
+</a>
+</p>
+ <p>
+ Une des exigences des sites web, c'est qu'ils produisent des pages web. Si vous construisez un projet de A &agrave; Z et que vous voulez int&eacute;grer des tests au fur et &agrave; mesure alors vous voulez un outil qui puisse effectuer une navigation automatique et en examiner le r&eacute;sultat. C'est le boulot d'un testeur web.
+ </p>
+ <p>
+ Effectuer un test web via SimpleTest reste assez primitif : il n'y a pas de javascript par exemple. Pour vous donner une id&eacute;e, voici un exemple assez trivial : aller chercher une page web, &agrave; partir de l&agrave; naviguer vers la page "about" et finalement tester un contenu d&eacute;termin&eacute; par le client.
+<pre>
+&lt;?php<strong>
+require_once('simpletest/web_tester.php');</strong>
+require_once('simpletest/reporter.php');
+<strong>
+class TestOfAbout extends WebTestCase {
+
+ function setUp() {
+ $this-&gt;get('http://test-server/index.php');
+ $this-&gt;clickLink('About');
+ }
+
+ function testSearchEngineOptimisations() {
+ $this-&gt;assertTitle('A long title about us for search engines');
+ $this-&gt;assertWantedPattern('/a popular keyphrase/i');
+ }
+}</strong>
+$test = &amp;new TestOfAbout();
+$test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ Avec ce code comme test de recette, vous pouvez vous assurer que le contenu corresponde toujours aux sp&eacute;cifications &agrave; la fois des d&eacute;veloppeurs et des autres parties prenantes au projet.
+ </p>
+ <p>
+ <a href="http://sourceforge.net/projects/simpletest/"><img src="http://sourceforge.net/sflogo.php?group_id=76550&amp;type=5" width="210" height="62" border="0" alt="SourceForge.net Logo"></a>
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ <a href="https://sourceforge.net/project/showfiles.php?group_id=76550&amp;release_id=153280">T&eacute;l&eacute;charger PHP Simple Test</a>
+ depuis <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ L'<a href="http://simpletest.sourceforge.net/">API de SimpleTest pour d&eacute;veloppeur</a>
+ donne tous les d&eacute;tails sur les classes et assertions existantes.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/fr/mock_objects_documentation.html b/tests/simpletest/docs/fr/mock_objects_documentation.html
new file mode 100755
index 0000000000..96986fda5b
--- /dev/null
+++ b/tests/simpletest/docs/fr/mock_objects_documentation.html
@@ -0,0 +1,534 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Documentation SimpleTest : les objets fantaise</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Documentation sur les objets fantaisie</h1>
+ This page...
+ <ul>
+<li>
+ <a href="#quoi">Que sont les objets fantaisie ?</a>
+ </li>
+<li>
+ <a href="#creation">Cr&eacute;er des objets fantaisie</a>.
+ </li>
+<li>
+ <a href="#bouchon">L'objet fantaisie - acteur</a> ou bouchon.
+ </li>
+<li>
+ <a href="#attentes">L'objet fantaisie - critique</a> avec des attentes.
+ </li>
+<li>
+ <a href="#approches">D'autres approches</a> y compris des librairies d'objets fantaisie.
+ </li>
+<li>
+ Utiliser les objets fantaisie avec <a href="#autres_testeurs">d'autres testeurs unitaires</a>.
+ </li>
+</ul>
+<div class="content">
+ <p>
+<a class="target" name="quoi">
+<h2>Que sont les objets fantaisie ?</h2>
+</a>
+</p>
+ <p>
+ Les objets fantaisie - ou "mock objects" en anglais - ont deux r&ocirc;les pendant un sc&eacute;nario de test : acteur et critique.
+ </p>
+ <p>
+ Le comportement d'acteur est celui de simuler des objets difficiles &agrave; initialiser ou trop consommateurs en temps pendant un test. Le cas classique est celui de la connexion &agrave; une base de donn&eacute;es. Mettre sur pied une base de donn&eacute;es de test au lancement de chaque test ralentirait consid&eacute;rablement les tests et en plus exigerait l'installation d'un moteur de base de donn&eacute;es ainsi que des donn&eacute;es sur la machine de test. Si nous pouvons simuler la connexion et renvoyer des donn&eacute;es &agrave; notre guise alors non seulement nous gagnons en pragmatisme sur les tests mais en sus nous pouvons nourrir notre base avec des donn&eacute;es falsifi&eacute;es et voir comment il r&eacute;pond. Nous pouvons simuler une base de donn&eacute;es en suspens ou d'autres cas extr&ecirc;mes sans avoir &agrave; cr&eacute;er une v&eacute;ritable panne de base de donn&eacute;es. En d'autres termes nous pouvons gagner en contr&ocirc;le sur l'environnement de test.
+ </p>
+ <p>
+ Si les objets fantaisie ne se comportaient que comme des acteurs alors on les conna&icirc;trait sous le nom de <a href="server_stubs_documentation.html">bouchons serveur</a>.
+ </p>
+ <p>
+ Cependant non seulement les objets fantaisie jouent un r&ocirc;le (en fournissant &agrave; la demande les valeurs requises) mais en plus ils sont aussi sensibles aux messages qui leur sont envoy&eacute;s (par le biais d'attentes). En posant les param&egrave;tres attendus d'une m&eacute;thode ils agissent comme des gardiens : un appel sur eux doit &ecirc;tre r&eacute;alis&eacute; correctement. Si les attentes ne sont pas atteintes ils nous &eacute;pargnent l'effort de l'&eacute;criture d'une assertion de test avec &eacute;chec en r&eacute;alisant cette t&acirc;che &agrave; notre place. Dans le cas d'une connexion &agrave; une base de donn&eacute;es imaginaire ils peuvent tester si la requ&ecirc;te, disons SQL, a bien &eacute;t&eacute; form&eacute; par l'objet qui utilise cette connexion. Mettez-les sur pied avec des attentes assez pr&eacute;cises et vous verrez que vous n'aurez presque plus d'assertion &agrave; &eacute;crire manuellement.
+ </p>
+
+ <p>
+<a class="target" name="creation">
+<h2>Cr&eacute;er des objets fantaisie</h2>
+</a>
+</p>
+ <p>
+ Comme pour la cr&eacute;ation des bouchons serveur, tout ce dont nous avons besoin c'est d'un classe existante. La fameuse connexion &agrave; une base de donn&eacute;es qui ressemblerait &agrave;...
+<pre>
+<strong>class DatabaseConnection {
+ function DatabaseConnection() {
+ }
+
+ function query() {
+ }
+
+ function selectQuery() {
+ }
+}</strong>
+</pre>
+ Cette classe n'a pas encore besoin d'&ecirc;tre impl&eacute;ment&eacute;e. Pour en cr&eacute;er sa version fantaisie nous devons juste inclure la librairie d'objet fantaisie puis lancer le g&eacute;n&eacute;rateur...
+<pre>
+<strong>require_once('simpletest/unit_tester.php');
+require_once('simpletest/mock_objects.php');
+require_once('database_connection.php');
+
+Mock::generate('DatabaseConnection');</strong>
+</pre>
+ Ceci g&eacute;n&egrave;re une classe clone appel&eacute;e <span class="new_code">MockDatabaseConnection</span>. Nous pouvons d&eacute;sormais cr&eacute;er des instances de cette nouvelle classe &agrave; l'int&eacute;rieur m&ecirc;me de notre sc&eacute;nario de test...
+<pre>
+require_once('simpletest/unit_tester.php');
+require_once('simpletest/mock_objects.php');
+require_once('database_connection.php');
+
+Mock::generate('DatabaseConnection');
+<strong>
+class MyTestCase extends UnitTestCase {
+
+ function testSomething() {
+ $connection = &amp;new MockDatabaseConnection($this);
+ }
+}</strong>
+</pre>
+ Contrairement aux bouchons, le constructeur d'une classe fantaisie a besoin d'une r&eacute;f&eacute;rence au sc&eacute;nario de test pour pouvoir transmettre les succ&egrave;s et les &eacute;checs pendant qu'il v&eacute;rifie les attentes. Concr&egrave;tement &ccedil;a veut dire que les objets fantaisie ne peuvent &ecirc;tre utilis&eacute;s qu'au sein d'un sc&eacute;nario de test. Malgr&eacute; tout, cette puissance suppl&eacute;mentaire implique que les bouchons ne sont que rarement utilis&eacute;s si des objets fantaisie sont disponibles.
+ </p>
+ <p>
+ <a class="target" name="bouchon">
+<h2>Objets fantaisie en action</h2>
+</a>
+ </p>
+ <p>
+ La version fantaisie d'une classe contient toutes les m&eacute;thodes de l'originale. De la sorte une op&eacute;ration comme <span class="new_code">$connection-&gt;query()</span> est encore possible. Tout comme avec les bouchons, nous pouvons remplacer la valeur nulle renvoy&eacute;e par d&eacute;faut...
+<pre>
+<strong>$connection-&gt;setReturnValue('query', 37);</strong>
+</pre>
+ D&eacute;sormais &agrave; chaque appel de <span class="new_code">$connection-&gt;query()</span> nous recevons comme r&eacute;sultat 37. Tout comme avec les bouchons nous pouvons utiliser des jokers et surcharger le param&egrave;tre joker. Nous pouvons aussi ajouter des m&eacute;thodes suppl&eacute;mentaires &agrave; l'objet fantaisie lors de sa g&eacute;n&eacute;ration et lui choisir un nom de classe qui lui soit propre...
+<pre>
+<strong>Mock::generate('DatabaseConnection', 'MyMockDatabaseConnection', array('setOptions'));</strong>
+</pre>
+ Ici l'objet fantaisie se comportera comme si <span class="new_code">setOptions()</span> existait dans la classe originale. C'est pratique si une classe a utilis&eacute; le m&eacute;canisme <span class="new_code">overload()</span> de PHP pour ajouter des m&eacute;thodes dynamiques. Vous pouvez cr&eacute;er des fantaisies sp&eacute;ciales pour simuler cette situation.
+ </p>
+ <p>
+ Tous les mod&egrave;les disponibles avec les bouchons serveur le sont &eacute;galement avec les objets fantaisie...
+<pre>
+class Iterator {
+ function Iterator() {
+ }
+
+ function next() {
+ }
+}
+</pre>
+ Une nouvelle fois, supposons que cet it&eacute;rateur ne retourne que du texte jusqu'au moment o&ugrave; il atteint son terme, quand il renvoie <span class="new_code">false</span>. Nous pouvons le simuler avec...
+<pre>
+Mock::generate('Iterator');
+
+class IteratorTest extends UnitTestCase() {
+
+ function testASequence() {<strong>
+ $iterator = &amp;new MockIterator($this);
+ $iterator-&gt;setReturnValue('next', false);
+ $iterator-&gt;setReturnValueAt(0, 'next', 'First string');
+ $iterator-&gt;setReturnValueAt(1, 'next', 'Second string');</strong>
+ ...
+ }
+}
+</pre>
+ Au moment du premier appel &agrave; <span class="new_code">next()</span> sur l'it&eacute;rateur fantaisie il renverra tout d'abord "First string", puis ce sera au tour de "Second string" au deuxi&egrave;me appel et ensuite pour tout appel suivant <span class="new_code">false</span> sera renvoy&eacute;. Ces valeurs renvoy&eacute;es successivement sont prioritaires sur la valeur constante retourn&eacute;e. Cette derni&egrave;re est un genre de valeur par d&eacute;faut si vous voulez.
+ </p>
+ <p>
+ Reprenons aussi le conteneur d'information bouchonn&eacute; avec des pairs clef / valeur...
+<pre>
+class Configuration {
+ function Configuration() {
+ }
+
+ function getValue($key) {
+ }
+}
+</pre>
+ Il s'agit l&agrave; d'une situation classique d'utilisation d'objets fantaisie &eacute;tant donn&eacute; que la configuration peut varier grandement de machine &agrave; machine : &ccedil;a contraint fortement la fiabilit&eacute; de nos tests si nous l'utilisons directement. Le probl&egrave;me est que toutes les donn&eacute;es nous parviennent &agrave; travers la m&eacute;thode <span class="new_code">getValue()</span> et que nous voulons des r&eacute;sultats diff&eacute;rents pour des clefs diff&eacute;rentes. Heureusement les objets fantaisie ont un syst&egrave;me de filtrage...
+<pre>
+<strong>$config = &amp;new MockConfiguration($this);
+$config-&gt;setReturnValue('getValue', 'primary', array('db_host'));
+$config-&gt;setReturnValue('getValue', 'admin', array('db_user'));
+$config-&gt;setReturnValue('getValue', 'secret', array('db_password'));</strong>
+</pre>
+ Le param&egrave;tre en plus est une liste d'arguments &agrave; faire correspondre. Dans ce cas nous essayons de faire correspondre un unique argument : en l'occurrence la clef recherch&eacute;e. Maintenant que la m&eacute;thode <span class="new_code">getValue()</span> est invoqu&eacute;e sur l'objet fantaisie...
+<pre>
+$config-&gt;getValue('db_user')
+</pre>
+ ...elle renverra "admin". Elle le trouve en essayant de faire correspondre les arguments entrants dans sa liste d'arguments sortants les uns apr&egrave;s les autres jusqu'au moment o&ugrave; une correspondance exacte est atteinte.
+ </p>
+ <p>
+ Il y a des fois o&ugrave; vous souhaitez qu'un objet sp&eacute;cifique soit servi par la fantaisie plut&ocirc;t qu'une copie. De nouveau c'est identique au m&eacute;canisme des bouchons serveur...
+<pre>
+class Thing {
+}
+
+class Vector {
+ function Vector() {
+ }
+
+ function get($index) {
+ }
+}
+</pre>
+ Dans ce cas vous pouvez placer une r&eacute;f&eacute;rence dans la liste renvoy&eacute;e par l'objet fantaisie...
+<pre>
+$thing = new Thing();<strong>
+$vector = &amp;new MockVector($this);
+$vector-&gt;setReturnReference('get', $thing, array(12));</strong>
+</pre>
+ Avec cet arrangement vous savez qu'&agrave; chaque appel de <span class="new_code">$vector-&gt;get(12)</span> le m&ecirc;me <span class="new_code">$thing</span> sera renvoy&eacute;.
+ </p>
+
+ <p>
+<a class="target" name="attentes">
+<h2>Objets fantaisie en critique</h2>
+</a>
+</p>
+ <p>
+ M&ecirc;me si les bouchons serveur vous isolent du d&eacute;sordre du monde r&eacute;el, il ne s'agit l&agrave; que de la moiti&eacute; du b&eacute;n&eacute;fice potentiel. Vous pouvez avoir une classe de test recevant les messages ad hoc, mais est-ce que votre nouvelle classe renvoie bien les bons ? Le tester peut devenir cafouillis sans une librairie d'objets fantaisie.
+ </p>
+ <p>
+ Pour l'exemple, prenons une classe <span class="new_code">SessionPool</span> &agrave; laquelle nous allons ajouter une fonction de log. Plut&ocirc;t que de complexifier la classe originale, nous souhaitons ajouter ce comportement avec un d&eacute;corateur (GOF). Pour l'instant le code de <span class="new_code">SessionPool</span> ressemble &agrave;...
+<pre>
+<strong>class SessionPool {
+ function SessionPool() {
+ ...
+ }
+
+ function &amp;findSession($cookie) {
+ ...
+ }
+ ...
+}
+
+class Session {
+ ...
+}</strong>
+
+</pre>
+ Alors que pour notre code de log, nous avons...
+<pre>
+<strong>
+class Log {
+ function Log() {
+ ...
+ }
+
+ function message() {
+ ...
+ }
+}
+
+class LoggingSessionPool {
+ function LoggingSessionPool(&amp;$session_pool, &amp;$log) {
+ ...
+ }
+
+ function &amp;findSession(\$cookie) {
+ ...
+ }
+ ...
+}</strong>
+</pre>
+ Dans tout ceci, la seule classe &agrave; tester est <span class="new_code">LoggingSessionPool</span>. En particulier, nous voulons v&eacute;rifier que la m&eacute;thode <span class="new_code">findSession()</span> est appel&eacute;e avec le bon identifiant de session au sein du cookie et qu'elle renvoie bien le message "Starting session $cookie" au loggueur.
+ </p>
+ <p>
+ Bien que nous ne testions que quelques lignes de code de production, voici la liste des choses &agrave; faire dans un sc&eacute;nario de test conventionnel :
+ <ol>
+ <li>Cr&eacute;er un objet de log.</li>
+ <li>Indiquer le r&eacute;pertoire d'&eacute;criture du fichier de log.</li>
+ <li>Modifier les droits sur le r&eacute;pertoire pour pouvoir y &eacute;crire le fichier.</li>
+ <li>Cr&eacute;er un objet <span class="new_code">SessionPool</span>.</li>
+ <li>Lancer une session, ce qui demande probablement pas mal de choses.</li>
+ <li>Invoquer <span class="new_code">findSession()</span>.</li>
+ <li>Lire le nouvel identifiant de session (en esp&eacute;rant qu'il existe un accesseur !).</li>
+ <li>Lever une assertion de test pour v&eacute;rifier que cet identifiant correspond bien au cookie.</li>
+ <li>Lire la derni&egrave;re ligne du fichier de log.</li>
+ <li>Supprimer avec une (ou plusieurs) expression rationnelle les timestamps de log en trop, etc.</li>
+ <li>V&eacute;rifier que le message de session est bien dans le texte.</li>
+ </ol>
+ Pas &eacute;tonnant que les d&eacute;veloppeurs d&eacute;testent &eacute;crire des tests quand ils sont aussi ingrats. Pour rendre les choses encore pire, &agrave; chaque fois que le format de log change ou bien que la m&eacute;thode de cr&eacute;ation des sessions change, nous devons r&eacute;&eacute;crire une partie des tests alors m&ecirc;me qu'ils ne testent pas ces parties du syst&egrave;me. Nous sommes en train de pr&eacute;parer le cauchemar pour les d&eacute;veloppeurs de ces autres classes.
+ </p>
+ <p>
+ A la place, voici la m&eacute;thode compl&egrave;te pour le test avec un peu de magie via les objets fantaisie...
+<pre>
+Mock::generate('Session');
+Mock::generate('SessionPool');
+Mock::generate('Log');
+
+class LoggingSessionPoolTest extends UnitTestCase {
+ ...
+ function testFindSessionLogging() {<strong>
+ $session = &amp;new MockSession($this);
+ $pool = &amp;new MockSessionPool($this);
+ $pool-&gt;setReturnReference('findSession', $session);
+ $pool-&gt;expectOnce('findSession', array('abc'));
+
+ $log = &amp;new MockLog($this);
+ $log-&gt;expectOnce('message', array('Starting session abc'));
+
+ $logging_pool = &amp;new LoggingSessionPool($pool, $log);
+ $this-&gt;assertReference($logging_pool-&gt;findSession('abc'), $session);
+ $pool-&gt;tally();
+ $log-&gt;tally();</strong>
+ }
+}
+</pre>
+ Commen&ccedil;ons par &eacute;crire une session simulacre. Pas la peine d'&ecirc;tre trop pointilleux avec celle-ci puisque la v&eacute;rification de la session d&eacute;sir&eacute;e est effectu&eacute;e ailleurs. Nous avons juste besoin de v&eacute;rifier qu'il s'agit de la m&ecirc;me que celle qui vient du groupe commun des sessions.
+ </p>
+ <p>
+ <span class="new_code">findSession()</span> est un m&eacute;thode fabrique dont la simulation est d&eacute;crite <a href="#stub">plus haut</a>. Le point de d&eacute;part vient avec le premier appel <span class="new_code">expectOnce()</span>. Cette ligne indique qu'&agrave; chaque fois que <span class="new_code">findSession()</span> est invoqu&eacute; sur l'objet fantaisie, il v&eacute;rifiera les arguments entrant. S'il ne re&ccedil;oit que la cha&icirc;ne "abc" en tant qu'argument alors un succ&egrave;s est envoy&eacute; au testeur unitaire, sinon c'est un &eacute;chec qui est g&eacute;n&eacute;r&eacute;. Il s'agit l&agrave; de la partie qui teste si nous avons bien la bonne session. La liste des arguments suit une format identique &agrave; celui qui pr&eacute;cise les valeurs renvoy&eacute;es. Vous pouvez avoir des jokers et des s&eacute;quences et l'ordre de l'&eacute;valuation restera le m&ecirc;me.
+ </p>
+ <p>
+ Si l'appel n'est jamais effectu&eacute; alors n'est g&eacute;n&eacute;r&eacute; ni le succ&egrave;s, ni l'&eacute;chec. Pour contourner cette limitation, nous devons dire &agrave; l'objet fantaisie que le test est termin&eacute; : il pourra alors d&eacute;cider si les attentes ont &eacute;t&eacute; r&eacute;pondues. L'assertion du testeur unitaire de ceci est d&eacute;clench&eacute;e par l'appel <span class="new_code">tally()</span> &agrave; la fin du test.
+ </p>
+ <p>
+ Nous utilisons le m&ecirc;me mod&egrave;le pour mettre sur pied le loggueur fantaisie. Nous lui indiquons que <span class="new_code">message()</span> devrait &ecirc;tre invoqu&eacute; une fois et une fois seulement avec l'argument "Starting session abc". En testant les arguments d'appel, plut&ocirc;t que ceux de sortie du loggueur, nous isolons le test de tout modification dans le loggueur.
+ </p>
+ <p>
+ Nous commen&ccedil;ons le lancement nos tests &agrave; la cr&eacute;ation du nouveau <span class="new_code">LoggingSessionPool</span> et nous l'alimentons avec nos objets fantaisie juste cr&eacute;&eacute;s. D&eacute;sormais tout est sous contr&ocirc;le. Au final nous confirmons que le <span class="new_code">$session</span> donn&eacute; au d&eacute;corateur est bien celui re&ccedil;u et prions les objets fantaisie de lancer leurs tests de comptage d'appel interne avec les appels <span class="new_code">tally()</span>.
+ </p>
+ <p>
+ Il y a encore pas mal de code de test, mais ce code est tr&egrave;s strict. S'il vous semble encore terrifiant il l'est bien moins que si nous avions essay&eacute; sans les objets fantaisie et ce test en particulier, interactions plut&ocirc;t que r&eacute;sultat, est toujours plus difficile &agrave; mettre en place. Le plus souvent vous aurez besoin de tester des situations plus complexes sans ce niveau ni cette pr&eacute;cision. En outre une partie peut &ecirc;tre remani&eacute;e avec la m&eacute;thode de sc&eacute;nario de test <span class="new_code">setUp()</span>.
+ </p>
+ <p>
+ Voici la liste compl&egrave;te des attentes que vous pouvez placer sur un objet fantaisie avec <a href="http://www.lastcraft.com/simple_test.php">SimpleTest</a>...
+ <table>
+<thead>
+ <tr>
+<th>Attente</th><th>N&eacute;cessite <span class="new_code">tally()</span></th>
+</tr>
+ </thead>
+<tbody>
+<tr>
+ <td><span class="new_code">expectArguments($method, $args)</span></td>
+ <td style="text-align: center">Non</td>
+ </tr>
+ <tr>
+ <td><span class="new_code">expectArgumentsAt($timing, $method, $args)</span></td>
+ <td style="text-align: center">Non</td>
+ </tr>
+ <tr>
+ <td><span class="new_code">expectCallCount($method, $count)</span></td>
+ <td style="text-align: center">Oui</td>
+ </tr>
+ <tr>
+ <td><span class="new_code">expectMaximumCallCount($method, $count)</span></td>
+ <td style="text-align: center">Non</td>
+ </tr>
+ <tr>
+ <td><span class="new_code">expectMinimumCallCount($method, $count)</span></td>
+ <td style="text-align: center">Oui</td>
+ </tr>
+ <tr>
+ <td><span class="new_code">expectNever($method)</span></td>
+ <td style="text-align: center">Non</td>
+ </tr>
+ <tr>
+ <td><span class="new_code">expectOnce($method, $args)</span></td>
+ <td style="text-align: center">Oui</td>
+ </tr>
+ <tr>
+ <td><span class="new_code">expectAtLeastOnce($method, $args)</span></td>
+ <td style="text-align: center">Oui</td>
+ </tr>
+ </tbody>
+</table>
+ O&ugrave; les param&egrave;tres sont...
+ <dl>
+ <dt class="new_code">$method</dt>
+ <dd>Le nom de la m&eacute;thode, sous la forme d'une cha&icirc;ne, &agrave; laquelle la condition doit &ecirc;tre appliqu&eacute;e.</dd>
+ <dt class="new_code">$args</dt>
+ <dd>
+ Les arguments sous la forme d'une liste. Les jokers peuvent &ecirc;tre inclus de la m&ecirc;me mani&egrave;re qu'avec <span class="new_code">setReturn()</span>. Cet argument est optionnel pour <span class="new_code">expectOnce()</span> et <span class="new_code">expectAtLeastOnce()</span>.
+ </dd>
+ <dt class="new_code">$timing</dt>
+ <dd>
+ Le seul point dans le temps pour tester la condition. Le premier appel commence &agrave; z&eacute;ro.
+ </dd>
+ <dt class="new_code">$count</dt>
+ <dd>Le nombre d'appels attendu.</dd>
+ </dl>
+ La m&eacute;thode <span class="new_code">expectMaximumCallCount()</span> est l&eacute;g&egrave;rement diff&eacute;rente dans le sens o&ugrave; elle ne pourra g&eacute;n&eacute;rer qu'un &eacute;chec. Elle reste silencieuse si la limite n'est jamais atteinte.
+ </p>
+ <p>
+ Comme avec les assertions dans les sc&eacute;narios de test, toutes ces attentes peuvent accepter une surcharge de message sous la forme d'un param&egrave;tre suppl&eacute;mentaire. Par ailleurs le message d'&eacute;chec original peut &ecirc;tre inclus dans le r&eacute;sultat avec "%s".
+ </p>
+
+ <p>
+<a class="target" name="approches">
+<h2>D'autres approches</h2>
+</a>
+</p>
+ <p>
+ Il existe trois approches pour cr&eacute;er des objets fantaisie en comprenant celle utilis&eacute;e par SimpleTest. Les coder &agrave; la main en utilisant une classe de base, les g&eacute;n&eacute;rer dans un fichier ou les g&eacute;n&eacute;rer dynamiquement &agrave; la vol&eacute;e.
+ </p>
+ <p>
+ Les objets fantaisie g&eacute;n&eacute;r&eacute;s avec <a href="simple_test.html">SimpleTest</a> sont dynamiques. Ils sont cr&eacute;&eacute;s &agrave; l'ex&eacute;cution dans la m&eacute;moire, gr&acirc;ce &agrave; <span class="new_code">eval()</span>, plut&ocirc;t qu'&eacute;crits dans un fichier. Cette op&eacute;ration les rend facile &agrave; cr&eacute;er, en une seule ligne, surtout par rapport &agrave; leur cr&eacute;ation &agrave; la main dans une hi&eacute;rarchie de classe parall&egrave;le. Le probl&egrave;me avec ce comportement tient g&eacute;n&eacute;ralement dans la mise en place des tests proprement dits. Si les objets originaux changent les versions fantaisie sur lesquels reposent les tests, une d&eacute;synchronisation peut subvenir. Cela peut aussi arriver avec l'approche en hi&eacute;rarchie parall&egrave;le, mais c'est d&eacute;tect&eacute; beaucoup plus vite.
+ </p>
+ <p>
+ Bien s&ucirc;r, la solution est d'ajouter de v&eacute;ritables tests d'int&eacute;gration. Vous n'en avez pas besoin de beaucoup et le c&ocirc;t&eacute; pratique des objets fantaisie fait plus que compenser la petite dose de test suppl&eacute;mentaire. Vous ne pouvez pas avoir confiance dans du code qui ne serait test&eacute; que par des objets fantaisie.
+ </p>
+ <p>
+ Si vous restez d&eacute;termin&eacute; de construire des librairies statiques d'objets fantaisie parce que vous souhaitez &eacute;muler un comportement tr&egrave;s sp&eacute;cifique, vous pouvez y parvenir gr&acirc;ce au g&eacute;n&eacute;rateur de classe de SimpleTest. Dans votre fichier librairie, par exemple <em>mocks/connection.php</em> pour une connexion &agrave; une base de donn&eacute;es, cr&eacute;er un objet fantaisie et provoquer l'h&eacute;ritage pour h&eacute;riter pour surcharger des m&eacute;thodes sp&eacute;ciales ou ajouter des pr&eacute;r&eacute;glages...
+<pre>
+&lt;?php
+ require_once('simpletest/mock_objects.php');
+ require_once('../classes/connection.php');
+<strong>
+ Mock::generate('Connection', 'BasicMockConnection');
+ class MockConnection extends BasicMockConnection {
+ function MockConnection(&amp;$test, $wildcard = '*') {
+ $this-&gt;BasicMockConnection($test, $wildcard);
+ $this-&gt;setReturn('query', false);
+ }
+ }</strong>
+?&gt;
+</pre>
+ L'appel <span class="new_code">generate</span> dit au g&eacute;n&eacute;rateur de classe d'en cr&eacute;er une appel&eacute;e <span class="new_code">BasicMockConnection</span> plut&ocirc;t que la plus courante <span class="new_code">MockConnection</span>. Ensuite nous h&eacute;ritons &agrave; partir de celle-ci pour obtenir notre version de <span class="new_code">MockConnection</span>. En interceptant de cette mani&egrave;re nous pouvons ajouter un comportement, ici transformer la valeur par d&eacute;faut de <span class="new_code">query()</span> en "false".
+ En utilisant le nom par d&eacute;faut nous garantissons que le g&eacute;n&eacute;rateur de classe fantaisie n'en recr&eacute;era pas une autre diff&eacute;rente si il est invoqu&eacute; ailleurs dans les tests. Il ne cr&eacute;era jamais de classe si elle existe d&eacute;j&agrave;. Aussi longtemps que le fichier ci-dessus est inclus avant alors tous les tests qui g&eacute;n&eacute;raient <span class="new_code">MockConnection</span> devraient utiliser notre version &agrave; pr&eacute;sent. Par contre si nous avons une erreur dans l'ordre et que la librairie de fantaisie en cr&eacute;e une d'abord alors la cr&eacute;ation de la classe &eacute;chouera tout simplement.
+ </p>
+ <p>
+ Utiliser cette astuce si vous vous trouvez avec beaucoup de comportement en commun sur les objets fantaisie ou si vous avez de fr&eacute;quents probl&egrave;mes d'int&eacute;gration plus tard dans les &eacute;tapes de test.
+ </p>
+
+ <p>
+<a class="target" name="autres_testeurs">
+<h2>Je pense que SimpleTest pue !</h2>
+</a>
+</p>
+ <p>
+ Mais au moment d'&eacute;crire ces lignes c'est le seul &agrave; g&eacute;rer les objets fantaisie, donc vous &ecirc;tes bloqu&eacute; avec lui ?
+ </p>
+ <p>
+ Non, pas du tout.
+ <a href="simple_test.html">SimpleTest</a> est une bo&icirc;te &agrave; outils et parmi ceux-ci on trouve les objets fantaisie qui peuvent &ecirc;tre utilis&eacute;s ind&eacute;pendamment. Supposons que vous avez votre propre testeur unitaire favori et que tous vos tests actuels l'utilisent. Pr&eacute;tendez que vous avez appel&eacute; votre tester unitaire PHPUnit (c'est ce que tout le monde a fait) et que la classe principale de test ressemble &agrave;...
+<pre>
+class PHPUnit {
+ function PHPUnit() {
+ }
+
+ function assertion($message, $assertion) {
+ }
+ ...
+}
+</pre>
+ La seule chose que la m&eacute;thode <span class="new_code">assertion()</span> r&eacute;alise, c'est de pr&eacute;parer une sortie embellie alors le param&egrave;tre boolien de l'assertion sert &agrave; d&eacute;terminer s'il s'agit d'une erreur ou d'un succ&egrave;s. Supposons qu'elle est utilis&eacute;e de la mani&egrave;re suivante...
+<pre>
+$unit_test = new PHPUnit();
+$unit_test&gt;assertion('I hope this file exists', file_exists('my_file'));
+</pre>
+ Comment utiliser les objets fantaisie avec ceci ?
+ </p>
+ <p>
+ Il y a une m&eacute;thode prot&eacute;g&eacute;e sur la classe de base des objets fantaisie : elle s'appelle <span class="new_code">_assertTrue()</span>. En surchargeant cette m&eacute;thode nous pouvons utiliser notre propre format d'assertion. Nous commen&ccedil;ons avec une sous-classe, dans <em>my_mock.php</em>...
+<pre>
+<strong>&lt;?php
+ require_once('simpletest/mock_objects.php');
+
+ class MyMock extends SimpleMock() {
+ function MyMock(&amp;$test, $wildcard) {
+ $this-&gt;SimpleMock($test, $wildcard);
+ }
+
+ function _assertTrue($assertion, $message) {
+ $test = &amp;$this-&gt;getTest();
+ $test-&gt;assertion($message, $assertion);
+ }
+ }
+?&gt;</strong>
+</pre>
+ Maintenant une instance de <span class="new_code">MyMock</span> cr&eacute;era un objet qui parle le m&ecirc;me langage que votre testeur. Bien s&ucirc;r le truc c'est que nous cr&eacute;ons jamais un tel objet : le g&eacute;n&eacute;rateur s'en chargera. Nous avons juste besoin d'une ligne de code suppl&eacute;mentaire pour dire au g&eacute;n&eacute;rateur d'utiliser vos nouveaux objets fantaisie...
+<pre>
+&lt;?php
+ require_once('simpletst/mock_objects.php');
+
+ class MyMock extends SimpleMock() {
+ function MyMock($test, $wildcard) {
+ $this-&gt;SimpleMock(&amp;$test, $wildcard);
+ }
+
+ function _assertTrue($assertion, $message , &amp;$test) {
+ $test-&gt;assertion($message, $assertion);
+ }
+ }<strong>
+ SimpleTestOptions::setMockBaseClass('MyMock');</strong>
+?&gt;
+</pre>
+ A partir de maintenant vous avez juste &agrave; inclure <em>my_mock.php</em> &agrave; la place de la version par d&eacute;faut <em>simple_mock.php</em> et vous pouvez introduire des objets fantaisie dans votre suite de tests existants.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ L'article originel sur <a href="http://www.mockobjects.com/">les objets fantaisie</a>.
+ </li>
+<li>
+ La page du projet SimpleTest sur <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ La page d'accueil de SimpleTest sur <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/fr/overview.html b/tests/simpletest/docs/fr/overview.html
new file mode 100755
index 0000000000..6074d21166
--- /dev/null
+++ b/tests/simpletest/docs/fr/overview.html
@@ -0,0 +1,332 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>
+ Aper&ccedil;u et liste des fonctionnalit&eacute;s des testeurs unitaires PHP et web de SimpleTest PHP
+ </title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Apercu de SimpleTest</h1>
+ This page...
+ <ul>
+<li>
+ <a href="#resume">R&eacute;sum&eacute; rapide</a> de l'outil SimpleTest pour PHP.
+ </li>
+<li>
+ <a href="#fonctionnalites">La liste des fonctionnalites</a>, &agrave; la fois pr&eacute;sentes et &agrave; venir.
+ </li>
+<li>
+ Il y a beaucoup de <a href="#ressources">ressources sur les tests unitaires</a> sur le web.
+ </li>
+</ul>
+<div class="content">
+ <p>
+<a class="target" name="resume">
+<h2>Qu'est-ce que SimpleTest ?</h2>
+</a>
+</p>
+ <p>
+ Le coeur de SimpleTest est un framework de test construit autour de classes de sc&eacute;narios de test. Celles-ci sont &eacute;crites comme des extensions des classes premi&egrave;res de sc&eacute;narios de test, chacune &eacute;largie avec des m&eacute;thodes qui contiennent le code de test effectif. Les scripts de test de haut niveau invoque la m&eacute;thode <span class="new_code">run()</span> &agrave; chaque sc&eacute;nario de test successivement. Chaque m&eacute;thode de test est &eacute;crite pour appeler des assertions diverses que le d&eacute;veloppeur suppose &ecirc;tre vraies, <span class="new_code">assertEqual()</span> par exemple. Si l'assertion est correcte, alors un succ&egrave;s est exp&eacute;di&eacute; au rapporteur observant le test, mais toute erreur d&eacute;clenche une alerte et une description de la dissension.
+ </p>
+ <p>
+ Un <a href="unit_test_documentation.html">sc&eacute;nario de test</a> ressemble &agrave;...
+<pre>
+class <strong>MyTestCase</strong> extends UnitTestCase {
+ <strong>
+ function testLog() {
+ $log = &amp;new Log('my.log');
+ $log-&gt;message('Hello');
+ $this-&gt;assertTrue(file_exists('my.log'));
+ }</strong>
+}
+</pre>
+ </p>
+ <p>
+ Ces outils sont con&ccedil;us pour le d&eacute;veloppeur. Les tests sont &eacute;crits en PHP directement, plus ou moins simultan&eacute;ment avec la construction de l'application elle-m&ecirc;me. L'avantage d'utiliser PHP lui-m&ecirc;me comme langage de test est qu'il n'y a pas de nouveau langage &agrave; apprendre, les tests peuvent commencer directement et le d&eacute;veloppeur peut tester n'importe quelle partie du code. Plus simplement, toutes les parties qui peuvent &ecirc;tre acc&eacute;d&eacute;es par le code de l'application peuvent aussi &ecirc;tre acc&eacute;d&eacute;es par le code de test si ils sont tous les deux dans le m&ecirc;me langage.
+ </p>
+ <p>
+ Le type de sc&eacute;nario de test le plus simple est le <span class="new_code">UnitTestCase</span>. Cette classe de sc&eacute;nario de test inclut les tests standards pour l'&eacute;galit&eacute;, les r&eacute;f&eacute;rences et l'appariement de motifs (via les expressions rationnelles). Ceux-ci testent ce que vous seriez en droit d'attendre du r&eacute;sultat d'une fonction ou d'une m&eacute;thode. Il s'agit du type de test le plus commun pendant le quotidien du d&eacute;veloppeur, peut-&ecirc;tre 95% des sc&eacute;narios de test.
+ </p>
+ <p>
+ La t&acirc;che ultime d'une application web n'est cependant pas de produire une sortie correcte &agrave; partir de m&eacute;thodes ou d'objets, mais plut&ocirc;t de produire des pages web. La classe <span class="new_code">WebTestCase</span> teste des pages web. Elle simule un navigateur web demandant une page, de fa&ccedil;on exhaustive : cookies, proxies, connexions s&eacute;curis&eacute;es, authentification, formulaires, cadres et la plupart des &eacute;l&eacute;ments de navigation. Avec ce type de sc&eacute;nario de test, le d&eacute;veloppeur peut garantir que telle ou telle information est pr&eacute;sente dans la page et que les formulaires ainsi que les sessions sont g&eacute;r&eacute;s comme il faut.
+ </p>
+ <p>
+ Un <a href="web_tester_documentation.html">sc&eacute;nario de test web</a> ressemble &agrave;...
+<pre>
+class <strong>MySiteTest</strong> extends WebTestCase {
+ <strong>
+ function testHomePage() {
+ $this-&gt;get('http://www.my-site.com/index.php');
+ $this-&gt;assertTitle('My Home Page');
+ $this-&gt;clickLink('Contact');
+ $this-&gt;assertTitle('Contact me');
+ $this-&gt;assertWantedPattern('/Email me at/');
+ }</strong>
+}
+</pre>
+ </p>
+
+ <p>
+<a class="target" name="fonctionnalites">
+<h2>Liste des fonctionnalites</h2>
+</a>
+</p>
+ <p>
+ Ci-dessous vous trouverez un canevas assez brut des fonctionnalit&eacute;s &agrave; aujourd'hui et pour demain, sans oublier leur date approximative de publication. J'ai bien peur qu'il soit modifiable sans pr&eacute;-avis &eacute;tant donn&eacute; que les jalons d&eacute;pendent beaucoup sur le temps disponible. Les trucs en vert ont &eacute;t&eacute; cod&eacute;s, mais pas forc&eacute;ment d&eacute;j&agrave; rendus public. Si vous avez une besoin pressant pour une fonctionnalit&eacute; verte mais pas encore publique alors vous devriez retirer le code directement sur le CVS chez SourceFourge. Une fonctionnalit&eacute;e publi&eacute;e est indiqu&eacute; par "Fini".
+ <table>
+<thead>
+ <tr>
+<th>Fonctionnalit&eacute;</th><th>Description</th><th>Publication</th>
+</tr>
+ </thead>
+<tbody>
+<tr>
+ <td>Sc&eacute;nariot de test unitaire</td>
+ <td>Les classes de test et assertions de base</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Affichage HTML</td>
+ <td>L'affichage le plus simple possible</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Autochargement des sc&eacute;narios de test</td>
+ <td>Lire un fichier avec des sc&eacute;narios de test et les charger dans un groupe de tests automatiquement</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>G&eacute;n&eacute;rateur de code d'objets fantaisie</td>
+ <td>Des objets capable de simuler d'autres objets, supprimant les d&eacute;pendances dans les tests</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Bouchons serveur</td>
+ <td>Des objets fantaisie sans r&eacute;sultat attendu &agrave; utiliser &agrave; l'ext&eacute;rieur des sc&eacute;narios de test, pour le prototypage par exemple.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Int&eacute;gration d'autres testeurs unitaires</td>
+ <td>
+ La capacit&eacute; de lire et simuler d'autres sc&eacute;narios de test en provenance de PHPUnit et de PEAR::Phpunit.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Sc&eacute;nario de test web</td>
+ <td>Appariement basique de motifs dans une page t&eacute;l&eacute;charg&eacute;e.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Analyse de page HTML</td>
+ <td>Permet de suivre les liens et de trouver la balise de titre</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Simulacre partiel</td>
+ <td>Simuler des parties d'une classe pour tester moins qu'une classe ou dans des cas complexes.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Gestion des cookies Web</td>
+ <td>Gestion correcte des cookies au t&eacute;l&eacute;chargement d'une page.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Suivi des redirections</td>
+ <td>Le t&eacute;l&eacute;chargement d'une page suit automatiquement une redirection 300.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Analyse d'un formulaire</td>
+ <td>La capacit&eacute; de valider un formulaire simple et d'en lire les valeurs par d&eacute;faut.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Interface en ligne de commande</td>
+ <td>Affiche le r&eacute;sultat des tests sans navigateur web.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Mise &agrave; nu des attentes d'une classe</td>
+ <td>Peut cr&eacute;er des tests pr&eacute;cis avec des simulacres ainsi que des sc&eacute;narios de test.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Sortie et analyse XML</td>
+ <td>Permet de tester sur plusieurs h&ocirc;tes et d'int&eacute;grer des extensions d'acceptation de test.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Sc&eacute;nario de test en ligne de commande</td>
+ <td>Permet de tester des outils ou scripts en ligne de commande et de manier des fichiers.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Compatibilit&eacute; avec PHP Documentor</td>
+ <td>G&eacute;n&eacute;ration automatique et compl&egrave;te de la documentation au niveau des classes.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Interface navigateur</td>
+ <td>Mise &agrave; nu des niveaux bas de l'interface du navigateur web pour des sc&eacute;narios de test plus pr&eacute;cis.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Authentification HTTP</td>
+ <td>T&eacute;l&eacute;chargement des pages web prot&eacute;g&eacute;es avec une authentification basique seulement.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Boutons de navigation d'un navigateur</td>
+ <td>Arri&egrave;re, avant et recommencer</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Support de SSL</td>
+ <td>Peut se connecter &agrave; des pages de type https.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Support de proxy</td>
+ <td>Peut se connecter via des proxys communs</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Support des cadres</td>
+ <td>G&egrave;re les cadres dans les sc&eacute;narios de test web.</td>
+ <td style="color: green;">Fini</td>
+ </tr>
+ <tr>
+ <td>Test de l'upload de fichier</td>
+ <td>Peut simuler la balise input de type file</td>
+ <td style="color: red;">1.0.1</td>
+ </tr>
+ <tr>
+ <td>Am&eacute;lioration sur la machinerie des rapports</td>
+ <td>Retouche sur la transmission des messages pour une meilleur coop&eacute;ration avec les IDEs</td>
+ <td style="color: red;">1.1</td>
+ </tr>
+ <tr>
+ <td>Am&eacute;lioration de l'affichage des tests</td>
+ <td>Une meilleure interface graphique web, avec un arbre des sc&eacute;narios de test.</td>
+ <td style="color: red;">1.1</td>
+ </tr>
+ <tr>
+ <td>Localisation</td>
+ <td>Abstraction des messages et g&eacute;nration du code &agrave; partir de fichiers XML.</td>
+ <td style="color: red;">1.1</td>
+ </tr>
+ <tr>
+ <td>Simulation d'interface</td>
+ <td>Peut g&eacute;n&eacute;rer des objets fantaisie tant vers des interfaces que vers des classes.</td>
+ <td style="color: red;">2.0</td>
+ </tr>
+ <tr>
+ <td>Test sur es exceptions</td>
+ <td>Dans le m&ecirc;me esprit que sur les tests des erreurs PHP.</td>
+ <td style="color: red;">2.0</td>
+ </tr>
+ <tr>
+ <td>Rercherche d'&eacute;l&eacute;ments avec XPath</td>
+ <td>Peut utiliser Tidy HTML pour un appariement plus rapide et plus souple.</td>
+ <td style="color: red;">2.0</td>
+ </tr>
+ </tbody>
+</table>
+ La migration vers PHP5 commencera juste apr&egrave;s la s&eacute;rie des 1.0, &agrave; partir de l&agrave; PHP4 ne sera plus support&eacute;. SimpleTest est actuellement compatible avec PHP5 mais n'utilisera aucune des nouvelles fonctionnalit&eacute;s avant la version 2.
+ </p>
+
+ <p>
+<a class="target" name="ressources">
+<h2>Ressources sur le web pour les tests</h2>
+</a>
+</p>
+ <p>
+ Le processus est au moins aussi important que les outils. Le type de proc&eacute;dure que fait un usage le plus intensif des outils de test pour d&eacute;veloppeur est bien s&ucirc;r l'<a href="http://www.extremeprogramming.org/">Extreme Programming</a>. Il s'agit l&agrave; d'une des <a href="http://www.agilealliance.com/articles/index">m&eacute;thodes agiles</a> qui combinent plusieurs pratiques pour "lisser la courbe de co&ucirc;t" du d&eacute;veloppement logiciel. La plus extr&egrave;me reste le <a href="http://www.testdriven.com/modules/news/">d&eacute;veloppement pilot&eacute; par les tests</a>, o&ugrave; vous devez adh&eacute;rer &agrave; la r&egrave;gle du <cite>pas de code avant d'avoir un test</cite>. Si vous &ecirc;tes plut&ocirc;t du genre planninficateur ou que vous estimez que l'exp&eacute;rience compte plus que l'&eacute;volution, vous pr&eacute;f&eacute;rerez peut-&ecirc;tre l'approche <a href="http://www.therationaledge.com/content/dec_01/f_spiritOfTheRUP_pk.html">RUP</a>. Je ne l'ai pas test&eacute; mais je peux voir o&ugrave; vous aurez besoin d'outils de test (cf. illustration 9).
+ </p>
+ <p>
+ La plupart des testeurs unitaires sont dans une certaine mesure un clone de <a href="http://www.junit.org/">JUnit</a>, au moins dans l'interface. Il y a &eacute;norm&eacute;ment d'information sur le site de JUnit, &agrave; commencer par la <a href="http://junit.sourceforge.net/doc/faq/faq.htm">FAQ</a> quie contient pas mal de conseils g&eacute;n&eacute;raux sur les tests. Une fois mordu par le bogue vous appr&eacute;cierez s&ucirc;rement la phrase <a href="http://junit.sourceforge.net/doc/testinfected/testing.htm">infect&eacute; par les tests</a> trouv&eacute;e par Eric Gamma. Si vous &ecirc;tes encore en train de tergiverser sur un testeur unitaire, sachez que les choix principaux sont <a href="http://phpunit.sourceforge.net/">PHPUnit</a> et <a href="http://pear.php.net/manual/en/package.php.phpunit.php">Pear PHP::PHPUnit</a>. De nombreuses fonctionnalit&eacute;s de SimpleTest leurs font d&eacute;faut, mais la version PEAR a d'ores et d&eacute;j&agrave; &eacute;t&eacute; mise &agrave; jour pour PHP5. Elle est aussi recommand&eacute;e si vous portez des sc&eacute;narios de test existant depuis <a href="http://www.junit.org/">JUnit</a>.
+ </p>
+ <p>
+ Les d&eacute;veloppeurs de biblioth&egrave;que n'ont pas l'air de livrer tr&egrave;s souvent des tests avec leur code : c'est bien dommage. Le code d'une biblioth&egrave;que qui inclut des tests peut &ecirc;tre remani&eacute; avec plus de s&eacute;curit&eacute; et le code de test sert de documentation additionnelle dans un format assez standard. Ceci peut &eacute;pargner la p&ecirc;che aux indices dans le code source lorsque qu'un probl&egrave;me survient, en particulier lors de la mise &agrave; jour d'une telle biblioth&egrave;que. Parmi les biblioth&egrave;ques utilisant SimpleTest comme testeur unitaire on retrouve <a href="http://wact.sourceforge.net/">WACT</a> et <a href="http://sourceforge.net/projects/htmlsax">PEAR::XML_HTMLSax</a>.
+ </p>
+ <p>
+ Au jour d'aujourd'hui il manque tristement beaucoup de mati&egrave;re sur les objets fantaisie : dommage, surtout que tester unitairement sans eux repr&eacute;sente pas mal de travail en plus. L'<a href="http://www.sidewize.com/company/mockobjects.pdf">article original sur les objets fantaisie</a> est tr&egrave;s orient&eacute; Java, mais reste int&eacute;ressant &agrave; lire. Etant donn&eacute; qu'il s'agit d'une nouvelle technologie il y a beaucoup de discussions et de d&eacute;bats sur comment les utiliser, souvent sur des wikis comme <a href="http://xpdeveloper.com/cgi-bin/oldwiki.cgi?MockObjects">Extreme Tuesday</a> ou <a href="http://www.mockobjects.com/MocksObjectsPaper.html">www.mockobjects.com</a>ou <a href="http://c2.com/cgi/wiki?MockObject">the original C2 Wiki</a>. Injecter des objets fantaisie dans une classe est un des champs principaux du d&eacute;bat : cet <a href="http://www-106.ibm.com/developerworks/java/library/j-mocktest.html">article chez IBM</a> en est un bon point de d&eacute;part.
+ </p>
+ <p>
+ Il y a &eacute;normement d'outils de test web mais la plupart sont &eacute;crits en Java. De plus les tutoriels et autres conseils sont plut&ocirc;t rares. Votre seul espoir est de regarder directement la documentation pour <a href="http://httpunit.sourceforge.net/">HTTPUnit</a>, <a href="http://htmlunit.sourceforge.net/">HTMLUnit</a> ou <a href="http://jwebunit.sourceforge.net/">JWebUnit</a> et d'esp&eacute;rer y trouver pour des indices. Il y a aussi des frameworks bas&eacute;s sur XML, mais de nouveau la plupart ont besoin de Java pour tourner.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ <a href="unit_test_documentation.html">Documentation pour SimpleTest</a>.
+ </li>
+<li>
+ <a href="http://www.lastcraft.com/first_test_tutorial.php">Comment &eacute;crire des sc&eacute;narios de test en PHP</a> est un tutoriel plut&ocirc;t avanc&eacute;.
+ </li>
+<li>
+ <a href="http://simpletest.sourceforge.net/">L'API de SimpleTest</a> par phpdoc.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/fr/partial_mocks_documentation.html b/tests/simpletest/docs/fr/partial_mocks_documentation.html
new file mode 100755
index 0000000000..35b27bd281
--- /dev/null
+++ b/tests/simpletest/docs/fr/partial_mocks_documentation.html
@@ -0,0 +1,369 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Documentation SimpleTest : les objets fantaisie partiels</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Documentation sur les objets fantaisie partiels</h1>
+ This page...
+ <ul>
+<li>
+ <a href="#injection">Le probl&egrave;me de l'injection d'un objet fantaisie</a>.
+ </li>
+<li>
+ D&eacute;placer la cr&eacute;ation vers une m&eacute;thode <a href="#creation">fabrique prot&eacute;g&eacute;e</a>.
+ </li>
+<li>
+ <a href="#partiel">L'objet fantaisie partiel</a> g&eacute;n&egrave;re une sous-classe.
+ </li>
+<li>
+ Les objets fantaisie partiels <a href="#moins">testent moins qu'une classe</a>.
+ </li>
+</ul>
+<div class="content">
+
+ <p>
+ Un objet fantaisie partiel n'est ni plus ni moins qu'un mod&egrave;le de conception pour soulager un probl&egrave;me sp&eacute;cifique du test avec des objets fantaisie, celui de placer des objets fantaisie dans des coins serr&eacute;s. Il s'agit d'un outil assez limit&eacute; et peut-&ecirc;tre m&ecirc;me une id&eacute;e pas si bonne que &ccedil;a. Elle est incluse dans SimpleTest pour la simple raison que je l'ai trouv&eacute;e utile &agrave; plus d'une occasion et qu'elle m'a &eacute;pargn&eacute;e pas mal de travail dans ces moments-l&agrave;.
+ </p>
+
+ <p>
+<a class="target" name="injection">
+<h2>Le probl&egrave;me de l'injection dans un objet fantaisie</h2>
+</a>
+</p>
+ <p>
+ Quand un objet en utilise un autre il est tr&egrave;s simple d'y faire circuler une version fantaisie d&eacute;j&agrave; pr&ecirc;te avec ses attentes. Les choses deviennent un peu plus d&eacute;licates si un objet en cr&eacute;e un autre et que le cr&eacute;ateur est celui que l'on souhaite tester. Cela revient &agrave; dire que l'objet cr&eacute;&eacute; devrait &ecirc;tre une fantaisie, mais nous pouvons difficilement dire &agrave; notre classe sous test de cr&eacute;er un objet fantaisie plut&ocirc;t qu'un "vrai" objet. La classe test&eacute;e ne sait m&ecirc;me pas qu'elle travaille dans un environnement de test.
+ </p>
+ <p>
+ Par exemple, supposons que nous sommes en train de construire un client telnet et qu'il a besoin de cr&eacute;er une socket r&eacute;seau pour envoyer ses messages. La m&eacute;thode de connexion pourrait ressemble &agrave; quelque chose comme...
+<pre>
+<strong>&lt;?php
+ require_once('socket.php');
+
+ class Telnet {
+ ...
+ function &amp;connect($ip, $port, $username, $password) {
+ $socket = &amp;new Socket($ip, $port);
+ $socket-&gt;read( ... );
+ ...
+ }
+ }
+?&gt;</strong>
+</pre>
+ Nous voudrions vraiment avoir une version fantaisie de l'objet socket, que pouvons nous faire ?
+ </p>
+ <p>
+ La premi&egrave;re solution est de passer la socket en tant que param&egrave;tre, ce qui force la cr&eacute;ation au niveau inf&eacute;rieur. Charger le client de cette t&acirc;che est effectivement une bonne approche si c'est possible et devrait conduire &agrave; un remaniement -- de la cr&eacute;ation &agrave; partir de l'action. En fait, c'est l&agrave; une des mani&egrave;res avec lesquels tester en s'appuyant sur des objets fantaisie vous force &agrave; coder des solutions plus resserr&eacute;es sur leur objectif. Ils am&eacute;liorent votre programmation.
+ </p>
+ <p>
+ Voici ce que &ccedil;a devrait &ecirc;tre...
+<pre>
+&lt;?php
+ require_once('socket.php');
+
+ class Telnet {
+ ...
+ <strong>function &amp;connect(&amp;$socket, $username, $password) {
+ $socket-&gt;read( ... );
+ ...
+ }</strong>
+ }
+?&gt;
+</pre>
+ Sous-entendu, votre code de test est typique d'un cas de test avec un objet fantaisie.
+<pre>
+class TelnetTest extends UnitTestCase {
+ ...
+ function testConnection() {<strong>
+ $socket = &amp;new MockSocket($this);
+ ...
+ $telnet = &amp;new Telnet();
+ $telnet-&gt;connect($socket, 'Me', 'Secret');
+ ...</strong>
+ }
+}
+</pre>
+ C'est assez &eacute;vident que vous ne pouvez descendre que d'un niveau. Vous ne voudriez pas que votre application de haut niveau cr&eacute;e tous les fichiers de bas niveau, sockets et autres connexions &agrave; la base de donn&eacute;es dont elle aurait besoin. Elle ne conna&icirc;trait pas les param&egrave;tres du constructeur de toute fa&ccedil;on.
+ </p>
+ <p>
+ La solution suivante est de passer l'objet cr&eacute;&eacute; sous la forme d'un param&egrave;tre optionnel...
+<pre>
+&lt;?php
+ require_once('socket.php');
+
+ class Telnet {
+ ...<strong>
+ function &amp;connect($ip, $port, $username, $password, $socket = false) {
+ if (!$socket) {
+ $socket = &amp;new Socket($ip, $port);
+ }
+ $socket-&gt;read( ... );</strong>
+ ...
+ return $socket;
+ }
+ }
+?&gt;
+</pre>
+ Pour une solution rapide, c'est g&eacute;n&eacute;ralement suffisant. Ensuite le test est tr&egrave;s similaire : comme si le param&egrave;tre &eacute;tait transmis formellement...
+<pre>
+class TelnetTest extends UnitTestCase {
+ ...
+ function testConnection() {<strong>
+ $socket = &amp;new MockSocket($this);
+ ...
+ $telnet = &amp;new Telnet();
+ $telnet-&gt;connect('127.0.0.1', 21, 'Me', 'Secret', &amp;$socket);
+ ...</strong>
+ }
+}
+</pre>
+ Le probl&egrave;me de cette approche tient dans son manque de nettet&eacute;. Il y a du code de test dans la classe principale et aussi des param&egrave;tres transmis dans le sc&eacute;nario de test qui ne sont jamais utilis&eacute;s. Il s'agit l&agrave; d'une approche rapide et sale, mais qui ne reste pas moins efficace dans la plupart des situations.
+ </p>
+ <p>
+ Une autre solution encore est de laisser un objet fabrique s'occuper de la cr&eacute;ation...
+<pre>
+&lt;?php
+ require_once('socket.php');
+
+ class Telnet {<strong>
+ function Telnet(&amp;$network) {
+ $this-&gt;_network = &amp;$network;
+ }</strong>
+ ...
+ function &amp;connect($ip, $port, $username, $password) {<strong>
+ $socket = &amp;$this-&gt;_network-&gt;createSocket($ip, $port);
+ $socket-&gt;read( ... );</strong>
+ ...
+ return $socket;
+ }
+ }
+?&gt;
+</pre>
+ Il s'agit l&agrave; probablement de la r&eacute;ponse la plus travaill&eacute;e &eacute;tant donn&eacute; que la cr&eacute;ation est maintenant situ&eacute;e dans une petite classe sp&eacute;cialis&eacute;e. La fabrique r&eacute;seau peut &ecirc;tre test&eacute;e s&eacute;par&eacute;ment et utilis&eacute;e en tant que fantaisie quand nous testons la classe telnet...
+<pre>
+class TelnetTest extends UnitTestCase {
+ ...
+ function testConnection() {<strong>
+ $socket = &amp;new MockSocket($this);
+ ...
+ $network = &amp;new MockNetwork($this);
+ $network-&gt;setReturnReference('createSocket', $socket);
+ $telnet = &amp;new Telnet($network);
+ $telnet-&gt;connect('127.0.0.1', 21, 'Me', 'Secret');
+ ...</strong>
+ }
+}
+</pre>
+ Le probl&egrave;me reste que nous ajoutons beaucoup de classes &agrave; la biblioth&egrave;que. Et aussi que nous utilisons beaucoup de fabriques ce qui rend notre code un peu moins intuitif. La solution la plus flexible, mais aussi la plus complexe.
+ </p>
+ <p>
+ Peut-on trouver un juste milieu ?
+ </p>
+
+ <p>
+<a class="target" name="creation">
+<h2>M&eacute;thode fabrique prot&eacute;g&eacute;e</h2>
+</a>
+</p>
+ <p>
+ Il existe une technique pour palier &agrave; ce probl&egrave;me sans cr&eacute;er de nouvelle classe dans l'application; par contre elle induit la cr&eacute;ation d'une sous-classe au moment du test. Premi&egrave;rement nous d&eacute;pla&ccedil;ons la cr&eacute;ation de la socket dans sa propre m&eacute;thode...
+<pre>
+&lt;?php
+ require_once('socket.php');
+
+ class Telnet {
+ ...
+ function &amp;connect($ip, $port, $username, $password) {<strong>
+ $socket = &amp;$this-&gt;_createSocket($ip, $port);</strong>
+ $socket-&gt;read( ... );
+ ...
+ }<strong>
+
+ function &amp;_createSocket($ip, $port) {
+ return new Socket($ip, $port);
+ }</strong>
+ }
+?&gt;
+</pre>
+ Il s'agit l&agrave; de la seule modification dans le code de l'application.
+ </p>
+ <p>
+ Pour le sc&eacute;nario de test, nous devons cr&eacute;er une sous-classe de mani&egrave;re &agrave; intercepter la cr&eacute;ation de la socket...
+<pre>
+<strong>class TelnetTestVersion extends Telnet {
+ var $_mock;
+
+ function TelnetTestVersion(&amp;$mock) {
+ $this-&gt;_mock = &amp;$mock;
+ $this-&gt;Telnet();
+ }
+
+ function &amp;_createSocket() {
+ return $this-&gt;_mock;
+ }
+}</strong>
+</pre>
+ Ici j'ai d&eacute;plac&eacute; la fantaisie dans le constructeur, mais un setter aurait fonctionn&eacute; tout aussi bien. Notez bien que la fantaisie est plac&eacute;e dans une variable d'objet avant que le constructeur ne soit attach&eacute;. C'est n&eacute;cessaire dans le cas o&ugrave; le constructeur appelle <span class="new_code">connect()</span>. Autrement il pourrait donner un valeur nulle &agrave; partir de <span class="new_code">_createSocket()</span>.
+ </p>
+ <p>
+ Apr&egrave;s la r&eacute;alisation de tout ce travail suppl&eacute;mentaire le sc&eacute;nario de test est assez simple. Nous avons juste besoin de tester notre nouvelle classe &agrave; la place...
+<pre>
+class TelnetTest extends UnitTestCase {
+ ...
+ function testConnection() {<strong>
+ $socket = &amp;new MockSocket($this);
+ ...
+ $telnet = &amp;new TelnetTestVersion($socket);
+ $telnet-&gt;connect('127.0.0.1', 21, 'Me', 'Secret');
+ ...</strong>
+ }
+}
+</pre>
+ Cette nouvelle classe est tr&egrave;s simple bien s&ucirc;r. Elle ne fait qu'initier une valeur renvoy&eacute;e, &agrave; la mani&egrave;re d'une fantaisie. Ce serait pas mal non plus si elle pouvait v&eacute;rifier les param&egrave;tres entrants. Exactement comme un objet fantaisie. Il se pourrait bien que nous ayons &agrave; r&eacute;aliser cette astuce r&eacute;guli&egrave;rement : serait-il possible d'automatiser la cr&eacute;ation de cette sous-classe ?
+ </p>
+
+ <p>
+<a class="target" name="partiel">
+<h2>Un objet fantaisie partiel</h2>
+</a>
+</p>
+ <p>
+ Bien s&ucirc;r la r&eacute;ponse est "oui" ou alors j'aurais arr&ecirc;t&eacute; d'&eacute;crire depuis quelques temps d&eacute;j&agrave; ! Le test pr&eacute;c&eacute;dent a repr&eacute;sent&eacute; beaucoup de travail, mais nous pouvons g&eacute;n&eacute;rer la sous-classe en utilisant une approche &agrave; celle des objets fantaisie.
+ </p>
+ <p>
+ Voici donc une version avec objet fantaisie partiel du test...
+<pre>
+<strong>Mock::generatePartial(
+ 'Telnet',
+ 'TelnetTestVersion',
+ array('_createSocket'));</strong>
+
+class TelnetTest extends UnitTestCase {
+ ...
+ function testConnection() {<strong>
+ $socket = &amp;new MockSocket($this);
+ ...
+ $telnet = &amp;new TelnetTestVersion($this);
+ $telnet-&gt;setReturnReference('_createSocket', $socket);
+ $telnet-&gt;Telnet();
+ $telnet-&gt;connect('127.0.0.1', 21, 'Me', 'Secret');
+ ...</strong>
+ }
+}
+</pre>
+ La fantaisie partielle est une sous-classe de l'original dont on aurait "remplac&eacute;" les m&eacute;thodes s&eacute;lectionn&eacute;es avec des versions de test. L'appel &agrave; <span class="new_code">generatePartial()</span> n&eacute;cessite trois param&egrave;tres : la classe &agrave; sous classer, le nom de la nouvelle classe et une liste des m&eacute;thodes &agrave; simuler.
+ </p>
+ <p>
+ Instancier les objets qui en r&eacute;sultent est plut&ocirc;t d&eacute;licat. L'unique param&egrave;tre du constructeur d'un objet fantaisie partiel est la r&eacute;f&eacute;rence du testeur unitaire. Comme avec les objets fantaisie classiques c'est n&eacute;cessaire pour l'envoi des r&eacute;sultats de test en r&eacute;ponse &agrave; la v&eacute;rification des attentes.
+ </p>
+ <p>
+ Une nouvelle fois le constructeur original n'est pas lanc&eacute;. Indispensable dans le cas o&ugrave; le constructeur aurait besoin des m&eacute;thodes fantaisie : elles n'ont pas encore &eacute;t&eacute; initi&eacute;es ! Nous initions les valeurs retourn&eacute;es &agrave; cet instant et ensuite lan&ccedil;ons le constructeur avec ses param&egrave;tres normaux. Cette construction en trois &eacute;tapes de "new", suivie par la mise en place des m&eacute;thodes et ensuite par la lancement du constructeur proprement dit est ce qui distingue le code d'un objet fantaisie partiel.
+ </p>
+ <p>
+ A part pour leur construction, toutes ces m&eacute;thodes fantaisie ont les m&ecirc;mes fonctionnalit&eacute;s que dans le cas des objets fantaisie et toutes les m&eacute;thodes non fantaisie se comportent comme avant. Nous pouvons mettre en place des attentes tr&egrave;s facilement...
+<pre>
+class TelnetTest extends UnitTestCase {
+ ...
+ function testConnection() {
+ $socket = &amp;new MockSocket($this);
+ ...
+ $telnet = &amp;new TelnetTestVersion($this);
+ $telnet-&gt;setReturnReference('_createSocket', $socket);<strong>
+ $telnet-&gt;expectOnce('_createSocket', array('127.0.0.1', 21));</strong>
+ $telnet-&gt;Telnet();
+ $telnet-&gt;connect('127.0.0.1', 21, 'Me', 'Secret');
+ ...<strong>
+ $telnet-&gt;tally();</strong>
+ }
+}
+</pre>
+ </p>
+
+ <p>
+<a class="target" name="moins">
+<h2>Tester moins qu'une classe</h2>
+</a>
+</p>
+ <p>
+ Les m&eacute;thodes issues d'un objet fantaisie n'ont pas besoin d'&ecirc;tre des m&eacute;thodes fabrique, Il peut s'agir de n'importe quelle sorte de m&eacute;thode. Ainsi les objets fantaisie partiels nous permettent de prendre le contr&ocirc;le de n'importe quelle partie d'une classe, le constructeur except&eacute;. Nous pourrions m&ecirc;me aller jusqu'&agrave; cr&eacute;er des fantaisies sur toutes les m&eacute;thodes &agrave; part celle que nous voulons effectivement tester.
+ </p>
+ <p>
+ Cette situation est assez hypoth&eacute;tique, &eacute;tant donn&eacute; que je ne l'ai jamais essay&eacute;e. Je suis ouvert &agrave; cette possibilit&eacute;, mais je crains qu'en for&ccedil;ant la granularit&eacute; d'un objet on n'obtienne pas forc&eacute;ment un code de meilleur qualit&eacute;. Personnellement j'utilise les objets fantaisie partiels comme moyen de passer outre la cr&eacute;ation ou alors de temps en temps pour tester le mod&egrave;le de conception TemplateMethod.
+ </p>
+ <p>
+ Pour choisir le m&eacute;canisme &agrave; utiliser, on en revient toujours aux standards de code de votre projet.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ La page du projet SimpleTest sur <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ <a href="http://simpletest.sourceforge.net/">L'API compl&egrave;te pour SimpleTest</a> &agrave; partir de PHPDoc.
+ </li>
+<li>
+ La m&eacute;thode fabrique prot&eacute;g&eacute;e est d&eacute;crite dans <a href="http://www-106.ibm.com/developerworks/java/library/j-mocktest.html">cet article d'IBM</a>. Il s'agit de l'unique papier formel que j'ai vu sur ce probl&egrave;me.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/fr/reporter_documentation.html b/tests/simpletest/docs/fr/reporter_documentation.html
new file mode 100755
index 0000000000..4ec4a0536b
--- /dev/null
+++ b/tests/simpletest/docs/fr/reporter_documentation.html
@@ -0,0 +1,422 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Documentation SimpleTest : le rapporteur de test</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Documentation sur le rapporteur de test</h1>
+ This page...
+ <ul>
+<li>
+ Afficher <a href="#html">les r&eacute;sultats en HTML</a>
+ </li>
+<li>
+ Afficher et <a href="#autres">rapporter les r&eacute;sultats</a> dans d'autres formats
+ </li>
+<li>
+ Utilis&eacute; <a href="#cli">SimpleTest depuis la ligne de commande</a>
+ </li>
+<li>
+ <a href="#xml">Utiliser XML</a> pour des tests distants
+ </li>
+</ul>
+<div class="content">
+
+ <p>
+ SimpleTest suit plut&ocirc;t plus que moins le mod&egrave;le MVC (Mod&egrave;le-Vue-Contr&ocirc;leur). Les classes "reporter" sont les vues et les mod&egrave;les sont vos sc&eacute;narios de test et leur hi&eacute;rarchie. Le contr&ocirc;leur est le plus souvent masqu&eacute; &agrave; l'utilisateur de SimpleTest &agrave; moins de vouloir changer la fa&ccedil;on dont les tests sont effectivement ex&eacute;cut&eacute;s, auquel cas il est possible de surcharger les objets "runner" (ceux de l'ex&eacute;cuteur) depuis l'int&eacute;rieur d'un sc&eacute;nario de test. Comme d'habitude avec MVC, le contr&ocirc;leur est plut&ocirc;t ind&eacute;fini et il existe d'autres endroits pour contr&ocirc;ler l'ex&eacute;cution des tests.
+ </p>
+
+ <p>
+<a class="target" name="html">
+<h2>Les r&eacute;sultats rapport&eacute;s au format HTML</h2>
+</a>
+</p>
+ <p>
+ L'affichage par d&eacute;faut est minimal &agrave; l'extr&ecirc;me. Il renvoie le succ&egrave;s ou l'&eacute;chec avec les barres conventionnelles - rouge et verte - et affichent une trace d'arborescence des groupes de test pour chaque assertion erron&eacute;e. Voici un tel &eacute;chec...
+ <div class="demo">
+ <h1>File test</h1>
+ <span class="fail">Fail</span>: createnewfile-&gt;True assertion failed.<br>
+ <div style="padding: 8px; margin-top: 1em; background-color: red; color: white;">1/1 test cases complete.
+ <strong>0</strong> passes, <strong>1</strong> fails and <strong>0</strong> exceptions.</div>
+ </div>
+ Alors qu'ici tous les tests passent...
+ <div class="demo">
+ <h1>File test</h1>
+ <div style="padding: 8px; margin-top: 1em; background-color: green; color: white;">1/1 test cases complete.
+ <strong>1</strong> passes, <strong>0</strong> fails and <strong>0</strong> exceptions.</div>
+ </div>
+ La bonne nouvelle, c'est qu'il existe pas mal de points dans la hi&eacute;rarchie de l'affichage pour cr&eacute;er des sous-classes.
+ </p>
+ <p>
+ Pour l'affichage bas&eacute; sur des pages web, il y a la classe <span class="new_code">HtmlReporter</span> avec la signature suivante...
+<pre>
+class HtmlReporter extends SimpleReporter {
+ public HtmlReporter($encoding) { ... }
+ public makeDry(boolean $is_dry) { ... }
+ public void paintHeader(string $test_name) { ... }
+ public void sendNoCacheHeaders() { ... }
+ public void paintFooter(string $test_name) { ... }
+ public void paintGroupStart(string $test_name, integer $size) { ... }
+ public void paintGroupEnd(string $test_name) { ... }
+ public void paintCaseStart(string $test_name) { ... }
+ public void paintCaseEnd(string $test_name) { ... }
+ public void paintMethodStart(string $test_name) { ... }
+ public void paintMethodEnd(string $test_name) { ... }
+ public void paintFail(string $message) { ... }
+ public void paintPass(string $message) { ... }
+ public void paintError(string $message) { ... }
+ public void paintException(string $message) { ... }
+ public void paintMessage(string $message) { ... }
+ public void paintFormattedMessage(string $message) { ... }
+ protected string _getCss() { ... }
+ public array getTestList() { ... }
+ public integer getPassCount() { ... }
+ public integer getFailCount() { ... }
+ public integer getExceptionCount() { ... }
+ public integer getTestCaseCount() { ... }
+ public integer getTestCaseProgress() { ... }
+}
+</pre>
+ Voici ce que certaines de ces m&eacute;thodes veulent dire. Premi&egrave;rement les m&eacute;thodes d'affichage que vous voudrez probablement surcharger...
+ <ul class="api">
+ <li>
+ <span class="new_code">HtmlReporter(string $encoding)</span>
+<br>
+ est le constructeur. Notez que le test unitaire initie le lien &agrave; l'affichage plut&ocirc;t que l'oppos&eacute;. L'affichage est principalement un receveur passif des &eacute;v&egrave;nements de tests. Cela permet d'adapter facilement l'affichage pour d'autres syst&egrave;mes en dehors des tests unitaires, tel le suivi de la charge de serveurs. L'"encoding" est le type d'encodage que vous souhaitez utiliser pour l'affichage du test. Pour pouvoir effectuer un rendu correct de la sortie de d&eacute;bogage quand on utilise le testeur web, il doit correspondre &agrave; l'encodage du site test&eacute;. Les cha&icirc;nes de caract&egrave;res disponibles sont indiqu&eacute;es dans la fonction PHP <a href="http://www.php.net/manual/fr/function.htmlentities.php">html_entities()</a>.
+ </li>
+ <li>
+ <span class="new_code">void paintHeader(string $test_name)</span>
+<br>
+ est appel&eacute; une fois, au d&eacute;but du test quand l'&eacute;v&egrave;nement de d&eacute;marrage survient. Le premier &eacute;v&egrave;nement de d&eacute;marrage est souvent d&eacute;livr&eacute; par le groupe de tests du niveau le plus haut et donc c'est de l&agrave; que le <span class="new_code">$test_name</span> arrive. Il peint les titres de la page, CSS, la balise "body", etc. Il ne renvoie rien du tout (<span class="new_code">void</span>).
+ </li>
+ <li>
+ <span class="new_code">void paintFooter(string $test_name)</span>
+<br>
+ est appel&eacute; &agrave; la toute fin du test pour fermer les balises ouvertes par l'ent&ecirc;te de la page. Par d&eacute;faut il affiche aussi la barre rouge ou verte et le d&eacute;compte final des r&eacute;sultats. En fait la fin des tests arrive quand l'&eacute;v&egrave;nement de fin de test arrive avec le m&ecirc;me nom que celui qui l'a initi&eacute; au m&ecirc;me niveau. Le nid des tests en quelque sorte. Fermer le dernier test finit l'affichage.
+ </li>
+ <li>
+ <span class="new_code">void paintMethodStart(string $test_name)</span>
+<br>
+ est appel&eacute; au d&eacute;but de chaque m&eacute;thode de test. Normalement le nom vient de celui de la m&eacute;thode. Les autres &eacute;v&egrave;nements de d&eacute;part de test se comportent de la m&ecirc;me mani&egrave;re sauf que celui du groupe de tests indique au rapporteur le nombre de sc&eacute;narios de test qu'il contient. De la sorte le rapporteur peut afficher une barre de progr&egrave;s au fur et &agrave; mesure que l'ex&eacute;cuteur passe en revue les sc&eacute;narios de test.
+ </li>
+ <li>
+ <span class="new_code">void paintMethodEnd(string $test_name)</span>
+<br>
+ cl&ocirc;t le test lanc&eacute; avec le m&ecirc;me nom.
+ </li>
+ <li>
+ <span class="new_code">void paintFail(string $message)</span>
+<br>
+ peint un &eacute;chec. Par d&eacute;faut il ne fait qu'afficher le mot "fail", une trace d'arborescence affichant la position du test en cours et le message transmis par l'assertion.
+ </li>
+ <li>
+ <span class="new_code">void paintPass(string $message)</span>
+<br>
+ ne fait rien, par d&eacute;faut.
+ </li>
+ <li>
+ <span class="new_code">string _getCss()</span>
+<br>
+ renvoie les styles CSS sous la forme d'une cha&icirc;ne &agrave; l'attention de la m&eacute;thode d'ent&ecirc;tes d'une page. Des styles additionnels peuvent &ecirc;tre ajout&eacute;s ici si vous ne surchargez pas les ent&ecirc;tes de la page. Vous ne voudrez pas utiliser cette m&eacute;thode dans des ent&ecirc;tes d'une page surcharg&eacute;e si vous souhaitez inclure le feuille de style CSS d'origine.
+ </li>
+ </ul>
+ Il y a aussi des accesseurs pour aller chercher l'information sur l'&eacute;tat courant de la suite de test. Vous les utiliserez pour enrichir l'affichage...
+ <ul class="api">
+ <li>
+ <span class="new_code">array getTestList()</span>
+<br>
+ est la premi&egrave;re m&eacute;thode tr&egrave;s commode pour les sous-classes. Elle liste l'arborescence courante des tests sous la forme d'une liste de noms de tests. Le premier test -- celui le plus proche du coeur -- sera le premier dans la liste et la m&eacute;thode de test en cours sera la derni&egrave;re.
+ </li>
+ <li>
+ <span class="new_code">integer getPassCount()</span>
+<br>
+ renvoie le nombre de succ&egrave;s atteint. Il est n&eacute;cessaire pour l'affichage &agrave; la fin.
+ </li>
+ <li>
+ <span class="new_code">integer getFailCount()</span>
+<br>
+ renvoie de la m&ecirc;me mani&egrave;re le nombre d'&eacute;checs.
+ </li>
+ <li>
+ <span class="new_code">integer getExceptionCount()</span>
+<br>
+ renvoie quant &agrave; lui le nombre d'erreurs.
+ </li>
+ <li>
+ <span class="new_code">integer getTestCaseCount()</span>
+<br>
+ est le nombre total de sc&eacute;narios lors de l'ex&eacute;cution des tests. Il comprend aussi les tests group&eacute;s.
+ </li>
+ <li>
+ <span class="new_code">integer getTestCaseProgress()</span>
+<br>
+ est le nombre de sc&eacute;narios r&eacute;alis&eacute;s jusqu'&agrave; pr&eacute;sent.
+ </li>
+ </ul>
+ Une modification simple : demander &agrave; l'HtmlReporter d'afficher aussi bien les succ&egrave;s que les &eacute;checs et les erreurs...
+<pre>
+<strong>class ShowPasses extends HtmlReporter {
+
+ function paintPass($message) {
+ parent::paintPass($message);
+ print "&amp;&lt;span class=\"pass\"&gt;Pass&lt;/span&gt;: ";
+ $breadcrumb = $this-&gt;getTestList();
+ array_shift($breadcrumb);
+ print implode("-&amp;gt;", $breadcrumb);
+ print "-&amp;gt;$message&lt;br /&gt;\n";
+ }
+
+ function _getCss() {
+ return parent::_getCss() . ' .pass { color: green; }';
+ }
+}</strong>
+</pre>
+ </p>
+ <p>
+ Une m&eacute;thode qui a beaucoup fait jaser reste la m&eacute;thode <span class="new_code">makeDry()</span>. Si vous lancez cette m&eacute;thode, sans param&egrave;tre, sur le rapporteur avant que la suite de test ne soit ex&eacute;cut&eacute;e alors aucune m&eacute;thode de test ne sera appel&eacute;e. Vous continuerez &agrave; avoir les &eacute;v&egrave;nements entrants et sortants des m&eacute;thodes et sc&eacute;narios de test, mais aucun succ&egrave;s ni &eacute;chec ou erreur, parce que le code de test ne sera pas ex&eacute;cut&eacute;.
+ </p>
+ <p>
+ La raison ? Pour permettre un affichage complexe d'une IHM (ou GUI) qui permettrait la s&eacute;lection de sc&eacute;narios de test individuels. Afin de construire une liste de tests possibles, ils ont besoin d'un rapport sur la structure du test pour l'affichage, par exemple, d'une vue en arbre de la suite de test. Avec un rapporteur lanc&eacute; sur une ex&eacute;cution s&egrave;che qui ne renverrait que les &eacute;v&egrave;nements d'affichage, cela devient facilement r&eacute;alisable.
+ </p>
+
+ <p>
+<a class="target" name="autre">
+<h2>Etendre le rapporteur</h2>
+</a>
+</p>
+ <p>
+ Plut&ocirc;t que de modifier l'affichage existant, vous voudrez peut-&ecirc;tre produire une pr&eacute;sentation HTML compl&egrave;tement diff&eacute;rente, ou m&ecirc;me g&eacute;n&eacute;rer une version texte ou XML. Plut&ocirc;t que de surcharger chaque m&eacute;thode dans <span class="new_code">HtmlReporter</span> nous pouvons nous rendre une &eacute;tape plus haut dans la hi&eacute;rarchie de classe vers <span class="new_code">SimpleReporter</span> dans le fichier source <em>simple_test.php</em>.
+ </p>
+ <p>
+ Un affichage sans rien, un canevas vierge pour votre propre cr&eacute;ation, serait...
+<pre>
+<strong>require_once('simpletest/simple_test.php');</strong>
+
+class MyDisplay extends SimpleReporter {<strong>
+ </strong>
+ function paintHeader($test_name) {
+ }
+
+ function paintFooter($test_name) {
+ }
+
+ function paintStart($test_name, $size) {<strong>
+ parent::paintStart($test_name, $size);</strong>
+ }
+
+ function paintEnd($test_name, $size) {<strong>
+ parent::paintEnd($test_name, $size);</strong>
+ }
+
+ function paintPass($message) {<strong>
+ parent::paintPass($message);</strong>
+ }
+
+ function paintFail($message) {<strong>
+ parent::paintFail($message);</strong>
+ }
+}
+</pre>
+ Aucune sortie ne viendrait de cette classe jusqu'&agrave; un ajout de votre part.
+ </p>
+
+ <p>
+<a class="target" name="cli">
+<h2>Le rapporteur en ligne de commande</h2>
+</a>
+</p>
+ <p>
+ SimpleTest est aussi livr&eacute; avec un rapporteur en ligne de commande, minime lui aussi. L'interface imite celle de JUnit, sauf qu'elle envoie les messages d'erreur au fur et &agrave; mesure de leur arriv&eacute;e. Pour utiliser le rapporteur en ligne de commande, il suffit de l'intervertir avec celui de la version HTML...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');
+
+ $test = &amp;new GroupTest('File test');
+ $test-&gt;addTestFile('tests/file_test.php');
+ $test-&gt;run(<strong>new TextReporter()</strong>);
+?&gt;
+</pre>
+ Et ensuite d'invoquer la suite de test &agrave; partir d'une ligne de commande...
+<pre class="shell">
+php file_test.php
+</pre>
+ Bien s&ucirc;r vous aurez besoin d'installer PHP en ligne de commande. Une suite de test qui passerait toutes ses assertions ressemble &agrave;...
+<pre class="shell">
+File test
+OK
+Test cases run: 1/1, Failures: 0, Exceptions: 0
+</pre>
+ Un &eacute;chec d&eacute;clenche un affichage comme...
+<pre class="shell">
+File test
+1) True assertion failed.
+ in createnewfile
+FAILURES!!!
+Test cases run: 1/1, Failures: 1, Exceptions: 0
+</pre>
+ </p>
+ <p>
+ Une des principales raisons pour utiliser une suite de test en ligne de commande tient dans l'utilisation possible du testeur avec un processus automatis&eacute;. Pour fonctionner comme il faut dans des scripts shell le script de test devrait renvoyer un code de sortie non-nul suite &agrave; un &eacute;chec. Si une suite de test &eacute;choue la valeur <span class="new_code">false</span> est renvoy&eacute;e par la m&eacute;thode <span class="new_code">SimpleTest::run()</span>. Nous pouvons utiliser ce r&eacute;sultat pour terminer le script avec la bonne valeur renvoy&eacute;e...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');
+
+ $test = &amp;new GroupTest('File test');
+ $test-&gt;addTestFile('tests/file_test.php');
+ <strong>exit ($test-&gt;run(new TextReporter()) ? 0 : 1);</strong>
+?&gt;
+</pre>
+ Bien s&ucirc;r l'objectif n'est pas de cr&eacute;er deux scripts de test, l'un en ligne de commande et l'autre pour un navigateur web, pour chaque suite de test. Le rapporteur en ligne de commande inclut une m&eacute;thode pour d&eacute;terminer l'environnement d'ex&eacute;cution...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');
+ require_once('simpletest/reporter.php');
+
+ $test = &amp;new GroupTest('File test');
+ $test-&gt;addTestFile('tests/file_test.php');
+ <strong>if (TextReporter::inCli()) {</strong>
+ exit ($test-&gt;run(new TextReporter()) ? 0 : 1);
+ <strong>}</strong>
+ $test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ Il s'agit l&agrave; de la forme utilis&eacute;e par SimpleTest lui-m&ecirc;me.
+ </p>
+
+ <p>
+<a class="target" name="xml">
+<h2>Test distant</h2>
+</a>
+</p>
+ <p>
+ SimpleTest est livr&eacute; avec une classe <span class="new_code">XmlReporter</span> utilis&eacute;e pour de la communication interne. Lors de son ex&eacute;cution, le r&eacute;sultat ressemble &agrave;...
+<pre class="shell">
+&lt;?xml version="1.0"?&gt;
+&lt;run&gt;
+ &lt;group size="4"&gt;
+ &lt;name&gt;Remote tests&lt;/name&gt;
+ &lt;group size="4"&gt;
+ &lt;name&gt;Visual test with 48 passes, 48 fails and 4 exceptions&lt;/name&gt;
+ &lt;case&gt;
+ &lt;name&gt;testofunittestcaseoutput&lt;/name&gt;
+ &lt;test&gt;
+ &lt;name&gt;testofresults&lt;/name&gt;
+ &lt;pass&gt;This assertion passed&lt;/pass&gt;
+ &lt;fail&gt;This assertion failed&lt;/fail&gt;
+ &lt;/test&gt;
+ &lt;test&gt;
+ ...
+ &lt;/test&gt;
+ &lt;/case&gt;
+ &lt;/group&gt;
+ &lt;/group&gt;
+&lt;/run&gt;
+</pre>
+ Vous pouvez utiliser ce format avec le parseur fourni dans SimpleTest lui-m&ecirc;me. Il s'agit de <span class="new_code">SimpleTestXmlParser</span> et se trouve <em>xml.php</em> &agrave; l'int&eacute;rieur du paquet SimpleTest...
+<pre>
+&lt;?php
+ require_once('simpletest/xml.php');
+
+ ...
+ $parser = &amp;new SimpleTestXmlParser(new HtmlReporter());
+ $parser-&gt;parse($test_output);
+?&gt;
+</pre>
+ <span class="new_code">$test_output</span> devrait &ecirc;tre au format XML, &agrave; partir du rapporteur XML, et pourrait venir d'une ex&eacute;cution en ligne de commande d'un sc&eacute;nario de test. Le parseur envoie des &eacute;v&egrave;nements au rapporteur exactement comme tout autre ex&eacute;cution de test. Il y a des occasions bizarres dans lesquelles c'est en fait tr&egrave;s utile.
+ </p>
+ <p>
+ Un probl&egrave;me des tr&egrave;s grandes suites de test , c'est qu'elles peuvent venir &agrave; bout de la limite de m&eacute;moire par d&eacute;faut d'un process PHP - 8Mb. En pla&ccedil;ant la sortie des groupes de test dans du XML et leur ex&eacute;cution dans des process diff&eacute;rents, le r&eacute;sultat peut &ecirc;tre pars&eacute; &agrave; nouveau pour agr&eacute;ger les r&eacute;sultats avec moins d'impact sur le test au premier niveau.
+ </p>
+ <p>
+ Parce que la sortie XML peut venir de n'importe o&ugrave;, &ccedil;a ouvre des possibilit&eacute;s d'agr&eacute;gation d'ex&eacute;cutions de test depuis des serveur distants. Un sc&eacute;nario de test pour le r&eacute;aliser existe d&eacute;j&agrave; &agrave; l'int&eacute;rieur du framework SimpleTest, mais il est encore exp&eacute;rimental...
+<pre>
+&lt;?php
+ <strong>require_once('../remote.php');</strong>
+ require_once('../reporter.php');
+
+ $test_url = ...;
+ $dry_url = ...;
+
+ $test = &amp;new GroupTest('Remote tests');
+ $test-&gt;addTestCase(<strong>new RemoteTestCase($test_url, $dry_url)</strong>);
+ $test-&gt;run(new HtmlReporter());
+?&gt;
+</pre>
+ <span class="new_code">RemoteTestCase</span> prend la localisation r&eacute;elle du lanceur de test, tout simplement un page web au format XML. Il prend aussi l'URL d'un rapporteur initi&eacute; pour effectuer une ex&eacute;cution s&egrave;che. Cette technique est employ&eacute;e pour que les progr&egrave;s soient correctement rapport&eacute;s vers le haut. <span class="new_code">RemoteTestCase</span> peut &ecirc;tre ajout&eacute; &agrave; une suite de test comme n'importe quel autre groupe de tests.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ La page du projet SimpleTest sur <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ La page de t&eacute;l&eacute;chargement de SimpleTest sur <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+<li>
+ L'<a href="http://simpletest.sourceforge.net/">API pour d&eacute;veloppeur de SimpleTest</a> donne tous les d&eacute;tails sur les classes et les assertions disponibles.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/fr/server_stubs_documentation.html b/tests/simpletest/docs/fr/server_stubs_documentation.html
new file mode 100755
index 0000000000..9c45663548
--- /dev/null
+++ b/tests/simpletest/docs/fr/server_stubs_documentation.html
@@ -0,0 +1,315 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Documentation SimpleTest : les bouchons serveur</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Documentation sur les bouchons serveur</h1>
+ This page...
+ <ul>
+<li>
+ <a href="#quoi">Que sont les bouchons ?</a>
+ </li>
+<li>
+ <a href="#creation">Cr&eacute;er des bouchons serveur</a> avec SimpleTest.
+ </li>
+<li>
+ <a href="#modeles">Mod&egrave;les de simulation</a> pour simuler des interactions d'objet plus complexes.
+ </li>
+<li>
+ <a href="#options">Options &agrave; la g&eacute;n&eacute;ration</a> pour diff&eacute;rents contextes.
+ </li>
+</ul>
+<div class="content">
+ <p>
+<a class="target" name="quoi">
+<h2>Que sont les bouchons serveur ?</h2>
+</a>
+</p>
+ <p>
+ Au d&eacute;part il s'agit d'un mod&egrave;le de conception initi&eacute; par Robert Binder (Testing object-oriented systems: models, patterns, and tools, Addison-Wesley) in 1999. Un bouchon serveur est une simulation d'un objet ou d'un composant. Il doit remplacer exactement un composant dans un syst&egrave;me pour des raisons de testabilit&eacute; ou de prototypage, tout en restant l&eacute;ger. Il permet aux tests de tourner plus rapidement ou alors, si la classe simul&eacute;e n'a pas &eacute;t&eacute; &eacute;crite, juste de fonctionner.
+ </p>
+
+ <p>
+<a class="target" name="creation">
+<h2>Cr&eacute;er des bouchons serveur</h2>
+</a>
+</p>
+ <p>
+ Nous avons juste besoin d'une classe pr&eacute;existante, par exemple une connexion vers une base de donn&eacute;es qui ressemblerait &agrave;...
+<pre>
+<strong>class DatabaseConnection {
+ function DatabaseConnection() {
+ }
+
+ function query() {
+ }
+
+ function selectQuery() {
+ }
+}</strong>
+</pre>
+ La classe n'a m&ecirc;me pas encore besoin d'avoir &eacute;t&eacute; impl&eacute;ment&eacute;e. Pour cr&eacute;er la version bouchonn&eacute;e de cette classe, nous incluons la librairie de bouchon serveur et ex&eacute;cutons le g&eacute;n&eacute;rateur...
+<pre>
+<strong>require_once('simpletest/mock_objects.php');
+require_once('database_connection.php');
+Stub::generate('DatabaseConnection');</strong>
+</pre>
+ Est g&eacute;n&eacute;r&eacute; un clone de la classe appel&eacute; <span class="new_code">StubDatabaseConnection</span>. Nous pouvons alors cr&eacute;er des instances de cette nouvelle classe &agrave; l'int&eacute;rieur de notre prototype de script...
+<pre>
+require_once('simpletest/mock_objects.php');
+require_once('database_connection.php');
+Stub::generate('DatabaseConnection');
+<strong>
+$connection = new StubDatabaseConnection();
+</strong>
+</pre>
+ La version bouchonn&eacute;e de la classe contient toutes les m&eacute;thodes de l'original de telle sorte qu'une op&eacute;ration comme <span class="new_code">$connection-&gt;query()</span> soit encore l&eacute;gale. La valeur retourn&eacute;e sera <span class="new_code">null</span>, Mais nous pouvons y rem&eacute;dier avec...
+<pre>
+<strong>$connection-&gt;setReturnValue('query', 37)</strong>
+</pre>
+ D&eacute;sormais &agrave; chaque appel de <span class="new_code">$connection-&gt;query()</span> nous obtenons un r&eacute;sultat de 37. Nous pouvons choisir n'importe quelle valeur pour le r&eacute;sultat, par exemple un hash de r&eacute;sultats provenant d'une base de donn&eacute;es imaginaire ou alors une liste d'objets persistants. Peu importe les param&egrave;tres, nous obtenons syst&eacute;matiquement les m&ecirc;me valeurs chaque fois qu'ils ont &eacute;t&eacute; initialis&eacute;s de la sorte : &ccedil;a ne ressemble peut-&ecirc;tre pas &agrave; une r&eacute;ponse convaincante venant d'une connexion vers une base de donn&eacute;es. Mais pour la demi-douzaine de lignes d'une m&eacute;thode de test c'est souvent largement suffisant.
+ </p>
+
+ <p>
+<a class="target" name="mod%C3%A8les">
+<h2>Mod&egrave;les de simulation</h2>
+</a>
+</p>
+ <p>
+ Sauf que les choses ne sont que rarement aussi simples. Parmi les probl&egrave;mes les plus courants on trouve les it&eacute;rateurs : le renvoi d'une valeur constante peut causer une boucle infini dans l'objet test&eacute;. Pour ceux-ci nous avons besoin de mettre sur pied une suite de valeurs. Prenons par exemple un it&eacute;rateur simple qui ressemble &agrave;...
+<pre>
+class Iterator {
+ function Iterator() {
+ }
+
+ function next() {
+ }
+}
+</pre>
+ C'est probablement le plus simple des it&eacute;rateurs possibles. Supposons que cet it&eacute;rateur ne retourne que du texte, jusqu'&agrave; la fin - quand il retourne <span class="new_code">false</span>. Une simulation est possible avec...
+<pre>
+<strong>Stub::generate('Iterator');
+
+$iterator = new StubIterator();
+$iterator-&gt;setReturnValue('next', false);
+$iterator-&gt;setReturnValueAt(0, 'next', 'First string');
+$iterator-&gt;setReturnValueAt(1, 'next', 'Second string');</strong>
+</pre>
+ A l'appel de <span class="new_code">next()</span> sur l'it&eacute;rateur bouchonn&eacute; il va d'abord renvoyer "First string", puis au second appel c'est "Second string" qui sera renvoy&eacute;. Finalement pour tous les autres appels, il s'agira d'un <span class="new_code">false</span>. Les valeurs renvoy&eacute;es successivement ont priorit&eacute; sur la valeur constante renvoy&eacute;. Cette derni&egrave;re est un genre de valeur par d&eacute;faut.
+ </p>
+ <p>
+ Une autre situation d&eacute;licate est une op&eacute;ration <span class="new_code">get()</span> surcharg&eacute;e. Un exemple ? Un porteur d'information avec des pairs de clef / valeur. Prenons une classe de configuration...
+<pre>
+class Configuration {
+ function Configuration() {
+ }
+
+ function getValue($key) {
+ }
+}
+</pre>
+ Il s'agit d'une situation propice &agrave; l'utilisation d'objets bouchon, surtout que la configuration en production d&eacute;pend invariablement de la machine : l'utiliser directement ne va pas nous aider &agrave; maintenir notre confiance dans nos tests. Sauf que le probl&egrave;me tient de ce que toutes les donn&eacute;es proviennent de la m&eacute;thode <span class="new_code">getValue()</span> et que nous voulons des r&eacute;sultats diff&eacute;rents suivant la clef. Par chance les bouchons ont un syst&egrave;me de filtre...
+<pre>
+<strong>Stub::generate('Configuration');
+
+$config = &amp;new StubConfiguration();
+$config-&gt;setReturnValue('getValue', 'primary', array('db_host'));
+$config-&gt;setReturnValue('getValue', 'admin', array('db_user'));
+$config-&gt;setReturnValue('getValue', 'secret', array('db_password'));</strong>
+</pre>
+ Ce param&egrave;tre suppl&eacute;mentaire est une liste d'arguments que l'on peut utiliser. Dans ce cas nous essayons d'utiliser un unique argument, &agrave; savoir la clef recherch&eacute;e. Maintenant quand on invoque le bouchon serveur via la m&eacute;thode <span class="new_code">getValue()</span> avec...
+<pre>
+$config-&gt;getValue('db_user');
+</pre>
+ ...il renvoie "admin". Il le trouve en essayant d'assortir successivement les arguments d'entr&eacute;e avec sa liste de ceux de sortie jusqu'au moment o&ugrave; une correspondance exacte est trouv&eacute;e.
+ </p>
+ <p>
+ Vous pouvez d&eacute;finir un argument par d&eacute;faut avec...
+<pre>
+<strong>
+$config-&gt;setReturnValue('getValue', false, array('*'));</strong>
+</pre>
+ Attention ce n'est pas &eacute;quivalent &agrave; initialiser la valeur retourn&eacute;e sans aucun argument.
+<pre>
+<strong>
+$config-&gt;setReturnValue('getValue', false);</strong>
+</pre>
+ Dans le premier cas il acceptera n'importe quel argument, mais exactement un -- pas plus -- est n&eacute;cessaire. Dans le second cas n'importe quel nombre d'arguments fera l'affaire : il agit comme un <cite>catchall</cite> apr&egrave;s tous les correspondances. Prenez garde &agrave; l'ordre : si nous ajoutons un autre param&egrave;tre apr&egrave;s le joker ('*') il sera ignor&eacute; puisque le joker aura &eacute;t&eacute; trouv&eacute; auparavant. Avec des listes de param&egrave;tres complexes l'ordre peut devenir crucial, au risque de perdre des correspondances souhait&eacute;es, masqu&eacute;es par un joker ant&eacute;rieur. Pensez &agrave; mettre d'abord les cas les plus sp&eacute;cifiques si vous n'&ecirc;tes pas s&ucirc;r.
+ </p>
+ <p>
+ Il y a des fois o&ugrave; l'on souhaite qu'un objet sp&eacute;cifique soit servi par le bouchon plut&ocirc;t qu'une simple copie. La s&eacute;mantique de la copie en PHP nous force &agrave; utiliser une autre m&eacute;thode pour cela. Vous &ecirc;tes peut-&ecirc;tre en train de simuler un conteneur par exemple...
+<pre>
+class Thing {
+}
+
+class Vector {
+ function Vector() {
+ }
+
+ function get($index) {
+ }
+}
+</pre>
+ Dans ce cas vous pouvez mettre une r&eacute;f&eacute;rence dans la liste renvoy&eacute;e par le bouchon...
+<pre>
+Stub::generate('Vector');
+
+$thing = new Thing();<strong>
+$vector = &amp;new StubVector();
+$vector-&gt;setReturnReference('get', $thing, array(12));</strong>
+</pre>
+ Avec ce petit arrangement vous vous assurez qu'&agrave; chaque fois que <span class="new_code">$vector-&gt;get(12)</span> est appel&eacute; il renverra le m&ecirc;me <span class="new_code">$thing</span>.
+ </p>
+ <p>
+ Ces trois facteurs, ordre, param&egrave;tres et copie (ou r&eacute;f&eacute;rence), peuvent &ecirc;tre combin&eacute;s orthogonalement. Par exemple...
+<pre>
+$complex = &amp;new StubComplexThing();
+$stuff = new Stuff();<strong>
+$complex-&gt;setReturnReferenceAt(3, 'get', $stuff, array('*', 1));</strong>
+</pre>
+ Le <span class="new_code">$stuff</span> ne sera renvoy&eacute; qu'au troisi&egrave;me appel et seulement si deux param&egrave;tres &eacute;taient indiqu&eacute;s, avec la contrainte que le second de ceux-ci soit l'entier 1. N'est-ce pas suffisant pour des situations de prototypage simple ?
+ </p>
+ <p>
+ Un dernier cas critique reste celle d'un objet en cr&eacute;ant un autre, connu sous le nom du mod&egrave;le factory - fabrique. Supposons qu'apr&egrave;s une requ&ecirc;te r&eacute;ussie &agrave; notre base de donn&eacute;es imaginaire, un ensemble de r&eacute;sultats est retourn&eacute; sous la forme d'un it&eacute;rateur, chaque appel &agrave; <span class="new_code">next()</span> donnant une ligne et &agrave; la fin un <span class="new_code">false</span>.
+ Au premier abord, &ccedil;a donne l'impression d'&ecirc;tre cauchemardesque &agrave; simuler. Alors qu'en fait tout peut &ecirc;tre bouchonn&eacute; en utilisant les m&eacute;canismes ci-dessus.
+ </p>
+ <p>
+ Voici comment...
+<pre>
+Stub::generate('DatabaseConnection');
+Stub::generate('ResultIterator');
+
+class DatabaseTest extends UnitTestCase {
+
+ function testUserFinder() {<strong>
+ $result = &amp;new StubResultIterator();
+ $result-&gt;setReturnValue('next', false);
+ $result-&gt;setReturnValueAt(0, 'next', array(1, 'tom'));
+ $result-&gt;setReturnValueAt(1, 'next', array(3, 'dick'));
+ $result-&gt;setReturnValueAt(2, 'next', array(6, 'harry'));
+
+ $connection = &amp;new StubDatabaseConnection();
+ $connection-&gt;setReturnValue('query', false);
+ $connection-&gt;setReturnReference(
+ 'query',
+ $result,
+ array('select id, name from users'));</strong>
+
+ $finder = &amp;new UserFinder($connection);
+ $this-&gt;assertIdentical(
+ $finder-&gt;findNames(),
+ array('tom', 'dick', 'harry'));
+ }
+}
+</pre>
+ D&eacute;sormais ce n'est que si notre <span class="new_code">$connection</span> est appel&eacute; avec la bonne <span class="new_code">query()</span> que le <span class="new_code">$result</span> sera renvoy&eacute; apr&egrave;s le troisi&egrave;me appel &agrave; <span class="new_code">next()</span>. Cela devrait &ecirc;tre suffisant pour que notre classe <span class="new_code">UserFinder</span>, la classe effectivement test&eacute;e &agrave; ce niveau, puisse s'ex&eacute;cuter comme il faut. Un test tr&egrave;s pr&eacute;cis et pas une seule base de donn&eacute;es &agrave; l'horizon.
+ </p>
+
+ <p>
+<a class="target" name="options">
+<h2>Options de cr&eacute;ation pour les bouchons</h2>
+</a>
+</p>
+ <p>
+ Il y a d'autres options additionnelles &agrave; la cr&eacute;ation d'un bouchon. Au moment de la g&eacute;n&eacute;ration nous pouvons changer le nom de la classe...
+<pre>
+<strong>Stub::generate('Iterator', 'MyStubIterator');
+$iterator = &amp;new MyStubIterator();
+</strong>
+</pre>
+ Pris tout seul ce n'est pas tr&egrave;s utile &eacute;tant donn&eacute; qu'il n'y aurait pas de diff&eacute;rence entre cette classe et celle par d&eacute;faut -- &agrave; part le nom bien entendu. Par contre nous pouvons aussi lui ajouter d'autres m&eacute;thodes qui ne se trouveraient pas dans l'interface originale...
+<pre>
+class Iterator {
+}
+<strong>Stub::generate('Iterator', 'PrototypeIterator', array('next', 'isError'));
+$iterator = &amp;new PrototypeIterator();
+$iterator-&gt;setReturnValue('next', 0);
+</strong>
+</pre>
+ Les m&eacute;thodes <span class="new_code">next()</span> et <span class="new_code">isError()</span> peuvent maintenant renvoyer des ensembles de valeurs exactement comme si elles existaient dans la classe originale.
+ </p>
+ <p>
+ Un moyen encore plus &eacute;sot&eacute;rique de modifier les bouchons est de changer le joker utilis&eacute; par d&eacute;faut pour la correspondance des param&egrave;tres.
+<pre>
+<strong>Stub::generate('Connection');
+$iterator = &amp;new StubConnection('wild');
+$iterator-&gt;setReturnValue('query', array('id' =&gt; 33), array('wild'));
+</strong>
+</pre>
+ L'unique raison valable pour effectuer cette op&eacute;ration, c'est quand vous souhaitez tester la cha&icirc;ne "*" sans pour autant l'interpr&eacute;ter comme un "n'importe lequel".
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ La page du projet SimpleTest sur <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ La page de t&eacute;l&eacute;chargement de SimpleTest sur <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+<li>
+ <a href="http://simpletest.sourceforge.net/">L'API compl&egrave;te pour SimpleTest</a> g&eacute;n&eacute;r&eacute;e par PHPDoc.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/fr/unit_test_documentation.html b/tests/simpletest/docs/fr/unit_test_documentation.html
new file mode 100755
index 0000000000..8e0aa1933b
--- /dev/null
+++ b/tests/simpletest/docs/fr/unit_test_documentation.html
@@ -0,0 +1,339 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Documentation SimpleTest pour les tests de r&eacute;gression en PHP</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Documentation sur les tests unitaires en PHP</h1>
+ This page...
+ <ul>
+<li>
+ <a href="#unitaire">Sc&eacute;narios de test unitaire</a> et op&eacute;rations basiques.
+ </li>
+<li>
+ <a href="#extension_unitaire">&Eacute;tendre des sc&eacute;narios de test</a> pour les personnaliser &agrave; votre propre projet.
+ </li>
+<li>
+ <a href="#lancement_unitaire">Lancer un sc&eacute;nario seul</a> comme un script unique.
+ </li>
+</ul>
+<div class="content">
+ <p>
+<a class="target" name="unitaire">
+<h2>Sc&eacute;narios de tests unitaires</h2>
+</a>
+</p>
+ <p>
+ Le coeur du syst&egrave;me est un framework de tests de r&eacute;gression construit autour des sc&eacute;narios de test. Un exemple de sc&eacute;nario de test ressemble &agrave;...
+<pre>
+<strong>class FileTestCase extends UnitTestCase {
+}</strong>
+</pre>
+ Si aucun nom de test n'est fourni au moment de la liaison avec le constructeur alors le nom de la classe sera utilis&eacute;. Il s'agit du nom qui sera affich&eacute; dans les r&eacute;sultats du test.
+ </p>
+ <p>
+ Les v&eacute;ritables tests sont ajout&eacute;s en tant que m&eacute;thode dans le sc&eacute;nario de test dont le nom par d&eacute;faut commence par la cha&icirc;ne "test" et quand le sc&eacute;nario de test est appel&eacute; toutes les m&eacute;thodes de ce type sont ex&eacute;cut&eacute;es dans l'ordre utilis&eacute; par l'introspection de PHP pour les trouver. Peuvent &ecirc;tre ajout&eacute;es autant de m&eacute;thodes de test que n&eacute;cessaires. Par exemple...
+<pre>
+require_once('../classes/writer.php');
+
+class FileTestCase extends UnitTestCase {
+ function FileTestCase() {
+ $this-&gt;UnitTestCase('File test');
+ }<strong>
+
+ function setUp() {
+ @unlink('../temp/test.txt');
+ }
+
+ function tearDown() {
+ @unlink('../temp/test.txt');
+ }
+
+ function testCreation() {
+ $writer = &amp;new FileWriter('../temp/test.txt');
+ $writer-&gt;write('Hello');
+ $this-&gt;assertTrue(file_exists('../temp/test.txt'), 'File created');
+ }</strong>
+}
+</pre>
+ Le constructeur est optionnel et souvent omis. Sans nom, le nom de la classe est utilis&eacute; comme nom pour le sc&eacute;nario de test.
+ </p>
+ <p>
+ Notre unique m&eacute;thode de test pour le moment est <span class="new_code">testCreation()</span> o&ugrave; nous v&eacute;rifions qu'un fichier a bien &eacute;t&eacute; cr&eacute;&eacute; par notre objet <span class="new_code">Writer</span>. Nous pourrions avoir mis le code <span class="new_code">unlink()</span> dans cette m&eacute;thode, mais en la pla&ccedil;ant dans <span class="new_code">setUp()</span> et <span class="new_code">tearDown()</span> nous pouvons l'utiliser pour nos autres m&eacute;thodes de test que nous ajouterons.
+ </p>
+ <p>
+ La m&eacute;thode <span class="new_code">setUp()</span> est lanc&eacute; juste avant chaque m&eacute;thode de test. <span class="new_code">tearDown()</span> est lanc&eacute; apr&egrave;s chaque m&eacute;thode de test.
+ </p>
+ <p>
+ Vous pouvez placer une initialisation de sc&eacute;nario de test dans le constructeur afin qu'elle soit lanc&eacute;e pour toutes les m&eacute;thodes dans le sc&eacute;nario de test mais dans un tel cas vous vous exposeriez &agrave; des interf&eacute;rences. Cette fa&ccedil;on de faire est l&eacute;g&egrave;rement moins rapide, mais elle est plus s&ucirc;re. Notez que si vous arrivez avec des notions de JUnit, il ne s'agit pas du comportement auquel vous &ecirc;tes habitu&eacute;s. Bizarrement JUnit re-instancie le sc&eacute;nario de test pour chaque m&eacute;thode de test pour se pr&eacute;venir d'une telle interf&eacute;rence. SimpleTest demande &agrave; l'utilisateur final d'utiliser <span class="new_code">setUp()</span>, mais fournit aux codeurs de biblioth&egrave;que d'autres crochets.
+ </p>
+ <p>
+ Pour rapporter les r&eacute;sultats de test, le passage par une classe d'affichage - notifi&eacute;e par les diff&eacute;rentes m&eacute;thodes de type <span class="new_code">assert...()</span> - est utilis&eacute;e. En voici la liste compl&egrave;te pour la classe <span class="new_code">UnitTestCase</span>, celle par d&eacute;faut dans SimpleTest...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">assertTrue($x)</span></td><td>Echoue si $x est faux</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertFalse($x)</span></td><td>Echoue si $x est vrai</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNull($x)</span></td><td>Echoue si $x est initialis&eacute;</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNotNull($x)</span></td><td>Echoue si $x n'est pas initialis&eacute;</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertIsA($x, $t)</span></td><td>Echoue si $x n'est pas de la classe ou du type $t</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertEqual($x, $y)</span></td><td>Echoue si $x == $y est faux</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNotEqual($x, $y)</span></td><td>Echoue si $x == $y est vrai</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertIdentical($x, $y)</span></td><td>Echoue si $x === $y est faux</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNotIdentical($x, $y)</span></td><td>Echoue si $x === $y est vrai</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertReference($x, $y)</span></td><td>Echoue sauf si $x et $y sont la m&ecirc;me variable</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertCopy($x, $y)</span></td><td>Echoue si $x et $y sont la m&ecirc;me variable</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertWantedPattern($p, $x)</span></td><td>Echoue sauf si l'expression rationnelle $p capture $x</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNoUnwantedPattern($p, $x)</span></td><td>Echoue si l'expression rationnelle $p capture $x</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNoErrors()</span></td><td>Echoue si une erreur PHP arrive</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertError($x)</span></td><td>Echoue si aucune erreur ou message incorrect de PHP n'arrive</td>
+</tr>
+ </tbody>
+</table>
+ Toutes les m&eacute;thodes d'assertion peuvent recevoir une description optionnelle : cette description sert pour &eacute;tiqueter le r&eacute;sultat.
+ Sans elle, une message par d&eacute;faut est envoy&eacute;e &agrave; la place : il est g&eacute;n&eacute;ralement suffisant. Ce message par d&eacute;faut peut encore &ecirc;tre encadr&eacute; dans votre propre message si vous incluez "%s" dans la cha&icirc;ne. Toutes les assertions renvoient vrai / true en cas de succ&egrave;s et faux / false en cas d'&eacute;chec.
+ </p>
+ <p>
+ D'autres exemples...
+<pre>
+<strong>$variable = null;
+$this-&gt;assertNull($variable, 'Should be cleared');</strong>
+</pre>
+ ...passera et normalement n'affichera aucun message. Si vous avez <a href="http://www.lastcraft.com/display_subclass_tutorial.php">configur&eacute; le testeur pour afficher aussi les succ&egrave;s</a> alors le message sera affich&eacute; comme tel.
+<pre>
+<strong>$this-&gt;assertIdentical(0, false, 'Zero is not false [%s]');</strong>
+</pre>
+ Ceci &eacute;chouera &eacute;tant donn&eacute; qu'il effectue une v&eacute;rification sur le type en plus d'une comparaison sur les deux valeurs. La partie "%s" est remplac&eacute;e par le message d'erreur par d&eacute;faut qui aurait &eacute;t&eacute; affich&eacute; si nous n'avions pas fourni le n&ocirc;tre. Cela nous permet d'embo&icirc;ter les messages de test.
+<pre>
+<strong>$a = 1;
+$b = $a;
+$this-&gt;assertReference($a, $b);</strong>
+</pre>
+ &Eacute;chouera &eacute;tant donn&eacute; que la variable <span class="new_code">$b</span> est une copie de <span class="new_code">$a</span>.
+<pre>
+<strong>$this-&gt;assertWantedPattern('/hello/i', 'Hello world');</strong>
+</pre>
+ L&agrave;, &ccedil;a passe puisque la recherche est insensible &agrave; la casse et que donc <span class="new_code">hello</span> est bien rep&eacute;rable dans <span class="new_code">Hello world</span>.
+<pre>
+<strong>trigger_error('Disaster');
+trigger_error('Catastrophe');
+$this-&gt;assertError();
+$this-&gt;assertError('Catastrophe');
+$this-&gt;assertNoErrors();</strong>
+</pre>
+ Ici, il y a besoin d'une petite explication : toutes passent !
+ </p>
+ <p>
+ Les erreurs PHP dans SimpleTest sont pi&eacute;g&eacute;es et plac&eacute;es dans une queue. Ici la premi&egrave;re v&eacute;rification d'erreur attrape le message "Disaster" sans v&eacute;rifier le texte et passe. R&eacute;sultat : l'erreur est supprim&eacute;e de la queue. La v&eacute;rification suivante teste non seulement l'existence de l'erreur mais aussi le texte qui correspond : un autre succ&egrave;s. D&eacute;sormais la queue est vide et le dernier test passe aussi. Si une autre erreur non v&eacute;rifi&eacute;e est encore dans la queue &agrave; la fin de notre m&eacute;thode de test alors une exception sera rapport&eacute;e dans le test. Notez que SimpleTest ne peut pas attraper les erreurs PHP &agrave; la compilation.
+ </p>
+ <p>
+ Les sc&eacute;narios de test peuvent utiliser des m&eacute;thodes bien pratiques pour d&eacute;boguer le code ou pour &eacute;tendre la suite...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">setUp()</span></td><td>Est lanc&eacute;e avant chaque m&eacute;thode de test</td>
+</tr>
+ <tr>
+<td><span class="new_code">tearDown()</span></td><td>Est lanc&eacute;e apr&egrave;s chaque m&eacute;thode de test</td>
+</tr>
+ <tr>
+<td><span class="new_code">pass()</span></td><td>Envoie un succ&egrave;s</td>
+</tr>
+ <tr>
+<td><span class="new_code">fail()</span></td><td>Envoie un &eacute;chec</td>
+</tr>
+ <tr>
+<td><span class="new_code">error()</span></td><td>Envoi un &eacute;v&egrave;nement exception</td>
+</tr>
+ <tr>
+<td><span class="new_code">sendMessage()</span></td><td>Envoie un message d'&eacute;tat aux syst&egrave;mes d'affichage qui le supporte</td>
+</tr>
+ <tr>
+<td><span class="new_code">signal($type, $payload)</span></td><td>Envoie un message d&eacute;fini par l'utilisateur au rapporteur du test</td>
+</tr>
+ <tr>
+<td><span class="new_code">dump($var)</span></td><td>Effectue un <span class="new_code">print_r()</span> format&eacute; pour du d&eacute;boguage rapide et grossier</td>
+</tr>
+ <tr>
+<td><span class="new_code">swallowErrors()</span></td><td>Vide les erreurs de la queue</td>
+</tr>
+ </tbody>
+</table>
+ </p>
+
+ <p>
+<a class="target" name="extension_unitaire">
+<h2>Etendre les sc&eacute;narios de test</h2>
+</a>
+</p>
+ <p>
+ Bien s&ucirc;r des m&eacute;thodes suppl&eacute;mentaires de test peuvent &ecirc;tre ajout&eacute;es pour cr&eacute;er d'autres types de sc&eacute;nario de test afin d'&eacute;tendre le framework...
+<pre>
+require_once('simpletest/unit_tester.php');
+<strong>
+class FileTester extends UnitTestCase {
+ function FileTester($name = false) {
+ $this-&gt;UnitTestCase($name);
+ }
+
+ function assertFileExists($filename, $message = '%s') {
+ $this-&gt;assertTrue(
+ file_exists($filename),
+ sprintf($message, 'File [$filename] existence check'));
+ }</strong>
+}
+</pre>
+ Ici la biblioth&egrave;que SimpleTest est localis&eacute;e dans un r&eacute;pertoire local appel&eacute; <em>simpletest</em>. Pensez &agrave; le modifier pour votre propre environnement.
+ </p>
+ <p>
+ Ce nouveau sc&eacute;nario peut &ecirc;tre h&eacute;rit&eacute; exactement comme un sc&eacute;nario de test classique...
+<pre>
+class FileTestCase extends <strong>FileTester</strong> {
+
+ function setUp() {
+ @unlink('../temp/test.txt');
+ }
+
+ function tearDown() {
+ @unlink('../temp/test.txt');
+ }
+
+ function testCreation() {
+ $writer = &amp;new FileWriter('../temp/test.txt');
+ $writer-&gt;write('Hello');<strong>
+ $this-&gt;assertFileExists('../temp/test.txt');</strong>
+ }
+}
+</pre>
+ </p>
+ <p>
+ Si vous souhaitez un sc&eacute;nario de test sans toutes les assertions de <span class="new_code">UnitTestCase</span> mais uniquement avec les v&ocirc;tres propres, vous aurez besoin d'&eacute;tendre la classe <span class="new_code">SimpleTestCase</span> &agrave; la place. Elle se trouve dans <em>simple_test.php</em> en lieu et place de <em>unit_tester.php</em>. A consulter <a href="group_test_documentation.html">plus tard</a> si vous souhaitez incorporer les sc&eacute;narios d'autres testeurs unitaires dans votre suite de test.
+ </p>
+
+ <p>
+<a class="target" name="lancement_unitaire">
+<h2>Lancer un unique sc&eacute;nario de test</h2>
+</a>
+</p>
+ <p>
+ Ce n'est pas souvent qu'il faille lancer des sc&eacute;narios avec un unique test. Sauf lorsqu'il s'agit de s'arracher les cheveux sur un module &agrave; probl&egrave;me sans pour autant d&eacute;sorganiser la suite de test principale. Voici l'&eacute;chafaudage n&eacute;cessaire pour lancer un sc&eacute;nario de test solitaire...
+<pre>
+&lt;?php
+ require_once('simpletest/unit_tester.php');<strong>
+ require_once('simpletest/reporter.php');</strong>
+ require_once('../classes/writer.php');
+
+ class FileTestCase extends UnitTestCase {
+ function FileTestCase() {
+ $this-&gt;UnitTestCase('File test');
+ }
+ }<strong>
+
+ $test = &amp;new FileTestCase();
+ $test-&gt;run(new HtmlReporter());</strong>
+?&gt;
+</pre>
+ Ce script sera lanc&eacute; tel que mais il n'y aura aucun succ&egrave;s ou &eacute;chec avant que des m&eacute;thodes de test soient ajout&eacute;es.
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ La page de SimpleTest sur <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ La page de t&eacute;l&eacute;chargement de SimpleTest sur <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+<li>
+ <a href="http://simpletest.sourceforge.net/">L'API compl&egrave;te de SimpleTest</a> &agrave; partir de PHPDoc.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/docs/fr/web_tester_documentation.html b/tests/simpletest/docs/fr/web_tester_documentation.html
new file mode 100755
index 0000000000..a39d229a78
--- /dev/null
+++ b/tests/simpletest/docs/fr/web_tester_documentation.html
@@ -0,0 +1,433 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Documentation SimpleTest : tester des scripts web</title>
+<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
+</head>
+<body>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<h1>Documentation sur le testeur web</h1>
+ This page...
+ <ul>
+<li>
+ R&eacute;ussir &agrave; <a href="#telecharger">t&eacute;l&eacute;charger une page web</a>
+ </li>
+<li>
+ Tester le <a href="#contenu">contenu de la page</a>
+ </li>
+<li>
+ <a href="#navigation">Naviguer sur un site web</a> pendant le test
+ </li>
+<li>
+ M&eacute;thodes pour <a href="#requete">modifier une requ&ecirc;te</a> et pour d&eacute;boguer
+ </li>
+</ul>
+<div class="content">
+ <p>
+<a class="target" name="telecharger">
+<h2>T&eacute;l&eacute;charger une page</h2>
+</a>
+</p>
+ <p>
+ Tester des classes c'est tr&egrave;s bien. Reste que PHP est avant tout un langage pour cr&eacute;er des fonctionnalit&eacute;s &agrave; l'int&eacute;rieur de pages web. Comment pouvons tester la partie de devant -- celle de l'interface -- dans nos applications en PHP ? Etant donn&eacute; qu'une page web n'est constitu&eacute;e que de texte, nous devrions pouvoir les examiner exactement comme n'importe quelle autre donn&eacute;e de test.
+ </p>
+ <p>
+ Cela nous am&egrave;ne &agrave; une situation d&eacute;licate. Si nous testons dans un niveau trop bas, v&eacute;rifier des balises avec un motif ad hoc par exemple, nos tests seront trop fragiles. Le moindre changement dans la pr&eacute;sentation pourrait casser un grand nombre de test. Si nos tests sont situ&eacute;s trop haut, en utilisant une version fantaisie du moteur de template pour donner un cas pr&eacute;cis, alors nous perdons compl&egrave;tement la capacit&eacute; &agrave; automatiser certaines classes de test. Par exemple, l'interaction entre des formulaires et la navigation devra &ecirc;tre test&eacute; manuellement. Ces types de test sont extr&ecirc;mement fastidieux et plut&ocirc;t sensibles aux erreurs.
+ </p>
+ <p>
+ SimpleTest comprend une forme sp&eacute;ciale de sc&eacute;nario de test pour tester les actions d'une page web. <span class="new_code">WebTestCase</span> inclut des facilit&eacute;s pour la navigation, des v&eacute;rifications sur le contenu et les cookies ainsi que la gestion des formulaires. Utiliser ces sc&eacute;narios de test ressemble fortement &agrave; <span class="new_code">UnitTestCase</span>...
+<pre>
+<strong>class TestOfLastcraft extends WebTestCase {
+}</strong>
+</pre>
+ Ici nous sommes sur le point de tester le site de <a href="http://www/lastcraft.com/">Last Craft</a>. Si ce sc&eacute;nario de test est situ&eacute; dans un fichier appel&eacute; <em>lastcraft_test.php</em> alors il peut &ecirc;tre charg&eacute; dans un script de lancement tout comme des tests unitaires...
+<pre>
+&lt;?php<strong>
+ require_once('simpletest/web_tester.php');</strong>
+ require_once('simpletest/reporter.php');
+
+ $test = &amp;new GroupTest('Web site tests');<strong>
+ $test-&gt;addTestFile('lastcraft_test.php');</strong>
+ exit ($test-&gt;run(new TextReporter()) ? 0 : 1);
+?&gt;
+</pre>
+ J'utilise ici le rapporteur en mode texte pour mieux distinguer le contenu au format HTML du r&eacute;sultat du test proprement dit.
+ </p>
+ <p>
+ Rien n'est encore test&eacute;. Nous pouvons t&eacute;l&eacute;charger la page d'accueil en utilisant la m&eacute;thode <span class="new_code">get()</span>...
+<pre>
+class TestOfLastcraft extends WebTestCase {
+ <strong>
+ function testHomepage() {
+ $this-&gt;assertTrue($this-&gt;get('http://www.lastcraft.com/'));
+ }</strong>
+}
+</pre>
+ La m&eacute;thode <span class="new_code">get()</span> renverra "true" uniquement si le contenu de la page a bien &eacute;t&eacute; t&eacute;l&eacute;charg&eacute;. C'est un moyen simple, mais efficace pour v&eacute;rifier qu'une page web a bien &eacute;t&eacute; d&eacute;livr&eacute; par le serveur web. Cependant le contenu peut r&eacute;v&eacute;ler &ecirc;tre une erreur 404 et dans ce cas notre m&eacute;thode <span class="new_code">get()</span> renverrait encore un succ&egrave;s.
+ </p>
+ <p>
+ En supposant que le serveur web pour le site Last Craft soit op&eacute;rationnel (malheureusement ce n'est pas toujours le cas), nous devrions voir...
+<pre class="shell">
+Web site tests
+OK
+Test cases run: 1/1, Failures: 0, Exceptions: 0
+</pre>
+ Nous avons v&eacute;rifi&eacute; qu'une page, de n'importe quel type, a bien &eacute;t&eacute; renvoy&eacute;e. Nous ne savons pas encore s'il s'agit de celle que nous souhaitions.
+ </p>
+
+ <p>
+<a class="target" name="contenu">
+<h2>Tester le contenu d'une page</h2>
+</a>
+</p>
+ <p>
+ Pour obtenir la confirmation que la page t&eacute;l&eacute;charg&eacute;e est bien celle que nous attendions, nous devons v&eacute;rifier son contenu.
+<pre>
+class TestOfLastcraft extends WebTestCase {
+
+ function testHomepage() {<strong>
+ $this-&gt;get('http://www.lastcraft.com/');
+ $this-&gt;assertWantedPattern('/why the last craft/i');</strong>
+ }
+}
+</pre>
+ La page obtenue par le dernier t&eacute;l&eacute;chargement est plac&eacute;e dans un buffer au sein m&ecirc;me du sc&eacute;nario de test. Il n'est donc pas n&eacute;cessaire de s'y r&eacute;f&eacute;rer directement. La correspondance du motif est toujours effectu&eacute;e par rapport &agrave; ce buffer.
+ </p>
+ <p>
+ Voici une liste possible d'assertions sur le contenu...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">assertWantedPattern($pattern)</span></td><td>V&eacute;rifier une correspondance sur le contenu via une expression rationnelle Perl</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNoUnwantedPattern($pattern)</span></td><td>Une expression rationnelle Perl pour v&eacute;rifier une absence</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertTitle($title)</span></td><td>Passe si le titre de la page correspond exactement</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertLink($label)</span></td><td>Passe si un lien avec ce texte est pr&eacute;sent</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNoLink($label)</span></td><td>Passe si aucun lien avec ce texte est pr&eacute;sent</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertLinkById($id)</span></td><td>Passe si un lien avec cet attribut d'identification est pr&eacute;sent</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertField($name, $value)</span></td><td>Passe si une balise input avec ce nom contient cette valeur</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertFieldById($id, $value)</span></td><td>Passe si une balise input avec cet identifiant contient cette valeur</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertResponse($codes)</span></td><td>Passe si la r&eacute;ponse HTTP trouve une correspondance dans la liste</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertMime($types)</span></td><td>Passe si le type MIME se retrouve dans cette liste</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertAuthentication($protocol)</span></td><td>Passe si l'authentification provoqu&eacute;e est de ce type de protocole</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNoAuthentication()</span></td><td>Passe s'il n'y pas d'authentification provoqu&eacute;e en cours</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertRealm($name)</span></td><td>Passe si le domaine provoqu&eacute; correspond</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertHeader($header, $content)</span></td><td>Passe si une ent&ecirc;te t&eacute;l&eacute;charg&eacute;e correspond &agrave; cette valeur</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNoUnwantedHeader($header)</span></td><td>Passe si une ent&ecirc;te n'a pas &eacute;t&eacute; t&eacute;l&eacute;charg&eacute;</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertHeaderPattern($header, $pattern)</span></td><td>Passe si une ent&ecirc;te t&eacute;l&eacute;charg&eacute;e correspond &agrave; cette expression rationnelle Perl</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertCookie($name, $value)</span></td><td>Passe s'il existe un cookie correspondant</td>
+</tr>
+ <tr>
+<td><span class="new_code">assertNoCookie($name)</span></td><td>Passe s'il n'y a pas de cookie avec un tel nom</td>
+</tr>
+ </tbody>
+</table>
+ Comme d'habitude avec les assertions de SimpleTest, elles renvoient toutes "false" en cas d'&eacute;chec et "true" si c'est un succ&egrave;s. Elles renvoient aussi un message de test optionnel : vous pouvez l'ajouter dans votre propre message en utilisant "%s".
+ </p>
+ <p>
+ A pr&eacute;sent nous pourrions effectu&eacute; le test sur le titre uniquement...
+<pre>
+<strong>$this-&gt;assertTitle('The Last Craft?');</strong>
+</pre>
+ En plus d'une simple v&eacute;rification sur le contenu HTML, nous pouvons aussi v&eacute;rifier que le type MIME est bien d'un type acceptable...
+<pre>
+<strong>$this-&gt;assertMime(array('text/plain', 'text/html'));</strong>
+</pre>
+ Plus int&eacute;ressant encore est la v&eacute;rification sur le code de la r&eacute;ponse HTTP. Pareillement au type MIME, nous pouvons nous assurer que le code renvoy&eacute; se trouve bien dans un liste de valeurs possibles...
+<pre>
+class TestOfLastcraft extends WebTestCase {
+
+ function testHomepage() {
+ $this-&gt;get('http://simpletest.sourceforge.net/');<strong>
+ $this-&gt;assertResponse(200);</strong>
+ }
+}
+</pre>
+ Ici nous v&eacute;rifions que le t&eacute;l&eacute;chargement s'est bien termin&eacute; en ne permettant qu'une r&eacute;ponse HTTP 200. Ce test passera, mais ce n'est pas la meilleure fa&ccedil;on de proc&eacute;der. Il n'existe aucune page sur <em>http://simpletest.sourceforge.net/</em>, &agrave; la place le serveur renverra une redirection vers <em>http://www.lastcraft.com/simple_test.php</em>. <span class="new_code">WebTestCase</span> suit automatiquement trois de ces redirections. Les tests sont quelque peu plus robustes de la sorte. Surtout qu'on est souvent plus int&eacute;ress&eacute; par l'interaction entre les pages que de leur simple livraison. Si les redirections se r&eacute;v&egrave;lent &ecirc;tre digne d'int&eacute;r&ecirc;t, il reste possible de les supprimer...
+<pre>
+class TestOfLastcraft extends WebTestCase {
+
+ function testHomepage() {<strong>
+ $this-&gt;setMaximumRedirects(0);</strong>
+ $this-&gt;get('http://simpletest.sourceforge.net/');
+ $this-&gt;assertResponse(200);
+ }
+}
+</pre>
+ Alors l'assertion &eacute;choue comme pr&eacute;vue...
+<pre class="shell">
+Web site tests
+1) Expecting response in [200] got [302]
+ in testhomepage
+ in testoflastcraft
+ in lastcraft_test.php
+FAILURES!!!
+Test cases run: 1/1, Failures: 1, Exceptions: 0
+</pre>
+ Nous pouvons modifier le test pour accepter les redirections...
+<pre>
+class TestOfLastcraft extends WebTestCase {
+
+ function testHomepage() {
+ $this-&gt;setMaximumRedirects(0);
+ $this-&gt;get('http://simpletest.sourceforge.net/');
+ $this-&gt;assertResponse(<strong>array(301, 302, 303, 307)</strong>);
+ }
+}
+</pre>
+ Maitenant &ccedil;a passe.
+ </p>
+
+ <p>
+<a class="target" name="navigation">
+<h2>Navigeur dans un site web</h2>
+</a>
+</p>
+ <p>
+ Les utilisateurs ne naviguent pas souvent en tapant les URLs, mais surtout en cliquant sur des liens et des boutons. Ici nous confirmons que les informations sur le contact peuvent &ecirc;tre atteintes depuis la page d'accueil...
+<pre>
+class TestOfLastcraft extends WebTestCase {
+ ...
+ function testContact() {
+ $this-&gt;get('http://www.lastcraft.com/');<strong>
+ $this-&gt;clickLink('About');
+ $this-&gt;assertTitle('About Last Craft');</strong>
+ }
+}
+</pre>
+ Le param&egrave;tre est le texte du lien.
+ </p>
+ <p>
+ Il l'objectif est un bouton plut&ocirc;t qu'une balise ancre, alors <span class="new_code">clickSubmit()</span> doit &ecirc;tre utilis&eacute; avec le titre du bouton...
+<pre>
+<strong>$this-&gt;clickSubmit('Go!');</strong>
+</pre>
+ </p>
+ <p>
+ La liste des m&eacute;thodes de navigation est...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">get($url, $parameters)</span></td><td>Envoie une requ&ecirc;te GET avec ces param&egrave;tres</td>
+</tr>
+ <tr>
+<td><span class="new_code">post($url, $parameters)</span></td><td>Envoie une requ&ecirc;te POST avec ces param&egrave;tres</td>
+</tr>
+ <tr>
+<td><span class="new_code">head($url, $parameters)</span></td><td>Envoie une requ&ecirc;te HEAD sans remplacer le contenu de la page</td>
+</tr>
+ <tr>
+<td><span class="new_code">retry()</span></td><td>Relance la derni&egrave;re requ&ecirc;te</td>
+</tr>
+ <tr>
+<td><span class="new_code">back()</span></td><td>Identique au bouton "Pr&eacute;c&eacute;dent" du navigateur</td>
+</tr>
+ <tr>
+<td><span class="new_code">forward()</span></td><td>Identique au bouton "Suivant" du navigateur</td>
+</tr>
+ <tr>
+<td><span class="new_code">authenticate($name, $password)</span></td><td>Re-essaye avec une tentative d'authentification</td>
+</tr>
+ <tr>
+<td><span class="new_code">getFrameFocus()</span></td><td>Le nom de la fen&ecirc;tre en cours d'utilisation</td>
+</tr>
+ <tr>
+<td><span class="new_code">setFrameFocusByIndex($choice)</span></td><td>Change le focus d'une fen&ecirc;tre en commen&ccedil;ant par 1</td>
+</tr>
+ <tr>
+<td><span class="new_code">setFrameFocus($name)</span></td><td>Change le focus d'une fen&ecirc;tre en utilisant son nom</td>
+</tr>
+ <tr>
+<td><span class="new_code">clearFrameFocus()</span></td><td>Revient &agrave; un traitement de toutes les fen&ecirc;tres comme une seule</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickSubmit($label)</span></td><td>Clique sur le premier bouton avec cette &eacute;tiquette</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickSubmitByName($name)</span></td><td>Clique sur le bouton avec cet attribut de nom</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickSubmitById($id)</span></td><td>Clique sur le bouton avec cet attribut d'identification</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickImage($label, $x, $y)</span></td><td>Clique sur une balise input de type image avec ce titre ou ce texte dans l'attribut alt</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickImageByName($name, $x, $y)</span></td><td>Clique sur une balise input de type image avec ce nom</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickImageById($id, $x, $y)</span></td><td>Clique sur une balise input de type image avec cet attribut d'identification</td>
+</tr>
+ <tr>
+<td><span class="new_code">submitFormById($id)</span></td><td>Soumet un formulaire sans valeur de soumission</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickLink($label, $index)</span></td><td>Clique sur une ancre avec ce texte d'&eacute;tiquette visible</td>
+</tr>
+ <tr>
+<td><span class="new_code">clickLinkById($id)</span></td><td>Clique sur une ancre avec cet attribut d'identification</td>
+</tr>
+ </tbody>
+</table>
+ </p>
+ <p>
+ Les param&egrave;tres dans les m&eacute;thodes <span class="new_code">get()</span>, <span class="new_code">post()</span> et <span class="new_code">head()</span> sont optionnels. Le t&eacute;l&eacute;chargement via HTTP HEAD ne modifie pas le contexte du navigateur, il se limite au chargement des cookies. Cela peut &ecirc;tre utilise lorsqu'une image ou une feuille de style initie un cookie pour bloquer un robot trop entreprenant.
+ </p>
+ <p>
+ Les commandes <span class="new_code">retry()</span>, <span class="new_code">back()</span> et <span class="new_code">forward()</span> fonctionnent exactement comme dans un navigateur. Elles utilisent l'historique pour relancer les pages. Une technique bien pratique pour v&eacute;rifier les effets d'un bouton retour sur vos formulaires.
+ </p>
+ <p>
+ Les m&eacute;thodes sur les fen&ecirc;tres m&eacute;ritent une petite explication. Par d&eacute;faut, une page avec des fen&ecirc;tres est trait&eacute;e comme toutes les autres. Le contenu sera v&eacute;rifi&eacute; &agrave; travers l'ensemble de la "frameset", par cons&eacute;quent un lien fonctionnera, peu importe la fen&ecirc;tre qui contient la balise ancre. Vous pouvez outrepass&eacute; ce comportement en exigeant le focus sur une unique fen&ecirc;tre. Si vous r&eacute;alisez cela, toutes les recherches et toutes les actions se limiteront &agrave; cette unique fen&ecirc;tre, y compris les demandes d'authentification. Si un lien ou un bouton n'est pas dans la fen&ecirc;tre en focus alors il ne peut pas &ecirc;tre cliqu&eacute;.
+ </p>
+ <p>
+ Tester la navigation sur des pages fixes ne vous alerte que quand vous avez cass&eacute; un script entier. Pour des pages fortement dynamiques, un forum de discussion par exemple, &ccedil;a peut &ecirc;tre crucial pour v&eacute;rifier l'&eacute;tat de l'application. Pour la plupart des applications cependant, la logique vraiment d&eacute;licate se situe dans la gestion des formulaires et des sessions. Heureusement SimpleTest aussi inclut <a href="form_testing_documentation.html">des outils pour tester des formulaires web</a>.
+ </p>
+
+ <p>
+<a class="target" name="requete">
+<h2>Modifier la requ&ecirc;te</h2>
+</a>
+</p>
+ <p>
+ Bien que SimpleTest n'ait pas comme objectif de contr&ocirc;ler des erreurs r&eacute;seau, il contient quand m&ecirc;me des m&eacute;thodes pour modifier et d&eacute;boguer les requ&ecirc;tes qu'il lance. Voici une autre liste de m&eacute;thode...
+ <table>
+<tbody>
+ <tr>
+<td><span class="new_code">getTransportError()</span></td><td>La derni&egrave;re erreur de socket</td>
+</tr>
+ <tr>
+<td><span class="new_code">getUrl()</span></td><td>La localisation courante</td>
+</tr>
+ <tr>
+<td><span class="new_code">showRequest()</span></td><td>D&eacute;verse la requ&ecirc;te sortante</td>
+</tr>
+ <tr>
+<td><span class="new_code">showHeaders()</span></td><td>D&eacute;verse les ent&ecirc;tes d'entr&eacute;e</td>
+</tr>
+ <tr>
+<td><span class="new_code">showSource()</span></td><td>D&eacute;verse le contenu brut de la page HTML</td>
+</tr>
+ <tr>
+<td><span class="new_code">ignoreFrames()</span></td><td>Ne recharge pas les framesets</td>
+</tr>
+ <tr>
+<td><span class="new_code">setCookie($name, $value)</span></td><td>Initie un cookie &agrave; partir de maintenant</td>
+</tr>
+ <tr>
+<td><span class="new_code">addHeader($header)</span></td><td>Ajoute toujours cette ent&ecirc;te &agrave; la requ&ecirc;te</td>
+</tr>
+ <tr>
+<td><span class="new_code">setMaximumRedirects($max)</span></td><td>S'arr&ecirc;te apr&egrave;s autant de redirections</td>
+</tr>
+ <tr>
+<td><span class="new_code">setConnectionTimeout($timeout)</span></td><td>Termine la connexion apr&egrave;s autant de temps entre les bytes</td>
+</tr>
+ <tr>
+<td><span class="new_code">useProxy($proxy, $name, $password)</span></td><td>Effectue les requ&ecirc;tes &agrave; travers ce proxy d'URL</td>
+</tr>
+ </tbody>
+</table>
+ </p>
+
+ </div>
+ References and related information...
+ <ul>
+<li>
+ La page du projet SimpleTest sur <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
+ </li>
+<li>
+ La page de t&eacute;l&eacute;chargement de SimpleTest sur <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
+ </li>
+<li>
+ <a href="http://simpletest.sourceforge.net/">L'API du d&eacute;veloppeur pour SimpleTest</a> donne tous les d&eacute;tails sur les classes et les assertions disponibles.
+ </li>
+</ul>
+<div class="menu_back">
+<div class="menu">
+<a href="index.html">SimpleTest</a>
+ |
+ <a href="overview.html">Overview</a>
+ |
+ <a href="unit_test_documentation.html">Unit tester</a>
+ |
+ <a href="group_test_documentation.html">Group tests</a>
+ |
+ <a href="mock_objects_documentation.html">Mock objects</a>
+ |
+ <a href="partial_mocks_documentation.html">Partial mocks</a>
+ |
+ <a href="reporter_documentation.html">Reporting</a>
+ |
+ <a href="expectation_documentation.html">Expectations</a>
+ |
+ <a href="web_tester_documentation.html">Web tester</a>
+ |
+ <a href="form_testing_documentation.html">Testing forms</a>
+ |
+ <a href="authentication_documentation.html">Authentication</a>
+ |
+ <a href="browser_documentation.html">Scriptable browser</a>
+</div>
+</div>
+<div class="copyright">
+ Copyright<br>Marcus Baker 2006
+ </div>
+</body>
+</html>
diff --git a/tests/simpletest/dumper.php b/tests/simpletest/dumper.php
new file mode 100755
index 0000000000..7725f55a88
--- /dev/null
+++ b/tests/simpletest/dumper.php
@@ -0,0 +1,360 @@
+<?php
+ /**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: dumper.php,v 1.29 2006/05/13 14:37:16 lastcraft Exp $
+ */
+ /**
+ * does type matter
+ */
+ if (! defined('TYPE_MATTERS')) {
+ define('TYPE_MATTERS', true);
+ }
+
+ /**
+ * Displays variables as text and does diffs.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class SimpleDumper {
+
+ /**
+ * Renders a variable in a shorter form than print_r().
+ * @param mixed $value Variable to render as a string.
+ * @return string Human readable string form.
+ * @access public
+ */
+ function describeValue($value) {
+ $type = $this->getType($value);
+ switch($type) {
+ case "Null":
+ return "NULL";
+ case "Boolean":
+ return "Boolean: " . ($value ? "true" : "false");
+ case "Array":
+ return "Array: " . count($value) . " items";
+ case "Object":
+ return "Object: of " . get_class($value);
+ case "String":
+ return "String: " . $this->clipString($value, 200);
+ default:
+ return "$type: $value";
+ }
+ return "Unknown";
+ }
+
+ /**
+ * Gets the string representation of a type.
+ * @param mixed $value Variable to check against.
+ * @return string Type.
+ * @access public
+ */
+ function getType($value) {
+ if (! isset($value)) {
+ return "Null";
+ } elseif (is_bool($value)) {
+ return "Boolean";
+ } elseif (is_string($value)) {
+ return "String";
+ } elseif (is_integer($value)) {
+ return "Integer";
+ } elseif (is_float($value)) {
+ return "Float";
+ } elseif (is_array($value)) {
+ return "Array";
+ } elseif (is_resource($value)) {
+ return "Resource";
+ } elseif (is_object($value)) {
+ return "Object";
+ }
+ return "Unknown";
+ }
+
+ /**
+ * Creates a human readable description of the
+ * difference between two variables. Uses a
+ * dynamic call.
+ * @param mixed $first First variable.
+ * @param mixed $second Value to compare with.
+ * @param boolean $identical If true then type anomolies count.
+ * @return string Description of difference.
+ * @access public
+ */
+ function describeDifference($first, $second, $identical = false) {
+ if ($identical) {
+ if (! $this->_isTypeMatch($first, $second)) {
+ return "with type mismatch as [" . $this->describeValue($first) .
+ "] does not match [" . $this->describeValue($second) . "]";
+ }
+ }
+ $type = $this->getType($first);
+ if ($type == "Unknown") {
+ return "with unknown type";
+ }
+ $method = '_describe' . $type . 'Difference';
+ return $this->$method($first, $second, $identical);
+ }
+
+ /**
+ * Tests to see if types match.
+ * @param mixed $first First variable.
+ * @param mixed $second Value to compare with.
+ * @return boolean True if matches.
+ * @access private
+ */
+ function _isTypeMatch($first, $second) {
+ return ($this->getType($first) == $this->getType($second));
+ }
+
+ /**
+ * Clips a string to a maximum length.
+ * @param string $value String to truncate.
+ * @param integer $size Minimum string size to show.
+ * @param integer $position Centre of string section.
+ * @return string Shortened version.
+ * @access public
+ */
+ function clipString($value, $size, $position = 0) {
+ $length = strlen($value);
+ if ($length <= $size) {
+ return $value;
+ }
+ $position = min($position, $length);
+ $start = ($size/2 > $position ? 0 : $position - $size/2);
+ if ($start + $size > $length) {
+ $start = $length - $size;
+ }
+ $value = substr($value, $start, $size);
+ return ($start > 0 ? "..." : "") . $value . ($start + $size < $length ? "..." : "");
+ }
+
+ /**
+ * Creates a human readable description of the
+ * difference between two variables. The minimal
+ * version.
+ * @param null $first First value.
+ * @param mixed $second Value to compare with.
+ * @return string Human readable description.
+ * @access private
+ */
+ function _describeGenericDifference($first, $second) {
+ return "as [" . $this->describeValue($first) .
+ "] does not match [" .
+ $this->describeValue($second) . "]";
+ }
+
+ /**
+ * Creates a human readable description of the
+ * difference between a null and another variable.
+ * @param null $first First null.
+ * @param mixed $second Null to compare with.
+ * @param boolean $identical If true then type anomolies count.
+ * @return string Human readable description.
+ * @access private
+ */
+ function _describeNullDifference($first, $second, $identical) {
+ return $this->_describeGenericDifference($first, $second);
+ }
+
+ /**
+ * Creates a human readable description of the
+ * difference between a boolean and another variable.
+ * @param boolean $first First boolean.
+ * @param mixed $second Boolean to compare with.
+ * @param boolean $identical If true then type anomolies count.
+ * @return string Human readable description.
+ * @access private
+ */
+ function _describeBooleanDifference($first, $second, $identical) {
+ return $this->_describeGenericDifference($first, $second);
+ }
+
+ /**
+ * Creates a human readable description of the
+ * difference between a string and another variable.
+ * @param string $first First string.
+ * @param mixed $second String to compare with.
+ * @param boolean $identical If true then type anomolies count.
+ * @return string Human readable description.
+ * @access private
+ */
+ function _describeStringDifference($first, $second, $identical) {
+ if (is_object($second) || is_array($second)) {
+ return $this->_describeGenericDifference($first, $second);
+ }
+ $position = $this->_stringDiffersAt($first, $second);
+ $message = "at character $position";
+ $message .= " with [" .
+ $this->clipString($first, 200, $position) . "] and [" .
+ $this->clipString($second, 200, $position) . "]";
+ return $message;
+ }
+
+ /**
+ * Creates a human readable description of the
+ * difference between an integer and another variable.
+ * @param integer $first First number.
+ * @param mixed $second Number to compare with.
+ * @param boolean $identical If true then type anomolies count.
+ * @return string Human readable description.
+ * @access private
+ */
+ function _describeIntegerDifference($first, $second, $identical) {
+ if (is_object($second) || is_array($second)) {
+ return $this->_describeGenericDifference($first, $second);
+ }
+ return "because [" . $this->describeValue($first) .
+ "] differs from [" .
+ $this->describeValue($second) . "] by " .
+ abs($first - $second);
+ }
+
+ /**
+ * Creates a human readable description of the
+ * difference between two floating point numbers.
+ * @param float $first First float.
+ * @param mixed $second Float to compare with.
+ * @param boolean $identical If true then type anomolies count.
+ * @return string Human readable description.
+ * @access private
+ */
+ function _describeFloatDifference($first, $second, $identical) {
+ if (is_object($second) || is_array($second)) {
+ return $this->_describeGenericDifference($first, $second);
+ }
+ return "because [" . $this->describeValue($first) .
+ "] differs from [" .
+ $this->describeValue($second) . "] by " .
+ abs($first - $second);
+ }
+
+ /**
+ * Creates a human readable description of the
+ * difference between two arrays.
+ * @param array $first First array.
+ * @param mixed $second Array to compare with.
+ * @param boolean $identical If true then type anomolies count.
+ * @return string Human readable description.
+ * @access private
+ */
+ function _describeArrayDifference($first, $second, $identical) {
+ if (! is_array($second)) {
+ return $this->_describeGenericDifference($first, $second);
+ }
+ if (! $this->_isMatchingKeys($first, $second, $identical)) {
+ return "as key list [" .
+ implode(", ", array_keys($first)) . "] does not match key list [" .
+ implode(", ", array_keys($second)) . "]";
+ }
+ foreach (array_keys($first) as $key) {
+ if ($identical && ($first[$key] === $second[$key])) {
+ continue;
+ }
+ if (! $identical && ($first[$key] == $second[$key])) {
+ continue;
+ }
+ return "with member [$key] " . $this->describeDifference(
+ $first[$key],
+ $second[$key],
+ $identical);
+ }
+ return "";
+ }
+
+ /**
+ * Compares two arrays to see if their key lists match.
+ * For an identical match, the ordering and types of the keys
+ * is significant.
+ * @param array $first First array.
+ * @param array $second Array to compare with.
+ * @param boolean $identical If true then type anomolies count.
+ * @return boolean True if matching.
+ * @access private
+ */
+ function _isMatchingKeys($first, $second, $identical) {
+ $first_keys = array_keys($first);
+ $second_keys = array_keys($second);
+ if ($identical) {
+ return ($first_keys === $second_keys);
+ }
+ sort($first_keys);
+ sort($second_keys);
+ return ($first_keys == $second_keys);
+ }
+
+ /**
+ * Creates a human readable description of the
+ * difference between a resource and another variable.
+ * @param resource $first First resource.
+ * @param mixed $second Resource to compare with.
+ * @param boolean $identical If true then type anomolies count.
+ * @return string Human readable description.
+ * @access private
+ */
+ function _describeResourceDifference($first, $second, $identical) {
+ return $this->_describeGenericDifference($first, $second);
+ }
+
+ /**
+ * Creates a human readable description of the
+ * difference between two objects.
+ * @param object $first First object.
+ * @param mixed $second Object to compare with.
+ * @param boolean $identical If true then type anomolies count.
+ * @return string Human readable description.
+ * @access private
+ */
+ function _describeObjectDifference($first, $second, $identical) {
+ if (! is_object($second)) {
+ return $this->_describeGenericDifference($first, $second);
+ }
+ return $this->_describeArrayDifference(
+ get_object_vars($first),
+ get_object_vars($second),
+ $identical);
+ }
+
+ /**
+ * Find the first character position that differs
+ * in two strings by binary chop.
+ * @param string $first First string.
+ * @param string $second String to compare with.
+ * @return integer Position of first differing
+ * character.
+ * @access private
+ */
+ function _stringDiffersAt($first, $second) {
+ if (! $first || ! $second) {
+ return 0;
+ }
+ if (strlen($first) < strlen($second)) {
+ list($first, $second) = array($second, $first);
+ }
+ $position = 0;
+ $step = strlen($first);
+ while ($step > 1) {
+ $step = (integer)(($step + 1) / 2);
+ if (strncmp($first, $second, $position + $step) == 0) {
+ $position += $step;
+ }
+ }
+ return $position;
+ }
+
+ /**
+ * Sends a formatted dump of a variable to a string.
+ * @param mixed $variable Variable to display.
+ * @return string Output from print_r().
+ * @access public
+ * @static
+ */
+ function dump($variable) {
+ ob_start();
+ print_r($variable);
+ $formatted = ob_get_contents();
+ ob_end_clean();
+ return $formatted;
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/eclipse.php b/tests/simpletest/eclipse.php
new file mode 100755
index 0000000000..e316cc5380
--- /dev/null
+++ b/tests/simpletest/eclipse.php
@@ -0,0 +1,183 @@
+<?php
+/**
+ * base include file for eclipse plugin
+ * @package SimpleTest
+ * @subpackage Eclipse
+ * @version $Id: eclipse.php,v 1.11 2006/12/10 00:38:30 stevenbalthazor Exp $
+ */
+/**#@+
+ * simpletest include files
+ */
+include_once 'unit_tester.php';
+include_once 'test_case.php';
+include_once 'invoker.php';
+include_once 'socket.php';
+include_once 'mock_objects.php';
+/**#@-*/
+
+/**
+ * base reported class for eclipse plugin
+ * @package SimpleTest
+ * @subpackage Eclipse
+ */
+class EclipseReporter extends SimpleScorer {
+ function EclipseReporter(&$listener,$cc=false){
+ $this->_listener = &$listener;
+ $this->SimpleScorer();
+ $this->_case = "";
+ $this->_group = "";
+ $this->_method = "";
+ $this->_cc = $cc;
+ $this->_error = false;
+ $this->_fail = false;
+ }
+
+ function getDumper() {
+ return new SimpleDumper();
+ }
+
+ function &createListener($port,$host="127.0.0.1"){
+ $tmplistener = & new SimpleSocket($host,$port,5);
+ return $tmplistener;
+ }
+
+ function &createInvoker(&$invoker){
+ $eclinvoker = & new EclipseInvoker( $invoker, $this->_listener);
+ return $eclinvoker;
+ }
+
+ function escapeVal($val){
+ $needle = array("\\","\"","/","\b","\f","\n","\r","\t");
+ $replace = array('\\\\','\"','\/','\b','\f','\n','\r','\t');
+ return str_replace($needle,$replace,$val);
+ }
+
+ function paintPass($message){
+ //get the first passing item -- so that clicking the test item goes to first pass
+ if (!$this->_pass){
+ $this->_message = $this->escapeVal($message);
+ }
+ $this->_pass = true;
+ }
+
+ function paintFail($message){
+ //only get the first failure or error
+ if (!$this->_fail && !$this->_error){
+ $this->_fail = true;
+ $this->_message = $this->escapeVal($message);
+ $this->_listener->write('{status:"fail",message:"'.$this->_message.'",group:"'.$this->_group.'",case:"'.$this->_case.'",method:"'.$this->_method.'"}');
+ }
+ }
+
+ function paintError($message){
+ //only get the first failure or error
+ if (!$this->_fail && !$this->_error){
+ $this->_error = true;
+ $this->_message = $this->escapeVal($message);
+ $this->_listener->write('{status:"error",message:"'.$this->_message.'",group:"'.$this->_group.'",case:"'.$this->_case.'",method:"'.$this->_method.'"}');
+ }
+ }
+
+ function paintHeader($method){
+ }
+
+ function paintFooter($method){
+ }
+
+ function paintMethodStart($method) {
+ $this->_pass = false;
+ $this->_fail = false;
+ $this->_error = false;
+ $this->_method = $this->escapeVal($method);
+ }
+
+ function paintMethodEnd($method){
+ if ($this->_fail || $this->_error || !$this->_pass){
+ //do nothing
+ }else{
+ //this ensures we only get one message per method that passes
+ $this->_listener->write('{status:"pass",message:"'.$this->_message.'",group:"'.$this->_group.'",case:"'.$this->_case.'",method:"'.$this->_method.'"}');
+ }
+ }
+
+ function paintCaseStart($case){
+ $this->_case = $this->escapeVal($case);
+ }
+
+ function paintCaseEnd($case){
+ $this->_case = "";
+ }
+ function paintGroupStart($group,$size){
+ $this->_group = $this->escapeVal($group);
+ if ($this->_cc){
+ if (extension_loaded('xdebug')){
+ xdebug_start_code_coverage(XDEBUG_CC_UNUSED| XDEBUG_CC_DEAD_CODE);
+ }
+ }
+ }
+ function paintGroupEnd($group){
+ $this->_group = "";
+ $cc = "";
+ if ($this->_cc){
+ if (extension_loaded('xdebug')){
+ $arrfiles = xdebug_get_code_coverage();
+ xdebug_stop_code_coverage();
+ $thisdir = dirname(__FILE__);
+ $thisdirlen = strlen($thisdir);
+ foreach ($arrfiles as $index=>$file){
+ if (substr($index,0,$thisdirlen)===$thisdir){
+ continue;
+ }
+ $lcnt = 0;
+ $ccnt = 0;
+ foreach ($file as $line){
+ if ($line == -2){
+ continue;
+ }
+ $lcnt++;
+ if ($line==1){
+ $ccnt++;
+ }
+ }
+ if ($lcnt > 0){
+ $cc.=round(($ccnt/$lcnt)*100,2).'%';
+ }else{
+ $cc.="0.00%";
+ }
+ $cc.= "\t".$index."\n";
+ }
+ }
+ }
+ $this->_listener->write('{status:"coverage",message:"'.EclipseReporter::escapeVal($cc).'"}');
+ }
+}
+
+/**
+ * base invoker class for eclipse plugin
+ * @package SimpleTest
+ * @subpackage Eclipse
+ */
+class EclipseInvoker extends SimpleInvokerDecorator{
+ function EclipseInvoker(&$invoker,&$listener) {
+ $this->_listener = &$listener;
+ $this->SimpleInvokerDecorator($invoker);
+ }
+
+ function before($method){
+ ob_start();
+ $this->_invoker->before($method);
+ }
+
+ function after($method) {
+ $this->_invoker->after($method);
+ $output = ob_get_contents();
+ ob_end_clean();
+ if ($output!==""){
+ $result = $this->_listener->write('{status:"info",message:"'.EclipseReporter::escapeVal($output).'"}');
+ }
+ }
+
+
+}
+
+?> \ No newline at end of file
diff --git a/tests/simpletest/encoding.php b/tests/simpletest/encoding.php
new file mode 100755
index 0000000000..f509df27d7
--- /dev/null
+++ b/tests/simpletest/encoding.php
@@ -0,0 +1,521 @@
+<?php
+ /**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage WebTester
+ * @version $Id: encoding.php,v 1.18 2006/11/06 09:55:20 lastcraft Exp $
+ */
+
+ /**#@+
+ * include other SimpleTest class files
+ */
+ require_once(dirname(__FILE__) . '/socket.php');
+ /**#@-*/
+
+ /**
+ * Single post parameter.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleEncodedPair {
+ var $_key;
+ var $_value;
+
+ /**
+ * Stashes the data for rendering later.
+ * @param string $key Form element name.
+ * @param string $value Data to send.
+ */
+ function SimpleEncodedPair($key, $value) {
+ $this->_key = $key;
+ $this->_value = $value;
+ }
+
+ /**
+ * The pair as a single string.
+ * @return string Encoded pair.
+ * @access public
+ */
+ function asRequest() {
+ return urlencode($this->_key) . '=' . urlencode($this->_value);
+ }
+
+ /**
+ * The MIME part as a string.
+ * @return string MIME part encoding.
+ * @access public
+ */
+ function asMime() {
+ $part = 'Content-Disposition: form-data; ';
+ $part .= "name=\"" . $this->_key . "\"\r\n";
+ $part .= "\r\n" . $this->_value;
+ return $part;
+ }
+
+ /**
+ * Is this the value we are looking for?
+ * @param string $key Identifier.
+ * @return boolean True if matched.
+ * @access public
+ */
+ function isKey($key) {
+ return $key == $this->_key;
+ }
+
+ /**
+ * Is this the value we are looking for?
+ * @return string Identifier.
+ * @access public
+ */
+ function getKey() {
+ return $this->_key;
+ }
+
+ /**
+ * Is this the value we are looking for?
+ * @return string Content.
+ * @access public
+ */
+ function getValue() {
+ return $this->_value;
+ }
+ }
+
+ /**
+ * Single post parameter.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleAttachment {
+ var $_key;
+ var $_content;
+ var $_filename;
+
+ /**
+ * Stashes the data for rendering later.
+ * @param string $key Key to add value to.
+ * @param string $content Raw data.
+ * @param hash $filename Original filename.
+ */
+ function SimpleAttachment($key, $content, $filename) {
+ $this->_key = $key;
+ $this->_content = $content;
+ $this->_filename = $filename;
+ }
+
+ /**
+ * The pair as a single string.
+ * @return string Encoded pair.
+ * @access public
+ */
+ function asRequest() {
+ return '';
+ }
+
+ /**
+ * The MIME part as a string.
+ * @return string MIME part encoding.
+ * @access public
+ */
+ function asMime() {
+ $part = 'Content-Disposition: form-data; ';
+ $part .= 'name="' . $this->_key . '"; ';
+ $part .= 'filename="' . $this->_filename . '"';
+ $part .= "\r\nContent-Type: " . $this->_deduceMimeType();
+ $part .= "\r\n\r\n" . $this->_content;
+ return $part;
+ }
+
+ /**
+ * Attempts to figure out the MIME type from the
+ * file extension and the content.
+ * @return string MIME type.
+ * @access private
+ */
+ function _deduceMimeType() {
+ if ($this->_isOnlyAscii($this->_content)) {
+ return 'text/plain';
+ }
+ return 'application/octet-stream';
+ }
+
+ /**
+ * Tests each character is in the range 0-127.
+ * @param string $ascii String to test.
+ * @access private
+ */
+ function _isOnlyAscii($ascii) {
+ for ($i = 0, $length = strlen($ascii); $i < $length; $i++) {
+ if (ord($ascii[$i]) > 127) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Is this the value we are looking for?
+ * @param string $key Identifier.
+ * @return boolean True if matched.
+ * @access public
+ */
+ function isKey($key) {
+ return $key == $this->_key;
+ }
+
+ /**
+ * Is this the value we are looking for?
+ * @return string Identifier.
+ * @access public
+ */
+ function getKey() {
+ return $this->_key;
+ }
+
+ /**
+ * Is this the value we are looking for?
+ * @return string Content.
+ * @access public
+ */
+ function getValue() {
+ return $this->_filename;
+ }
+ }
+
+ /**
+ * Bundle of GET/POST parameters. Can include
+ * repeated parameters.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleEncoding {
+ var $_request;
+
+ /**
+ * Starts empty.
+ * @param array $query Hash of parameters.
+ * Multiple values are
+ * as lists on a single key.
+ * @access public
+ */
+ function SimpleEncoding($query = false) {
+ if (! $query) {
+ $query = array();
+ }
+ $this->clear();
+ $this->merge($query);
+ }
+
+ /**
+ * Empties the request of parameters.
+ * @access public
+ */
+ function clear() {
+ $this->_request = array();
+ }
+
+ /**
+ * Adds a parameter to the query.
+ * @param string $key Key to add value to.
+ * @param string/array $value New data.
+ * @access public
+ */
+ function add($key, $value) {
+ if ($value === false) {
+ return;
+ }
+ if (is_array($value)) {
+ foreach ($value as $item) {
+ $this->_addPair($key, $item);
+ }
+ } else {
+ $this->_addPair($key, $value);
+ }
+ }
+
+ /**
+ * Adds a new value into the request.
+ * @param string $key Key to add value to.
+ * @param string/array $value New data.
+ * @access private
+ */
+ function _addPair($key, $value) {
+ $this->_request[] = new SimpleEncodedPair($key, $value);
+ }
+
+ /**
+ * Adds a MIME part to the query. Does nothing for a
+ * form encoded packet.
+ * @param string $key Key to add value to.
+ * @param string $content Raw data.
+ * @param hash $filename Original filename.
+ * @access public
+ */
+ function attach($key, $content, $filename) {
+ $this->_request[] = new SimpleAttachment($key, $content, $filename);
+ }
+
+ /**
+ * Adds a set of parameters to this query.
+ * @param array/SimpleQueryString $query Multiple values are
+ * as lists on a single key.
+ * @access public
+ */
+ function merge($query) {
+ if (is_object($query)) {
+ $this->_request = array_merge($this->_request, $query->getAll());
+ } elseif (is_array($query)) {
+ foreach ($query as $key => $value) {
+ $this->add($key, $value);
+ }
+ }
+ }
+
+ /**
+ * Accessor for single value.
+ * @return string/array False if missing, string
+ * if present and array if
+ * multiple entries.
+ * @access public
+ */
+ function getValue($key) {
+ $values = array();
+ foreach ($this->_request as $pair) {
+ if ($pair->isKey($key)) {
+ $values[] = $pair->getValue();
+ }
+ }
+ if (count($values) == 0) {
+ return false;
+ } elseif (count($values) == 1) {
+ return $values[0];
+ } else {
+ return $values;
+ }
+ }
+
+ /**
+ * Accessor for listing of pairs.
+ * @return array All pair objects.
+ * @access public
+ */
+ function getAll() {
+ return $this->_request;
+ }
+
+ /**
+ * Renders the query string as a URL encoded
+ * request part.
+ * @return string Part of URL.
+ * @access protected
+ */
+ function _encode() {
+ $statements = array();
+ foreach ($this->_request as $pair) {
+ if ($statement = $pair->asRequest()) {
+ $statements[] = $statement;
+ }
+ }
+ return implode('&', $statements);
+ }
+ }
+
+ /**
+ * Bundle of GET parameters. Can include
+ * repeated parameters.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleGetEncoding extends SimpleEncoding {
+
+ /**
+ * Starts empty.
+ * @param array $query Hash of parameters.
+ * Multiple values are
+ * as lists on a single key.
+ * @access public
+ */
+ function SimpleGetEncoding($query = false) {
+ $this->SimpleEncoding($query);
+ }
+
+ /**
+ * HTTP request method.
+ * @return string Always GET.
+ * @access public
+ */
+ function getMethod() {
+ return 'GET';
+ }
+
+ /**
+ * Writes no extra headers.
+ * @param SimpleSocket $socket Socket to write to.
+ * @access public
+ */
+ function writeHeadersTo(&$socket) {
+ }
+
+ /**
+ * No data is sent to the socket as the data is encoded into
+ * the URL.
+ * @param SimpleSocket $socket Socket to write to.
+ * @access public
+ */
+ function writeTo(&$socket) {
+ }
+
+ /**
+ * Renders the query string as a URL encoded
+ * request part for attaching to a URL.
+ * @return string Part of URL.
+ * @access public
+ */
+ function asUrlRequest() {
+ return $this->_encode();
+ }
+ }
+
+ /**
+ * Bundle of URL parameters for a HEAD request.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleHeadEncoding extends SimpleGetEncoding {
+
+ /**
+ * Starts empty.
+ * @param array $query Hash of parameters.
+ * Multiple values are
+ * as lists on a single key.
+ * @access public
+ */
+ function SimpleHeadEncoding($query = false) {
+ $this->SimpleGetEncoding($query);
+ }
+
+ /**
+ * HTTP request method.
+ * @return string Always HEAD.
+ * @access public
+ */
+ function getMethod() {
+ return 'HEAD';
+ }
+ }
+
+ /**
+ * Bundle of POST parameters. Can include
+ * repeated parameters.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimplePostEncoding extends SimpleEncoding {
+
+ /**
+ * Starts empty.
+ * @param array $query Hash of parameters.
+ * Multiple values are
+ * as lists on a single key.
+ * @access public
+ */
+ function SimplePostEncoding($query = false) {
+ $this->SimpleEncoding($query);
+ }
+
+ /**
+ * HTTP request method.
+ * @return string Always POST.
+ * @access public
+ */
+ function getMethod() {
+ return 'POST';
+ }
+
+ /**
+ * Dispatches the form headers down the socket.
+ * @param SimpleSocket $socket Socket to write to.
+ * @access public
+ */
+ function writeHeadersTo(&$socket) {
+ $socket->write("Content-Length: " . (integer)strlen($this->_encode()) . "\r\n");
+ $socket->write("Content-Type: application/x-www-form-urlencoded\r\n");
+ }
+
+ /**
+ * Dispatches the form data down the socket.
+ * @param SimpleSocket $socket Socket to write to.
+ * @access public
+ */
+ function writeTo(&$socket) {
+ $socket->write($this->_encode());
+ }
+
+ /**
+ * Renders the query string as a URL encoded
+ * request part for attaching to a URL.
+ * @return string Part of URL.
+ * @access public
+ */
+ function asUrlRequest() {
+ return '';
+ }
+ }
+
+ /**
+ * Bundle of POST parameters in the multipart
+ * format. Can include file uploads.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleMultipartEncoding extends SimplePostEncoding {
+ var $_boundary;
+
+ /**
+ * Starts empty.
+ * @param array $query Hash of parameters.
+ * Multiple values are
+ * as lists on a single key.
+ * @access public
+ */
+ function SimpleMultipartEncoding($query = false, $boundary = false) {
+ $this->SimplePostEncoding($query);
+ $this->_boundary = ($boundary === false ? uniqid('st') : $boundary);
+ }
+
+ /**
+ * Dispatches the form headers down the socket.
+ * @param SimpleSocket $socket Socket to write to.
+ * @access public
+ */
+ function writeHeadersTo(&$socket) {
+ $socket->write("Content-Length: " . (integer)strlen($this->_encode()) . "\r\n");
+ $socket->write("Content-Type: multipart/form-data, boundary=" . $this->_boundary . "\r\n");
+ }
+
+ /**
+ * Dispatches the form data down the socket.
+ * @param SimpleSocket $socket Socket to write to.
+ * @access public
+ */
+ function writeTo(&$socket) {
+ $socket->write($this->_encode());
+ }
+
+ /**
+ * Renders the query string as a URL encoded
+ * request part.
+ * @return string Part of URL.
+ * @access public
+ */
+ function _encode() {
+ $stream = '';
+ foreach ($this->_request as $pair) {
+ $stream .= "--" . $this->_boundary . "\r\n";
+ $stream .= $pair->asMime() . "\r\n";
+ }
+ $stream .= "--" . $this->_boundary . "--\r\n";
+ return $stream;
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/errors.php b/tests/simpletest/errors.php
new file mode 100755
index 0000000000..f38dc6354e
--- /dev/null
+++ b/tests/simpletest/errors.php
@@ -0,0 +1,285 @@
+<?php
+/**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: errors.php,v 1.29 2007/07/04 00:42:05 lastcraft Exp $
+ */
+
+/**
+ * @ignore - PHP5 compatibility fix.
+ */
+if (! defined('E_STRICT')) {
+ define('E_STRICT', 2048);
+}
+
+/**#@+
+ * Includes SimpleTest files.
+ */
+require_once dirname(__FILE__) . '/invoker.php';
+require_once dirname(__FILE__) . '/test_case.php';
+require_once dirname(__FILE__) . '/expectation.php';
+/**#@-*/
+
+/**
+ * Extension that traps errors into an error queue.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+class SimpleErrorTrappingInvoker extends SimpleInvokerDecorator {
+
+ /**
+ * Stores the invoker to wrap.
+ * @param SimpleInvoker $invoker Test method runner.
+ */
+ function SimpleErrorTrappingInvoker(&$invoker) {
+ $this->SimpleInvokerDecorator($invoker);
+ }
+
+ /**
+ * Invokes a test method and dispatches any
+ * untrapped errors. Called back from
+ * the visiting runner.
+ * @param string $method Test method to call.
+ * @access public
+ */
+ function invoke($method) {
+ $queue = &$this->_createErrorQueue();
+ set_error_handler('SimpleTestErrorHandler');
+ parent::invoke($method);
+ restore_error_handler();
+ $queue->tally();
+ }
+
+ /**
+ * Wires up the error queue for a single test.
+ * @return SimpleErrorQueue Queue connected to the test.
+ * @access private
+ */
+ function &_createErrorQueue() {
+ $context = &SimpleTest::getContext();
+ $test = &$this->getTestCase();
+ $queue = &$context->get('SimpleErrorQueue');
+ $queue->setTestCase($test);
+ return $queue;
+ }
+}
+
+/**
+ * Error queue used to record trapped
+ * errors.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+class SimpleErrorQueue {
+ var $_queue;
+ var $_expectation_queue;
+ var $_test;
+ var $_using_expect_style = false;
+
+ /**
+ * Starts with an empty queue.
+ */
+ function SimpleErrorQueue() {
+ $this->clear();
+ }
+
+ /**
+ * Discards the contents of the error queue.
+ * @access public
+ */
+ function clear() {
+ $this->_queue = array();
+ $this->_expectation_queue = array();
+ }
+
+ /**
+ * Sets the currently running test case.
+ * @param SimpleTestCase $test Test case to send messages to.
+ * @access public
+ */
+ function setTestCase(&$test) {
+ $this->_test = &$test;
+ }
+
+ /**
+ * Sets up an expectation of an error. If this is
+ * not fulfilled at the end of the test, a failure
+ * will occour. If the error does happen, then this
+ * will cancel it out and send a pass message.
+ * @param SimpleExpectation $expected Expected error match.
+ * @param string $message Message to display.
+ * @access public
+ */
+ function expectError($expected, $message) {
+ $this->_using_expect_style = true;
+ array_push($this->_expectation_queue, array($expected, $message));
+ }
+
+ /**
+ * Adds an error to the front of the queue.
+ * @param integer $severity PHP error code.
+ * @param string $content Text of error.
+ * @param string $filename File error occoured in.
+ * @param integer $line Line number of error.
+ * @access public
+ */
+ function add($severity, $content, $filename, $line) {
+ $content = str_replace('%', '%%', $content);
+ if ($this->_using_expect_style) {
+ $this->_testLatestError($severity, $content, $filename, $line);
+ } else {
+ array_push(
+ $this->_queue,
+ array($severity, $content, $filename, $line));
+ }
+ }
+
+ /**
+ * Any errors still in the queue are sent to the test
+ * case. Any unfulfilled expectations trigger failures.
+ * @access public
+ */
+ function tally() {
+ while (list($severity, $message, $file, $line) = $this->extract()) {
+ $severity = $this->getSeverityAsString($severity);
+ $this->_test->error($severity, $message, $file, $line);
+ }
+ while (list($expected, $message) = $this->_extractExpectation()) {
+ $this->_test->assert($expected, false, "%s -> Expected error not caught");
+ }
+ }
+
+ /**
+ * Tests the error against the most recent expected
+ * error.
+ * @param integer $severity PHP error code.
+ * @param string $content Text of error.
+ * @param string $filename File error occoured in.
+ * @param integer $line Line number of error.
+ * @access private
+ */
+ function _testLatestError($severity, $content, $filename, $line) {
+ if ($expectation = $this->_extractExpectation()) {
+ list($expected, $message) = $expectation;
+ $this->_test->assert($expected, $content, sprintf(
+ $message,
+ "%s -> PHP error [$content] severity [" .
+ $this->getSeverityAsString($severity) .
+ "] in [$filename] line [$line]"));
+ } else {
+ $this->_test->error($severity, $content, $filename, $line);
+ }
+ }
+
+ /**
+ * Pulls the earliest error from the queue.
+ * @return mixed False if none, or a list of error
+ * information. Elements are: severity
+ * as the PHP error code, the error message,
+ * the file with the error, the line number
+ * and a list of PHP super global arrays.
+ * @access public
+ */
+ function extract() {
+ if (count($this->_queue)) {
+ return array_shift($this->_queue);
+ }
+ return false;
+ }
+
+ /**
+ * Pulls the earliest expectation from the queue.
+ * @return SimpleExpectation False if none.
+ * @access private
+ */
+ function _extractExpectation() {
+ if (count($this->_expectation_queue)) {
+ return array_shift($this->_expectation_queue);
+ }
+ return false;
+ }
+
+ /**
+ * @deprecated
+ */
+ function assertNoErrors($message) {
+ return $this->_test->assert(
+ new TrueExpectation(),
+ count($this->_queue) == 0,
+ sprintf($message, 'Should be no errors'));
+ }
+
+ /**
+ * @deprecated
+ */
+ function assertError($expected, $message) {
+ if (count($this->_queue) == 0) {
+ $this->_test->fail(sprintf($message, 'Expected error not found'));
+ return false;
+ }
+ list($severity, $content, $file, $line) = $this->extract();
+ $severity = $this->getSeverityAsString($severity);
+ return $this->_test->assert(
+ $expected,
+ $content,
+ sprintf($message, "Expected PHP error [$content] severity [$severity] in [$file] line [$line]"));
+ }
+
+ /**
+ * Converts an error code into it's string
+ * representation.
+ * @param $severity PHP integer error code.
+ * @return String version of error code.
+ * @access public
+ * @static
+ */
+ function getSeverityAsString($severity) {
+ static $map = array(
+ E_STRICT => 'E_STRICT',
+ E_ERROR => 'E_ERROR',
+ E_WARNING => 'E_WARNING',
+ E_PARSE => 'E_PARSE',
+ E_NOTICE => 'E_NOTICE',
+ E_CORE_ERROR => 'E_CORE_ERROR',
+ E_CORE_WARNING => 'E_CORE_WARNING',
+ E_COMPILE_ERROR => 'E_COMPILE_ERROR',
+ E_COMPILE_WARNING => 'E_COMPILE_WARNING',
+ E_USER_ERROR => 'E_USER_ERROR',
+ E_USER_WARNING => 'E_USER_WARNING',
+ E_USER_NOTICE => 'E_USER_NOTICE');
+ if (version_compare(phpversion(), '5.2.0', '>=')) {
+ $map[E_RECOVERABLE_ERROR] = 'E_RECOVERABLE_ERROR';
+ }
+ return $map[$severity];
+ }
+}
+
+/**
+ * Error handler that simply stashes any errors into the global
+ * error queue. Simulates the existing behaviour with respect to
+ * logging errors, but this feature may be removed in future.
+ * @param $severity PHP error code.
+ * @param $message Text of error.
+ * @param $filename File error occoured in.
+ * @param $line Line number of error.
+ * @param $super_globals Hash of PHP super global arrays.
+ * @static
+ * @access public
+ */
+function SimpleTestErrorHandler($severity, $message, $filename = null, $line = null, $super_globals = null, $mask = null) {
+ $severity = $severity & error_reporting();
+ if ($severity) {
+ restore_error_handler();
+ if (ini_get('log_errors')) {
+ $label = SimpleErrorQueue::getSeverityAsString($severity);
+ error_log("$label: $message in $filename on line $line");
+ }
+ $context = &SimpleTest::getContext();
+ $queue = &$context->get('SimpleErrorQueue');
+ $queue->add($severity, $message, $filename, $line);
+ set_error_handler('SimpleTestErrorHandler');
+ }
+ return true;
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/exceptions.php b/tests/simpletest/exceptions.php
new file mode 100755
index 0000000000..2498a1f98e
--- /dev/null
+++ b/tests/simpletest/exceptions.php
@@ -0,0 +1,192 @@
+<?php
+/**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: exceptions.php,v 1.14 2006/12/20 11:17:13 pp11 Exp $
+ */
+
+/**#@+
+ * Include required SimpleTest files
+ */
+require_once dirname(__FILE__) . '/invoker.php';
+require_once dirname(__FILE__) . '/expectation.php';
+/**#@-*/
+
+/**
+ * Extension that traps exceptions and turns them into
+ * an error message. PHP5 only.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+class SimpleExceptionTrappingInvoker extends SimpleInvokerDecorator {
+
+ /**
+ * Stores the invoker to be wrapped.
+ * @param SimpleInvoker $invoker Test method runner.
+ */
+ function SimpleExceptionTrappingInvoker($invoker) {
+ $this->SimpleInvokerDecorator($invoker);
+ }
+
+ /**
+ * Invokes a test method whilst trapping expected
+ * exceptions. Any left over unthrown exceptions
+ * are then reported as failures.
+ * @param string $method Test method to call.
+ */
+ function invoke($method) {
+ $trap = SimpleTest::getContext()->get('SimpleExceptionTrap');
+ $trap->clear();
+ try {
+ parent::invoke($method);
+ } catch (Exception $exception) {
+ if (! $trap->isExpected($this->getTestCase(), $exception)) {
+ $this->getTestCase()->exception($exception);
+ }
+ $trap->clear();
+ $this->_invoker->getTestCase()->tearDown();
+ }
+ if ($message = $trap->getOutstanding()) {
+ $this->getTestCase()->fail($message);
+ }
+ }
+}
+
+/**
+ * Tests exceptions either by type or the exact
+ * exception. This could be improved to accept
+ * a pattern expectation to test the error
+ * message, but that will have to come later.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+class ExceptionExpectation extends SimpleExpectation {
+ private $expected;
+
+ /**
+ * Sets up the conditions to test against.
+ * If the expected value is a string, then
+ * it will act as a test of the class name.
+ * An exception as the comparison will
+ * trigger an identical match. Writing this
+ * down now makes it look doubly dumb. I hope
+ * come up with a better scheme later.
+ * @param mixed $expected A class name or an actual
+ * exception to compare with.
+ * @param string $message Message to display.
+ */
+ function __construct($expected, $message = '%s') {
+ $this->expected = $expected;
+ parent::__construct($message);
+ }
+
+ /**
+ * Carry out the test.
+ * @param Exception $compare Value to check.
+ * @return boolean True if matched.
+ */
+ function test($compare) {
+ if (is_string($this->expected)) {
+ return ($compare instanceof $this->expected);
+ }
+ if (get_class($compare) != get_class($this->expected)) {
+ return false;
+ }
+ return $compare->getMessage() == $this->expected->getMessage();
+ }
+
+ /**
+ * Create the message to display describing the test.
+ * @param Exception $compare Exception to match.
+ * @return string Final message.
+ */
+ function testMessage($compare) {
+ if (is_string($this->expected)) {
+ return "Exception [" . $this->describeException($compare) .
+ "] should be type [" . $this->expected . "]";
+ }
+ return "Exception [" . $this->describeException($compare) .
+ "] should match [" .
+ $this->describeException($this->expected) . "]";
+ }
+
+ /**
+ * Summary of an Exception object.
+ * @param Exception $compare Exception to describe.
+ * @return string Text description.
+ */
+ protected function describeException($exception) {
+ return get_class($exception) . ": " . $exception->getMessage();
+ }
+}
+
+/**
+ * Stores expected exceptions for when they
+ * get thrown. Saves the irritating try...catch
+ * block.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+class SimpleExceptionTrap {
+ private $expected;
+ private $message;
+
+ /**
+ * Clears down the queue ready for action.
+ */
+ function __construct() {
+ $this->clear();
+ }
+
+ /**
+ * Sets up an expectation of an exception.
+ * This has the effect of intercepting an
+ * exception that matches.
+ * @param SimpleExpectation $expected Expected exception to match.
+ * @param string $message Message to display.
+ * @access public
+ */
+ function expectException($expected = false, $message = '%s') {
+ if ($expected === false) {
+ $expected = new AnythingExpectation();
+ }
+ if (! SimpleExpectation::isExpectation($expected)) {
+ $expected = new ExceptionExpectation($expected);
+ }
+ $this->expected = $expected;
+ $this->message = $message;
+ }
+
+ /**
+ * Compares the expected exception with any
+ * in the queue. Issues a pass or fail and
+ * returns the state of the test.
+ * @param SimpleTestCase $test Test case to send messages to.
+ * @param Exception $exception Exception to compare.
+ * @return boolean False on no match.
+ */
+ function isExpected($test, $exception) {
+ if ($this->expected) {
+ return $test->assert($this->expected, $exception, $this->message);
+ }
+ return false;
+ }
+
+ /**
+ * Tests for any left over exception.
+ * @return string/false The failure message or false if none.
+ */
+ function getOutstanding() {
+ return sprintf($this->message, 'Failed to trap exception');
+ }
+
+ /**
+ * Discards the contents of the error queue.
+ */
+ function clear() {
+ $this->expected = false;
+ $this->message = false;
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/expectation.php b/tests/simpletest/expectation.php
new file mode 100755
index 0000000000..ebe14e5337
--- /dev/null
+++ b/tests/simpletest/expectation.php
@@ -0,0 +1,895 @@
+<?php
+ /**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: expectation.php,v 1.50 2007/06/09 08:35:54 pachanga Exp $
+ */
+
+ /**#@+
+ * include other SimpleTest class files
+ */
+ require_once(dirname(__FILE__) . '/dumper.php');
+ require_once(dirname(__FILE__) . '/compatibility.php');
+ /**#@-*/
+
+ /**
+ * Assertion that can display failure information.
+ * Also includes various helper methods.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @abstract
+ */
+ class SimpleExpectation {
+ var $_dumper = false;
+ var $_message;
+
+ /**
+ * Creates a dumper for displaying values and sets
+ * the test message.
+ * @param string $message Customised message on failure.
+ */
+ function SimpleExpectation($message = '%s') {
+ $this->_message = $message;
+ }
+
+ /**
+ * Tests the expectation. True if correct.
+ * @param mixed $compare Comparison value.
+ * @return boolean True if correct.
+ * @access public
+ * @abstract
+ */
+ function test($compare) {
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ * @abstract
+ */
+ function testMessage($compare) {
+ }
+
+ /**
+ * Overlays the generated message onto the stored user
+ * message. An additional message can be interjected.
+ * @param mixed $compare Comparison value.
+ * @param SimpleDumper $dumper For formatting the results.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function overlayMessage($compare, $dumper) {
+ $this->_dumper = $dumper;
+ return sprintf($this->_message, $this->testMessage($compare));
+ }
+
+ /**
+ * Accessor for the dumper.
+ * @return SimpleDumper Current value dumper.
+ * @access protected
+ */
+ function &_getDumper() {
+ if (! $this->_dumper) {
+ $dumper = &new SimpleDumper();
+ return $dumper;
+ }
+ return $this->_dumper;
+ }
+
+ /**
+ * Test to see if a value is an expectation object.
+ * A useful utility method.
+ * @param mixed $expectation Hopefully an Epectation
+ * class.
+ * @return boolean True if descended from
+ * this class.
+ * @access public
+ * @static
+ */
+ function isExpectation($expectation) {
+ return is_object($expectation) &&
+ SimpleTestCompatibility::isA($expectation, 'SimpleExpectation');
+ }
+ }
+
+ /**
+ * A wildcard expectation always matches.
+ * @package SimpleTest
+ * @subpackage MockObjects
+ */
+ class AnythingExpectation extends SimpleExpectation {
+
+ /**
+ * Tests the expectation. Always true.
+ * @param mixed $compare Ignored.
+ * @return boolean True.
+ * @access public
+ */
+ function test($compare) {
+ return true;
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ $dumper = &$this->_getDumper();
+ return 'Anything always matches [' . $dumper->describeValue($compare) . ']';
+ }
+ }
+
+ /**
+ * An expectation that never matches.
+ * @package SimpleTest
+ * @subpackage MockObjects
+ */
+ class FailedExpectation extends SimpleExpectation {
+
+ /**
+ * Tests the expectation. Always false.
+ * @param mixed $compare Ignored.
+ * @return boolean True.
+ * @access public
+ */
+ function test($compare) {
+ return false;
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ $dumper = &$this->_getDumper();
+ return 'Failed expectation never matches [' . $dumper->describeValue($compare) . ']';
+ }
+ }
+
+ /**
+ * An expectation that passes on boolean true.
+ * @package SimpleTest
+ * @subpackage MockObjects
+ */
+ class TrueExpectation extends SimpleExpectation {
+
+ /**
+ * Tests the expectation.
+ * @param mixed $compare Should be true.
+ * @return boolean True on match.
+ * @access public
+ */
+ function test($compare) {
+ return (boolean)$compare;
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ $dumper = &$this->_getDumper();
+ return 'Expected true, got [' . $dumper->describeValue($compare) . ']';
+ }
+ }
+
+ /**
+ * An expectation that passes on boolean false.
+ * @package SimpleTest
+ * @subpackage MockObjects
+ */
+ class FalseExpectation extends SimpleExpectation {
+
+ /**
+ * Tests the expectation.
+ * @param mixed $compare Should be false.
+ * @return boolean True on match.
+ * @access public
+ */
+ function test($compare) {
+ return ! (boolean)$compare;
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ $dumper = &$this->_getDumper();
+ return 'Expected false, got [' . $dumper->describeValue($compare) . ']';
+ }
+ }
+
+ /**
+ * Test for equality.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class EqualExpectation extends SimpleExpectation {
+ var $_value;
+
+ /**
+ * Sets the value to compare against.
+ * @param mixed $value Test value to match.
+ * @param string $message Customised message on failure.
+ * @access public
+ */
+ function EqualExpectation($value, $message = '%s') {
+ $this->SimpleExpectation($message);
+ $this->_value = $value;
+ }
+
+ /**
+ * Tests the expectation. True if it matches the
+ * held value.
+ * @param mixed $compare Comparison value.
+ * @return boolean True if correct.
+ * @access public
+ */
+ function test($compare) {
+ return (($this->_value == $compare) && ($compare == $this->_value));
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ if ($this->test($compare)) {
+ return "Equal expectation [" . $this->_dumper->describeValue($this->_value) . "]";
+ } else {
+ return "Equal expectation fails " .
+ $this->_dumper->describeDifference($this->_value, $compare);
+ }
+ }
+
+ /**
+ * Accessor for comparison value.
+ * @return mixed Held value to compare with.
+ * @access protected
+ */
+ function _getValue() {
+ return $this->_value;
+ }
+ }
+
+ /**
+ * Test for inequality.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class NotEqualExpectation extends EqualExpectation {
+
+ /**
+ * Sets the value to compare against.
+ * @param mixed $value Test value to match.
+ * @param string $message Customised message on failure.
+ * @access public
+ */
+ function NotEqualExpectation($value, $message = '%s') {
+ $this->EqualExpectation($value, $message);
+ }
+
+ /**
+ * Tests the expectation. True if it differs from the
+ * held value.
+ * @param mixed $compare Comparison value.
+ * @return boolean True if correct.
+ * @access public
+ */
+ function test($compare) {
+ return ! parent::test($compare);
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ $dumper = &$this->_getDumper();
+ if ($this->test($compare)) {
+ return "Not equal expectation passes " .
+ $dumper->describeDifference($this->_getValue(), $compare);
+ } else {
+ return "Not equal expectation fails [" .
+ $dumper->describeValue($this->_getValue()) .
+ "] matches";
+ }
+ }
+ }
+
+ /**
+ * Test for being within a range.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class WithinMarginExpectation extends SimpleExpectation {
+ var $_upper;
+ var $_lower;
+
+ /**
+ * Sets the value to compare against and the fuzziness of
+ * the match. Used for comparing floating point values.
+ * @param mixed $value Test value to match.
+ * @param mixed $margin Fuzziness of match.
+ * @param string $message Customised message on failure.
+ * @access public
+ */
+ function WithinMarginExpectation($value, $margin, $message = '%s') {
+ $this->SimpleExpectation($message);
+ $this->_upper = $value + $margin;
+ $this->_lower = $value - $margin;
+ }
+
+ /**
+ * Tests the expectation. True if it matches the
+ * held value.
+ * @param mixed $compare Comparison value.
+ * @return boolean True if correct.
+ * @access public
+ */
+ function test($compare) {
+ return (($compare <= $this->_upper) && ($compare >= $this->_lower));
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ if ($this->test($compare)) {
+ return $this->_withinMessage($compare);
+ } else {
+ return $this->_outsideMessage($compare);
+ }
+ }
+
+ /**
+ * Creates a the message for being within the range.
+ * @param mixed $compare Value being tested.
+ * @access private
+ */
+ function _withinMessage($compare) {
+ return "Within expectation [" . $this->_dumper->describeValue($this->_lower) . "] and [" .
+ $this->_dumper->describeValue($this->_upper) . "]";
+ }
+
+ /**
+ * Creates a the message for being within the range.
+ * @param mixed $compare Value being tested.
+ * @access private
+ */
+ function _outsideMessage($compare) {
+ if ($compare > $this->_upper) {
+ return "Outside expectation " .
+ $this->_dumper->describeDifference($compare, $this->_upper);
+ } else {
+ return "Outside expectation " .
+ $this->_dumper->describeDifference($compare, $this->_lower);
+ }
+ }
+ }
+
+ /**
+ * Test for being outside of a range.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class OutsideMarginExpectation extends WithinMarginExpectation {
+
+ /**
+ * Sets the value to compare against and the fuzziness of
+ * the match. Used for comparing floating point values.
+ * @param mixed $value Test value to not match.
+ * @param mixed $margin Fuzziness of match.
+ * @param string $message Customised message on failure.
+ * @access public
+ */
+ function OutsideMarginExpectation($value, $margin, $message = '%s') {
+ $this->WithinMarginExpectation($value, $margin, $message);
+ }
+
+ /**
+ * Tests the expectation. True if it matches the
+ * held value.
+ * @param mixed $compare Comparison value.
+ * @return boolean True if correct.
+ * @access public
+ */
+ function test($compare) {
+ return ! parent::test($compare);
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ if (! $this->test($compare)) {
+ return $this->_withinMessage($compare);
+ } else {
+ return $this->_outsideMessage($compare);
+ }
+ }
+ }
+
+ /**
+ * Test for reference.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class ReferenceExpectation extends SimpleExpectation {
+ var $_value;
+
+ /**
+ * Sets the reference value to compare against.
+ * @param mixed $value Test reference to match.
+ * @param string $message Customised message on failure.
+ * @access public
+ */
+ function ReferenceExpectation(&$value, $message = '%s') {
+ $this->SimpleExpectation($message);
+ $this->_value =& $value;
+ }
+
+ /**
+ * Tests the expectation. True if it exactly
+ * references the held value.
+ * @param mixed $compare Comparison reference.
+ * @return boolean True if correct.
+ * @access public
+ */
+ function test(&$compare) {
+ return SimpleTestCompatibility::isReference($this->_value, $compare);
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ if ($this->test($compare)) {
+ return "Reference expectation [" . $this->_dumper->describeValue($this->_value) . "]";
+ } else {
+ return "Reference expectation fails " .
+ $this->_dumper->describeDifference($this->_value, $compare);
+ }
+ }
+
+ function _getValue() {
+ return $this->_value;
+ }
+ }
+
+ /**
+ * Test for identity.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class IdenticalExpectation extends EqualExpectation {
+
+ /**
+ * Sets the value to compare against.
+ * @param mixed $value Test value to match.
+ * @param string $message Customised message on failure.
+ * @access public
+ */
+ function IdenticalExpectation($value, $message = '%s') {
+ $this->EqualExpectation($value, $message);
+ }
+
+ /**
+ * Tests the expectation. True if it exactly
+ * matches the held value.
+ * @param mixed $compare Comparison value.
+ * @return boolean True if correct.
+ * @access public
+ */
+ function test($compare) {
+ return SimpleTestCompatibility::isIdentical($this->_getValue(), $compare);
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ $dumper = &$this->_getDumper();
+ if ($this->test($compare)) {
+ return "Identical expectation [" . $dumper->describeValue($this->_getValue()) . "]";
+ } else {
+ return "Identical expectation [" . $dumper->describeValue($this->_getValue()) .
+ "] fails with [" .
+ $dumper->describeValue($compare) . "] " .
+ $dumper->describeDifference($this->_getValue(), $compare, TYPE_MATTERS);
+ }
+ }
+ }
+
+ /**
+ * Test for non-identity.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class NotIdenticalExpectation extends IdenticalExpectation {
+
+ /**
+ * Sets the value to compare against.
+ * @param mixed $value Test value to match.
+ * @param string $message Customised message on failure.
+ * @access public
+ */
+ function NotIdenticalExpectation($value, $message = '%s') {
+ $this->IdenticalExpectation($value, $message);
+ }
+
+ /**
+ * Tests the expectation. True if it differs from the
+ * held value.
+ * @param mixed $compare Comparison value.
+ * @return boolean True if correct.
+ * @access public
+ */
+ function test($compare) {
+ return ! parent::test($compare);
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ $dumper = &$this->_getDumper();
+ if ($this->test($compare)) {
+ return "Not identical expectation passes " .
+ $dumper->describeDifference($this->_getValue(), $compare, TYPE_MATTERS);
+ } else {
+ return "Not identical expectation [" . $dumper->describeValue($this->_getValue()) . "] matches";
+ }
+ }
+ }
+
+ /**
+ * Test for a pattern using Perl regex rules.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class PatternExpectation extends SimpleExpectation {
+ var $_pattern;
+
+ /**
+ * Sets the value to compare against.
+ * @param string $pattern Pattern to search for.
+ * @param string $message Customised message on failure.
+ * @access public
+ */
+ function PatternExpectation($pattern, $message = '%s') {
+ $this->SimpleExpectation($message);
+ $this->_pattern = $pattern;
+ }
+
+ /**
+ * Accessor for the pattern.
+ * @return string Perl regex as string.
+ * @access protected
+ */
+ function _getPattern() {
+ return $this->_pattern;
+ }
+
+ /**
+ * Tests the expectation. True if the Perl regex
+ * matches the comparison value.
+ * @param string $compare Comparison value.
+ * @return boolean True if correct.
+ * @access public
+ */
+ function test($compare) {
+ return (boolean)preg_match($this->_getPattern(), $compare);
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ if ($this->test($compare)) {
+ return $this->_describePatternMatch($this->_getPattern(), $compare);
+ } else {
+ $dumper = &$this->_getDumper();
+ return "Pattern [" . $this->_getPattern() .
+ "] not detected in [" .
+ $dumper->describeValue($compare) . "]";
+ }
+ }
+
+ /**
+ * Describes a pattern match including the string
+ * found and it's position.
+ * @param string $pattern Regex to match against.
+ * @param string $subject Subject to search.
+ * @access protected
+ */
+ function _describePatternMatch($pattern, $subject) {
+ preg_match($pattern, $subject, $matches);
+ $position = strpos($subject, $matches[0]);
+ $dumper = $this->_getDumper();
+ return "Pattern [$pattern] detected at character [$position] in [" .
+ $dumper->describeValue($subject) . "] as [" .
+ $matches[0] . "] in region [" .
+ $dumper->clipString($subject, 100, $position) . "]";
+ }
+ }
+
+ /**
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @deprecated
+ */
+ class WantedPatternExpectation extends PatternExpectation {
+ }
+
+ /**
+ * Fail if a pattern is detected within the
+ * comparison.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class NoPatternExpectation extends PatternExpectation {
+
+ /**
+ * Sets the reject pattern
+ * @param string $pattern Pattern to search for.
+ * @param string $message Customised message on failure.
+ * @access public
+ */
+ function NoPatternExpectation($pattern, $message = '%s') {
+ $this->PatternExpectation($pattern, $message);
+ }
+
+ /**
+ * Tests the expectation. False if the Perl regex
+ * matches the comparison value.
+ * @param string $compare Comparison value.
+ * @return boolean True if correct.
+ * @access public
+ */
+ function test($compare) {
+ return ! parent::test($compare);
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param string $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ if ($this->test($compare)) {
+ $dumper = &$this->_getDumper();
+ return "Pattern [" . $this->_getPattern() .
+ "] not detected in [" .
+ $dumper->describeValue($compare) . "]";
+ } else {
+ return $this->_describePatternMatch($this->_getPattern(), $compare);
+ }
+ }
+ }
+
+ /**
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @deprecated
+ */
+ class UnwantedPatternExpectation extends NoPatternExpectation {
+ }
+
+ /**
+ * Tests either type or class name if it's an object.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class IsAExpectation extends SimpleExpectation {
+ var $_type;
+
+ /**
+ * Sets the type to compare with.
+ * @param string $type Type or class name.
+ * @param string $message Customised message on failure.
+ * @access public
+ */
+ function IsAExpectation($type, $message = '%s') {
+ $this->SimpleExpectation($message);
+ $this->_type = $type;
+ }
+
+ /**
+ * Accessor for type to check against.
+ * @return string Type or class name.
+ * @access protected
+ */
+ function _getType() {
+ return $this->_type;
+ }
+
+ /**
+ * Tests the expectation. True if the type or
+ * class matches the string value.
+ * @param string $compare Comparison value.
+ * @return boolean True if correct.
+ * @access public
+ */
+ function test($compare) {
+ if (is_object($compare)) {
+ return SimpleTestCompatibility::isA($compare, $this->_type);
+ } else {
+ return (strtolower(gettype($compare)) == $this->_canonicalType($this->_type));
+ }
+ }
+
+ /**
+ * Coerces type name into a gettype() match.
+ * @param string $type User type.
+ * @return string Simpler type.
+ * @access private
+ */
+ function _canonicalType($type) {
+ $type = strtolower($type);
+ $map = array(
+ 'bool' => 'boolean',
+ 'float' => 'double',
+ 'real' => 'double',
+ 'int' => 'integer');
+ if (isset($map[$type])) {
+ $type = $map[$type];
+ }
+ return $type;
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ $dumper = &$this->_getDumper();
+ return "Value [" . $dumper->describeValue($compare) .
+ "] should be type [" . $this->_type . "]";
+ }
+ }
+
+ /**
+ * Tests either type or class name if it's an object.
+ * Will succeed if the type does not match.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class NotAExpectation extends IsAExpectation {
+ var $_type;
+
+ /**
+ * Sets the type to compare with.
+ * @param string $type Type or class name.
+ * @param string $message Customised message on failure.
+ * @access public
+ */
+ function NotAExpectation($type, $message = '%s') {
+ $this->IsAExpectation($type, $message);
+ }
+
+ /**
+ * Tests the expectation. False if the type or
+ * class matches the string value.
+ * @param string $compare Comparison value.
+ * @return boolean True if different.
+ * @access public
+ */
+ function test($compare) {
+ return ! parent::test($compare);
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ $dumper = &$this->_getDumper();
+ return "Value [" . $dumper->describeValue($compare) .
+ "] should not be type [" . $this->_getType() . "]";
+ }
+ }
+
+ /**
+ * Tests for existance of a method in an object
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class MethodExistsExpectation extends SimpleExpectation {
+ var $_method;
+
+ /**
+ * Sets the value to compare against.
+ * @param string $method Method to check.
+ * @param string $message Customised message on failure.
+ * @access public
+ * @return void
+ */
+ function MethodExistsExpectation($method, $message = '%s') {
+ $this->SimpleExpectation($message);
+ $this->_method = &$method;
+ }
+
+ /**
+ * Tests the expectation. True if the method exists in the test object.
+ * @param string $compare Comparison method name.
+ * @return boolean True if correct.
+ * @access public
+ */
+ function test($compare) {
+ return (boolean)(is_object($compare) && method_exists($compare, $this->_method));
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ $dumper = &$this->_getDumper();
+ if (! is_object($compare)) {
+ return 'No method on non-object [' . $dumper->describeValue($compare) . ']';
+ }
+ $method = $this->_method;
+ return "Object [" . $dumper->describeValue($compare) .
+ "] should contain method [$method]";
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/extensions/pear_test_case.php b/tests/simpletest/extensions/pear_test_case.php
new file mode 100755
index 0000000000..0a33526c94
--- /dev/null
+++ b/tests/simpletest/extensions/pear_test_case.php
@@ -0,0 +1,198 @@
+<?php
+ /**
+ * adapter for SimpleTest to use PEAR PHPUnit test cases
+ * @package SimpleTest
+ * @subpackage Extensions
+ * @version $Id: pear_test_case.php,v 1.9 2006/11/10 20:59:58 lastcraft Exp $
+ */
+
+ /**#@+
+ * include SimpleTest files
+ */
+ require_once(dirname(__FILE__) . '/../dumper.php');
+ require_once(dirname(__FILE__) . '/../compatibility.php');
+ require_once(dirname(__FILE__) . '/../test_case.php');
+ require_once(dirname(__FILE__) . '/../expectation.php');
+ /**#@-*/
+
+ /**
+ * Adapter for PEAR PHPUnit test case to allow
+ * legacy PEAR test cases to be used with SimpleTest.
+ * @package SimpleTest
+ * @subpackage Extensions
+ */
+ class PHPUnit_TestCase extends SimpleTestCase {
+ var $_loosely_typed;
+
+ /**
+ * Constructor. Sets the test name.
+ * @param $label Test name to display.
+ * @public
+ */
+ function PHPUnit_TestCase($label = false) {
+ $this->SimpleTestCase($label);
+ $this->_loosely_typed = false;
+ }
+
+ /**
+ * Will test straight equality if set to loose
+ * typing, or identity if not.
+ * @param $first First value.
+ * @param $second Comparison value.
+ * @param $message Message to display.
+ * @public
+ */
+ function assertEquals($first, $second, $message = "%s", $delta = 0) {
+ if ($this->_loosely_typed) {
+ $expectation = &new EqualExpectation($first);
+ } else {
+ $expectation = &new IdenticalExpectation($first);
+ }
+ $this->assert($expectation, $second, $message);
+ }
+
+ /**
+ * Passes if the value tested is not null.
+ * @param $value Value to test against.
+ * @param $message Message to display.
+ * @public
+ */
+ function assertNotNull($value, $message = "%s") {
+ parent::assert(new TrueExpectation(), isset($value), $message);
+ }
+
+ /**
+ * Passes if the value tested is null.
+ * @param $value Value to test against.
+ * @param $message Message to display.
+ * @public
+ */
+ function assertNull($value, $message = "%s") {
+ parent::assert(new TrueExpectation(), !isset($value), $message);
+ }
+
+ /**
+ * In PHP5 the identity test tests for the same
+ * object. This is a reference test in PHP4.
+ * @param $first First object handle.
+ * @param $second Hopefully the same handle.
+ * @param $message Message to display.
+ * @public
+ */
+ function assertSame(&$first, &$second, $message = "%s") {
+ $dumper = &new SimpleDumper();
+ $message = sprintf(
+ $message,
+ "[" . $dumper->describeValue($first) .
+ "] and [" . $dumper->describeValue($second) .
+ "] should reference the same object");
+ return $this->assert(
+ new TrueExpectation(),
+ SimpleTestCompatibility::isReference($first, $second),
+ $message);
+ }
+
+ /**
+ * In PHP5 the identity test tests for the same
+ * object. This is a reference test in PHP4.
+ * @param $first First object handle.
+ * @param $second Hopefully a different handle.
+ * @param $message Message to display.
+ * @public
+ */
+ function assertNotSame(&$first, &$second, $message = "%s") {
+ $dumper = &new SimpleDumper();
+ $message = sprintf(
+ $message,
+ "[" . $dumper->describeValue($first) .
+ "] and [" . $dumper->describeValue($second) .
+ "] should not be the same object");
+ return $this->assert(
+ new falseExpectation(),
+ SimpleTestCompatibility::isReference($first, $second),
+ $message);
+ }
+
+ /**
+ * Sends pass if the test condition resolves true,
+ * a fail otherwise.
+ * @param $condition Condition to test true.
+ * @param $message Message to display.
+ * @public
+ */
+ function assertTrue($condition, $message = "%s") {
+ parent::assert(new TrueExpectation(), $condition, $message);
+ }
+
+ /**
+ * Sends pass if the test condition resolves false,
+ * a fail otherwise.
+ * @param $condition Condition to test false.
+ * @param $message Message to display.
+ * @public
+ */
+ function assertFalse($condition, $message = "%s") {
+ parent::assert(new FalseExpectation(), $condition, $message);
+ }
+
+ /**
+ * Tests a regex match. Needs refactoring.
+ * @param $pattern Regex to match.
+ * @param $subject String to search in.
+ * @param $message Message to display.
+ * @public
+ */
+ function assertRegExp($pattern, $subject, $message = "%s") {
+ $this->assert(new PatternExpectation($pattern), $subject, $message);
+ }
+
+ /**
+ * Tests the type of a value.
+ * @param $value Value to take type of.
+ * @param $type Hoped for type.
+ * @param $message Message to display.
+ * @public
+ */
+ function assertType($value, $type, $message = "%s") {
+ parent::assert(new TrueExpectation(), gettype($value) == strtolower($type), $message);
+ }
+
+ /**
+ * Sets equality operation to act as a simple equal
+ * comparison only, allowing a broader range of
+ * matches.
+ * @param $loosely_typed True for broader comparison.
+ * @public
+ */
+ function setLooselyTyped($loosely_typed) {
+ $this->_loosely_typed = $loosely_typed;
+ }
+
+ /**
+ * For progress indication during
+ * a test amongst other things.
+ * @return Usually one.
+ * @public
+ */
+ function countTestCases() {
+ return $this->getSize();
+ }
+
+ /**
+ * Accessor for name, normally just the class
+ * name.
+ * @public
+ */
+ function getName() {
+ return $this->getLabel();
+ }
+
+ /**
+ * Does nothing. For compatibility only.
+ * @param $name Dummy
+ * @public
+ */
+ function setName($name) {
+ }
+ }
+?>
diff --git a/tests/simpletest/extensions/phpunit_test_case.php b/tests/simpletest/extensions/phpunit_test_case.php
new file mode 100755
index 0000000000..6787362708
--- /dev/null
+++ b/tests/simpletest/extensions/phpunit_test_case.php
@@ -0,0 +1,96 @@
+<?php
+ /**
+ * adapter for SimpleTest to use PHPUnit test cases
+ * @package SimpleTest
+ * @subpackage Extensions
+ * @version $Id: phpunit_test_case.php,v 1.8 2007/06/04 23:35:45 lastcraft Exp $
+ */
+
+ /**#@+
+ * include SimpleTest files
+ */
+ require_once(dirname(__FILE__) . '/../unit_tester.php');
+ require_once(dirname(__FILE__) . '/../expectation.php');
+ /**#@-*/
+
+ /**
+ * Adapter for sourceforge PHPUnit test case to allow
+ * legacy test cases to be used with SimpleTest.
+ * @package SimpleTest
+ * @subpackage Extensions
+ */
+ class TestCase extends SimpleTestCase {
+
+ /**
+ * Constructor. Sets the test name.
+ * @param $label Test name to display.
+ * @public
+ */
+ function TestCase($label = false) {
+ $this->SimpleTestCase($label);
+ }
+
+ /**
+ * Sends pass if the test condition resolves true,
+ * a fail otherwise.
+ * @param $condition Condition to test true.
+ * @param $message Message to display.
+ * @public
+ */
+ function assert($condition, $message = false) {
+ parent::assert(new TrueExpectation(), $condition, $message);
+ }
+
+ /**
+ * Will test straight equality if set to loose
+ * typing, or identity if not.
+ * @param $first First value.
+ * @param $second Comparison value.
+ * @param $message Message to display.
+ * @public
+ */
+ function assertEquals($first, $second, $message = false) {
+ parent::assert(new EqualExpectation($first), $second, $message);
+ }
+
+ /**
+ * Simple string equality.
+ * @param $first First value.
+ * @param $second Comparison value.
+ * @param $message Message to display.
+ * @public
+ */
+ function assertEqualsMultilineStrings($first, $second, $message = false) {
+ parent::assert(new EqualExpectation($first), $second, $message);
+ }
+
+ /**
+ * Tests a regex match.
+ * @param $pattern Regex to match.
+ * @param $subject String to search in.
+ * @param $message Message to display.
+ * @public
+ */
+ function assertRegexp($pattern, $subject, $message = false) {
+ parent::assert(new PatternExpectation($pattern), $subject, $message);
+ }
+
+ /**
+ * Sends an error which we interpret as a fail
+ * with a different message for compatibility.
+ * @param $message Message to display.
+ * @public
+ */
+ function error($message) {
+ parent::fail("Error triggered [$message]");
+ }
+
+ /**
+ * Accessor for name.
+ * @public
+ */
+ function name() {
+ return $this->getLabel();
+ }
+ }
+?>
diff --git a/tests/simpletest/extensions/testdox.php b/tests/simpletest/extensions/testdox.php
new file mode 100755
index 0000000000..7db7c872c2
--- /dev/null
+++ b/tests/simpletest/extensions/testdox.php
@@ -0,0 +1,42 @@
+<?php
+
+class TestDoxReporter extends SimpleReporter
+{
+ var $_test_case_pattern = '/^TestOf(.*)$/';
+
+ function TestDoxReporter($test_case_pattern = '/^TestOf(.*)$/') {
+ parent::SimpleScorer();
+ $this->_test_case_pattern = empty($test_case_pattern) ? '/^(.*)$/' : $test_case_pattern;
+ }
+
+ function paintCaseStart($test_name) {
+ preg_match($this->_test_case_pattern, $test_name, $matches);
+ if (!empty($matches[1])) {
+ echo $matches[1] . "\n";
+ } else {
+ echo $test_name . "\n";
+ }
+ }
+
+ function paintCaseEnd() {
+ echo "\n";
+ }
+
+ function paintMethodStart($test_name) {
+ if (!preg_match('/^test(.*)$/i', $test_name, $matches)) {
+ return;
+ }
+ $test_name = $matches[1];
+
+ $test_name = preg_replace('/([A-Z])([A-Z])/', '$1 $2', $test_name);
+ echo '- ' . strtolower(preg_replace('/([a-zA-Z])([A-Z0-9])/', '$1 $2', $test_name));
+ }
+
+ function paintMethodEnd() {
+ echo "\n";
+ }
+
+ function paintFail() {
+ echo " [FAILED]";
+ }
+}
diff --git a/tests/simpletest/extensions/testdox/test.php b/tests/simpletest/extensions/testdox/test.php
new file mode 100755
index 0000000000..0c37327dd2
--- /dev/null
+++ b/tests/simpletest/extensions/testdox/test.php
@@ -0,0 +1,106 @@
+<?php
+require_once dirname(__FILE__) . '/../../autorun.php';
+require_once dirname(__FILE__) . '/../../extensions/testdox.php';
+// uncomment to see test dox in action
+//SimpleTest::prefer(new TestDoxReporter());
+
+class TestOfTestDoxReporter extends UnitTestCase {
+
+ function testIsAnInstanceOfSimpleScorerAndReporter() {
+ $dox = new TestDoxReporter();
+ $this->assertIsA($dox, 'SimpleScorer');
+ $this->assertIsA($dox, 'SimpleReporter');
+ }
+
+ function testOutputsNameOfTestCase() {
+ $dox = new TestDoxReporter();
+ ob_start();
+ $dox->paintCaseStart('TestOfTestDoxReporter');
+ $buffer = ob_get_clean();
+ $this->assertWantedPattern('/^TestDoxReporter/', $buffer);
+ }
+
+ function testOutputOfTestCaseNameFilteredByConstructParameter() {
+ $dox = new TestDoxReporter('/^(.*)Test$/');
+ ob_start();
+ $dox->paintCaseStart('SomeGreatWidgetTest');
+ $buffer = ob_get_clean();
+ $this->assertWantedPattern('/^SomeGreatWidget/', $buffer);
+ }
+
+ function testIfTest_case_patternIsEmptyAssumeEverythingMatches() {
+ $dox = new TestDoxReporter('');
+ ob_start();
+ $dox->paintCaseStart('TestOfTestDoxReporter');
+ $buffer = ob_get_clean();
+ $this->assertWantedPattern('/^TestOfTestDoxReporter/', $buffer);
+ }
+
+ function testEmptyLineInsertedWhenCaseEnds() {
+ $dox = new TestDoxReporter();
+ ob_start();
+ $dox->paintCaseEnd('TestOfTestDoxReporter');
+ $buffer = ob_get_clean();
+ $this->assertEqual("\n", $buffer);
+ }
+
+ function testPaintsTestMethodInTestDoxFormat() {
+ $dox = new TestDoxReporter();
+ ob_start();
+ $dox->paintMethodStart('testSomeGreatTestCase');
+ $buffer = ob_get_clean();
+ $this->assertEqual("- some great test case", $buffer);
+ unset($buffer);
+
+ $random = rand(100, 200);
+ ob_start();
+ $dox->paintMethodStart("testRandomNumberIs{$random}");
+ $buffer = ob_get_clean();
+ $this->assertEqual("- random number is {$random}", $buffer);
+ }
+
+ function testDoesNotOutputAnythingOnNoneTestMethods() {
+ $dox = new TestDoxReporter();
+ ob_start();
+ $dox->paintMethodStart('nonMatchingMethod');
+ $buffer = ob_get_clean();
+ $this->assertEqual('', $buffer);
+ }
+
+ function testPaintMethodAddLineBreak() {
+ $dox = new TestDoxReporter();
+ ob_start();
+ $dox->paintMethodEnd('someMethod');
+ $buffer = ob_get_clean();
+ $this->assertEqual("\n", $buffer);
+ $this->assertNoErrors();
+ }
+
+ function testProperlySpacesSingleLettersInMethodName() {
+ $dox = new TestDoxReporter();
+ ob_start();
+ $dox->paintMethodStart('testAVerySimpleAgainAVerySimpleMethod');
+ $buffer = ob_get_clean();
+ $this->assertEqual('- a very simple again a very simple method', $buffer);
+ }
+
+ function testOnFailureThisPrintsFailureNotice() {
+ $dox = new TestDoxReporter();
+ ob_start();
+ $dox->paintFail();
+ $buffer = ob_get_clean();
+ $this->assertEqual(' [FAILED]', $buffer);
+ }
+
+ function testWhenMatchingMethodNamesTestPrefixIsCaseInsensitive() {
+ $dox = new TestDoxReporter();
+ ob_start();
+ $dox->paintMethodStart('TESTSupportsAllUppercaseTestPrefixEvenThoughIDoNotKnowWhyYouWouldDoThat');
+ $buffer = ob_get_clean();
+ $this->assertEqual(
+ '- supports all uppercase test prefix even though i do not know why you would do that',
+ $buffer
+ );
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/form.php b/tests/simpletest/form.php
new file mode 100755
index 0000000000..6868b91f78
--- /dev/null
+++ b/tests/simpletest/form.php
@@ -0,0 +1,351 @@
+<?php
+/**
+ * Base include file for SimpleTest.
+ * @package SimpleTest
+ * @subpackage WebTester
+ * @version $Id: form.php,v 1.41 2007/07/16 22:28:39 lastcraft Exp $
+ */
+
+/**#@+
+ * include SimpleTest files
+ */
+require_once(dirname(__FILE__) . '/tag.php');
+require_once(dirname(__FILE__) . '/encoding.php');
+require_once(dirname(__FILE__) . '/selector.php');
+/**#@-*/
+
+/**
+ * Form tag class to hold widget values.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+class SimpleForm {
+ var $_method;
+ var $_action;
+ var $_encoding;
+ var $_default_target;
+ var $_id;
+ var $_buttons;
+ var $_images;
+ var $_widgets;
+ var $_radios;
+ var $_checkboxes;
+
+ /**
+ * Starts with no held controls/widgets.
+ * @param SimpleTag $tag Form tag to read.
+ * @param SimplePage $page Holding page.
+ */
+ function SimpleForm($tag, &$page) {
+ $this->_method = $tag->getAttribute('method');
+ $this->_action = $this->_createAction($tag->getAttribute('action'), $page);
+ $this->_encoding = $this->_setEncodingClass($tag);
+ $this->_default_target = false;
+ $this->_id = $tag->getAttribute('id');
+ $this->_buttons = array();
+ $this->_images = array();
+ $this->_widgets = array();
+ $this->_radios = array();
+ $this->_checkboxes = array();
+ }
+
+ /**
+ * Creates the request packet to be sent by the form.
+ * @param SimpleTag $tag Form tag to read.
+ * @return string Packet class.
+ * @access private
+ */
+ function _setEncodingClass($tag) {
+ if (strtolower($tag->getAttribute('method')) == 'post') {
+ if (strtolower($tag->getAttribute('enctype')) == 'multipart/form-data') {
+ return 'SimpleMultipartEncoding';
+ }
+ return 'SimplePostEncoding';
+ }
+ return 'SimpleGetEncoding';
+ }
+
+ /**
+ * Sets the frame target within a frameset.
+ * @param string $frame Name of frame.
+ * @access public
+ */
+ function setDefaultTarget($frame) {
+ $this->_default_target = $frame;
+ }
+
+ /**
+ * Accessor for method of form submission.
+ * @return string Either get or post.
+ * @access public
+ */
+ function getMethod() {
+ return ($this->_method ? strtolower($this->_method) : 'get');
+ }
+
+ /**
+ * Combined action attribute with current location
+ * to get an absolute form target.
+ * @param string $action Action attribute from form tag.
+ * @param SimpleUrl $base Page location.
+ * @return SimpleUrl Absolute form target.
+ */
+ function _createAction($action, &$page) {
+ if (($action === '') || ($action === false)) {
+ return $page->expandUrl($page->getUrl());
+ }
+ return $page->expandUrl(new SimpleUrl($action));;
+ }
+
+ /**
+ * Absolute URL of the target.
+ * @return SimpleUrl URL target.
+ * @access public
+ */
+ function getAction() {
+ $url = $this->_action;
+ if ($this->_default_target && ! $url->getTarget()) {
+ $url->setTarget($this->_default_target);
+ }
+ return $url;
+ }
+
+ /**
+ * Creates the encoding for the current values in the
+ * form.
+ * @return SimpleFormEncoding Request to submit.
+ * @access private
+ */
+ function _encode() {
+ $class = $this->_encoding;
+ $encoding = new $class();
+ for ($i = 0, $count = count($this->_widgets); $i < $count; $i++) {
+ $this->_widgets[$i]->write($encoding);
+ }
+ return $encoding;
+ }
+
+ /**
+ * ID field of form for unique identification.
+ * @return string Unique tag ID.
+ * @access public
+ */
+ function getId() {
+ return $this->_id;
+ }
+
+ /**
+ * Adds a tag contents to the form.
+ * @param SimpleWidget $tag Input tag to add.
+ * @access public
+ */
+ function addWidget(&$tag) {
+ if (strtolower($tag->getAttribute('type')) == 'submit') {
+ $this->_buttons[] = &$tag;
+ } elseif (strtolower($tag->getAttribute('type')) == 'image') {
+ $this->_images[] = &$tag;
+ } elseif ($tag->getName()) {
+ $this->_setWidget($tag);
+ }
+ }
+
+ /**
+ * Sets the widget into the form, grouping radio
+ * buttons if any.
+ * @param SimpleWidget $tag Incoming form control.
+ * @access private
+ */
+ function _setWidget(&$tag) {
+ if (strtolower($tag->getAttribute('type')) == 'radio') {
+ $this->_addRadioButton($tag);
+ } elseif (strtolower($tag->getAttribute('type')) == 'checkbox') {
+ $this->_addCheckbox($tag);
+ } else {
+ $this->_widgets[] = &$tag;
+ }
+ }
+
+ /**
+ * Adds a radio button, building a group if necessary.
+ * @param SimpleRadioButtonTag $tag Incoming form control.
+ * @access private
+ */
+ function _addRadioButton(&$tag) {
+ if (! isset($this->_radios[$tag->getName()])) {
+ $this->_widgets[] = &new SimpleRadioGroup();
+ $this->_radios[$tag->getName()] = count($this->_widgets) - 1;
+ }
+ $this->_widgets[$this->_radios[$tag->getName()]]->addWidget($tag);
+ }
+
+ /**
+ * Adds a checkbox, making it a group on a repeated name.
+ * @param SimpleCheckboxTag $tag Incoming form control.
+ * @access private
+ */
+ function _addCheckbox(&$tag) {
+ if (! isset($this->_checkboxes[$tag->getName()])) {
+ $this->_widgets[] = &$tag;
+ $this->_checkboxes[$tag->getName()] = count($this->_widgets) - 1;
+ } else {
+ $index = $this->_checkboxes[$tag->getName()];
+ if (! SimpleTestCompatibility::isA($this->_widgets[$index], 'SimpleCheckboxGroup')) {
+ $previous = &$this->_widgets[$index];
+ $this->_widgets[$index] = &new SimpleCheckboxGroup();
+ $this->_widgets[$index]->addWidget($previous);
+ }
+ $this->_widgets[$index]->addWidget($tag);
+ }
+ }
+
+ /**
+ * Extracts current value from form.
+ * @param SimpleSelector $selector Criteria to apply.
+ * @return string/array Value(s) as string or null
+ * if not set.
+ * @access public
+ */
+ function getValue($selector) {
+ for ($i = 0, $count = count($this->_widgets); $i < $count; $i++) {
+ if ($selector->isMatch($this->_widgets[$i])) {
+ return $this->_widgets[$i]->getValue();
+ }
+ }
+ foreach ($this->_buttons as $button) {
+ if ($selector->isMatch($button)) {
+ return $button->getValue();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Sets a widget value within the form.
+ * @param SimpleSelector $selector Criteria to apply.
+ * @param string $value Value to input into the widget.
+ * @return boolean True if value is legal, false
+ * otherwise. If the field is not
+ * present, nothing will be set.
+ * @access public
+ */
+ function setField($selector, $value) {
+ $success = false;
+ for ($i = 0, $count = count($this->_widgets); $i < $count; $i++) {
+ if ($selector->isMatch($this->_widgets[$i])) {
+ if ($this->_widgets[$i]->setValue($value)) {
+ $success = true;
+ }
+ }
+ }
+ return $success;
+ }
+
+ /**
+ * Used by the page object to set widgets labels to
+ * external label tags.
+ * @param SimpleSelector $selector Criteria to apply.
+ * @access public
+ */
+ function attachLabelBySelector($selector, $label) {
+ for ($i = 0, $count = count($this->_widgets); $i < $count; $i++) {
+ if ($selector->isMatch($this->_widgets[$i])) {
+ if (method_exists($this->_widgets[$i], 'setLabel')) {
+ $this->_widgets[$i]->setLabel($label);
+ return;
+ }
+ }
+ }
+ }
+
+ /**
+ * Test to see if a form has a submit button.
+ * @param SimpleSelector $selector Criteria to apply.
+ * @return boolean True if present.
+ * @access public
+ */
+ function hasSubmit($selector) {
+ foreach ($this->_buttons as $button) {
+ if ($selector->isMatch($button)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Test to see if a form has an image control.
+ * @param SimpleSelector $selector Criteria to apply.
+ * @return boolean True if present.
+ * @access public
+ */
+ function hasImage($selector) {
+ foreach ($this->_images as $image) {
+ if ($selector->isMatch($image)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Gets the submit values for a selected button.
+ * @param SimpleSelector $selector Criteria to apply.
+ * @param hash $additional Additional data for the form.
+ * @return SimpleEncoding Submitted values or false
+ * if there is no such button
+ * in the form.
+ * @access public
+ */
+ function submitButton($selector, $additional = false) {
+ $additional = $additional ? $additional : array();
+ foreach ($this->_buttons as $button) {
+ if ($selector->isMatch($button)) {
+ $encoding = $this->_encode();
+ $button->write($encoding);
+ if ($additional) {
+ $encoding->merge($additional);
+ }
+ return $encoding;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Gets the submit values for an image.
+ * @param SimpleSelector $selector Criteria to apply.
+ * @param integer $x X-coordinate of click.
+ * @param integer $y Y-coordinate of click.
+ * @param hash $additional Additional data for the form.
+ * @return SimpleEncoding Submitted values or false
+ * if there is no such button in the
+ * form.
+ * @access public
+ */
+ function submitImage($selector, $x, $y, $additional = false) {
+ $additional = $additional ? $additional : array();
+ foreach ($this->_images as $image) {
+ if ($selector->isMatch($image)) {
+ $encoding = $this->_encode();
+ $image->write($encoding, $x, $y);
+ if ($additional) {
+ $encoding->merge($additional);
+ }
+ return $encoding;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Simply submits the form without the submit button
+ * value. Used when there is only one button or it
+ * is unimportant.
+ * @return hash Submitted values.
+ * @access public
+ */
+ function submit() {
+ return $this->_encode();
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/frames.php b/tests/simpletest/frames.php
new file mode 100755
index 0000000000..23661a9ce1
--- /dev/null
+++ b/tests/simpletest/frames.php
@@ -0,0 +1,596 @@
+<?php
+/**
+ * Base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage WebTester
+ * @version $Id: frames.php,v 1.42 2007/07/16 22:28:39 lastcraft Exp $
+ */
+
+/**#@+
+ * include other SimpleTest class files
+ */
+require_once(dirname(__FILE__) . '/page.php');
+require_once(dirname(__FILE__) . '/user_agent.php');
+/**#@-*/
+
+/**
+ * A composite page. Wraps a frameset page and
+ * adds subframes. The original page will be
+ * mostly ignored. Implements the SimplePage
+ * interface so as to be interchangeable.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+class SimpleFrameset {
+ var $_frameset;
+ var $_frames;
+ var $_focus;
+ var $_names;
+
+ /**
+ * Stashes the frameset page. Will make use of the
+ * browser to fetch the sub frames recursively.
+ * @param SimplePage $page Frameset page.
+ */
+ function SimpleFrameset(&$page) {
+ $this->_frameset = &$page;
+ $this->_frames = array();
+ $this->_focus = false;
+ $this->_names = array();
+ }
+
+ /**
+ * Adds a parsed page to the frameset.
+ * @param SimplePage $page Frame page.
+ * @param string $name Name of frame in frameset.
+ * @access public
+ */
+ function addFrame(&$page, $name = false) {
+ $this->_frames[] = &$page;
+ if ($name) {
+ $this->_names[$name] = count($this->_frames) - 1;
+ }
+ }
+
+ /**
+ * Replaces existing frame with another. If the
+ * frame is nested, then the call is passed down
+ * one level.
+ * @param array $path Path of frame in frameset.
+ * @param SimplePage $page Frame source.
+ * @access public
+ */
+ function setFrame($path, &$page) {
+ $name = array_shift($path);
+ if (isset($this->_names[$name])) {
+ $index = $this->_names[$name];
+ } else {
+ $index = $name - 1;
+ }
+ if (count($path) == 0) {
+ $this->_frames[$index] = &$page;
+ return;
+ }
+ $this->_frames[$index]->setFrame($path, $page);
+ }
+
+ /**
+ * Accessor for current frame focus. Will be
+ * false if no frame has focus. Will have the nested
+ * frame focus if any.
+ * @return array Labels or indexes of nested frames.
+ * @access public
+ */
+ function getFrameFocus() {
+ if ($this->_focus === false) {
+ return array();
+ }
+ return array_merge(
+ array($this->_getPublicNameFromIndex($this->_focus)),
+ $this->_frames[$this->_focus]->getFrameFocus());
+ }
+
+ /**
+ * Turns an internal array index into the frames list
+ * into a public name, or if none, then a one offset
+ * index.
+ * @param integer $subject Internal index.
+ * @return integer/string Public name.
+ * @access private
+ */
+ function _getPublicNameFromIndex($subject) {
+ foreach ($this->_names as $name => $index) {
+ if ($subject == $index) {
+ return $name;
+ }
+ }
+ return $subject + 1;
+ }
+
+ /**
+ * Sets the focus by index. The integer index starts from 1.
+ * If already focused and the target frame also has frames,
+ * then the nested frame will be focused.
+ * @param integer $choice Chosen frame.
+ * @return boolean True if frame exists.
+ * @access public
+ */
+ function setFrameFocusByIndex($choice) {
+ if (is_integer($this->_focus)) {
+ if ($this->_frames[$this->_focus]->hasFrames()) {
+ return $this->_frames[$this->_focus]->setFrameFocusByIndex($choice);
+ }
+ }
+ if (($choice < 1) || ($choice > count($this->_frames))) {
+ return false;
+ }
+ $this->_focus = $choice - 1;
+ return true;
+ }
+
+ /**
+ * Sets the focus by name. If already focused and the
+ * target frame also has frames, then the nested frame
+ * will be focused.
+ * @param string $name Chosen frame.
+ * @return boolean True if frame exists.
+ * @access public
+ */
+ function setFrameFocus($name) {
+ if (is_integer($this->_focus)) {
+ if ($this->_frames[$this->_focus]->hasFrames()) {
+ return $this->_frames[$this->_focus]->setFrameFocus($name);
+ }
+ }
+ if (in_array($name, array_keys($this->_names))) {
+ $this->_focus = $this->_names[$name];
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Clears the frame focus.
+ * @access public
+ */
+ function clearFrameFocus() {
+ $this->_focus = false;
+ $this->_clearNestedFramesFocus();
+ }
+
+ /**
+ * Clears the frame focus for any nested frames.
+ * @access private
+ */
+ function _clearNestedFramesFocus() {
+ for ($i = 0; $i < count($this->_frames); $i++) {
+ $this->_frames[$i]->clearFrameFocus();
+ }
+ }
+
+ /**
+ * Test for the presence of a frameset.
+ * @return boolean Always true.
+ * @access public
+ */
+ function hasFrames() {
+ return true;
+ }
+
+ /**
+ * Accessor for frames information.
+ * @return array/string Recursive hash of frame URL strings.
+ * The key is either a numerical
+ * index or the name attribute.
+ * @access public
+ */
+ function getFrames() {
+ $report = array();
+ for ($i = 0; $i < count($this->_frames); $i++) {
+ $report[$this->_getPublicNameFromIndex($i)] =
+ $this->_frames[$i]->getFrames();
+ }
+ return $report;
+ }
+
+ /**
+ * Accessor for raw text of either all the pages or
+ * the frame in focus.
+ * @return string Raw unparsed content.
+ * @access public
+ */
+ function getRaw() {
+ if (is_integer($this->_focus)) {
+ return $this->_frames[$this->_focus]->getRaw();
+ }
+ $raw = '';
+ for ($i = 0; $i < count($this->_frames); $i++) {
+ $raw .= $this->_frames[$i]->getRaw();
+ }
+ return $raw;
+ }
+
+ /**
+ * Accessor for plain text of either all the pages or
+ * the frame in focus.
+ * @return string Plain text content.
+ * @access public
+ */
+ function getText() {
+ if (is_integer($this->_focus)) {
+ return $this->_frames[$this->_focus]->getText();
+ }
+ $raw = '';
+ for ($i = 0; $i < count($this->_frames); $i++) {
+ $raw .= ' ' . $this->_frames[$i]->getText();
+ }
+ return trim($raw);
+ }
+
+ /**
+ * Accessor for last error.
+ * @return string Error from last response.
+ * @access public
+ */
+ function getTransportError() {
+ if (is_integer($this->_focus)) {
+ return $this->_frames[$this->_focus]->getTransportError();
+ }
+ return $this->_frameset->getTransportError();
+ }
+
+ /**
+ * Request method used to fetch this frame.
+ * @return string GET, POST or HEAD.
+ * @access public
+ */
+ function getMethod() {
+ if (is_integer($this->_focus)) {
+ return $this->_frames[$this->_focus]->getMethod();
+ }
+ return $this->_frameset->getMethod();
+ }
+
+ /**
+ * Original resource name.
+ * @return SimpleUrl Current url.
+ * @access public
+ */
+ function getUrl() {
+ if (is_integer($this->_focus)) {
+ $url = $this->_frames[$this->_focus]->getUrl();
+ $url->setTarget($this->_getPublicNameFromIndex($this->_focus));
+ } else {
+ $url = $this->_frameset->getUrl();
+ }
+ return $url;
+ }
+
+ /**
+ * Page base URL.
+ * @return SimpleUrl Current url.
+ * @access public
+ */
+ function getBaseUrl() {
+ if (is_integer($this->_focus)) {
+ $url = $this->_frames[$this->_focus]->getBaseUrl();
+ } else {
+ $url = $this->_frameset->getBaseUrl();
+ }
+ return $url;
+ }
+
+ /**
+ * Expands expandomatic URLs into fully qualified
+ * URLs for the frameset page.
+ * @param SimpleUrl $url Relative URL.
+ * @return SimpleUrl Absolute URL.
+ * @access public
+ */
+ function expandUrl($url) {
+ return $this->_frameset->expandUrl($url);
+ }
+
+ /**
+ * Original request data.
+ * @return mixed Sent content.
+ * @access public
+ */
+ function getRequestData() {
+ if (is_integer($this->_focus)) {
+ return $this->_frames[$this->_focus]->getRequestData();
+ }
+ return $this->_frameset->getRequestData();
+ }
+
+ /**
+ * Accessor for current MIME type.
+ * @return string MIME type as string; e.g. 'text/html'
+ * @access public
+ */
+ function getMimeType() {
+ if (is_integer($this->_focus)) {
+ return $this->_frames[$this->_focus]->getMimeType();
+ }
+ return $this->_frameset->getMimeType();
+ }
+
+ /**
+ * Accessor for last response code.
+ * @return integer Last HTTP response code received.
+ * @access public
+ */
+ function getResponseCode() {
+ if (is_integer($this->_focus)) {
+ return $this->_frames[$this->_focus]->getResponseCode();
+ }
+ return $this->_frameset->getResponseCode();
+ }
+
+ /**
+ * Accessor for last Authentication type. Only valid
+ * straight after a challenge (401).
+ * @return string Description of challenge type.
+ * @access public
+ */
+ function getAuthentication() {
+ if (is_integer($this->_focus)) {
+ return $this->_frames[$this->_focus]->getAuthentication();
+ }
+ return $this->_frameset->getAuthentication();
+ }
+
+ /**
+ * Accessor for last Authentication realm. Only valid
+ * straight after a challenge (401).
+ * @return string Name of security realm.
+ * @access public
+ */
+ function getRealm() {
+ if (is_integer($this->_focus)) {
+ return $this->_frames[$this->_focus]->getRealm();
+ }
+ return $this->_frameset->getRealm();
+ }
+
+ /**
+ * Accessor for outgoing header information.
+ * @return string Header block.
+ * @access public
+ */
+ function getRequest() {
+ if (is_integer($this->_focus)) {
+ return $this->_frames[$this->_focus]->getRequest();
+ }
+ return $this->_frameset->getRequest();
+ }
+
+ /**
+ * Accessor for raw header information.
+ * @return string Header block.
+ * @access public
+ */
+ function getHeaders() {
+ if (is_integer($this->_focus)) {
+ return $this->_frames[$this->_focus]->getHeaders();
+ }
+ return $this->_frameset->getHeaders();
+ }
+
+ /**
+ * Accessor for parsed title.
+ * @return string Title or false if no title is present.
+ * @access public
+ */
+ function getTitle() {
+ return $this->_frameset->getTitle();
+ }
+
+ /**
+ * Accessor for a list of all fixed links.
+ * @return array List of urls as strings.
+ * @access public
+ */
+ function getUrls() {
+ if (is_integer($this->_focus)) {
+ return $this->_frames[$this->_focus]->getUrls();
+ }
+ $urls = array();
+ foreach ($this->_frames as $frame) {
+ $urls = array_merge($urls, $frame->getUrls());
+ }
+ return array_values(array_unique($urls));
+ }
+
+ /**
+ * Accessor for URLs by the link label. Label will match
+ * regardess of whitespace issues and case.
+ * @param string $label Text of link.
+ * @return array List of links with that label.
+ * @access public
+ */
+ function getUrlsByLabel($label) {
+ if (is_integer($this->_focus)) {
+ return $this->_tagUrlsWithFrame(
+ $this->_frames[$this->_focus]->getUrlsByLabel($label),
+ $this->_focus);
+ }
+ $urls = array();
+ foreach ($this->_frames as $index => $frame) {
+ $urls = array_merge(
+ $urls,
+ $this->_tagUrlsWithFrame(
+ $frame->getUrlsByLabel($label),
+ $index));
+ }
+ return $urls;
+ }
+
+ /**
+ * Accessor for a URL by the id attribute. If in a frameset
+ * then the first link found with that ID attribute is
+ * returned only. Focus on a frame if you want one from
+ * a specific part of the frameset.
+ * @param string $id Id attribute of link.
+ * @return string URL with that id.
+ * @access public
+ */
+ function getUrlById($id) {
+ foreach ($this->_frames as $index => $frame) {
+ if ($url = $frame->getUrlById($id)) {
+ if (! $url->gettarget()) {
+ $url->setTarget($this->_getPublicNameFromIndex($index));
+ }
+ return $url;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Attaches the intended frame index to a list of URLs.
+ * @param array $urls List of SimpleUrls.
+ * @param string $frame Name of frame or index.
+ * @return array List of tagged URLs.
+ * @access private
+ */
+ function _tagUrlsWithFrame($urls, $frame) {
+ $tagged = array();
+ foreach ($urls as $url) {
+ if (! $url->getTarget()) {
+ $url->setTarget($this->_getPublicNameFromIndex($frame));
+ }
+ $tagged[] = $url;
+ }
+ return $tagged;
+ }
+
+ /**
+ * Finds a held form by button label. Will only
+ * search correctly built forms.
+ * @param SimpleSelector $selector Button finder.
+ * @return SimpleForm Form object containing
+ * the button.
+ * @access public
+ */
+ function &getFormBySubmit($selector) {
+ $form = &$this->_findForm('getFormBySubmit', $selector);
+ return $form;
+ }
+
+ /**
+ * Finds a held form by image using a selector.
+ * Will only search correctly built forms. The first
+ * form found either within the focused frame, or
+ * across frames, will be the one returned.
+ * @param SimpleSelector $selector Image finder.
+ * @return SimpleForm Form object containing
+ * the image.
+ * @access public
+ */
+ function &getFormByImage($selector) {
+ $form = &$this->_findForm('getFormByImage', $selector);
+ return $form;
+ }
+
+ /**
+ * Finds a held form by the form ID. A way of
+ * identifying a specific form when we have control
+ * of the HTML code. The first form found
+ * either within the focused frame, or across frames,
+ * will be the one returned.
+ * @param string $id Form label.
+ * @return SimpleForm Form object containing the matching ID.
+ * @access public
+ */
+ function &getFormById($id) {
+ $form = &$this->_findForm('getFormById', $id);
+ return $form;
+ }
+
+ /**
+ * General form finder. Will search all the frames or
+ * just the one in focus.
+ * @param string $method Method to use to find in a page.
+ * @param string $attribute Label, name or ID.
+ * @return SimpleForm Form object containing the matching ID.
+ * @access private
+ */
+ function &_findForm($method, $attribute) {
+ if (is_integer($this->_focus)) {
+ $form = &$this->_findFormInFrame(
+ $this->_frames[$this->_focus],
+ $this->_focus,
+ $method,
+ $attribute);
+ return $form;
+ }
+ for ($i = 0; $i < count($this->_frames); $i++) {
+ $form = &$this->_findFormInFrame(
+ $this->_frames[$i],
+ $i,
+ $method,
+ $attribute);
+ if ($form) {
+ return $form;
+ }
+ }
+ $null = null;
+ return $null;
+ }
+
+ /**
+ * Finds a form in a page using a form finding method. Will
+ * also tag the form with the frame name it belongs in.
+ * @param SimplePage $page Page content of frame.
+ * @param integer $index Internal frame representation.
+ * @param string $method Method to use to find in a page.
+ * @param string $attribute Label, name or ID.
+ * @return SimpleForm Form object containing the matching ID.
+ * @access private
+ */
+ function &_findFormInFrame(&$page, $index, $method, $attribute) {
+ $form = &$this->_frames[$index]->$method($attribute);
+ if (isset($form)) {
+ $form->setDefaultTarget($this->_getPublicNameFromIndex($index));
+ }
+ return $form;
+ }
+
+ /**
+ * Sets a field on each form in which the field is
+ * available.
+ * @param SimpleSelector $selector Field finder.
+ * @param string $value Value to set field to.
+ * @return boolean True if value is valid.
+ * @access public
+ */
+ function setField($selector, $value) {
+ if (is_integer($this->_focus)) {
+ $this->_frames[$this->_focus]->setField($selector, $value);
+ } else {
+ for ($i = 0; $i < count($this->_frames); $i++) {
+ $this->_frames[$i]->setField($selector, $value);
+ }
+ }
+ }
+
+ /**
+ * Accessor for a form element value within a page.
+ * @param SimpleSelector $selector Field finder.
+ * @return string/boolean A string if the field is
+ * present, false if unchecked
+ * and null if missing.
+ * @access public
+ */
+ function getField($selector) {
+ for ($i = 0; $i < count($this->_frames); $i++) {
+ $value = $this->_frames[$i]->getField($selector);
+ if (isset($value)) {
+ return $value;
+ }
+ }
+ return null;
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/http.php b/tests/simpletest/http.php
new file mode 100755
index 0000000000..6ec12cd619
--- /dev/null
+++ b/tests/simpletest/http.php
@@ -0,0 +1,624 @@
+<?php
+ /**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage WebTester
+ * @version $Id: http.php,v 1.112 2005/12/07 18:04:58 lastcraft Exp $
+ */
+
+ /**#@+
+ * include other SimpleTest class files
+ */
+ require_once(dirname(__FILE__) . '/socket.php');
+ require_once(dirname(__FILE__) . '/cookies.php');
+ require_once(dirname(__FILE__) . '/url.php');
+ /**#@-*/
+
+ /**
+ * Creates HTTP headers for the end point of
+ * a HTTP request.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleRoute {
+ var $_url;
+
+ /**
+ * Sets the target URL.
+ * @param SimpleUrl $url URL as object.
+ * @access public
+ */
+ function SimpleRoute($url) {
+ $this->_url = $url;
+ }
+
+ /**
+ * Resource name.
+ * @return SimpleUrl Current url.
+ * @access protected
+ */
+ function getUrl() {
+ return $this->_url;
+ }
+
+ /**
+ * Creates the first line which is the actual request.
+ * @param string $method HTTP request method, usually GET.
+ * @return string Request line content.
+ * @access protected
+ */
+ function _getRequestLine($method) {
+ return $method . ' ' . $this->_url->getPath() .
+ $this->_url->getEncodedRequest() . ' HTTP/1.0';
+ }
+
+ /**
+ * Creates the host part of the request.
+ * @return string Host line content.
+ * @access protected
+ */
+ function _getHostLine() {
+ $line = 'Host: ' . $this->_url->getHost();
+ if ($this->_url->getPort()) {
+ $line .= ':' . $this->_url->getPort();
+ }
+ return $line;
+ }
+
+ /**
+ * Opens a socket to the route.
+ * @param string $method HTTP request method, usually GET.
+ * @param integer $timeout Connection timeout.
+ * @return SimpleSocket New socket.
+ * @access public
+ */
+ function &createConnection($method, $timeout) {
+ $default_port = ('https' == $this->_url->getScheme()) ? 443 : 80;
+ $socket = &$this->_createSocket(
+ $this->_url->getScheme() ? $this->_url->getScheme() : 'http',
+ $this->_url->getHost(),
+ $this->_url->getPort() ? $this->_url->getPort() : $default_port,
+ $timeout);
+ if (! $socket->isError()) {
+ $socket->write($this->_getRequestLine($method) . "\r\n");
+ $socket->write($this->_getHostLine() . "\r\n");
+ $socket->write("Connection: close\r\n");
+ }
+ return $socket;
+ }
+
+ /**
+ * Factory for socket.
+ * @param string $scheme Protocol to use.
+ * @param string $host Hostname to connect to.
+ * @param integer $port Remote port.
+ * @param integer $timeout Connection timeout.
+ * @return SimpleSocket/SimpleSecureSocket New socket.
+ * @access protected
+ */
+ function &_createSocket($scheme, $host, $port, $timeout) {
+ if (in_array($scheme, array('https'))) {
+ $socket = &new SimpleSecureSocket($host, $port, $timeout);
+ } else {
+ $socket = &new SimpleSocket($host, $port, $timeout);
+ }
+ return $socket;
+ }
+ }
+
+ /**
+ * Creates HTTP headers for the end point of
+ * a HTTP request via a proxy server.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleProxyRoute extends SimpleRoute {
+ var $_proxy;
+ var $_username;
+ var $_password;
+
+ /**
+ * Stashes the proxy address.
+ * @param SimpleUrl $url URL as object.
+ * @param string $proxy Proxy URL.
+ * @param string $username Username for autentication.
+ * @param string $password Password for autentication.
+ * @access public
+ */
+ function SimpleProxyRoute($url, $proxy, $username = false, $password = false) {
+ $this->SimpleRoute($url);
+ $this->_proxy = $proxy;
+ $this->_username = $username;
+ $this->_password = $password;
+ }
+
+ /**
+ * Creates the first line which is the actual request.
+ * @param string $method HTTP request method, usually GET.
+ * @param SimpleUrl $url URL as object.
+ * @return string Request line content.
+ * @access protected
+ */
+ function _getRequestLine($method) {
+ $url = $this->getUrl();
+ $scheme = $url->getScheme() ? $url->getScheme() : 'http';
+ $port = $url->getPort() ? ':' . $url->getPort() : '';
+ return $method . ' ' . $scheme . '://' . $url->getHost() . $port .
+ $url->getPath() . $url->getEncodedRequest() . ' HTTP/1.0';
+ }
+
+ /**
+ * Creates the host part of the request.
+ * @param SimpleUrl $url URL as object.
+ * @return string Host line content.
+ * @access protected
+ */
+ function _getHostLine() {
+ $host = 'Host: ' . $this->_proxy->getHost();
+ $port = $this->_proxy->getPort() ? $this->_proxy->getPort() : 8080;
+ return "$host:$port";
+ }
+
+ /**
+ * Opens a socket to the route.
+ * @param string $method HTTP request method, usually GET.
+ * @param integer $timeout Connection timeout.
+ * @return SimpleSocket New socket.
+ * @access public
+ */
+ function &createConnection($method, $timeout) {
+ $socket = &$this->_createSocket(
+ $this->_proxy->getScheme() ? $this->_proxy->getScheme() : 'http',
+ $this->_proxy->getHost(),
+ $this->_proxy->getPort() ? $this->_proxy->getPort() : 8080,
+ $timeout);
+ if ($socket->isError()) {
+ return $socket;
+ }
+ $socket->write($this->_getRequestLine($method) . "\r\n");
+ $socket->write($this->_getHostLine() . "\r\n");
+ if ($this->_username && $this->_password) {
+ $socket->write('Proxy-Authorization: Basic ' .
+ base64_encode($this->_username . ':' . $this->_password) .
+ "\r\n");
+ }
+ $socket->write("Connection: close\r\n");
+ return $socket;
+ }
+ }
+
+ /**
+ * HTTP request for a web page. Factory for
+ * HttpResponse object.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleHttpRequest {
+ var $_route;
+ var $_encoding;
+ var $_headers;
+ var $_cookies;
+
+ /**
+ * Builds the socket request from the different pieces.
+ * These include proxy information, URL, cookies, headers,
+ * request method and choice of encoding.
+ * @param SimpleRoute $route Request route.
+ * @param SimpleFormEncoding $encoding Content to send with
+ * request.
+ * @access public
+ */
+ function SimpleHttpRequest(&$route, $encoding) {
+ $this->_route = &$route;
+ $this->_encoding = $encoding;
+ $this->_headers = array();
+ $this->_cookies = array();
+ }
+
+ /**
+ * Dispatches the content to the route's socket.
+ * @param integer $timeout Connection timeout.
+ * @return SimpleHttpResponse A response which may only have
+ * an error, but hopefully has a
+ * complete web page.
+ * @access public
+ */
+ function &fetch($timeout) {
+ $socket = &$this->_route->createConnection($this->_encoding->getMethod(), $timeout);
+ if (! $socket->isError()) {
+ $this->_dispatchRequest($socket, $this->_encoding);
+ }
+ $response = &$this->_createResponse($socket);
+ return $response;
+ }
+
+ /**
+ * Sends the headers.
+ * @param SimpleSocket $socket Open socket.
+ * @param string $method HTTP request method,
+ * usually GET.
+ * @param SimpleFormEncoding $encoding Content to send with request.
+ * @access private
+ */
+ function _dispatchRequest(&$socket, $encoding) {
+ foreach ($this->_headers as $header_line) {
+ $socket->write($header_line . "\r\n");
+ }
+ if (count($this->_cookies) > 0) {
+ $socket->write("Cookie: " . implode(";", $this->_cookies) . "\r\n");
+ }
+ $encoding->writeHeadersTo($socket);
+ $socket->write("\r\n");
+ $encoding->writeTo($socket);
+ }
+
+ /**
+ * Adds a header line to the request.
+ * @param string $header_line Text of full header line.
+ * @access public
+ */
+ function addHeaderLine($header_line) {
+ $this->_headers[] = $header_line;
+ }
+
+ /**
+ * Reads all the relevant cookies from the
+ * cookie jar.
+ * @param SimpleCookieJar $jar Jar to read
+ * @param SimpleUrl $url Url to use for scope.
+ * @access public
+ */
+ function readCookiesFromJar($jar, $url) {
+ $this->_cookies = $jar->selectAsPairs($url);
+ }
+
+ /**
+ * Wraps the socket in a response parser.
+ * @param SimpleSocket $socket Responding socket.
+ * @return SimpleHttpResponse Parsed response object.
+ * @access protected
+ */
+ function &_createResponse(&$socket) {
+ $response = &new SimpleHttpResponse(
+ $socket,
+ $this->_route->getUrl(),
+ $this->_encoding);
+ return $response;
+ }
+ }
+
+ /**
+ * Collection of header lines in the response.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleHttpHeaders {
+ var $_raw_headers;
+ var $_response_code;
+ var $_http_version;
+ var $_mime_type;
+ var $_location;
+ var $_cookies;
+ var $_authentication;
+ var $_realm;
+
+ /**
+ * Parses the incoming header block.
+ * @param string $headers Header block.
+ * @access public
+ */
+ function SimpleHttpHeaders($headers) {
+ $this->_raw_headers = $headers;
+ $this->_response_code = false;
+ $this->_http_version = false;
+ $this->_mime_type = '';
+ $this->_location = false;
+ $this->_cookies = array();
+ $this->_authentication = false;
+ $this->_realm = false;
+ foreach (split("\r\n", $headers) as $header_line) {
+ $this->_parseHeaderLine($header_line);
+ }
+ }
+
+ /**
+ * Accessor for parsed HTTP protocol version.
+ * @return integer HTTP error code.
+ * @access public
+ */
+ function getHttpVersion() {
+ return $this->_http_version;
+ }
+
+ /**
+ * Accessor for raw header block.
+ * @return string All headers as raw string.
+ * @access public
+ */
+ function getRaw() {
+ return $this->_raw_headers;
+ }
+
+ /**
+ * Accessor for parsed HTTP error code.
+ * @return integer HTTP error code.
+ * @access public
+ */
+ function getResponseCode() {
+ return (integer)$this->_response_code;
+ }
+
+ /**
+ * Returns the redirected URL or false if
+ * no redirection.
+ * @return string URL or false for none.
+ * @access public
+ */
+ function getLocation() {
+ return $this->_location;
+ }
+
+ /**
+ * Test to see if the response is a valid redirect.
+ * @return boolean True if valid redirect.
+ * @access public
+ */
+ function isRedirect() {
+ return in_array($this->_response_code, array(301, 302, 303, 307)) &&
+ (boolean)$this->getLocation();
+ }
+
+ /**
+ * Test to see if the response is an authentication
+ * challenge.
+ * @return boolean True if challenge.
+ * @access public
+ */
+ function isChallenge() {
+ return ($this->_response_code == 401) &&
+ (boolean)$this->_authentication &&
+ (boolean)$this->_realm;
+ }
+
+ /**
+ * Accessor for MIME type header information.
+ * @return string MIME type.
+ * @access public
+ */
+ function getMimeType() {
+ return $this->_mime_type;
+ }
+
+ /**
+ * Accessor for authentication type.
+ * @return string Type.
+ * @access public
+ */
+ function getAuthentication() {
+ return $this->_authentication;
+ }
+
+ /**
+ * Accessor for security realm.
+ * @return string Realm.
+ * @access public
+ */
+ function getRealm() {
+ return $this->_realm;
+ }
+
+ /**
+ * Writes new cookies to the cookie jar.
+ * @param SimpleCookieJar $jar Jar to write to.
+ * @param SimpleUrl $url Host and path to write under.
+ * @access public
+ */
+ function writeCookiesToJar(&$jar, $url) {
+ foreach ($this->_cookies as $cookie) {
+ $jar->setCookie(
+ $cookie->getName(),
+ $cookie->getValue(),
+ $url->getHost(),
+ $cookie->getPath(),
+ $cookie->getExpiry());
+ }
+ }
+
+ /**
+ * Called on each header line to accumulate the held
+ * data within the class.
+ * @param string $header_line One line of header.
+ * @access protected
+ */
+ function _parseHeaderLine($header_line) {
+ if (preg_match('/HTTP\/(\d+\.\d+)\s+(\d+)/i', $header_line, $matches)) {
+ $this->_http_version = $matches[1];
+ $this->_response_code = $matches[2];
+ }
+ if (preg_match('/Content-type:\s*(.*)/i', $header_line, $matches)) {
+ $this->_mime_type = trim($matches[1]);
+ }
+ if (preg_match('/Location:\s*(.*)/i', $header_line, $matches)) {
+ $this->_location = trim($matches[1]);
+ }
+ if (preg_match('/Set-cookie:(.*)/i', $header_line, $matches)) {
+ $this->_cookies[] = $this->_parseCookie($matches[1]);
+ }
+ if (preg_match('/WWW-Authenticate:\s+(\S+)\s+realm=\"(.*?)\"/i', $header_line, $matches)) {
+ $this->_authentication = $matches[1];
+ $this->_realm = trim($matches[2]);
+ }
+ }
+
+ /**
+ * Parse the Set-cookie content.
+ * @param string $cookie_line Text after "Set-cookie:"
+ * @return SimpleCookie New cookie object.
+ * @access private
+ */
+ function _parseCookie($cookie_line) {
+ $parts = split(";", $cookie_line);
+ $cookie = array();
+ preg_match('/\s*(.*?)\s*=(.*)/', array_shift($parts), $cookie);
+ foreach ($parts as $part) {
+ if (preg_match('/\s*(.*?)\s*=(.*)/', $part, $matches)) {
+ $cookie[$matches[1]] = trim($matches[2]);
+ }
+ }
+ return new SimpleCookie(
+ $cookie[1],
+ trim($cookie[2]),
+ isset($cookie["path"]) ? $cookie["path"] : "",
+ isset($cookie["expires"]) ? $cookie["expires"] : false);
+ }
+ }
+
+ /**
+ * Basic HTTP response.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleHttpResponse extends SimpleStickyError {
+ var $_url;
+ var $_encoding;
+ var $_sent;
+ var $_content;
+ var $_headers;
+
+ /**
+ * Constructor. Reads and parses the incoming
+ * content and headers.
+ * @param SimpleSocket $socket Network connection to fetch
+ * response text from.
+ * @param SimpleUrl $url Resource name.
+ * @param mixed $encoding Record of content sent.
+ * @access public
+ */
+ function SimpleHttpResponse(&$socket, $url, $encoding) {
+ $this->SimpleStickyError();
+ $this->_url = $url;
+ $this->_encoding = $encoding;
+ $this->_sent = $socket->getSent();
+ $this->_content = false;
+ $raw = $this->_readAll($socket);
+ if ($socket->isError()) {
+ $this->_setError('Error reading socket [' . $socket->getError() . ']');
+ return;
+ }
+ $this->_parse($raw);
+ }
+
+ /**
+ * Splits up the headers and the rest of the content.
+ * @param string $raw Content to parse.
+ * @access private
+ */
+ function _parse($raw) {
+ if (! $raw) {
+ $this->_setError('Nothing fetched');
+ $this->_headers = &new SimpleHttpHeaders('');
+ } elseif (! strstr($raw, "\r\n\r\n")) {
+ $this->_setError('Could not split headers from content');
+ $this->_headers = &new SimpleHttpHeaders($raw);
+ } else {
+ list($headers, $this->_content) = split("\r\n\r\n", $raw, 2);
+ $this->_headers = &new SimpleHttpHeaders($headers);
+ }
+ }
+
+ /**
+ * Original request method.
+ * @return string GET, POST or HEAD.
+ * @access public
+ */
+ function getMethod() {
+ return $this->_encoding->getMethod();
+ }
+
+ /**
+ * Resource name.
+ * @return SimpleUrl Current url.
+ * @access public
+ */
+ function getUrl() {
+ return $this->_url;
+ }
+
+ /**
+ * Original request data.
+ * @return mixed Sent content.
+ * @access public
+ */
+ function getRequestData() {
+ return $this->_encoding;
+ }
+
+ /**
+ * Raw request that was sent down the wire.
+ * @return string Bytes actually sent.
+ * @access public
+ */
+ function getSent() {
+ return $this->_sent;
+ }
+
+ /**
+ * Accessor for the content after the last
+ * header line.
+ * @return string All content.
+ * @access public
+ */
+ function getContent() {
+ return $this->_content;
+ }
+
+ /**
+ * Accessor for header block. The response is the
+ * combination of this and the content.
+ * @return SimpleHeaders Wrapped header block.
+ * @access public
+ */
+ function getHeaders() {
+ return $this->_headers;
+ }
+
+ /**
+ * Accessor for any new cookies.
+ * @return array List of new cookies.
+ * @access public
+ */
+ function getNewCookies() {
+ return $this->_headers->getNewCookies();
+ }
+
+ /**
+ * Reads the whole of the socket output into a
+ * single string.
+ * @param SimpleSocket $socket Unread socket.
+ * @return string Raw output if successful
+ * else false.
+ * @access private
+ */
+ function _readAll(&$socket) {
+ $all = '';
+ while (! $this->_isLastPacket($next = $socket->read())) {
+ $all .= $next;
+ }
+ return $all;
+ }
+
+ /**
+ * Test to see if the packet from the socket is the
+ * last one.
+ * @param string $packet Chunk to interpret.
+ * @return boolean True if empty or EOF.
+ * @access private
+ */
+ function _isLastPacket($packet) {
+ if (is_string($packet)) {
+ return $packet === '';
+ }
+ return ! $packet;
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/invoker.php b/tests/simpletest/invoker.php
new file mode 100755
index 0000000000..9c6ec46e75
--- /dev/null
+++ b/tests/simpletest/invoker.php
@@ -0,0 +1,139 @@
+<?php
+ /**
+ * Base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: invoker.php,v 1.3 2006/02/06 06:13:43 lastcraft Exp $
+ */
+
+ /**#@+
+ * Includes SimpleTest files and defined the root constant
+ * for dependent libraries.
+ */
+ require_once(dirname(__FILE__) . '/errors.php');
+ require_once(dirname(__FILE__) . '/compatibility.php');
+ require_once(dirname(__FILE__) . '/scorer.php');
+ require_once(dirname(__FILE__) . '/expectation.php');
+ require_once(dirname(__FILE__) . '/dumper.php');
+ if (! defined('SIMPLE_TEST')) {
+ define('SIMPLE_TEST', dirname(__FILE__) . '/');
+ }
+ /**#@-*/
+
+ /**
+ * This is called by the class runner to run a
+ * single test method. Will also run the setUp()
+ * and tearDown() methods.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class SimpleInvoker {
+ var $_test_case;
+
+ /**
+ * Stashes the test case for later.
+ * @param SimpleTestCase $test_case Test case to run.
+ */
+ function SimpleInvoker(&$test_case) {
+ $this->_test_case = &$test_case;
+ }
+
+ /**
+ * Accessor for test case being run.
+ * @return SimpleTestCase Test case.
+ * @access public
+ */
+ function &getTestCase() {
+ return $this->_test_case;
+ }
+
+ /**
+ * Runs test level set up. Used for changing
+ * the mechanics of base test cases.
+ * @param string $method Test method to call.
+ * @access public
+ */
+ function before($method) {
+ $this->_test_case->before($method);
+ }
+
+ /**
+ * Invokes a test method and buffered with setUp()
+ * and tearDown() calls.
+ * @param string $method Test method to call.
+ * @access public
+ */
+ function invoke($method) {
+ $this->_test_case->setUp();
+ $this->_test_case->$method();
+ $this->_test_case->tearDown();
+ }
+
+ /**
+ * Runs test level clean up. Used for changing
+ * the mechanics of base test cases.
+ * @param string $method Test method to call.
+ * @access public
+ */
+ function after($method) {
+ $this->_test_case->after($method);
+ }
+ }
+
+ /**
+ * Do nothing decorator. Just passes the invocation
+ * straight through.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class SimpleInvokerDecorator {
+ var $_invoker;
+
+ /**
+ * Stores the invoker to wrap.
+ * @param SimpleInvoker $invoker Test method runner.
+ */
+ function SimpleInvokerDecorator(&$invoker) {
+ $this->_invoker = &$invoker;
+ }
+
+ /**
+ * Accessor for test case being run.
+ * @return SimpleTestCase Test case.
+ * @access public
+ */
+ function &getTestCase() {
+ return $this->_invoker->getTestCase();
+ }
+
+ /**
+ * Runs test level set up. Used for changing
+ * the mechanics of base test cases.
+ * @param string $method Test method to call.
+ * @access public
+ */
+ function before($method) {
+ $this->_invoker->before($method);
+ }
+
+ /**
+ * Invokes a test method and buffered with setUp()
+ * and tearDown() calls.
+ * @param string $method Test method to call.
+ * @access public
+ */
+ function invoke($method) {
+ $this->_invoker->invoke($method);
+ }
+
+ /**
+ * Runs test level clean up. Used for changing
+ * the mechanics of base test cases.
+ * @param string $method Test method to call.
+ * @access public
+ */
+ function after($method) {
+ $this->_invoker->after($method);
+ }
+ }
+?>
diff --git a/tests/simpletest/mock_objects.php b/tests/simpletest/mock_objects.php
new file mode 100755
index 0000000000..d5d0edeca7
--- /dev/null
+++ b/tests/simpletest/mock_objects.php
@@ -0,0 +1,1306 @@
+<?php
+/**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage MockObjects
+ * @version $Id: mock_objects.php,v 1.108 2007/07/07 00:31:03 lastcraft Exp $
+ */
+
+/**#@+
+ * include SimpleTest files
+ */
+require_once(dirname(__FILE__) . '/expectation.php');
+require_once(dirname(__FILE__) . '/simpletest.php');
+require_once(dirname(__FILE__) . '/dumper.php');
+if (version_compare(phpversion(), '5') >= 0) {
+ require_once(dirname(__FILE__) . '/reflection_php5.php');
+} else {
+ require_once(dirname(__FILE__) . '/reflection_php4.php');
+}
+/**#@-*/
+
+/**
+ * Default character simpletest will substitute for any value
+ */
+if (! defined('MOCK_ANYTHING')) {
+ define('MOCK_ANYTHING', '*');
+}
+
+/**
+ * Parameter comparison assertion.
+ * @package SimpleTest
+ * @subpackage MockObjects
+ */
+class ParametersExpectation extends SimpleExpectation {
+ var $_expected;
+
+ /**
+ * Sets the expected parameter list.
+ * @param array $parameters Array of parameters including
+ * those that are wildcarded.
+ * If the value is not an array
+ * then it is considered to match any.
+ * @param string $message Customised message on failure.
+ * @access public
+ */
+ function ParametersExpectation($expected = false, $message = '%s') {
+ $this->SimpleExpectation($message);
+ $this->_expected = $expected;
+ }
+
+ /**
+ * Tests the assertion. True if correct.
+ * @param array $parameters Comparison values.
+ * @return boolean True if correct.
+ * @access public
+ */
+ function test($parameters) {
+ if (! is_array($this->_expected)) {
+ return true;
+ }
+ if (count($this->_expected) != count($parameters)) {
+ return false;
+ }
+ for ($i = 0; $i < count($this->_expected); $i++) {
+ if (! $this->_testParameter($parameters[$i], $this->_expected[$i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Tests an individual parameter.
+ * @param mixed $parameter Value to test.
+ * @param mixed $expected Comparison value.
+ * @return boolean True if expectation
+ * fulfilled.
+ * @access private
+ */
+ function _testParameter($parameter, $expected) {
+ $comparison = $this->_coerceToExpectation($expected);
+ return $comparison->test($parameter);
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param array $comparison Incoming parameter list.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($parameters) {
+ if ($this->test($parameters)) {
+ return "Expectation of " . count($this->_expected) .
+ " arguments of [" . $this->_renderArguments($this->_expected) .
+ "] is correct";
+ } else {
+ return $this->_describeDifference($this->_expected, $parameters);
+ }
+ }
+
+ /**
+ * Message to display if expectation differs from
+ * the parameters actually received.
+ * @param array $expected Expected parameters as list.
+ * @param array $parameters Actual parameters received.
+ * @return string Description of difference.
+ * @access private
+ */
+ function _describeDifference($expected, $parameters) {
+ if (count($expected) != count($parameters)) {
+ return "Expected " . count($expected) .
+ " arguments of [" . $this->_renderArguments($expected) .
+ "] but got " . count($parameters) .
+ " arguments of [" . $this->_renderArguments($parameters) . "]";
+ }
+ $messages = array();
+ for ($i = 0; $i < count($expected); $i++) {
+ $comparison = $this->_coerceToExpectation($expected[$i]);
+ if (! $comparison->test($parameters[$i])) {
+ $messages[] = "parameter " . ($i + 1) . " with [" .
+ $comparison->overlayMessage($parameters[$i], $this->_getDumper()) . "]";
+ }
+ }
+ return "Parameter expectation differs at " . implode(" and ", $messages);
+ }
+
+ /**
+ * Creates an identical expectation if the
+ * object/value is not already some type
+ * of expectation.
+ * @param mixed $expected Expected value.
+ * @return SimpleExpectation Expectation object.
+ * @access private
+ */
+ function _coerceToExpectation($expected) {
+ if (SimpleExpectation::isExpectation($expected)) {
+ return $expected;
+ }
+ return new IdenticalExpectation($expected);
+ }
+
+ /**
+ * Renders the argument list as a string for
+ * messages.
+ * @param array $args Incoming arguments.
+ * @return string Simple description of type and value.
+ * @access private
+ */
+ function _renderArguments($args) {
+ $descriptions = array();
+ if (is_array($args)) {
+ foreach ($args as $arg) {
+ $dumper = &new SimpleDumper();
+ $descriptions[] = $dumper->describeValue($arg);
+ }
+ }
+ return implode(', ', $descriptions);
+ }
+}
+
+/**
+ * Confirms that the number of calls on a method is as expected.
+ * @package SimpleTest
+ * @subpackage MockObjects
+ */
+class CallCountExpectation extends SimpleExpectation {
+ var $_method;
+ var $_count;
+
+ /**
+ * Stashes the method and expected count for later
+ * reporting.
+ * @param string $method Name of method to confirm against.
+ * @param integer $count Expected number of calls.
+ * @param string $message Custom error message.
+ */
+ function CallCountExpectation($method, $count, $message = '%s') {
+ $this->_method = $method;
+ $this->_count = $count;
+ $this->SimpleExpectation($message);
+ }
+
+ /**
+ * Tests the assertion. True if correct.
+ * @param integer $compare Measured call count.
+ * @return boolean True if expected.
+ * @access public
+ */
+ function test($compare) {
+ return ($this->_count == $compare);
+ }
+
+ /**
+ * Reports the comparison.
+ * @param integer $compare Measured call count.
+ * @return string Message to show.
+ * @access public
+ */
+ function testMessage($compare) {
+ return 'Expected call count for [' . $this->_method .
+ '] was [' . $this->_count .
+ '] got [' . $compare . ']';
+ }
+}
+
+/**
+ * Confirms that the number of calls on a method is as expected.
+ * @package SimpleTest
+ * @subpackage MockObjects
+ */
+class MinimumCallCountExpectation extends SimpleExpectation {
+ var $_method;
+ var $_count;
+
+ /**
+ * Stashes the method and expected count for later
+ * reporting.
+ * @param string $method Name of method to confirm against.
+ * @param integer $count Minimum number of calls.
+ * @param string $message Custom error message.
+ */
+ function MinimumCallCountExpectation($method, $count, $message = '%s') {
+ $this->_method = $method;
+ $this->_count = $count;
+ $this->SimpleExpectation($message);
+ }
+
+ /**
+ * Tests the assertion. True if correct.
+ * @param integer $compare Measured call count.
+ * @return boolean True if enough.
+ * @access public
+ */
+ function test($compare) {
+ return ($this->_count <= $compare);
+ }
+
+ /**
+ * Reports the comparison.
+ * @param integer $compare Measured call count.
+ * @return string Message to show.
+ * @access public
+ */
+ function testMessage($compare) {
+ return 'Minimum call count for [' . $this->_method .
+ '] was [' . $this->_count .
+ '] got [' . $compare . ']';
+ }
+}
+
+/**
+ * Confirms that the number of calls on a method is as expected.
+ * @package SimpleTest
+ * @subpackage MockObjects
+ */
+class MaximumCallCountExpectation extends SimpleExpectation {
+ var $_method;
+ var $_count;
+
+ /**
+ * Stashes the method and expected count for later
+ * reporting.
+ * @param string $method Name of method to confirm against.
+ * @param integer $count Minimum number of calls.
+ * @param string $message Custom error message.
+ */
+ function MaximumCallCountExpectation($method, $count, $message = '%s') {
+ $this->_method = $method;
+ $this->_count = $count;
+ $this->SimpleExpectation($message);
+ }
+
+ /**
+ * Tests the assertion. True if correct.
+ * @param integer $compare Measured call count.
+ * @return boolean True if not over.
+ * @access public
+ */
+ function test($compare) {
+ return ($this->_count >= $compare);
+ }
+
+ /**
+ * Reports the comparison.
+ * @param integer $compare Measured call count.
+ * @return string Message to show.
+ * @access public
+ */
+ function testMessage($compare) {
+ return 'Maximum call count for [' . $this->_method .
+ '] was [' . $this->_count .
+ '] got [' . $compare . ']';
+ }
+}
+
+/**
+ * Retrieves values and references by searching the
+ * parameter lists until a match is found.
+ * @package SimpleTest
+ * @subpackage MockObjects
+ */
+class CallMap {
+ var $_map;
+
+ /**
+ * Creates an empty call map.
+ * @access public
+ */
+ function CallMap() {
+ $this->_map = array();
+ }
+
+ /**
+ * Stashes a value against a method call.
+ * @param array $parameters Arguments including wildcards.
+ * @param mixed $value Value copied into the map.
+ * @access public
+ */
+ function addValue($parameters, $value) {
+ $this->addReference($parameters, $value);
+ }
+
+ /**
+ * Stashes a reference against a method call.
+ * @param array $parameters Array of arguments (including wildcards).
+ * @param mixed $reference Array reference placed in the map.
+ * @access public
+ */
+ function addReference($parameters, &$reference) {
+ $place = count($this->_map);
+ $this->_map[$place] = array();
+ $this->_map[$place]["params"] = new ParametersExpectation($parameters);
+ $this->_map[$place]["content"] = &$reference;
+ }
+
+ /**
+ * Searches the call list for a matching parameter
+ * set. Returned by reference.
+ * @param array $parameters Parameters to search by
+ * without wildcards.
+ * @return object Object held in the first matching
+ * slot, otherwise null.
+ * @access public
+ */
+ function &findFirstMatch($parameters) {
+ $slot = $this->_findFirstSlot($parameters);
+ if (!isset($slot)) {
+ $null = null;
+ return $null;
+ }
+ return $slot["content"];
+ }
+
+ /**
+ * Searches the call list for a matching parameter
+ * set. True if successful.
+ * @param array $parameters Parameters to search by
+ * without wildcards.
+ * @return boolean True if a match is present.
+ * @access public
+ */
+ function isMatch($parameters) {
+ return ($this->_findFirstSlot($parameters) != null);
+ }
+
+ /**
+ * Searches the map for a matching item.
+ * @param array $parameters Parameters to search by
+ * without wildcards.
+ * @return array Reference to slot or null.
+ * @access private
+ */
+ function &_findFirstSlot($parameters) {
+ $count = count($this->_map);
+ for ($i = 0; $i < $count; $i++) {
+ if ($this->_map[$i]["params"]->test($parameters)) {
+ return $this->_map[$i];
+ }
+ }
+ $null = null;
+ return $null;
+ }
+}
+
+/**
+ * An empty collection of methods that can have their
+ * return values set and expectations made of the
+ * calls upon them. The mock will assert the
+ * expectations against it's attached test case in
+ * addition to the server stub behaviour.
+ * @package SimpleTest
+ * @subpackage MockObjects
+ */
+class SimpleMock {
+ var $_wildcard = MOCK_ANYTHING;
+ var $_is_strict = true;
+ var $_returns;
+ var $_return_sequence;
+ var $_call_counts;
+ var $_expected_counts;
+ var $_max_counts;
+ var $_expected_args;
+ var $_expected_args_at;
+
+ /**
+ * Creates an empty return list and expectation list.
+ * All call counts are set to zero.
+ */
+ function SimpleMock() {
+ $this->_returns = array();
+ $this->_return_sequence = array();
+ $this->_call_counts = array();
+ $this->_expected_counts = array();
+ $this->_max_counts = array();
+ $this->_expected_args = array();
+ $this->_expected_args_at = array();
+ $test = &$this->_getCurrentTestCase();
+ $test->tell($this);
+ }
+
+ /**
+ * Disables a name check when setting expectations.
+ * This hack is needed for the partial mocks.
+ * @access public
+ */
+ function disableExpectationNameChecks() {
+ $this->_is_strict = false;
+ }
+
+ /**
+ * Finds currently running test.
+ * @return SimpeTestCase Current test case.
+ * @access protected
+ */
+ function &_getCurrentTestCase() {
+ $context = &SimpleTest::getContext();
+ return $context->getTest();
+ }
+
+ /**
+ * Die if bad arguments array is passed
+ * @param mixed $args The arguments value to be checked.
+ * @param string $task Description of task attempt.
+ * @return boolean Valid arguments
+ * @access private
+ */
+ function _checkArgumentsIsArray($args, $task) {
+ if (! is_array($args)) {
+ trigger_error(
+ "Cannot $task as \$args parameter is not an array",
+ E_USER_ERROR);
+ }
+ }
+
+ /**
+ * Triggers a PHP error if the method is not part
+ * of this object.
+ * @param string $method Name of method.
+ * @param string $task Description of task attempt.
+ * @access protected
+ */
+ function _dieOnNoMethod($method, $task) {
+ if ($this->_is_strict && ! method_exists($this, $method)) {
+ trigger_error(
+ "Cannot $task as no ${method}() in class " . get_class($this),
+ E_USER_ERROR);
+ }
+ }
+
+ /**
+ * Replaces wildcard matches with wildcard
+ * expectations in the argument list.
+ * @param array $args Raw argument list.
+ * @return array Argument list with
+ * expectations.
+ * @access private
+ */
+ function _replaceWildcards($args) {
+ if ($args === false) {
+ return false;
+ }
+ for ($i = 0; $i < count($args); $i++) {
+ if ($args[$i] === $this->_wildcard) {
+ $args[$i] = new AnythingExpectation();
+ }
+ }
+ return $args;
+ }
+
+ /**
+ * Adds one to the call count of a method.
+ * @param string $method Method called.
+ * @param array $args Arguments as an array.
+ * @access protected
+ */
+ function _addCall($method, $args) {
+ if (!isset($this->_call_counts[$method])) {
+ $this->_call_counts[$method] = 0;
+ }
+ $this->_call_counts[$method]++;
+ }
+
+ /**
+ * Fetches the call count of a method so far.
+ * @param string $method Method name called.
+ * @return Number of calls so far.
+ * @access public
+ */
+ function getCallCount($method) {
+ $this->_dieOnNoMethod($method, "get call count");
+ $method = strtolower($method);
+ if (! isset($this->_call_counts[$method])) {
+ return 0;
+ }
+ return $this->_call_counts[$method];
+ }
+
+ /**
+ * Sets a return for a parameter list that will
+ * be passed by value for all calls to this method.
+ * @param string $method Method name.
+ * @param mixed $value Result of call passed by value.
+ * @param array $args List of parameters to match
+ * including wildcards.
+ * @access public
+ */
+ function setReturnValue($method, $value, $args = false) {
+ $this->_dieOnNoMethod($method, "set return value");
+ $args = $this->_replaceWildcards($args);
+ $method = strtolower($method);
+ if (! isset($this->_returns[$method])) {
+ $this->_returns[$method] = new CallMap();
+ }
+ $this->_returns[$method]->addValue($args, $value);
+ }
+
+ /**
+ * Sets a return for a parameter list that will
+ * be passed by value only when the required call count
+ * is reached.
+ * @param integer $timing Number of calls in the future
+ * to which the result applies. If
+ * not set then all calls will return
+ * the value.
+ * @param string $method Method name.
+ * @param mixed $value Result of call passed by value.
+ * @param array $args List of parameters to match
+ * including wildcards.
+ * @access public
+ */
+ function setReturnValueAt($timing, $method, $value, $args = false) {
+ $this->_dieOnNoMethod($method, "set return value sequence");
+ $args = $this->_replaceWildcards($args);
+ $method = strtolower($method);
+ if (! isset($this->_return_sequence[$method])) {
+ $this->_return_sequence[$method] = array();
+ }
+ if (! isset($this->_return_sequence[$method][$timing])) {
+ $this->_return_sequence[$method][$timing] = new CallMap();
+ }
+ $this->_return_sequence[$method][$timing]->addValue($args, $value);
+ }
+
+ /**
+ * Sets a return for a parameter list that will
+ * be passed by reference for all calls.
+ * @param string $method Method name.
+ * @param mixed $reference Result of the call will be this object.
+ * @param array $args List of parameters to match
+ * including wildcards.
+ * @access public
+ */
+ function setReturnReference($method, &$reference, $args = false) {
+ $this->_dieOnNoMethod($method, "set return reference");
+ $args = $this->_replaceWildcards($args);
+ $method = strtolower($method);
+ if (! isset($this->_returns[$method])) {
+ $this->_returns[$method] = new CallMap();
+ }
+ $this->_returns[$method]->addReference($args, $reference);
+ }
+
+ /**
+ * Sets a return for a parameter list that will
+ * be passed by value only when the required call count
+ * is reached.
+ * @param integer $timing Number of calls in the future
+ * to which the result applies. If
+ * not set then all calls will return
+ * the value.
+ * @param string $method Method name.
+ * @param mixed $reference Result of the call will be this object.
+ * @param array $args List of parameters to match
+ * including wildcards.
+ * @access public
+ */
+ function setReturnReferenceAt($timing, $method, &$reference, $args = false) {
+ $this->_dieOnNoMethod($method, "set return reference sequence");
+ $args = $this->_replaceWildcards($args);
+ $method = strtolower($method);
+ if (! isset($this->_return_sequence[$method])) {
+ $this->_return_sequence[$method] = array();
+ }
+ if (! isset($this->_return_sequence[$method][$timing])) {
+ $this->_return_sequence[$method][$timing] = new CallMap();
+ }
+ $this->_return_sequence[$method][$timing]->addReference($args, $reference);
+ }
+
+ /**
+ * Sets up an expected call with a set of
+ * expected parameters in that call. All
+ * calls will be compared to these expectations
+ * regardless of when the call is made.
+ * @param string $method Method call to test.
+ * @param array $args Expected parameters for the call
+ * including wildcards.
+ * @param string $message Overridden message.
+ * @access public
+ */
+ function expect($method, $args, $message = '%s') {
+ $this->_dieOnNoMethod($method, 'set expected arguments');
+ $this->_checkArgumentsIsArray($args, 'set expected arguments');
+ $args = $this->_replaceWildcards($args);
+ $message .= Mock::getExpectationLine();
+ $this->_expected_args[strtolower($method)] =
+ new ParametersExpectation($args, $message);
+ }
+
+ /**
+ * @deprecated
+ */
+ function expectArguments($method, $args, $message = '%s') {
+ return $this->expect($method, $args, $message);
+ }
+
+ /**
+ * Sets up an expected call with a set of
+ * expected parameters in that call. The
+ * expected call count will be adjusted if it
+ * is set too low to reach this call.
+ * @param integer $timing Number of calls in the future at
+ * which to test. Next call is 0.
+ * @param string $method Method call to test.
+ * @param array $args Expected parameters for the call
+ * including wildcards.
+ * @param string $message Overridden message.
+ * @access public
+ */
+ function expectAt($timing, $method, $args, $message = '%s') {
+ $this->_dieOnNoMethod($method, 'set expected arguments at time');
+ $this->_checkArgumentsIsArray($args, 'set expected arguments at time');
+ $args = $this->_replaceWildcards($args);
+ if (! isset($this->_expected_args_at[$timing])) {
+ $this->_expected_args_at[$timing] = array();
+ }
+ $method = strtolower($method);
+ $message .= Mock::getExpectationLine();
+ $this->_expected_args_at[$timing][$method] =
+ new ParametersExpectation($args, $message);
+ }
+
+ /**
+ * @deprecated
+ */
+ function expectArgumentsAt($timing, $method, $args, $message = '%s') {
+ return $this->expectAt($timing, $method, $args, $message);
+ }
+
+ /**
+ * Sets an expectation for the number of times
+ * a method will be called. The tally method
+ * is used to check this.
+ * @param string $method Method call to test.
+ * @param integer $count Number of times it should
+ * have been called at tally.
+ * @param string $message Overridden message.
+ * @access public
+ */
+ function expectCallCount($method, $count, $message = '%s') {
+ $this->_dieOnNoMethod($method, 'set expected call count');
+ $message .= Mock::getExpectationLine();
+ $this->_expected_counts[strtolower($method)] =
+ new CallCountExpectation($method, $count, $message);
+ }
+
+ /**
+ * Sets the number of times a method may be called
+ * before a test failure is triggered.
+ * @param string $method Method call to test.
+ * @param integer $count Most number of times it should
+ * have been called.
+ * @param string $message Overridden message.
+ * @access public
+ */
+ function expectMaximumCallCount($method, $count, $message = '%s') {
+ $this->_dieOnNoMethod($method, 'set maximum call count');
+ $message .= Mock::getExpectationLine();
+ $this->_max_counts[strtolower($method)] =
+ new MaximumCallCountExpectation($method, $count, $message);
+ }
+
+ /**
+ * Sets the number of times to call a method to prevent
+ * a failure on the tally.
+ * @param string $method Method call to test.
+ * @param integer $count Least number of times it should
+ * have been called.
+ * @param string $message Overridden message.
+ * @access public
+ */
+ function expectMinimumCallCount($method, $count, $message = '%s') {
+ $this->_dieOnNoMethod($method, 'set minimum call count');
+ $message .= Mock::getExpectationLine();
+ $this->_expected_counts[strtolower($method)] =
+ new MinimumCallCountExpectation($method, $count, $message);
+ }
+
+ /**
+ * Convenience method for barring a method
+ * call.
+ * @param string $method Method call to ban.
+ * @param string $message Overridden message.
+ * @access public
+ */
+ function expectNever($method, $message = '%s') {
+ $this->expectMaximumCallCount($method, 0, $message);
+ }
+
+ /**
+ * Convenience method for a single method
+ * call.
+ * @param string $method Method call to track.
+ * @param array $args Expected argument list or
+ * false for any arguments.
+ * @param string $message Overridden message.
+ * @access public
+ */
+ function expectOnce($method, $args = false, $message = '%s') {
+ $this->expectCallCount($method, 1, $message);
+ if ($args !== false) {
+ $this->expect($method, $args, $message);
+ }
+ }
+
+ /**
+ * Convenience method for requiring a method
+ * call.
+ * @param string $method Method call to track.
+ * @param array $args Expected argument list or
+ * false for any arguments.
+ * @param string $message Overridden message.
+ * @access public
+ */
+ function expectAtLeastOnce($method, $args = false, $message = '%s') {
+ $this->expectMinimumCallCount($method, 1, $message);
+ if ($args !== false) {
+ $this->expect($method, $args, $message);
+ }
+ }
+
+ /**
+ * @deprecated
+ */
+ function tally() {
+ }
+
+ /**
+ * Receives event from unit test that the current
+ * test method has finished. Totals up the call
+ * counts and triggers a test assertion if a test
+ * is present for expected call counts.
+ * @param string $test_method Current method name.
+ * @param SimpleTestCase $test Test to send message to.
+ * @access public
+ */
+ function atTestEnd($test_method, &$test) {
+ foreach ($this->_expected_counts as $method => $expectation) {
+ $test->assert($expectation, $this->getCallCount($method));
+ }
+ foreach ($this->_max_counts as $method => $expectation) {
+ if ($expectation->test($this->getCallCount($method))) {
+ $test->assert($expectation, $this->getCallCount($method));
+ }
+ }
+ }
+
+ /**
+ * Returns the expected value for the method name
+ * and checks expectations. Will generate any
+ * test assertions as a result of expectations
+ * if there is a test present.
+ * @param string $method Name of method to simulate.
+ * @param array $args Arguments as an array.
+ * @return mixed Stored return.
+ * @access private
+ */
+ function &_invoke($method, $args) {
+ $method = strtolower($method);
+ $step = $this->getCallCount($method);
+ $this->_addCall($method, $args);
+ $this->_checkExpectations($method, $args, $step);
+ $result = &$this->_getReturn($method, $args, $step);
+ return $result;
+ }
+ /**
+ * Finds the return value matching the incoming
+ * arguments. If there is no matching value found
+ * then an error is triggered.
+ * @param string $method Method name.
+ * @param array $args Calling arguments.
+ * @param integer $step Current position in the
+ * call history.
+ * @return mixed Stored return.
+ * @access protected
+ */
+ function &_getReturn($method, $args, $step) {
+ if (isset($this->_return_sequence[$method][$step])) {
+ if ($this->_return_sequence[$method][$step]->isMatch($args)) {
+ $result = &$this->_return_sequence[$method][$step]->findFirstMatch($args);
+ return $result;
+ }
+ }
+ if (isset($this->_returns[$method])) {
+ $result = &$this->_returns[$method]->findFirstMatch($args);
+ return $result;
+ }
+ $null = null;
+ return $null;
+ }
+
+ /**
+ * Tests the arguments against expectations.
+ * @param string $method Method to check.
+ * @param array $args Argument list to match.
+ * @param integer $timing The position of this call
+ * in the call history.
+ * @access private
+ */
+ function _checkExpectations($method, $args, $timing) {
+ $test = &$this->_getCurrentTestCase();
+ if (isset($this->_max_counts[$method])) {
+ if (! $this->_max_counts[$method]->test($timing + 1)) {
+ $test->assert($this->_max_counts[$method], $timing + 1);
+ }
+ }
+ if (isset($this->_expected_args_at[$timing][$method])) {
+ $test->assert(
+ $this->_expected_args_at[$timing][$method],
+ $args,
+ "Mock method [$method] at [$timing] -> %s");
+ } elseif (isset($this->_expected_args[$method])) {
+ $test->assert(
+ $this->_expected_args[$method],
+ $args,
+ "Mock method [$method] -> %s");
+ }
+ }
+}
+
+/**
+ * Static methods only service class for code generation of
+ * mock objects.
+ * @package SimpleTest
+ * @subpackage MockObjects
+ */
+class Mock {
+
+ /**
+ * Factory for mock object classes.
+ * @access public
+ */
+ function Mock() {
+ trigger_error('Mock factory methods are static.');
+ }
+
+ /**
+ * Clones a class' interface and creates a mock version
+ * that can have return values and expectations set.
+ * @param string $class Class to clone.
+ * @param string $mock_class New class name. Default is
+ * the old name with "Mock"
+ * prepended.
+ * @param array $methods Additional methods to add beyond
+ * those in the cloned class. Use this
+ * to emulate the dynamic addition of
+ * methods in the cloned class or when
+ * the class hasn't been written yet.
+ * @static
+ * @access public
+ */
+ function generate($class, $mock_class = false, $methods = false) {
+ $generator = new MockGenerator($class, $mock_class);
+ return $generator->generateSubclass($methods);
+ }
+
+ /**
+ * Generates a version of a class with selected
+ * methods mocked only. Inherits the old class
+ * and chains the mock methods of an aggregated
+ * mock object.
+ * @param string $class Class to clone.
+ * @param string $mock_class New class name.
+ * @param array $methods Methods to be overridden
+ * with mock versions.
+ * @static
+ * @access public
+ */
+ function generatePartial($class, $mock_class, $methods) {
+ $generator = new MockGenerator($class, $mock_class);
+ return $generator->generatePartial($methods);
+ }
+
+ /**
+ * Uses a stack trace to find the line of an assertion.
+ * @access public
+ * @static
+ */
+ function getExpectationLine() {
+ $trace = new SimpleStackTrace(array('expect'));
+ return $trace->traceMethod();
+ }
+}
+
+/**
+ * @package SimpleTest
+ * @subpackage MockObjects
+ * @deprecated
+ */
+class Stub extends Mock {
+}
+
+/**
+ * Service class for code generation of mock objects.
+ * @package SimpleTest
+ * @subpackage MockObjects
+ */
+class MockGenerator {
+ var $_class;
+ var $_mock_class;
+ var $_mock_base;
+ var $_reflection;
+
+ /**
+ * Builds initial reflection object.
+ * @param string $class Class to be mocked.
+ * @param string $mock_class New class with identical interface,
+ * but no behaviour.
+ */
+ function MockGenerator($class, $mock_class) {
+ $this->_class = $class;
+ $this->_mock_class = $mock_class;
+ if (! $this->_mock_class) {
+ $this->_mock_class = 'Mock' . $this->_class;
+ }
+ $this->_mock_base = SimpleTest::getMockBaseClass();
+ $this->_reflection = new SimpleReflection($this->_class);
+ }
+
+ /**
+ * Clones a class' interface and creates a mock version
+ * that can have return values and expectations set.
+ * @param array $methods Additional methods to add beyond
+ * those in th cloned class. Use this
+ * to emulate the dynamic addition of
+ * methods in the cloned class or when
+ * the class hasn't been written yet.
+ * @access public
+ */
+ function generate($methods) {
+ if (! $this->_reflection->classOrInterfaceExists()) {
+ return false;
+ }
+ $mock_reflection = new SimpleReflection($this->_mock_class);
+ if ($mock_reflection->classExistsSansAutoload()) {
+ return false;
+ }
+ $code = $this->_createClassCode($methods ? $methods : array());
+ return eval("$code return \$code;");
+ }
+
+ /**
+ * Subclasses a class and overrides every method with a mock one
+ * that can have return values and expectations set. Chains
+ * to an aggregated SimpleMock.
+ * @param array $methods Additional methods to add beyond
+ * those in the cloned class. Use this
+ * to emulate the dynamic addition of
+ * methods in the cloned class or when
+ * the class hasn't been written yet.
+ * @access public
+ */
+ function generateSubclass($methods) {
+ if (! $this->_reflection->classOrInterfaceExists()) {
+ return false;
+ }
+ $mock_reflection = new SimpleReflection($this->_mock_class);
+ if ($mock_reflection->classExistsSansAutoload()) {
+ return false;
+ }
+ if ($this->_reflection->isInterface() || $this->_reflection->hasFinal()) {
+ $code = $this->_createClassCode($methods ? $methods : array());
+ return eval("$code return \$code;");
+ } else {
+ $code = $this->_createSubclassCode($methods ? $methods : array());
+ return eval("$code return \$code;");
+ }
+ }
+
+ /**
+ * Generates a version of a class with selected
+ * methods mocked only. Inherits the old class
+ * and chains the mock methods of an aggregated
+ * mock object.
+ * @param array $methods Methods to be overridden
+ * with mock versions.
+ * @access public
+ */
+ function generatePartial($methods) {
+ if (! $this->_reflection->classExists($this->_class)) {
+ return false;
+ }
+ $mock_reflection = new SimpleReflection($this->_mock_class);
+ if ($mock_reflection->classExistsSansAutoload()) {
+ trigger_error('Partial mock class [' . $this->_mock_class . '] already exists');
+ return false;
+ }
+ $code = $this->_extendClassCode($methods);
+ return eval("$code return \$code;");
+ }
+
+ /**
+ * The new mock class code as a string.
+ * @param array $methods Additional methods.
+ * @return string Code for new mock class.
+ * @access private
+ */
+ function _createClassCode($methods) {
+ $implements = '';
+ $interfaces = $this->_reflection->getInterfaces();
+ if (function_exists('spl_classes')) {
+ $interfaces = array_diff($interfaces, array('Traversable'));
+ }
+ if (count($interfaces) > 0) {
+ $implements = 'implements ' . implode(', ', $interfaces);
+ }
+ $code = "class " . $this->_mock_class . " extends " . $this->_mock_base . " $implements {\n";
+ $code .= " function " . $this->_mock_class . "() {\n";
+ $code .= " \$this->" . $this->_mock_base . "();\n";
+ $code .= " }\n";
+ if (in_array('__construct', $this->_reflection->getMethods())) {
+ $code .= " " . $this->_reflection->getSignature('__construct') . " {\n";
+ $code .= " \$this->" . $this->_mock_base . "();\n";
+ $code .= " }\n";
+ }
+ $code .= $this->_createHandlerCode($methods);
+ $code .= "}\n";
+ return $code;
+ }
+
+ /**
+ * The new mock class code as a string. The mock will
+ * be a subclass of the original mocked class.
+ * @param array $methods Additional methods.
+ * @return string Code for new mock class.
+ * @access private
+ */
+ function _createSubclassCode($methods) {
+ $code = "class " . $this->_mock_class . " extends " . $this->_class . " {\n";
+ $code .= " var \$_mock;\n";
+ $code .= $this->_addMethodList(array_merge($methods, $this->_reflection->getMethods()));
+ $code .= "\n";
+ $code .= " function " . $this->_mock_class . "() {\n";
+ $code .= " \$this->_mock = &new " . $this->_mock_base . "();\n";
+ $code .= " \$this->_mock->disableExpectationNameChecks();\n";
+ $code .= " }\n";
+ $code .= $this->_chainMockReturns();
+ $code .= $this->_chainMockExpectations();
+ $code .= $this->_overrideMethods($this->_reflection->getMethods());
+ $code .= $this->_createNewMethodCode($methods);
+ $code .= "}\n";
+ return $code;
+ }
+
+ /**
+ * The extension class code as a string. The class
+ * composites a mock object and chains mocked methods
+ * to it.
+ * @param array $methods Mocked methods.
+ * @return string Code for a new class.
+ * @access private
+ */
+ function _extendClassCode($methods) {
+ $code = "class " . $this->_mock_class . " extends " . $this->_class . " {\n";
+ $code .= " var \$_mock;\n";
+ $code .= $this->_addMethodList($methods);
+ $code .= "\n";
+ $code .= " function " . $this->_mock_class . "() {\n";
+ $code .= " \$this->_mock = &new " . $this->_mock_base . "();\n";
+ $code .= " \$this->_mock->disableExpectationNameChecks();\n";
+ $code .= " }\n";
+ $code .= $this->_chainMockReturns();
+ $code .= $this->_chainMockExpectations();
+ $code .= $this->_overrideMethods($methods);
+ $code .= "}\n";
+ return $code;
+ }
+
+ /**
+ * Creates code within a class to generate replaced
+ * methods. All methods call the _invoke() handler
+ * with the method name and the arguments in an
+ * array.
+ * @param array $methods Additional methods.
+ * @access private
+ */
+ function _createHandlerCode($methods) {
+ $code = '';
+ $methods = array_merge($methods, $this->_reflection->getMethods());
+ foreach ($methods as $method) {
+ if ($this->_isConstructor($method)) {
+ continue;
+ }
+ $mock_reflection = new SimpleReflection($this->_mock_base);
+ if (in_array($method, $mock_reflection->getMethods())) {
+ continue;
+ }
+ $code .= " " . $this->_reflection->getSignature($method) . " {\n";
+ $code .= " \$args = func_get_args();\n";
+ $code .= " \$result = &\$this->_invoke(\"$method\", \$args);\n";
+ $code .= " return \$result;\n";
+ $code .= " }\n";
+ }
+ return $code;
+ }
+
+ /**
+ * Creates code within a class to generate a new
+ * methods. All methods call the _invoke() handler
+ * on the internal mock with the method name and
+ * the arguments in an array.
+ * @param array $methods Additional methods.
+ * @access private
+ */
+ function _createNewMethodCode($methods) {
+ $code = '';
+ foreach ($methods as $method) {
+ if ($this->_isConstructor($method)) {
+ continue;
+ }
+ $mock_reflection = new SimpleReflection($this->_mock_base);
+ if (in_array($method, $mock_reflection->getMethods())) {
+ continue;
+ }
+ $code .= " " . $this->_reflection->getSignature($method) . " {\n";
+ $code .= " \$args = func_get_args();\n";
+ $code .= " \$result = &\$this->_mock->_invoke(\"$method\", \$args);\n";
+ $code .= " return \$result;\n";
+ $code .= " }\n";
+ }
+ return $code;
+ }
+
+ /**
+ * Tests to see if a special PHP method is about to
+ * be stubbed by mistake.
+ * @param string $method Method name.
+ * @return boolean True if special.
+ * @access private
+ */
+ function _isConstructor($method) {
+ return in_array(
+ strtolower($method),
+ array('__construct', '__destruct'));
+ }
+
+ /**
+ * Creates a list of mocked methods for error checking.
+ * @param array $methods Mocked methods.
+ * @return string Code for a method list.
+ * @access private
+ */
+ function _addMethodList($methods) {
+ return " var \$_mocked_methods = array('" .
+ implode("', '", array_map('strtolower', $methods)) .
+ "');\n";
+ }
+
+ /**
+ * Creates code to abandon the expectation if not mocked.
+ * @param string $alias Parameter name of method name.
+ * @return string Code for bail out.
+ * @access private
+ */
+ function _bailOutIfNotMocked($alias) {
+ $code = " if (! in_array(strtolower($alias), \$this->_mocked_methods)) {\n";
+ $code .= " trigger_error(\"Method [$alias] is not mocked\");\n";
+ $code .= " \$null = null;\n";
+ $code .= " return \$null;\n";
+ $code .= " }\n";
+ return $code;
+ }
+
+ /**
+ * Creates source code for chaining to the composited
+ * mock object.
+ * @return string Code for mock set up.
+ * @access private
+ */
+ function _chainMockReturns() {
+ $code = " function setReturnValue(\$method, \$value, \$args = false) {\n";
+ $code .= $this->_bailOutIfNotMocked("\$method");
+ $code .= " \$this->_mock->setReturnValue(\$method, \$value, \$args);\n";
+ $code .= " }\n";
+ $code .= " function setReturnValueAt(\$timing, \$method, \$value, \$args = false) {\n";
+ $code .= $this->_bailOutIfNotMocked("\$method");
+ $code .= " \$this->_mock->setReturnValueAt(\$timing, \$method, \$value, \$args);\n";
+ $code .= " }\n";
+ $code .= " function setReturnReference(\$method, &\$ref, \$args = false) {\n";
+ $code .= $this->_bailOutIfNotMocked("\$method");
+ $code .= " \$this->_mock->setReturnReference(\$method, \$ref, \$args);\n";
+ $code .= " }\n";
+ $code .= " function setReturnReferenceAt(\$timing, \$method, &\$ref, \$args = false) {\n";
+ $code .= $this->_bailOutIfNotMocked("\$method");
+ $code .= " \$this->_mock->setReturnReferenceAt(\$timing, \$method, \$ref, \$args);\n";
+ $code .= " }\n";
+ return $code;
+ }
+
+ /**
+ * Creates source code for chaining to an aggregated
+ * mock object.
+ * @return string Code for expectations.
+ * @access private
+ */
+ function _chainMockExpectations() {
+ $code = " function expect(\$method, \$args = false, \$msg = '%s') {\n";
+ $code .= $this->_bailOutIfNotMocked("\$method");
+ $code .= " \$this->_mock->expect(\$method, \$args, \$msg);\n";
+ $code .= " }\n";
+ $code .= " function expectArguments(\$method, \$args = false, \$msg = '%s') {\n";
+ $code .= $this->_bailOutIfNotMocked("\$method");
+ $code .= " \$this->_mock->expectArguments(\$method, \$args, \$msg);\n";
+ $code .= " }\n";
+ $code .= " function expectAt(\$timing, \$method, \$args = false, \$msg = '%s') {\n";
+ $code .= $this->_bailOutIfNotMocked("\$method");
+ $code .= " \$this->_mock->expectArgumentsAt(\$timing, \$method, \$args, \$msg);\n";
+ $code .= " }\n";
+ $code .= " function expectArgumentsAt(\$timing, \$method, \$args = false, \$msg = '%s') {\n";
+ $code .= $this->_bailOutIfNotMocked("\$method");
+ $code .= " \$this->_mock->expectArgumentsAt(\$timing, \$method, \$args, \$msg);\n";
+ $code .= " }\n";
+ $code .= " function expectCallCount(\$method, \$count) {\n";
+ $code .= $this->_bailOutIfNotMocked("\$method");
+ $code .= " \$this->_mock->expectCallCount(\$method, \$count, \$msg = '%s');\n";
+ $code .= " }\n";
+ $code .= " function expectMaximumCallCount(\$method, \$count, \$msg = '%s') {\n";
+ $code .= $this->_bailOutIfNotMocked("\$method");
+ $code .= " \$this->_mock->expectMaximumCallCount(\$method, \$count, \$msg = '%s');\n";
+ $code .= " }\n";
+ $code .= " function expectMinimumCallCount(\$method, \$count, \$msg = '%s') {\n";
+ $code .= $this->_bailOutIfNotMocked("\$method");
+ $code .= " \$this->_mock->expectMinimumCallCount(\$method, \$count, \$msg = '%s');\n";
+ $code .= " }\n";
+ $code .= " function expectNever(\$method) {\n";
+ $code .= $this->_bailOutIfNotMocked("\$method");
+ $code .= " \$this->_mock->expectNever(\$method);\n";
+ $code .= " }\n";
+ $code .= " function expectOnce(\$method, \$args = false, \$msg = '%s') {\n";
+ $code .= $this->_bailOutIfNotMocked("\$method");
+ $code .= " \$this->_mock->expectOnce(\$method, \$args, \$msg);\n";
+ $code .= " }\n";
+ $code .= " function expectAtLeastOnce(\$method, \$args = false, \$msg = '%s') {\n";
+ $code .= $this->_bailOutIfNotMocked("\$method");
+ $code .= " \$this->_mock->expectAtLeastOnce(\$method, \$args, \$msg);\n";
+ $code .= " }\n";
+ $code .= " function tally() {\n";
+ $code .= " }\n";
+ return $code;
+ }
+
+ /**
+ * Creates source code to override a list of methods
+ * with mock versions.
+ * @param array $methods Methods to be overridden
+ * with mock versions.
+ * @return string Code for overridden chains.
+ * @access private
+ */
+ function _overrideMethods($methods) {
+ $code = "";
+ foreach ($methods as $method) {
+ if ($this->_isConstructor($method)) {
+ continue;
+ }
+ $code .= " " . $this->_reflection->getSignature($method) . " {\n";
+ $code .= " \$args = func_get_args();\n";
+ $code .= " \$result = &\$this->_mock->_invoke(\"$method\", \$args);\n";
+ $code .= " return \$result;\n";
+ $code .= " }\n";
+ }
+ return $code;
+ }
+}
+?>
diff --git a/tests/simpletest/page.php b/tests/simpletest/page.php
new file mode 100755
index 0000000000..ac56eee2ff
--- /dev/null
+++ b/tests/simpletest/page.php
@@ -0,0 +1,983 @@
+<?php
+/**
+ * Base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage WebTester
+ * @version $Id: page.php,v 1.136 2007/07/16 22:28:39 lastcraft Exp $
+ */
+
+/**#@+
+ * include other SimpleTest class files
+ */
+require_once(dirname(__FILE__) . '/http.php');
+require_once(dirname(__FILE__) . '/parser.php');
+require_once(dirname(__FILE__) . '/tag.php');
+require_once(dirname(__FILE__) . '/form.php');
+require_once(dirname(__FILE__) . '/selector.php');
+/**#@-*/
+
+/**
+ * Creates tags and widgets given HTML tag
+ * attributes.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+class SimpleTagBuilder {
+
+ /**
+ * Factory for the tag objects. Creates the
+ * appropriate tag object for the incoming tag name
+ * and attributes.
+ * @param string $name HTML tag name.
+ * @param hash $attributes Element attributes.
+ * @return SimpleTag Tag object.
+ * @access public
+ */
+ function createTag($name, $attributes) {
+ static $map = array(
+ 'a' => 'SimpleAnchorTag',
+ 'title' => 'SimpleTitleTag',
+ 'base' => 'SimpleBaseTag',
+ 'button' => 'SimpleButtonTag',
+ 'textarea' => 'SimpleTextAreaTag',
+ 'option' => 'SimpleOptionTag',
+ 'label' => 'SimpleLabelTag',
+ 'form' => 'SimpleFormTag',
+ 'frame' => 'SimpleFrameTag');
+ $attributes = $this->_keysToLowerCase($attributes);
+ if (array_key_exists($name, $map)) {
+ $tag_class = $map[$name];
+ return new $tag_class($attributes);
+ } elseif ($name == 'select') {
+ return $this->_createSelectionTag($attributes);
+ } elseif ($name == 'input') {
+ return $this->_createInputTag($attributes);
+ }
+ return new SimpleTag($name, $attributes);
+ }
+
+ /**
+ * Factory for selection fields.
+ * @param hash $attributes Element attributes.
+ * @return SimpleTag Tag object.
+ * @access protected
+ */
+ function _createSelectionTag($attributes) {
+ if (isset($attributes['multiple'])) {
+ return new MultipleSelectionTag($attributes);
+ }
+ return new SimpleSelectionTag($attributes);
+ }
+
+ /**
+ * Factory for input tags.
+ * @param hash $attributes Element attributes.
+ * @return SimpleTag Tag object.
+ * @access protected
+ */
+ function _createInputTag($attributes) {
+ if (! isset($attributes['type'])) {
+ return new SimpleTextTag($attributes);
+ }
+ $type = strtolower(trim($attributes['type']));
+ $map = array(
+ 'submit' => 'SimpleSubmitTag',
+ 'image' => 'SimpleImageSubmitTag',
+ 'checkbox' => 'SimpleCheckboxTag',
+ 'radio' => 'SimpleRadioButtonTag',
+ 'text' => 'SimpleTextTag',
+ 'hidden' => 'SimpleTextTag',
+ 'password' => 'SimpleTextTag',
+ 'file' => 'SimpleUploadTag');
+ if (array_key_exists($type, $map)) {
+ $tag_class = $map[$type];
+ return new $tag_class($attributes);
+ }
+ return false;
+ }
+
+ /**
+ * Make the keys lower case for case insensitive look-ups.
+ * @param hash $map Hash to convert.
+ * @return hash Unchanged values, but keys lower case.
+ * @access private
+ */
+ function _keysToLowerCase($map) {
+ $lower = array();
+ foreach ($map as $key => $value) {
+ $lower[strtolower($key)] = $value;
+ }
+ return $lower;
+ }
+}
+
+/**
+ * SAX event handler. Maintains a list of
+ * open tags and dispatches them as they close.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+class SimplePageBuilder extends SimpleSaxListener {
+ var $_tags;
+ var $_page;
+ var $_private_content_tag;
+
+ /**
+ * Sets the builder up empty.
+ * @access public
+ */
+ function SimplePageBuilder() {
+ $this->SimpleSaxListener();
+ }
+
+ /**
+ * Frees up any references so as to allow the PHP garbage
+ * collection from unset() to work.
+ * @access public
+ */
+ function free() {
+ unset($this->_tags);
+ unset($this->_page);
+ unset($this->_private_content_tags);
+ }
+
+ /**
+ * Reads the raw content and send events
+ * into the page to be built.
+ * @param $response SimpleHttpResponse Fetched response.
+ * @return SimplePage Newly parsed page.
+ * @access public
+ */
+ function &parse($response) {
+ $this->_tags = array();
+ $this->_page = &$this->_createPage($response);
+ $parser = &$this->_createParser($this);
+ $parser->parse($response->getContent());
+ $this->_page->acceptPageEnd();
+ return $this->_page;
+ }
+
+ /**
+ * Creates an empty page.
+ * @return SimplePage New unparsed page.
+ * @access protected
+ */
+ function &_createPage($response) {
+ $page = &new SimplePage($response);
+ return $page;
+ }
+
+ /**
+ * Creates the parser used with the builder.
+ * @param $listener SimpleSaxListener Target of parser.
+ * @return SimpleSaxParser Parser to generate
+ * events for the builder.
+ * @access protected
+ */
+ function &_createParser(&$listener) {
+ $parser = &new SimpleHtmlSaxParser($listener);
+ return $parser;
+ }
+
+ /**
+ * Start of element event. Opens a new tag.
+ * @param string $name Element name.
+ * @param hash $attributes Attributes without content
+ * are marked as true.
+ * @return boolean False on parse error.
+ * @access public
+ */
+ function startElement($name, $attributes) {
+ $factory = &new SimpleTagBuilder();
+ $tag = $factory->createTag($name, $attributes);
+ if (! $tag) {
+ return true;
+ }
+ if ($tag->getTagName() == 'label') {
+ $this->_page->acceptLabelStart($tag);
+ $this->_openTag($tag);
+ return true;
+ }
+ if ($tag->getTagName() == 'form') {
+ $this->_page->acceptFormStart($tag);
+ return true;
+ }
+ if ($tag->getTagName() == 'frameset') {
+ $this->_page->acceptFramesetStart($tag);
+ return true;
+ }
+ if ($tag->getTagName() == 'frame') {
+ $this->_page->acceptFrame($tag);
+ return true;
+ }
+ if ($tag->isPrivateContent() && ! isset($this->_private_content_tag)) {
+ $this->_private_content_tag = &$tag;
+ }
+ if ($tag->expectEndTag()) {
+ $this->_openTag($tag);
+ return true;
+ }
+ $this->_page->acceptTag($tag);
+ return true;
+ }
+
+ /**
+ * End of element event.
+ * @param string $name Element name.
+ * @return boolean False on parse error.
+ * @access public
+ */
+ function endElement($name) {
+ if ($name == 'label') {
+ $this->_page->acceptLabelEnd();
+ return true;
+ }
+ if ($name == 'form') {
+ $this->_page->acceptFormEnd();
+ return true;
+ }
+ if ($name == 'frameset') {
+ $this->_page->acceptFramesetEnd();
+ return true;
+ }
+ if ($this->_hasNamedTagOnOpenTagStack($name)) {
+ $tag = array_pop($this->_tags[$name]);
+ if ($tag->isPrivateContent() && $this->_private_content_tag->getTagName() == $name) {
+ unset($this->_private_content_tag);
+ }
+ $this->_addContentTagToOpenTags($tag);
+ $this->_page->acceptTag($tag);
+ return true;
+ }
+ return true;
+ }
+
+ /**
+ * Test to see if there are any open tags awaiting
+ * closure that match the tag name.
+ * @param string $name Element name.
+ * @return boolean True if any are still open.
+ * @access private
+ */
+ function _hasNamedTagOnOpenTagStack($name) {
+ return isset($this->_tags[$name]) && (count($this->_tags[$name]) > 0);
+ }
+
+ /**
+ * Unparsed, but relevant data. The data is added
+ * to every open tag.
+ * @param string $text May include unparsed tags.
+ * @return boolean False on parse error.
+ * @access public
+ */
+ function addContent($text) {
+ if (isset($this->_private_content_tag)) {
+ $this->_private_content_tag->addContent($text);
+ } else {
+ $this->_addContentToAllOpenTags($text);
+ }
+ return true;
+ }
+
+ /**
+ * Any content fills all currently open tags unless it
+ * is part of an option tag.
+ * @param string $text May include unparsed tags.
+ * @access private
+ */
+ function _addContentToAllOpenTags($text) {
+ foreach (array_keys($this->_tags) as $name) {
+ for ($i = 0, $count = count($this->_tags[$name]); $i < $count; $i++) {
+ $this->_tags[$name][$i]->addContent($text);
+ }
+ }
+ }
+
+ /**
+ * Parsed data in tag form. The parsed tag is added
+ * to every open tag. Used for adding options to select
+ * fields only.
+ * @param SimpleTag $tag Option tags only.
+ * @access private
+ */
+ function _addContentTagToOpenTags(&$tag) {
+ if ($tag->getTagName() != 'option') {
+ return;
+ }
+ foreach (array_keys($this->_tags) as $name) {
+ for ($i = 0, $count = count($this->_tags[$name]); $i < $count; $i++) {
+ $this->_tags[$name][$i]->addTag($tag);
+ }
+ }
+ }
+
+ /**
+ * Opens a tag for receiving content. Multiple tags
+ * will be receiving input at the same time.
+ * @param SimpleTag $tag New content tag.
+ * @access private
+ */
+ function _openTag(&$tag) {
+ $name = $tag->getTagName();
+ if (! in_array($name, array_keys($this->_tags))) {
+ $this->_tags[$name] = array();
+ }
+ $this->_tags[$name][] = &$tag;
+ }
+}
+
+/**
+ * A wrapper for a web page.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+class SimplePage {
+ var $_links;
+ var $_title;
+ var $_last_widget;
+ var $_label;
+ var $_left_over_labels;
+ var $_open_forms;
+ var $_complete_forms;
+ var $_frameset;
+ var $_frames;
+ var $_frameset_nesting_level;
+ var $_transport_error;
+ var $_raw;
+ var $_text;
+ var $_sent;
+ var $_headers;
+ var $_method;
+ var $_url;
+ var $_base = false;
+ var $_request_data;
+
+ /**
+ * Parses a page ready to access it's contents.
+ * @param SimpleHttpResponse $response Result of HTTP fetch.
+ * @access public
+ */
+ function SimplePage($response = false) {
+ $this->_links = array();
+ $this->_title = false;
+ $this->_left_over_labels = array();
+ $this->_open_forms = array();
+ $this->_complete_forms = array();
+ $this->_frameset = false;
+ $this->_frames = array();
+ $this->_frameset_nesting_level = 0;
+ $this->_text = false;
+ if ($response) {
+ $this->_extractResponse($response);
+ } else {
+ $this->_noResponse();
+ }
+ }
+
+ /**
+ * Extracts all of the response information.
+ * @param SimpleHttpResponse $response Response being parsed.
+ * @access private
+ */
+ function _extractResponse($response) {
+ $this->_transport_error = $response->getError();
+ $this->_raw = $response->getContent();
+ $this->_sent = $response->getSent();
+ $this->_headers = $response->getHeaders();
+ $this->_method = $response->getMethod();
+ $this->_url = $response->getUrl();
+ $this->_request_data = $response->getRequestData();
+ }
+
+ /**
+ * Sets up a missing response.
+ * @access private
+ */
+ function _noResponse() {
+ $this->_transport_error = 'No page fetched yet';
+ $this->_raw = false;
+ $this->_sent = false;
+ $this->_headers = false;
+ $this->_method = 'GET';
+ $this->_url = false;
+ $this->_request_data = false;
+ }
+
+ /**
+ * Original request as bytes sent down the wire.
+ * @return mixed Sent content.
+ * @access public
+ */
+ function getRequest() {
+ return $this->_sent;
+ }
+
+ /**
+ * Accessor for raw text of page.
+ * @return string Raw unparsed content.
+ * @access public
+ */
+ function getRaw() {
+ return $this->_raw;
+ }
+
+ /**
+ * Accessor for plain text of page as a text browser
+ * would see it.
+ * @return string Plain text of page.
+ * @access public
+ */
+ function getText() {
+ if (! $this->_text) {
+ $this->_text = SimpleHtmlSaxParser::normalise($this->_raw);
+ }
+ return $this->_text;
+ }
+
+ /**
+ * Accessor for raw headers of page.
+ * @return string Header block as text.
+ * @access public
+ */
+ function getHeaders() {
+ if ($this->_headers) {
+ return $this->_headers->getRaw();
+ }
+ return false;
+ }
+
+ /**
+ * Original request method.
+ * @return string GET, POST or HEAD.
+ * @access public
+ */
+ function getMethod() {
+ return $this->_method;
+ }
+
+ /**
+ * Original resource name.
+ * @return SimpleUrl Current url.
+ * @access public
+ */
+ function getUrl() {
+ return $this->_url;
+ }
+
+ /**
+ * Base URL if set via BASE tag page url otherwise
+ * @return SimpleUrl Base url.
+ * @access public
+ */
+ function getBaseUrl() {
+ return $this->_base;
+ }
+
+ /**
+ * Original request data.
+ * @return mixed Sent content.
+ * @access public
+ */
+ function getRequestData() {
+ return $this->_request_data;
+ }
+
+ /**
+ * Accessor for last error.
+ * @return string Error from last response.
+ * @access public
+ */
+ function getTransportError() {
+ return $this->_transport_error;
+ }
+
+ /**
+ * Accessor for current MIME type.
+ * @return string MIME type as string; e.g. 'text/html'
+ * @access public
+ */
+ function getMimeType() {
+ if ($this->_headers) {
+ return $this->_headers->getMimeType();
+ }
+ return false;
+ }
+
+ /**
+ * Accessor for HTTP response code.
+ * @return integer HTTP response code received.
+ * @access public
+ */
+ function getResponseCode() {
+ if ($this->_headers) {
+ return $this->_headers->getResponseCode();
+ }
+ return false;
+ }
+
+ /**
+ * Accessor for last Authentication type. Only valid
+ * straight after a challenge (401).
+ * @return string Description of challenge type.
+ * @access public
+ */
+ function getAuthentication() {
+ if ($this->_headers) {
+ return $this->_headers->getAuthentication();
+ }
+ return false;
+ }
+
+ /**
+ * Accessor for last Authentication realm. Only valid
+ * straight after a challenge (401).
+ * @return string Name of security realm.
+ * @access public
+ */
+ function getRealm() {
+ if ($this->_headers) {
+ return $this->_headers->getRealm();
+ }
+ return false;
+ }
+
+ /**
+ * Accessor for current frame focus. Will be
+ * false as no frames.
+ * @return array Always empty.
+ * @access public
+ */
+ function getFrameFocus() {
+ return array();
+ }
+
+ /**
+ * Sets the focus by index. The integer index starts from 1.
+ * @param integer $choice Chosen frame.
+ * @return boolean Always false.
+ * @access public
+ */
+ function setFrameFocusByIndex($choice) {
+ return false;
+ }
+
+ /**
+ * Sets the focus by name. Always fails for a leaf page.
+ * @param string $name Chosen frame.
+ * @return boolean False as no frames.
+ * @access public
+ */
+ function setFrameFocus($name) {
+ return false;
+ }
+
+ /**
+ * Clears the frame focus. Does nothing for a leaf page.
+ * @access public
+ */
+ function clearFrameFocus() {
+ }
+
+ /**
+ * Adds a tag to the page.
+ * @param SimpleTag $tag Tag to accept.
+ * @access public
+ */
+ function acceptTag(&$tag) {
+ if ($tag->getTagName() == "a") {
+ $this->_addLink($tag);
+ } elseif ($tag->getTagName() == "base") {
+ $this->_setBase($tag);
+ } elseif ($tag->getTagName() == "title") {
+ $this->_setTitle($tag);
+ } elseif ($this->_isFormElement($tag->getTagName())) {
+ for ($i = 0; $i < count($this->_open_forms); $i++) {
+ $this->_open_forms[$i]->addWidget($tag);
+ }
+ $this->_last_widget = &$tag;
+ }
+ }
+
+ /**
+ * Opens a label for a described widget.
+ * @param SimpleFormTag $tag Tag to accept.
+ * @access public
+ */
+ function acceptLabelStart(&$tag) {
+ $this->_label = &$tag;
+ unset($this->_last_widget);
+ }
+
+ /**
+ * Closes the most recently opened label.
+ * @access public
+ */
+ function acceptLabelEnd() {
+ if (isset($this->_label)) {
+ if (isset($this->_last_widget)) {
+ $this->_last_widget->setLabel($this->_label->getText());
+ unset($this->_last_widget);
+ } else {
+ $this->_left_over_labels[] = SimpleTestCompatibility::copy($this->_label);
+ }
+ unset($this->_label);
+ }
+ }
+
+ /**
+ * Tests to see if a tag is a possible form
+ * element.
+ * @param string $name HTML element name.
+ * @return boolean True if form element.
+ * @access private
+ */
+ function _isFormElement($name) {
+ return in_array($name, array('input', 'button', 'textarea', 'select'));
+ }
+
+ /**
+ * Opens a form. New widgets go here.
+ * @param SimpleFormTag $tag Tag to accept.
+ * @access public
+ */
+ function acceptFormStart(&$tag) {
+ $this->_open_forms[] = &new SimpleForm($tag, $this);
+ }
+
+ /**
+ * Closes the most recently opened form.
+ * @access public
+ */
+ function acceptFormEnd() {
+ if (count($this->_open_forms)) {
+ $this->_complete_forms[] = array_pop($this->_open_forms);
+ }
+ }
+
+ /**
+ * Opens a frameset. A frameset may contain nested
+ * frameset tags.
+ * @param SimpleFramesetTag $tag Tag to accept.
+ * @access public
+ */
+ function acceptFramesetStart(&$tag) {
+ if (! $this->_isLoadingFrames()) {
+ $this->_frameset = &$tag;
+ }
+ $this->_frameset_nesting_level++;
+ }
+
+ /**
+ * Closes the most recently opened frameset.
+ * @access public
+ */
+ function acceptFramesetEnd() {
+ if ($this->_isLoadingFrames()) {
+ $this->_frameset_nesting_level--;
+ }
+ }
+
+ /**
+ * Takes a single frame tag and stashes it in
+ * the current frame set.
+ * @param SimpleFrameTag $tag Tag to accept.
+ * @access public
+ */
+ function acceptFrame(&$tag) {
+ if ($this->_isLoadingFrames()) {
+ if ($tag->getAttribute('src')) {
+ $this->_frames[] = &$tag;
+ }
+ }
+ }
+
+ /**
+ * Test to see if in the middle of reading
+ * a frameset.
+ * @return boolean True if inframeset.
+ * @access private
+ */
+ function _isLoadingFrames() {
+ if (! $this->_frameset) {
+ return false;
+ }
+ return ($this->_frameset_nesting_level > 0);
+ }
+
+ /**
+ * Test to see if link is an absolute one.
+ * @param string $url Url to test.
+ * @return boolean True if absolute.
+ * @access protected
+ */
+ function _linkIsAbsolute($url) {
+ $parsed = new SimpleUrl($url);
+ return (boolean)($parsed->getScheme() && $parsed->getHost());
+ }
+
+ /**
+ * Adds a link to the page.
+ * @param SimpleAnchorTag $tag Link to accept.
+ * @access protected
+ */
+ function _addLink($tag) {
+ $this->_links[] = $tag;
+ }
+
+ /**
+ * Marker for end of complete page. Any work in
+ * progress can now be closed.
+ * @access public
+ */
+ function acceptPageEnd() {
+ while (count($this->_open_forms)) {
+ $this->_complete_forms[] = array_pop($this->_open_forms);
+ }
+ foreach ($this->_left_over_labels as $label) {
+ for ($i = 0, $count = count($this->_complete_forms); $i < $count; $i++) {
+ $this->_complete_forms[$i]->attachLabelBySelector(
+ new SimpleById($label->getFor()),
+ $label->getText());
+ }
+ }
+ }
+
+ /**
+ * Test for the presence of a frameset.
+ * @return boolean True if frameset.
+ * @access public
+ */
+ function hasFrames() {
+ return (boolean)$this->_frameset;
+ }
+
+ /**
+ * Accessor for frame name and source URL for every frame that
+ * will need to be loaded. Immediate children only.
+ * @return boolean/array False if no frameset or
+ * otherwise a hash of frame URLs.
+ * The key is either a numerical
+ * base one index or the name attribute.
+ * @access public
+ */
+ function getFrameset() {
+ if (! $this->_frameset) {
+ return false;
+ }
+ $urls = array();
+ for ($i = 0; $i < count($this->_frames); $i++) {
+ $name = $this->_frames[$i]->getAttribute('name');
+ $url = new SimpleUrl($this->_frames[$i]->getAttribute('src'));
+ $urls[$name ? $name : $i + 1] = $this->expandUrl($url);
+ }
+ return $urls;
+ }
+
+ /**
+ * Fetches a list of loaded frames.
+ * @return array/string Just the URL for a single page.
+ * @access public
+ */
+ function getFrames() {
+ $url = $this->expandUrl($this->getUrl());
+ return $url->asString();
+ }
+
+ /**
+ * Accessor for a list of all links.
+ * @return array List of urls with scheme of
+ * http or https and hostname.
+ * @access public
+ */
+ function getUrls() {
+ $all = array();
+ foreach ($this->_links as $link) {
+ $url = $this->_getUrlFromLink($link);
+ $all[] = $url->asString();
+ }
+ return $all;
+ }
+
+ /**
+ * Accessor for URLs by the link label. Label will match
+ * regardess of whitespace issues and case.
+ * @param string $label Text of link.
+ * @return array List of links with that label.
+ * @access public
+ */
+ function getUrlsByLabel($label) {
+ $matches = array();
+ foreach ($this->_links as $link) {
+ if ($link->getText() == $label) {
+ $matches[] = $this->_getUrlFromLink($link);
+ }
+ }
+ return $matches;
+ }
+
+ /**
+ * Accessor for a URL by the id attribute.
+ * @param string $id Id attribute of link.
+ * @return SimpleUrl URL with that id of false if none.
+ * @access public
+ */
+ function getUrlById($id) {
+ foreach ($this->_links as $link) {
+ if ($link->getAttribute('id') === (string)$id) {
+ return $this->_getUrlFromLink($link);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Converts a link tag into a target URL.
+ * @param SimpleAnchor $link Parsed link.
+ * @return SimpleUrl URL with frame target if any.
+ * @access private
+ */
+ function _getUrlFromLink($link) {
+ $url = $this->expandUrl($link->getHref());
+ if ($link->getAttribute('target')) {
+ $url->setTarget($link->getAttribute('target'));
+ }
+ return $url;
+ }
+
+ /**
+ * Expands expandomatic URLs into fully qualified
+ * URLs.
+ * @param SimpleUrl $url Relative URL.
+ * @return SimpleUrl Absolute URL.
+ * @access public
+ */
+ function expandUrl($url) {
+ if (! is_object($url)) {
+ $url = new SimpleUrl($url);
+ }
+ $location = $this->getBaseUrl() ? $this->getBaseUrl() : new SimpleUrl();
+ return $url->makeAbsolute($location->makeAbsolute($this->getUrl()));
+ }
+
+ /**
+ * Sets the base url for the page.
+ * @param SimpleTag $tag Base URL for page.
+ * @access protected
+ */
+ function _setBase(&$tag) {
+ $url = $tag->getAttribute('href');
+ $this->_base = new SimpleUrl($url);
+ }
+
+ /**
+ * Sets the title tag contents.
+ * @param SimpleTitleTag $tag Title of page.
+ * @access protected
+ */
+ function _setTitle(&$tag) {
+ $this->_title = &$tag;
+ }
+
+ /**
+ * Accessor for parsed title.
+ * @return string Title or false if no title is present.
+ * @access public
+ */
+ function getTitle() {
+ if ($this->_title) {
+ return $this->_title->getText();
+ }
+ return false;
+ }
+
+ /**
+ * Finds a held form by button label. Will only
+ * search correctly built forms.
+ * @param SimpleSelector $selector Button finder.
+ * @return SimpleForm Form object containing
+ * the button.
+ * @access public
+ */
+ function &getFormBySubmit($selector) {
+ for ($i = 0; $i < count($this->_complete_forms); $i++) {
+ if ($this->_complete_forms[$i]->hasSubmit($selector)) {
+ return $this->_complete_forms[$i];
+ }
+ }
+ $null = null;
+ return $null;
+ }
+
+ /**
+ * Finds a held form by image using a selector.
+ * Will only search correctly built forms.
+ * @param SimpleSelector $selector Image finder.
+ * @return SimpleForm Form object containing
+ * the image.
+ * @access public
+ */
+ function &getFormByImage($selector) {
+ for ($i = 0; $i < count($this->_complete_forms); $i++) {
+ if ($this->_complete_forms[$i]->hasImage($selector)) {
+ return $this->_complete_forms[$i];
+ }
+ }
+ $null = null;
+ return $null;
+ }
+
+ /**
+ * Finds a held form by the form ID. A way of
+ * identifying a specific form when we have control
+ * of the HTML code.
+ * @param string $id Form label.
+ * @return SimpleForm Form object containing the matching ID.
+ * @access public
+ */
+ function &getFormById($id) {
+ for ($i = 0; $i < count($this->_complete_forms); $i++) {
+ if ($this->_complete_forms[$i]->getId() == $id) {
+ return $this->_complete_forms[$i];
+ }
+ }
+ $null = null;
+ return $null;
+ }
+
+ /**
+ * Sets a field on each form in which the field is
+ * available.
+ * @param SimpleSelector $selector Field finder.
+ * @param string $value Value to set field to.
+ * @return boolean True if value is valid.
+ * @access public
+ */
+ function setField($selector, $value) {
+ $is_set = false;
+ for ($i = 0; $i < count($this->_complete_forms); $i++) {
+ if ($this->_complete_forms[$i]->setField($selector, $value)) {
+ $is_set = true;
+ }
+ }
+ return $is_set;
+ }
+
+ /**
+ * Accessor for a form element value within a page.
+ * @param SimpleSelector $selector Field finder.
+ * @return string/boolean A string if the field is
+ * present, false if unchecked
+ * and null if missing.
+ * @access public
+ */
+ function getField($selector) {
+ for ($i = 0; $i < count($this->_complete_forms); $i++) {
+ $value = $this->_complete_forms[$i]->getValue($selector);
+ if (isset($value)) {
+ return $value;
+ }
+ }
+ return null;
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/parser.php b/tests/simpletest/parser.php
new file mode 100755
index 0000000000..458d9f4c5f
--- /dev/null
+++ b/tests/simpletest/parser.php
@@ -0,0 +1,767 @@
+<?php
+/**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage MockObjects
+ * @version $Id: parser.php,v 1.75 2007/07/14 02:04:33 lastcraft Exp $
+ */
+
+/**#@+
+ * Lexer mode stack constants
+ */
+foreach (array('LEXER_ENTER', 'LEXER_MATCHED',
+ 'LEXER_UNMATCHED', 'LEXER_EXIT',
+ 'LEXER_SPECIAL') as $i => $constant) {
+ if (! defined($constant)) {
+ define($constant, $i + 1);
+ }
+}
+/**#@-*/
+
+/**
+ * Compounded regular expression. Any of
+ * the contained patterns could match and
+ * when one does, it's label is returned.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+class ParallelRegex {
+ var $_patterns;
+ var $_labels;
+ var $_regex;
+ var $_case;
+
+ /**
+ * Constructor. Starts with no patterns.
+ * @param boolean $case True for case sensitive, false
+ * for insensitive.
+ * @access public
+ */
+ function ParallelRegex($case) {
+ $this->_case = $case;
+ $this->_patterns = array();
+ $this->_labels = array();
+ $this->_regex = null;
+ }
+
+ /**
+ * Adds a pattern with an optional label.
+ * @param string $pattern Perl style regex, but ( and )
+ * lose the usual meaning.
+ * @param string $label Label of regex to be returned
+ * on a match.
+ * @access public
+ */
+ function addPattern($pattern, $label = true) {
+ $count = count($this->_patterns);
+ $this->_patterns[$count] = $pattern;
+ $this->_labels[$count] = $label;
+ $this->_regex = null;
+ }
+
+ /**
+ * Attempts to match all patterns at once against
+ * a string.
+ * @param string $subject String to match against.
+ * @param string $match First matched portion of
+ * subject.
+ * @return boolean True on success.
+ * @access public
+ */
+ function match($subject, &$match) {
+ if (count($this->_patterns) == 0) {
+ return false;
+ }
+ if (! preg_match($this->_getCompoundedRegex(), $subject, $matches)) {
+ $match = '';
+ return false;
+ }
+ $match = $matches[0];
+ for ($i = 1; $i < count($matches); $i++) {
+ if ($matches[$i]) {
+ return $this->_labels[$i - 1];
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Compounds the patterns into a single
+ * regular expression separated with the
+ * "or" operator. Caches the regex.
+ * Will automatically escape (, ) and / tokens.
+ * @param array $patterns List of patterns in order.
+ * @access private
+ */
+ function _getCompoundedRegex() {
+ if ($this->_regex == null) {
+ for ($i = 0, $count = count($this->_patterns); $i < $count; $i++) {
+ $this->_patterns[$i] = '(' . str_replace(
+ array('/', '(', ')'),
+ array('\/', '\(', '\)'),
+ $this->_patterns[$i]) . ')';
+ }
+ $this->_regex = "/" . implode("|", $this->_patterns) . "/" . $this->_getPerlMatchingFlags();
+ }
+ return $this->_regex;
+ }
+
+ /**
+ * Accessor for perl regex mode flags to use.
+ * @return string Perl regex flags.
+ * @access private
+ */
+ function _getPerlMatchingFlags() {
+ return ($this->_case ? "msS" : "msSi");
+ }
+}
+
+/**
+ * States for a stack machine.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+class SimpleStateStack {
+ var $_stack;
+
+ /**
+ * Constructor. Starts in named state.
+ * @param string $start Starting state name.
+ * @access public
+ */
+ function SimpleStateStack($start) {
+ $this->_stack = array($start);
+ }
+
+ /**
+ * Accessor for current state.
+ * @return string State.
+ * @access public
+ */
+ function getCurrent() {
+ return $this->_stack[count($this->_stack) - 1];
+ }
+
+ /**
+ * Adds a state to the stack and sets it
+ * to be the current state.
+ * @param string $state New state.
+ * @access public
+ */
+ function enter($state) {
+ array_push($this->_stack, $state);
+ }
+
+ /**
+ * Leaves the current state and reverts
+ * to the previous one.
+ * @return boolean False if we drop off
+ * the bottom of the list.
+ * @access public
+ */
+ function leave() {
+ if (count($this->_stack) == 1) {
+ return false;
+ }
+ array_pop($this->_stack);
+ return true;
+ }
+}
+
+/**
+ * Accepts text and breaks it into tokens.
+ * Some optimisation to make the sure the
+ * content is only scanned by the PHP regex
+ * parser once. Lexer modes must not start
+ * with leading underscores.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+class SimpleLexer {
+ var $_regexes;
+ var $_parser;
+ var $_mode;
+ var $_mode_handlers;
+ var $_case;
+
+ /**
+ * Sets up the lexer in case insensitive matching
+ * by default.
+ * @param SimpleSaxParser $parser Handling strategy by
+ * reference.
+ * @param string $start Starting handler.
+ * @param boolean $case True for case sensitive.
+ * @access public
+ */
+ function SimpleLexer(&$parser, $start = "accept", $case = false) {
+ $this->_case = $case;
+ $this->_regexes = array();
+ $this->_parser = &$parser;
+ $this->_mode = &new SimpleStateStack($start);
+ $this->_mode_handlers = array($start => $start);
+ }
+
+ /**
+ * Adds a token search pattern for a particular
+ * parsing mode. The pattern does not change the
+ * current mode.
+ * @param string $pattern Perl style regex, but ( and )
+ * lose the usual meaning.
+ * @param string $mode Should only apply this
+ * pattern when dealing with
+ * this type of input.
+ * @access public
+ */
+ function addPattern($pattern, $mode = "accept") {
+ if (! isset($this->_regexes[$mode])) {
+ $this->_regexes[$mode] = new ParallelRegex($this->_case);
+ }
+ $this->_regexes[$mode]->addPattern($pattern);
+ if (! isset($this->_mode_handlers[$mode])) {
+ $this->_mode_handlers[$mode] = $mode;
+ }
+ }
+
+ /**
+ * Adds a pattern that will enter a new parsing
+ * mode. Useful for entering parenthesis, strings,
+ * tags, etc.
+ * @param string $pattern Perl style regex, but ( and )
+ * lose the usual meaning.
+ * @param string $mode Should only apply this
+ * pattern when dealing with
+ * this type of input.
+ * @param string $new_mode Change parsing to this new
+ * nested mode.
+ * @access public
+ */
+ function addEntryPattern($pattern, $mode, $new_mode) {
+ if (! isset($this->_regexes[$mode])) {
+ $this->_regexes[$mode] = new ParallelRegex($this->_case);
+ }
+ $this->_regexes[$mode]->addPattern($pattern, $new_mode);
+ if (! isset($this->_mode_handlers[$new_mode])) {
+ $this->_mode_handlers[$new_mode] = $new_mode;
+ }
+ }
+
+ /**
+ * Adds a pattern that will exit the current mode
+ * and re-enter the previous one.
+ * @param string $pattern Perl style regex, but ( and )
+ * lose the usual meaning.
+ * @param string $mode Mode to leave.
+ * @access public
+ */
+ function addExitPattern($pattern, $mode) {
+ if (! isset($this->_regexes[$mode])) {
+ $this->_regexes[$mode] = new ParallelRegex($this->_case);
+ }
+ $this->_regexes[$mode]->addPattern($pattern, "__exit");
+ if (! isset($this->_mode_handlers[$mode])) {
+ $this->_mode_handlers[$mode] = $mode;
+ }
+ }
+
+ /**
+ * Adds a pattern that has a special mode. Acts as an entry
+ * and exit pattern in one go, effectively calling a special
+ * parser handler for this token only.
+ * @param string $pattern Perl style regex, but ( and )
+ * lose the usual meaning.
+ * @param string $mode Should only apply this
+ * pattern when dealing with
+ * this type of input.
+ * @param string $special Use this mode for this one token.
+ * @access public
+ */
+ function addSpecialPattern($pattern, $mode, $special) {
+ if (! isset($this->_regexes[$mode])) {
+ $this->_regexes[$mode] = new ParallelRegex($this->_case);
+ }
+ $this->_regexes[$mode]->addPattern($pattern, "_$special");
+ if (! isset($this->_mode_handlers[$special])) {
+ $this->_mode_handlers[$special] = $special;
+ }
+ }
+
+ /**
+ * Adds a mapping from a mode to another handler.
+ * @param string $mode Mode to be remapped.
+ * @param string $handler New target handler.
+ * @access public
+ */
+ function mapHandler($mode, $handler) {
+ $this->_mode_handlers[$mode] = $handler;
+ }
+
+ /**
+ * Splits the page text into tokens. Will fail
+ * if the handlers report an error or if no
+ * content is consumed. If successful then each
+ * unparsed and parsed token invokes a call to the
+ * held listener.
+ * @param string $raw Raw HTML text.
+ * @return boolean True on success, else false.
+ * @access public
+ */
+ function parse($raw) {
+ if (! isset($this->_parser)) {
+ return false;
+ }
+ $length = strlen($raw);
+ while (is_array($parsed = $this->_reduce($raw))) {
+ list($raw, $unmatched, $matched, $mode) = $parsed;
+ if (! $this->_dispatchTokens($unmatched, $matched, $mode)) {
+ return false;
+ }
+ if ($raw === '') {
+ return true;
+ }
+ if (strlen($raw) == $length) {
+ return false;
+ }
+ $length = strlen($raw);
+ }
+ if (! $parsed) {
+ return false;
+ }
+ return $this->_invokeParser($raw, LEXER_UNMATCHED);
+ }
+
+ /**
+ * Sends the matched token and any leading unmatched
+ * text to the parser changing the lexer to a new
+ * mode if one is listed.
+ * @param string $unmatched Unmatched leading portion.
+ * @param string $matched Actual token match.
+ * @param string $mode Mode after match. A boolean
+ * false mode causes no change.
+ * @return boolean False if there was any error
+ * from the parser.
+ * @access private
+ */
+ function _dispatchTokens($unmatched, $matched, $mode = false) {
+ if (! $this->_invokeParser($unmatched, LEXER_UNMATCHED)) {
+ return false;
+ }
+ if (is_bool($mode)) {
+ return $this->_invokeParser($matched, LEXER_MATCHED);
+ }
+ if ($this->_isModeEnd($mode)) {
+ if (! $this->_invokeParser($matched, LEXER_EXIT)) {
+ return false;
+ }
+ return $this->_mode->leave();
+ }
+ if ($this->_isSpecialMode($mode)) {
+ $this->_mode->enter($this->_decodeSpecial($mode));
+ if (! $this->_invokeParser($matched, LEXER_SPECIAL)) {
+ return false;
+ }
+ return $this->_mode->leave();
+ }
+ $this->_mode->enter($mode);
+ return $this->_invokeParser($matched, LEXER_ENTER);
+ }
+
+ /**
+ * Tests to see if the new mode is actually to leave
+ * the current mode and pop an item from the matching
+ * mode stack.
+ * @param string $mode Mode to test.
+ * @return boolean True if this is the exit mode.
+ * @access private
+ */
+ function _isModeEnd($mode) {
+ return ($mode === "__exit");
+ }
+
+ /**
+ * Test to see if the mode is one where this mode
+ * is entered for this token only and automatically
+ * leaves immediately afterwoods.
+ * @param string $mode Mode to test.
+ * @return boolean True if this is the exit mode.
+ * @access private
+ */
+ function _isSpecialMode($mode) {
+ return (strncmp($mode, "_", 1) == 0);
+ }
+
+ /**
+ * Strips the magic underscore marking single token
+ * modes.
+ * @param string $mode Mode to decode.
+ * @return string Underlying mode name.
+ * @access private
+ */
+ function _decodeSpecial($mode) {
+ return substr($mode, 1);
+ }
+
+ /**
+ * Calls the parser method named after the current
+ * mode. Empty content will be ignored. The lexer
+ * has a parser handler for each mode in the lexer.
+ * @param string $content Text parsed.
+ * @param boolean $is_match Token is recognised rather
+ * than unparsed data.
+ * @access private
+ */
+ function _invokeParser($content, $is_match) {
+ if (($content === '') || ($content === false)) {
+ return true;
+ }
+ $handler = $this->_mode_handlers[$this->_mode->getCurrent()];
+ return $this->_parser->$handler($content, $is_match);
+ }
+
+ /**
+ * Tries to match a chunk of text and if successful
+ * removes the recognised chunk and any leading
+ * unparsed data. Empty strings will not be matched.
+ * @param string $raw The subject to parse. This is the
+ * content that will be eaten.
+ * @return array/boolean Three item list of unparsed
+ * content followed by the
+ * recognised token and finally the
+ * action the parser is to take.
+ * True if no match, false if there
+ * is a parsing error.
+ * @access private
+ */
+ function _reduce($raw) {
+ if ($action = $this->_regexes[$this->_mode->getCurrent()]->match($raw, $match)) {
+ $unparsed_character_count = strpos($raw, $match);
+ $unparsed = substr($raw, 0, $unparsed_character_count);
+ $raw = substr($raw, $unparsed_character_count + strlen($match));
+ return array($raw, $unparsed, $match, $action);
+ }
+ return true;
+ }
+}
+
+/**
+ * Breaks HTML into SAX events.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+class SimpleHtmlLexer extends SimpleLexer {
+
+ /**
+ * Sets up the lexer with case insensitive matching
+ * and adds the HTML handlers.
+ * @param SimpleSaxParser $parser Handling strategy by
+ * reference.
+ * @access public
+ */
+ function SimpleHtmlLexer(&$parser) {
+ $this->SimpleLexer($parser, 'text');
+ $this->mapHandler('text', 'acceptTextToken');
+ $this->_addSkipping();
+ foreach ($this->_getParsedTags() as $tag) {
+ $this->_addTag($tag);
+ }
+ $this->_addInTagTokens();
+ }
+
+ /**
+ * List of parsed tags. Others are ignored.
+ * @return array List of searched for tags.
+ * @access private
+ */
+ function _getParsedTags() {
+ return array('a', 'base', 'title', 'form', 'input', 'button', 'textarea', 'select',
+ 'option', 'frameset', 'frame', 'label');
+ }
+
+ /**
+ * The lexer has to skip certain sections such
+ * as server code, client code and styles.
+ * @access private
+ */
+ function _addSkipping() {
+ $this->mapHandler('css', 'ignore');
+ $this->addEntryPattern('<style', 'text', 'css');
+ $this->addExitPattern('</style>', 'css');
+ $this->mapHandler('js', 'ignore');
+ $this->addEntryPattern('<script', 'text', 'js');
+ $this->addExitPattern('</script>', 'js');
+ $this->mapHandler('comment', 'ignore');
+ $this->addEntryPattern('<!--', 'text', 'comment');
+ $this->addExitPattern('-->', 'comment');
+ }
+
+ /**
+ * Pattern matches to start and end a tag.
+ * @param string $tag Name of tag to scan for.
+ * @access private
+ */
+ function _addTag($tag) {
+ $this->addSpecialPattern("</$tag>", 'text', 'acceptEndToken');
+ $this->addEntryPattern("<$tag", 'text', 'tag');
+ }
+
+ /**
+ * Pattern matches to parse the inside of a tag
+ * including the attributes and their quoting.
+ * @access private
+ */
+ function _addInTagTokens() {
+ $this->mapHandler('tag', 'acceptStartToken');
+ $this->addSpecialPattern('\s+', 'tag', 'ignore');
+ $this->_addAttributeTokens();
+ $this->addExitPattern('/>', 'tag');
+ $this->addExitPattern('>', 'tag');
+ }
+
+ /**
+ * Matches attributes that are either single quoted,
+ * double quoted or unquoted.
+ * @access private
+ */
+ function _addAttributeTokens() {
+ $this->mapHandler('dq_attribute', 'acceptAttributeToken');
+ $this->addEntryPattern('=\s*"', 'tag', 'dq_attribute');
+ $this->addPattern("\\\\\"", 'dq_attribute');
+ $this->addExitPattern('"', 'dq_attribute');
+ $this->mapHandler('sq_attribute', 'acceptAttributeToken');
+ $this->addEntryPattern("=\s*'", 'tag', 'sq_attribute');
+ $this->addPattern("\\\\'", 'sq_attribute');
+ $this->addExitPattern("'", 'sq_attribute');
+ $this->mapHandler('uq_attribute', 'acceptAttributeToken');
+ $this->addSpecialPattern('=\s*[^>\s]*', 'tag', 'uq_attribute');
+ }
+}
+
+/**
+ * Converts HTML tokens into selected SAX events.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+class SimpleHtmlSaxParser {
+ var $_lexer;
+ var $_listener;
+ var $_tag;
+ var $_attributes;
+ var $_current_attribute;
+
+ /**
+ * Sets the listener.
+ * @param SimpleSaxListener $listener SAX event handler.
+ * @access public
+ */
+ function SimpleHtmlSaxParser(&$listener) {
+ $this->_listener = &$listener;
+ $this->_lexer = &$this->createLexer($this);
+ $this->_tag = '';
+ $this->_attributes = array();
+ $this->_current_attribute = '';
+ }
+
+ /**
+ * Runs the content through the lexer which
+ * should call back to the acceptors.
+ * @param string $raw Page text to parse.
+ * @return boolean False if parse error.
+ * @access public
+ */
+ function parse($raw) {
+ return $this->_lexer->parse($raw);
+ }
+
+ /**
+ * Sets up the matching lexer. Starts in 'text' mode.
+ * @param SimpleSaxParser $parser Event generator, usually $self.
+ * @return SimpleLexer Lexer suitable for this parser.
+ * @access public
+ * @static
+ */
+ function &createLexer(&$parser) {
+ $lexer = &new SimpleHtmlLexer($parser);
+ return $lexer;
+ }
+
+ /**
+ * Accepts a token from the tag mode. If the
+ * starting element completes then the element
+ * is dispatched and the current attributes
+ * set back to empty. The element or attribute
+ * name is converted to lower case.
+ * @param string $token Incoming characters.
+ * @param integer $event Lexer event type.
+ * @return boolean False if parse error.
+ * @access public
+ */
+ function acceptStartToken($token, $event) {
+ if ($event == LEXER_ENTER) {
+ $this->_tag = strtolower(substr($token, 1));
+ return true;
+ }
+ if ($event == LEXER_EXIT) {
+ $success = $this->_listener->startElement(
+ $this->_tag,
+ $this->_attributes);
+ $this->_tag = '';
+ $this->_attributes = array();
+ return $success;
+ }
+ if ($token != '=') {
+ $this->_current_attribute = strtolower(SimpleHtmlSaxParser::decodeHtml($token));
+ $this->_attributes[$this->_current_attribute] = '';
+ }
+ return true;
+ }
+
+ /**
+ * Accepts a token from the end tag mode.
+ * The element name is converted to lower case.
+ * @param string $token Incoming characters.
+ * @param integer $event Lexer event type.
+ * @return boolean False if parse error.
+ * @access public
+ */
+ function acceptEndToken($token, $event) {
+ if (! preg_match('/<\/(.*)>/', $token, $matches)) {
+ return false;
+ }
+ return $this->_listener->endElement(strtolower($matches[1]));
+ }
+
+ /**
+ * Part of the tag data.
+ * @param string $token Incoming characters.
+ * @param integer $event Lexer event type.
+ * @return boolean False if parse error.
+ * @access public
+ */
+ function acceptAttributeToken($token, $event) {
+ if ($this->_current_attribute) {
+ if ($event == LEXER_UNMATCHED) {
+ $this->_attributes[$this->_current_attribute] .=
+ SimpleHtmlSaxParser::decodeHtml($token);
+ }
+ if ($event == LEXER_SPECIAL) {
+ $this->_attributes[$this->_current_attribute] .=
+ preg_replace('/^=\s*/' , '', SimpleHtmlSaxParser::decodeHtml($token));
+ }
+ }
+ return true;
+ }
+
+ /**
+ * A character entity.
+ * @param string $token Incoming characters.
+ * @param integer $event Lexer event type.
+ * @return boolean False if parse error.
+ * @access public
+ */
+ function acceptEntityToken($token, $event) {
+ }
+
+ /**
+ * Character data between tags regarded as
+ * important.
+ * @param string $token Incoming characters.
+ * @param integer $event Lexer event type.
+ * @return boolean False if parse error.
+ * @access public
+ */
+ function acceptTextToken($token, $event) {
+ return $this->_listener->addContent($token);
+ }
+
+ /**
+ * Incoming data to be ignored.
+ * @param string $token Incoming characters.
+ * @param integer $event Lexer event type.
+ * @return boolean False if parse error.
+ * @access public
+ */
+ function ignore($token, $event) {
+ return true;
+ }
+
+ /**
+ * Decodes any HTML entities.
+ * @param string $html Incoming HTML.
+ * @return string Outgoing plain text.
+ * @access public
+ * @static
+ */
+ function decodeHtml($html) {
+ static $translations;
+ if (! isset($translations)) {
+ $translations = array_flip(get_html_translation_table(HTML_ENTITIES));
+ }
+ return strtr($html, $translations);
+ }
+
+ /**
+ * Turns HTML into text browser visible text. Images
+ * are converted to their alt text and tags are supressed.
+ * Entities are converted to their visible representation.
+ * @param string $html HTML to convert.
+ * @return string Plain text.
+ * @access public
+ * @static
+ */
+ function normalise($html) {
+ $text = preg_replace('|<!--.*?-->|', '', $html);
+ $text = preg_replace('|<img.*?alt\s*=\s*"(.*?)".*?>|', ' \1 ', $text);
+ $text = preg_replace('|<img.*?alt\s*=\s*\'(.*?)\'.*?>|', ' \1 ', $text);
+ $text = preg_replace('|<img.*?alt\s*=\s*([a-zA-Z_]+).*?>|', ' \1 ', $text);
+ $text = preg_replace('|<.*?>|', '', $text);
+ $text = SimpleHtmlSaxParser::decodeHtml($text);
+ $text = preg_replace('|\s+|', ' ', $text);
+ return trim($text);
+ }
+}
+
+/**
+ * SAX event handler.
+ * @package SimpleTest
+ * @subpackage WebTester
+ * @abstract
+ */
+class SimpleSaxListener {
+
+ /**
+ * Sets the document to write to.
+ * @access public
+ */
+ function SimpleSaxListener() {
+ }
+
+ /**
+ * Start of element event.
+ * @param string $name Element name.
+ * @param hash $attributes Name value pairs.
+ * Attributes without content
+ * are marked as true.
+ * @return boolean False on parse error.
+ * @access public
+ */
+ function startElement($name, $attributes) {
+ }
+
+ /**
+ * End of element event.
+ * @param string $name Element name.
+ * @return boolean False on parse error.
+ * @access public
+ */
+ function endElement($name) {
+ }
+
+ /**
+ * Unparsed, but relevant data.
+ * @param string $text May include unparsed tags.
+ * @return boolean False on parse error.
+ * @access public
+ */
+ function addContent($text) {
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/reflection_php4.php b/tests/simpletest/reflection_php4.php
new file mode 100755
index 0000000000..88fba23ddf
--- /dev/null
+++ b/tests/simpletest/reflection_php4.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: reflection_php4.php,v 1.12 2007/03/07 15:02:20 lastcraft Exp $
+ */
+
+/**
+ * Version specific reflection API.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @ignore duplicate with reflection_php5.php
+ */
+class SimpleReflection {
+ var $_interface;
+
+ /**
+ * Stashes the class/interface.
+ * @param string $interface Class or interface
+ * to inspect.
+ */
+ function SimpleReflection($interface) {
+ $this->_interface = $interface;
+ }
+
+ /**
+ * Checks that a class has been declared.
+ * @return boolean True if defined.
+ * @access public
+ */
+ function classExists() {
+ return class_exists($this->_interface);
+ }
+
+ /**
+ * Needed to kill the autoload feature in PHP5
+ * for classes created dynamically.
+ * @return boolean True if defined.
+ * @access public
+ */
+ function classExistsSansAutoload() {
+ return class_exists($this->_interface);
+ }
+
+ /**
+ * Checks that a class or interface has been
+ * declared.
+ * @return boolean True if defined.
+ * @access public
+ */
+ function classOrInterfaceExists() {
+ return class_exists($this->_interface);
+ }
+
+ /**
+ * Needed to kill the autoload feature in PHP5
+ * for classes created dynamically.
+ * @return boolean True if defined.
+ * @access public
+ */
+ function classOrInterfaceExistsSansAutoload() {
+ return class_exists($this->_interface);
+ }
+
+ /**
+ * Gets the list of methods on a class or
+ * interface.
+ * @returns array List of method names.
+ * @access public
+ */
+ function getMethods() {
+ return get_class_methods($this->_interface);
+ }
+
+ /**
+ * Gets the list of interfaces from a class. If the
+ * class name is actually an interface then just that
+ * interface is returned.
+ * @returns array List of interfaces.
+ * @access public
+ */
+ function getInterfaces() {
+ return array();
+ }
+
+ /**
+ * Finds the parent class name.
+ * @returns string Parent class name.
+ * @access public
+ */
+ function getParent() {
+ return strtolower(get_parent_class($this->_interface));
+ }
+
+ /**
+ * Determines if the class is abstract, which for PHP 4
+ * will never be the case.
+ * @returns boolean True if abstract.
+ * @access public
+ */
+ function isAbstract() {
+ return false;
+ }
+
+ /**
+ * Determines if the the entity is an interface, which for PHP 4
+ * will never be the case.
+ * @returns boolean True if interface.
+ * @access public
+ */
+ function isInterface() {
+ return false;
+ }
+
+ /**
+ * Scans for final methods, but as it's PHP 4 there
+ * aren't any.
+ * @returns boolean True if the class has a final method.
+ * @access public
+ */
+ function hasFinal() {
+ return false;
+ }
+
+ /**
+ * Gets the source code matching the declaration
+ * of a method.
+ * @param string $method Method name.
+ * @access public
+ */
+ function getSignature($method) {
+ return "function &$method()";
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/reflection_php5.php b/tests/simpletest/reflection_php5.php
new file mode 100755
index 0000000000..aa837fbc3e
--- /dev/null
+++ b/tests/simpletest/reflection_php5.php
@@ -0,0 +1,366 @@
+<?php
+/**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: reflection_php5.php,v 1.32 2007/07/07 00:31:03 lastcraft Exp $
+ */
+
+/**
+ * Version specific reflection API.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+class SimpleReflection {
+ var $_interface;
+
+ /**
+ * Stashes the class/interface.
+ * @param string $interface Class or interface
+ * to inspect.
+ */
+ function SimpleReflection($interface) {
+ $this->_interface = $interface;
+ }
+
+ /**
+ * Checks that a class has been declared. Versions
+ * before PHP5.0.2 need a check that it's not really
+ * an interface.
+ * @return boolean True if defined.
+ * @access public
+ */
+ function classExists() {
+ if (! class_exists($this->_interface)) {
+ return false;
+ }
+ $reflection = new ReflectionClass($this->_interface);
+ return ! $reflection->isInterface();
+ }
+
+ /**
+ * Needed to kill the autoload feature in PHP5
+ * for classes created dynamically.
+ * @return boolean True if defined.
+ * @access public
+ */
+ function classExistsSansAutoload() {
+ return class_exists($this->_interface, false);
+ }
+
+ /**
+ * Checks that a class or interface has been
+ * declared.
+ * @return boolean True if defined.
+ * @access public
+ */
+ function classOrInterfaceExists() {
+ return $this->_classOrInterfaceExistsWithAutoload($this->_interface, true);
+ }
+
+ /**
+ * Needed to kill the autoload feature in PHP5
+ * for classes created dynamically.
+ * @return boolean True if defined.
+ * @access public
+ */
+ function classOrInterfaceExistsSansAutoload() {
+ return $this->_classOrInterfaceExistsWithAutoload($this->_interface, false);
+ }
+
+ /**
+ * Needed to select the autoload feature in PHP5
+ * for classes created dynamically.
+ * @param string $interface Class or interface name.
+ * @param boolean $autoload True totriggerautoload.
+ * @return boolean True if interface defined.
+ * @access private
+ */
+ function _classOrInterfaceExistsWithAutoload($interface, $autoload) {
+ if (function_exists('interface_exists')) {
+ if (interface_exists($this->_interface, $autoload)) {
+ return true;
+ }
+ }
+ return class_exists($this->_interface, $autoload);
+ }
+
+ /**
+ * Gets the list of methods on a class or
+ * interface.
+ * @returns array List of method names.
+ * @access public
+ */
+ function getMethods() {
+ return array_unique(get_class_methods($this->_interface));
+ }
+
+ /**
+ * Gets the list of interfaces from a class. If the
+ * class name is actually an interface then just that
+ * interface is returned.
+ * @returns array List of interfaces.
+ * @access public
+ */
+ function getInterfaces() {
+ $reflection = new ReflectionClass($this->_interface);
+ if ($reflection->isInterface()) {
+ return array($this->_interface);
+ }
+ return $this->_onlyParents($reflection->getInterfaces());
+ }
+
+ /**
+ * Gets the list of methods for the implemented
+ * interfaces only.
+ * @returns array List of enforced method signatures.
+ * @access public
+ */
+ function getInterfaceMethods() {
+ $methods = array();
+ foreach ($this->getInterfaces() as $interface) {
+ $methods = array_merge($methods, get_class_methods($interface));
+ }
+ return array_unique($methods);
+ }
+
+ /**
+ * Checks to see if the method signature has to be tightly
+ * specified.
+ * @param string $method Method name.
+ * @returns boolean True if enforced.
+ * @access private
+ */
+ function _isInterfaceMethod($method) {
+ return in_array($method, $this->getInterfaceMethods());
+ }
+
+ /**
+ * Finds the parent class name.
+ * @returns string Parent class name.
+ * @access public
+ */
+ function getParent() {
+ $reflection = new ReflectionClass($this->_interface);
+ $parent = $reflection->getParentClass();
+ if ($parent) {
+ return $parent->getName();
+ }
+ return false;
+ }
+
+ /**
+ * Trivially determines if the class is abstract.
+ * @returns boolean True if abstract.
+ * @access public
+ */
+ function isAbstract() {
+ $reflection = new ReflectionClass($this->_interface);
+ return $reflection->isAbstract();
+ }
+
+ /**
+ * Trivially determines if the class is an interface.
+ * @returns boolean True if interface.
+ * @access public
+ */
+ function isInterface() {
+ $reflection = new ReflectionClass($this->_interface);
+ return $reflection->isInterface();
+ }
+
+ /**
+ * Scans for final methods, as they screw up inherited
+ * mocks by not allowing you to override them.
+ * @returns boolean True if the class has a final method.
+ * @access public
+ */
+ function hasFinal() {
+ $reflection = new ReflectionClass($this->_interface);
+ foreach ($reflection->getMethods() as $method) {
+ if ($method->isFinal()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Whittles a list of interfaces down to only the
+ * necessary top level parents.
+ * @param array $interfaces Reflection API interfaces
+ * to reduce.
+ * @returns array List of parent interface names.
+ * @access private
+ */
+ function _onlyParents($interfaces) {
+ $parents = array();
+ $blacklist = array();
+ foreach ($interfaces as $interface) {
+ foreach($interfaces as $possible_parent) {
+ if ($interface->getName() == $possible_parent->getName()) {
+ continue;
+ }
+ if ($interface->isSubClassOf($possible_parent)) {
+ $blacklist[$possible_parent->getName()] = true;
+ }
+ }
+ if (!isset($blacklist[$interface->getName()])) {
+ $parents[] = $interface->getName();
+ }
+ }
+ return $parents;
+ }
+
+ /**
+ * Checks whether a method is abstract or not.
+ * @param string $name Method name.
+ * @return bool true if method is abstract, else false
+ * @access private
+ */
+ function _isAbstractMethod($name) {
+ $interface = new ReflectionClass($this->_interface);
+ if (! $interface->hasMethod($name)) {
+ return false;
+ }
+ return $interface->getMethod($name)->isAbstract();
+ }
+
+ /**
+ * Checks whether a method is abstract in parent or not.
+ * @param string $name Method name.
+ * @return bool true if method is abstract in parent, else false
+ * @access private
+ */
+ function _isAbstractMethodInParent($name) {
+ $interface = new ReflectionClass($this->_interface);
+ if (! $parent = $interface->getParentClass()) {
+ return false;
+ }
+ if (! $parent->hasMethod($name)) {
+ return false;
+ }
+ return $parent->getMethod($name)->isAbstract();
+ }
+
+ /**
+ * Checks whether a method is static or not.
+ * @param string $name Method name
+ * @return bool true if method is static, else false
+ * @access private
+ */
+ function _isStaticMethod($name) {
+ $interface = new ReflectionClass($this->_interface);
+ if (! $interface->hasMethod($name)) {
+ return false;
+ }
+ return $interface->getMethod($name)->isStatic();
+ }
+
+ /**
+ * Gets the source code matching the declaration
+ * of a method.
+ * @param string $name Method name.
+ * @return string Method signature up to last
+ * bracket.
+ * @access public
+ */
+ function getSignature($name) {
+ if ($name == '__set') {
+ return 'function __set($key, $value)';
+ }
+ if ($name == '__call') {
+ return 'function __call($method, $arguments)';
+ }
+ if (version_compare(phpversion(), '5.1.0', '>=')) {
+ if (in_array($name, array('__get', '__isset', $name == '__unset'))) {
+ return "function {$name}(\$key)";
+ }
+ }
+ if (! is_callable(array($this->_interface, $name)) && ! $this->_isAbstractMethod($name)) {
+ return "function $name()";
+ }
+ if ($this->_isInterfaceMethod($name) ||
+ $this->_isAbstractMethod($name) ||
+ $this->_isAbstractMethodInParent($name) ||
+ $this->_isStaticMethod($name)) {
+ return $this->_getFullSignature($name);
+ }
+ return "function $name()";
+ }
+
+ /**
+ * For a signature specified in an interface, full
+ * details must be replicated to be a valid implementation.
+ * @param string $name Method name.
+ * @return string Method signature up to last
+ * bracket.
+ * @access private
+ */
+ function _getFullSignature($name) {
+ $interface = new ReflectionClass($this->_interface);
+ $method = $interface->getMethod($name);
+ $reference = $method->returnsReference() ? '&' : '';
+ $static = $method->isStatic() ? 'static ' : '';
+ return "{$static}function $reference$name(" .
+ implode(', ', $this->_getParameterSignatures($method)) .
+ ")";
+ }
+
+ /**
+ * Gets the source code for each parameter.
+ * @param ReflectionMethod $method Method object from
+ * reflection API
+ * @return array List of strings, each
+ * a snippet of code.
+ * @access private
+ */
+ function _getParameterSignatures($method) {
+ $signatures = array();
+ foreach ($method->getParameters() as $parameter) {
+ $signature = '';
+ $type = $parameter->getClass();
+ if (is_null($type) && version_compare(phpversion(), '5.1.0', '>=') && $parameter->isArray()) {
+ $signature .= 'array ';
+ } elseif (!is_null($type)) {
+ $signature .= $type->getName() . ' ';
+ }
+ if ($parameter->isPassedByReference()) {
+ $signature .= '&';
+ }
+ $signature .= '$' . $this->_suppressSpurious($parameter->getName());
+ if ($this->_isOptional($parameter)) {
+ $signature .= ' = null';
+ }
+ $signatures[] = $signature;
+ }
+ return $signatures;
+ }
+
+ /**
+ * The SPL library has problems with the
+ * Reflection library. In particular, you can
+ * get extra characters in parameter names :(.
+ * @param string $name Parameter name.
+ * @return string Cleaner name.
+ * @access private
+ */
+ function _suppressSpurious($name) {
+ return str_replace(array('[', ']', ' '), '', $name);
+ }
+
+ /**
+ * Test of a reflection parameter being optional
+ * that works with early versions of PHP5.
+ * @param reflectionParameter $parameter Is this optional.
+ * @return boolean True if optional.
+ * @access private
+ */
+ function _isOptional($parameter) {
+ if (method_exists($parameter, 'isOptional')) {
+ return $parameter->isOptional();
+ }
+ return false;
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/remote.php b/tests/simpletest/remote.php
new file mode 100755
index 0000000000..45da7987c8
--- /dev/null
+++ b/tests/simpletest/remote.php
@@ -0,0 +1,117 @@
+<?php
+ /**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: remote.php,v 1.13 2006/11/20 23:57:16 lastcraft Exp $
+ */
+
+ /**#@+
+ * include other SimpleTest class files
+ */
+ require_once(dirname(__FILE__) . '/browser.php');
+ require_once(dirname(__FILE__) . '/xml.php');
+ require_once(dirname(__FILE__) . '/test_case.php');
+ /**#@-*/
+
+ /**
+ * Runs an XML formated test on a remote server.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class RemoteTestCase {
+ var $_url;
+ var $_dry_url;
+ var $_size;
+
+ /**
+ * Sets the location of the remote test.
+ * @param string $url Test location.
+ * @param string $dry_url Location for dry run.
+ * @access public
+ */
+ function RemoteTestCase($url, $dry_url = false) {
+ $this->_url = $url;
+ $this->_dry_url = $dry_url ? $dry_url : $url;
+ $this->_size = false;
+ }
+
+ /**
+ * Accessor for the test name for subclasses.
+ * @return string Name of the test.
+ * @access public
+ */
+ function getLabel() {
+ return $this->_url;
+ }
+
+ /**
+ * Runs the top level test for this class. Currently
+ * reads the data as a single chunk. I'll fix this
+ * once I have added iteration to the browser.
+ * @param SimpleReporter $reporter Target of test results.
+ * @returns boolean True if no failures.
+ * @access public
+ */
+ function run(&$reporter) {
+ $browser = &$this->_createBrowser();
+ $xml = $browser->get($this->_url);
+ if (! $xml) {
+ trigger_error('Cannot read remote test URL [' . $this->_url . ']');
+ return false;
+ }
+ $parser = &$this->_createParser($reporter);
+ if (! $parser->parse($xml)) {
+ trigger_error('Cannot parse incoming XML from [' . $this->_url . ']');
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Creates a new web browser object for fetching
+ * the XML report.
+ * @return SimpleBrowser New browser.
+ * @access protected
+ */
+ function &_createBrowser() {
+ $browser = &new SimpleBrowser();
+ return $browser;
+ }
+
+ /**
+ * Creates the XML parser.
+ * @param SimpleReporter $reporter Target of test results.
+ * @return SimpleTestXmlListener XML reader.
+ * @access protected
+ */
+ function &_createParser(&$reporter) {
+ $parser = &new SimpleTestXmlParser($reporter);
+ return $parser;
+ }
+
+ /**
+ * Accessor for the number of subtests.
+ * @return integer Number of test cases.
+ * @access public
+ */
+ function getSize() {
+ if ($this->_size === false) {
+ $browser = &$this->_createBrowser();
+ $xml = $browser->get($this->_dry_url);
+ if (! $xml) {
+ trigger_error('Cannot read remote test URL [' . $this->_dry_url . ']');
+ return false;
+ }
+ $reporter = &new SimpleReporter();
+ $parser = &$this->_createParser($reporter);
+ if (! $parser->parse($xml)) {
+ trigger_error('Cannot parse incoming XML from [' . $this->_dry_url . ']');
+ return false;
+ }
+ $this->_size = $reporter->getTestCaseCount();
+ }
+ return $this->_size;
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/reporter.php b/tests/simpletest/reporter.php
new file mode 100755
index 0000000000..dbd6ea2542
--- /dev/null
+++ b/tests/simpletest/reporter.php
@@ -0,0 +1,432 @@
+<?php
+ /**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: reporter.php,v 1.44 2007/05/28 18:34:58 lastcraft Exp $
+ */
+
+ /**#@+
+ * include other SimpleTest class files
+ */
+ require_once(dirname(__FILE__) . '/scorer.php');
+ /**#@-*/
+
+ /**
+ * Sample minimal test displayer. Generates only
+ * failure messages and a pass count.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class HtmlReporter extends SimpleReporter {
+ var $_character_set;
+
+ /**
+ * Does nothing yet. The first output will
+ * be sent on the first test start. For use
+ * by a web browser.
+ * @access public
+ */
+ function HtmlReporter($character_set = 'ISO-8859-1') {
+ $this->SimpleReporter();
+ $this->_character_set = $character_set;
+ }
+
+ /**
+ * Paints the top of the web page setting the
+ * title to the name of the starting test.
+ * @param string $test_name Name class of test.
+ * @access public
+ */
+ function paintHeader($test_name) {
+ $this->sendNoCacheHeaders();
+ print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">";
+ print "<html>\n<head>\n<title>$test_name</title>\n";
+ print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=" .
+ $this->_character_set . "\">\n";
+ print "<style type=\"text/css\">\n";
+ print $this->_getCss() . "\n";
+ print "</style>\n";
+ print "</head>\n<body>\n";
+ print "<h1>$test_name</h1>\n";
+ flush();
+ }
+
+ /**
+ * Send the headers necessary to ensure the page is
+ * reloaded on every request. Otherwise you could be
+ * scratching your head over out of date test data.
+ * @access public
+ * @static
+ */
+ function sendNoCacheHeaders() {
+ if (! headers_sent()) {
+ header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
+ header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
+ header("Cache-Control: no-store, no-cache, must-revalidate");
+ header("Cache-Control: post-check=0, pre-check=0", false);
+ header("Pragma: no-cache");
+ }
+ }
+
+ /**
+ * Paints the CSS. Add additional styles here.
+ * @return string CSS code as text.
+ * @access protected
+ */
+ function _getCss() {
+ return ".fail { background-color: inherit; color: red; }" .
+ ".pass { background-color: inherit; color: green; }" .
+ " pre { background-color: lightgray; color: inherit; }";
+ }
+
+ /**
+ * Paints the end of the test with a summary of
+ * the passes and failures.
+ * @param string $test_name Name class of test.
+ * @access public
+ */
+ function paintFooter($test_name) {
+ $colour = ($this->getFailCount() + $this->getExceptionCount() > 0 ? "red" : "green");
+ print "<div style=\"";
+ print "padding: 8px; margin-top: 1em; background-color: $colour; color: white;";
+ print "\">";
+ print $this->getTestCaseProgress() . "/" . $this->getTestCaseCount();
+ print " test cases complete:\n";
+ print "<strong>" . $this->getPassCount() . "</strong> passes, ";
+ print "<strong>" . $this->getFailCount() . "</strong> fails and ";
+ print "<strong>" . $this->getExceptionCount() . "</strong> exceptions.";
+ print "</div>\n";
+ print "</body>\n</html>\n";
+ }
+
+ /**
+ * Paints the test failure with a breadcrumbs
+ * trail of the nesting test suites below the
+ * top level test.
+ * @param string $message Failure message displayed in
+ * the context of the other tests.
+ * @access public
+ */
+ function paintFail($message) {
+ parent::paintFail($message);
+ print "<span class=\"fail\">Fail</span>: ";
+ $breadcrumb = $this->getTestList();
+ array_shift($breadcrumb);
+ print implode(" -&gt; ", $breadcrumb);
+ print " -&gt; " . $this->_htmlEntities($message) . "<br />\n";
+ }
+
+ /**
+ * Paints a PHP error.
+ * @param string $message Message is ignored.
+ * @access public
+ */
+ function paintError($message) {
+ parent::paintError($message);
+ print "<span class=\"fail\">Exception</span>: ";
+ $breadcrumb = $this->getTestList();
+ array_shift($breadcrumb);
+ print implode(" -&gt; ", $breadcrumb);
+ print " -&gt; <strong>" . $this->_htmlEntities($message) . "</strong><br />\n";
+ }
+
+ /**
+ * Paints a PHP exception.
+ * @param Exception $exception Exception to display.
+ * @access public
+ */
+ function paintException($exception) {
+ parent::paintException($exception);
+ print "<span class=\"fail\">Exception</span>: ";
+ $breadcrumb = $this->getTestList();
+ array_shift($breadcrumb);
+ print implode(" -&gt; ", $breadcrumb);
+ $message = 'Unexpected exception of type [' . get_class($exception) .
+ '] with message ['. $exception->getMessage() .
+ '] in ['. $exception->getFile() .
+ ' line ' . $exception->getLine() . ']';
+ print " -&gt; <strong>" . $this->_htmlEntities($message) . "</strong><br />\n";
+ }
+
+ /**
+ * Prints the message for skipping tests.
+ * @param string $message Text of skip condition.
+ * @access public
+ */
+ function paintSkip($message) {
+ parent::paintSkip($message);
+ print "<span class=\"pass\">Skipped</span>: ";
+ $breadcrumb = $this->getTestList();
+ array_shift($breadcrumb);
+ print implode(" -&gt; ", $breadcrumb);
+ print " -&gt; " . $this->_htmlEntities($message) . "<br />\n";
+ }
+
+ /**
+ * Paints formatted text such as dumped variables.
+ * @param string $message Text to show.
+ * @access public
+ */
+ function paintFormattedMessage($message) {
+ print '<pre>' . $this->_htmlEntities($message) . '</pre>';
+ }
+
+ /**
+ * Character set adjusted entity conversion.
+ * @param string $message Plain text or Unicode message.
+ * @return string Browser readable message.
+ * @access protected
+ */
+ function _htmlEntities($message) {
+ return htmlentities($message, ENT_COMPAT, $this->_character_set);
+ }
+ }
+
+ /**
+ * Sample minimal test displayer. Generates only
+ * failure messages and a pass count. For command
+ * line use. I've tried to make it look like JUnit,
+ * but I wanted to output the errors as they arrived
+ * which meant dropping the dots.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class TextReporter extends SimpleReporter {
+
+ /**
+ * Does nothing yet. The first output will
+ * be sent on the first test start.
+ * @access public
+ */
+ function TextReporter() {
+ $this->SimpleReporter();
+ }
+
+ /**
+ * Paints the title only.
+ * @param string $test_name Name class of test.
+ * @access public
+ */
+ function paintHeader($test_name) {
+ if (! SimpleReporter::inCli()) {
+ header('Content-type: text/plain');
+ }
+ print "$test_name\n";
+ flush();
+ }
+
+ /**
+ * Paints the end of the test with a summary of
+ * the passes and failures.
+ * @param string $test_name Name class of test.
+ * @access public
+ */
+ function paintFooter($test_name) {
+ if ($this->getFailCount() + $this->getExceptionCount() == 0) {
+ print "OK\n";
+ } else {
+ print "FAILURES!!!\n";
+ }
+ print "Test cases run: " . $this->getTestCaseProgress() .
+ "/" . $this->getTestCaseCount() .
+ ", Passes: " . $this->getPassCount() .
+ ", Failures: " . $this->getFailCount() .
+ ", Exceptions: " . $this->getExceptionCount() . "\n";
+ }
+
+ /**
+ * Paints the test failure as a stack trace.
+ * @param string $message Failure message displayed in
+ * the context of the other tests.
+ * @access public
+ */
+ function paintFail($message) {
+ parent::paintFail($message);
+ print $this->getFailCount() . ") $message\n";
+ $breadcrumb = $this->getTestList();
+ array_shift($breadcrumb);
+ print "\tin " . implode("\n\tin ", array_reverse($breadcrumb));
+ print "\n";
+ }
+
+ /**
+ * Paints a PHP error or exception.
+ * @param string $message Message to be shown.
+ * @access public
+ * @abstract
+ */
+ function paintError($message) {
+ parent::paintError($message);
+ print "Exception " . $this->getExceptionCount() . "!\n$message\n";
+ $breadcrumb = $this->getTestList();
+ array_shift($breadcrumb);
+ print "\tin " . implode("\n\tin ", array_reverse($breadcrumb));
+ print "\n";
+ }
+
+ /**
+ * Paints a PHP error or exception.
+ * @param Exception $exception Exception to describe.
+ * @access public
+ * @abstract
+ */
+ function paintException($exception) {
+ parent::paintException($exception);
+ $message = 'Unexpected exception of type [' . get_class($exception) .
+ '] with message ['. $exception->getMessage() .
+ '] in ['. $exception->getFile() .
+ ' line ' . $exception->getLine() . ']';
+ print "Exception " . $this->getExceptionCount() . "!\n$message\n";
+ $breadcrumb = $this->getTestList();
+ array_shift($breadcrumb);
+ print "\tin " . implode("\n\tin ", array_reverse($breadcrumb));
+ print "\n";
+ }
+
+ /**
+ * Prints the message for skipping tests.
+ * @param string $message Text of skip condition.
+ * @access public
+ */
+ function paintSkip($message) {
+ parent::paintSkip($message);
+ print "Skip: $message\n";
+ }
+
+ /**
+ * Paints formatted text such as dumped variables.
+ * @param string $message Text to show.
+ * @access public
+ */
+ function paintFormattedMessage($message) {
+ print "$message\n";
+ flush();
+ }
+ }
+
+ /**
+ * Runs just a single test group, a single case or
+ * even a single test within that case.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class SelectiveReporter extends SimpleReporterDecorator {
+ var $_just_this_case = false;
+ var $_just_this_test = false;
+ var $_on;
+
+ /**
+ * Selects the test case or group to be run,
+ * and optionally a specific test.
+ * @param SimpleScorer $reporter Reporter to receive events.
+ * @param string $just_this_case Only this case or group will run.
+ * @param string $just_this_test Only this test method will run.
+ */
+ function SelectiveReporter(&$reporter, $just_this_case = false, $just_this_test = false) {
+ if (isset($just_this_case) && $just_this_case) {
+ $this->_just_this_case = strtolower($just_this_case);
+ $this->_off();
+ } else {
+ $this->_on();
+ }
+ if (isset($just_this_test) && $just_this_test) {
+ $this->_just_this_test = strtolower($just_this_test);
+ }
+ $this->SimpleReporterDecorator($reporter);
+ }
+
+ /**
+ * Compares criteria to actual the case/group name.
+ * @param string $test_case The incoming test.
+ * @return boolean True if matched.
+ * @access protected
+ */
+ function _matchesTestCase($test_case) {
+ return $this->_just_this_case == strtolower($test_case);
+ }
+
+ /**
+ * Compares criteria to actual the test name. If no
+ * name was specified at the beginning, then all tests
+ * can run.
+ * @param string $method The incoming test method.
+ * @return boolean True if matched.
+ * @access protected
+ */
+ function _shouldRunTest($test_case, $method) {
+ if ($this->_isOn() || $this->_matchesTestCase($test_case)) {
+ if ($this->_just_this_test) {
+ return $this->_just_this_test == strtolower($method);
+ } else {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Switch on testing for the group or subgroup.
+ * @access private
+ */
+ function _on() {
+ $this->_on = true;
+ }
+
+ /**
+ * Switch off testing for the group or subgroup.
+ * @access private
+ */
+ function _off() {
+ $this->_on = false;
+ }
+
+ /**
+ * Is this group actually being tested?
+ * @return boolean True if the current test group is active.
+ * @access private
+ */
+ function _isOn() {
+ return $this->_on;
+ }
+
+ /**
+ * Veto everything that doesn't match the method wanted.
+ * @param string $test_case Name of test case.
+ * @param string $method Name of test method.
+ * @return boolean True if test should be run.
+ * @access public
+ */
+ function shouldInvoke($test_case, $method) {
+ if ($this->_shouldRunTest($test_case, $method)) {
+ return $this->_reporter->shouldInvoke($test_case, $method);
+ }
+ return false;
+ }
+
+ /**
+ * Paints the start of a group test.
+ * @param string $test_case Name of test or other label.
+ * @param integer $size Number of test cases starting.
+ * @access public
+ */
+ function paintGroupStart($test_case, $size) {
+ if ($this->_just_this_case && $this->_matchesTestCase($test_case)) {
+ $this->_on();
+ }
+ $this->_reporter->paintGroupStart($test_case, $size);
+ }
+
+ /**
+ * Paints the end of a group test.
+ * @param string $test_case Name of test or other label.
+ * @access public
+ */
+ function paintGroupEnd($test_case) {
+ $this->_reporter->paintGroupEnd($test_case);
+ if ($this->_just_this_case && $this->_matchesTestCase($test_case)) {
+ $this->_off();
+ }
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/scorer.php b/tests/simpletest/scorer.php
new file mode 100755
index 0000000000..de6e48999f
--- /dev/null
+++ b/tests/simpletest/scorer.php
@@ -0,0 +1,863 @@
+<?php
+ /**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: scorer.php,v 1.16 2006/11/21 01:20:18 lastcraft Exp $
+ */
+
+ /**#@+*/
+ require_once(dirname(__FILE__) . '/invoker.php');
+ /**#@-*/
+
+ /**
+ * Can recieve test events and display them. Display
+ * is achieved by making display methods available
+ * and visiting the incoming event.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @abstract
+ */
+ class SimpleScorer {
+ var $_passes;
+ var $_fails;
+ var $_exceptions;
+ var $_is_dry_run;
+
+ /**
+ * Starts the test run with no results.
+ * @access public
+ */
+ function SimpleScorer() {
+ $this->_passes = 0;
+ $this->_fails = 0;
+ $this->_exceptions = 0;
+ $this->_is_dry_run = false;
+ }
+
+ /**
+ * Signals that the next evaluation will be a dry
+ * run. That is, the structure events will be
+ * recorded, but no tests will be run.
+ * @param boolean $is_dry Dry run if true.
+ * @access public
+ */
+ function makeDry($is_dry = true) {
+ $this->_is_dry_run = $is_dry;
+ }
+
+ /**
+ * The reporter has a veto on what should be run.
+ * @param string $test_case_name name of test case.
+ * @param string $method Name of test method.
+ * @access public
+ */
+ function shouldInvoke($test_case_name, $method) {
+ return ! $this->_is_dry_run;
+ }
+
+ /**
+ * Can wrap the invoker in preperation for running
+ * a test.
+ * @param SimpleInvoker $invoker Individual test runner.
+ * @return SimpleInvoker Wrapped test runner.
+ * @access public
+ */
+ function &createInvoker(&$invoker) {
+ return $invoker;
+ }
+
+ /**
+ * Accessor for current status. Will be false
+ * if there have been any failures or exceptions.
+ * Used for command line tools.
+ * @return boolean True if no failures.
+ * @access public
+ */
+ function getStatus() {
+ if ($this->_exceptions + $this->_fails > 0) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Paints the start of a group test.
+ * @param string $test_name Name of test or other label.
+ * @param integer $size Number of test cases starting.
+ * @access public
+ */
+ function paintGroupStart($test_name, $size) {
+ }
+
+ /**
+ * Paints the end of a group test.
+ * @param string $test_name Name of test or other label.
+ * @access public
+ */
+ function paintGroupEnd($test_name) {
+ }
+
+ /**
+ * Paints the start of a test case.
+ * @param string $test_name Name of test or other label.
+ * @access public
+ */
+ function paintCaseStart($test_name) {
+ }
+
+ /**
+ * Paints the end of a test case.
+ * @param string $test_name Name of test or other label.
+ * @access public
+ */
+ function paintCaseEnd($test_name) {
+ }
+
+ /**
+ * Paints the start of a test method.
+ * @param string $test_name Name of test or other label.
+ * @access public
+ */
+ function paintMethodStart($test_name) {
+ }
+
+ /**
+ * Paints the end of a test method.
+ * @param string $test_name Name of test or other label.
+ * @access public
+ */
+ function paintMethodEnd($test_name) {
+ }
+
+ /**
+ * Increments the pass count.
+ * @param string $message Message is ignored.
+ * @access public
+ */
+ function paintPass($message) {
+ $this->_passes++;
+ }
+
+ /**
+ * Increments the fail count.
+ * @param string $message Message is ignored.
+ * @access public
+ */
+ function paintFail($message) {
+ $this->_fails++;
+ }
+
+ /**
+ * Deals with PHP 4 throwing an error.
+ * @param string $message Text of error formatted by
+ * the test case.
+ * @access public
+ */
+ function paintError($message) {
+ $this->_exceptions++;
+ }
+
+ /**
+ * Deals with PHP 5 throwing an exception.
+ * @param Exception $exception The actual exception thrown.
+ * @access public
+ */
+ function paintException($exception) {
+ $this->_exceptions++;
+ }
+
+ /**
+ * Prints the message for skipping tests.
+ * @param string $message Text of skip condition.
+ * @access public
+ */
+ function paintSkip($message) {
+ }
+
+ /**
+ * Accessor for the number of passes so far.
+ * @return integer Number of passes.
+ * @access public
+ */
+ function getPassCount() {
+ return $this->_passes;
+ }
+
+ /**
+ * Accessor for the number of fails so far.
+ * @return integer Number of fails.
+ * @access public
+ */
+ function getFailCount() {
+ return $this->_fails;
+ }
+
+ /**
+ * Accessor for the number of untrapped errors
+ * so far.
+ * @return integer Number of exceptions.
+ * @access public
+ */
+ function getExceptionCount() {
+ return $this->_exceptions;
+ }
+
+ /**
+ * Paints a simple supplementary message.
+ * @param string $message Text to display.
+ * @access public
+ */
+ function paintMessage($message) {
+ }
+
+ /**
+ * Paints a formatted ASCII message such as a
+ * variable dump.
+ * @param string $message Text to display.
+ * @access public
+ */
+ function paintFormattedMessage($message) {
+ }
+
+ /**
+ * By default just ignores user generated events.
+ * @param string $type Event type as text.
+ * @param mixed $payload Message or object.
+ * @access public
+ */
+ function paintSignal($type, $payload) {
+ }
+ }
+
+ /**
+ * Recipient of generated test messages that can display
+ * page footers and headers. Also keeps track of the
+ * test nesting. This is the main base class on which
+ * to build the finished test (page based) displays.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class SimpleReporter extends SimpleScorer {
+ var $_test_stack;
+ var $_size;
+ var $_progress;
+
+ /**
+ * Starts the display with no results in.
+ * @access public
+ */
+ function SimpleReporter() {
+ $this->SimpleScorer();
+ $this->_test_stack = array();
+ $this->_size = null;
+ $this->_progress = 0;
+ }
+
+ /**
+ * Gets the formatter for variables and other small
+ * generic data items.
+ * @return SimpleDumper Formatter.
+ * @access public
+ */
+ function getDumper() {
+ return new SimpleDumper();
+ }
+
+ /**
+ * Paints the start of a group test. Will also paint
+ * the page header and footer if this is the
+ * first test. Will stash the size if the first
+ * start.
+ * @param string $test_name Name of test that is starting.
+ * @param integer $size Number of test cases starting.
+ * @access public
+ */
+ function paintGroupStart($test_name, $size) {
+ if (! isset($this->_size)) {
+ $this->_size = $size;
+ }
+ if (count($this->_test_stack) == 0) {
+ $this->paintHeader($test_name);
+ }
+ $this->_test_stack[] = $test_name;
+ }
+
+ /**
+ * Paints the end of a group test. Will paint the page
+ * footer if the stack of tests has unwound.
+ * @param string $test_name Name of test that is ending.
+ * @param integer $progress Number of test cases ending.
+ * @access public
+ */
+ function paintGroupEnd($test_name) {
+ array_pop($this->_test_stack);
+ if (count($this->_test_stack) == 0) {
+ $this->paintFooter($test_name);
+ }
+ }
+
+ /**
+ * Paints the start of a test case. Will also paint
+ * the page header and footer if this is the
+ * first test. Will stash the size if the first
+ * start.
+ * @param string $test_name Name of test that is starting.
+ * @access public
+ */
+ function paintCaseStart($test_name) {
+ if (! isset($this->_size)) {
+ $this->_size = 1;
+ }
+ if (count($this->_test_stack) == 0) {
+ $this->paintHeader($test_name);
+ }
+ $this->_test_stack[] = $test_name;
+ }
+
+ /**
+ * Paints the end of a test case. Will paint the page
+ * footer if the stack of tests has unwound.
+ * @param string $test_name Name of test that is ending.
+ * @access public
+ */
+ function paintCaseEnd($test_name) {
+ $this->_progress++;
+ array_pop($this->_test_stack);
+ if (count($this->_test_stack) == 0) {
+ $this->paintFooter($test_name);
+ }
+ }
+
+ /**
+ * Paints the start of a test method.
+ * @param string $test_name Name of test that is starting.
+ * @access public
+ */
+ function paintMethodStart($test_name) {
+ $this->_test_stack[] = $test_name;
+ }
+
+ /**
+ * Paints the end of a test method. Will paint the page
+ * footer if the stack of tests has unwound.
+ * @param string $test_name Name of test that is ending.
+ * @access public
+ */
+ function paintMethodEnd($test_name) {
+ array_pop($this->_test_stack);
+ }
+
+ /**
+ * Paints the test document header.
+ * @param string $test_name First test top level
+ * to start.
+ * @access public
+ * @abstract
+ */
+ function paintHeader($test_name) {
+ }
+
+ /**
+ * Paints the test document footer.
+ * @param string $test_name The top level test.
+ * @access public
+ * @abstract
+ */
+ function paintFooter($test_name) {
+ }
+
+ /**
+ * Accessor for internal test stack. For
+ * subclasses that need to see the whole test
+ * history for display purposes.
+ * @return array List of methods in nesting order.
+ * @access public
+ */
+ function getTestList() {
+ return $this->_test_stack;
+ }
+
+ /**
+ * Accessor for total test size in number
+ * of test cases. Null until the first
+ * test is started.
+ * @return integer Total number of cases at start.
+ * @access public
+ */
+ function getTestCaseCount() {
+ return $this->_size;
+ }
+
+ /**
+ * Accessor for the number of test cases
+ * completed so far.
+ * @return integer Number of ended cases.
+ * @access public
+ */
+ function getTestCaseProgress() {
+ return $this->_progress;
+ }
+
+ /**
+ * Static check for running in the comand line.
+ * @return boolean True if CLI.
+ * @access public
+ * @static
+ */
+ function inCli() {
+ return php_sapi_name() == 'cli';
+ }
+ }
+
+ /**
+ * For modifying the behaviour of the visual reporters.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class SimpleReporterDecorator {
+ var $_reporter;
+
+ /**
+ * Mediates between the reporter and the test case.
+ * @param SimpleScorer $reporter Reporter to receive events.
+ */
+ function SimpleReporterDecorator(&$reporter) {
+ $this->_reporter = &$reporter;
+ }
+
+ /**
+ * Signals that the next evaluation will be a dry
+ * run. That is, the structure events will be
+ * recorded, but no tests will be run.
+ * @param boolean $is_dry Dry run if true.
+ * @access public
+ */
+ function makeDry($is_dry = true) {
+ $this->_reporter->makeDry($is_dry);
+ }
+
+ /**
+ * Accessor for current status. Will be false
+ * if there have been any failures or exceptions.
+ * Used for command line tools.
+ * @return boolean True if no failures.
+ * @access public
+ */
+ function getStatus() {
+ return $this->_reporter->getStatus();
+ }
+
+ /**
+ * The reporter has a veto on what should be run.
+ * @param string $test_case_name name of test case.
+ * @param string $method Name of test method.
+ * @return boolean True if test should be run.
+ * @access public
+ */
+ function shouldInvoke($test_case_name, $method) {
+ return $this->_reporter->shouldInvoke($test_case_name, $method);
+ }
+
+ /**
+ * Can wrap the invoker in preperation for running
+ * a test.
+ * @param SimpleInvoker $invoker Individual test runner.
+ * @return SimpleInvoker Wrapped test runner.
+ * @access public
+ */
+ function &createInvoker(&$invoker) {
+ return $this->_reporter->createInvoker($invoker);
+ }
+
+ /**
+ * Gets the formatter for variables and other small
+ * generic data items.
+ * @return SimpleDumper Formatter.
+ * @access public
+ */
+ function getDumper() {
+ return $this->_reporter->getDumper();
+ }
+
+ /**
+ * Paints the start of a group test.
+ * @param string $test_name Name of test or other label.
+ * @param integer $size Number of test cases starting.
+ * @access public
+ */
+ function paintGroupStart($test_name, $size) {
+ $this->_reporter->paintGroupStart($test_name, $size);
+ }
+
+ /**
+ * Paints the end of a group test.
+ * @param string $test_name Name of test or other label.
+ * @access public
+ */
+ function paintGroupEnd($test_name) {
+ $this->_reporter->paintGroupEnd($test_name);
+ }
+
+ /**
+ * Paints the start of a test case.
+ * @param string $test_name Name of test or other label.
+ * @access public
+ */
+ function paintCaseStart($test_name) {
+ $this->_reporter->paintCaseStart($test_name);
+ }
+
+ /**
+ * Paints the end of a test case.
+ * @param string $test_name Name of test or other label.
+ * @access public
+ */
+ function paintCaseEnd($test_name) {
+ $this->_reporter->paintCaseEnd($test_name);
+ }
+
+ /**
+ * Paints the start of a test method.
+ * @param string $test_name Name of test or other label.
+ * @access public
+ */
+ function paintMethodStart($test_name) {
+ $this->_reporter->paintMethodStart($test_name);
+ }
+
+ /**
+ * Paints the end of a test method.
+ * @param string $test_name Name of test or other label.
+ * @access public
+ */
+ function paintMethodEnd($test_name) {
+ $this->_reporter->paintMethodEnd($test_name);
+ }
+
+ /**
+ * Chains to the wrapped reporter.
+ * @param string $message Message is ignored.
+ * @access public
+ */
+ function paintPass($message) {
+ $this->_reporter->paintPass($message);
+ }
+
+ /**
+ * Chains to the wrapped reporter.
+ * @param string $message Message is ignored.
+ * @access public
+ */
+ function paintFail($message) {
+ $this->_reporter->paintFail($message);
+ }
+
+ /**
+ * Chains to the wrapped reporter.
+ * @param string $message Text of error formatted by
+ * the test case.
+ * @access public
+ */
+ function paintError($message) {
+ $this->_reporter->paintError($message);
+ }
+
+ /**
+ * Chains to the wrapped reporter.
+ * @param Exception $exception Exception to show.
+ * @access public
+ */
+ function paintException($exception) {
+ $this->_reporter->paintException($exception);
+ }
+
+ /**
+ * Prints the message for skipping tests.
+ * @param string $message Text of skip condition.
+ * @access public
+ */
+ function paintSkip($message) {
+ $this->_reporter->paintSkip($message);
+ }
+
+ /**
+ * Chains to the wrapped reporter.
+ * @param string $message Text to display.
+ * @access public
+ */
+ function paintMessage($message) {
+ $this->_reporter->paintMessage($message);
+ }
+
+ /**
+ * Chains to the wrapped reporter.
+ * @param string $message Text to display.
+ * @access public
+ */
+ function paintFormattedMessage($message) {
+ $this->_reporter->paintFormattedMessage($message);
+ }
+
+ /**
+ * Chains to the wrapped reporter.
+ * @param string $type Event type as text.
+ * @param mixed $payload Message or object.
+ * @return boolean Should return false if this
+ * type of signal should fail the
+ * test suite.
+ * @access public
+ */
+ function paintSignal($type, &$payload) {
+ $this->_reporter->paintSignal($type, $payload);
+ }
+ }
+
+ /**
+ * For sending messages to multiple reporters at
+ * the same time.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class MultipleReporter {
+ var $_reporters = array();
+
+ /**
+ * Adds a reporter to the subscriber list.
+ * @param SimpleScorer $reporter Reporter to receive events.
+ * @access public
+ */
+ function attachReporter(&$reporter) {
+ $this->_reporters[] = &$reporter;
+ }
+
+ /**
+ * Signals that the next evaluation will be a dry
+ * run. That is, the structure events will be
+ * recorded, but no tests will be run.
+ * @param boolean $is_dry Dry run if true.
+ * @access public
+ */
+ function makeDry($is_dry = true) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $this->_reporters[$i]->makeDry($is_dry);
+ }
+ }
+
+ /**
+ * Accessor for current status. Will be false
+ * if there have been any failures or exceptions.
+ * If any reporter reports a failure, the whole
+ * suite fails.
+ * @return boolean True if no failures.
+ * @access public
+ */
+ function getStatus() {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ if (! $this->_reporters[$i]->getStatus()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * The reporter has a veto on what should be run.
+ * It requires all reporters to want to run the method.
+ * @param string $test_case_name name of test case.
+ * @param string $method Name of test method.
+ * @access public
+ */
+ function shouldInvoke($test_case_name, $method) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ if (! $this->_reporters[$i]->shouldInvoke($test_case_name, $method)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Every reporter gets a chance to wrap the invoker.
+ * @param SimpleInvoker $invoker Individual test runner.
+ * @return SimpleInvoker Wrapped test runner.
+ * @access public
+ */
+ function &createInvoker(&$invoker) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $invoker = &$this->_reporters[$i]->createInvoker($invoker);
+ }
+ return $invoker;
+ }
+
+ /**
+ * Gets the formatter for variables and other small
+ * generic data items.
+ * @return SimpleDumper Formatter.
+ * @access public
+ */
+ function getDumper() {
+ return new SimpleDumper();
+ }
+
+ /**
+ * Paints the start of a group test.
+ * @param string $test_name Name of test or other label.
+ * @param integer $size Number of test cases starting.
+ * @access public
+ */
+ function paintGroupStart($test_name, $size) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $this->_reporters[$i]->paintGroupStart($test_name, $size);
+ }
+ }
+
+ /**
+ * Paints the end of a group test.
+ * @param string $test_name Name of test or other label.
+ * @access public
+ */
+ function paintGroupEnd($test_name) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $this->_reporters[$i]->paintGroupEnd($test_name);
+ }
+ }
+
+ /**
+ * Paints the start of a test case.
+ * @param string $test_name Name of test or other label.
+ * @access public
+ */
+ function paintCaseStart($test_name) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $this->_reporters[$i]->paintCaseStart($test_name);
+ }
+ }
+
+ /**
+ * Paints the end of a test case.
+ * @param string $test_name Name of test or other label.
+ * @access public
+ */
+ function paintCaseEnd($test_name) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $this->_reporters[$i]->paintCaseEnd($test_name);
+ }
+ }
+
+ /**
+ * Paints the start of a test method.
+ * @param string $test_name Name of test or other label.
+ * @access public
+ */
+ function paintMethodStart($test_name) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $this->_reporters[$i]->paintMethodStart($test_name);
+ }
+ }
+
+ /**
+ * Paints the end of a test method.
+ * @param string $test_name Name of test or other label.
+ * @access public
+ */
+ function paintMethodEnd($test_name) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $this->_reporters[$i]->paintMethodEnd($test_name);
+ }
+ }
+
+ /**
+ * Chains to the wrapped reporter.
+ * @param string $message Message is ignored.
+ * @access public
+ */
+ function paintPass($message) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $this->_reporters[$i]->paintPass($message);
+ }
+ }
+
+ /**
+ * Chains to the wrapped reporter.
+ * @param string $message Message is ignored.
+ * @access public
+ */
+ function paintFail($message) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $this->_reporters[$i]->paintFail($message);
+ }
+ }
+
+ /**
+ * Chains to the wrapped reporter.
+ * @param string $message Text of error formatted by
+ * the test case.
+ * @access public
+ */
+ function paintError($message) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $this->_reporters[$i]->paintError($message);
+ }
+ }
+
+ /**
+ * Chains to the wrapped reporter.
+ * @param Exception $exception Exception to display.
+ * @access public
+ */
+ function paintException($exception) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $this->_reporters[$i]->paintException($exception);
+ }
+ }
+
+ /**
+ * Prints the message for skipping tests.
+ * @param string $message Text of skip condition.
+ * @access public
+ */
+ function paintSkip($message) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $this->_reporters[$i]->paintSkip($message);
+ }
+ }
+
+ /**
+ * Chains to the wrapped reporter.
+ * @param string $message Text to display.
+ * @access public
+ */
+ function paintMessage($message) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $this->_reporters[$i]->paintMessage($message);
+ }
+ }
+
+ /**
+ * Chains to the wrapped reporter.
+ * @param string $message Text to display.
+ * @access public
+ */
+ function paintFormattedMessage($message) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $this->_reporters[$i]->paintFormattedMessage($message);
+ }
+ }
+
+ /**
+ * Chains to the wrapped reporter.
+ * @param string $type Event type as text.
+ * @param mixed $payload Message or object.
+ * @return boolean Should return false if this
+ * type of signal should fail the
+ * test suite.
+ * @access public
+ */
+ function paintSignal($type, &$payload) {
+ for ($i = 0; $i < count($this->_reporters); $i++) {
+ $this->_reporters[$i]->paintSignal($type, $payload);
+ }
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/selector.php b/tests/simpletest/selector.php
new file mode 100755
index 0000000000..7280009045
--- /dev/null
+++ b/tests/simpletest/selector.php
@@ -0,0 +1,133 @@
+<?php
+ /**
+ * Base include file for SimpleTest.
+ * @package SimpleTest
+ * @subpackage WebTester
+ * @version $Id: selector.php,v 1.3 2005/08/25 03:34:24 lastcraft Exp $
+ */
+
+ /**#@+
+ * include SimpleTest files
+ */
+ require_once(dirname(__FILE__) . '/tag.php');
+ require_once(dirname(__FILE__) . '/encoding.php');
+ /**#@-*/
+
+ /**
+ * Used to extract form elements for testing against.
+ * Searches by name attribute.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleByName {
+ var $_name;
+
+ /**
+ * Stashes the name for later comparison.
+ * @param string $name Name attribute to match.
+ */
+ function SimpleByName($name) {
+ $this->_name = $name;
+ }
+
+ /**
+ * Compares with name attribute of widget.
+ * @param SimpleWidget $widget Control to compare.
+ * @access public
+ */
+ function isMatch($widget) {
+ return ($widget->getName() == $this->_name);
+ }
+ }
+
+ /**
+ * Used to extract form elements for testing against.
+ * Searches by visible label or alt text.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleByLabel {
+ var $_label;
+
+ /**
+ * Stashes the name for later comparison.
+ * @param string $label Visible text to match.
+ */
+ function SimpleByLabel($label) {
+ $this->_label = $label;
+ }
+
+ /**
+ * Comparison. Compares visible text of widget or
+ * related label.
+ * @param SimpleWidget $widget Control to compare.
+ * @access public
+ */
+ function isMatch($widget) {
+ if (! method_exists($widget, 'isLabel')) {
+ return false;
+ }
+ return $widget->isLabel($this->_label);
+ }
+ }
+
+ /**
+ * Used to extract form elements for testing against.
+ * Searches dy id attribute.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleById {
+ var $_id;
+
+ /**
+ * Stashes the name for later comparison.
+ * @param string $id ID atribute to match.
+ */
+ function SimpleById($id) {
+ $this->_id = $id;
+ }
+
+ /**
+ * Comparison. Compares id attribute of widget.
+ * @param SimpleWidget $widget Control to compare.
+ * @access public
+ */
+ function isMatch($widget) {
+ return $widget->isId($this->_id);
+ }
+ }
+
+ /**
+ * Used to extract form elements for testing against.
+ * Searches by visible label, name or alt text.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleByLabelOrName {
+ var $_label;
+
+ /**
+ * Stashes the name/label for later comparison.
+ * @param string $label Visible text to match.
+ */
+ function SimpleByLabelOrName($label) {
+ $this->_label = $label;
+ }
+
+ /**
+ * Comparison. Compares visible text of widget or
+ * related label or name.
+ * @param SimpleWidget $widget Control to compare.
+ * @access public
+ */
+ function isMatch($widget) {
+ if (method_exists($widget, 'isLabel')) {
+ if ($widget->isLabel($this->_label)) {
+ return true;
+ }
+ }
+ return ($widget->getName() == $this->_label);
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/shell_tester.php b/tests/simpletest/shell_tester.php
new file mode 100755
index 0000000000..e245eda7d9
--- /dev/null
+++ b/tests/simpletest/shell_tester.php
@@ -0,0 +1,333 @@
+<?php
+ /**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: shell_tester.php,v 1.21 2006/11/10 20:59:57 lastcraft Exp $
+ */
+
+ /**#@+
+ * include other SimpleTest class files
+ */
+ require_once(dirname(__FILE__) . '/test_case.php');
+ /**#@-*/
+
+ /**
+ * Wrapper for exec() functionality.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class SimpleShell {
+ var $_output;
+
+ /**
+ * Executes the shell comand and stashes the output.
+ * @access public
+ */
+ function SimpleShell() {
+ $this->_output = false;
+ }
+
+ /**
+ * Actually runs the command. Does not trap the
+ * error stream output as this need PHP 4.3+.
+ * @param string $command The actual command line
+ * to run.
+ * @return integer Exit code.
+ * @access public
+ */
+ function execute($command) {
+ $this->_output = false;
+ exec($command, $this->_output, $ret);
+ return $ret;
+ }
+
+ /**
+ * Accessor for the last output.
+ * @return string Output as text.
+ * @access public
+ */
+ function getOutput() {
+ return implode("\n", $this->_output);
+ }
+
+ /**
+ * Accessor for the last output.
+ * @return array Output as array of lines.
+ * @access public
+ */
+ function getOutputAsList() {
+ return $this->_output;
+ }
+ }
+
+ /**
+ * Test case for testing of command line scripts and
+ * utilities. Usually scripts that are external to the
+ * PHP code, but support it in some way.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class ShellTestCase extends SimpleTestCase {
+ var $_current_shell;
+ var $_last_status;
+ var $_last_command;
+
+ /**
+ * Creates an empty test case. Should be subclassed
+ * with test methods for a functional test case.
+ * @param string $label Name of test case. Will use
+ * the class name if none specified.
+ * @access public
+ */
+ function ShellTestCase($label = false) {
+ $this->SimpleTestCase($label);
+ $this->_current_shell = &$this->_createShell();
+ $this->_last_status = false;
+ $this->_last_command = '';
+ }
+
+ /**
+ * Executes a command and buffers the results.
+ * @param string $command Command to run.
+ * @return boolean True if zero exit code.
+ * @access public
+ */
+ function execute($command) {
+ $shell = &$this->_getShell();
+ $this->_last_status = $shell->execute($command);
+ $this->_last_command = $command;
+ return ($this->_last_status === 0);
+ }
+
+ /**
+ * Dumps the output of the last command.
+ * @access public
+ */
+ function dumpOutput() {
+ $this->dump($this->getOutput());
+ }
+
+ /**
+ * Accessor for the last output.
+ * @return string Output as text.
+ * @access public
+ */
+ function getOutput() {
+ $shell = &$this->_getShell();
+ return $shell->getOutput();
+ }
+
+ /**
+ * Accessor for the last output.
+ * @return array Output as array of lines.
+ * @access public
+ */
+ function getOutputAsList() {
+ $shell = &$this->_getShell();
+ return $shell->getOutputAsList();
+ }
+
+ /**
+ * Called from within the test methods to register
+ * passes and failures.
+ * @param boolean $result Pass on true.
+ * @param string $message Message to display describing
+ * the test state.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertTrue($result, $message = false) {
+ return $this->assert(new TrueExpectation(), $result, $message);
+ }
+
+ /**
+ * Will be true on false and vice versa. False
+ * is the PHP definition of false, so that null,
+ * empty strings, zero and an empty array all count
+ * as false.
+ * @param boolean $result Pass on false.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertFalse($result, $message = '%s') {
+ return $this->assert(new FalseExpectation(), $result, $message);
+ }
+
+ /**
+ * Will trigger a pass if the two parameters have
+ * the same value only. Otherwise a fail. This
+ * is for testing hand extracted text, etc.
+ * @param mixed $first Value to compare.
+ * @param mixed $second Value to compare.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertEqual($first, $second, $message = "%s") {
+ return $this->assert(
+ new EqualExpectation($first),
+ $second,
+ $message);
+ }
+
+ /**
+ * Will trigger a pass if the two parameters have
+ * a different value. Otherwise a fail. This
+ * is for testing hand extracted text, etc.
+ * @param mixed $first Value to compare.
+ * @param mixed $second Value to compare.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertNotEqual($first, $second, $message = "%s") {
+ return $this->assert(
+ new NotEqualExpectation($first),
+ $second,
+ $message);
+ }
+
+ /**
+ * Tests the last status code from the shell.
+ * @param integer $status Expected status of last
+ * command.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertExitCode($status, $message = "%s") {
+ $message = sprintf($message, "Expected status code of [$status] from [" .
+ $this->_last_command . "], but got [" .
+ $this->_last_status . "]");
+ return $this->assertTrue($status === $this->_last_status, $message);
+ }
+
+ /**
+ * Attempt to exactly match the combined STDERR and
+ * STDOUT output.
+ * @param string $expected Expected output.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertOutput($expected, $message = "%s") {
+ $shell = &$this->_getShell();
+ return $this->assert(
+ new EqualExpectation($expected),
+ $shell->getOutput(),
+ $message);
+ }
+
+ /**
+ * Scans the output for a Perl regex. If found
+ * anywhere it passes, else it fails.
+ * @param string $pattern Regex to search for.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertOutputPattern($pattern, $message = "%s") {
+ $shell = &$this->_getShell();
+ return $this->assert(
+ new PatternExpectation($pattern),
+ $shell->getOutput(),
+ $message);
+ }
+
+ /**
+ * If a Perl regex is found anywhere in the current
+ * output then a failure is generated, else a pass.
+ * @param string $pattern Regex to search for.
+ * @param $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertNoOutputPattern($pattern, $message = "%s") {
+ $shell = &$this->_getShell();
+ return $this->assert(
+ new NoPatternExpectation($pattern),
+ $shell->getOutput(),
+ $message);
+ }
+
+ /**
+ * File existence check.
+ * @param string $path Full filename and path.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertFileExists($path, $message = "%s") {
+ $message = sprintf($message, "File [$path] should exist");
+ return $this->assertTrue(file_exists($path), $message);
+ }
+
+ /**
+ * File non-existence check.
+ * @param string $path Full filename and path.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertFileNotExists($path, $message = "%s") {
+ $message = sprintf($message, "File [$path] should not exist");
+ return $this->assertFalse(file_exists($path), $message);
+ }
+
+ /**
+ * Scans a file for a Perl regex. If found
+ * anywhere it passes, else it fails.
+ * @param string $pattern Regex to search for.
+ * @param string $path Full filename and path.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertFilePattern($pattern, $path, $message = "%s") {
+ $shell = &$this->_getShell();
+ return $this->assert(
+ new PatternExpectation($pattern),
+ implode('', file($path)),
+ $message);
+ }
+
+ /**
+ * If a Perl regex is found anywhere in the named
+ * file then a failure is generated, else a pass.
+ * @param string $pattern Regex to search for.
+ * @param string $path Full filename and path.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertNoFilePattern($pattern, $path, $message = "%s") {
+ $shell = &$this->_getShell();
+ return $this->assert(
+ new NoPatternExpectation($pattern),
+ implode('', file($path)),
+ $message);
+ }
+
+ /**
+ * Accessor for current shell. Used for testing the
+ * the tester itself.
+ * @return Shell Current shell.
+ * @access protected
+ */
+ function &_getShell() {
+ return $this->_current_shell;
+ }
+
+ /**
+ * Factory for the shell to run the command on.
+ * @return Shell New shell object.
+ * @access protected
+ */
+ function &_createShell() {
+ $shell = &new SimpleShell();
+ return $shell;
+ }
+ }
+?>
diff --git a/tests/simpletest/simpletest.php b/tests/simpletest/simpletest.php
new file mode 100755
index 0000000000..af6bee42a0
--- /dev/null
+++ b/tests/simpletest/simpletest.php
@@ -0,0 +1,478 @@
+<?php
+ /**
+ * Global state for SimpleTest and kicker script in future versions.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: simpletest.php,v 1.21 2007/07/07 00:31:03 lastcraft Exp $
+ */
+
+ /**#@+
+ * include SimpleTest files
+ */
+ if (version_compare(phpversion(), '5') >= 0) {
+ require_once(dirname(__FILE__) . '/reflection_php5.php');
+ } else {
+ require_once(dirname(__FILE__) . '/reflection_php4.php');
+ }
+ require_once(dirname(__FILE__) . '/default_reporter.php');
+ require_once(dirname(__FILE__) . '/compatibility.php');
+ /**#@-*/
+
+ /**
+ * Registry and test context. Includes a few
+ * global options that I'm slowly getting rid of.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class SimpleTest {
+
+ /**
+ * Reads the SimpleTest version from the release file.
+ * @return string Version string.
+ * @static
+ * @access public
+ */
+ function getVersion() {
+ $content = file(dirname(__FILE__) . '/VERSION');
+ return trim($content[0]);
+ }
+
+ /**
+ * Sets the name of a test case to ignore, usually
+ * because the class is an abstract case that should
+ * not be run. Once PHP4 is dropped this will disappear
+ * as a public method and "abstract" will rule.
+ * @param string $class Add a class to ignore.
+ * @static
+ * @access public
+ */
+ function ignore($class) {
+ $registry = &SimpleTest::_getRegistry();
+ $registry['IgnoreList'][strtolower($class)] = true;
+ }
+
+ /**
+ * Scans the now complete ignore list, and adds
+ * all parent classes to the list. If a class
+ * is not a runnable test case, then it's parents
+ * wouldn't be either. This is syntactic sugar
+ * to cut down on ommissions of ignore()'s or
+ * missing abstract declarations. This cannot
+ * be done whilst loading classes wiithout forcing
+ * a particular order on the class declarations and
+ * the ignore() calls. It's just nice to have the ignore()
+ * calls at the top of the file before the actual declarations.
+ * @param array $classes Class names of interest.
+ * @static
+ * @access public
+ */
+ function ignoreParentsIfIgnored($classes) {
+ $registry = &SimpleTest::_getRegistry();
+ foreach ($classes as $class) {
+ if (SimpleTest::isIgnored($class)) {
+ $reflection = new SimpleReflection($class);
+ if ($parent = $reflection->getParent()) {
+ SimpleTest::ignore($parent);
+ }
+ }
+ }
+ }
+
+ /**
+ * Puts the object to the global pool of 'preferred' objects
+ * which can be retrieved with SimpleTest :: preferred() method.
+ * Instances of the same class are overwritten.
+ * @param object $object Preferred object
+ * @static
+ * @access public
+ * @see preferred()
+ */
+ function prefer(&$object) {
+ $registry = &SimpleTest::_getRegistry();
+ $registry['Preferred'][] = &$object;
+ }
+
+ /**
+ * Retrieves 'preferred' objects from global pool. Class filter
+ * can be applied in order to retrieve the object of the specific
+ * class
+ * @param array|string $classes Allowed classes or interfaces.
+ * @static
+ * @access public
+ * @return array|object|null
+ * @see prefer()
+ */
+ function &preferred($classes) {
+ if (! is_array($classes)) {
+ $classes = array($classes);
+ }
+ $registry = &SimpleTest::_getRegistry();
+ for ($i = count($registry['Preferred']) - 1; $i >= 0; $i--) {
+ foreach ($classes as $class) {
+ if (SimpleTestCompatibility::isA($registry['Preferred'][$i], $class)) {
+ return $registry['Preferred'][$i];
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Test to see if a test case is in the ignore
+ * list. Quite obviously the ignore list should
+ * be a separate object and will be one day.
+ * This method is internal to SimpleTest. Don't
+ * use it.
+ * @param string $class Class name to test.
+ * @return boolean True if should not be run.
+ * @access public
+ * @static
+ */
+ function isIgnored($class) {
+ $registry = &SimpleTest::_getRegistry();
+ return isset($registry['IgnoreList'][strtolower($class)]);
+ }
+
+ /**
+ * @deprecated
+ */
+ function setMockBaseClass($mock_base) {
+ $registry = &SimpleTest::_getRegistry();
+ $registry['MockBaseClass'] = $mock_base;
+ }
+
+ /**
+ * @deprecated
+ */
+ function getMockBaseClass() {
+ $registry = &SimpleTest::_getRegistry();
+ return $registry['MockBaseClass'];
+ }
+
+ /**
+ * Sets proxy to use on all requests for when
+ * testing from behind a firewall. Set host
+ * to false to disable. This will take effect
+ * if there are no other proxy settings.
+ * @param string $proxy Proxy host as URL.
+ * @param string $username Proxy username for authentication.
+ * @param string $password Proxy password for authentication.
+ * @access public
+ */
+ function useProxy($proxy, $username = false, $password = false) {
+ $registry = &SimpleTest::_getRegistry();
+ $registry['DefaultProxy'] = $proxy;
+ $registry['DefaultProxyUsername'] = $username;
+ $registry['DefaultProxyPassword'] = $password;
+ }
+
+ /**
+ * Accessor for default proxy host.
+ * @return string Proxy URL.
+ * @access public
+ */
+ function getDefaultProxy() {
+ $registry = &SimpleTest::_getRegistry();
+ return $registry['DefaultProxy'];
+ }
+
+ /**
+ * Accessor for default proxy username.
+ * @return string Proxy username for authentication.
+ * @access public
+ */
+ function getDefaultProxyUsername() {
+ $registry = &SimpleTest::_getRegistry();
+ return $registry['DefaultProxyUsername'];
+ }
+
+ /**
+ * Accessor for default proxy password.
+ * @return string Proxy password for authentication.
+ * @access public
+ */
+ function getDefaultProxyPassword() {
+ $registry = &SimpleTest::_getRegistry();
+ return $registry['DefaultProxyPassword'];
+ }
+
+ /**
+ * Accessor for global registry of options.
+ * @return hash All stored values.
+ * @access private
+ * @static
+ */
+ function &_getRegistry() {
+ static $registry = false;
+ if (! $registry) {
+ $registry = SimpleTest::_getDefaults();
+ }
+ return $registry;
+ }
+
+ /**
+ * Accessor for the context of the current
+ * test run.
+ * @return SimpleTestContext Current test run.
+ * @access public
+ * @static
+ */
+ function &getContext() {
+ static $context = false;
+ if (! $context) {
+ $context = new SimpleTestContext();
+ }
+ return $context;
+ }
+
+ /**
+ * Constant default values.
+ * @return hash All registry defaults.
+ * @access private
+ * @static
+ */
+ function _getDefaults() {
+ return array(
+ 'StubBaseClass' => 'SimpleStub',
+ 'MockBaseClass' => 'SimpleMock',
+ 'IgnoreList' => array(),
+ 'DefaultProxy' => false,
+ 'DefaultProxyUsername' => false,
+ 'DefaultProxyPassword' => false,
+ 'Preferred' => array(new HtmlReporter(), new TextReporter(), new XmlReporter()));
+ }
+ }
+
+ /**
+ * Container for all components for a specific
+ * test run. Makes things like error queues
+ * available to PHP event handlers, and also
+ * gets around some nasty reference issues in
+ * the mocks.
+ * @package SimpleTest
+ */
+ class SimpleTestContext {
+ var $_test;
+ var $_reporter;
+ var $_resources;
+
+ /**
+ * Clears down the current context.
+ * @access public
+ */
+ function clear() {
+ $this->_resources = array();
+ }
+
+ /**
+ * Sets the current test case instance. This
+ * global instance can be used by the mock objects
+ * to send message to the test cases.
+ * @param SimpleTestCase $test Test case to register.
+ * @access public
+ */
+ function setTest(&$test) {
+ $this->clear();
+ $this->_test = &$test;
+ }
+
+ /**
+ * Accessor for currently running test case.
+ * @return SimpleTestCase Current test.
+ * @access public
+ */
+ function &getTest() {
+ return $this->_test;
+ }
+
+ /**
+ * Sets the current reporter. This
+ * global instance can be used by the mock objects
+ * to send messages.
+ * @param SimpleReporter $reporter Reporter to register.
+ * @access public
+ */
+ function setReporter(&$reporter) {
+ $this->clear();
+ $this->_reporter = &$reporter;
+ }
+
+ /**
+ * Accessor for current reporter.
+ * @return SimpleReporter Current reporter.
+ * @access public
+ */
+ function &getReporter() {
+ return $this->_reporter;
+ }
+
+ /**
+ * Accessor for the Singleton resource.
+ * @return object Global resource.
+ * @access public
+ * @static
+ */
+ function &get($resource) {
+ if (! isset($this->_resources[$resource])) {
+ $this->_resources[$resource] = &new $resource();
+ }
+ return $this->_resources[$resource];
+ }
+ }
+
+ /**
+ * Interrogates the stack trace to recover the
+ * failure point.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class SimpleStackTrace {
+ var $_prefixes;
+
+ /**
+ * Stashes the list of target prefixes.
+ * @param array $prefixes List of method prefixes
+ * to search for.
+ */
+ function SimpleStackTrace($prefixes) {
+ $this->_prefixes = $prefixes;
+ }
+
+ /**
+ * Extracts the last method name that was not within
+ * Simpletest itself. Captures a stack trace if none given.
+ * @param array $stack List of stack frames.
+ * @return string Snippet of test report with line
+ * number and file.
+ * @access public
+ */
+ function traceMethod($stack = false) {
+ $stack = $stack ? $stack : $this->_captureTrace();
+ foreach ($stack as $frame) {
+ if ($this->_frameLiesWithinSimpleTestFolder($frame)) {
+ continue;
+ }
+ if ($this->_frameMatchesPrefix($frame)) {
+ return ' at [' . $frame['file'] . ' line ' . $frame['line'] . ']';
+ }
+ }
+ return '';
+ }
+
+ /**
+ * Test to see if error is generated by SimpleTest itself.
+ * @param array $frame PHP stack frame.
+ * @return boolean True if a SimpleTest file.
+ * @access private
+ */
+ function _frameLiesWithinSimpleTestFolder($frame) {
+ if (isset($frame['file'])) {
+ $path = substr(SIMPLE_TEST, 0, -1);
+ if (strpos($frame['file'], $path) === 0) {
+ if (dirname($frame['file']) == $path) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Tries to determine if the method call is an assert, etc.
+ * @param array $frame PHP stack frame.
+ * @return boolean True if matches a target.
+ * @access private
+ */
+ function _frameMatchesPrefix($frame) {
+ foreach ($this->_prefixes as $prefix) {
+ if (strncmp($frame['function'], $prefix, strlen($prefix)) == 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Grabs a current stack trace.
+ * @return array Fulle trace.
+ * @access private
+ */
+ function _captureTrace() {
+ if (function_exists('debug_backtrace')) {
+ return array_reverse(debug_backtrace());
+ }
+ return array();
+ }
+ }
+
+ /**
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @deprecated
+ */
+ class SimpleTestOptions extends SimpleTest {
+
+ /**
+ * @deprecated
+ */
+ function getVersion() {
+ return Simpletest::getVersion();
+ }
+
+ /**
+ * @deprecated
+ */
+ function ignore($class) {
+ return Simpletest::ignore($class);
+ }
+
+ /**
+ * @deprecated
+ */
+ function isIgnored($class) {
+ return Simpletest::isIgnored($class);
+ }
+
+ /**
+ * @deprecated
+ */
+ function setMockBaseClass($mock_base) {
+ return Simpletest::setMockBaseClass($mock_base);
+ }
+
+ /**
+ * @deprecated
+ */
+ function getMockBaseClass() {
+ return Simpletest::getMockBaseClass();
+ }
+
+ /**
+ * @deprecated
+ */
+ function useProxy($proxy, $username = false, $password = false) {
+ return Simpletest::useProxy($proxy, $username, $password);
+ }
+
+ /**
+ * @deprecated
+ */
+ function getDefaultProxy() {
+ return Simpletest::getDefaultProxy();
+ }
+
+ /**
+ * @deprecated
+ */
+ function getDefaultProxyUsername() {
+ return Simpletest::getDefaultProxyUsername();
+ }
+
+ /**
+ * @deprecated
+ */
+ function getDefaultProxyPassword() {
+ return Simpletest::getDefaultProxyPassword();
+ }
+ }
+?>
diff --git a/tests/simpletest/socket.php b/tests/simpletest/socket.php
new file mode 100755
index 0000000000..23de6305f9
--- /dev/null
+++ b/tests/simpletest/socket.php
@@ -0,0 +1,216 @@
+<?php
+ /**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage MockObjects
+ * @version $Id: socket.php,v 1.26 2005/08/29 00:57:48 lastcraft Exp $
+ */
+
+ /**#@+
+ * include SimpleTest files
+ */
+ require_once(dirname(__FILE__) . '/compatibility.php');
+ /**#@-*/
+
+ /**
+ * Stashes an error for later. Useful for constructors
+ * until PHP gets exceptions.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleStickyError {
+ var $_error = 'Constructor not chained';
+
+ /**
+ * Sets the error to empty.
+ * @access public
+ */
+ function SimpleStickyError() {
+ $this->_clearError();
+ }
+
+ /**
+ * Test for an outstanding error.
+ * @return boolean True if there is an error.
+ * @access public
+ */
+ function isError() {
+ return ($this->_error != '');
+ }
+
+ /**
+ * Accessor for an outstanding error.
+ * @return string Empty string if no error otherwise
+ * the error message.
+ * @access public
+ */
+ function getError() {
+ return $this->_error;
+ }
+
+ /**
+ * Sets the internal error.
+ * @param string Error message to stash.
+ * @access protected
+ */
+ function _setError($error) {
+ $this->_error = $error;
+ }
+
+ /**
+ * Resets the error state to no error.
+ * @access protected
+ */
+ function _clearError() {
+ $this->_setError('');
+ }
+ }
+
+ /**
+ * Wrapper for TCP/IP socket.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleSocket extends SimpleStickyError {
+ var $_handle;
+ var $_is_open = false;
+ var $_sent = '';
+ var $lock_size;
+
+ /**
+ * Opens a socket for reading and writing.
+ * @param string $host Hostname to send request to.
+ * @param integer $port Port on remote machine to open.
+ * @param integer $timeout Connection timeout in seconds.
+ * @param integer $block_size Size of chunk to read.
+ * @access public
+ */
+ function SimpleSocket($host, $port, $timeout, $block_size = 255) {
+ $this->SimpleStickyError();
+ if (! ($this->_handle = $this->_openSocket($host, $port, $error_number, $error, $timeout))) {
+ $this->_setError("Cannot open [$host:$port] with [$error] within [$timeout] seconds");
+ return;
+ }
+ $this->_is_open = true;
+ $this->_block_size = $block_size;
+ SimpleTestCompatibility::setTimeout($this->_handle, $timeout);
+ }
+
+ /**
+ * Writes some data to the socket and saves alocal copy.
+ * @param string $message String to send to socket.
+ * @return boolean True if successful.
+ * @access public
+ */
+ function write($message) {
+ if ($this->isError() || ! $this->isOpen()) {
+ return false;
+ }
+ $count = fwrite($this->_handle, $message);
+ if (! $count) {
+ if ($count === false) {
+ $this->_setError('Cannot write to socket');
+ $this->close();
+ }
+ return false;
+ }
+ fflush($this->_handle);
+ $this->_sent .= $message;
+ return true;
+ }
+
+ /**
+ * Reads data from the socket. The error suppresion
+ * is a workaround for PHP4 always throwing a warning
+ * with a secure socket.
+ * @return integer/boolean Incoming bytes. False
+ * on error.
+ * @access public
+ */
+ function read() {
+ if ($this->isError() || ! $this->isOpen()) {
+ return false;
+ }
+ $raw = @fread($this->_handle, $this->_block_size);
+ if ($raw === false) {
+ $this->_setError('Cannot read from socket');
+ $this->close();
+ }
+ return $raw;
+ }
+
+ /**
+ * Accessor for socket open state.
+ * @return boolean True if open.
+ * @access public
+ */
+ function isOpen() {
+ return $this->_is_open;
+ }
+
+ /**
+ * Closes the socket preventing further reads.
+ * Cannot be reopened once closed.
+ * @return boolean True if successful.
+ * @access public
+ */
+ function close() {
+ $this->_is_open = false;
+ return fclose($this->_handle);
+ }
+
+ /**
+ * Accessor for content so far.
+ * @return string Bytes sent only.
+ * @access public
+ */
+ function getSent() {
+ return $this->_sent;
+ }
+
+ /**
+ * Actually opens the low level socket.
+ * @param string $host Host to connect to.
+ * @param integer $port Port on host.
+ * @param integer $error_number Recipient of error code.
+ * @param string $error Recipoent of error message.
+ * @param integer $timeout Maximum time to wait for connection.
+ * @access protected
+ */
+ function _openSocket($host, $port, &$error_number, &$error, $timeout) {
+ return @fsockopen($host, $port, $error_number, $error, $timeout);
+ }
+ }
+
+ /**
+ * Wrapper for TCP/IP socket over TLS.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleSecureSocket extends SimpleSocket {
+
+ /**
+ * Opens a secure socket for reading and writing.
+ * @param string $host Hostname to send request to.
+ * @param integer $port Port on remote machine to open.
+ * @param integer $timeout Connection timeout in seconds.
+ * @access public
+ */
+ function SimpleSecureSocket($host, $port, $timeout) {
+ $this->SimpleSocket($host, $port, $timeout);
+ }
+
+ /**
+ * Actually opens the low level socket.
+ * @param string $host Host to connect to.
+ * @param integer $port Port on host.
+ * @param integer $error_number Recipient of error code.
+ * @param string $error Recipient of error message.
+ * @param integer $timeout Maximum time to wait for connection.
+ * @access protected
+ */
+ function _openSocket($host, $port, &$error_number, &$error, $timeout) {
+ return parent::_openSocket("tls://$host", $port, $error_number, $error, $timeout);
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/tag.php b/tests/simpletest/tag.php
new file mode 100755
index 0000000000..b83bcd5f33
--- /dev/null
+++ b/tests/simpletest/tag.php
@@ -0,0 +1,1418 @@
+<?php
+ /**
+ * Base include file for SimpleTest.
+ * @package SimpleTest
+ * @subpackage WebTester
+ * @version $Id: tag.php,v 1.96 2007/07/11 00:27:08 lastcraft Exp $
+ */
+
+ /**#@+
+ * include SimpleTest files
+ */
+ require_once(dirname(__FILE__) . '/parser.php');
+ require_once(dirname(__FILE__) . '/encoding.php');
+ /**#@-*/
+
+ /**
+ * HTML or XML tag.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleTag {
+ var $_name;
+ var $_attributes;
+ var $_content;
+
+ /**
+ * Starts with a named tag with attributes only.
+ * @param string $name Tag name.
+ * @param hash $attributes Attribute names and
+ * string values. Note that
+ * the keys must have been
+ * converted to lower case.
+ */
+ function SimpleTag($name, $attributes) {
+ $this->_name = strtolower(trim($name));
+ $this->_attributes = $attributes;
+ $this->_content = '';
+ }
+
+ /**
+ * Check to see if the tag can have both start and
+ * end tags with content in between.
+ * @return boolean True if content allowed.
+ * @access public
+ */
+ function expectEndTag() {
+ return true;
+ }
+
+ /**
+ * The current tag should not swallow all content for
+ * itself as it's searchable page content. Private
+ * content tags are usually widgets that contain default
+ * values.
+ * @return boolean False as content is available
+ * to other tags by default.
+ * @access public
+ */
+ function isPrivateContent() {
+ return false;
+ }
+
+ /**
+ * Appends string content to the current content.
+ * @param string $content Additional text.
+ * @access public
+ */
+ function addContent($content) {
+ $this->_content .= (string)$content;
+ }
+
+ /**
+ * Adds an enclosed tag to the content.
+ * @param SimpleTag $tag New tag.
+ * @access public
+ */
+ function addTag(&$tag) {
+ }
+
+ /**
+ * Accessor for tag name.
+ * @return string Name of tag.
+ * @access public
+ */
+ function getTagName() {
+ return $this->_name;
+ }
+
+ /**
+ * List of legal child elements.
+ * @return array List of element names.
+ * @access public
+ */
+ function getChildElements() {
+ return array();
+ }
+
+ /**
+ * Accessor for an attribute.
+ * @param string $label Attribute name.
+ * @return string Attribute value.
+ * @access public
+ */
+ function getAttribute($label) {
+ $label = strtolower($label);
+ if (! isset($this->_attributes[$label])) {
+ return false;
+ }
+ return (string)$this->_attributes[$label];
+ }
+
+ /**
+ * Sets an attribute.
+ * @param string $label Attribute name.
+ * @return string $value New attribute value.
+ * @access protected
+ */
+ function _setAttribute($label, $value) {
+ $this->_attributes[strtolower($label)] = $value;
+ }
+
+ /**
+ * Accessor for the whole content so far.
+ * @return string Content as big raw string.
+ * @access public
+ */
+ function getContent() {
+ return $this->_content;
+ }
+
+ /**
+ * Accessor for content reduced to visible text. Acts
+ * like a text mode browser, normalising space and
+ * reducing images to their alt text.
+ * @return string Content as plain text.
+ * @access public
+ */
+ function getText() {
+ return SimpleHtmlSaxParser::normalise($this->_content);
+ }
+
+ /**
+ * Test to see if id attribute matches.
+ * @param string $id ID to test against.
+ * @return boolean True on match.
+ * @access public
+ */
+ function isId($id) {
+ return ($this->getAttribute('id') == $id);
+ }
+ }
+
+ /**
+ * Base url.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleBaseTag extends SimpleTag {
+
+ /**
+ * Starts with a named tag with attributes only.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function SimpleBaseTag($attributes) {
+ $this->SimpleTag('base', $attributes);
+ }
+
+ /**
+ * Base tag is not a block tag.
+ * @return boolean false
+ * @access public
+ */
+ function expectEndTag() {
+ return false;
+ }
+ }
+
+ /**
+ * Page title.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleTitleTag extends SimpleTag {
+
+ /**
+ * Starts with a named tag with attributes only.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function SimpleTitleTag($attributes) {
+ $this->SimpleTag('title', $attributes);
+ }
+ }
+
+ /**
+ * Link.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleAnchorTag extends SimpleTag {
+
+ /**
+ * Starts with a named tag with attributes only.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function SimpleAnchorTag($attributes) {
+ $this->SimpleTag('a', $attributes);
+ }
+
+ /**
+ * Accessor for URL as string.
+ * @return string Coerced as string.
+ * @access public
+ */
+ function getHref() {
+ $url = $this->getAttribute('href');
+ if (is_bool($url)) {
+ $url = '';
+ }
+ return $url;
+ }
+ }
+
+ /**
+ * Form element.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleWidget extends SimpleTag {
+ var $_value;
+ var $_label;
+ var $_is_set;
+
+ /**
+ * Starts with a named tag with attributes only.
+ * @param string $name Tag name.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function SimpleWidget($name, $attributes) {
+ $this->SimpleTag($name, $attributes);
+ $this->_value = false;
+ $this->_label = false;
+ $this->_is_set = false;
+ }
+
+ /**
+ * Accessor for name submitted as the key in
+ * GET/POST variables hash.
+ * @return string Parsed value.
+ * @access public
+ */
+ function getName() {
+ return $this->getAttribute('name');
+ }
+
+ /**
+ * Accessor for default value parsed with the tag.
+ * @return string Parsed value.
+ * @access public
+ */
+ function getDefault() {
+ return $this->getAttribute('value');
+ }
+
+ /**
+ * Accessor for currently set value or default if
+ * none.
+ * @return string Value set by form or default
+ * if none.
+ * @access public
+ */
+ function getValue() {
+ if (! $this->_is_set) {
+ return $this->getDefault();
+ }
+ return $this->_value;
+ }
+
+ /**
+ * Sets the current form element value.
+ * @param string $value New value.
+ * @return boolean True if allowed.
+ * @access public
+ */
+ function setValue($value) {
+ $this->_value = $value;
+ $this->_is_set = true;
+ return true;
+ }
+
+ /**
+ * Resets the form element value back to the
+ * default.
+ * @access public
+ */
+ function resetValue() {
+ $this->_is_set = false;
+ }
+
+ /**
+ * Allows setting of a label externally, say by a
+ * label tag.
+ * @param string $label Label to attach.
+ * @access public
+ */
+ function setLabel($label) {
+ $this->_label = trim($label);
+ }
+
+ /**
+ * Reads external or internal label.
+ * @param string $label Label to test.
+ * @return boolean True is match.
+ * @access public
+ */
+ function isLabel($label) {
+ return $this->_label == trim($label);
+ }
+
+ /**
+ * Dispatches the value into the form encoded packet.
+ * @param SimpleEncoding $encoding Form packet.
+ * @access public
+ */
+ function write(&$encoding) {
+ if ($this->getName()) {
+ $encoding->add($this->getName(), $this->getValue());
+ }
+ }
+ }
+
+ /**
+ * Text, password and hidden field.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleTextTag extends SimpleWidget {
+
+ /**
+ * Starts with a named tag with attributes only.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function SimpleTextTag($attributes) {
+ $this->SimpleWidget('input', $attributes);
+ if ($this->getAttribute('value') === false) {
+ $this->_setAttribute('value', '');
+ }
+ }
+
+ /**
+ * Tag contains no content.
+ * @return boolean False.
+ * @access public
+ */
+ function expectEndTag() {
+ return false;
+ }
+
+ /**
+ * Sets the current form element value. Cannot
+ * change the value of a hidden field.
+ * @param string $value New value.
+ * @return boolean True if allowed.
+ * @access public
+ */
+ function setValue($value) {
+ if ($this->getAttribute('type') == 'hidden') {
+ return false;
+ }
+ return parent::setValue($value);
+ }
+ }
+
+ /**
+ * Submit button as input tag.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleSubmitTag extends SimpleWidget {
+
+ /**
+ * Starts with a named tag with attributes only.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function SimpleSubmitTag($attributes) {
+ $this->SimpleWidget('input', $attributes);
+ if ($this->getAttribute('value') === false) {
+ $this->_setAttribute('value', 'Submit');
+ }
+ }
+
+ /**
+ * Tag contains no end element.
+ * @return boolean False.
+ * @access public
+ */
+ function expectEndTag() {
+ return false;
+ }
+
+ /**
+ * Disables the setting of the button value.
+ * @param string $value Ignored.
+ * @return boolean True if allowed.
+ * @access public
+ */
+ function setValue($value) {
+ return false;
+ }
+
+ /**
+ * Value of browser visible text.
+ * @return string Visible label.
+ * @access public
+ */
+ function getLabel() {
+ return $this->getValue();
+ }
+
+ /**
+ * Test for a label match when searching.
+ * @param string $label Label to test.
+ * @return boolean True on match.
+ * @access public
+ */
+ function isLabel($label) {
+ return trim($label) == trim($this->getLabel());
+ }
+ }
+
+ /**
+ * Image button as input tag.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleImageSubmitTag extends SimpleWidget {
+
+ /**
+ * Starts with a named tag with attributes only.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function SimpleImageSubmitTag($attributes) {
+ $this->SimpleWidget('input', $attributes);
+ }
+
+ /**
+ * Tag contains no end element.
+ * @return boolean False.
+ * @access public
+ */
+ function expectEndTag() {
+ return false;
+ }
+
+ /**
+ * Disables the setting of the button value.
+ * @param string $value Ignored.
+ * @return boolean True if allowed.
+ * @access public
+ */
+ function setValue($value) {
+ return false;
+ }
+
+ /**
+ * Value of browser visible text.
+ * @return string Visible label.
+ * @access public
+ */
+ function getLabel() {
+ if ($this->getAttribute('title')) {
+ return $this->getAttribute('title');
+ }
+ return $this->getAttribute('alt');
+ }
+
+ /**
+ * Test for a label match when searching.
+ * @param string $label Label to test.
+ * @return boolean True on match.
+ * @access public
+ */
+ function isLabel($label) {
+ return trim($label) == trim($this->getLabel());
+ }
+
+ /**
+ * Dispatches the value into the form encoded packet.
+ * @param SimpleEncoding $encoding Form packet.
+ * @param integer $x X coordinate of click.
+ * @param integer $y Y coordinate of click.
+ * @access public
+ */
+ function write(&$encoding, $x, $y) {
+ if ($this->getName()) {
+ $encoding->add($this->getName() . '.x', $x);
+ $encoding->add($this->getName() . '.y', $y);
+ } else {
+ $encoding->add('x', $x);
+ $encoding->add('y', $y);
+ }
+ }
+ }
+
+ /**
+ * Submit button as button tag.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleButtonTag extends SimpleWidget {
+
+ /**
+ * Starts with a named tag with attributes only.
+ * Defaults are very browser dependent.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function SimpleButtonTag($attributes) {
+ $this->SimpleWidget('button', $attributes);
+ }
+
+ /**
+ * Check to see if the tag can have both start and
+ * end tags with content in between.
+ * @return boolean True if content allowed.
+ * @access public
+ */
+ function expectEndTag() {
+ return true;
+ }
+
+ /**
+ * Disables the setting of the button value.
+ * @param string $value Ignored.
+ * @return boolean True if allowed.
+ * @access public
+ */
+ function setValue($value) {
+ return false;
+ }
+
+ /**
+ * Value of browser visible text.
+ * @return string Visible label.
+ * @access public
+ */
+ function getLabel() {
+ return $this->getContent();
+ }
+
+ /**
+ * Test for a label match when searching.
+ * @param string $label Label to test.
+ * @return boolean True on match.
+ * @access public
+ */
+ function isLabel($label) {
+ return trim($label) == trim($this->getLabel());
+ }
+ }
+
+ /**
+ * Content tag for text area.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleTextAreaTag extends SimpleWidget {
+
+ /**
+ * Starts with a named tag with attributes only.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function SimpleTextAreaTag($attributes) {
+ $this->SimpleWidget('textarea', $attributes);
+ }
+
+ /**
+ * Accessor for starting value.
+ * @return string Parsed value.
+ * @access public
+ */
+ function getDefault() {
+ return $this->_wrap(SimpleHtmlSaxParser::decodeHtml($this->getContent()));
+ }
+
+ /**
+ * Applies word wrapping if needed.
+ * @param string $value New value.
+ * @return boolean True if allowed.
+ * @access public
+ */
+ function setValue($value) {
+ return parent::setValue($this->_wrap($value));
+ }
+
+ /**
+ * Test to see if text should be wrapped.
+ * @return boolean True if wrapping on.
+ * @access private
+ */
+ function _wrapIsEnabled() {
+ if ($this->getAttribute('cols')) {
+ $wrap = $this->getAttribute('wrap');
+ if (($wrap == 'physical') || ($wrap == 'hard')) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Performs the formatting that is peculiar to
+ * this tag. There is strange behaviour in this
+ * one, including stripping a leading new line.
+ * Go figure. I am using Firefox as a guide.
+ * @param string $text Text to wrap.
+ * @return string Text wrapped with carriage
+ * returns and line feeds
+ * @access private
+ */
+ function _wrap($text) {
+ $text = str_replace("\r\r\n", "\r\n", str_replace("\n", "\r\n", $text));
+ $text = str_replace("\r\n\n", "\r\n", str_replace("\r", "\r\n", $text));
+ if (strncmp($text, "\r\n", strlen("\r\n")) == 0) {
+ $text = substr($text, strlen("\r\n"));
+ }
+ if ($this->_wrapIsEnabled()) {
+ return wordwrap(
+ $text,
+ (integer)$this->getAttribute('cols'),
+ "\r\n");
+ }
+ return $text;
+ }
+
+ /**
+ * The content of textarea is not part of the page.
+ * @return boolean True.
+ * @access public
+ */
+ function isPrivateContent() {
+ return true;
+ }
+ }
+
+ /**
+ * File upload widget.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleUploadTag extends SimpleWidget {
+
+ /**
+ * Starts with attributes only.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function SimpleUploadTag($attributes) {
+ $this->SimpleWidget('input', $attributes);
+ }
+
+ /**
+ * Tag contains no content.
+ * @return boolean False.
+ * @access public
+ */
+ function expectEndTag() {
+ return false;
+ }
+
+ /**
+ * Dispatches the value into the form encoded packet.
+ * @param SimpleEncoding $encoding Form packet.
+ * @access public
+ */
+ function write(&$encoding) {
+ if (! file_exists($this->getValue())) {
+ return;
+ }
+ $encoding->attach(
+ $this->getName(),
+ implode('', file($this->getValue())),
+ basename($this->getValue()));
+ }
+ }
+
+ /**
+ * Drop down widget.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleSelectionTag extends SimpleWidget {
+ var $_options;
+ var $_choice;
+
+ /**
+ * Starts with attributes only.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function SimpleSelectionTag($attributes) {
+ $this->SimpleWidget('select', $attributes);
+ $this->_options = array();
+ $this->_choice = false;
+ }
+
+ /**
+ * Adds an option tag to a selection field.
+ * @param SimpleOptionTag $tag New option.
+ * @access public
+ */
+ function addTag(&$tag) {
+ if ($tag->getTagName() == 'option') {
+ $this->_options[] = &$tag;
+ }
+ }
+
+ /**
+ * Text within the selection element is ignored.
+ * @param string $content Ignored.
+ * @access public
+ */
+ function addContent($content) {
+ }
+
+ /**
+ * Scans options for defaults. If none, then
+ * the first option is selected.
+ * @return string Selected field.
+ * @access public
+ */
+ function getDefault() {
+ for ($i = 0, $count = count($this->_options); $i < $count; $i++) {
+ if ($this->_options[$i]->getAttribute('selected') !== false) {
+ return $this->_options[$i]->getDefault();
+ }
+ }
+ if ($count > 0) {
+ return $this->_options[0]->getDefault();
+ }
+ return '';
+ }
+
+ /**
+ * Can only set allowed values.
+ * @param string $value New choice.
+ * @return boolean True if allowed.
+ * @access public
+ */
+ function setValue($value) {
+ for ($i = 0, $count = count($this->_options); $i < $count; $i++) {
+ if ($this->_options[$i]->isValue($value)) {
+ $this->_choice = $i;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Accessor for current selection value.
+ * @return string Value attribute or
+ * content of opton.
+ * @access public
+ */
+ function getValue() {
+ if ($this->_choice === false) {
+ return $this->getDefault();
+ }
+ return $this->_options[$this->_choice]->getValue();
+ }
+ }
+
+ /**
+ * Drop down widget.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class MultipleSelectionTag extends SimpleWidget {
+ var $_options;
+ var $_values;
+
+ /**
+ * Starts with attributes only.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function MultipleSelectionTag($attributes) {
+ $this->SimpleWidget('select', $attributes);
+ $this->_options = array();
+ $this->_values = false;
+ }
+
+ /**
+ * Adds an option tag to a selection field.
+ * @param SimpleOptionTag $tag New option.
+ * @access public
+ */
+ function addTag(&$tag) {
+ if ($tag->getTagName() == 'option') {
+ $this->_options[] = &$tag;
+ }
+ }
+
+ /**
+ * Text within the selection element is ignored.
+ * @param string $content Ignored.
+ * @access public
+ */
+ function addContent($content) {
+ }
+
+ /**
+ * Scans options for defaults to populate the
+ * value array().
+ * @return array Selected fields.
+ * @access public
+ */
+ function getDefault() {
+ $default = array();
+ for ($i = 0, $count = count($this->_options); $i < $count; $i++) {
+ if ($this->_options[$i]->getAttribute('selected') !== false) {
+ $default[] = $this->_options[$i]->getDefault();
+ }
+ }
+ return $default;
+ }
+
+ /**
+ * Can only set allowed values. Any illegal value
+ * will result in a failure, but all correct values
+ * will be set.
+ * @param array $desired New choices.
+ * @return boolean True if all allowed.
+ * @access public
+ */
+ function setValue($desired) {
+ $achieved = array();
+ foreach ($desired as $value) {
+ $success = false;
+ for ($i = 0, $count = count($this->_options); $i < $count; $i++) {
+ if ($this->_options[$i]->isValue($value)) {
+ $achieved[] = $this->_options[$i]->getValue();
+ $success = true;
+ break;
+ }
+ }
+ if (! $success) {
+ return false;
+ }
+ }
+ $this->_values = $achieved;
+ return true;
+ }
+
+ /**
+ * Accessor for current selection value.
+ * @return array List of currently set options.
+ * @access public
+ */
+ function getValue() {
+ if ($this->_values === false) {
+ return $this->getDefault();
+ }
+ return $this->_values;
+ }
+ }
+
+ /**
+ * Option for selection field.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleOptionTag extends SimpleWidget {
+
+ /**
+ * Stashes the attributes.
+ */
+ function SimpleOptionTag($attributes) {
+ $this->SimpleWidget('option', $attributes);
+ }
+
+ /**
+ * Does nothing.
+ * @param string $value Ignored.
+ * @return boolean Not allowed.
+ * @access public
+ */
+ function setValue($value) {
+ return false;
+ }
+
+ /**
+ * Test to see if a value matches the option.
+ * @param string $compare Value to compare with.
+ * @return boolean True if possible match.
+ * @access public
+ */
+ function isValue($compare) {
+ $compare = trim($compare);
+ if (trim($this->getValue()) == $compare) {
+ return true;
+ }
+ return trim($this->getContent()) == $compare;
+ }
+
+ /**
+ * Accessor for starting value. Will be set to
+ * the option label if no value exists.
+ * @return string Parsed value.
+ * @access public
+ */
+ function getDefault() {
+ if ($this->getAttribute('value') === false) {
+ return $this->getContent();
+ }
+ return $this->getAttribute('value');
+ }
+
+ /**
+ * The content of options is not part of the page.
+ * @return boolean True.
+ * @access public
+ */
+ function isPrivateContent() {
+ return true;
+ }
+ }
+
+ /**
+ * Radio button.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleRadioButtonTag extends SimpleWidget {
+
+ /**
+ * Stashes the attributes.
+ * @param array $attributes Hash of attributes.
+ */
+ function SimpleRadioButtonTag($attributes) {
+ $this->SimpleWidget('input', $attributes);
+ if ($this->getAttribute('value') === false) {
+ $this->_setAttribute('value', 'on');
+ }
+ }
+
+ /**
+ * Tag contains no content.
+ * @return boolean False.
+ * @access public
+ */
+ function expectEndTag() {
+ return false;
+ }
+
+ /**
+ * The only allowed value sn the one in the
+ * "value" attribute.
+ * @param string $value New value.
+ * @return boolean True if allowed.
+ * @access public
+ */
+ function setValue($value) {
+ if ($value === false) {
+ return parent::setValue($value);
+ }
+ if ($value !== $this->getAttribute('value')) {
+ return false;
+ }
+ return parent::setValue($value);
+ }
+
+ /**
+ * Accessor for starting value.
+ * @return string Parsed value.
+ * @access public
+ */
+ function getDefault() {
+ if ($this->getAttribute('checked') !== false) {
+ return $this->getAttribute('value');
+ }
+ return false;
+ }
+ }
+
+ /**
+ * Checkbox widget.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleCheckboxTag extends SimpleWidget {
+
+ /**
+ * Starts with attributes only.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function SimpleCheckboxTag($attributes) {
+ $this->SimpleWidget('input', $attributes);
+ if ($this->getAttribute('value') === false) {
+ $this->_setAttribute('value', 'on');
+ }
+ }
+
+ /**
+ * Tag contains no content.
+ * @return boolean False.
+ * @access public
+ */
+ function expectEndTag() {
+ return false;
+ }
+
+ /**
+ * The only allowed value in the one in the
+ * "value" attribute. The default for this
+ * attribute is "on". If this widget is set to
+ * true, then the usual value will be taken.
+ * @param string $value New value.
+ * @return boolean True if allowed.
+ * @access public
+ */
+ function setValue($value) {
+ if ($value === false) {
+ return parent::setValue($value);
+ }
+ if ($value === true) {
+ return parent::setValue($this->getAttribute('value'));
+ }
+ if ($value != $this->getAttribute('value')) {
+ return false;
+ }
+ return parent::setValue($value);
+ }
+
+ /**
+ * Accessor for starting value. The default
+ * value is "on".
+ * @return string Parsed value.
+ * @access public
+ */
+ function getDefault() {
+ if ($this->getAttribute('checked') !== false) {
+ return $this->getAttribute('value');
+ }
+ return false;
+ }
+ }
+
+ /**
+ * A group of multiple widgets with some shared behaviour.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleTagGroup {
+ var $_widgets = array();
+
+ /**
+ * Adds a tag to the group.
+ * @param SimpleWidget $widget
+ * @access public
+ */
+ function addWidget(&$widget) {
+ $this->_widgets[] = &$widget;
+ }
+
+ /**
+ * Accessor to widget set.
+ * @return array All widgets.
+ * @access protected
+ */
+ function &_getWidgets() {
+ return $this->_widgets;
+ }
+
+ /**
+ * Accessor for an attribute.
+ * @param string $label Attribute name.
+ * @return boolean Always false.
+ * @access public
+ */
+ function getAttribute($label) {
+ return false;
+ }
+
+ /**
+ * Fetches the name for the widget from the first
+ * member.
+ * @return string Name of widget.
+ * @access public
+ */
+ function getName() {
+ if (count($this->_widgets) > 0) {
+ return $this->_widgets[0]->getName();
+ }
+ }
+
+ /**
+ * Scans the widgets for one with the appropriate
+ * ID field.
+ * @param string $id ID value to try.
+ * @return boolean True if matched.
+ * @access public
+ */
+ function isId($id) {
+ for ($i = 0, $count = count($this->_widgets); $i < $count; $i++) {
+ if ($this->_widgets[$i]->isId($id)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Scans the widgets for one with the appropriate
+ * attached label.
+ * @param string $label Attached label to try.
+ * @return boolean True if matched.
+ * @access public
+ */
+ function isLabel($label) {
+ for ($i = 0, $count = count($this->_widgets); $i < $count; $i++) {
+ if ($this->_widgets[$i]->isLabel($label)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Dispatches the value into the form encoded packet.
+ * @param SimpleEncoding $encoding Form packet.
+ * @access public
+ */
+ function write(&$encoding) {
+ $encoding->add($this->getName(), $this->getValue());
+ }
+ }
+
+ /**
+ * A group of tags with the same name within a form.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleCheckboxGroup extends SimpleTagGroup {
+
+ /**
+ * Accessor for current selected widget or false
+ * if none.
+ * @return string/array Widget values or false if none.
+ * @access public
+ */
+ function getValue() {
+ $values = array();
+ $widgets = &$this->_getWidgets();
+ for ($i = 0, $count = count($widgets); $i < $count; $i++) {
+ if ($widgets[$i]->getValue() !== false) {
+ $values[] = $widgets[$i]->getValue();
+ }
+ }
+ return $this->_coerceValues($values);
+ }
+
+ /**
+ * Accessor for starting value that is active.
+ * @return string/array Widget values or false if none.
+ * @access public
+ */
+ function getDefault() {
+ $values = array();
+ $widgets = &$this->_getWidgets();
+ for ($i = 0, $count = count($widgets); $i < $count; $i++) {
+ if ($widgets[$i]->getDefault() !== false) {
+ $values[] = $widgets[$i]->getDefault();
+ }
+ }
+ return $this->_coerceValues($values);
+ }
+
+ /**
+ * Accessor for current set values.
+ * @param string/array/boolean $values Either a single string, a
+ * hash or false for nothing set.
+ * @return boolean True if all values can be set.
+ * @access public
+ */
+ function setValue($values) {
+ $values = $this->_makeArray($values);
+ if (! $this->_valuesArePossible($values)) {
+ return false;
+ }
+ $widgets = &$this->_getWidgets();
+ for ($i = 0, $count = count($widgets); $i < $count; $i++) {
+ $possible = $widgets[$i]->getAttribute('value');
+ if (in_array($widgets[$i]->getAttribute('value'), $values)) {
+ $widgets[$i]->setValue($possible);
+ } else {
+ $widgets[$i]->setValue(false);
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Tests to see if a possible value set is legal.
+ * @param string/array/boolean $values Either a single string, a
+ * hash or false for nothing set.
+ * @return boolean False if trying to set a
+ * missing value.
+ * @access private
+ */
+ function _valuesArePossible($values) {
+ $matches = array();
+ $widgets = &$this->_getWidgets();
+ for ($i = 0, $count = count($widgets); $i < $count; $i++) {
+ $possible = $widgets[$i]->getAttribute('value');
+ if (in_array($possible, $values)) {
+ $matches[] = $possible;
+ }
+ }
+ return ($values == $matches);
+ }
+
+ /**
+ * Converts the output to an appropriate format. This means
+ * that no values is false, a single value is just that
+ * value and only two or more are contained in an array.
+ * @param array $values List of values of widgets.
+ * @return string/array/boolean Expected format for a tag.
+ * @access private
+ */
+ function _coerceValues($values) {
+ if (count($values) == 0) {
+ return false;
+ } elseif (count($values) == 1) {
+ return $values[0];
+ } else {
+ return $values;
+ }
+ }
+
+ /**
+ * Converts false or string into array. The opposite of
+ * the coercian method.
+ * @param string/array/boolean $value A single item is converted
+ * to a one item list. False
+ * gives an empty list.
+ * @return array List of values, possibly empty.
+ * @access private
+ */
+ function _makeArray($value) {
+ if ($value === false) {
+ return array();
+ }
+ if (is_string($value)) {
+ return array($value);
+ }
+ return $value;
+ }
+ }
+
+ /**
+ * A group of tags with the same name within a form.
+ * Used for radio buttons.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleRadioGroup extends SimpleTagGroup {
+
+ /**
+ * Each tag is tried in turn until one is
+ * successfully set. The others will be
+ * unchecked if successful.
+ * @param string $value New value.
+ * @return boolean True if any allowed.
+ * @access public
+ */
+ function setValue($value) {
+ if (! $this->_valueIsPossible($value)) {
+ return false;
+ }
+ $index = false;
+ $widgets = &$this->_getWidgets();
+ for ($i = 0, $count = count($widgets); $i < $count; $i++) {
+ if (! $widgets[$i]->setValue($value)) {
+ $widgets[$i]->setValue(false);
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Tests to see if a value is allowed.
+ * @param string Attempted value.
+ * @return boolean True if a valid value.
+ * @access private
+ */
+ function _valueIsPossible($value) {
+ $widgets = &$this->_getWidgets();
+ for ($i = 0, $count = count($widgets); $i < $count; $i++) {
+ if ($widgets[$i]->getAttribute('value') == $value) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Accessor for current selected widget or false
+ * if none.
+ * @return string/boolean Value attribute or
+ * content of opton.
+ * @access public
+ */
+ function getValue() {
+ $widgets = &$this->_getWidgets();
+ for ($i = 0, $count = count($widgets); $i < $count; $i++) {
+ if ($widgets[$i]->getValue() !== false) {
+ return $widgets[$i]->getValue();
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Accessor for starting value that is active.
+ * @return string/boolean Value of first checked
+ * widget or false if none.
+ * @access public
+ */
+ function getDefault() {
+ $widgets = &$this->_getWidgets();
+ for ($i = 0, $count = count($widgets); $i < $count; $i++) {
+ if ($widgets[$i]->getDefault() !== false) {
+ return $widgets[$i]->getDefault();
+ }
+ }
+ return false;
+ }
+ }
+
+ /**
+ * Tag to keep track of labels.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleLabelTag extends SimpleTag {
+
+ /**
+ * Starts with a named tag with attributes only.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function SimpleLabelTag($attributes) {
+ $this->SimpleTag('label', $attributes);
+ }
+
+ /**
+ * Access for the ID to attach the label to.
+ * @return string For attribute.
+ * @access public
+ */
+ function getFor() {
+ return $this->getAttribute('for');
+ }
+ }
+
+ /**
+ * Tag to aid parsing the form.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleFormTag extends SimpleTag {
+
+ /**
+ * Starts with a named tag with attributes only.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function SimpleFormTag($attributes) {
+ $this->SimpleTag('form', $attributes);
+ }
+ }
+
+ /**
+ * Tag to aid parsing the frames in a page.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleFrameTag extends SimpleTag {
+
+ /**
+ * Starts with a named tag with attributes only.
+ * @param hash $attributes Attribute names and
+ * string values.
+ */
+ function SimpleFrameTag($attributes) {
+ $this->SimpleTag('frame', $attributes);
+ }
+
+ /**
+ * Tag contains no content.
+ * @return boolean False.
+ * @access public
+ */
+ function expectEndTag() {
+ return false;
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/acceptance_test.php b/tests/simpletest/test/acceptance_test.php
new file mode 100755
index 0000000000..da96817013
--- /dev/null
+++ b/tests/simpletest/test/acceptance_test.php
@@ -0,0 +1,1571 @@
+<?php
+// $Id: acceptance_test.php,v 1.101 2007/07/16 22:28:39 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../compatibility.php');
+require_once(dirname(__FILE__) . '/../browser.php');
+require_once(dirname(__FILE__) . '/../web_tester.php');
+require_once(dirname(__FILE__) . '/../unit_tester.php');
+
+class SimpleTestAcceptanceTest extends WebTestCase {
+ function samples() {
+ return 'http://www.lastcraft.com/test/';
+ }
+}
+
+class TestOfLiveBrowser extends UnitTestCase {
+ function samples() {
+ return SimpleTestAcceptanceTest::samples();
+ }
+
+ function testGet() {
+ $browser = &new SimpleBrowser();
+ $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ $this->assertTrue($browser->get($this->samples() . 'network_confirm.php'));
+ $this->assertPattern('/target for the SimpleTest/', $browser->getContent());
+ $this->assertPattern('/Request method.*?<dd>GET<\/dd>/', $browser->getContent());
+ $this->assertEqual($browser->getTitle(), 'Simple test target file');
+ $this->assertEqual($browser->getResponseCode(), 200);
+ $this->assertEqual($browser->getMimeType(), 'text/html');
+ }
+
+ function testPost() {
+ $browser = &new SimpleBrowser();
+ $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ $this->assertTrue($browser->post($this->samples() . 'network_confirm.php'));
+ $this->assertPattern('/target for the SimpleTest/', $browser->getContent());
+ $this->assertPattern('/Request method.*?<dd>POST<\/dd>/', $browser->getContent());
+ }
+
+ function testAbsoluteLinkFollowing() {
+ $browser = &new SimpleBrowser();
+ $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ $browser->get($this->samples() . 'link_confirm.php');
+ $this->assertTrue($browser->clickLink('Absolute'));
+ $this->assertPattern('/target for the SimpleTest/', $browser->getContent());
+ }
+
+ function testRelativeLinkFollowing() {
+ $browser = &new SimpleBrowser();
+ $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ $browser->get($this->samples() . 'link_confirm.php');
+ $this->assertTrue($browser->clickLink('Relative'));
+ $this->assertPattern('/target for the SimpleTest/', $browser->getContent());
+ }
+
+ function testUnifiedClickLinkClicking() {
+ $browser = &new SimpleBrowser();
+ $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ $browser->get($this->samples() . 'link_confirm.php');
+ $this->assertTrue($browser->click('Relative'));
+ $this->assertPattern('/target for the SimpleTest/', $browser->getContent());
+ }
+
+ function testIdLinkFollowing() {
+ $browser = &new SimpleBrowser();
+ $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ $browser->get($this->samples() . 'link_confirm.php');
+ $this->assertTrue($browser->clickLinkById(1));
+ $this->assertPattern('/target for the SimpleTest/', $browser->getContent());
+ }
+
+ function testCookieReading() {
+ $browser = &new SimpleBrowser();
+ $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ $browser->get($this->samples() . 'set_cookies.php');
+ $this->assertEqual($browser->getCurrentCookieValue('session_cookie'), 'A');
+ $this->assertEqual($browser->getCurrentCookieValue('short_cookie'), 'B');
+ $this->assertEqual($browser->getCurrentCookieValue('day_cookie'), 'C');
+ }
+
+ function testSimpleSubmit() {
+ $browser = &new SimpleBrowser();
+ $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ $browser->get($this->samples() . 'form.html');
+ $this->assertTrue($browser->clickSubmit('Go!'));
+ $this->assertPattern('/Request method.*?<dd>POST<\/dd>/', $browser->getContent());
+ $this->assertPattern('/go=\[Go!\]/', $browser->getContent());
+ }
+
+ function testUnifiedClickCanSubmit() {
+ $browser = &new SimpleBrowser();
+ $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ $browser->get($this->samples() . 'form.html');
+ $this->assertTrue($browser->click('Go!'));
+ $this->assertPattern('/go=\[Go!\]/', $browser->getContent());
+ }
+}
+
+class TestOfLiveFetching extends SimpleTestAcceptanceTest {
+ function setUp() {
+ $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ }
+
+ function testGet() {
+ $this->assertTrue($this->get($this->samples() . 'network_confirm.php'));
+ $this->assertEqual($this->getUrl(), $this->samples() . 'network_confirm.php');
+ $this->assertText('target for the SimpleTest');
+ $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
+ $this->assertTitle('Simple test target file');
+ $this->assertTitle(new PatternExpectation('/target file/'));
+ $this->assertResponse(200);
+ $this->assertMime('text/html');
+ $this->assertHeader('connection', 'close');
+ $this->assertHeader('connection', new PatternExpectation('/los/'));
+ }
+
+ function testSlowGet() {
+ $this->assertTrue($this->get($this->samples() . 'slow_page.php'));
+ }
+
+ function testTimedOutGet() {
+ $this->setConnectionTimeout(1);
+ $this->ignoreErrors();
+ $this->assertFalse($this->get($this->samples() . 'slow_page.php'));
+ }
+
+ function testPost() {
+ $this->assertTrue($this->post($this->samples() . 'network_confirm.php'));
+ $this->assertText('target for the SimpleTest');
+ $this->assertPattern('/Request method.*?<dd>POST<\/dd>/');
+ }
+
+ function testGetWithData() {
+ $this->get($this->samples() . 'network_confirm.php', array("a" => "aaa"));
+ $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
+ $this->assertText('a=[aaa]');
+ }
+
+ function testPostWithData() {
+ $this->post($this->samples() . 'network_confirm.php', array("a" => "aaa"));
+ $this->assertPattern('/Request method.*?<dd>POST<\/dd>/');
+ $this->assertText('a=[aaa]');
+ }
+
+ function testRelativeGet() {
+ $this->get($this->samples() . 'link_confirm.php');
+ $this->assertTrue($this->get('network_confirm.php'));
+ $this->assertText('target for the SimpleTest');
+ }
+
+ function testRelativePost() {
+ $this->post($this->samples() . 'link_confirm.php');
+ $this->assertTrue($this->post('network_confirm.php'));
+ $this->assertText('target for the SimpleTest');
+ }
+}
+
+class TestOfLinkFollowing extends SimpleTestAcceptanceTest {
+ function setUp() {
+ $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ }
+
+ function testLinkAssertions() {
+ $this->get($this->samples() . 'link_confirm.php');
+ $this->assertLink('Absolute', $this->samples() . 'network_confirm.php');
+ $this->assertLink('Absolute', new PatternExpectation('/confirm/'));
+ $this->assertClickable('Absolute');
+ }
+
+ function testAbsoluteLinkFollowing() {
+ $this->get($this->samples() . 'link_confirm.php');
+ $this->assertTrue($this->clickLink('Absolute'));
+ $this->assertText('target for the SimpleTest');
+ }
+
+ function testRelativeLinkFollowing() {
+ $this->get($this->samples() . 'link_confirm.php');
+ $this->assertTrue($this->clickLink('Relative'));
+ $this->assertText('target for the SimpleTest');
+ }
+
+ function testLinkIdFollowing() {
+ $this->get($this->samples() . 'link_confirm.php');
+ $this->assertLinkById(1);
+ $this->assertTrue($this->clickLinkById(1));
+ $this->assertText('target for the SimpleTest');
+ }
+
+ function testAbsoluteUrlBehavesAbsolutely() {
+ $this->get($this->samples() . 'link_confirm.php');
+ $this->get('http://www.lastcraft.com');
+ $this->assertText('No guarantee of quality is given or even intended');
+ }
+
+ function testRelativeUrlRespectsBaseTag() {
+ $this->get($this->samples() . 'base_tag/base_link.html');
+ $this->click('Back to test pages');
+ $this->assertTitle('Simple test target file');
+ }
+}
+
+class TestOfLivePageLinkingWithMinimalLinks extends SimpleTestAcceptanceTest {
+ function setUp() {
+ $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ }
+
+ function testClickToExplicitelyNamedSelfReturns() {
+ $this->get($this->samples() . 'front_controller_style/a_page.php');
+ $this->assertEqual($this->getUrl(), $this->samples() . 'front_controller_style/a_page.php');
+ $this->assertTitle('Simple test page with links');
+ $this->assertLink('Self');
+ $this->clickLink('Self');
+ $this->assertTitle('Simple test page with links');
+ }
+
+ function testClickToMissingPageReturnsToSamePage() {
+ $this->get($this->samples() . 'front_controller_style/a_page.php');
+ $this->clickLink('No page');
+ $this->assertTitle('Simple test page with links');
+ $this->assertText('[action=no_page]');
+ }
+
+ function testClickToBareActionReturnsToSamePage() {
+ $this->get($this->samples() . 'front_controller_style/a_page.php');
+ $this->clickLink('Bare action');
+ $this->assertTitle('Simple test page with links');
+ $this->assertText('[action=]');
+ }
+
+ function testClickToSingleQuestionMarkReturnsToSamePage() {
+ $this->get($this->samples() . 'front_controller_style/a_page.php');
+ $this->clickLink('Empty query');
+ $this->assertTitle('Simple test page with links');
+ }
+
+ function testClickToEmptyStringReturnsToSamePage() {
+ $this->get($this->samples() . 'front_controller_style/a_page.php');
+ $this->clickLink('Empty link');
+ $this->assertTitle('Simple test page with links');
+ }
+
+ function testClickToSingleDotGoesToCurrentDirectory() {
+ $this->get($this->samples() . 'front_controller_style/a_page.php');
+ $this->clickLink('Current directory');
+ $this->assertTitle(
+ 'Simple test front controller',
+ '%s -> index.php needs to be set as a default web server home page');
+ }
+
+ function testClickBackADirectoryLevel() {
+ $this->get($this->samples() . 'front_controller_style/');
+ $this->clickLink('Down one');
+ $this->assertPattern('|Index of .*?/test|i');
+ }
+}
+
+class TestOfLiveFrontControllerEmulation extends SimpleTestAcceptanceTest {
+ function setUp() {
+ $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ }
+
+ function testJumpToNamedPage() {
+ $this->get($this->samples() . 'front_controller_style/');
+ $this->assertText('Simple test front controller');
+ $this->clickLink('Index');
+ $this->assertResponse(200);
+ $this->assertText('[action=index]');
+ }
+
+ function testJumpToUnnamedPage() {
+ $this->get($this->samples() . 'front_controller_style/');
+ $this->clickLink('No page');
+ $this->assertResponse(200);
+ $this->assertText('Simple test front controller');
+ $this->assertText('[action=no_page]');
+ }
+
+ function testJumpToUnnamedPageWithBareParameter() {
+ $this->get($this->samples() . 'front_controller_style/');
+ $this->clickLink('Bare action');
+ $this->assertResponse(200);
+ $this->assertText('Simple test front controller');
+ $this->assertText('[action=]');
+ }
+
+ function testJumpToUnnamedPageWithEmptyQuery() {
+ $this->get($this->samples() . 'front_controller_style/');
+ $this->clickLink('Empty query');
+ $this->assertResponse(200);
+ $this->assertPattern('/Simple test front controller/');
+ $this->assertPattern('/raw get data.*?\[\].*?get data/si');
+ }
+
+ function testJumpToUnnamedPageWithEmptyLink() {
+ $this->get($this->samples() . 'front_controller_style/');
+ $this->clickLink('Empty link');
+ $this->assertResponse(200);
+ $this->assertPattern('/Simple test front controller/');
+ $this->assertPattern('/raw get data.*?\[\].*?get data/si');
+ }
+
+ function testJumpBackADirectoryLevel() {
+ $this->get($this->samples() . 'front_controller_style/');
+ $this->clickLink('Down one');
+ $this->assertPattern('|Index of .*?/test|');
+ }
+
+ function testSubmitToNamedPage() {
+ $this->get($this->samples() . 'front_controller_style/');
+ $this->assertText('Simple test front controller');
+ $this->clickSubmit('Index');
+ $this->assertResponse(200);
+ $this->assertText('[action=Index]');
+ }
+
+ function testSubmitToSameDirectory() {
+ $this->get($this->samples() . 'front_controller_style/index.php');
+ $this->clickSubmit('Same directory');
+ $this->assertResponse(200);
+ $this->assertText('[action=Same+directory]');
+ }
+
+ function testSubmitToEmptyAction() {
+ $this->get($this->samples() . 'front_controller_style/index.php');
+ $this->clickSubmit('Empty action');
+ $this->assertResponse(200);
+ $this->assertText('[action=Empty+action]');
+ }
+
+ function testSubmitToNoAction() {
+ $this->get($this->samples() . 'front_controller_style/index.php');
+ $this->clickSubmit('No action');
+ $this->assertResponse(200);
+ $this->assertText('[action=No+action]');
+ }
+
+ function testSubmitBackADirectoryLevel() {
+ $this->get($this->samples() . 'front_controller_style/');
+ $this->clickSubmit('Down one');
+ $this->assertPattern('|Index of .*?/test|');
+ }
+
+ function testSubmitToNamedPageWithMixedPostAndGet() {
+ $this->get($this->samples() . 'front_controller_style/?a=A');
+ $this->assertText('Simple test front controller');
+ $this->clickSubmit('Index post');
+ $this->assertText('action=[Index post]');
+ $this->assertNoText('[a=A]');
+ }
+
+ function testSubmitToSameDirectoryMixedPostAndGet() {
+ $this->get($this->samples() . 'front_controller_style/index.php?a=A');
+ $this->clickSubmit('Same directory post');
+ $this->assertText('action=[Same directory post]');
+ $this->assertNoText('[a=A]');
+ }
+
+ function testSubmitToEmptyActionMixedPostAndGet() {
+ $this->get($this->samples() . 'front_controller_style/index.php?a=A');
+ $this->clickSubmit('Empty action post');
+ $this->assertText('action=[Empty action post]');
+ $this->assertText('[a=A]');
+ }
+
+ function testSubmitToNoActionMixedPostAndGet() {
+ $this->get($this->samples() . 'front_controller_style/index.php?a=A');
+ $this->clickSubmit('No action post');
+ $this->assertText('action=[No action post]');
+ $this->assertText('[a=A]');
+ }
+}
+
+class TestOfLiveHeaders extends SimpleTestAcceptanceTest {
+ function setUp() {
+ $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ }
+
+ function testConfirmingHeaderExistence() {
+ $this->get('http://www.lastcraft.com/');
+ $this->assertHeader('content-type');
+ $this->assertHeader('content-type', 'text/html');
+ $this->assertHeaderPattern('content-type', '/HTML/i');
+ $this->assertNoHeader('WWW-Authenticate');
+ }
+}
+
+class TestOfLiveRedirects extends SimpleTestAcceptanceTest {
+ function setUp() {
+ $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ }
+
+ function testNoRedirects() {
+ $this->setMaximumRedirects(0);
+ $this->get($this->samples() . 'redirect.php');
+ $this->assertTitle('Redirection test');
+ }
+
+ function testRedirects() {
+ $this->setMaximumRedirects(1);
+ $this->get($this->samples() . 'redirect.php');
+ $this->assertTitle('Simple test target file');
+ }
+
+ function testRedirectLosesGetData() {
+ $this->get($this->samples() . 'redirect.php', array('a' => 'aaa'));
+ $this->assertNoText('a=[aaa]');
+ }
+
+ function testRedirectKeepsExtraRequestDataOfItsOwn() {
+ $this->get($this->samples() . 'redirect.php');
+ $this->assertText('r=[rrr]');
+ }
+
+ function testRedirectLosesPostData() {
+ $this->post($this->samples() . 'redirect.php', array('a' => 'aaa'));
+ $this->assertTitle('Simple test target file');
+ $this->assertNoText('a=[aaa]');
+ }
+
+ function testRedirectWithBaseUrlChange() {
+ $this->get($this->samples() . 'base_change_redirect.php');
+ $this->assertTitle('Simple test target file in folder');
+ $this->get($this->samples() . 'path/base_change_redirect.php');
+ $this->assertTitle('Simple test target file');
+ }
+
+ function testRedirectWithDoubleBaseUrlChange() {
+ $this->get($this->samples() . 'double_base_change_redirect.php');
+ $this->assertTitle('Simple test target file');
+ }
+}
+
+class TestOfLiveCookies extends SimpleTestAcceptanceTest {
+ function setUp() {
+ $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ }
+
+ function here() {
+ return new SimpleUrl($this->samples());
+ }
+
+ function thisHost() {
+ $here = $this->here();
+ return $here->getHost();
+ }
+
+ function thisPath() {
+ $here = $this->here();
+ return $here->getPath();
+ }
+
+ function testCookieSettingAndAssertions() {
+ $this->setCookie('a', 'Test cookie a');
+ $this->setCookie('b', 'Test cookie b', $this->thisHost());
+ $this->setCookie('c', 'Test cookie c', $this->thisHost(), $this->thisPath());
+ $this->get($this->samples() . 'network_confirm.php');
+ $this->assertText('Test cookie a');
+ $this->assertText('Test cookie b');
+ $this->assertText('Test cookie c');
+ $this->assertCookie('a');
+ $this->assertCookie('b', 'Test cookie b');
+ $this->assertTrue($this->getCookie('c') == 'Test cookie c');
+ }
+
+ function testNoCookieSetWhenCookiesDisabled() {
+ $this->setCookie('a', 'Test cookie a');
+ $this->ignoreCookies();
+ $this->get($this->samples() . 'network_confirm.php');
+ $this->assertNoText('Test cookie a');
+ }
+
+ function testCookieReading() {
+ $this->get($this->samples() . 'set_cookies.php');
+ $this->assertCookie('session_cookie', 'A');
+ $this->assertCookie('short_cookie', 'B');
+ $this->assertCookie('day_cookie', 'C');
+ }
+
+ function testNoCookieReadingWhenCookiesDisabled() {
+ $this->ignoreCookies();
+ $this->get($this->samples() . 'set_cookies.php');
+ $this->assertNoCookie('session_cookie');
+ $this->assertNoCookie('short_cookie');
+ $this->assertNoCookie('day_cookie');
+ }
+
+ function testCookiePatternAssertions() {
+ $this->get($this->samples() . 'set_cookies.php');
+ $this->assertCookie('session_cookie', new PatternExpectation('/a/i'));
+ }
+
+ function testTemporaryCookieExpiry() {
+ $this->get($this->samples() . 'set_cookies.php');
+ $this->restart();
+ $this->assertNoCookie('session_cookie');
+ $this->assertCookie('day_cookie', 'C');
+ }
+
+ function testTimedCookieExpiryWith100SecondMargin() {
+ $this->get($this->samples() . 'set_cookies.php');
+ $this->ageCookies(3600);
+ $this->restart(time() + 100);
+ $this->assertNoCookie('session_cookie');
+ $this->assertNoCookie('hour_cookie');
+ $this->assertCookie('day_cookie', 'C');
+ }
+
+ function testNoClockOverDriftBy100Seconds() {
+ $this->get($this->samples() . 'set_cookies.php');
+ $this->restart(time() + 200);
+ $this->assertNoCookie(
+ 'short_cookie',
+ '%s -> Please check your computer clock setting if you are not using NTP');
+ }
+
+ function testNoClockUnderDriftBy100Seconds() {
+ $this->get($this->samples() . 'set_cookies.php');
+ $this->restart(time() + 0);
+ $this->assertCookie(
+ 'short_cookie',
+ 'B',
+ '%s -> Please check your computer clock setting if you are not using NTP');
+ }
+
+ function testCookiePath() {
+ $this->get($this->samples() . 'set_cookies.php');
+ $this->assertNoCookie('path_cookie', 'D');
+ $this->get('./path/show_cookies.php');
+ $this->assertPattern('/path_cookie/');
+ $this->assertCookie('path_cookie', 'D');
+ }
+}
+
+class LiveTestOfForms extends SimpleTestAcceptanceTest {
+ function setUp() {
+ $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ }
+
+ function testSimpleSubmit() {
+ $this->get($this->samples() . 'form.html');
+ $this->assertTrue($this->clickSubmit('Go!'));
+ $this->assertPattern('/Request method.*?<dd>POST<\/dd>/');
+ $this->assertText('go=[Go!]');
+ }
+
+ function testDefaultFormValues() {
+ $this->get($this->samples() . 'form.html');
+ $this->assertFieldByName('a', '');
+ $this->assertFieldByName('b', 'Default text');
+ $this->assertFieldByName('c', '');
+ $this->assertFieldByName('d', 'd1');
+ $this->assertFieldByName('e', false);
+ $this->assertFieldByName('f', 'on');
+ $this->assertFieldByName('g', 'g3');
+ $this->assertFieldByName('h', 2);
+ $this->assertFieldByName('go', 'Go!');
+ $this->assertClickable('Go!');
+ $this->assertSubmit('Go!');
+ $this->assertTrue($this->clickSubmit('Go!'));
+ $this->assertText('go=[Go!]');
+ $this->assertText('a=[]');
+ $this->assertText('b=[Default text]');
+ $this->assertText('c=[]');
+ $this->assertText('d=[d1]');
+ $this->assertNoText('e=[');
+ $this->assertText('f=[on]');
+ $this->assertText('g=[g3]');
+ }
+
+ function testFormSubmissionByButtonLabel() {
+ $this->get($this->samples() . 'form.html');
+ $this->setFieldByName('a', 'aaa');
+ $this->setFieldByName('b', 'bbb');
+ $this->setFieldByName('c', 'ccc');
+ $this->setFieldByName('d', 'D2');
+ $this->setFieldByName('e', 'on');
+ $this->setFieldByName('f', false);
+ $this->setFieldByName('g', 'g2');
+ $this->setFieldByName('h', 1);
+ $this->assertTrue($this->clickSubmit('Go!'));
+ $this->assertText('a=[aaa]');
+ $this->assertText('b=[bbb]');
+ $this->assertText('c=[ccc]');
+ $this->assertText('d=[d2]');
+ $this->assertText('e=[on]');
+ $this->assertNoText('f=[');
+ $this->assertText('g=[g2]');
+ }
+
+ function testAdditionalFormValues() {
+ $this->get($this->samples() . 'form.html');
+ $this->assertTrue($this->clickSubmit('Go!', array('add' => 'A')));
+ $this->assertText('go=[Go!]');
+ $this->assertText('add=[A]');
+ }
+
+ function testFormSubmissionByName() {
+ $this->get($this->samples() . 'form.html');
+ $this->setFieldByName('a', 'A');
+ $this->assertTrue($this->clickSubmitByName('go'));
+ $this->assertText('a=[A]');
+ }
+
+ function testFormSubmissionByNameAndAdditionalParameters() {
+ $this->get($this->samples() . 'form.html');
+ $this->assertTrue($this->clickSubmitByName('go', array('add' => 'A')));
+ $this->assertText('go=[Go!]');
+ $this->assertText('add=[A]');
+ }
+
+ function testFormSubmissionBySubmitButtonLabeledSubmit() {
+ $this->get($this->samples() . 'form.html');
+ $this->assertTrue($this->clickSubmitByName('test'));
+ $this->assertText('test=[Submit]');
+ }
+
+ function testFormSubmissionWithIds() {
+ $this->get($this->samples() . 'form.html');
+ $this->assertFieldById(1, '');
+ $this->assertFieldById(2, 'Default text');
+ $this->assertFieldById(3, '');
+ $this->assertFieldById(4, 'd1');
+ $this->assertFieldById(5, false);
+ $this->assertFieldById(6, 'on');
+ $this->assertFieldById(8, 'g3');
+ $this->assertFieldById(11, 2);
+ $this->setFieldById(1, 'aaa');
+ $this->setFieldById(2, 'bbb');
+ $this->setFieldById(3, 'ccc');
+ $this->setFieldById(4, 'D2');
+ $this->setFieldById(5, 'on');
+ $this->setFieldById(6, false);
+ $this->setFieldById(8, 'g2');
+ $this->setFieldById(11, 'H1');
+ $this->assertTrue($this->clickSubmitById(99));
+ $this->assertText('a=[aaa]');
+ $this->assertText('b=[bbb]');
+ $this->assertText('c=[ccc]');
+ $this->assertText('d=[d2]');
+ $this->assertText('e=[on]');
+ $this->assertNoText('f=[');
+ $this->assertText('g=[g2]');
+ $this->assertText('h=[1]');
+ $this->assertText('go=[Go!]');
+ }
+
+ function testFormSubmissionWithLabels() {
+ $this->get($this->samples() . 'form.html');
+ $this->assertField('Text A', '');
+ $this->assertField('Text B', 'Default text');
+ $this->assertField('Text area C', '');
+ $this->assertField('Selection D', 'd1');
+ $this->assertField('Checkbox E', false);
+ $this->assertField('Checkbox F', 'on');
+ $this->assertField('3', 'g3');
+ $this->assertField('Selection H', 2);
+ $this->setField('Text A', 'aaa');
+ $this->setField('Text B', 'bbb');
+ $this->setField('Text area C', 'ccc');
+ $this->setField('Selection D', 'D2');
+ $this->setField('Checkbox E', 'on');
+ $this->setField('Checkbox F', false);
+ $this->setField('2', 'g2');
+ $this->setField('Selection H', 'H1');
+ $this->clickSubmit('Go!');
+ $this->assertText('a=[aaa]');
+ $this->assertText('b=[bbb]');
+ $this->assertText('c=[ccc]');
+ $this->assertText('d=[d2]');
+ $this->assertText('e=[on]');
+ $this->assertNoText('f=[');
+ $this->assertText('g=[g2]');
+ $this->assertText('h=[1]');
+ $this->assertText('go=[Go!]');
+ }
+
+ function testSettingCheckboxWithBooleanTrueSetsUnderlyingValue() {
+ $this->get($this->samples() . 'form.html');
+ $this->setField('Checkbox E', true);
+ $this->assertField('Checkbox E', 'on');
+ $this->clickSubmit('Go!');
+ $this->assertText('e=[on]');
+ }
+
+ function testFormSubmissionWithMixedPostAndGet() {
+ $this->get($this->samples() . 'form_with_mixed_post_and_get.html');
+ $this->setField('Text A', 'Hello');
+ $this->assertTrue($this->clickSubmit('Go!'));
+ $this->assertText('a=[Hello]');
+ $this->assertText('x=[X]');
+ $this->assertText('y=[Y]');
+ }
+
+ function testFormSubmissionWithMixedPostAndEncodedGet() {
+ $this->get($this->samples() . 'form_with_mixed_post_and_get.html');
+ $this->setField('Text B', 'Hello');
+ $this->assertTrue($this->clickSubmit('Go encoded!'));
+ $this->assertText('b=[Hello]');
+ $this->assertText('x=[X]');
+ $this->assertText('y=[Y]');
+ }
+
+ function testFormSubmissionWithoutAction() {
+ $this->get($this->samples() . 'form_without_action.php?test=test');
+ $this->assertText('_GET : [test]');
+ $this->assertTrue($this->clickSubmit('Submit Post With Empty Action'));
+ $this->assertText('_GET : [test]');
+ $this->assertText('_POST : [test]');
+ }
+
+ function testImageSubmissionByLabel() {
+ $this->get($this->samples() . 'form.html');
+ $this->assertImage('Image go!');
+ $this->assertTrue($this->clickImage('Image go!', 10, 12));
+ $this->assertText('go_x=[10]');
+ $this->assertText('go_y=[12]');
+ }
+
+ function testImageSubmissionByLabelWithAdditionalParameters() {
+ $this->get($this->samples() . 'form.html');
+ $this->assertTrue($this->clickImage('Image go!', 10, 12, array('add' => 'A')));
+ $this->assertText('add=[A]');
+ }
+
+ function testImageSubmissionByName() {
+ $this->get($this->samples() . 'form.html');
+ $this->assertTrue($this->clickImageByName('go', 10, 12));
+ $this->assertText('go_x=[10]');
+ $this->assertText('go_y=[12]');
+ }
+
+ function testImageSubmissionById() {
+ $this->get($this->samples() . 'form.html');
+ $this->assertTrue($this->clickImageById(97, 10, 12));
+ $this->assertText('go_x=[10]');
+ $this->assertText('go_y=[12]');
+ }
+
+ function testButtonSubmissionByLabel() {
+ $this->get($this->samples() . 'form.html');
+ $this->assertTrue($this->clickSubmit('Button go!', 10, 12));
+ $this->assertPattern('/go=\[ButtonGo\]/s');
+ }
+
+ function testNamelessSubmitSendsNoValue() {
+ $this->get($this->samples() . 'form_with_unnamed_submit.html');
+ $this->click('Go!');
+ $this->assertNoText('Go!');
+ $this->assertNoText('submit');
+ }
+
+ function testNamelessImageSendsXAndYValues() {
+ $this->get($this->samples() . 'form_with_unnamed_submit.html');
+ $this->clickImage('Image go!', 4, 5);
+ $this->assertNoText('ImageGo');
+ $this->assertText('x=[4]');
+ $this->assertText('y=[5]');
+ }
+
+ function testNamelessButtonSendsNoValue() {
+ $this->get($this->samples() . 'form_with_unnamed_submit.html');
+ $this->click('Button Go!');
+ $this->assertNoText('ButtonGo');
+ }
+
+ function testSelfSubmit() {
+ $this->get($this->samples() . 'self_form.php');
+ $this->assertNoText('[Submitted]');
+ $this->assertNoText('[Wrong form]');
+ $this->assertTrue($this->clickSubmit());
+ $this->assertText('[Submitted]');
+ $this->assertNoText('[Wrong form]');
+ $this->assertTitle('Test of form self submission');
+ }
+
+ function testSelfSubmitWithParameters() {
+ $this->get($this->samples() . 'self_form.php');
+ $this->setFieldByName('visible', 'Resent');
+ $this->assertTrue($this->clickSubmit());
+ $this->assertText('[Resent]');
+ }
+
+ function testSettingOfBlankOption() {
+ $this->get($this->samples() . 'form.html');
+ $this->assertTrue($this->setFieldByName('d', ''));
+ $this->clickSubmit('Go!');
+ $this->assertText('d=[]');
+ }
+
+ function testAssertingFieldValueWithPattern() {
+ $this->get($this->samples() . 'form.html');
+ $this->setField('c', 'A very long string');
+ $this->assertField('c', new PatternExpectation('/very long/'));
+ }
+
+ function testSendingMultipartFormDataEncodedForm() {
+ $this->get($this->samples() . 'form_data_encoded_form.html');
+ $this->assertField('Text A', '');
+ $this->assertField('Text B', 'Default text');
+ $this->assertField('Text area C', '');
+ $this->assertField('Selection D', 'd1');
+ $this->assertField('Checkbox E', false);
+ $this->assertField('Checkbox F', 'on');
+ $this->assertField('3', 'g3');
+ $this->assertField('Selection H', 2);
+ $this->setField('Text A', 'aaa');
+ $this->setField('Text B', 'bbb');
+ $this->setField('Text area C', 'ccc');
+ $this->setField('Selection D', 'D2');
+ $this->setField('Checkbox E', 'on');
+ $this->setField('Checkbox F', false);
+ $this->setField('2', 'g2');
+ $this->setField('Selection H', 'H1');
+ $this->assertTrue($this->clickSubmit('Go!'));
+ $this->assertText('a=[aaa]');
+ $this->assertText('b=[bbb]');
+ $this->assertText('c=[ccc]');
+ $this->assertText('d=[d2]');
+ $this->assertText('e=[on]');
+ $this->assertNoText('f=[');
+ $this->assertText('g=[g2]');
+ $this->assertText('h=[1]');
+ $this->assertText('go=[Go!]');
+ }
+
+ function testSettingVariousBlanksInFields() {
+ $this->get($this->samples() . 'form_with_false_defaults.html');
+ $this->assertField('Text A', '');
+ $this->setField('Text A', '0');
+ $this->assertField('Text A', '0');
+ $this->assertField('Text area B', '');
+ $this->setField('Text area B', '0');
+ $this->assertField('Text area B', '0');
+ $this->assertField('Text area C', " ");
+ $this->assertField('Selection D', '');
+ $this->setField('Selection D', 'D2');
+ $this->assertField('Selection D', 'D2');
+ $this->setField('Selection D', 'D3');
+ $this->assertField('Selection D', '0');
+ $this->setField('Selection D', 'D4');
+ $this->assertField('Selection D', '?');
+ $this->assertField('Checkbox E', '');
+ $this->assertField('Checkbox F', 'on');
+ $this->assertField('Checkbox G', '0');
+ $this->assertField('Checkbox H', '?');
+ $this->assertFieldByName('i', 'on');
+ $this->setFieldByName('i', '');
+ $this->assertFieldByName('i', '');
+ $this->setFieldByName('i', '0');
+ $this->assertFieldByName('i', '0');
+ $this->setFieldByName('i', '?');
+ $this->assertFieldByName('i', '?');
+ }
+
+ function testSubmissionOfBlankFields() {
+ $this->get($this->samples() . 'form_with_false_defaults.html');
+ $this->setField('Text A', '');
+ $this->setField('Text area B', '');
+ $this->setFieldByName('i', '');
+ $this->click('Go!');
+ $this->assertText('a=[]');
+ $this->assertText('b=[]');
+ $this->assertPattern('/c=\[ \]/');
+ $this->assertText('d=[]');
+ $this->assertText('e=[]');
+ $this->assertText('i=[]');
+ }
+
+ function testSubmissionOfEmptyValues() {
+ $this->get($this->samples() . 'form_with_false_defaults.html');
+ $this->setField('Selection D', 'D2');
+ $this->click('Go!');
+ $this->assertText('a=[]');
+ $this->assertText('b=[]');
+ $this->assertText('d=[D2]');
+ $this->assertText('f=[on]');
+ $this->assertText('i=[on]');
+ }
+
+ function testSubmissionOfZeroes() {
+ $this->get($this->samples() . 'form_with_false_defaults.html');
+ $this->setField('Text A', '0');
+ $this->setField('Text area B', '0');
+ $this->setField('Selection D', 'D3');
+ $this->setFieldByName('i', '0');
+ $this->click('Go!');
+ $this->assertText('a=[0]');
+ $this->assertText('b=[0]');
+ $this->assertText('d=[0]');
+ $this->assertText('g=[0]');
+ $this->assertText('i=[0]');
+ }
+
+ function testSubmissionOfQuestionMarks() {
+ $this->get($this->samples() . 'form_with_false_defaults.html');
+ $this->setField('Text A', '?');
+ $this->setField('Text area B', '?');
+ $this->setField('Selection D', 'D4');
+ $this->setFieldByName('i', '?');
+ $this->click('Go!');
+ $this->assertText('a=[?]');
+ $this->assertText('b=[?]');
+ $this->assertText('d=[?]');
+ $this->assertText('h=[?]');
+ $this->assertText('i=[?]');
+ }
+
+ function testSubmissionOfHtmlEncodedValues() {
+ $this->get($this->samples() . 'form_with_tricky_defaults.html');
+ $this->assertField('Text A', '&\'"<>');
+ $this->assertField('Text B', '"');
+ $this->assertField('Text area C', '&\'"<>');
+ $this->assertField('Selection D', "'");
+ $this->assertField('Checkbox E', '&\'"<>');
+ $this->assertField('Checkbox F', false);
+ $this->assertFieldByname('i', "'");
+ $this->click('Go!');
+ $this->assertText('a=[&\'"<>, "]');
+ $this->assertText('c=[&\'"<>]');
+ $this->assertText("d=[']");
+ $this->assertText('e=[&\'"<>]');
+ $this->assertText("i=[']");
+ }
+
+ function testFormActionRespectsBaseTag() {
+ $this->get($this->samples() . 'base_tag/form.html');
+ $this->assertTrue($this->clickSubmit('Go!'));
+ $this->assertText('go=[Go!]');
+ $this->assertText('a=[]');
+ }
+}
+
+class TestOfLiveMultiValueWidgets extends SimpleTestAcceptanceTest {
+ function setUp() {
+ $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ }
+
+ function testDefaultFormValueSubmission() {
+ $this->get($this->samples() . 'multiple_widget_form.html');
+ $this->assertFieldByName('a', array('a2', 'a3'));
+ $this->assertFieldByName('b', array('b2', 'b3'));
+ $this->assertFieldByName('c[]', array('c2', 'c3'));
+ $this->assertFieldByName('d', array('2', '3'));
+ $this->assertFieldByName('e', array('2', '3'));
+ $this->assertTrue($this->clickSubmit('Go!'));
+ $this->assertText('a=[a2, a3]');
+ $this->assertText('b=[b2, b3]');
+ $this->assertText('c=[c2, c3]');
+ $this->assertText('d=[2, 3]');
+ $this->assertText('e=[2, 3]');
+ }
+
+ function testSubmittingMultipleValues() {
+ $this->get($this->samples() . 'multiple_widget_form.html');
+ $this->setFieldByName('a', array('a1', 'a4'));
+ $this->assertFieldByName('a', array('a1', 'a4'));
+ $this->assertFieldByName('a', array('a4', 'a1'));
+ $this->setFieldByName('b', array('b1', 'b4'));
+ $this->assertFieldByName('b', array('b1', 'b4'));
+ $this->setFieldByName('c[]', array('c1', 'c4'));
+ $this->assertField('c[]', array('c1', 'c4'));
+ $this->setFieldByName('d', array('1', '4'));
+ $this->assertField('d', array('1', '4'));
+ $this->setFieldByName('e', array('e1', 'e4'));
+ $this->assertField('e', array('1', '4'));
+ $this->assertTrue($this->clickSubmit('Go!'));
+ $this->assertText('a=[a1, a4]');
+ $this->assertText('b=[b1, b4]');
+ $this->assertText('c=[c1, c4]');
+ $this->assertText('d=[1, 4]');
+ $this->assertText('e=[1, 4]');
+ }
+
+ function testSettingByOptionValue() {
+ $this->get($this->samples() . 'multiple_widget_form.html');
+ $this->setFieldByName('d', array('1', '4'));
+ $this->assertField('d', array('1', '4'));
+ $this->assertTrue($this->clickSubmit('Go!'));
+ $this->assertText('d=[1, 4]');
+ }
+
+ function testSubmittingMultipleValuesByLabel() {
+ $this->get($this->samples() . 'multiple_widget_form.html');
+ $this->setField('Multiple selection A', array('a1', 'a4'));
+ $this->assertField('Multiple selection A', array('a1', 'a4'));
+ $this->assertField('Multiple selection A', array('a4', 'a1'));
+ $this->setField('multiple selection C', array('c1', 'c4'));
+ $this->assertField('multiple selection C', array('c1', 'c4'));
+ $this->assertTrue($this->clickSubmit('Go!'));
+ $this->assertText('a=[a1, a4]');
+ $this->assertText('c=[c1, c4]');
+ }
+
+ function testSavantStyleHiddenFieldDefaults() {
+ $this->get($this->samples() . 'savant_style_form.html');
+ $this->assertFieldByName('a', array('a0'));
+ $this->assertFieldByName('b', array('b0'));
+ $this->assertTrue($this->clickSubmit('Go!'));
+ $this->assertText('a=[a0]');
+ $this->assertText('b=[b0]');
+ }
+
+ function testSavantStyleHiddenDefaultsAreOverridden() {
+ $this->get($this->samples() . 'savant_style_form.html');
+ $this->assertTrue($this->setFieldByName('a', array('a1')));
+ $this->assertTrue($this->setFieldByName('b', 'b1'));
+ $this->assertTrue($this->clickSubmit('Go!'));
+ $this->assertText('a=[a1]');
+ $this->assertText('b=[b1]');
+ }
+
+ function testSavantStyleFormSettingById() {
+ $this->get($this->samples() . 'savant_style_form.html');
+ $this->assertFieldById(1, array('a0'));
+ $this->assertFieldById(4, array('b0'));
+ $this->assertTrue($this->setFieldById(2, 'a1'));
+ $this->assertTrue($this->setFieldById(5, 'b1'));
+ $this->assertTrue($this->clickSubmitById(99));
+ $this->assertText('a=[a1]');
+ $this->assertText('b=[b1]');
+ }
+}
+
+class TestOfFileUploads extends SimpleTestAcceptanceTest {
+ function setUp() {
+ $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ }
+
+ function testSingleFileUpload() {
+ $this->get($this->samples() . 'upload_form.html');
+ $this->assertTrue($this->setField('Content:',
+ dirname(__FILE__) . '/support/upload_sample.txt'));
+ $this->assertField('Content:', dirname(__FILE__) . '/support/upload_sample.txt');
+ $this->click('Go!');
+ $this->assertText('Sample for testing file upload');
+ }
+
+ function testMultipleFileUpload() {
+ $this->get($this->samples() . 'upload_form.html');
+ $this->assertTrue($this->setField('Content:',
+ dirname(__FILE__) . '/support/upload_sample.txt'));
+ $this->assertTrue($this->setField('Supplemental:',
+ dirname(__FILE__) . '/support/supplementary_upload_sample.txt'));
+ $this->assertField('Supplemental:',
+ dirname(__FILE__) . '/support/supplementary_upload_sample.txt');
+ $this->click('Go!');
+ $this->assertText('Sample for testing file upload');
+ $this->assertText('Some more text content');
+ }
+
+ function testBinaryFileUpload() {
+ $this->get($this->samples() . 'upload_form.html');
+ $this->assertTrue($this->setField('Content:',
+ dirname(__FILE__) . '/support/latin1_sample'));
+ $this->click('Go!');
+ $this->assertText(
+ implode('', file(dirname(__FILE__) . '/support/latin1_sample')));
+ }
+}
+
+class TestOfLiveHistoryNavigation extends SimpleTestAcceptanceTest {
+ function setUp() {
+ $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ }
+
+ function testRetry() {
+ $this->get($this->samples() . 'cookie_based_counter.php');
+ $this->assertPattern('/count: 1/i');
+ $this->retry();
+ $this->assertPattern('/count: 2/i');
+ $this->retry();
+ $this->assertPattern('/count: 3/i');
+ }
+
+ function testOfBackButton() {
+ $this->get($this->samples() . '1.html');
+ $this->clickLink('2');
+ $this->assertTitle('2');
+ $this->assertTrue($this->back());
+ $this->assertTitle('1');
+ $this->assertTrue($this->forward());
+ $this->assertTitle('2');
+ $this->assertFalse($this->forward());
+ }
+
+ function testGetRetryResubmitsData() {
+ $this->assertTrue($this->get(
+ $this->samples() . 'network_confirm.php?a=aaa'));
+ $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
+ $this->assertText('a=[aaa]');
+ $this->retry();
+ $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
+ $this->assertText('a=[aaa]');
+ }
+
+ function testGetRetryResubmitsExtraData() {
+ $this->assertTrue($this->get(
+ $this->samples() . 'network_confirm.php',
+ array('a' => 'aaa')));
+ $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
+ $this->assertText('a=[aaa]');
+ $this->retry();
+ $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
+ $this->assertText('a=[aaa]');
+ }
+
+ function testPostRetryResubmitsData() {
+ $this->assertTrue($this->post(
+ $this->samples() . 'network_confirm.php',
+ array('a' => 'aaa')));
+ $this->assertPattern('/Request method.*?<dd>POST<\/dd>/');
+ $this->assertText('a=[aaa]');
+ $this->retry();
+ $this->assertPattern('/Request method.*?<dd>POST<\/dd>/');
+ $this->assertText('a=[aaa]');
+ }
+
+ function testGetRetryResubmitsRepeatedData() {
+ $this->assertTrue($this->get(
+ $this->samples() . 'network_confirm.php?a=1&a=2'));
+ $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
+ $this->assertText('a=[1, 2]');
+ $this->retry();
+ $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
+ $this->assertText('a=[1, 2]');
+ }
+}
+
+class TestOfLiveAuthentication extends SimpleTestAcceptanceTest {
+ function setUp() {
+ $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ }
+
+ function testChallengeFromProtectedPage() {
+ $this->get($this->samples() . 'protected/');
+ $this->assertResponse(401);
+ $this->assertAuthentication('Basic');
+ $this->assertRealm('SimpleTest basic authentication');
+ $this->assertRealm(new PatternExpectation('/simpletest/i'));
+ $this->authenticate('test', 'secret');
+ $this->assertResponse(200);
+ $this->retry();
+ $this->assertResponse(200);
+ }
+
+ function testTrailingSlashImpliedWithinRealm() {
+ $this->get($this->samples() . 'protected/');
+ $this->authenticate('test', 'secret');
+ $this->assertResponse(200);
+ $this->get($this->samples() . 'protected');
+ $this->assertResponse(200);
+ }
+
+ function testTrailingSlashImpliedSettingRealm() {
+ $this->get($this->samples() . 'protected');
+ $this->authenticate('test', 'secret');
+ $this->assertResponse(200);
+ $this->get($this->samples() . 'protected/');
+ $this->assertResponse(200);
+ }
+
+ function testEncodedAuthenticationFetchesPage() {
+ $this->get('http://test:secret@www.lastcraft.com/test/protected/');
+ $this->assertResponse(200);
+ }
+
+ function testEncodedAuthenticationFetchesPageAfterTrailingSlashRedirect() {
+ $this->get('http://test:secret@www.lastcraft.com/test/protected');
+ $this->assertResponse(200);
+ }
+
+ function testRealmExtendsToWholeDirectory() {
+ $this->get($this->samples() . 'protected/1.html');
+ $this->authenticate('test', 'secret');
+ $this->clickLink('2');
+ $this->assertResponse(200);
+ $this->clickLink('3');
+ $this->assertResponse(200);
+ }
+
+ function testRedirectKeepsAuthentication() {
+ $this->get($this->samples() . 'protected/local_redirect.php');
+ $this->authenticate('test', 'secret');
+ $this->assertTitle('Simple test target file');
+ }
+
+ function testRedirectKeepsEncodedAuthentication() {
+ $this->get('http://test:secret@www.lastcraft.com/test/protected/local_redirect.php');
+ $this->assertResponse(200);
+ $this->assertTitle('Simple test target file');
+ }
+
+ function testSessionRestartLosesAuthentication() {
+ $this->get($this->samples() . 'protected/');
+ $this->authenticate('test', 'secret');
+ $this->assertResponse(200);
+ $this->restart();
+ $this->get($this->samples() . 'protected/');
+ $this->assertResponse(401);
+ }
+}
+
+class TestOfLoadingFrames extends SimpleTestAcceptanceTest {
+ function setUp() {
+ $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ }
+
+ function testNoFramesContentWhenFramesDisabled() {
+ $this->ignoreFrames();
+ $this->get($this->samples() . 'one_page_frameset.html');
+ $this->assertTitle('Frameset for testing of SimpleTest');
+ $this->assertText('This content is for no frames only');
+ }
+
+ function testPatternMatchCanReadTheOnlyFrame() {
+ $this->get($this->samples() . 'one_page_frameset.html');
+ $this->assertText('A target for the SimpleTest test suite');
+ $this->assertNoText('This content is for no frames only');
+ }
+
+ function testMessyFramesetResponsesByName() {
+ $this->assertTrue($this->get(
+ $this->samples() . 'messy_frameset.html'));
+ $this->assertTitle('Frameset for testing of SimpleTest');
+
+ $this->assertTrue($this->setFrameFocus('Front controller'));
+ $this->assertResponse(200);
+ $this->assertText('Simple test front controller');
+
+ $this->assertTrue($this->setFrameFocus('One'));
+ $this->assertResponse(200);
+ $this->assertLink('2');
+
+ $this->assertTrue($this->setFrameFocus('Frame links'));
+ $this->assertResponse(200);
+ $this->assertLink('Set one to 2');
+
+ $this->assertTrue($this->setFrameFocus('Counter'));
+ $this->assertResponse(200);
+ $this->assertText('Count: 1');
+
+ $this->assertTrue($this->setFrameFocus('Redirected'));
+ $this->assertResponse(200);
+ $this->assertText('r=rrr');
+
+ $this->assertTrue($this->setFrameFocus('Protected'));
+ $this->assertResponse(401);
+
+ $this->assertTrue($this->setFrameFocus('Protected redirect'));
+ $this->assertResponse(401);
+
+ $this->assertTrue($this->setFrameFocusByIndex(1));
+ $this->assertResponse(200);
+ $this->assertText('Simple test front controller');
+
+ $this->assertTrue($this->setFrameFocusByIndex(2));
+ $this->assertResponse(200);
+ $this->assertLink('2');
+
+ $this->assertTrue($this->setFrameFocusByIndex(3));
+ $this->assertResponse(200);
+ $this->assertLink('Set one to 2');
+
+ $this->assertTrue($this->setFrameFocusByIndex(4));
+ $this->assertResponse(200);
+ $this->assertText('Count: 1');
+
+ $this->assertTrue($this->setFrameFocusByIndex(5));
+ $this->assertResponse(200);
+ $this->assertText('r=rrr');
+
+ $this->assertTrue($this->setFrameFocusByIndex(6));
+ $this->assertResponse(401);
+
+ $this->assertTrue($this->setFrameFocusByIndex(7));
+ }
+
+ function testReloadingFramesetPage() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->assertText('Count: 1');
+ $this->retry();
+ $this->assertText('Count: 2');
+ $this->retry();
+ $this->assertText('Count: 3');
+ }
+
+ function testReloadingSingleFrameWithCookieCounter() {
+ $this->get($this->samples() . 'counting_frameset.html');
+ $this->setFrameFocus('a');
+ $this->assertText('Count: 1');
+ $this->setFrameFocus('b');
+ $this->assertText('Count: 2');
+
+ $this->setFrameFocus('a');
+ $this->retry();
+ $this->assertText('Count: 3');
+ $this->retry();
+ $this->assertText('Count: 4');
+ $this->setFrameFocus('b');
+ $this->assertText('Count: 2');
+ }
+
+ function testReloadingFrameWhenUnfocusedReloadsWholeFrameset() {
+ $this->get($this->samples() . 'counting_frameset.html');
+ $this->setFrameFocus('a');
+ $this->assertText('Count: 1');
+ $this->setFrameFocus('b');
+ $this->assertText('Count: 2');
+
+ $this->clearFrameFocus('a');
+ $this->retry();
+
+ $this->assertTitle('Frameset for testing of SimpleTest');
+ $this->setFrameFocus('a');
+ $this->assertText('Count: 3');
+ $this->setFrameFocus('b');
+ $this->assertText('Count: 4');
+ }
+
+ function testClickingNormalLinkReplacesJustThatFrame() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->clickLink('2');
+ $this->assertLink('3');
+ $this->assertText('Simple test front controller');
+ }
+
+ function testJumpToNamedPageReplacesJustThatFrame() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->assertPattern('/Simple test front controller/');
+ $this->clickLink('Index');
+ $this->assertResponse(200);
+ $this->assertText('[action=index]');
+ $this->assertText('Count: 1');
+ }
+
+ function testJumpToUnnamedPageReplacesJustThatFrame() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->clickLink('No page');
+ $this->assertResponse(200);
+ $this->assertText('Simple test front controller');
+ $this->assertText('[action=no_page]');
+ $this->assertText('Count: 1');
+ }
+
+ function testJumpToUnnamedPageWithBareParameterReplacesJustThatFrame() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->clickLink('Bare action');
+ $this->assertResponse(200);
+ $this->assertText('Simple test front controller');
+ $this->assertText('[action=]');
+ $this->assertText('Count: 1');
+ }
+
+ function testJumpToUnnamedPageWithEmptyQueryReplacesJustThatFrame() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->clickLink('Empty query');
+ $this->assertResponse(200);
+ $this->assertPattern('/Simple test front controller/');
+ $this->assertPattern('/raw get data.*?\[\].*?get data/si');
+ $this->assertPattern('/Count: 1/');
+ }
+
+ function testJumpToUnnamedPageWithEmptyLinkReplacesJustThatFrame() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->clickLink('Empty link');
+ $this->assertResponse(200);
+ $this->assertPattern('/Simple test front controller/');
+ $this->assertPattern('/raw get data.*?\[\].*?get data/si');
+ $this->assertPattern('/Count: 1/');
+ }
+
+ function testJumpBackADirectoryLevelReplacesJustThatFrame() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->clickLink('Down one');
+ $this->assertPattern('/index of \/test/i');
+ $this->assertPattern('/Count: 1/');
+ }
+
+ function testSubmitToNamedPageReplacesJustThatFrame() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->assertPattern('/Simple test front controller/');
+ $this->clickSubmit('Index');
+ $this->assertResponse(200);
+ $this->assertText('[action=Index]');
+ $this->assertText('Count: 1');
+ }
+
+ function testSubmitToSameDirectoryReplacesJustThatFrame() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->clickSubmit('Same directory');
+ $this->assertResponse(200);
+ $this->assertText('[action=Same+directory]');
+ $this->assertText('Count: 1');
+ }
+
+ function testSubmitToEmptyActionReplacesJustThatFrame() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->clickSubmit('Empty action');
+ $this->assertResponse(200);
+ $this->assertText('[action=Empty+action]');
+ $this->assertText('Count: 1');
+ }
+
+ function testSubmitToNoActionReplacesJustThatFrame() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->clickSubmit('No action');
+ $this->assertResponse(200);
+ $this->assertText('[action=No+action]');
+ $this->assertText('Count: 1');
+ }
+
+ function testSubmitBackADirectoryLevelReplacesJustThatFrame() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->clickSubmit('Down one');
+ $this->assertPattern('/index of \/test/i');
+ $this->assertPattern('/Count: 1/');
+ }
+
+ function testTopLinkExitsFrameset() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->clickLink('Exit the frameset');
+ $this->assertTitle('Simple test target file');
+ }
+
+ function testLinkInOnePageCanLoadAnother() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->assertNoLink('3');
+ $this->clickLink('Set one to 2');
+ $this->assertLink('3');
+ $this->assertNoLink('2');
+ $this->assertTitle('Frameset for testing of SimpleTest');
+ }
+
+ function testFrameWithRelativeLinksRespectsBaseTagForThatPage() {
+ $this->get($this->samples() . 'base_tag/frameset.html');
+ $this->click('Back to test pages');
+ $this->assertTitle('Frameset for testing of SimpleTest');
+ $this->assertText('A target for the SimpleTest test suite');
+ }
+
+ function testRelativeLinkInFrameIsNotAffectedByFramesetBaseTag() {
+ $this->get($this->samples() . 'base_tag/frameset_with_base_tag.html');
+ $this->assertText('This is page 1');
+ $this->click('To page 2');
+ $this->assertTitle('Frameset for testing of SimpleTest');
+ $this->assertText('This is page 2');
+ }
+}
+
+class TestOfFrameAuthentication extends SimpleTestAcceptanceTest {
+ function setUp() {
+ $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ }
+
+ function testUnauthenticatedFrameSendsChallenge() {
+ $this->get($this->samples() . 'protected/');
+ $this->setFrameFocus('Protected');
+ $this->assertAuthentication('Basic');
+ $this->assertRealm('SimpleTest basic authentication');
+ $this->assertResponse(401);
+ }
+
+ function testCanReadFrameFromAlreadyAuthenticatedRealm() {
+ $this->get($this->samples() . 'protected/');
+ $this->authenticate('test', 'secret');
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->setFrameFocus('Protected');
+ $this->assertResponse(200);
+ $this->assertText('A target for the SimpleTest test suite');
+ }
+
+ function testCanAuthenticateFrame() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->setFrameFocus('Protected');
+ $this->authenticate('test', 'secret');
+ $this->assertResponse(200);
+ $this->assertText('A target for the SimpleTest test suite');
+ $this->clearFrameFocus();
+ $this->assertText('Count: 1');
+ }
+
+ function testCanAuthenticateRedirectedFrame() {
+ $this->get($this->samples() . 'messy_frameset.html');
+ $this->setFrameFocus('Protected redirect');
+ $this->assertResponse(401);
+ $this->authenticate('test', 'secret');
+ $this->assertResponse(200);
+ $this->assertText('A target for the SimpleTest test suite');
+ $this->clearFrameFocus();
+ $this->assertText('Count: 1');
+ }
+}
+
+class TestOfNestedFrames extends SimpleTestAcceptanceTest {
+ function setUp() {
+ $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
+ }
+
+ function testCanNavigateToSpecificContent() {
+ $this->get($this->samples() . 'nested_frameset.html');
+ $this->assertTitle('Nested frameset for testing of SimpleTest');
+
+ $this->assertPattern('/This is frame A/');
+ $this->assertPattern('/This is frame B/');
+ $this->assertPattern('/Simple test front controller/');
+ $this->assertLink('2');
+ $this->assertLink('Set one to 2');
+ $this->assertPattern('/Count: 1/');
+ $this->assertPattern('/r=rrr/');
+
+ $this->setFrameFocus('pair');
+ $this->assertPattern('/This is frame A/');
+ $this->assertPattern('/This is frame B/');
+ $this->assertNoPattern('/Simple test front controller/');
+ $this->assertNoLink('2');
+
+ $this->setFrameFocus('aaa');
+ $this->assertPattern('/This is frame A/');
+ $this->assertNoPattern('/This is frame B/');
+
+ $this->clearFrameFocus();
+ $this->assertResponse(200);
+ $this->setFrameFocus('messy');
+ $this->assertResponse(200);
+ $this->setFrameFocus('Front controller');
+ $this->assertResponse(200);
+ $this->assertPattern('/Simple test front controller/');
+ $this->assertNoLink('2');
+ }
+
+ function testReloadingFramesetPage() {
+ $this->get($this->samples() . 'nested_frameset.html');
+ $this->assertPattern('/Count: 1/');
+ $this->retry();
+ $this->assertPattern('/Count: 2/');
+ $this->retry();
+ $this->assertPattern('/Count: 3/');
+ }
+
+ function testRetryingNestedPageOnlyRetriesThatSet() {
+ $this->get($this->samples() . 'nested_frameset.html');
+ $this->assertPattern('/Count: 1/');
+ $this->setFrameFocus('messy');
+ $this->retry();
+ $this->assertPattern('/Count: 2/');
+ $this->setFrameFocus('Counter');
+ $this->retry();
+ $this->assertPattern('/Count: 3/');
+
+ $this->clearFrameFocus();
+ $this->setFrameFocus('messy');
+ $this->setFrameFocus('Front controller');
+ $this->retry();
+
+ $this->clearFrameFocus();
+ $this->assertPattern('/Count: 3/');
+ }
+
+ function testAuthenticatingNestedPage() {
+ $this->get($this->samples() . 'nested_frameset.html');
+ $this->setFrameFocus('messy');
+ $this->setFrameFocus('Protected');
+ $this->assertAuthentication('Basic');
+ $this->assertRealm('SimpleTest basic authentication');
+ $this->assertResponse(401);
+
+ $this->authenticate('test', 'secret');
+ $this->assertResponse(200);
+ $this->assertPattern('/A target for the SimpleTest test suite/');
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/adapter_test.php b/tests/simpletest/test/adapter_test.php
new file mode 100755
index 0000000000..177886be4f
--- /dev/null
+++ b/tests/simpletest/test/adapter_test.php
@@ -0,0 +1,77 @@
+<?php
+// $Id: adapter_test.php,v 1.10 2007/04/30 23:39:59 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../extensions/pear_test_case.php');
+require_once(dirname(__FILE__) . '/../extensions/phpunit_test_case.php');
+
+class SameTestClass {
+}
+
+class TestOfPearAdapter extends PHPUnit_TestCase {
+
+ function testBoolean() {
+ $this->assertTrue(true, "PEAR true");
+ $this->assertFalse(false, "PEAR false");
+ }
+
+ function testName() {
+ $this->assertTrue($this->getName() == get_class($this));
+ }
+
+ function testPass() {
+ $this->pass("PEAR pass");
+ }
+
+ function testNulls() {
+ $value = null;
+ $this->assertNull($value, "PEAR null");
+ $value = 0;
+ $this->assertNotNull($value, "PEAR not null");
+ }
+
+ function testType() {
+ $this->assertType("Hello", "string", "PEAR type");
+ }
+
+ function testEquals() {
+ $this->assertEquals(12, 12, "PEAR identity");
+ $this->setLooselyTyped(true);
+ $this->assertEquals("12", 12, "PEAR equality");
+ }
+
+ function testSame() {
+ $same = &new SameTestClass();
+ $this->assertSame($same, $same, "PEAR same");
+ }
+
+ function testRegExp() {
+ $this->assertRegExp('/hello/', "A big hello from me", "PEAR regex");
+ }
+}
+
+class TestOfPhpUnitAdapter extends TestCase {
+ function TestOfPhpUnitAdapter() {
+ $this->TestCase('TestOfPhpUnitAdapter');
+ }
+
+ function testBoolean() {
+ $this->assert(true, 'PHP Unit true');
+ }
+
+ function testName() {
+ $this->assert($this->name() == 'TestOfPhpUnitAdapter');
+ }
+
+ function testEquals() {
+ $this->assertEquals(12, 12, 'PHP Unit equality');
+ }
+
+ function testMultilineEquals() {
+ $this->assertEquals("a\nb\n", "a\nb\n", 'PHP Unit equality');
+ }
+
+ function testRegExp() {
+ $this->assertRegexp('/hello/', 'A big hello from me', 'PHPUnit regex');
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/all_tests.php b/tests/simpletest/test/all_tests.php
new file mode 100755
index 0000000000..99ce9451e3
--- /dev/null
+++ b/tests/simpletest/test/all_tests.php
@@ -0,0 +1,13 @@
+<?php
+require_once(dirname(__FILE__) . '/../autorun.php');
+
+class AllTests extends TestSuite {
+ function AllTests() {
+ $this->TestSuite('All tests for SimpleTest ' . SimpleTest::getVersion());
+ $this->addFile(dirname(__FILE__) . '/unit_tests.php');
+ $this->addFile(dirname(__FILE__) . '/shell_test.php');
+ $this->addFile(dirname(__FILE__) . '/live_test.php');
+ $this->addFile(dirname(__FILE__) . '/acceptance_test.php');
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/authentication_test.php b/tests/simpletest/test/authentication_test.php
new file mode 100755
index 0000000000..782af17b56
--- /dev/null
+++ b/tests/simpletest/test/authentication_test.php
@@ -0,0 +1,145 @@
+<?php
+// $Id: authentication_test.php,v 1.11 2007/04/30 23:39:59 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../authentication.php');
+require_once(dirname(__FILE__) . '/../http.php');
+Mock::generate('SimpleHttpRequest');
+
+class TestOfRealm extends UnitTestCase {
+
+ function testWithinSameUrl() {
+ $realm = &new SimpleRealm(
+ 'Basic',
+ new SimpleUrl('http://www.here.com/path/hello.html'));
+ $this->assertTrue($realm->isWithin(
+ new SimpleUrl('http://www.here.com/path/hello.html')));
+ }
+
+ function testInsideWithLongerUrl() {
+ $realm = &new SimpleRealm(
+ 'Basic',
+ new SimpleUrl('http://www.here.com/path/'));
+ $this->assertTrue($realm->isWithin(
+ new SimpleUrl('http://www.here.com/path/hello.html')));
+ }
+
+ function testBelowRootIsOutside() {
+ $realm = &new SimpleRealm(
+ 'Basic',
+ new SimpleUrl('http://www.here.com/path/'));
+ $this->assertTrue($realm->isWithin(
+ new SimpleUrl('http://www.here.com/path/more/hello.html')));
+ }
+
+ function testOldNetscapeDefinitionIsOutside() {
+ $realm = &new SimpleRealm(
+ 'Basic',
+ new SimpleUrl('http://www.here.com/path/'));
+ $this->assertFalse($realm->isWithin(
+ new SimpleUrl('http://www.here.com/pathmore/hello.html')));
+ }
+
+ function testInsideWithMissingTrailingSlash() {
+ $realm = &new SimpleRealm(
+ 'Basic',
+ new SimpleUrl('http://www.here.com/path/'));
+ $this->assertTrue($realm->isWithin(
+ new SimpleUrl('http://www.here.com/path')));
+ }
+
+ function testDifferentPageNameStillInside() {
+ $realm = &new SimpleRealm(
+ 'Basic',
+ new SimpleUrl('http://www.here.com/path/hello.html'));
+ $this->assertTrue($realm->isWithin(
+ new SimpleUrl('http://www.here.com/path/goodbye.html')));
+ }
+
+ function testNewUrlInSameDirectoryDoesNotChangeRealm() {
+ $realm = &new SimpleRealm(
+ 'Basic',
+ new SimpleUrl('http://www.here.com/path/hello.html'));
+ $realm->stretch(new SimpleUrl('http://www.here.com/path/goodbye.html'));
+ $this->assertTrue($realm->isWithin(
+ new SimpleUrl('http://www.here.com/path/index.html')));
+ $this->assertFalse($realm->isWithin(
+ new SimpleUrl('http://www.here.com/index.html')));
+ }
+
+ function testNewUrlMakesRealmTheCommonPath() {
+ $realm = &new SimpleRealm(
+ 'Basic',
+ new SimpleUrl('http://www.here.com/path/here/hello.html'));
+ $realm->stretch(new SimpleUrl('http://www.here.com/path/there/goodbye.html'));
+ $this->assertTrue($realm->isWithin(
+ new SimpleUrl('http://www.here.com/path/here/index.html')));
+ $this->assertTrue($realm->isWithin(
+ new SimpleUrl('http://www.here.com/path/there/index.html')));
+ $this->assertTrue($realm->isWithin(
+ new SimpleUrl('http://www.here.com/path/index.html')));
+ $this->assertFalse($realm->isWithin(
+ new SimpleUrl('http://www.here.com/index.html')));
+ $this->assertFalse($realm->isWithin(
+ new SimpleUrl('http://www.here.com/paths/index.html')));
+ $this->assertFalse($realm->isWithin(
+ new SimpleUrl('http://www.here.com/pathindex.html')));
+ }
+}
+
+class TestOfAuthenticator extends UnitTestCase {
+
+ function testNoRealms() {
+ $request = &new MockSimpleHttpRequest();
+ $request->expectNever('addHeaderLine');
+ $authenticator = &new SimpleAuthenticator();
+ $authenticator->addHeaders($request, new SimpleUrl('http://here.com/'));
+ }
+
+ function &createSingleRealm() {
+ $authenticator = &new SimpleAuthenticator();
+ $authenticator->addRealm(
+ new SimpleUrl('http://www.here.com/path/hello.html'),
+ 'Basic',
+ 'Sanctuary');
+ $authenticator->setIdentityForRealm('www.here.com', 'Sanctuary', 'test', 'secret');
+ return $authenticator;
+ }
+
+ function testOutsideRealm() {
+ $request = &new MockSimpleHttpRequest();
+ $request->expectNever('addHeaderLine');
+ $authenticator = &$this->createSingleRealm();
+ $authenticator->addHeaders(
+ $request,
+ new SimpleUrl('http://www.here.com/hello.html'));
+ }
+
+ function testWithinRealm() {
+ $request = &new MockSimpleHttpRequest();
+ $request->expectOnce('addHeaderLine');
+ $authenticator = &$this->createSingleRealm();
+ $authenticator->addHeaders(
+ $request,
+ new SimpleUrl('http://www.here.com/path/more/hello.html'));
+ }
+
+ function testRestartingClearsRealm() {
+ $request = &new MockSimpleHttpRequest();
+ $request->expectNever('addHeaderLine');
+ $authenticator = &$this->createSingleRealm();
+ $authenticator->restartSession();
+ $authenticator->addHeaders(
+ $request,
+ new SimpleUrl('http://www.here.com/hello.html'));
+ }
+
+ function testDifferentHostIsOutsideRealm() {
+ $request = &new MockSimpleHttpRequest();
+ $request->expectNever('addHeaderLine');
+ $authenticator = &$this->createSingleRealm();
+ $authenticator->addHeaders(
+ $request,
+ new SimpleUrl('http://here.com/path/hello.html'));
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/bad_test_suite.php b/tests/simpletest/test/bad_test_suite.php
new file mode 100755
index 0000000000..b426013be4
--- /dev/null
+++ b/tests/simpletest/test/bad_test_suite.php
@@ -0,0 +1,10 @@
+<?php
+require_once(dirname(__FILE__) . '/../autorun.php');
+
+class BadTestCases extends TestSuite {
+ function BadTestCases() {
+ $this->TestSuite('Two bad test cases');
+ $this->addFile(dirname(__FILE__) . '/support/empty_test_file.php');
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/browser_test.php b/tests/simpletest/test/browser_test.php
new file mode 100755
index 0000000000..d2ee3faf9e
--- /dev/null
+++ b/tests/simpletest/test/browser_test.php
@@ -0,0 +1,779 @@
+<?php
+// $Id: browser_test.php,v 1.117 2007/07/16 18:13:23 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../browser.php');
+require_once(dirname(__FILE__) . '/../user_agent.php');
+require_once(dirname(__FILE__) . '/../http.php');
+require_once(dirname(__FILE__) . '/../page.php');
+require_once(dirname(__FILE__) . '/../encoding.php');
+
+Mock::generate('SimpleHttpResponse');
+Mock::generate('SimplePage');
+Mock::generate('SimpleForm');
+Mock::generate('SimpleUserAgent');
+Mock::generatePartial(
+ 'SimpleBrowser',
+ 'MockParseSimpleBrowser',
+ array('_createUserAgent', '_parse'));
+Mock::generatePartial(
+ 'SimpleBrowser',
+ 'MockUserAgentSimpleBrowser',
+ array('_createUserAgent'));
+
+class TestOfHistory extends UnitTestCase {
+
+ function testEmptyHistoryHasFalseContents() {
+ $history = &new SimpleBrowserHistory();
+ $this->assertIdentical($history->getUrl(), false);
+ $this->assertIdentical($history->getParameters(), false);
+ }
+
+ function testCannotMoveInEmptyHistory() {
+ $history = &new SimpleBrowserHistory();
+ $this->assertFalse($history->back());
+ $this->assertFalse($history->forward());
+ }
+
+ function testCurrentTargetAccessors() {
+ $history = &new SimpleBrowserHistory();
+ $history->recordEntry(
+ new SimpleUrl('http://www.here.com/'),
+ new SimpleGetEncoding());
+ $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.here.com/'));
+ $this->assertIdentical($history->getParameters(), new SimpleGetEncoding());
+ }
+
+ function testSecondEntryAccessors() {
+ $history = &new SimpleBrowserHistory();
+ $history->recordEntry(
+ new SimpleUrl('http://www.first.com/'),
+ new SimpleGetEncoding());
+ $history->recordEntry(
+ new SimpleUrl('http://www.second.com/'),
+ new SimplePostEncoding(array('a' => 1)));
+ $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.second.com/'));
+ $this->assertIdentical(
+ $history->getParameters(),
+ new SimplePostEncoding(array('a' => 1)));
+ }
+
+ function testGoingBackwards() {
+ $history = &new SimpleBrowserHistory();
+ $history->recordEntry(
+ new SimpleUrl('http://www.first.com/'),
+ new SimpleGetEncoding());
+ $history->recordEntry(
+ new SimpleUrl('http://www.second.com/'),
+ new SimplePostEncoding(array('a' => 1)));
+ $this->assertTrue($history->back());
+ $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.first.com/'));
+ $this->assertIdentical($history->getParameters(), new SimpleGetEncoding());
+ }
+
+ function testGoingBackwardsOffBeginning() {
+ $history = &new SimpleBrowserHistory();
+ $history->recordEntry(
+ new SimpleUrl('http://www.first.com/'),
+ new SimpleGetEncoding());
+ $this->assertFalse($history->back());
+ $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.first.com/'));
+ $this->assertIdentical($history->getParameters(), new SimpleGetEncoding());
+ }
+
+ function testGoingForwardsOffEnd() {
+ $history = &new SimpleBrowserHistory();
+ $history->recordEntry(
+ new SimpleUrl('http://www.first.com/'),
+ new SimpleGetEncoding());
+ $this->assertFalse($history->forward());
+ $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.first.com/'));
+ $this->assertIdentical($history->getParameters(), new SimpleGetEncoding());
+ }
+
+ function testGoingBackwardsAndForwards() {
+ $history = &new SimpleBrowserHistory();
+ $history->recordEntry(
+ new SimpleUrl('http://www.first.com/'),
+ new SimpleGetEncoding());
+ $history->recordEntry(
+ new SimpleUrl('http://www.second.com/'),
+ new SimplePostEncoding(array('a' => 1)));
+ $this->assertTrue($history->back());
+ $this->assertTrue($history->forward());
+ $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.second.com/'));
+ $this->assertIdentical(
+ $history->getParameters(),
+ new SimplePostEncoding(array('a' => 1)));
+ }
+
+ function testNewEntryReplacesNextOne() {
+ $history = &new SimpleBrowserHistory();
+ $history->recordEntry(
+ new SimpleUrl('http://www.first.com/'),
+ new SimpleGetEncoding());
+ $history->recordEntry(
+ new SimpleUrl('http://www.second.com/'),
+ new SimplePostEncoding(array('a' => 1)));
+ $history->back();
+ $history->recordEntry(
+ new SimpleUrl('http://www.third.com/'),
+ new SimpleGetEncoding());
+ $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.third.com/'));
+ $this->assertIdentical($history->getParameters(), new SimpleGetEncoding());
+ }
+
+ function testNewEntryDropsFutureEntries() {
+ $history = &new SimpleBrowserHistory();
+ $history->recordEntry(
+ new SimpleUrl('http://www.first.com/'),
+ new SimpleGetEncoding());
+ $history->recordEntry(
+ new SimpleUrl('http://www.second.com/'),
+ new SimpleGetEncoding());
+ $history->recordEntry(
+ new SimpleUrl('http://www.third.com/'),
+ new SimpleGetEncoding());
+ $history->back();
+ $history->back();
+ $history->recordEntry(
+ new SimpleUrl('http://www.fourth.com/'),
+ new SimpleGetEncoding());
+ $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.fourth.com/'));
+ $this->assertFalse($history->forward());
+ $history->back();
+ $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.first.com/'));
+ $this->assertFalse($history->back());
+ }
+}
+
+class TestOfParsedPageAccess extends UnitTestCase {
+
+ function &loadPage(&$page) {
+ $response = &new MockSimpleHttpResponse($this);
+
+ $agent = &new MockSimpleUserAgent($this);
+ $agent->setReturnReference('fetchResponse', $response);
+
+ $browser = &new MockParseSimpleBrowser($this);
+ $browser->setReturnReference('_createUserAgent', $agent);
+ $browser->setReturnReference('_parse', $page);
+ $browser->SimpleBrowser();
+
+ $browser->get('http://this.com/page.html');
+ return $browser;
+ }
+
+ function testAccessorsWhenNoPage() {
+ $agent = &new MockSimpleUserAgent($this);
+
+ $browser = &new MockParseSimpleBrowser($this);
+ $browser->setReturnReference('_createUserAgent', $agent);
+ $browser->SimpleBrowser();
+
+ $this->assertEqual($browser->getContent(), '');
+ }
+
+ function testParse() {
+ $page = &new MockSimplePage();
+ $page->setReturnValue('getRequest', "GET here.html\r\n\r\n");
+ $page->setReturnValue('getRaw', 'Raw HTML');
+ $page->setReturnValue('getTitle', 'Here');
+ $page->setReturnValue('getFrameFocus', 'Frame');
+ $page->setReturnValue('getMimeType', 'text/html');
+ $page->setReturnValue('getResponseCode', 200);
+ $page->setReturnValue('getAuthentication', 'Basic');
+ $page->setReturnValue('getRealm', 'Somewhere');
+ $page->setReturnValue('getTransportError', 'Ouch!');
+
+ $browser = &$this->loadPage($page);
+
+ $this->assertEqual($browser->getRequest(), "GET here.html\r\n\r\n");
+ $this->assertEqual($browser->getContent(), 'Raw HTML');
+ $this->assertEqual($browser->getTitle(), 'Here');
+ $this->assertEqual($browser->getFrameFocus(), 'Frame');
+ $this->assertIdentical($browser->getResponseCode(), 200);
+ $this->assertEqual($browser->getMimeType(), 'text/html');
+ $this->assertEqual($browser->getAuthentication(), 'Basic');
+ $this->assertEqual($browser->getRealm(), 'Somewhere');
+ $this->assertEqual($browser->getTransportError(), 'Ouch!');
+ }
+
+ function testLinkAffirmationWhenPresent() {
+ $page = &new MockSimplePage();
+ $page->setReturnValue('getUrlsByLabel', array('http://www.nowhere.com'));
+ $page->expectOnce('getUrlsByLabel', array('a link label'));
+ $browser = &$this->loadPage($page);
+ $this->assertIdentical($browser->getLink('a link label'), 'http://www.nowhere.com');
+ }
+
+ function testLinkAffirmationByIdWhenPresent() {
+ $page = &new MockSimplePage();
+ $page->setReturnValue('getUrlById', 'a_page.com', array(99));
+ $page->setReturnValue('getUrlById', false, array('*'));
+ $browser = &$this->loadPage($page);
+ $this->assertIdentical($browser->getLinkById(99), 'a_page.com');
+ $this->assertFalse($browser->getLinkById(98));
+ }
+
+ function testSettingFieldIsPassedToPage() {
+ $page = &new MockSimplePage();
+ $page->expectOnce('setField', array(new SimpleByLabelOrName('key'), 'Value'));
+ $page->setReturnValue('getField', 'Value');
+ $browser = &$this->loadPage($page);
+ $this->assertEqual($browser->getField('key'), 'Value');
+ $browser->setField('key', 'Value');
+ }
+}
+
+class TestOfBrowserNavigation extends UnitTestCase {
+
+ function &createBrowser(&$agent, &$page) {
+ $browser = &new MockParseSimpleBrowser();
+ $browser->setReturnReference('_createUserAgent', $agent);
+ $browser->setReturnReference('_parse', $page);
+ $browser->SimpleBrowser();
+ return $browser;
+ }
+
+ function testClickLinkRequestsPage() {
+ $agent = &new MockSimpleUserAgent();
+ $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse());
+ $agent->expectArgumentsAt(
+ 0,
+ 'fetchResponse',
+ array(new SimpleUrl('http://this.com/page.html'), new SimpleGetEncoding()));
+ $agent->expectArgumentsAt(
+ 1,
+ 'fetchResponse',
+ array(new SimpleUrl('http://this.com/new.html'), new SimpleGetEncoding()));
+ $agent->expectCallCount('fetchResponse', 2);
+
+ $page = &new MockSimplePage();
+ $page->setReturnValue('getUrlsByLabel', array(new SimpleUrl('http://this.com/new.html')));
+ $page->expectOnce('getUrlsByLabel', array('New'));
+ $page->setReturnValue('getRaw', 'A page');
+
+ $browser = &$this->createBrowser($agent, $page);
+ $browser->get('http://this.com/page.html');
+ $this->assertTrue($browser->clickLink('New'));
+ }
+
+ function testClickLinkWithUnknownFrameStillRequestsWholePage() {
+ $agent = &new MockSimpleUserAgent();
+ $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse());
+ $agent->expectArgumentsAt(
+ 0,
+ 'fetchResponse',
+ array(new SimpleUrl('http://this.com/page.html'), new SimpleGetEncoding()));
+ $target = new SimpleUrl('http://this.com/new.html');
+ $target->setTarget('missing');
+ $agent->expectArgumentsAt(
+ 1,
+ 'fetchResponse',
+ array($target, new SimpleGetEncoding()));
+ $agent->expectCallCount('fetchResponse', 2);
+
+ $parsed_url = new SimpleUrl('http://this.com/new.html');
+ $parsed_url->setTarget('missing');
+
+ $page = &new MockSimplePage();
+ $page->setReturnValue('getUrlsByLabel', array($parsed_url));
+ $page->setReturnValue('hasFrames', false);
+ $page->expectOnce('getUrlsByLabel', array('New'));
+ $page->setReturnValue('getRaw', 'A page');
+
+ $browser = &$this->createBrowser($agent, $page);
+ $browser->get('http://this.com/page.html');
+ $this->assertTrue($browser->clickLink('New'));
+ }
+
+ function testClickingMissingLinkFails() {
+ $agent = &new MockSimpleUserAgent($this);
+ $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse());
+
+ $page = &new MockSimplePage();
+ $page->setReturnValue('getUrlsByLabel', array());
+ $page->setReturnValue('getRaw', 'stuff');
+
+ $browser = &$this->createBrowser($agent, $page);
+ $this->assertTrue($browser->get('http://this.com/page.html'));
+ $this->assertFalse($browser->clickLink('New'));
+ }
+
+ function testClickIndexedLink() {
+ $agent = &new MockSimpleUserAgent();
+ $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse());
+ $agent->expectArgumentsAt(
+ 1,
+ 'fetchResponse',
+ array(new SimpleUrl('1.html'), new SimpleGetEncoding()));
+ $agent->expectCallCount('fetchResponse', 2);
+
+ $page = &new MockSimplePage();
+ $page->setReturnValue(
+ 'getUrlsByLabel',
+ array(new SimpleUrl('0.html'), new SimpleUrl('1.html')));
+ $page->setReturnValue('getRaw', 'A page');
+
+ $browser = &$this->createBrowser($agent, $page);
+ $browser->get('http://this.com/page.html');
+ $this->assertTrue($browser->clickLink('New', 1));
+ }
+
+ function testClinkLinkById() {
+ $agent = &new MockSimpleUserAgent();
+ $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse());
+ $agent->expectArgumentsAt(1, 'fetchResponse', array(
+ new SimpleUrl('http://this.com/link.html'),
+ new SimpleGetEncoding()));
+ $agent->expectCallCount('fetchResponse', 2);
+
+ $page = &new MockSimplePage();
+ $page->setReturnValue('getUrlById', new SimpleUrl('http://this.com/link.html'));
+ $page->expectOnce('getUrlById', array(2));
+ $page->setReturnValue('getRaw', 'A page');
+
+ $browser = &$this->createBrowser($agent, $page);
+ $browser->get('http://this.com/page.html');
+ $this->assertTrue($browser->clickLinkById(2));
+ }
+
+ function testClickingMissingLinkIdFails() {
+ $agent = &new MockSimpleUserAgent();
+ $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse());
+
+ $page = &new MockSimplePage();
+ $page->setReturnValue('getUrlById', false);
+
+ $browser = &$this->createBrowser($agent, $page);
+ $browser->get('http://this.com/page.html');
+ $this->assertFalse($browser->clickLink(0));
+ }
+
+ function testSubmitFormByLabel() {
+ $agent = &new MockSimpleUserAgent();
+ $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse());
+ $agent->expectArgumentsAt(1, 'fetchResponse', array(
+ new SimpleUrl('http://this.com/handler.html'),
+ new SimplePostEncoding(array('a' => 'A'))));
+ $agent->expectCallCount('fetchResponse', 2);
+
+ $form = &new MockSimpleForm();
+ $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html'));
+ $form->setReturnValue('getMethod', 'post');
+ $form->setReturnValue('submitButton', new SimplePostEncoding(array('a' => 'A')));
+ $form->expectOnce('submitButton', array(new SimpleByLabel('Go'), false));
+
+ $page = &new MockSimplePage();
+ $page->setReturnReference('getFormBySubmit', $form);
+ $page->expectOnce('getFormBySubmit', array(new SimpleByLabel('Go')));
+ $page->setReturnValue('getRaw', 'stuff');
+
+ $browser = &$this->createBrowser($agent, $page);
+ $browser->get('http://this.com/page.html');
+ $this->assertTrue($browser->clickSubmit('Go'));
+ }
+
+ function testDefaultSubmitFormByLabel() {
+ $agent = &new MockSimpleUserAgent();
+ $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse());
+ $agent->expectArgumentsAt(1, 'fetchResponse', array(
+ new SimpleUrl('http://this.com/page.html'),
+ new SimpleGetEncoding(array('a' => 'A'))));
+ $agent->expectCallCount('fetchResponse', 2);
+
+ $form = &new MockSimpleForm();
+ $form->setReturnValue('getAction', new SimpleUrl('http://this.com/page.html'));
+ $form->setReturnValue('getMethod', 'get');
+ $form->setReturnValue('submitButton', new SimpleGetEncoding(array('a' => 'A')));
+
+ $page = &new MockSimplePage();
+ $page->setReturnReference('getFormBySubmit', $form);
+ $page->expectOnce('getFormBySubmit', array(new SimpleByLabel('Submit')));
+ $page->setReturnValue('getRaw', 'stuff');
+ $page->setReturnValue('getUrl', new SimpleUrl('http://this.com/page.html'));
+
+ $browser = &$this->createBrowser($agent, $page);
+ $browser->get('http://this.com/page.html');
+ $this->assertTrue($browser->clickSubmit());
+ }
+
+ function testSubmitFormByName() {
+ $agent = &new MockSimpleUserAgent();
+ $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse());
+
+ $form = &new MockSimpleForm();
+ $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html'));
+ $form->setReturnValue('getMethod', 'post');
+ $form->setReturnValue('submitButton', new SimplePostEncoding(array('a' => 'A')));
+
+ $page = &new MockSimplePage();
+ $page->setReturnReference('getFormBySubmit', $form);
+ $page->expectOnce('getFormBySubmit', array(new SimpleByName('me')));
+ $page->setReturnValue('getRaw', 'stuff');
+
+ $browser = &$this->createBrowser($agent, $page);
+ $browser->get('http://this.com/page.html');
+ $this->assertTrue($browser->clickSubmitByName('me'));
+ }
+
+ function testSubmitFormById() {
+ $agent = &new MockSimpleUserAgent();
+ $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse());
+
+ $form = &new MockSimpleForm();
+ $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html'));
+ $form->setReturnValue('getMethod', 'post');
+ $form->setReturnValue('submitButton', new SimplePostEncoding(array('a' => 'A')));
+ $form->expectOnce('submitButton', array(new SimpleById(99), false));
+
+ $page = &new MockSimplePage();
+ $page->setReturnReference('getFormBySubmit', $form);
+ $page->expectOnce('getFormBySubmit', array(new SimpleById(99)));
+ $page->setReturnValue('getRaw', 'stuff');
+
+ $browser = &$this->createBrowser($agent, $page);
+ $browser->get('http://this.com/page.html');
+ $this->assertTrue($browser->clickSubmitById(99));
+ }
+
+ function testSubmitFormByImageLabel() {
+ $agent = &new MockSimpleUserAgent();
+ $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse());
+
+ $form = &new MockSimpleForm();
+ $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html'));
+ $form->setReturnValue('getMethod', 'post');
+ $form->setReturnValue('submitImage', new SimplePostEncoding(array('a' => 'A')));
+ $form->expectOnce('submitImage', array(new SimpleByLabel('Go!'), 10, 11, false));
+
+ $page = &new MockSimplePage();
+ $page->setReturnReference('getFormByImage', $form);
+ $page->expectOnce('getFormByImage', array(new SimpleByLabel('Go!')));
+ $page->setReturnValue('getRaw', 'stuff');
+
+ $browser = &$this->createBrowser($agent, $page);
+ $browser->get('http://this.com/page.html');
+ $this->assertTrue($browser->clickImage('Go!', 10, 11));
+ }
+
+ function testSubmitFormByImageName() {
+ $agent = &new MockSimpleUserAgent();
+ $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse());
+
+ $form = &new MockSimpleForm();
+ $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html'));
+ $form->setReturnValue('getMethod', 'post');
+ $form->setReturnValue('submitImage', new SimplePostEncoding(array('a' => 'A')));
+ $form->expectOnce('submitImage', array(new SimpleByName('a'), 10, 11, false));
+
+ $page = &new MockSimplePage();
+ $page->setReturnReference('getFormByImage', $form);
+ $page->expectOnce('getFormByImage', array(new SimpleByName('a')));
+ $page->setReturnValue('getRaw', 'stuff');
+
+ $browser = &$this->createBrowser($agent, $page);
+ $browser->get('http://this.com/page.html');
+ $this->assertTrue($browser->clickImageByName('a', 10, 11));
+ }
+
+ function testSubmitFormByImageId() {
+ $agent = &new MockSimpleUserAgent();
+ $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse());
+
+ $form = &new MockSimpleForm();
+ $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html'));
+ $form->setReturnValue('getMethod', 'post');
+ $form->setReturnValue('submitImage', new SimplePostEncoding(array('a' => 'A')));
+ $form->expectOnce('submitImage', array(new SimpleById(99), 10, 11, false));
+
+ $page = &new MockSimplePage();
+ $page->setReturnReference('getFormByImage', $form);
+ $page->expectOnce('getFormByImage', array(new SimpleById(99)));
+ $page->setReturnValue('getRaw', 'stuff');
+
+ $browser = &$this->createBrowser($agent, $page);
+ $browser->get('http://this.com/page.html');
+ $this->assertTrue($browser->clickImageById(99, 10, 11));
+ }
+
+ function testSubmitFormByFormId() {
+ $agent = &new MockSimpleUserAgent();
+ $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse());
+ $agent->expectArgumentsAt(1, 'fetchResponse', array(
+ new SimpleUrl('http://this.com/handler.html'),
+ new SimplePostEncoding(array('a' => 'A'))));
+ $agent->expectCallCount('fetchResponse', 2);
+
+ $form = &new MockSimpleForm();
+ $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html'));
+ $form->setReturnValue('getMethod', 'post');
+ $form->setReturnValue('submit', new SimplePostEncoding(array('a' => 'A')));
+
+ $page = &new MockSimplePage();
+ $page->setReturnReference('getFormById', $form);
+ $page->expectOnce('getFormById', array(33));
+ $page->setReturnValue('getRaw', 'stuff');
+
+ $browser = &$this->createBrowser($agent, $page);
+ $browser->get('http://this.com/page.html');
+ $this->assertTrue($browser->submitFormById(33));
+ }
+}
+
+class TestOfBrowserFrames extends UnitTestCase {
+
+ function &createBrowser(&$agent) {
+ $browser = &new MockUserAgentSimpleBrowser();
+ $browser->setReturnReference('_createUserAgent', $agent);
+ $browser->SimpleBrowser();
+ return $browser;
+ }
+
+ function &createUserAgent($pages) {
+ $agent = &new MockSimpleUserAgent();
+ foreach ($pages as $url => $raw) {
+ $url = new SimpleUrl($url);
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getUrl', $url);
+ $response->setReturnValue('getContent', $raw);
+ $agent->setReturnReference('fetchResponse', $response, array($url, '*'));
+ }
+ return $agent;
+ }
+
+ function testSimplePageHasNoFrames() {
+ $browser = &$this->createBrowser($this->createUserAgent(
+ array('http://site.with.no.frames/' => 'A non-framed page')));
+ $this->assertEqual(
+ $browser->get('http://site.with.no.frames/'),
+ 'A non-framed page');
+ $this->assertIdentical($browser->getFrames(), 'http://site.with.no.frames/');
+ }
+
+ function testFramesetWithNoFrames() {
+ $browser = &$this->createBrowser($this->createUserAgent(
+ array('http://site.with.no.frames/' => '<frameset></frameset>')));
+ $this->assertEqual($browser->get('http://site.with.no.frames/'), '');
+ $this->assertIdentical($browser->getFrames(), array());
+ }
+
+ function testFramesetWithSingleFrame() {
+ $frameset = '<frameset><frame name="a" src="frame.html"></frameset>';
+ $browser = &$this->createBrowser($this->createUserAgent(array(
+ 'http://site.with.one.frame/' => $frameset,
+ 'http://site.with.one.frame/frame.html' => 'A frame')));
+ $this->assertEqual($browser->get('http://site.with.one.frame/'), 'A frame');
+ $this->assertIdentical(
+ $browser->getFrames(),
+ array('a' => 'http://site.with.one.frame/frame.html'));
+ }
+
+ function testTitleTakenFromFramesetPage() {
+ $frameset = '<title>Frameset title</title>' .
+ '<frameset><frame name="a" src="frame.html"></frameset>';
+ $browser = &$this->createBrowser($this->createUserAgent(array(
+ 'http://site.with.one.frame/' => $frameset,
+ 'http://site.with.one.frame/frame.html' => '<title>Page title</title>')));
+ $browser->get('http://site.with.one.frame/');
+ $this->assertEqual($browser->getTitle(), 'Frameset title');
+ }
+
+ function testFramesetWithSingleUnnamedFrame() {
+ $frameset = '<frameset><frame src="frame.html"></frameset>';
+ $browser = &$this->createBrowser($this->createUserAgent(array(
+ 'http://site.with.one.frame/' => $frameset,
+ 'http://site.with.one.frame/frame.html' => 'One frame')));
+ $this->assertEqual(
+ $browser->get('http://site.with.one.frame/'),
+ 'One frame');
+ $this->assertIdentical(
+ $browser->getFrames(),
+ array(1 => 'http://site.with.one.frame/frame.html'));
+ }
+
+ function testFramesetWithMultipleFrames() {
+ $frameset = '<frameset>' .
+ '<frame name="a" src="frame_a.html">' .
+ '<frame name="b" src="frame_b.html">' .
+ '<frame name="c" src="frame_c.html">' .
+ '</frameset>';
+ $browser = &$this->createBrowser($this->createUserAgent(array(
+ 'http://site.with.frames/' => $frameset,
+ 'http://site.with.frames/frame_a.html' => 'A frame',
+ 'http://site.with.frames/frame_b.html' => 'B frame',
+ 'http://site.with.frames/frame_c.html' => 'C frame')));
+ $this->assertEqual(
+ $browser->get('http://site.with.frames/'),
+ 'A frameB frameC frame');
+ $this->assertIdentical($browser->getFrames(), array(
+ 'a' => 'http://site.with.frames/frame_a.html',
+ 'b' => 'http://site.with.frames/frame_b.html',
+ 'c' => 'http://site.with.frames/frame_c.html'));
+ }
+
+ function testFrameFocusByName() {
+ $frameset = '<frameset>' .
+ '<frame name="a" src="frame_a.html">' .
+ '<frame name="b" src="frame_b.html">' .
+ '<frame name="c" src="frame_c.html">' .
+ '</frameset>';
+ $browser = &$this->createBrowser($this->createUserAgent(array(
+ 'http://site.with.frames/' => $frameset,
+ 'http://site.with.frames/frame_a.html' => 'A frame',
+ 'http://site.with.frames/frame_b.html' => 'B frame',
+ 'http://site.with.frames/frame_c.html' => 'C frame')));
+ $browser->get('http://site.with.frames/');
+ $browser->setFrameFocus('a');
+ $this->assertEqual($browser->getContent(), 'A frame');
+ $browser->setFrameFocus('b');
+ $this->assertEqual($browser->getContent(), 'B frame');
+ $browser->setFrameFocus('c');
+ $this->assertEqual($browser->getContent(), 'C frame');
+ }
+
+ function testFramesetWithSomeNamedFrames() {
+ $frameset = '<frameset>' .
+ '<frame name="a" src="frame_a.html">' .
+ '<frame src="frame_b.html">' .
+ '<frame name="c" src="frame_c.html">' .
+ '<frame src="frame_d.html">' .
+ '</frameset>';
+ $browser = &$this->createBrowser($this->createUserAgent(array(
+ 'http://site.with.frames/' => $frameset,
+ 'http://site.with.frames/frame_a.html' => 'A frame',
+ 'http://site.with.frames/frame_b.html' => 'B frame',
+ 'http://site.with.frames/frame_c.html' => 'C frame',
+ 'http://site.with.frames/frame_d.html' => 'D frame')));
+ $this->assertEqual(
+ $browser->get('http://site.with.frames/'),
+ 'A frameB frameC frameD frame');
+ $this->assertIdentical($browser->getFrames(), array(
+ 'a' => 'http://site.with.frames/frame_a.html',
+ 2 => 'http://site.with.frames/frame_b.html',
+ 'c' => 'http://site.with.frames/frame_c.html',
+ 4 => 'http://site.with.frames/frame_d.html'));
+ }
+
+ function testFrameFocusWithMixedNamesAndIndexes() {
+ $frameset = '<frameset>' .
+ '<frame name="a" src="frame_a.html">' .
+ '<frame src="frame_b.html">' .
+ '<frame name="c" src="frame_c.html">' .
+ '<frame src="frame_d.html">' .
+ '</frameset>';
+ $browser = &$this->createBrowser($this->createUserAgent(array(
+ 'http://site.with.frames/' => $frameset,
+ 'http://site.with.frames/frame_a.html' => 'A frame',
+ 'http://site.with.frames/frame_b.html' => 'B frame',
+ 'http://site.with.frames/frame_c.html' => 'C frame',
+ 'http://site.with.frames/frame_d.html' => 'D frame')));
+ $browser->get('http://site.with.frames/');
+ $browser->setFrameFocus('a');
+ $this->assertEqual($browser->getContent(), 'A frame');
+ $browser->setFrameFocus(2);
+ $this->assertEqual($browser->getContent(), 'B frame');
+ $browser->setFrameFocus('c');
+ $this->assertEqual($browser->getContent(), 'C frame');
+ $browser->setFrameFocus(4);
+ $this->assertEqual($browser->getContent(), 'D frame');
+ $browser->clearFrameFocus();
+ $this->assertEqual($browser->getContent(), 'A frameB frameC frameD frame');
+ }
+
+ function testNestedFrameset() {
+ $inner = '<frameset>' .
+ '<frame name="page" src="page.html">' .
+ '</frameset>';
+ $outer = '<frameset>' .
+ '<frame name="inner" src="inner.html">' .
+ '</frameset>';
+ $browser = &$this->createBrowser($this->createUserAgent(array(
+ 'http://site.with.nested.frame/' => $outer,
+ 'http://site.with.nested.frame/inner.html' => $inner,
+ 'http://site.with.nested.frame/page.html' => 'The page')));
+ $this->assertEqual(
+ $browser->get('http://site.with.nested.frame/'),
+ 'The page');
+ $this->assertIdentical($browser->getFrames(), array(
+ 'inner' => array(
+ 'page' => 'http://site.with.nested.frame/page.html')));
+ }
+
+ function testCanNavigateToNestedFrame() {
+ $inner = '<frameset>' .
+ '<frame name="one" src="one.html">' .
+ '<frame name="two" src="two.html">' .
+ '</frameset>';
+ $outer = '<frameset>' .
+ '<frame name="inner" src="inner.html">' .
+ '<frame name="three" src="three.html">' .
+ '</frameset>';
+ $browser = &$this->createBrowser($this->createUserAgent(array(
+ 'http://site.with.nested.frames/' => $outer,
+ 'http://site.with.nested.frames/inner.html' => $inner,
+ 'http://site.with.nested.frames/one.html' => 'Page one',
+ 'http://site.with.nested.frames/two.html' => 'Page two',
+ 'http://site.with.nested.frames/three.html' => 'Page three')));
+
+ $browser->get('http://site.with.nested.frames/');
+ $this->assertEqual($browser->getContent(), 'Page onePage twoPage three');
+
+ $this->assertTrue($browser->setFrameFocus('inner'));
+ $this->assertEqual($browser->getFrameFocus(), array('inner'));
+ $this->assertTrue($browser->setFrameFocus('one'));
+ $this->assertEqual($browser->getFrameFocus(), array('inner', 'one'));
+ $this->assertEqual($browser->getContent(), 'Page one');
+
+ $this->assertTrue($browser->setFrameFocus('two'));
+ $this->assertEqual($browser->getFrameFocus(), array('inner', 'two'));
+ $this->assertEqual($browser->getContent(), 'Page two');
+
+ $browser->clearFrameFocus();
+ $this->assertTrue($browser->setFrameFocus('three'));
+ $this->assertEqual($browser->getFrameFocus(), array('three'));
+ $this->assertEqual($browser->getContent(), 'Page three');
+
+ $this->assertTrue($browser->setFrameFocus('inner'));
+ $this->assertEqual($browser->getContent(), 'Page onePage two');
+ }
+
+ function testCanNavigateToNestedFrameByIndex() {
+ $inner = '<frameset>' .
+ '<frame src="one.html">' .
+ '<frame src="two.html">' .
+ '</frameset>';
+ $outer = '<frameset>' .
+ '<frame src="inner.html">' .
+ '<frame src="three.html">' .
+ '</frameset>';
+ $browser = &$this->createBrowser($this->createUserAgent(array(
+ 'http://site.with.nested.frames/' => $outer,
+ 'http://site.with.nested.frames/inner.html' => $inner,
+ 'http://site.with.nested.frames/one.html' => 'Page one',
+ 'http://site.with.nested.frames/two.html' => 'Page two',
+ 'http://site.with.nested.frames/three.html' => 'Page three')));
+
+ $browser->get('http://site.with.nested.frames/');
+ $this->assertEqual($browser->getContent(), 'Page onePage twoPage three');
+
+ $this->assertTrue($browser->setFrameFocusByIndex(1));
+ $this->assertEqual($browser->getFrameFocus(), array(1));
+ $this->assertTrue($browser->setFrameFocusByIndex(1));
+ $this->assertEqual($browser->getFrameFocus(), array(1, 1));
+ $this->assertEqual($browser->getContent(), 'Page one');
+
+ $this->assertTrue($browser->setFrameFocusByIndex(2));
+ $this->assertEqual($browser->getFrameFocus(), array(1, 2));
+ $this->assertEqual($browser->getContent(), 'Page two');
+
+ $browser->clearFrameFocus();
+ $this->assertTrue($browser->setFrameFocusByIndex(2));
+ $this->assertEqual($browser->getFrameFocus(), array(2));
+ $this->assertEqual($browser->getContent(), 'Page three');
+
+ $this->assertTrue($browser->setFrameFocusByIndex(1));
+ $this->assertEqual($browser->getContent(), 'Page onePage two');
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/collector_test.php b/tests/simpletest/test/collector_test.php
new file mode 100755
index 0000000000..638a307a3e
--- /dev/null
+++ b/tests/simpletest/test/collector_test.php
@@ -0,0 +1,51 @@
+<?php
+// $Id: collector_test.php,v 1.13 2007/04/30 23:39:59 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../collector.php');
+SimpleTest::ignore('MockTestSuite');
+Mock::generate('TestSuite');
+
+class PathEqualExpectation extends EqualExpectation {
+ function PathEqualExpectation($value, $message = '%s') {
+ $this->EqualExpectation(str_replace("\\", '/', $value), $message);
+ }
+
+ function test($compare) {
+ return parent::test(str_replace("\\", '/', $compare));
+ }
+}
+
+class TestOfCollector extends UnitTestCase {
+
+ function testCollectionIsAddedToGroup() {
+ $suite = &new MockTestSuite();
+ $suite->expectMinimumCallCount('addTestFile', 2);
+ $suite->expectArguments(
+ 'addTestFile',
+ array(new PatternExpectation('/collectable\\.(1|2)$/')));
+ $collector = &new SimpleCollector();
+ $collector->collect($suite, dirname(__FILE__) . '/support/collector/');
+ }
+}
+
+class TestOfPatternCollector extends UnitTestCase {
+
+ function testAddingEverythingToGroup() {
+ $suite = &new MockTestSuite();
+ $suite->expectCallCount('addTestFile', 2);
+ $suite->expectArguments(
+ 'addTestFile',
+ array(new PatternExpectation('/collectable\\.(1|2)$/')));
+ $collector = &new SimplePatternCollector('/.*/');
+ $collector->collect($suite, dirname(__FILE__) . '/support/collector/');
+ }
+
+ function testOnlyMatchedFilesAreAddedToGroup() {
+ $suite = &new MockTestSuite();
+ $suite->expectOnce('addTestFile', array(new PathEqualExpectation(
+ dirname(__FILE__) . '/support/collector/collectable.1')));
+ $collector = &new SimplePatternCollector('/1$/');
+ $collector->collect($suite, dirname(__FILE__) . '/support/collector/');
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/command_line_test.php b/tests/simpletest/test/command_line_test.php
new file mode 100755
index 0000000000..5baabff33c
--- /dev/null
+++ b/tests/simpletest/test/command_line_test.php
@@ -0,0 +1,40 @@
+<?php
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../default_reporter.php');
+
+class TestOfCommandLineParsing extends UnitTestCase {
+
+ function testDefaultsToEmptyStringToMeanNullToTheSelectiveReporter() {
+ $parser = new SimpleCommandLineParser(array());
+ $this->assertIdentical($parser->getTest(), '');
+ $this->assertIdentical($parser->getTestCase(), '');
+ }
+
+ function testNotXmlByDefault() {
+ $parser = new SimpleCommandLineParser(array());
+ $this->assertFalse($parser->isXml());
+ }
+
+ function testCanDetectRequestForXml() {
+ $parser = new SimpleCommandLineParser(array('--xml'));
+ $this->assertTrue($parser->isXml());
+ }
+
+ function testCanReadAssignmentSyntax() {
+ $parser = new SimpleCommandLineParser(array('--test=myTest'));
+ $this->assertEqual($parser->getTest(), 'myTest');
+ }
+
+ function testCanReadFollowOnSyntax() {
+ $parser = new SimpleCommandLineParser(array('--test', 'myTest'));
+ $this->assertEqual($parser->getTest(), 'myTest');
+ }
+
+ function testCanReadShortForms() {
+ $parser = new SimpleCommandLineParser(array('-t', 'myTest', '-c', 'MyClass', '-x'));
+ $this->assertEqual($parser->getTest(), 'myTest');
+ $this->assertEqual($parser->getTestCase(), 'MyClass');
+ $this->assertTrue($parser->isXml());
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/compatibility_test.php b/tests/simpletest/test/compatibility_test.php
new file mode 100755
index 0000000000..92280c1f01
--- /dev/null
+++ b/tests/simpletest/test/compatibility_test.php
@@ -0,0 +1,97 @@
+<?php
+// $Id: compatibility_test.php,v 1.4 2007/04/30 23:39:59 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../compatibility.php');
+
+class ComparisonClass {
+}
+
+class ComparisonSubclass extends ComparisonClass {
+}
+
+if (version_compare(phpversion(), '5') >= 0) {
+ eval('interface ComparisonInterface { }');
+ eval('class ComparisonClassWithInterface implements ComparisonInterface { }');
+}
+
+class TestOfCompatibility extends UnitTestCase {
+
+ function testIsA() {
+ $this->assertTrue(SimpleTestCompatibility::isA(
+ new ComparisonClass(),
+ 'ComparisonClass'));
+ $this->assertFalse(SimpleTestCompatibility::isA(
+ new ComparisonClass(),
+ 'ComparisonSubclass'));
+ $this->assertTrue(SimpleTestCompatibility::isA(
+ new ComparisonSubclass(),
+ 'ComparisonClass'));
+ }
+
+ function testIdentityOfNumericStrings() {
+ $numericString1 = "123";
+ $numericString2 = "00123";
+ $this->assertNotIdentical($numericString1, $numericString2);
+ }
+
+ function testIdentityOfObjects() {
+ $object1 = new ComparisonClass();
+ $object2 = new ComparisonClass();
+ $this->assertIdentical($object1, $object2);
+ }
+
+ function testReferences () {
+ $thing = "Hello";
+ $thing_reference = &$thing;
+ $thing_copy = $thing;
+ $this->assertTrue(SimpleTestCompatibility::isReference(
+ $thing,
+ $thing));
+ $this->assertTrue(SimpleTestCompatibility::isReference(
+ $thing,
+ $thing_reference));
+ $this->assertFalse(SimpleTestCompatibility::isReference(
+ $thing,
+ $thing_copy));
+ }
+
+ function testObjectReferences () {
+ $object = &new ComparisonClass();
+ $object_reference = &$object;
+ $object_copy = new ComparisonClass();
+ $object_assignment = $object;
+ $this->assertTrue(SimpleTestCompatibility::isReference(
+ $object,
+ $object));
+ $this->assertTrue(SimpleTestCompatibility::isReference(
+ $object,
+ $object_reference));
+ $this->assertFalse(SimpleTestCompatibility::isReference(
+ $object,
+ $object_copy));
+ if (version_compare(phpversion(), '5', '>=')) {
+ $this->assertTrue(SimpleTestCompatibility::isReference(
+ $object,
+ $object_assignment));
+ } else {
+ $this->assertFalse(SimpleTestCompatibility::isReference(
+ $object,
+ $object_assignment));
+ }
+ }
+
+ function testInteraceComparison() {
+ if (version_compare(phpversion(), '5', '<')) {
+ return;
+ }
+
+ $object = new ComparisonClassWithInterface();
+ $this->assertFalse(SimpleTestCompatibility::isA(
+ new ComparisonClass(),
+ 'ComparisonInterface'));
+ $this->assertTrue(SimpleTestCompatibility::isA(
+ new ComparisonClassWithInterface(),
+ 'ComparisonInterface'));
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/cookies_test.php b/tests/simpletest/test/cookies_test.php
new file mode 100755
index 0000000000..5fd0387f0c
--- /dev/null
+++ b/tests/simpletest/test/cookies_test.php
@@ -0,0 +1,227 @@
+<?php
+// $Id: cookies_test.php,v 1.5 2007/05/07 00:58:03 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../cookies.php');
+
+class TestOfCookie extends UnitTestCase {
+
+ function testCookieDefaults() {
+ $cookie = new SimpleCookie("name");
+ $this->assertFalse($cookie->getValue());
+ $this->assertEqual($cookie->getPath(), "/");
+ $this->assertIdentical($cookie->getHost(), false);
+ $this->assertFalse($cookie->getExpiry());
+ $this->assertFalse($cookie->isSecure());
+ }
+
+ function testCookieAccessors() {
+ $cookie = new SimpleCookie(
+ "name",
+ "value",
+ "/path",
+ "Mon, 18 Nov 2002 15:50:29 GMT",
+ true);
+ $this->assertEqual($cookie->getName(), "name");
+ $this->assertEqual($cookie->getValue(), "value");
+ $this->assertEqual($cookie->getPath(), "/path/");
+ $this->assertEqual($cookie->getExpiry(), "Mon, 18 Nov 2002 15:50:29 GMT");
+ $this->assertTrue($cookie->isSecure());
+ }
+
+ function testFullHostname() {
+ $cookie = new SimpleCookie("name");
+ $this->assertTrue($cookie->setHost("host.name.here"));
+ $this->assertEqual($cookie->getHost(), "host.name.here");
+ $this->assertTrue($cookie->setHost("host.com"));
+ $this->assertEqual($cookie->getHost(), "host.com");
+ }
+
+ function testHostTruncation() {
+ $cookie = new SimpleCookie("name");
+ $cookie->setHost("this.host.name.here");
+ $this->assertEqual($cookie->getHost(), "host.name.here");
+ $cookie->setHost("this.host.com");
+ $this->assertEqual($cookie->getHost(), "host.com");
+ $this->assertTrue($cookie->setHost("dashes.in-host.com"));
+ $this->assertEqual($cookie->getHost(), "in-host.com");
+ }
+
+ function testBadHosts() {
+ $cookie = new SimpleCookie("name");
+ $this->assertFalse($cookie->setHost("gibberish"));
+ $this->assertFalse($cookie->setHost("host.here"));
+ $this->assertFalse($cookie->setHost("host..com"));
+ $this->assertFalse($cookie->setHost("..."));
+ $this->assertFalse($cookie->setHost("host.com."));
+ }
+
+ function testHostValidity() {
+ $cookie = new SimpleCookie("name");
+ $cookie->setHost("this.host.name.here");
+ $this->assertTrue($cookie->isValidHost("host.name.here"));
+ $this->assertTrue($cookie->isValidHost("that.host.name.here"));
+ $this->assertFalse($cookie->isValidHost("bad.host"));
+ $this->assertFalse($cookie->isValidHost("nearly.name.here"));
+ }
+
+ function testPathValidity() {
+ $cookie = new SimpleCookie("name", "value", "/path");
+ $this->assertFalse($cookie->isValidPath("/"));
+ $this->assertTrue($cookie->isValidPath("/path/"));
+ $this->assertTrue($cookie->isValidPath("/path/more"));
+ }
+
+ function testSessionExpiring() {
+ $cookie = new SimpleCookie("name", "value", "/path");
+ $this->assertTrue($cookie->isExpired(0));
+ }
+
+ function testTimestampExpiry() {
+ $cookie = new SimpleCookie("name", "value", "/path", 456);
+ $this->assertFalse($cookie->isExpired(0));
+ $this->assertTrue($cookie->isExpired(457));
+ $this->assertFalse($cookie->isExpired(455));
+ }
+
+ function testDateExpiry() {
+ $cookie = new SimpleCookie(
+ "name",
+ "value",
+ "/path",
+ "Mon, 18 Nov 2002 15:50:29 GMT");
+ $this->assertTrue($cookie->isExpired("Mon, 18 Nov 2002 15:50:30 GMT"));
+ $this->assertFalse($cookie->isExpired("Mon, 18 Nov 2002 15:50:28 GMT"));
+ }
+
+ function testAging() {
+ $cookie = new SimpleCookie("name", "value", "/path", 200);
+ $cookie->agePrematurely(199);
+ $this->assertFalse($cookie->isExpired(0));
+ $cookie->agePrematurely(2);
+ $this->assertTrue($cookie->isExpired(0));
+ }
+}
+
+class TestOfCookieJar extends UnitTestCase {
+
+ function testAddCookie() {
+ $jar = new SimpleCookieJar();
+ $jar->setCookie("a", "A");
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=A'));
+ }
+
+ function testHostFilter() {
+ $jar = new SimpleCookieJar();
+ $jar->setCookie('a', 'A', 'my-host.com');
+ $jar->setCookie('b', 'B', 'another-host.com');
+ $jar->setCookie('c', 'C');
+ $this->assertEqual(
+ $jar->selectAsPairs(new SimpleUrl('my-host.com')),
+ array('a=A', 'c=C'));
+ $this->assertEqual(
+ $jar->selectAsPairs(new SimpleUrl('another-host.com')),
+ array('b=B', 'c=C'));
+ $this->assertEqual(
+ $jar->selectAsPairs(new SimpleUrl('www.another-host.com')),
+ array('b=B', 'c=C'));
+ $this->assertEqual(
+ $jar->selectAsPairs(new SimpleUrl('new-host.org')),
+ array('c=C'));
+ $this->assertEqual(
+ $jar->selectAsPairs(new SimpleUrl('/')),
+ array('a=A', 'b=B', 'c=C'));
+ }
+
+ function testPathFilter() {
+ $jar = new SimpleCookieJar();
+ $jar->setCookie('a', 'A', false, '/path/');
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array());
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/elsewhere')), array());
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/')), array('a=A'));
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path')), array('a=A'));
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/pa')), array());
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/here')), array('a=A'));
+ }
+
+ function testPathFilterDeeply() {
+ $jar = new SimpleCookieJar();
+ $jar->setCookie('a', 'A', false, '/path/more_path/');
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/')), array());
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path')), array());
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/pa')), array());
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/more_path/')), array('a=A'));
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/more_path/and_more')), array('a=A'));
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/not_here/')), array());
+ }
+
+ function testMultipleCookieWithDifferentPathsButSameName() {
+ $jar = new SimpleCookieJar();
+ $jar->setCookie('a', 'abc', false, '/');
+ $jar->setCookie('a', '123', false, '/path/here/');
+ $this->assertEqual(
+ $jar->selectAsPairs(new SimpleUrl('/')),
+ array('a=abc'));
+ $this->assertEqual(
+ $jar->selectAsPairs(new SimpleUrl('my-host.com/')),
+ array('a=abc'));
+ $this->assertEqual(
+ $jar->selectAsPairs(new SimpleUrl('my-host.com/path/')),
+ array('a=abc'));
+ $this->assertEqual(
+ $jar->selectAsPairs(new SimpleUrl('my-host.com/path/here')),
+ array('a=abc', 'a=123'));
+ $this->assertEqual(
+ $jar->selectAsPairs(new SimpleUrl('my-host.com/path/here/there')),
+ array('a=abc', 'a=123'));
+ }
+
+ function testOverwrite() {
+ $jar = new SimpleCookieJar();
+ $jar->setCookie('a', 'abc', false, '/');
+ $jar->setCookie('a', 'cde', false, '/');
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=cde'));
+ }
+
+ function testClearSessionCookies() {
+ $jar = new SimpleCookieJar();
+ $jar->setCookie('a', 'A', false, '/');
+ $jar->restartSession();
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array());
+ }
+
+ function testExpiryFilterByDate() {
+ $jar = new SimpleCookieJar();
+ $jar->setCookie('a', 'A', false, '/', 'Wed, 25-Dec-02 04:24:20 GMT');
+ $jar->restartSession("Wed, 25-Dec-02 04:24:19 GMT");
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=A'));
+ $jar->restartSession("Wed, 25-Dec-02 04:24:21 GMT");
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array());
+ }
+
+ function testExpiryFilterByAgeing() {
+ $jar = new SimpleCookieJar();
+ $jar->setCookie('a', 'A', false, '/', 'Wed, 25-Dec-02 04:24:20 GMT');
+ $jar->restartSession("Wed, 25-Dec-02 04:24:19 GMT");
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=A'));
+ $jar->agePrematurely(2);
+ $jar->restartSession("Wed, 25-Dec-02 04:24:19 GMT");
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array());
+ }
+
+ function testCookieClearing() {
+ $jar = new SimpleCookieJar();
+ $jar->setCookie('a', 'abc', false, '/');
+ $jar->setCookie('a', '', false, '/');
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a='));
+ }
+
+ function testCookieClearByLoweringDate() {
+ $jar = new SimpleCookieJar();
+ $jar->setCookie('a', 'abc', false, '/', 'Wed, 25-Dec-02 04:24:21 GMT');
+ $jar->setCookie('a', 'def', false, '/', 'Wed, 25-Dec-02 04:24:19 GMT');
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=def'));
+ $jar->restartSession('Wed, 25-Dec-02 04:24:20 GMT');
+ $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array());
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/detached_test.php b/tests/simpletest/test/detached_test.php
new file mode 100755
index 0000000000..b0e271f7fd
--- /dev/null
+++ b/tests/simpletest/test/detached_test.php
@@ -0,0 +1,15 @@
+<?php
+// $Id: detached_test.php,v 1.3 2007/04/30 23:39:59 lastcraft Exp $
+require_once('../detached.php');
+require_once('../reporter.php');
+
+// The following URL will depend on your own installation.
+$command = 'php ' . dirname(__FILE__) . '/visual_test.php xml';
+
+$test = &new TestSuite('Remote tests');
+$test->addTestCase(new DetachedTestCase($command));
+if (SimpleReporter::inCli()) {
+ exit ($test->run(new TextReporter()) ? 0 : 1);
+}
+$test->run(new HtmlReporter());
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/dumper_test.php b/tests/simpletest/test/dumper_test.php
new file mode 100755
index 0000000000..4144d96c57
--- /dev/null
+++ b/tests/simpletest/test/dumper_test.php
@@ -0,0 +1,88 @@
+<?php
+// $Id: dumper_test.php,v 1.6 2007/04/30 23:39:59 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+
+class DumperDummy {
+}
+
+class TestOfTextFormatting extends UnitTestCase {
+
+ function testClipping() {
+ $dumper = new SimpleDumper();
+ $this->assertEqual(
+ $dumper->clipString("Hello", 6),
+ "Hello",
+ "Hello, 6->%s");
+ $this->assertEqual(
+ $dumper->clipString("Hello", 5),
+ "Hello",
+ "Hello, 5->%s");
+ $this->assertEqual(
+ $dumper->clipString("Hello world", 3),
+ "Hel...",
+ "Hello world, 3->%s");
+ $this->assertEqual(
+ $dumper->clipString("Hello world", 6, 3),
+ "Hello ...",
+ "Hello world, 6, 3->%s");
+ $this->assertEqual(
+ $dumper->clipString("Hello world", 3, 6),
+ "...o w...",
+ "Hello world, 3, 6->%s");
+ $this->assertEqual(
+ $dumper->clipString("Hello world", 4, 11),
+ "...orld",
+ "Hello world, 4, 11->%s");
+ $this->assertEqual(
+ $dumper->clipString("Hello world", 4, 12),
+ "...orld",
+ "Hello world, 4, 12->%s");
+ }
+
+ function testDescribeNull() {
+ $dumper = new SimpleDumper();
+ $this->assertPattern('/null/i', $dumper->describeValue(null));
+ }
+
+ function testDescribeBoolean() {
+ $dumper = new SimpleDumper();
+ $this->assertPattern('/boolean/i', $dumper->describeValue(true));
+ $this->assertPattern('/true/i', $dumper->describeValue(true));
+ $this->assertPattern('/false/i', $dumper->describeValue(false));
+ }
+
+ function testDescribeString() {
+ $dumper = new SimpleDumper();
+ $this->assertPattern('/string/i', $dumper->describeValue('Hello'));
+ $this->assertPattern('/Hello/', $dumper->describeValue('Hello'));
+ }
+
+ function testDescribeInteger() {
+ $dumper = new SimpleDumper();
+ $this->assertPattern('/integer/i', $dumper->describeValue(35));
+ $this->assertPattern('/35/', $dumper->describeValue(35));
+ }
+
+ function testDescribeFloat() {
+ $dumper = new SimpleDumper();
+ $this->assertPattern('/float/i', $dumper->describeValue(0.99));
+ $this->assertPattern('/0\.99/', $dumper->describeValue(0.99));
+ }
+
+ function testDescribeArray() {
+ $dumper = new SimpleDumper();
+ $this->assertPattern('/array/i', $dumper->describeValue(array(1, 4)));
+ $this->assertPattern('/2/i', $dumper->describeValue(array(1, 4)));
+ }
+
+ function testDescribeObject() {
+ $dumper = new SimpleDumper();
+ $this->assertPattern(
+ '/object/i',
+ $dumper->describeValue(new DumperDummy()));
+ $this->assertPattern(
+ '/DumperDummy/i',
+ $dumper->describeValue(new DumperDummy()));
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/eclipse_test.php b/tests/simpletest/test/eclipse_test.php
new file mode 100755
index 0000000000..72cc3e0800
--- /dev/null
+++ b/tests/simpletest/test/eclipse_test.php
@@ -0,0 +1,32 @@
+<?php
+// $Id: eclipse_test.php,v 1.3 2007/04/30 23:39:59 lastcraft Exp $
+
+//To run this from the eclipse plugin...you need to make sure that the
+//SimpleTest path in the preferences is the same as the location of the
+//eclipse.php file below otherwise you end up with two "different" eclipse.php
+//files included and that does not work...
+
+include_once(dirname(__FILE__) . '/../eclipse.php');
+Mock::generate('SimpleSocket');
+
+class TestOfEclipse extends UnitTestCase {
+
+ function testPass() {
+ $listener = &new MockSimpleSocket();
+
+ $fullpath = realpath(dirname(__FILE__).'/support/test1.php');
+ $testpath = EclipseReporter::escapeVal($fullpath);
+ $expected = "{status:\"pass\",message:\"pass1 at [$testpath line 4]\",group:\"$testpath\",case:\"test1\",method:\"test_pass\"}";
+ //this should work...but it doesn't so the next line and the last line are the hacks
+ //$listener->expectOnce('write',array($expected));
+ $listener->setReturnValue('write',-1);
+
+ $pathparts = pathinfo($fullpath);
+ $filename = $pathparts['basename'];
+ $test= &new TestSuite($filename);
+ $test->addTestFile($fullpath);
+ $test->run(new EclipseReporter(&$listener));
+ $this->assertEqual($expected,$listener->output);
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/encoding_test.php b/tests/simpletest/test/encoding_test.php
new file mode 100755
index 0000000000..303a0d724e
--- /dev/null
+++ b/tests/simpletest/test/encoding_test.php
@@ -0,0 +1,191 @@
+<?php
+// $Id: encoding_test.php,v 1.17 2007/04/30 23:39:59 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../url.php');
+require_once(dirname(__FILE__) . '/../socket.php');
+
+Mock::generate('SimpleSocket');
+
+class TestOfEncodedParts extends UnitTestCase {
+
+ function testFormEncodedAsKeyEqualsValue() {
+ $pair = new SimpleEncodedPair('a', 'A');
+ $this->assertEqual($pair->asRequest(), 'a=A');
+ }
+
+ function testMimeEncodedAsHeadersAndContent() {
+ $pair = new SimpleEncodedPair('a', 'A');
+ $this->assertEqual(
+ $pair->asMime(),
+ "Content-Disposition: form-data; name=\"a\"\r\n\r\nA");
+ }
+
+ function testAttachmentEncodedAsHeadersWithDispositionAndContent() {
+ $part = new SimpleAttachment('a', 'A', 'aaa.txt');
+ $this->assertEqual(
+ $part->asMime(),
+ "Content-Disposition: form-data; name=\"a\"; filename=\"aaa.txt\"\r\n" .
+ "Content-Type: text/plain\r\n\r\nA");
+ }
+}
+
+class TestOfEncoding extends UnitTestCase {
+ var $_content_so_far;
+
+ function write($content) {
+ $this->_content_so_far .= $content;
+ }
+
+ function clear() {
+ $this->_content_so_far = '';
+ }
+
+ function assertWritten($encoding, $content, $message = '%s') {
+ $this->clear();
+ $encoding->writeTo($this);
+ $this->assertIdentical($this->_content_so_far, $content, $message);
+ }
+
+ function testGetEmpty() {
+ $encoding = &new SimpleGetEncoding();
+ $this->assertIdentical($encoding->getValue('a'), false);
+ $this->assertIdentical($encoding->asUrlRequest(), '');
+ }
+
+ function testPostEmpty() {
+ $encoding = &new SimplePostEncoding();
+ $this->assertIdentical($encoding->getValue('a'), false);
+ $this->assertWritten($encoding, '');
+ }
+
+ function testPrefilled() {
+ $encoding = &new SimplePostEncoding(array('a' => 'aaa'));
+ $this->assertIdentical($encoding->getValue('a'), 'aaa');
+ $this->assertWritten($encoding, 'a=aaa');
+ }
+
+ function testPrefilledWithObject() {
+ $encoding = &new SimplePostEncoding(new SimpleEncoding(array('a' => 'aaa')));
+ $this->assertIdentical($encoding->getValue('a'), 'aaa');
+ $this->assertWritten($encoding, 'a=aaa');
+ }
+
+ function testMultiplePrefilled() {
+ $encoding = &new SimplePostEncoding(array('a' => array('a1', 'a2')));
+ $this->assertIdentical($encoding->getValue('a'), array('a1', 'a2'));
+ $this->assertWritten($encoding, 'a=a1&a=a2');
+ }
+
+ function testSingleParameter() {
+ $encoding = &new SimplePostEncoding();
+ $encoding->add('a', 'Hello');
+ $this->assertEqual($encoding->getValue('a'), 'Hello');
+ $this->assertWritten($encoding, 'a=Hello');
+ }
+
+ function testFalseParameter() {
+ $encoding = &new SimplePostEncoding();
+ $encoding->add('a', false);
+ $this->assertEqual($encoding->getValue('a'), false);
+ $this->assertWritten($encoding, '');
+ }
+
+ function testUrlEncoding() {
+ $encoding = &new SimplePostEncoding();
+ $encoding->add('a', 'Hello there!');
+ $this->assertWritten($encoding, 'a=Hello+there%21');
+ }
+
+ function testUrlEncodingOfKey() {
+ $encoding = &new SimplePostEncoding();
+ $encoding->add('a!', 'Hello');
+ $this->assertWritten($encoding, 'a%21=Hello');
+ }
+
+ function testMultipleParameter() {
+ $encoding = &new SimplePostEncoding();
+ $encoding->add('a', 'Hello');
+ $encoding->add('b', 'Goodbye');
+ $this->assertWritten($encoding, 'a=Hello&b=Goodbye');
+ }
+
+ function testEmptyParameters() {
+ $encoding = &new SimplePostEncoding();
+ $encoding->add('a', '');
+ $encoding->add('b', '');
+ $this->assertWritten($encoding, 'a=&b=');
+ }
+
+ function testRepeatedParameter() {
+ $encoding = &new SimplePostEncoding();
+ $encoding->add('a', 'Hello');
+ $encoding->add('a', 'Goodbye');
+ $this->assertIdentical($encoding->getValue('a'), array('Hello', 'Goodbye'));
+ $this->assertWritten($encoding, 'a=Hello&a=Goodbye');
+ }
+
+ function testAddingLists() {
+ $encoding = &new SimplePostEncoding();
+ $encoding->add('a', array('Hello', 'Goodbye'));
+ $this->assertIdentical($encoding->getValue('a'), array('Hello', 'Goodbye'));
+ $this->assertWritten($encoding, 'a=Hello&a=Goodbye');
+ }
+
+ function testMergeInHash() {
+ $encoding = &new SimpleGetEncoding(array('a' => 'A1', 'b' => 'B'));
+ $encoding->merge(array('a' => 'A2'));
+ $this->assertIdentical($encoding->getValue('a'), array('A1', 'A2'));
+ $this->assertIdentical($encoding->getValue('b'), 'B');
+ }
+
+ function testMergeInObject() {
+ $encoding = &new SimpleGetEncoding(array('a' => 'A1', 'b' => 'B'));
+ $encoding->merge(new SimpleEncoding(array('a' => 'A2')));
+ $this->assertIdentical($encoding->getValue('a'), array('A1', 'A2'));
+ $this->assertIdentical($encoding->getValue('b'), 'B');
+ }
+
+ function testPrefilledMultipart() {
+ $encoding = &new SimpleMultipartEncoding(array('a' => 'aaa'), 'boundary');
+ $this->assertIdentical($encoding->getValue('a'), 'aaa');
+ $this->assertwritten($encoding,
+ "--boundary\r\n" .
+ "Content-Disposition: form-data; name=\"a\"\r\n" .
+ "\r\n" .
+ "aaa\r\n" .
+ "--boundary--\r\n");
+ }
+
+ function testAttachment() {
+ $encoding = &new SimpleMultipartEncoding(array(), 'boundary');
+ $encoding->attach('a', 'aaa', 'aaa.txt');
+ $this->assertIdentical($encoding->getValue('a'), 'aaa.txt');
+ $this->assertwritten($encoding,
+ "--boundary\r\n" .
+ "Content-Disposition: form-data; name=\"a\"; filename=\"aaa.txt\"\r\n" .
+ "Content-Type: text/plain\r\n" .
+ "\r\n" .
+ "aaa\r\n" .
+ "--boundary--\r\n");
+ }
+}
+
+class TestOfFormHeaders extends UnitTestCase {
+
+ function testEmptyEncodingWritesZeroContentLength() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("Content-Length: 0\r\n"));
+ $socket->expectArgumentsAt(1, 'write', array("Content-Type: application/x-www-form-urlencoded\r\n"));
+ $encoding = &new SimplePostEncoding();
+ $encoding->writeHeadersTo($socket);
+ }
+
+ function testEmptyMultipartEncodingWritesEndBoundaryContentLength() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("Content-Length: 14\r\n"));
+ $socket->expectArgumentsAt(1, 'write', array("Content-Type: multipart/form-data, boundary=boundary\r\n"));
+ $encoding = &new SimpleMultipartEncoding(array(), 'boundary');
+ $encoding->writeHeadersTo($socket);
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/errors_test.php b/tests/simpletest/test/errors_test.php
new file mode 100755
index 0000000000..7db8769a25
--- /dev/null
+++ b/tests/simpletest/test/errors_test.php
@@ -0,0 +1,300 @@
+<?php
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../errors.php');
+require_once(dirname(__FILE__) . '/../expectation.php');
+require_once(dirname(__FILE__) . '/../test_case.php');
+Mock::generate('SimpleTestCase');
+Mock::generate('SimpleExpectation');
+SimpleTest::ignore('MockSimpleTestCase');
+
+class TestOfErrorQueue extends UnitTestCase {
+
+ function setUp() {
+ $context = &SimpleTest::getContext();
+ $queue = &$context->get('SimpleErrorQueue');
+ $queue->clear();
+ }
+
+ function tearDown() {
+ $context = &SimpleTest::getContext();
+ $queue = &$context->get('SimpleErrorQueue');
+ $queue->clear();
+ }
+
+ function testOrder() {
+ $context = &SimpleTest::getContext();
+ $queue = &$context->get('SimpleErrorQueue');
+ $queue->add(1024, 'Ouch', 'here.php', 100);
+ $queue->add(512, 'Yuk', 'there.php', 101);
+ $this->assertEqual(
+ $queue->extract(),
+ array(1024, 'Ouch', 'here.php', 100));
+ $this->assertEqual(
+ $queue->extract(),
+ array(512, 'Yuk', 'there.php', 101));
+ $this->assertFalse($queue->extract());
+ }
+
+ function testAssertNoErrorsGivesTrueWhenNoErrors() {
+ $test = &new MockSimpleTestCase();
+ $test->expectOnce('assert', array(
+ new IdenticalExpectation(new TrueExpectation()),
+ true,
+ 'Should be no errors'));
+ $test->setReturnValue('assert', true);
+ $queue = &new SimpleErrorQueue();
+ $queue->setTestCase($test);
+ $this->assertTrue($queue->assertNoErrors('%s'));
+ }
+
+ function testAssertNoErrorsIssuesFailWhenErrors() {
+ $test = &new MockSimpleTestCase();
+ $test->expectOnce('assert', array(
+ new IdenticalExpectation(new TrueExpectation()),
+ false,
+ 'Should be no errors'));
+ $test->setReturnValue('assert', false);
+ $queue = &new SimpleErrorQueue();
+ $queue->setTestCase($test);
+ $queue->add(1024, 'Ouch', 'here.php', 100);
+ $this->assertFalse($queue->assertNoErrors('%s'));
+ }
+
+ function testAssertErrorFailsWhenNoError() {
+ $test = &new MockSimpleTestCase();
+ $test->expectOnce('fail', array('Expected error not found'));
+ $test->setReturnValue('assert', false);
+ $queue = &new SimpleErrorQueue();
+ $queue->setTestCase($test);
+ $this->assertFalse($queue->assertError(false, '%s'));
+ }
+
+ function testAssertErrorFailsWhenErrorDoesntMatchTheExpectation() {
+ $test = &new MockSimpleTestCase();
+ $test->expectOnce('assert', array(
+ new IdenticalExpectation(new FailedExpectation()),
+ 'B',
+ 'Expected PHP error [B] severity [E_USER_NOTICE] in [b.php] line [100]'));
+ $test->setReturnValue('assert', false);
+ $queue = &new SimpleErrorQueue();
+ $queue->setTestCase($test);
+ $queue->add(1024, 'B', 'b.php', 100);
+ $this->assertFalse($queue->assertError(new FailedExpectation(), '%s'));
+ }
+
+ function testExpectationMatchCancelsIncomingError() {
+ $test = &new MockSimpleTestCase();
+ $test->expectOnce('assert', array(
+ new IdenticalExpectation(new AnythingExpectation()),
+ 'B',
+ 'a message'));
+ $test->setReturnValue('assert', true);
+ $test->expectNever('error');
+ $queue = &new SimpleErrorQueue();
+ $queue->setTestCase($test);
+ $queue->expectError(new AnythingExpectation(), 'a message');
+ $queue->add(1024, 'B', 'b.php', 100);
+ }
+}
+
+class TestOfErrorTrap extends UnitTestCase {
+ var $_old;
+
+ function setUp() {
+ $this->_old = error_reporting(E_ALL);
+ set_error_handler('SimpleTestErrorHandler');
+ }
+
+ function tearDown() {
+ restore_error_handler();
+ error_reporting($this->_old);
+ }
+
+ function testQueueStartsEmpty() {
+ $context = &SimpleTest::getContext();
+ $queue = &$context->get('SimpleErrorQueue');
+ $this->assertFalse($queue->extract());
+ }
+
+ function testTrappedErrorPlacedInQueue() {
+ trigger_error('Ouch!');
+ $context = &SimpleTest::getContext();
+ $queue = &$context->get('SimpleErrorQueue');
+ list($severity, $message, $file, $line) = $queue->extract();
+ $this->assertEqual($message, 'Ouch!');
+ $this->assertEqual($file, __FILE__);
+ $this->assertFalse($queue->extract());
+ }
+
+ function testErrorsAreSwallowedByMatchingExpectation() {
+ $this->expectError('Ouch!');
+ trigger_error('Ouch!');
+ }
+
+ function testErrorsAreSwallowedInOrder() {
+ $this->expectError('a');
+ $this->expectError('b');
+ trigger_error('a');
+ trigger_error('b');
+ }
+
+ function testAnyErrorCanBeSwallowed() {
+ $this->expectError();
+ trigger_error('Ouch!');
+ }
+
+ function testErrorCanBeSwallowedByPatternMatching() {
+ $this->expectError(new PatternExpectation('/ouch/i'));
+ trigger_error('Ouch!');
+ }
+
+ function testErrorWithPercentsPassesWithNoSprintfError() {
+ $this->expectError("%");
+ trigger_error('%');
+ }
+}
+
+class TestOfErrors extends UnitTestCase {
+ var $_old;
+
+ function setUp() {
+ $this->_old = error_reporting(E_ALL);
+ }
+
+ function tearDown() {
+ error_reporting($this->_old);
+ }
+
+ function testDefaultWhenAllReported() {
+ error_reporting(E_ALL);
+ trigger_error('Ouch!');
+ $this->assertError('Ouch!');
+ }
+
+ function testNoticeWhenReported() {
+ error_reporting(E_ALL);
+ trigger_error('Ouch!', E_USER_NOTICE);
+ $this->assertError('Ouch!');
+ }
+
+ function testWarningWhenReported() {
+ error_reporting(E_ALL);
+ trigger_error('Ouch!', E_USER_WARNING);
+ $this->assertError('Ouch!');
+ }
+
+ function testErrorWhenReported() {
+ error_reporting(E_ALL);
+ trigger_error('Ouch!', E_USER_ERROR);
+ $this->assertError('Ouch!');
+ }
+
+ function testNoNoticeWhenNotReported() {
+ error_reporting(0);
+ trigger_error('Ouch!', E_USER_NOTICE);
+ }
+
+ function testNoWarningWhenNotReported() {
+ error_reporting(0);
+ trigger_error('Ouch!', E_USER_WARNING);
+ }
+
+ function testNoticeSuppressedWhenReported() {
+ error_reporting(E_ALL);
+ @trigger_error('Ouch!', E_USER_NOTICE);
+ }
+
+ function testWarningSuppressedWhenReported() {
+ error_reporting(E_ALL);
+ @trigger_error('Ouch!', E_USER_WARNING);
+ }
+
+ function testErrorWithPercentsReportedWithNoSprintfError() {
+ trigger_error('%');
+ $this->assertError('%');
+ }
+}
+
+class TestOfPHP52RecoverableErrors extends UnitTestCase {
+ function skip() {
+ $this->skipIf(
+ version_compare(phpversion(), '5.2', '<'),
+ 'E_RECOVERABLE_ERROR not tested for PHP below 5.2');
+ }
+
+ function testError() {
+ eval('
+ class RecoverableErrorTestingStub {
+ function ouch(RecoverableErrorTestingStub $obj) {
+ }
+ }
+ ');
+
+ $stub = new RecoverableErrorTestingStub();
+ $this->expectError(new PatternExpectation('/must be an instance of RecoverableErrorTestingStub/i'));
+ $stub->ouch(new stdClass());
+ }
+}
+
+class TestOfErrorsExcludingPHP52AndAbove extends UnitTestCase {
+ function skip() {
+ $this->skipIf(
+ version_compare(phpversion(), '5.2', '>='),
+ 'E_USER_ERROR not tested for PHP 5.2 and above');
+ }
+
+ function testNoErrorWhenNotReported() {
+ error_reporting(0);
+ trigger_error('Ouch!', E_USER_ERROR);
+ }
+
+ function testErrorSuppressedWhenReported() {
+ error_reporting(E_ALL);
+ @trigger_error('Ouch!', E_USER_ERROR);
+ }
+}
+
+SimpleTest::ignore('TestOfNotEnoughErrors');
+/**
+ * This test is ignored as it is used by {@link TestRunnerForLeftOverAndNotEnoughErrors}
+ * to verify that it fails as expected.
+ *
+ * @ignore
+ */
+class TestOfNotEnoughErrors extends UnitTestCase {
+ function testExpectTwoErrorsThrowOne() {
+ $this->expectError('Error 1');
+ trigger_error('Error 1');
+ $this->expectError('Error 2');
+ }
+}
+
+SimpleTest::ignore('TestOfLeftOverErrors');
+/**
+ * This test is ignored as it is used by {@link TestRunnerForLeftOverAndNotEnoughErrors}
+ * to verify that it fails as expected.
+ *
+ * @ignore
+ */
+class TestOfLeftOverErrors extends UnitTestCase {
+ function testExpectOneErrorGetTwo() {
+ $this->expectError('Error 1');
+ trigger_error('Error 1');
+ trigger_error('Error 2');
+ }
+}
+
+class TestRunnerForLeftOverAndNotEnoughErrors extends UnitTestCase {
+ function testRunLeftOverErrorsTestCase() {
+ $test = new TestOfLeftOverErrors();
+ $this->assertFalse($test->run(new SimpleReporter()));
+ }
+
+ function testRunNotEnoughErrors() {
+ $test = new TestOfNotEnoughErrors();
+ $this->assertFalse($test->run(new SimpleReporter()));
+ }
+}
+
+// TODO: Add stacked error handler test
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/exceptions_test.php b/tests/simpletest/test/exceptions_test.php
new file mode 100755
index 0000000000..bdc31818af
--- /dev/null
+++ b/tests/simpletest/test/exceptions_test.php
@@ -0,0 +1,120 @@
+<?php
+// $Id: exceptions_test.php,v 1.10 2007/04/30 23:39:59 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../exceptions.php');
+require_once(dirname(__FILE__) . '/../expectation.php');
+require_once(dirname(__FILE__) . '/../test_case.php');
+Mock::generate('SimpleTestCase');
+Mock::generate('SimpleExpectation');
+
+class MyTestException extends Exception {}
+class HigherTestException extends MyTestException {}
+class OtherTestException extends Exception {}
+
+class TestOfExceptionExpectation extends UnitTestCase {
+
+ function testExceptionClassAsStringWillMatchExceptionsRootedOnThatClass() {
+ $expectation = new ExceptionExpectation('MyTestException');
+ $this->assertTrue($expectation->test(new MyTestException()));
+ $this->assertTrue($expectation->test(new HigherTestException()));
+ $this->assertFalse($expectation->test(new OtherTestException()));
+ }
+
+ function testMatchesClassAndMessageWhenExceptionExpected() {
+ $expectation = new ExceptionExpectation(new MyTestException('Hello'));
+ $this->assertTrue($expectation->test(new MyTestException('Hello')));
+ $this->assertFalse($expectation->test(new HigherTestException('Hello')));
+ $this->assertFalse($expectation->test(new OtherTestException('Hello')));
+ $this->assertFalse($expectation->test(new MyTestException('Goodbye')));
+ $this->assertFalse($expectation->test(new MyTestException()));
+ }
+
+ function testMessagelessExceptionMatchesOnlyOnClass() {
+ $expectation = new ExceptionExpectation(new MyTestException());
+ $this->assertTrue($expectation->test(new MyTestException()));
+ $this->assertFalse($expectation->test(new HigherTestException()));
+ }
+}
+
+class TestOfExceptionTrap extends UnitTestCase {
+
+ function testNoExceptionsInQueueMeansNoTestMessages() {
+ $test = new MockSimpleTestCase();
+ $test->expectNever('assert');
+ $queue = new SimpleExceptionTrap();
+ $this->assertFalse($queue->isExpected($test, new Exception()));
+ }
+
+ function testMatchingExceptionGivesTrue() {
+ $expectation = new MockSimpleExpectation();
+ $expectation->setReturnValue('test', true);
+ $test = new MockSimpleTestCase();
+ $test->setReturnValue('assert', true);
+ $queue = new SimpleExceptionTrap();
+ $queue->expectException($expectation, 'message');
+ $this->assertTrue($queue->isExpected($test, new Exception()));
+ }
+
+ function testMatchingExceptionTriggersAssertion() {
+ $test = new MockSimpleTestCase();
+ $test->expectOnce('assert', array(
+ '*',
+ new ExceptionExpectation(new Exception()),
+ 'message'));
+ $queue = new SimpleExceptionTrap();
+ $queue->expectException(new ExceptionExpectation(new Exception()), 'message');
+ $queue->isExpected($test, new Exception());
+ }
+}
+
+class TestOfCatchingExceptions extends UnitTestCase {
+
+ function testCanCatchAnyExpectedException() {
+ $this->expectException();
+ throw new Exception();
+ }
+
+ function testCanMatchExceptionByClass() {
+ $this->expectException('MyTestException');
+ throw new HigherTestException();
+ }
+
+ function testCanMatchExceptionExactly() {
+ $this->expectException(new Exception('Ouch'));
+ throw new Exception('Ouch');
+ }
+
+ function testLastListedExceptionIsTheOneThatCounts() {
+ $this->expectException('OtherTestException');
+ $this->expectException('MyTestException');
+ throw new HigherTestException();
+ }
+}
+
+class Test1Exception extends Exception {}
+class Test2Exception extends Exception {}
+
+class TestOfCallingTearDownWithExceptions extends UnitTestCase {
+ public function setUp() {
+ $GLOBALS['setUp'] = true;
+ }
+
+ public function tearDown() {
+ $GLOBALS['tearDown'] = true;
+ }
+
+ public function test1() {
+ $this->assertTrue($GLOBALS['setUp']);
+ $this->assertNull($GLOBALS['tearDown']);
+ $this->expectException('Test1Exception');
+ throw new Test1Exception(__FUNCTION__);
+ }
+
+ public function test2() {
+ $this->assertTrue($GLOBALS['setUp']);
+ $this->assertTrue($GLOBALS['tearDown']);
+ $this->expectException('Test2Exception');
+ throw new Test2Exception(__FUNCTION__);
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/expectation_test.php b/tests/simpletest/test/expectation_test.php
new file mode 100755
index 0000000000..a8d3729af7
--- /dev/null
+++ b/tests/simpletest/test/expectation_test.php
@@ -0,0 +1,245 @@
+<?php
+// $Id: expectation_test.php,v 1.26 2007/06/09 08:35:54 pachanga Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../expectation.php');
+
+class TestOfEquality extends UnitTestCase {
+
+ function testBoolean() {
+ $is_true = &new EqualExpectation(true);
+ $this->assertTrue($is_true->test(true));
+ $this->assertFalse($is_true->test(false));
+ }
+
+ function testStringMatch() {
+ $hello = &new EqualExpectation("Hello");
+ $this->assertTrue($hello->test("Hello"));
+ $this->assertFalse($hello->test("Goodbye"));
+ }
+
+ function testInteger() {
+ $fifteen = &new EqualExpectation(15);
+ $this->assertTrue($fifteen->test(15));
+ $this->assertFalse($fifteen->test(14));
+ }
+
+ function testFloat() {
+ $pi = &new EqualExpectation(3.14);
+ $this->assertTrue($pi->test(3.14));
+ $this->assertFalse($pi->test(3.15));
+ }
+
+ function testArray() {
+ $colours = &new EqualExpectation(array("r", "g", "b"));
+ $this->assertTrue($colours->test(array("r", "g", "b")));
+ $this->assertFalse($colours->test(array("g", "b", "r")));
+ }
+
+ function testHash() {
+ $is_blue = &new EqualExpectation(array("r" => 0, "g" => 0, "b" => 255));
+ $this->assertTrue($is_blue->test(array("r" => 0, "g" => 0, "b" => 255)));
+ $this->assertFalse($is_blue->test(array("r" => 0, "g" => 255, "b" => 0)));
+ }
+
+ function testHashWithOutOfOrderKeysShouldStillMatch() {
+ $any_order = &new EqualExpectation(array('a' => 1, 'b' => 2));
+ $this->assertTrue($any_order->test(array('b' => 2, 'a' => 1)));
+ }
+}
+
+class TestOfWithin extends UnitTestCase {
+
+ function testWithinFloatingPointMargin() {
+ $within = new WithinMarginExpectation(1.0, 0.2);
+ $this->assertFalse($within->test(0.7));
+ $this->assertTrue($within->test(0.8));
+ $this->assertTrue($within->test(0.9));
+ $this->assertTrue($within->test(1.1));
+ $this->assertTrue($within->test(1.2));
+ $this->assertFalse($within->test(1.3));
+ }
+
+ function testOutsideFloatingPointMargin() {
+ $within = new OutsideMarginExpectation(1.0, 0.2);
+ $this->assertTrue($within->test(0.7));
+ $this->assertFalse($within->test(0.8));
+ $this->assertFalse($within->test(1.2));
+ $this->assertTrue($within->test(1.3));
+ }
+}
+
+class TestOfInequality extends UnitTestCase {
+
+ function testStringMismatch() {
+ $not_hello = &new NotEqualExpectation("Hello");
+ $this->assertTrue($not_hello->test("Goodbye"));
+ $this->assertFalse($not_hello->test("Hello"));
+ }
+}
+
+class RecursiveNasty {
+ var $_me;
+
+ function RecursiveNasty() {
+ $this->_me = $this;
+ }
+}
+
+class TestOfIdentity extends UnitTestCase {
+
+ function testType() {
+ $string = &new IdenticalExpectation("37");
+ $this->assertTrue($string->test("37"));
+ $this->assertFalse($string->test(37));
+ $this->assertFalse($string->test("38"));
+ }
+
+ function _testNastyPhp5Bug() {
+ $this->assertFalse(new RecursiveNasty() != new RecursiveNasty());
+ }
+
+ function _testReallyHorribleRecursiveStructure() {
+ $hopeful = &new IdenticalExpectation(new RecursiveNasty());
+ $this->assertTrue($hopeful->test(new RecursiveNasty()));
+ }
+}
+
+class DummyReferencedObject{}
+
+class TestOfReference extends UnitTestCase {
+
+ function testReference() {
+ $foo = "foo";
+ $ref =& $foo;
+ $not_ref = $foo;
+ $bar = "bar";
+
+ $expect = &new ReferenceExpectation($foo);
+ $this->assertTrue($expect->test($ref));
+ $this->assertFalse($expect->test($not_ref));
+ $this->assertFalse($expect->test($bar));
+ }
+
+ function testObjectsReferencesDualityForPhp5AndPhp4() {
+ $dummy = new DummyReferencedObject();
+ $ref =& $dummy;
+ $not_ref = $dummy;
+
+ $hopeful = &new ReferenceExpectation($dummy);
+ $this->assertTrue($hopeful->test($ref));
+
+ if (version_compare(phpversion(), '5') >= 0) {
+ $this->assertTrue($hopeful->test($not_ref));
+ } else {
+ $this->assertFalse($hopeful->test($not_ref));
+ }
+ }
+
+ function testReallyHorribleRecursiveStructure() {
+ $nasty = new RecursiveNasty();
+ $ref =& $nasty;
+ $hopeful = &new ReferenceExpectation($nasty);
+ $this->assertTrue($hopeful->test($ref));
+ }
+}
+
+class TestOfNonIdentity extends UnitTestCase {
+
+ function testType() {
+ $string = &new NotIdenticalExpectation("37");
+ $this->assertTrue($string->test("38"));
+ $this->assertTrue($string->test(37));
+ $this->assertFalse($string->test("37"));
+ }
+}
+
+class TestOfPatterns extends UnitTestCase {
+
+ function testWanted() {
+ $pattern = &new PatternExpectation('/hello/i');
+ $this->assertTrue($pattern->test("Hello world"));
+ $this->assertFalse($pattern->test("Goodbye world"));
+ }
+
+ function testUnwanted() {
+ $pattern = &new NoPatternExpectation('/hello/i');
+ $this->assertFalse($pattern->test("Hello world"));
+ $this->assertTrue($pattern->test("Goodbye world"));
+ }
+}
+
+class ExpectedMethodTarget {
+ function hasThisMethod() {}
+}
+
+class TestOfMethodExistence extends UnitTestCase {
+
+ function testHasMethod() {
+ $instance = &new ExpectedMethodTarget();
+ $expectation = &new MethodExistsExpectation('hasThisMethod');
+ $this->assertTrue($expectation->test($instance));
+ $expectation = &new MethodExistsExpectation('doesNotHaveThisMethod');
+ $this->assertFalse($expectation->test($instance));
+ }
+}
+
+class TestOfIsA extends UnitTestCase {
+
+ function testString() {
+ $expectation = &new IsAExpectation('string');
+ $this->assertTrue($expectation->test('Hello'));
+ $this->assertFalse($expectation->test(5));
+ }
+
+ function testBoolean() {
+ $expectation = &new IsAExpectation('boolean');
+ $this->assertTrue($expectation->test(true));
+ $this->assertFalse($expectation->test(1));
+ }
+
+ function testBool() {
+ $expectation = &new IsAExpectation('bool');
+ $this->assertTrue($expectation->test(true));
+ $this->assertFalse($expectation->test(1));
+ }
+
+ function testDouble() {
+ $expectation = &new IsAExpectation('double');
+ $this->assertTrue($expectation->test(5.0));
+ $this->assertFalse($expectation->test(5));
+ }
+
+ function testFloat() {
+ $expectation = &new IsAExpectation('float');
+ $this->assertTrue($expectation->test(5.0));
+ $this->assertFalse($expectation->test(5));
+ }
+
+ function testReal() {
+ $expectation = &new IsAExpectation('real');
+ $this->assertTrue($expectation->test(5.0));
+ $this->assertFalse($expectation->test(5));
+ }
+
+ function testInteger() {
+ $expectation = &new IsAExpectation('integer');
+ $this->assertTrue($expectation->test(5));
+ $this->assertFalse($expectation->test(5.0));
+ }
+
+ function testInt() {
+ $expectation = &new IsAExpectation('int');
+ $this->assertTrue($expectation->test(5));
+ $this->assertFalse($expectation->test(5.0));
+ }
+}
+
+class TestOfNotA extends UnitTestCase {
+
+ function testString() {
+ $expectation = &new NotAExpectation('string');
+ $this->assertFalse($expectation->test('Hello'));
+ $this->assertTrue($expectation->test(5));
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/form_test.php b/tests/simpletest/test/form_test.php
new file mode 100755
index 0000000000..43ab2b2906
--- /dev/null
+++ b/tests/simpletest/test/form_test.php
@@ -0,0 +1,309 @@
+<?php
+// $Id: form_test.php,v 1.20 2007/07/16 22:28:39 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../url.php');
+require_once(dirname(__FILE__) . '/../form.php');
+require_once(dirname(__FILE__) . '/../page.php');
+require_once(dirname(__FILE__) . '/../encoding.php');
+Mock::generate('SimplePage');
+
+class TestOfForm extends UnitTestCase {
+
+ function &page($url, $action = false) {
+ $page = &new MockSimplePage();
+ $page->setReturnValue('getUrl', new SimpleUrl($url));
+ $page->setReturnValue('expandUrl', new SimpleUrl($url));
+ return $page;
+ }
+
+ function testFormAttributes() {
+ $tag = &new SimpleFormTag(array('method' => 'GET', 'action' => 'here.php', 'id' => '33'));
+ $form = &new SimpleForm($tag, $this->page('http://host/a/index.html'));
+ $this->assertEqual($form->getMethod(), 'get');
+ $this->assertIdentical($form->getId(), '33');
+ $this->assertNull($form->getValue(new SimpleByName('a')));
+ }
+
+ function testAction() {
+ $page = &new MockSimplePage();
+ $page->expectOnce('expandUrl', array(new SimpleUrl('here.php')));
+ $page->setReturnValue('expandUrl', new SimpleUrl('http://host/here.php'));
+ $tag = &new SimpleFormTag(array('method' => 'GET', 'action' => 'here.php'));
+ $form = &new SimpleForm($tag, $page);
+ $this->assertEqual($form->getAction(), new SimpleUrl('http://host/here.php'));
+ }
+
+ function testEmptyAction() {
+ $tag = &new SimpleFormTag(array('method' => 'GET', 'action' => '', 'id' => '33'));
+ $form = &new SimpleForm($tag, $this->page('http://host/a/index.html'));
+ $this->assertEqual(
+ $form->getAction(),
+ new SimpleUrl('http://host/a/index.html'));
+ }
+
+ function testMissingAction() {
+ $tag = &new SimpleFormTag(array('method' => 'GET'));
+ $form = &new SimpleForm($tag, $this->page('http://host/a/index.html'));
+ $this->assertEqual(
+ $form->getAction(),
+ new SimpleUrl('http://host/a/index.html'));
+ }
+
+ function testRootAction() {
+ $page = &new MockSimplePage();
+ $page->expectOnce('expandUrl', array(new SimpleUrl('/')));
+ $page->setReturnValue('expandUrl', new SimpleUrl('http://host/'));
+ $tag = &new SimpleFormTag(array('method' => 'GET', 'action' => '/'));
+ $form = &new SimpleForm($tag, $page);
+ $this->assertEqual(
+ $form->getAction(),
+ new SimpleUrl('http://host/'));
+ }
+
+ function testDefaultFrameTargetOnForm() {
+ $page = &new MockSimplePage();
+ $page->expectOnce('expandUrl', array(new SimpleUrl('here.php')));
+ $page->setReturnValue('expandUrl', new SimpleUrl('http://host/here.php'));
+ $tag = &new SimpleFormTag(array('method' => 'GET', 'action' => 'here.php'));
+ $form = &new SimpleForm($tag, $page);
+ $form->setDefaultTarget('frame');
+ $expected = new SimpleUrl('http://host/here.php');
+ $expected->setTarget('frame');
+ $this->assertEqual($form->getAction(), $expected);
+ }
+
+ function testTextWidget() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
+ $form->addWidget(new SimpleTextTag(
+ array('name' => 'me', 'type' => 'text', 'value' => 'Myself')));
+ $this->assertIdentical($form->getValue(new SimpleByName('me')), 'Myself');
+ $this->assertTrue($form->setField(new SimpleByName('me'), 'Not me'));
+ $this->assertFalse($form->setField(new SimpleByName('not_present'), 'Not me'));
+ $this->assertIdentical($form->getValue(new SimpleByName('me')), 'Not me');
+ $this->assertNull($form->getValue(new SimpleByName('not_present')));
+ }
+
+ function testTextWidgetById() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
+ $form->addWidget(new SimpleTextTag(
+ array('name' => 'me', 'type' => 'text', 'value' => 'Myself', 'id' => 50)));
+ $this->assertIdentical($form->getValue(new SimpleById(50)), 'Myself');
+ $this->assertTrue($form->setField(new SimpleById(50), 'Not me'));
+ $this->assertIdentical($form->getValue(new SimpleById(50)), 'Not me');
+ }
+
+ function testTextWidgetByLabel() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
+ $widget = &new SimpleTextTag(array('name' => 'me', 'type' => 'text', 'value' => 'a'));
+ $form->addWidget($widget);
+ $widget->setLabel('thing');
+ $this->assertIdentical($form->getValue(new SimpleByLabel('thing')), 'a');
+ $this->assertTrue($form->setField(new SimpleByLabel('thing'), 'b'));
+ $this->assertIdentical($form->getValue(new SimpleByLabel('thing')), 'b');
+ }
+
+ function testSubmitEmpty() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
+ $this->assertIdentical($form->submit(), new SimpleGetEncoding());
+ }
+
+ function testSubmitButton() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('http://host'));
+ $form->addWidget(new SimpleSubmitTag(
+ array('type' => 'submit', 'name' => 'go', 'value' => 'Go!', 'id' => '9')));
+ $this->assertTrue($form->hasSubmit(new SimpleByName('go')));
+ $this->assertEqual($form->getValue(new SimpleByName('go')), 'Go!');
+ $this->assertEqual($form->getValue(new SimpleById(9)), 'Go!');
+ $this->assertEqual(
+ $form->submitButton(new SimpleByName('go')),
+ new SimpleGetEncoding(array('go' => 'Go!')));
+ $this->assertEqual(
+ $form->submitButton(new SimpleByLabel('Go!')),
+ new SimpleGetEncoding(array('go' => 'Go!')));
+ $this->assertEqual(
+ $form->submitButton(new SimpleById(9)),
+ new SimpleGetEncoding(array('go' => 'Go!')));
+ }
+
+ function testSubmitWithAdditionalParameters() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('http://host'));
+ $form->addWidget(new SimpleSubmitTag(
+ array('type' => 'submit', 'name' => 'go', 'value' => 'Go!')));
+ $this->assertEqual(
+ $form->submitButton(new SimpleByLabel('Go!'), array('a' => 'A')),
+ new SimpleGetEncoding(array('go' => 'Go!', 'a' => 'A')));
+ }
+
+ function testSubmitButtonWithLabelOfSubmit() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('http://host'));
+ $form->addWidget(new SimpleSubmitTag(
+ array('type' => 'submit', 'name' => 'test', 'value' => 'Submit')));
+ $this->assertEqual(
+ $form->submitButton(new SimpleByName('test')),
+ new SimpleGetEncoding(array('test' => 'Submit')));
+ $this->assertEqual(
+ $form->submitButton(new SimpleByLabel('Submit')),
+ new SimpleGetEncoding(array('test' => 'Submit')));
+ }
+
+ function testSubmitButtonWithWhitespacePaddedLabelOfSubmit() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('http://host'));
+ $form->addWidget(new SimpleSubmitTag(
+ array('type' => 'submit', 'name' => 'test', 'value' => ' Submit ')));
+ $this->assertEqual(
+ $form->submitButton(new SimpleByLabel('Submit')),
+ new SimpleGetEncoding(array('test' => ' Submit ')));
+ }
+
+ function testImageSubmitButton() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
+ $form->addWidget(new SimpleImageSubmitTag(array(
+ 'type' => 'image',
+ 'src' => 'source.jpg',
+ 'name' => 'go',
+ 'alt' => 'Go!',
+ 'id' => '9')));
+ $this->assertTrue($form->hasImage(new SimpleByLabel('Go!')));
+ $this->assertEqual(
+ $form->submitImage(new SimpleByLabel('Go!'), 100, 101),
+ new SimpleGetEncoding(array('go.x' => 100, 'go.y' => 101)));
+ $this->assertTrue($form->hasImage(new SimpleByName('go')));
+ $this->assertEqual(
+ $form->submitImage(new SimpleByName('go'), 100, 101),
+ new SimpleGetEncoding(array('go.x' => 100, 'go.y' => 101)));
+ $this->assertTrue($form->hasImage(new SimpleById(9)));
+ $this->assertEqual(
+ $form->submitImage(new SimpleById(9), 100, 101),
+ new SimpleGetEncoding(array('go.x' => 100, 'go.y' => 101)));
+ }
+
+ function testImageSubmitButtonWithAdditionalData() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
+ $form->addWidget(new SimpleImageSubmitTag(array(
+ 'type' => 'image',
+ 'src' => 'source.jpg',
+ 'name' => 'go',
+ 'alt' => 'Go!')));
+ $this->assertEqual(
+ $form->submitImage(new SimpleByLabel('Go!'), 100, 101, array('a' => 'A')),
+ new SimpleGetEncoding(array('go.x' => 100, 'go.y' => 101, 'a' => 'A')));
+ }
+
+ function testButtonTag() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('http://host'));
+ $widget = &new SimpleButtonTag(
+ array('type' => 'submit', 'name' => 'go', 'value' => 'Go', 'id' => '9'));
+ $widget->addContent('Go!');
+ $form->addWidget($widget);
+ $this->assertTrue($form->hasSubmit(new SimpleByName('go')));
+ $this->assertTrue($form->hasSubmit(new SimpleByLabel('Go!')));
+ $this->assertEqual(
+ $form->submitButton(new SimpleByName('go')),
+ new SimpleGetEncoding(array('go' => 'Go')));
+ $this->assertEqual(
+ $form->submitButton(new SimpleByLabel('Go!')),
+ new SimpleGetEncoding(array('go' => 'Go')));
+ $this->assertEqual(
+ $form->submitButton(new SimpleById(9)),
+ new SimpleGetEncoding(array('go' => 'Go')));
+ }
+
+ function testSingleSelectFieldSubmitted() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
+ $select = &new SimpleSelectionTag(array('name' => 'a'));
+ $select->addTag(new SimpleOptionTag(
+ array('value' => 'aaa', 'selected' => '')));
+ $form->addWidget($select);
+ $this->assertIdentical(
+ $form->submit(),
+ new SimpleGetEncoding(array('a' => 'aaa')));
+ }
+
+ function testSingleSelectFieldSubmittedWithPost() {
+ $form = &new SimpleForm(new SimpleFormTag(array('method' => 'post')), $this->page('htp://host'));
+ $select = &new SimpleSelectionTag(array('name' => 'a'));
+ $select->addTag(new SimpleOptionTag(
+ array('value' => 'aaa', 'selected' => '')));
+ $form->addWidget($select);
+ $this->assertIdentical(
+ $form->submit(),
+ new SimplePostEncoding(array('a' => 'aaa')));
+ }
+
+ function testUnchecked() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
+ $form->addWidget(new SimpleCheckboxTag(
+ array('name' => 'me', 'type' => 'checkbox')));
+ $this->assertIdentical($form->getValue(new SimpleByName('me')), false);
+ $this->assertTrue($form->setField(new SimpleByName('me'), 'on'));
+ $this->assertEqual($form->getValue(new SimpleByName('me')), 'on');
+ $this->assertFalse($form->setField(new SimpleByName('me'), 'other'));
+ $this->assertEqual($form->getValue(new SimpleByName('me')), 'on');
+ }
+
+ function testChecked() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
+ $form->addWidget(new SimpleCheckboxTag(
+ array('name' => 'me', 'value' => 'a', 'type' => 'checkbox', 'checked' => '')));
+ $this->assertIdentical($form->getValue(new SimpleByName('me')), 'a');
+ $this->assertTrue($form->setField(new SimpleByName('me'), 'a'));
+ $this->assertEqual($form->getValue(new SimpleByName('me')), 'a');
+ $this->assertTrue($form->setField(new SimpleByName('me'), false));
+ $this->assertEqual($form->getValue(new SimpleByName('me')), false);
+ }
+
+ function testSingleUncheckedRadioButton() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
+ $form->addWidget(new SimpleRadioButtonTag(
+ array('name' => 'me', 'value' => 'a', 'type' => 'radio')));
+ $this->assertIdentical($form->getValue(new SimpleByName('me')), false);
+ $this->assertTrue($form->setField(new SimpleByName('me'), 'a'));
+ $this->assertEqual($form->getValue(new SimpleByName('me')), 'a');
+ }
+
+ function testSingleCheckedRadioButton() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
+ $form->addWidget(new SimpleRadioButtonTag(
+ array('name' => 'me', 'value' => 'a', 'type' => 'radio', 'checked' => '')));
+ $this->assertIdentical($form->getValue(new SimpleByName('me')), 'a');
+ $this->assertFalse($form->setField(new SimpleByName('me'), 'other'));
+ }
+
+ function testUncheckedRadioButtons() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
+ $form->addWidget(new SimpleRadioButtonTag(
+ array('name' => 'me', 'value' => 'a', 'type' => 'radio')));
+ $form->addWidget(new SimpleRadioButtonTag(
+ array('name' => 'me', 'value' => 'b', 'type' => 'radio')));
+ $this->assertIdentical($form->getValue(new SimpleByName('me')), false);
+ $this->assertTrue($form->setField(new SimpleByName('me'), 'a'));
+ $this->assertIdentical($form->getValue(new SimpleByName('me')), 'a');
+ $this->assertTrue($form->setField(new SimpleByName('me'), 'b'));
+ $this->assertIdentical($form->getValue(new SimpleByName('me')), 'b');
+ $this->assertFalse($form->setField(new SimpleByName('me'), 'c'));
+ $this->assertIdentical($form->getValue(new SimpleByName('me')), 'b');
+ }
+
+ function testCheckedRadioButtons() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
+ $form->addWidget(new SimpleRadioButtonTag(
+ array('name' => 'me', 'value' => 'a', 'type' => 'radio')));
+ $form->addWidget(new SimpleRadioButtonTag(
+ array('name' => 'me', 'value' => 'b', 'type' => 'radio', 'checked' => '')));
+ $this->assertIdentical($form->getValue(new SimpleByName('me')), 'b');
+ $this->assertTrue($form->setField(new SimpleByName('me'), 'a'));
+ $this->assertIdentical($form->getValue(new SimpleByName('me')), 'a');
+ }
+
+ function testMultipleFieldsWithSameKey() {
+ $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
+ $form->addWidget(new SimpleCheckboxTag(
+ array('name' => 'a', 'type' => 'checkbox', 'value' => 'me')));
+ $form->addWidget(new SimpleCheckboxTag(
+ array('name' => 'a', 'type' => 'checkbox', 'value' => 'you')));
+ $this->assertIdentical($form->getValue(new SimpleByName('a')), false);
+ $this->assertTrue($form->setField(new SimpleByName('a'), 'me'));
+ $this->assertIdentical($form->getValue(new SimpleByName('a')), 'me');
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/frames_test.php b/tests/simpletest/test/frames_test.php
new file mode 100755
index 0000000000..2e6989da22
--- /dev/null
+++ b/tests/simpletest/test/frames_test.php
@@ -0,0 +1,549 @@
+<?php
+// $Id: frames_test.php,v 1.41 2007/07/14 02:04:34 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../tag.php');
+require_once(dirname(__FILE__) . '/../page.php');
+require_once(dirname(__FILE__) . '/../frames.php');
+Mock::generate('SimplePage');
+Mock::generate('SimpleForm');
+
+class TestOfFrameset extends UnitTestCase {
+
+ function testTitleReadFromFramesetPage() {
+ $page = &new MockSimplePage();
+ $page->setReturnValue('getTitle', 'This page');
+ $frameset = &new SimpleFrameset($page);
+ $this->assertEqual($frameset->getTitle(), 'This page');
+ }
+
+ function TestHeadersReadFromFramesetByDefault() {
+ $page = &new MockSimplePage();
+ $page->setReturnValue('getHeaders', 'Header: content');
+ $page->setReturnValue('getMimeType', 'text/xml');
+ $page->setReturnValue('getResponseCode', 401);
+ $page->setReturnValue('getTransportError', 'Could not parse headers');
+ $page->setReturnValue('getAuthentication', 'Basic');
+ $page->setReturnValue('getRealm', 'Safe place');
+
+ $frameset = &new SimpleFrameset($page);
+
+ $this->assertIdentical($frameset->getHeaders(), 'Header: content');
+ $this->assertIdentical($frameset->getMimeType(), 'text/xml');
+ $this->assertIdentical($frameset->getResponseCode(), 401);
+ $this->assertIdentical($frameset->getTransportError(), 'Could not parse headers');
+ $this->assertIdentical($frameset->getAuthentication(), 'Basic');
+ $this->assertIdentical($frameset->getRealm(), 'Safe place');
+ }
+
+ function testEmptyFramesetHasNoContent() {
+ $page = &new MockSimplePage();
+ $page->setReturnValue('getRaw', 'This content');
+ $frameset = &new SimpleFrameset($page);
+ $this->assertEqual($frameset->getRaw(), '');
+ }
+
+ function testRawContentIsFromOnlyFrame() {
+ $page = &new MockSimplePage();
+ $page->expectNever('getRaw');
+
+ $frame = &new MockSimplePage();
+ $frame->setReturnValue('getRaw', 'Stuff');
+
+ $frameset = &new SimpleFrameset($page);
+ $frameset->addFrame($frame);
+ $this->assertEqual($frameset->getRaw(), 'Stuff');
+ }
+
+ function testRawContentIsFromAllFrames() {
+ $page = &new MockSimplePage();
+ $page->expectNever('getRaw');
+
+ $frame1 = &new MockSimplePage();
+ $frame1->setReturnValue('getRaw', 'Stuff1');
+
+ $frame2 = &new MockSimplePage();
+ $frame2->setReturnValue('getRaw', 'Stuff2');
+
+ $frameset = &new SimpleFrameset($page);
+ $frameset->addFrame($frame1);
+ $frameset->addFrame($frame2);
+ $this->assertEqual($frameset->getRaw(), 'Stuff1Stuff2');
+ }
+
+ function testTextContentIsFromOnlyFrame() {
+ $page = &new MockSimplePage();
+ $page->expectNever('getText');
+
+ $frame = &new MockSimplePage();
+ $frame->setReturnValue('getText', 'Stuff');
+
+ $frameset = &new SimpleFrameset($page);
+ $frameset->addFrame($frame);
+ $this->assertEqual($frameset->getText(), 'Stuff');
+ }
+
+ function testTextContentIsFromAllFrames() {
+ $page = &new MockSimplePage();
+ $page->expectNever('getText');
+
+ $frame1 = &new MockSimplePage();
+ $frame1->setReturnValue('getText', 'Stuff1');
+
+ $frame2 = &new MockSimplePage();
+ $frame2->setReturnValue('getText', 'Stuff2');
+
+ $frameset = &new SimpleFrameset($page);
+ $frameset->addFrame($frame1);
+ $frameset->addFrame($frame2);
+ $this->assertEqual($frameset->getText(), 'Stuff1 Stuff2');
+ }
+
+ function testFieldFoundIsFirstInFramelist() {
+ $frame1 = &new MockSimplePage();
+ $frame1->setReturnValue('getField', null);
+ $frame1->expectOnce('getField', array(new SimpleByName('a')));
+
+ $frame2 = &new MockSimplePage();
+ $frame2->setReturnValue('getField', 'A');
+ $frame2->expectOnce('getField', array(new SimpleByName('a')));
+
+ $frame3 = &new MockSimplePage();
+ $frame3->expectNever('getField');
+
+ $page = &new MockSimplePage();
+ $frameset = &new SimpleFrameset($page);
+ $frameset->addFrame($frame1);
+ $frameset->addFrame($frame2);
+ $frameset->addFrame($frame3);
+ $this->assertIdentical($frameset->getField(new SimpleByName('a')), 'A');
+ }
+
+ function testFrameReplacementByIndex() {
+ $page = &new MockSimplePage();
+ $page->expectNever('getRaw');
+
+ $frame1 = &new MockSimplePage();
+ $frame1->setReturnValue('getRaw', 'Stuff1');
+
+ $frame2 = &new MockSimplePage();
+ $frame2->setReturnValue('getRaw', 'Stuff2');
+
+ $frameset = &new SimpleFrameset($page);
+ $frameset->addFrame($frame1);
+ $frameset->setFrame(array(1), $frame2);
+ $this->assertEqual($frameset->getRaw(), 'Stuff2');
+ }
+
+ function testFrameReplacementByName() {
+ $page = &new MockSimplePage();
+ $page->expectNever('getRaw');
+
+ $frame1 = &new MockSimplePage();
+ $frame1->setReturnValue('getRaw', 'Stuff1');
+
+ $frame2 = &new MockSimplePage();
+ $frame2->setReturnValue('getRaw', 'Stuff2');
+
+ $frameset = &new SimpleFrameset($page);
+ $frameset->addFrame($frame1, 'a');
+ $frameset->setFrame(array('a'), $frame2);
+ $this->assertEqual($frameset->getRaw(), 'Stuff2');
+ }
+}
+
+class TestOfFrameNavigation extends UnitTestCase {
+
+ function testStartsWithoutFrameFocus() {
+ $page = &new MockSimplePage();
+ $frameset = &new SimpleFrameset($page);
+ $frameset->addFrame($frame);
+ $this->assertFalse($frameset->getFrameFocus());
+ }
+
+ function testCanFocusOnSingleFrame() {
+ $page = &new MockSimplePage();
+ $page->expectNever('getRaw');
+
+ $frame = &new MockSimplePage();
+ $frame->setReturnValue('getFrameFocus', array());
+ $frame->setReturnValue('getRaw', 'Stuff');
+
+ $frameset = &new SimpleFrameset($page);
+ $frameset->addFrame($frame);
+
+ $this->assertFalse($frameset->setFrameFocusByIndex(0));
+ $this->assertTrue($frameset->setFrameFocusByIndex(1));
+ $this->assertEqual($frameset->getRaw(), 'Stuff');
+ $this->assertFalse($frameset->setFrameFocusByIndex(2));
+ $this->assertIdentical($frameset->getFrameFocus(), array(1));
+ }
+
+ function testContentComesFromFrameInFocus() {
+ $page = &new MockSimplePage();
+
+ $frame1 = &new MockSimplePage();
+ $frame1->setReturnValue('getRaw', 'Stuff1');
+ $frame1->setReturnValue('getFrameFocus', array());
+
+ $frame2 = &new MockSimplePage();
+ $frame2->setReturnValue('getRaw', 'Stuff2');
+ $frame2->setReturnValue('getFrameFocus', array());
+
+ $frameset = &new SimpleFrameset($page);
+ $frameset->addFrame($frame1);
+ $frameset->addFrame($frame2);
+
+ $this->assertTrue($frameset->setFrameFocusByIndex(1));
+ $this->assertEqual($frameset->getFrameFocus(), array(1));
+ $this->assertEqual($frameset->getRaw(), 'Stuff1');
+
+ $this->assertTrue($frameset->setFrameFocusByIndex(2));
+ $this->assertEqual($frameset->getFrameFocus(), array(2));
+ $this->assertEqual($frameset->getRaw(), 'Stuff2');
+
+ $this->assertFalse($frameset->setFrameFocusByIndex(3));
+ $this->assertEqual($frameset->getFrameFocus(), array(2));
+
+ $frameset->clearFrameFocus();
+ $this->assertEqual($frameset->getRaw(), 'Stuff1Stuff2');
+ }
+
+ function testCanFocusByName() {
+ $page = &new MockSimplePage();
+
+ $frame1 = &new MockSimplePage();
+ $frame1->setReturnValue('getRaw', 'Stuff1');
+ $frame1->setReturnValue('getFrameFocus', array());
+
+ $frame2 = &new MockSimplePage();
+ $frame2->setReturnValue('getRaw', 'Stuff2');
+ $frame2->setReturnValue('getFrameFocus', array());
+
+ $frameset = &new SimpleFrameset($page);
+ $frameset->addFrame($frame1, 'A');
+ $frameset->addFrame($frame2, 'B');
+
+ $this->assertTrue($frameset->setFrameFocus('A'));
+ $this->assertEqual($frameset->getFrameFocus(), array('A'));
+ $this->assertEqual($frameset->getRaw(), 'Stuff1');
+
+ $this->assertTrue($frameset->setFrameFocusByIndex(2));
+ $this->assertEqual($frameset->getFrameFocus(), array('B'));
+ $this->assertEqual($frameset->getRaw(), 'Stuff2');
+
+ $this->assertFalse($frameset->setFrameFocus('z'));
+
+ $frameset->clearFrameFocus();
+ $this->assertEqual($frameset->getRaw(), 'Stuff1Stuff2');
+ }
+}
+
+class TestOfFramesetPageInterface extends UnitTestCase {
+ var $_page_interface;
+ var $_frameset_interface;
+
+ function TestOfFramesetPageInterface() {
+ $this->UnitTestCase();
+ $this->_page_interface = $this->_getPageMethods();
+ $this->_frameset_interface = $this->_getFramesetMethods();
+ }
+
+ function assertListInAnyOrder($list, $expected) {
+ sort($list);
+ sort($expected);
+ $this->assertEqual($list, $expected);
+ }
+
+ function _getPageMethods() {
+ $methods = array();
+ foreach (get_class_methods('SimplePage') as $method) {
+ if (strtolower($method) == strtolower('SimplePage')) {
+ continue;
+ }
+ if (strtolower($method) == strtolower('getFrameset')) {
+ continue;
+ }
+ if (strncmp($method, '_', 1) == 0) {
+ continue;
+ }
+ if (strncmp($method, 'accept', 6) == 0) {
+ continue;
+ }
+ $methods[] = $method;
+ }
+ return $methods;
+ }
+
+ function _getFramesetMethods() {
+ $methods = array();
+ foreach (get_class_methods('SimpleFrameset') as $method) {
+ if (strtolower($method) == strtolower('SimpleFrameset')) {
+ continue;
+ }
+ if (strncmp($method, '_', 1) == 0) {
+ continue;
+ }
+ if (strncmp($method, 'add', 3) == 0) {
+ continue;
+ }
+ $methods[] = $method;
+ }
+ return $methods;
+ }
+
+ function testFramsetHasPageInterface() {
+ $difference = array();
+ foreach ($this->_page_interface as $method) {
+ if (! in_array($method, $this->_frameset_interface)) {
+ $this->fail("No [$method] in Frameset class");
+ return;
+ }
+ }
+ $this->pass('Frameset covers Page interface');
+ }
+
+ function testHeadersReadFromFrameIfInFocus() {
+ $frame = &new MockSimplePage();
+ $frame->setReturnValue('getUrl', new SimpleUrl('http://localhost/stuff'));
+
+ $frame->setReturnValue('getRequest', 'POST stuff');
+ $frame->setReturnValue('getMethod', 'POST');
+ $frame->setReturnValue('getRequestData', array('a' => 'A'));
+ $frame->setReturnValue('getHeaders', 'Header: content');
+ $frame->setReturnValue('getMimeType', 'text/xml');
+ $frame->setReturnValue('getResponseCode', 401);
+ $frame->setReturnValue('getTransportError', 'Could not parse headers');
+ $frame->setReturnValue('getAuthentication', 'Basic');
+ $frame->setReturnValue('getRealm', 'Safe place');
+
+ $frameset = &new SimpleFrameset(new MockSimplePage());
+ $frameset->addFrame($frame);
+ $frameset->setFrameFocusByIndex(1);
+
+ $url = new SimpleUrl('http://localhost/stuff');
+ $url->setTarget(1);
+ $this->assertIdentical($frameset->getUrl(), $url);
+
+ $this->assertIdentical($frameset->getRequest(), 'POST stuff');
+ $this->assertIdentical($frameset->getMethod(), 'POST');
+ $this->assertIdentical($frameset->getRequestData(), array('a' => 'A'));
+ $this->assertIdentical($frameset->getHeaders(), 'Header: content');
+ $this->assertIdentical($frameset->getMimeType(), 'text/xml');
+ $this->assertIdentical($frameset->getResponseCode(), 401);
+ $this->assertIdentical($frameset->getTransportError(), 'Could not parse headers');
+ $this->assertIdentical($frameset->getAuthentication(), 'Basic');
+ $this->assertIdentical($frameset->getRealm(), 'Safe place');
+ }
+
+ function testUrlsComeFromBothFrames() {
+ $page = &new MockSimplePage();
+ $page->expectNever('getUrls');
+
+ $frame1 = &new MockSimplePage();
+ $frame1->setReturnValue(
+ 'getUrls',
+ array('http://www.lastcraft.com/', 'http://myserver/'));
+
+ $frame2 = &new MockSimplePage();
+ $frame2->setReturnValue(
+ 'getUrls',
+ array('http://www.lastcraft.com/', 'http://test/'));
+
+ $frameset = &new SimpleFrameset($page);
+ $frameset->addFrame($frame1);
+ $frameset->addFrame($frame2);
+ $this->assertListInAnyOrder(
+ $frameset->getUrls(),
+ array('http://www.lastcraft.com/', 'http://myserver/', 'http://test/'));
+ }
+
+ function testLabelledUrlsComeFromBothFrames() {
+ $frame1 = &new MockSimplePage();
+ $frame1->setReturnValue(
+ 'getUrlsByLabel',
+ array(new SimpleUrl('goodbye.php')),
+ array('a'));
+
+ $frame2 = &new MockSimplePage();
+ $frame2->setReturnValue(
+ 'getUrlsByLabel',
+ array(new SimpleUrl('hello.php')),
+ array('a'));
+
+ $frameset = &new SimpleFrameset(new MockSimplePage());
+ $frameset->addFrame($frame1);
+ $frameset->addFrame($frame2, 'Two');
+
+ $expected1 = new SimpleUrl('goodbye.php');
+ $expected1->setTarget(1);
+ $expected2 = new SimpleUrl('hello.php');
+ $expected2->setTarget('Two');
+ $this->assertEqual(
+ $frameset->getUrlsByLabel('a'),
+ array($expected1, $expected2));
+ }
+
+ function testUrlByIdComesFromFirstFrameToRespond() {
+ $frame1 = &new MockSimplePage();
+ $frame1->setReturnValue('getUrlById', new SimpleUrl('four.php'), array(4));
+ $frame1->setReturnValue('getUrlById', false, array(5));
+
+ $frame2 = &new MockSimplePage();
+ $frame2->setReturnValue('getUrlById', false, array(4));
+ $frame2->setReturnValue('getUrlById', new SimpleUrl('five.php'), array(5));
+
+ $frameset = &new SimpleFrameset(new MockSimplePage());
+ $frameset->addFrame($frame1);
+ $frameset->addFrame($frame2);
+
+ $four = new SimpleUrl('four.php');
+ $four->setTarget(1);
+ $this->assertEqual($frameset->getUrlById(4), $four);
+ $five = new SimpleUrl('five.php');
+ $five->setTarget(2);
+ $this->assertEqual($frameset->getUrlById(5), $five);
+ }
+
+ function testReadUrlsFromFrameInFocus() {
+ $frame1 = &new MockSimplePage();
+ $frame1->setReturnValue('getUrls', array('a'));
+ $frame1->setReturnValue('getUrlsByLabel', array(new SimpleUrl('l')));
+ $frame1->setReturnValue('getUrlById', new SimpleUrl('i'));
+
+ $frame2 = &new MockSimplePage();
+ $frame2->expectNever('getUrls');
+ $frame2->expectNever('getUrlsByLabel');
+ $frame2->expectNever('getUrlById');
+
+ $frameset = &new SimpleFrameset(new MockSimplePage());
+ $frameset->addFrame($frame1, 'A');
+ $frameset->addFrame($frame2, 'B');
+ $frameset->setFrameFocus('A');
+
+ $this->assertIdentical($frameset->getUrls(), array('a'));
+ $expected = new SimpleUrl('l');
+ $expected->setTarget('A');
+ $this->assertIdentical($frameset->getUrlsByLabel('label'), array($expected));
+ $expected = new SimpleUrl('i');
+ $expected->setTarget('A');
+ $this->assertIdentical($frameset->getUrlById(99), $expected);
+ }
+
+ function testReadFrameTaggedUrlsFromFrameInFocus() {
+ $frame = &new MockSimplePage();
+
+ $by_label = new SimpleUrl('l');
+ $by_label->setTarget('L');
+ $frame->setReturnValue('getUrlsByLabel', array($by_label));
+
+ $by_id = new SimpleUrl('i');
+ $by_id->setTarget('I');
+ $frame->setReturnValue('getUrlById', $by_id);
+
+ $frameset = &new SimpleFrameset(new MockSimplePage());
+ $frameset->addFrame($frame, 'A');
+ $frameset->setFrameFocus('A');
+
+ $this->assertIdentical($frameset->getUrlsByLabel('label'), array($by_label));
+ $this->assertIdentical($frameset->getUrlById(99), $by_id);
+ }
+
+ function testFindingFormsById() {
+ $frame = &new MockSimplePage();
+ $form = &new MockSimpleForm();
+ $frame->setReturnReference('getFormById', $form, array('a'));
+
+ $frameset = &new SimpleFrameset(new MockSimplePage());
+ $frameset->addFrame(new MockSimplePage(), 'A');
+ $frameset->addFrame($frame, 'B');
+ $this->assertReference($frameset->getFormById('a'), $form);
+
+ $frameset->setFrameFocus('A');
+ $this->assertNull($frameset->getFormById('a'));
+
+ $frameset->setFrameFocus('B');
+ $this->assertReference($frameset->getFormById('a'), $form);
+ }
+
+ function testFindingFormsBySubmit() {
+ $frame = &new MockSimplePage();
+ $form = &new MockSimpleForm();
+ $frame->setReturnReference(
+ 'getFormBySubmit',
+ $form,
+ array(new SimpleByLabel('a')));
+
+ $frameset = &new SimpleFrameset(new MockSimplePage());
+ $frameset->addFrame(new MockSimplePage(), 'A');
+ $frameset->addFrame($frame, 'B');
+ $this->assertReference($frameset->getFormBySubmit(new SimpleByLabel('a')), $form);
+
+ $frameset->setFrameFocus('A');
+ $this->assertNull($frameset->getFormBySubmit(new SimpleByLabel('a')));
+
+ $frameset->setFrameFocus('B');
+ $this->assertReference($frameset->getFormBySubmit(new SimpleByLabel('a')), $form);
+ }
+
+ function testFindingFormsByImage() {
+ $frame = &new MockSimplePage();
+ $form = &new MockSimpleForm();
+ $frame->setReturnReference(
+ 'getFormByImage',
+ $form,
+ array(new SimpleByLabel('a')));
+
+ $frameset = &new SimpleFrameset(new MockSimplePage());
+ $frameset->addFrame(new MockSimplePage(), 'A');
+ $frameset->addFrame($frame, 'B');
+ $this->assertReference($frameset->getFormByImage(new SimpleByLabel('a')), $form);
+
+ $frameset->setFrameFocus('A');
+ $this->assertNull($frameset->getFormByImage(new SimpleByLabel('a')));
+
+ $frameset->setFrameFocus('B');
+ $this->assertReference($frameset->getFormByImage(new SimpleByLabel('a')), $form);
+ }
+
+ function testSettingAllFrameFieldsWhenNoFrameFocus() {
+ $frame1 = &new MockSimplePage();
+ $frame1->expectOnce('setField', array(new SimpleById(22), 'A'));
+
+ $frame2 = &new MockSimplePage();
+ $frame2->expectOnce('setField', array(new SimpleById(22), 'A'));
+
+ $frameset = &new SimpleFrameset(new MockSimplePage());
+ $frameset->addFrame($frame1, 'A');
+ $frameset->addFrame($frame2, 'B');
+ $frameset->setField(new SimpleById(22), 'A');
+ }
+
+ function testOnlySettingFieldFromFocusedFrame() {
+ $frame1 = &new MockSimplePage();
+ $frame1->expectOnce('setField', array(new SimpleByLabelOrName('a'), 'A'));
+
+ $frame2 = &new MockSimplePage();
+ $frame2->expectNever('setField');
+
+ $frameset = &new SimpleFrameset(new MockSimplePage());
+ $frameset->addFrame($frame1, 'A');
+ $frameset->addFrame($frame2, 'B');
+ $frameset->setFrameFocus('A');
+ $frameset->setField(new SimpleByLabelOrName('a'), 'A');
+ }
+
+ function testOnlyGettingFieldFromFocusedFrame() {
+ $frame1 = &new MockSimplePage();
+ $frame1->setReturnValue('getField', 'f', array(new SimpleByName('a')));
+
+ $frame2 = &new MockSimplePage();
+ $frame2->expectNever('getField');
+
+ $frameset = &new SimpleFrameset(new MockSimplePage());
+ $frameset->addFrame($frame1, 'A');
+ $frameset->addFrame($frame2, 'B');
+ $frameset->setFrameFocus('A');
+ $this->assertIdentical($frameset->getField(new SimpleByName('a')), 'f');
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/http_test.php b/tests/simpletest/test/http_test.php
new file mode 100755
index 0000000000..1f1e33dad8
--- /dev/null
+++ b/tests/simpletest/test/http_test.php
@@ -0,0 +1,427 @@
+<?php
+// $Id: http_test.php,v 1.91 2007/04/30 23:39:59 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../encoding.php');
+require_once(dirname(__FILE__) . '/../http.php');
+require_once(dirname(__FILE__) . '/../socket.php');
+require_once(dirname(__FILE__) . '/../cookies.php');
+Mock::generate('SimpleSocket');
+Mock::generate('SimpleCookieJar');
+Mock::generate('SimpleRoute');
+Mock::generatePartial('SimpleRoute', 'PartialSimpleRoute', array('_createSocket'));
+Mock::generatePartial(
+ 'SimpleProxyRoute',
+ 'PartialSimpleProxyRoute',
+ array('_createSocket'));
+
+class TestOfDirectRoute extends UnitTestCase {
+
+ function testDefaultGetRequest() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("GET /here.html HTTP/1.0\r\n"));
+ $socket->expectArgumentsAt(1, 'write', array("Host: a.valid.host\r\n"));
+ $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
+ $socket->expectCallCount('write', 3);
+
+ $route = &new PartialSimpleRoute();
+ $route->setReturnReference('_createSocket', $socket);
+ $route->SimpleRoute(new SimpleUrl('http://a.valid.host/here.html'));
+
+ $this->assertReference($route->createConnection('GET', 15), $socket);
+ }
+
+ function testDefaultPostRequest() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("POST /here.html HTTP/1.0\r\n"));
+ $socket->expectArgumentsAt(1, 'write', array("Host: a.valid.host\r\n"));
+ $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
+ $socket->expectCallCount('write', 3);
+
+ $route = &new PartialSimpleRoute();
+ $route->setReturnReference('_createSocket', $socket);
+ $route->SimpleRoute(new SimpleUrl('http://a.valid.host/here.html'));
+
+ $route->createConnection('POST', 15);
+ }
+
+ function testGetWithPort() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("GET /here.html HTTP/1.0\r\n"));
+ $socket->expectArgumentsAt(1, 'write', array("Host: a.valid.host:81\r\n"));
+ $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
+ $socket->expectCallCount('write', 3);
+
+ $route = &new PartialSimpleRoute();
+ $route->setReturnReference('_createSocket', $socket);
+ $route->SimpleRoute(new SimpleUrl('http://a.valid.host:81/here.html'));
+
+ $route->createConnection('GET', 15);
+ }
+
+ function testGetWithParameters() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("GET /here.html?a=1&b=2 HTTP/1.0\r\n"));
+ $socket->expectArgumentsAt(1, 'write', array("Host: a.valid.host\r\n"));
+ $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
+ $socket->expectCallCount('write', 3);
+
+ $route = &new PartialSimpleRoute();
+ $route->setReturnReference('_createSocket', $socket);
+ $route->SimpleRoute(new SimpleUrl('http://a.valid.host/here.html?a=1&b=2'));
+
+ $route->createConnection('GET', 15);
+ }
+}
+
+class TestOfProxyRoute extends UnitTestCase {
+
+ function testDefaultGet() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("GET http://a.valid.host/here.html HTTP/1.0\r\n"));
+ $socket->expectArgumentsAt(1, 'write', array("Host: my-proxy:8080\r\n"));
+ $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
+ $socket->expectCallCount('write', 3);
+
+ $route = &new PartialSimpleProxyRoute();
+ $route->setReturnReference('_createSocket', $socket);
+ $route->SimpleProxyRoute(
+ new SimpleUrl('http://a.valid.host/here.html'),
+ new SimpleUrl('http://my-proxy'));
+ $route->createConnection('GET', 15);
+ }
+
+ function testDefaultPost() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("POST http://a.valid.host/here.html HTTP/1.0\r\n"));
+ $socket->expectArgumentsAt(1, 'write', array("Host: my-proxy:8080\r\n"));
+ $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
+ $socket->expectCallCount('write', 3);
+
+ $route = &new PartialSimpleProxyRoute();
+ $route->setReturnReference('_createSocket', $socket);
+ $route->SimpleProxyRoute(
+ new SimpleUrl('http://a.valid.host/here.html'),
+ new SimpleUrl('http://my-proxy'));
+ $route->createConnection('POST', 15);
+ }
+
+ function testGetWithPort() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("GET http://a.valid.host:81/here.html HTTP/1.0\r\n"));
+ $socket->expectArgumentsAt(1, 'write', array("Host: my-proxy:8081\r\n"));
+ $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
+ $socket->expectCallCount('write', 3);
+
+ $route = &new PartialSimpleProxyRoute();
+ $route->setReturnReference('_createSocket', $socket);
+ $route->SimpleProxyRoute(
+ new SimpleUrl('http://a.valid.host:81/here.html'),
+ new SimpleUrl('http://my-proxy:8081'));
+ $route->createConnection('GET', 15);
+ }
+
+ function testGetWithParameters() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("GET http://a.valid.host/here.html?a=1&b=2 HTTP/1.0\r\n"));
+ $socket->expectArgumentsAt(1, 'write', array("Host: my-proxy:8080\r\n"));
+ $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
+ $socket->expectCallCount('write', 3);
+
+ $route = &new PartialSimpleProxyRoute();
+ $route->setReturnReference('_createSocket', $socket);
+ $route->SimpleProxyRoute(
+ new SimpleUrl('http://a.valid.host/here.html?a=1&b=2'),
+ new SimpleUrl('http://my-proxy'));
+ $route->createConnection('GET', 15);
+ }
+
+ function testGetWithAuthentication() {
+ $encoded = base64_encode('Me:Secret');
+
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("GET http://a.valid.host/here.html HTTP/1.0\r\n"));
+ $socket->expectArgumentsAt(1, 'write', array("Host: my-proxy:8080\r\n"));
+ $socket->expectArgumentsAt(2, 'write', array("Proxy-Authorization: Basic $encoded\r\n"));
+ $socket->expectArgumentsAt(3, 'write', array("Connection: close\r\n"));
+ $socket->expectCallCount('write', 4);
+
+ $route = &new PartialSimpleProxyRoute();
+ $route->setReturnReference('_createSocket', $socket);
+ $route->SimpleProxyRoute(
+ new SimpleUrl('http://a.valid.host/here.html'),
+ new SimpleUrl('http://my-proxy'),
+ 'Me',
+ 'Secret');
+ $route->createConnection('GET', 15);
+ }
+}
+
+class TestOfHttpRequest extends UnitTestCase {
+
+ function testReadingBadConnection() {
+ $socket = &new MockSimpleSocket();
+
+ $route = &new MockSimpleRoute();
+ $route->setReturnReference('createConnection', $socket);
+
+ $request = &new SimpleHttpRequest($route, new SimpleGetEncoding());
+ $reponse = &$request->fetch(15);
+ $this->assertTrue($reponse->isError());
+ }
+
+ function testReadingGoodConnection() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectOnce('write', array("\r\n"));
+
+ $route = &new MockSimpleRoute();
+ $route->setReturnReference('createConnection', $socket);
+ $route->expectArguments('createConnection', array('GET', 15));
+
+ $request = &new SimpleHttpRequest($route, new SimpleGetEncoding());
+ $this->assertIsA($request->fetch(15), 'SimpleHttpResponse');
+ }
+
+ function testWritingAdditionalHeaders() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("My: stuff\r\n"));
+ $socket->expectArgumentsAt(1, 'write', array("\r\n"));
+ $socket->expectCallCount('write', 2);
+
+ $route = &new MockSimpleRoute();
+ $route->setReturnReference('createConnection', $socket);
+
+ $request = &new SimpleHttpRequest($route, new SimpleGetEncoding());
+ $request->addHeaderLine('My: stuff');
+ $request->fetch(15);
+ }
+
+ function testCookieWriting() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("Cookie: a=A\r\n"));
+ $socket->expectArgumentsAt(1, 'write', array("\r\n"));
+ $socket->expectCallCount('write', 2);
+
+ $route = &new MockSimpleRoute();
+ $route->setReturnReference('createConnection', $socket);
+
+ $jar = new SimpleCookieJar();
+ $jar->setCookie('a', 'A');
+
+ $request = &new SimpleHttpRequest($route, new SimpleGetEncoding());
+ $request->readCookiesFromJar($jar, new SimpleUrl('/'));
+ $this->assertIsA($request->fetch(15), 'SimpleHttpResponse');
+ }
+
+ function testMultipleCookieWriting() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("Cookie: a=A;b=B\r\n"));
+
+ $route = &new MockSimpleRoute();
+ $route->setReturnReference('createConnection', $socket);
+
+ $jar = new SimpleCookieJar();
+ $jar->setCookie('a', 'A');
+ $jar->setCookie('b', 'B');
+
+ $request = &new SimpleHttpRequest($route, new SimpleGetEncoding());
+ $request->readCookiesFromJar($jar, new SimpleUrl('/'));
+ $request->fetch(15);
+ }
+}
+
+class TestOfHttpPostRequest extends UnitTestCase {
+
+ function testReadingBadConnectionCausesErrorBecauseOfDeadSocket() {
+ $socket = &new MockSimpleSocket();
+
+ $route = &new MockSimpleRoute();
+ $route->setReturnReference('createConnection', $socket);
+
+ $request = &new SimpleHttpRequest($route, new SimplePostEncoding());
+ $reponse = &$request->fetch(15);
+ $this->assertTrue($reponse->isError());
+ }
+
+ function testReadingGoodConnection() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("Content-Length: 0\r\n"));
+ $socket->expectArgumentsAt(1, 'write', array("Content-Type: application/x-www-form-urlencoded\r\n"));
+ $socket->expectArgumentsAt(2, 'write', array("\r\n"));
+ $socket->expectArgumentsAt(3, 'write', array(""));
+
+ $route = &new MockSimpleRoute();
+ $route->setReturnReference('createConnection', $socket);
+ $route->expectArguments('createConnection', array('POST', 15));
+
+ $request = &new SimpleHttpRequest($route, new SimplePostEncoding());
+ $this->assertIsA($request->fetch(15), 'SimpleHttpResponse');
+ }
+
+ function testContentHeadersCalculated() {
+ $socket = &new MockSimpleSocket();
+ $socket->expectArgumentsAt(0, 'write', array("Content-Length: 3\r\n"));
+ $socket->expectArgumentsAt(1, 'write', array("Content-Type: application/x-www-form-urlencoded\r\n"));
+ $socket->expectArgumentsAt(2, 'write', array("\r\n"));
+ $socket->expectArgumentsAt(3, 'write', array("a=A"));
+
+ $route = &new MockSimpleRoute();
+ $route->setReturnReference('createConnection', $socket);
+ $route->expectArguments('createConnection', array('POST', 15));
+
+ $request = &new SimpleHttpRequest(
+ $route,
+ new SimplePostEncoding(array('a' => 'A')));
+ $this->assertIsA($request->fetch(15), 'SimpleHttpResponse');
+ }
+}
+
+class TestOfHttpHeaders extends UnitTestCase {
+
+ function testParseBasicHeaders() {
+ $headers = new SimpleHttpHeaders(
+ "HTTP/1.1 200 OK\r\n" .
+ "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n" .
+ "Content-Type: text/plain\r\n" .
+ "Server: Apache/1.3.24 (Win32) PHP/4.2.3\r\n" .
+ "Connection: close");
+ $this->assertIdentical($headers->getHttpVersion(), "1.1");
+ $this->assertIdentical($headers->getResponseCode(), 200);
+ $this->assertEqual($headers->getMimeType(), "text/plain");
+ }
+
+ function testNonStandardResponseHeader() {
+ $headers = new SimpleHttpHeaders(
+ "HTTP/1.1 302 (HTTP-Version SP Status-Code CRLF)\r\n" .
+ "Connection: close");
+ $this->assertIdentical($headers->getResponseCode(), 302);
+ }
+
+ function testCanParseMultipleCookies() {
+ $jar = &new MockSimpleCookieJar();
+ $jar->expectAt(0, 'setCookie', array('a', 'aaa', 'host', '/here/', 'Wed, 25 Dec 2002 04:24:20 GMT'));
+ $jar->expectAt(1, 'setCookie', array('b', 'bbb', 'host', '/', false));
+
+ $headers = new SimpleHttpHeaders(
+ "HTTP/1.1 200 OK\r\n" .
+ "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n" .
+ "Content-Type: text/plain\r\n" .
+ "Server: Apache/1.3.24 (Win32) PHP/4.2.3\r\n" .
+ "Set-Cookie: a=aaa; expires=Wed, 25-Dec-02 04:24:20 GMT; path=/here/\r\n" .
+ "Set-Cookie: b=bbb\r\n" .
+ "Connection: close");
+ $headers->writeCookiesToJar($jar, new SimpleUrl('http://host'));
+ }
+
+ function testCanRecogniseRedirect() {
+ $headers = new SimpleHttpHeaders("HTTP/1.1 301 OK\r\n" .
+ "Content-Type: text/plain\r\n" .
+ "Content-Length: 0\r\n" .
+ "Location: http://www.somewhere-else.com/\r\n" .
+ "Connection: close");
+ $this->assertIdentical($headers->getResponseCode(), 301);
+ $this->assertEqual($headers->getLocation(), "http://www.somewhere-else.com/");
+ $this->assertTrue($headers->isRedirect());
+ }
+
+ function testCanParseChallenge() {
+ $headers = new SimpleHttpHeaders("HTTP/1.1 401 Authorization required\r\n" .
+ "Content-Type: text/plain\r\n" .
+ "Connection: close\r\n" .
+ "WWW-Authenticate: Basic realm=\"Somewhere\"");
+ $this->assertEqual($headers->getAuthentication(), 'Basic');
+ $this->assertEqual($headers->getRealm(), 'Somewhere');
+ $this->assertTrue($headers->isChallenge());
+ }
+}
+
+class TestOfHttpResponse extends UnitTestCase {
+
+ function testBadRequest() {
+ $socket = &new MockSimpleSocket();
+ $socket->setReturnValue('getSent', '');
+
+ $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
+ $this->assertTrue($response->isError());
+ $this->assertPattern('/Nothing fetched/', $response->getError());
+ $this->assertIdentical($response->getContent(), false);
+ $this->assertIdentical($response->getSent(), '');
+ }
+
+ function testBadSocketDuringResponse() {
+ $socket = &new MockSimpleSocket();
+ $socket->setReturnValueAt(0, "read", "HTTP/1.1 200 OK\r\n");
+ $socket->setReturnValueAt(1, "read", "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n");
+ $socket->setReturnValue("read", "");
+ $socket->setReturnValue('getSent', 'HTTP/1.1 ...');
+
+ $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
+ $this->assertTrue($response->isError());
+ $this->assertEqual($response->getContent(), '');
+ $this->assertEqual($response->getSent(), 'HTTP/1.1 ...');
+ }
+
+ function testIncompleteHeader() {
+ $socket = &new MockSimpleSocket();
+ $socket->setReturnValueAt(0, "read", "HTTP/1.1 200 OK\r\n");
+ $socket->setReturnValueAt(1, "read", "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n");
+ $socket->setReturnValueAt(2, "read", "Content-Type: text/plain\r\n");
+ $socket->setReturnValue("read", "");
+
+ $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
+ $this->assertTrue($response->isError());
+ $this->assertEqual($response->getContent(), "");
+ }
+
+ function testParseOfResponseHeadersWhenChunked() {
+ $socket = &new MockSimpleSocket();
+ $socket->setReturnValueAt(0, "read", "HTTP/1.1 200 OK\r\nDate: Mon, 18 Nov 2002 15:50:29 GMT\r\n");
+ $socket->setReturnValueAt(1, "read", "Content-Type: text/plain\r\n");
+ $socket->setReturnValueAt(2, "read", "Server: Apache/1.3.24 (Win32) PHP/4.2.3\r\nConne");
+ $socket->setReturnValueAt(3, "read", "ction: close\r\n\r\nthis is a test file\n");
+ $socket->setReturnValueAt(4, "read", "with two lines in it\n");
+ $socket->setReturnValue("read", "");
+
+ $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
+ $this->assertFalse($response->isError());
+ $this->assertEqual(
+ $response->getContent(),
+ "this is a test file\nwith two lines in it\n");
+ $headers = $response->getHeaders();
+ $this->assertIdentical($headers->getHttpVersion(), "1.1");
+ $this->assertIdentical($headers->getResponseCode(), 200);
+ $this->assertEqual($headers->getMimeType(), "text/plain");
+ $this->assertFalse($headers->isRedirect());
+ $this->assertFalse($headers->getLocation());
+ }
+
+ function testRedirect() {
+ $socket = &new MockSimpleSocket();
+ $socket->setReturnValueAt(0, "read", "HTTP/1.1 301 OK\r\n");
+ $socket->setReturnValueAt(1, "read", "Content-Type: text/plain\r\n");
+ $socket->setReturnValueAt(2, "read", "Location: http://www.somewhere-else.com/\r\n");
+ $socket->setReturnValueAt(3, "read", "Connection: close\r\n");
+ $socket->setReturnValueAt(4, "read", "\r\n");
+ $socket->setReturnValue("read", "");
+
+ $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
+ $headers = $response->getHeaders();
+ $this->assertTrue($headers->isRedirect());
+ $this->assertEqual($headers->getLocation(), "http://www.somewhere-else.com/");
+ }
+
+ function testRedirectWithPort() {
+ $socket = &new MockSimpleSocket();
+ $socket->setReturnValueAt(0, "read", "HTTP/1.1 301 OK\r\n");
+ $socket->setReturnValueAt(1, "read", "Content-Type: text/plain\r\n");
+ $socket->setReturnValueAt(2, "read", "Location: http://www.somewhere-else.com:80/\r\n");
+ $socket->setReturnValueAt(3, "read", "Connection: close\r\n");
+ $socket->setReturnValueAt(4, "read", "\r\n");
+ $socket->setReturnValue("read", "");
+
+ $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
+ $headers = $response->getHeaders();
+ $this->assertTrue($headers->isRedirect());
+ $this->assertEqual($headers->getLocation(), "http://www.somewhere-else.com:80/");
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/interfaces_test.php b/tests/simpletest/test/interfaces_test.php
new file mode 100755
index 0000000000..60c8054eca
--- /dev/null
+++ b/tests/simpletest/test/interfaces_test.php
@@ -0,0 +1,134 @@
+<?php
+// $Id: interfaces_test.php,v 1.13 2007/04/30 23:39:59 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+if (function_exists('spl_classes')) {
+ include(dirname(__FILE__) . '/support/spl_examples.php');
+}
+
+interface DummyInterface {
+ function aMethod();
+ function anotherMethod($a);
+ function &referenceMethod(&$a);
+}
+
+Mock::generate('DummyInterface');
+Mock::generatePartial('DummyInterface', 'PartialDummyInterface', array());
+
+class TestOfMockInterfaces extends UnitTestCase {
+
+ function testCanMockAnInterface() {
+ $mock = new MockDummyInterface();
+ $this->assertIsA($mock, 'SimpleMock');
+ $this->assertIsA($mock, 'MockDummyInterface');
+ $this->assertTrue(method_exists($mock, 'aMethod'));
+ $this->assertTrue(method_exists($mock, 'anotherMethod'));
+ $this->assertNull($mock->aMethod());
+ }
+
+ function testMockedInterfaceExpectsParameters() {
+ $mock = new MockDummyInterface();
+ $mock->anotherMethod();
+ $this->assertError();
+ }
+
+ function testCannotPartiallyMockAnInterface() {
+ $this->assertFalse(class_exists('PartialDummyInterface'));
+ }
+}
+
+class TestOfSpl extends UnitTestCase {
+
+ function skip() {
+ $this->skipUnless(function_exists('spl_classes'));
+ }
+
+ function testCanMockAllSplClasses() {
+ if (! function_exists('spl_classes')) {
+ return;
+ }
+ foreach(spl_classes() as $class) {
+ $mock_class = "Mock$class";
+ Mock::generate($class);
+ $this->assertIsA(new $mock_class(), $mock_class);
+ }
+ }
+
+ function testExtensionOfCommonSplClasses() {
+ Mock::generate('IteratorImplementation');
+ $this->assertIsA(
+ new IteratorImplementation(),
+ 'IteratorImplementation');
+ Mock::generate('IteratorAggregateImplementation');
+ $this->assertIsA(
+ new IteratorAggregateImplementation(),
+ 'IteratorAggregateImplementation');
+ }
+}
+
+class WithHint {
+ function hinted(DummyInterface $object) { }
+}
+
+class ImplementsDummy implements DummyInterface {
+ function aMethod() { }
+ function anotherMethod($a) { }
+ function &referenceMethod(&$a) { }
+ function extraMethod($a = false) { }
+}
+Mock::generate('ImplementsDummy');
+
+class TestOfImplementations extends UnitTestCase {
+
+ function testMockedInterfaceCanPassThroughTypeHint() {
+ $mock = new MockDummyInterface();
+ $hinter = new WithHint();
+ $hinter->hinted($mock);
+ }
+
+ function testImplementedInterfacesAreCarried() {
+ $mock = new MockImplementsDummy();
+ $hinter = new WithHint();
+ $hinter->hinted($mock);
+ }
+
+ function testNoSpuriousWarningsWhenSkippingDefaultedParameter() {
+ $mock = new MockImplementsDummy();
+ $mock->extraMethod();
+ }
+}
+
+interface SampleClassWithConstruct {
+ function __construct($something);
+}
+
+class TestOfInterfaceMocksWithConstruct extends UnitTestCase {
+ function testBasicConstructOfAnInterface() {
+ Mock::generate('SampleClassWithConstruct');
+ $this->assertNoErrors();
+ }
+}
+
+interface SampleInterfaceWithHintInSignature {
+ function method(array $hinted);
+}
+
+class TestOfInterfaceMocksWithHintInSignature extends UnitTestCase {
+ function testBasicConstructOfAnInterfaceWithHintInSignature() {
+ Mock::generate('SampleInterfaceWithHintInSignature');
+ $this->assertNoErrors();
+ $mock = new MockSampleInterfaceWithHintInSignature();
+ $this->assertIsA($mock, 'SampleInterfaceWithHintInSignature');
+ }
+}
+
+interface SampleInterfaceWithClone {
+ function __clone();
+}
+
+class TestOfSampleInterfaceWithClone extends UnitTestCase {
+ function testCanMockWithoutErrors() {
+ Mock::generate('SampleInterfaceWithClone');
+ $this->assertNoErrors();
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/live_test.php b/tests/simpletest/test/live_test.php
new file mode 100755
index 0000000000..91d042d312
--- /dev/null
+++ b/tests/simpletest/test/live_test.php
@@ -0,0 +1,47 @@
+<?php
+// $Id: live_test.php,v 1.101 2007/04/30 23:39:59 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../socket.php');
+require_once(dirname(__FILE__) . '/../http.php');
+require_once(dirname(__FILE__) . '/../compatibility.php');
+
+if (SimpleTest::getDefaultProxy()) {
+ SimpleTest::ignore('LiveHttpTestCase');
+}
+
+class LiveHttpTestCase extends UnitTestCase {
+
+ function testBadSocket() {
+ $socket = &new SimpleSocket('bad_url', 111, 5);
+ $this->assertTrue($socket->isError());
+ $this->assertPattern(
+ '/Cannot open \\[bad_url:111\\] with \\[/',
+ $socket->getError());
+ $this->assertFalse($socket->isOpen());
+ $this->assertFalse($socket->write('A message'));
+ }
+
+ function testSocketClosure() {
+ $socket = &new SimpleSocket('www.lastcraft.com', 80, 15, 8);
+ $this->assertTrue($socket->isOpen());
+ $this->assertTrue($socket->write("GET /test/network_confirm.php HTTP/1.0\r\n"));
+ $socket->write("Host: www.lastcraft.com\r\n");
+ $socket->write("Connection: close\r\n\r\n");
+ $this->assertEqual($socket->read(), "HTTP/1.1");
+ $socket->close();
+ $this->assertIdentical($socket->read(), false);
+ }
+
+ function testRecordOfSentCharacters() {
+ $socket = &new SimpleSocket('www.lastcraft.com', 80, 15);
+ $this->assertTrue($socket->write("GET /test/network_confirm.php HTTP/1.0\r\n"));
+ $socket->write("Host: www.lastcraft.com\r\n");
+ $socket->write("Connection: close\r\n\r\n");
+ $socket->close();
+ $this->assertEqual($socket->getSent(),
+ "GET /test/network_confirm.php HTTP/1.0\r\n" .
+ "Host: www.lastcraft.com\r\n" .
+ "Connection: close\r\n\r\n");
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/mock_objects_test.php b/tests/simpletest/test/mock_objects_test.php
new file mode 100755
index 0000000000..143f2d63db
--- /dev/null
+++ b/tests/simpletest/test/mock_objects_test.php
@@ -0,0 +1,834 @@
+<?php
+// $Id: mock_objects_test.php,v 1.36 2007/07/07 00:31:03 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../expectation.php');
+require_once(dirname(__FILE__) . '/../mock_objects.php');
+
+class TestOfAnythingExpectation extends UnitTestCase {
+
+ function testSimpleInteger() {
+ $expectation = new AnythingExpectation();
+ $this->assertTrue($expectation->test(33));
+ $this->assertTrue($expectation->test(false));
+ $this->assertTrue($expectation->test(null));
+ }
+}
+
+class TestOfParametersExpectation extends UnitTestCase {
+
+ function testEmptyMatch() {
+ $expectation = new ParametersExpectation(array());
+ $this->assertTrue($expectation->test(array()));
+ $this->assertFalse($expectation->test(array(33)));
+ }
+
+ function testSingleMatch() {
+ $expectation = new ParametersExpectation(array(0));
+ $this->assertFalse($expectation->test(array(1)));
+ $this->assertTrue($expectation->test(array(0)));
+ }
+
+ function testAnyMatch() {
+ $expectation = new ParametersExpectation(false);
+ $this->assertTrue($expectation->test(array()));
+ $this->assertTrue($expectation->test(array(1, 2)));
+ }
+
+ function testMissingParameter() {
+ $expectation = new ParametersExpectation(array(0));
+ $this->assertFalse($expectation->test(array()));
+ }
+
+ function testNullParameter() {
+ $expectation = new ParametersExpectation(array(null));
+ $this->assertTrue($expectation->test(array(null)));
+ $this->assertFalse($expectation->test(array()));
+ }
+
+ function testAnythingExpectations() {
+ $expectation = new ParametersExpectation(array(new AnythingExpectation()));
+ $this->assertFalse($expectation->test(array()));
+ $this->assertIdentical($expectation->test(array(null)), true);
+ $this->assertIdentical($expectation->test(array(13)), true);
+ }
+
+ function testOtherExpectations() {
+ $expectation = new ParametersExpectation(
+ array(new PatternExpectation('/hello/i')));
+ $this->assertFalse($expectation->test(array('Goodbye')));
+ $this->assertTrue($expectation->test(array('hello')));
+ $this->assertTrue($expectation->test(array('Hello')));
+ }
+
+ function testIdentityOnly() {
+ $expectation = new ParametersExpectation(array("0"));
+ $this->assertFalse($expectation->test(array(0)));
+ $this->assertTrue($expectation->test(array("0")));
+ }
+
+ function testLongList() {
+ $expectation = new ParametersExpectation(
+ array("0", 0, new AnythingExpectation(), false));
+ $this->assertTrue($expectation->test(array("0", 0, 37, false)));
+ $this->assertFalse($expectation->test(array("0", 0, 37, true)));
+ $this->assertFalse($expectation->test(array("0", 0, 37)));
+ }
+}
+
+class TestOfCallMap extends UnitTestCase {
+
+ function testEmpty() {
+ $map = new CallMap();
+ $this->assertFalse($map->isMatch("any", array()));
+ $this->assertNull($map->findFirstMatch("any", array()));
+ }
+
+ function testExactValue() {
+ $map = new CallMap();
+ $map->addValue(array(0), "Fred");
+ $map->addValue(array(1), "Jim");
+ $map->addValue(array("1"), "Tom");
+ $this->assertTrue($map->isMatch(array(0)));
+ $this->assertEqual($map->findFirstMatch(array(0)), "Fred");
+ $this->assertTrue($map->isMatch(array(1)));
+ $this->assertEqual($map->findFirstMatch(array(1)), "Jim");
+ $this->assertEqual($map->findFirstMatch(array("1")), "Tom");
+ }
+
+ function testExactReference() {
+ $map = new CallMap();
+ $ref = "Fred";
+ $map->addReference(array(0), $ref);
+ $this->assertEqual($map->findFirstMatch(array(0)), "Fred");
+ $ref2 = &$map->findFirstMatch(array(0));
+ $this->assertReference($ref2, $ref);
+ }
+
+ function testWildcard() {
+ $map = new CallMap();
+ $map->addValue(array(new AnythingExpectation(), 1, 3), "Fred");
+ $this->assertTrue($map->isMatch(array(2, 1, 3)));
+ $this->assertEqual($map->findFirstMatch(array(2, 1, 3)), "Fred");
+ }
+
+ function testAllWildcard() {
+ $map = new CallMap();
+ $this->assertFalse($map->isMatch(array(2, 1, 3)));
+ $map->addValue("", "Fred");
+ $this->assertTrue($map->isMatch(array(2, 1, 3)));
+ $this->assertEqual($map->findFirstMatch(array(2, 1, 3)), "Fred");
+ }
+
+ function testOrdering() {
+ $map = new CallMap();
+ $map->addValue(array(1, 2), "1, 2");
+ $map->addValue(array(1, 3), "1, 3");
+ $map->addValue(array(1), "1");
+ $map->addValue(array(1, 4), "1, 4");
+ $map->addValue(array(new AnythingExpectation()), "Any");
+ $map->addValue(array(2), "2");
+ $map->addValue("", "Default");
+ $map->addValue(array(), "None");
+ $this->assertEqual($map->findFirstMatch(array(1, 2)), "1, 2");
+ $this->assertEqual($map->findFirstMatch(array(1, 3)), "1, 3");
+ $this->assertEqual($map->findFirstMatch(array(1, 4)), "1, 4");
+ $this->assertEqual($map->findFirstMatch(array(1)), "1");
+ $this->assertEqual($map->findFirstMatch(array(2)), "Any");
+ $this->assertEqual($map->findFirstMatch(array(3)), "Any");
+ $this->assertEqual($map->findFirstMatch(array()), "Default");
+ }
+}
+
+class Dummy {
+ function Dummy() {
+ }
+
+ function aMethod() {
+ return true;
+ }
+
+ function anotherMethod() {
+ return true;
+ }
+}
+Mock::generate('Dummy');
+Mock::generate('Dummy', 'AnotherMockDummy');
+Mock::generate('Dummy', 'MockDummyWithExtraMethods', array('extraMethod'));
+
+class TestOfMockGeneration extends UnitTestCase {
+
+ function testCloning() {
+ $mock = &new MockDummy();
+ $this->assertTrue(method_exists($mock, "aMethod"));
+ $this->assertNull($mock->aMethod());
+ }
+
+ function testCloningWithExtraMethod() {
+ $mock = &new MockDummyWithExtraMethods();
+ $this->assertTrue(method_exists($mock, "extraMethod"));
+ }
+
+ function testCloningWithChosenClassName() {
+ $mock = &new AnotherMockDummy();
+ $this->assertTrue(method_exists($mock, "aMethod"));
+ }
+}
+
+class TestOfMockReturns extends UnitTestCase {
+
+ function testDefaultReturn() {
+ $mock = &new MockDummy();
+ $mock->setReturnValue("aMethod", "aaa");
+ $this->assertIdentical($mock->aMethod(), "aaa");
+ $this->assertIdentical($mock->aMethod(), "aaa");
+ }
+
+ function testParameteredReturn() {
+ $mock = &new MockDummy();
+ $mock->setReturnValue('aMethod', 'aaa', array(1, 2, 3));
+ $this->assertNull($mock->aMethod());
+ $this->assertIdentical($mock->aMethod(1, 2, 3), 'aaa');
+ }
+
+ function testReferenceReturned() {
+ $mock = &new MockDummy();
+ $object = new Dummy();
+ $mock->setReturnReference('aMethod', $object, array(1, 2, 3));
+ $this->assertReference($zref = &$mock->aMethod(1, 2, 3), $object);
+ }
+
+ function testPatternMatchReturn() {
+ $mock = &new MockDummy();
+ $mock->setReturnValue(
+ "aMethod",
+ "aaa",
+ array(new PatternExpectation('/hello/i')));
+ $this->assertIdentical($mock->aMethod('Hello'), "aaa");
+ $this->assertNull($mock->aMethod('Goodbye'));
+ }
+
+ function testMultipleMethods() {
+ $mock = &new MockDummy();
+ $mock->setReturnValue("aMethod", 100, array(1));
+ $mock->setReturnValue("aMethod", 200, array(2));
+ $mock->setReturnValue("anotherMethod", 10, array(1));
+ $mock->setReturnValue("anotherMethod", 20, array(2));
+ $this->assertIdentical($mock->aMethod(1), 100);
+ $this->assertIdentical($mock->anotherMethod(1), 10);
+ $this->assertIdentical($mock->aMethod(2), 200);
+ $this->assertIdentical($mock->anotherMethod(2), 20);
+ }
+
+ function testReturnSequence() {
+ $mock = &new MockDummy();
+ $mock->setReturnValueAt(0, "aMethod", "aaa");
+ $mock->setReturnValueAt(1, "aMethod", "bbb");
+ $mock->setReturnValueAt(3, "aMethod", "ddd");
+ $this->assertIdentical($mock->aMethod(), "aaa");
+ $this->assertIdentical($mock->aMethod(), "bbb");
+ $this->assertNull($mock->aMethod());
+ $this->assertIdentical($mock->aMethod(), "ddd");
+ }
+
+ function testReturnReferenceSequence() {
+ $mock = &new MockDummy();
+ $object = new Dummy();
+ $mock->setReturnReferenceAt(1, "aMethod", $object);
+ $this->assertNull($mock->aMethod());
+ $this->assertReference($zref =& $mock->aMethod(), $object);
+ $this->assertNull($mock->aMethod());
+ }
+
+ function testComplicatedReturnSequence() {
+ $mock = &new MockDummy();
+ $object = new Dummy();
+ $mock->setReturnValueAt(1, "aMethod", "aaa", array("a"));
+ $mock->setReturnValueAt(1, "aMethod", "bbb");
+ $mock->setReturnReferenceAt(2, "aMethod", $object, array('*', 2));
+ $mock->setReturnValueAt(2, "aMethod", "value", array('*', 3));
+ $mock->setReturnValue("aMethod", 3, array(3));
+ $this->assertNull($mock->aMethod());
+ $this->assertEqual($mock->aMethod("a"), "aaa");
+ $this->assertReference($zref =& $mock->aMethod(1, 2), $object);
+ $this->assertEqual($mock->aMethod(3), 3);
+ $this->assertNull($mock->aMethod());
+ }
+
+ function testMultipleMethodSequences() {
+ $mock = &new MockDummy();
+ $mock->setReturnValueAt(0, "aMethod", "aaa");
+ $mock->setReturnValueAt(1, "aMethod", "bbb");
+ $mock->setReturnValueAt(0, "anotherMethod", "ccc");
+ $mock->setReturnValueAt(1, "anotherMethod", "ddd");
+ $this->assertIdentical($mock->aMethod(), "aaa");
+ $this->assertIdentical($mock->anotherMethod(), "ccc");
+ $this->assertIdentical($mock->aMethod(), "bbb");
+ $this->assertIdentical($mock->anotherMethod(), "ddd");
+ }
+
+ function testSequenceFallback() {
+ $mock = &new MockDummy();
+ $mock->setReturnValueAt(0, "aMethod", "aaa", array('a'));
+ $mock->setReturnValueAt(1, "aMethod", "bbb", array('a'));
+ $mock->setReturnValue("aMethod", "AAA");
+ $this->assertIdentical($mock->aMethod('a'), "aaa");
+ $this->assertIdentical($mock->aMethod('b'), "AAA");
+ }
+
+ function testMethodInterference() {
+ $mock = &new MockDummy();
+ $mock->setReturnValueAt(0, "anotherMethod", "aaa");
+ $mock->setReturnValue("aMethod", "AAA");
+ $this->assertIdentical($mock->aMethod(), "AAA");
+ $this->assertIdentical($mock->anotherMethod(), "aaa");
+ }
+}
+
+class TestOfMockExpectationsThatPass extends UnitTestCase {
+
+ function testAnyArgument() {
+ $mock = &new MockDummy();
+ $mock->expect('aMethod', array('*'));
+ $mock->aMethod(1);
+ $mock->aMethod('hello');
+ }
+
+ function testAnyTwoArguments() {
+ $mock = &new MockDummy();
+ $mock->expect('aMethod', array('*', '*'));
+ $mock->aMethod(1, 2);
+ }
+
+ function testSpecificArgument() {
+ $mock = &new MockDummy();
+ $mock->expect('aMethod', array(1));
+ $mock->aMethod(1);
+ }
+
+ function testExpectation() {
+ $mock = &new MockDummy();
+ $mock->expect('aMethod', array(new IsAExpectation('Dummy')));
+ $mock->aMethod(new Dummy());
+ }
+
+ function testArgumentsInSequence() {
+ $mock = &new MockDummy();
+ $mock->expectAt(0, 'aMethod', array(1, 2));
+ $mock->expectAt(1, 'aMethod', array(3, 4));
+ $mock->aMethod(1, 2);
+ $mock->aMethod(3, 4);
+ }
+
+ function testAtLeastOnceSatisfiedByOneCall() {
+ $mock = &new MockDummy();
+ $mock->expectAtLeastOnce('aMethod');
+ $mock->aMethod();
+ }
+
+ function testAtLeastOnceSatisfiedByTwoCalls() {
+ $mock = &new MockDummy();
+ $mock->expectAtLeastOnce('aMethod');
+ $mock->aMethod();
+ $mock->aMethod();
+ }
+
+ function testOnceSatisfiedByOneCall() {
+ $mock = &new MockDummy();
+ $mock->expectOnce('aMethod');
+ $mock->aMethod();
+ }
+
+ function testMinimumCallsSatisfiedByEnoughCalls() {
+ $mock = &new MockDummy();
+ $mock->expectMinimumCallCount('aMethod', 1);
+ $mock->aMethod();
+ }
+
+ function testMinimumCallsSatisfiedByTooManyCalls() {
+ $mock = &new MockDummy();
+ $mock->expectMinimumCallCount('aMethod', 3);
+ $mock->aMethod();
+ $mock->aMethod();
+ $mock->aMethod();
+ $mock->aMethod();
+ }
+
+ function testMaximumCallsSatisfiedByEnoughCalls() {
+ $mock = &new MockDummy();
+ $mock->expectMaximumCallCount('aMethod', 1);
+ $mock->aMethod();
+ }
+
+ function testMaximumCallsSatisfiedByNoCalls() {
+ $mock = &new MockDummy();
+ $mock->expectMaximumCallCount('aMethod', 1);
+ }
+}
+
+class MockWithInjectedTestCase extends SimpleMock {
+ function &_getCurrentTestCase() {
+ $context = &SimpleTest::getContext();
+ $test = &$context->getTest();
+ return $test->getMockedTest();
+ }
+}
+SimpleTest::setMockBaseClass('MockWithInjectedTestCase');
+Mock::generate('Dummy', 'MockDummyWithInjectedTestCase');
+SimpleTest::setMockBaseClass('SimpleMock');
+Mock::generate('SimpleTestCase');
+
+class LikeExpectation extends IdenticalExpectation {
+ function LikeExpectation($expectation) {
+ $expectation->_message = '';
+ $this->IdenticalExpectation($expectation);
+ }
+
+ function test($compare) {
+ $compare->_message = '';
+ return parent::test($compare);
+ }
+
+ function testMessage($compare) {
+ $compare->_message = '';
+ return parent::testMessage($compare);
+ }
+}
+
+class TestOfMockExpectations extends UnitTestCase {
+ var $test;
+
+ function setUp() {
+ $this->test = &new MockSimpleTestCase();
+ }
+
+ function &getMockedTest() {
+ return $this->test;
+ }
+
+ function testSettingExpectationOnNonMethodThrowsError() {
+ $mock = &new MockDummyWithInjectedTestCase();
+ $mock->expectMaximumCallCount('aMissingMethod', 2);
+ $this->assertError();
+ }
+
+ function testMaxCallsDetectsOverrun() {
+ $this->test->expectOnce('assert', array(
+ new LikeExpectation(new MaximumCallCountExpectation('aMethod', 2)),
+ 3));
+ $mock = &new MockDummyWithInjectedTestCase();
+ $mock->expectMaximumCallCount('aMethod', 2);
+ $mock->aMethod();
+ $mock->aMethod();
+ $mock->aMethod();
+ $mock->_mock->atTestEnd('testSomething', $this->test);
+ }
+
+ function testTallyOnMaxCallsSendsPassOnUnderrun() {
+ $this->test->expectOnce('assert', array(
+ new LikeExpectation(new MaximumCallCountExpectation('aMethod', 2)),
+ 2));
+ $mock = &new MockDummyWithInjectedTestCase();
+ $mock->expectMaximumCallCount("aMethod", 2);
+ $mock->aMethod();
+ $mock->aMethod();
+ $mock->_mock->atTestEnd('testSomething', $this->test);
+ }
+
+ function testExpectNeverDetectsOverrun() {
+ $this->test->expectOnce('assert', array(
+ new LikeExpectation(new MaximumCallCountExpectation('aMethod', 0)),
+ 1));
+ $mock = &new MockDummyWithInjectedTestCase();
+ $mock->expectNever('aMethod');
+ $mock->aMethod();
+ $mock->_mock->atTestEnd('testSomething', $this->test);
+ }
+
+ function testTallyOnExpectNeverStillSendsPassOnUnderrun() {
+ $this->test->expectOnce('assert', array(
+ new LikeExpectation(new MaximumCallCountExpectation('aMethod', 0)),
+ 0));
+ $mock = &new MockDummyWithInjectedTestCase();
+ $mock->expectNever('aMethod');
+ $mock->_mock->atTestEnd('testSomething', $this->test);
+ }
+
+ function testMinCalls() {
+ $this->test->expectOnce('assert', array(
+ new LikeExpectation(new MinimumCallCountExpectation('aMethod', 2)),
+ 2));
+ $mock = &new MockDummyWithInjectedTestCase();
+ $mock->expectMinimumCallCount('aMethod', 2);
+ $mock->aMethod();
+ $mock->aMethod();
+ $mock->_mock->atTestEnd('testSomething', $this->test);
+ }
+
+ function testFailedNever() {
+ $this->test->expectOnce('assert', array(
+ new LikeExpectation(new MaximumCallCountExpectation('aMethod', 0)),
+ 1));
+ $mock = &new MockDummyWithInjectedTestCase();
+ $mock->expectNever('aMethod');
+ $mock->aMethod();
+ $mock->_mock->atTestEnd('testSomething', $this->test);
+ }
+
+ function testUnderOnce() {
+ $this->test->expectOnce('assert', array(
+ new LikeExpectation(new CallCountExpectation('aMethod', 1)),
+ 0));
+ $mock = &new MockDummyWithInjectedTestCase();
+ $mock->expectOnce('aMethod');
+ $mock->_mock->atTestEnd('testSomething', $this->test);
+ }
+
+ function testOverOnce() {
+ $this->test->expectOnce('assert', array(
+ new LikeExpectation(new CallCountExpectation('aMethod', 1)),
+ 2));
+ $mock = &new MockDummyWithInjectedTestCase();
+ $mock->expectOnce('aMethod');
+ $mock->aMethod();
+ $mock->aMethod();
+ $mock->_mock->atTestEnd('testSomething', $this->test);
+ }
+
+ function testUnderAtLeastOnce() {
+ $this->test->expectOnce('assert', array(
+ new LikeExpectation(new MinimumCallCountExpectation('aMethod', 1)),
+ 0));
+ $mock = &new MockDummyWithInjectedTestCase();
+ $mock->expectAtLeastOnce("aMethod");
+ $mock->_mock->atTestEnd('testSomething', $this->test);
+ }
+
+ function testZeroArguments() {
+ $this->test->expectOnce('assert', array(
+ new LikeExpectation(new ParametersExpectation(array())),
+ array(),
+ '*'));
+ $mock = &new MockDummyWithInjectedTestCase();
+ $mock->expect("aMethod", array());
+ $mock->aMethod();
+ $mock->_mock->atTestEnd('testSomething', $this->test);
+ }
+
+ function testExpectedArguments() {
+ $this->test->expectOnce('assert', array(
+ new LikeExpectation(new ParametersExpectation(array(1, 2, 3))),
+ array(1, 2, 3),
+ '*'));
+ $mock = &new MockDummyWithInjectedTestCase();
+ $mock->expect('aMethod', array(1, 2, 3));
+ $mock->aMethod(1, 2, 3);
+ $mock->_mock->atTestEnd('testSomething', $this->test);
+ }
+
+ function testFailedArguments() {
+ $this->test->expectOnce('assert', array(
+ new LikeExpectation(new ParametersExpectation(array('this'))),
+ array('that'),
+ '*'));
+ $mock = &new MockDummyWithInjectedTestCase();
+ $mock->expect('aMethod', array('this'));
+ $mock->aMethod('that');
+ $mock->_mock->atTestEnd('testSomething', $this->test);
+ }
+
+ function testWildcardsAreTranslatedToAnythingExpectations() {
+ $this->test->expectOnce('assert', array(
+ new LikeExpectation(new ParametersExpectation(array(
+ new AnythingExpectation(), 123, new AnythingExpectation()))),
+ array(100, 123, 101),
+ '*'));
+ $mock = &new MockDummyWithInjectedTestCase($this);
+ $mock->expect("aMethod", array('*', 123, '*'));
+ $mock->aMethod(100, 123, 101);
+ $mock->_mock->atTestEnd('testSomething', $this->test);
+ }
+
+ function testSpecificPassingSequence() {
+ $this->test->expectAt(0, 'assert', array(
+ new LikeExpectation(new ParametersExpectation(array(1, 2, 3))),
+ array(1, 2, 3),
+ '*'));
+ $this->test->expectAt(1, 'assert', array(
+ new LikeExpectation(new ParametersExpectation(array('Hello'))),
+ array('Hello'),
+ '*'));
+ $mock = &new MockDummyWithInjectedTestCase();
+ $mock->expectAt(1, 'aMethod', array(1, 2, 3));
+ $mock->expectAt(2, 'aMethod', array('Hello'));
+ $mock->aMethod();
+ $mock->aMethod(1, 2, 3);
+ $mock->aMethod('Hello');
+ $mock->aMethod();
+ $mock->_mock->atTestEnd('testSomething', $this->test);
+ }
+
+ function testNonArrayForExpectedParametersGivesError() {
+ $mock = &new MockDummyWithInjectedTestCase();
+ $mock->expect("aMethod", "foo");
+ $this->assertErrorPattern('/\$args.*not an array/i');
+ $mock->aMethod();
+ $mock->tally();
+ $mock->_mock->atTestEnd('testSomething', $this->test);
+ }
+}
+
+class TestOfMockComparisons extends UnitTestCase {
+
+ function testEqualComparisonOfMocksDoesNotCrash() {
+ $expectation = &new EqualExpectation(new MockDummy());
+ $this->assertTrue($expectation->test(new MockDummy(), true));
+ }
+
+ function testIdenticalComparisonOfMocksDoesNotCrash() {
+ $expectation = &new IdenticalExpectation(new MockDummy());
+ $this->assertTrue($expectation->test(new MockDummy()));
+ }
+}
+
+class ClassWithSpecialMethods {
+ function __get($name) { }
+ function __set($name, $value) { }
+ function __isset($name) { }
+ function __unset($name) { }
+ function __call($method, $arguments) { }
+ function __toString() { }
+}
+Mock::generate('ClassWithSpecialMethods');
+
+class TestOfSpecialMethods extends UnitTestCase {
+ function skip() {
+ $this->skipIf(version_compare(phpversion(), '5', '<='), 'Overloading not tested for PHP 4');
+ }
+
+ function testCanMockTheThingAtAll() {
+ $mock = new MockClassWithSpecialMethods();
+ }
+
+ function testReturnFromSpecialAccessor() {
+ $mock = &new MockClassWithSpecialMethods();
+ $mock->setReturnValue('__get', '1st Return', array('first'));
+ $mock->setReturnValue('__get', '2nd Return', array('second'));
+ $this->assertEqual($mock->first, '1st Return');
+ $this->assertEqual($mock->second, '2nd Return');
+ }
+
+ function testcanExpectTheSettingOfValue() {
+ $mock = &new MockClassWithSpecialMethods();
+ $mock->expectOnce('__set', array('a', 'A'));
+ $mock->a = 'A';
+ }
+
+ function testCanSimulateAnOverloadmethod() {
+ $mock = &new MockClassWithSpecialMethods();
+ $mock->expectOnce('__call', array('amOverloaded', array('A')));
+ $mock->setReturnValue('__call', 'aaa');
+ $this->assertIdentical($mock->amOverloaded('A'), 'aaa');
+ }
+
+ function testCanEmulateIsset() {
+ $mock = &new MockClassWithSpecialMethods();
+ $mock->setReturnValue('__isset', true);
+ $this->assertIdentical(isset($mock->a), true);
+ }
+
+ function testCanExpectUnset() {
+ $mock = &new MockClassWithSpecialMethods();
+ $mock->expectOnce('__unset', array('a'));
+ unset($mock->a);
+ }
+
+ function testToStringMagic() {
+ $mock = &new MockClassWithSpecialMethods();
+ $mock->expectOnce('__toString');
+ $mock->setReturnValue('__toString', 'AAA');
+ ob_start();
+ print $mock;
+ $output = ob_get_contents();
+ ob_end_clean();
+ $this->assertEqual($output, 'AAA');
+ }
+}
+
+if (version_compare(phpversion(), '5', '>=')) {
+ $class = 'class WithStaticMethod { ';
+ $class .= ' static function aStaticMethod() { } ';
+ $class .= '}';
+ eval($class);
+}
+Mock::generate('WithStaticMethod');
+
+class TestOfMockingClassesWithStaticMethods extends UnitTestCase {
+ function skip() {
+ $this->skipUnless(version_compare(phpversion(), '5', '>='));
+ }
+
+ function testStaticMethodIsMockedAsStatic() {
+ $mock = new WithStaticMethod();
+ $reflection = new ReflectionClass($mock);
+ $method = $reflection->getMethod('aStaticMethod');
+ $this->assertTrue($method->isStatic());
+ }
+}
+
+Mock::generatePartial('Dummy', 'TestDummy', array('anotherMethod'));
+
+class TestOfPartialMocks extends UnitTestCase {
+
+ function testMethodReplacementWithNoBehaviourReturnsNull() {
+ $mock = &new TestDummy();
+ $this->assertEqual($mock->aMethod(99), 99);
+ $this->assertNull($mock->anotherMethod());
+ }
+
+ function testSettingReturns() {
+ $mock = &new TestDummy();
+ $mock->setReturnValue('anotherMethod', 33, array(3));
+ $mock->setReturnValue('anotherMethod', 22);
+ $mock->setReturnValueAt(2, 'anotherMethod', 44, array(3));
+ $this->assertEqual($mock->anotherMethod(), 22);
+ $this->assertEqual($mock->anotherMethod(3), 33);
+ $this->assertEqual($mock->anotherMethod(3), 44);
+ }
+
+ function testReferences() {
+ $mock = &new TestDummy();
+ $object = new Dummy();
+ $mock->setReturnReferenceAt(0, 'anotherMethod', $object, array(3));
+ $this->assertReference($zref =& $mock->anotherMethod(3), $object);
+ }
+
+ function testExpectations() {
+ $mock = &new TestDummy();
+ $mock->expectCallCount('anotherMethod', 2);
+ $mock->expect('anotherMethod', array(77));
+ $mock->expectAt(1, 'anotherMethod', array(66));
+ $mock->anotherMethod(77);
+ $mock->anotherMethod(66);
+ }
+
+ function testSettingExpectationOnMissingMethodThrowsError() {
+ $mock = &new TestDummy();
+ $mock->expectCallCount('aMissingMethod', 2);
+ $this->assertError();
+ }
+}
+
+class ConstructorSuperClass {
+ function ConstructorSuperClass() { }
+}
+
+class ConstructorSubClass extends ConstructorSuperClass {
+}
+
+class TestOfPHP4StyleSuperClassConstruct extends UnitTestCase {
+ /*
+ * This addresses issue #1231401. Without the fix in place, this will
+ * generate a fatal PHP error.
+ */
+ function testBasicConstruct() {
+ Mock::generate('ConstructorSubClass');
+ $mock = &new MockConstructorSubClass();
+ $this->assertIsA($mock, 'ConstructorSubClass');
+ $this->assertTrue(method_exists($mock, 'ConstructorSuperClass'));
+ }
+}
+
+class TestOfPHP5StaticMethodMocking extends UnitTestCase {
+ function skip() {
+ $this->skipIf(version_compare(phpversion(), '5', '<='), 'Static methods not tested in PHP 4');
+ }
+
+ function testCanCreateAMockObjectWithStaticMethodsWithoutError() {
+ eval('
+ class SimpleObjectContainingStaticMethod {
+ static function someStatic() { }
+ }
+ ');
+
+ Mock::generate('SimpleObjectContainingStaticMethod');
+ $this->assertNoErrors();
+ }
+}
+
+class TestOfPHP5AbstractMethodMocking extends UnitTestCase {
+ function skip() {
+ $this->skipIf(version_compare(phpversion(), '5', '<='), 'Abstract class/methods not tested in PHP 4');
+ }
+
+ function testCanCreateAMockObjectFromAnAbstractWithProperFunctionDeclarations() {
+ eval('
+ abstract class SimpleAbstractClassContainingAbstractMethods {
+ abstract function anAbstract();
+ abstract function anAbstractWithParameter($foo);
+ abstract function anAbstractWithMultipleParameters($foo, $bar);
+ }
+ ');
+
+ Mock::generate('SimpleAbstractClassContainingAbstractMethods');
+ $this->assertNoErrors();
+
+ $this->assertTrue(
+ method_exists(
+ 'MockSimpleAbstractClassContainingAbstractMethods',
+ 'anAbstract'
+ )
+ );
+ $this->assertTrue(
+ method_exists(
+ 'MockSimpleAbstractClassContainingAbstractMethods',
+ 'anAbstractWithParameter'
+ )
+ );
+ $this->assertTrue(
+ method_exists(
+ 'MockSimpleAbstractClassContainingAbstractMethods',
+ 'anAbstractWithMultipleParameters'
+ )
+ );
+ }
+
+ function testMethodsDefinedAsAbstractInParentShouldHaveFullSignature() {
+ eval('
+ abstract class SimpleParentAbstractClassContainingAbstractMethods {
+ abstract function anAbstract();
+ abstract function anAbstractWithParameter($foo);
+ abstract function anAbstractWithMultipleParameters($foo, $bar);
+ }
+
+ class SimpleChildAbstractClassContainingAbstractMethods extends SimpleParentAbstractClassContainingAbstractMethods {
+ function anAbstract(){}
+ function anAbstractWithParameter($foo){}
+ function anAbstractWithMultipleParameters($foo, $bar){}
+ }
+ ');
+
+ Mock::generate('SimpleChildAbstractClassContainingAbstractMethods');
+ $this->assertNoErrors();
+
+ $this->assertTrue(
+ method_exists(
+ 'MockSimpleChildAbstractClassContainingAbstractMethods',
+ 'anAbstract'
+ )
+ );
+ $this->assertTrue(
+ method_exists(
+ 'MockSimpleChildAbstractClassContainingAbstractMethods',
+ 'anAbstractWithParameter'
+ )
+ );
+ $this->assertTrue(
+ method_exists(
+ 'MockSimpleChildAbstractClassContainingAbstractMethods',
+ 'anAbstractWithMultipleParameters'
+ )
+ );
+ }
+}
+
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/page_test.php b/tests/simpletest/test/page_test.php
new file mode 100755
index 0000000000..cecc7e6929
--- /dev/null
+++ b/tests/simpletest/test/page_test.php
@@ -0,0 +1,903 @@
+<?php
+// $Id: page_test.php,v 1.97 2007/07/16 18:13:23 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../expectation.php');
+require_once(dirname(__FILE__) . '/../http.php');
+require_once(dirname(__FILE__) . '/../page.php');
+require_once(dirname(__FILE__) . '/../parser.php');
+Mock::generate('SimpleHtmlSaxParser');
+Mock::generate('SimplePage');
+Mock::generate('SimpleHttpResponse');
+Mock::generate('SimpleHttpHeaders');
+Mock::generate('SimplePageBuilder');
+Mock::generatePartial(
+ 'SimplePageBuilder',
+ 'PartialSimplePageBuilder',
+ array('_createPage', '_createParser'));
+
+class TestOfPageBuilder extends UnitTestCase {
+
+ function testLink() {
+ $tag = &new SimpleAnchorTag(array('href' => 'http://somewhere'));
+ $tag->addContent('Label');
+
+ $page = &new MockSimplePage();
+ $page->expectArguments('acceptTag', array($tag));
+ $page->expectCallCount('acceptTag', 1);
+
+ $builder = &new PartialSimplePageBuilder();
+ $builder->setReturnReference('_createPage', $page);
+ $builder->setReturnReference('_createParser', new MockSimpleHtmlSaxParser());
+ $builder->SimplePageBuilder();
+
+ $builder->parse(new MockSimpleHttpResponse());
+ $this->assertTrue($builder->startElement(
+ 'a',
+ array('href' => 'http://somewhere')));
+ $this->assertTrue($builder->addContent('Label'));
+ $this->assertTrue($builder->endElement('a'));
+ }
+
+ function testLinkWithId() {
+ $tag = &new SimpleAnchorTag(array("href" => "http://somewhere", "id" => "44"));
+ $tag->addContent("Label");
+
+ $page = &new MockSimplePage();
+ $page->expectArguments("acceptTag", array($tag));
+ $page->expectCallCount("acceptTag", 1);
+
+ $builder = &new PartialSimplePageBuilder();
+ $builder->setReturnReference('_createPage', $page);
+ $builder->setReturnReference('_createParser', new MockSimpleHtmlSaxParser());
+ $builder->SimplePageBuilder();
+
+ $builder->parse(new MockSimpleHttpResponse());
+ $this->assertTrue($builder->startElement(
+ "a",
+ array("href" => "http://somewhere", "id" => "44")));
+ $this->assertTrue($builder->addContent("Label"));
+ $this->assertTrue($builder->endElement("a"));
+ }
+
+ function testLinkExtraction() {
+ $tag = &new SimpleAnchorTag(array("href" => "http://somewhere"));
+ $tag->addContent("Label");
+
+ $page = &new MockSimplePage();
+ $page->expectArguments("acceptTag", array($tag));
+ $page->expectCallCount("acceptTag", 1);
+
+ $builder = &new PartialSimplePageBuilder();
+ $builder->setReturnReference('_createPage', $page);
+ $builder->setReturnReference('_createParser', new MockSimpleHtmlSaxParser());
+ $builder->SimplePageBuilder();
+
+ $builder->parse(new MockSimpleHttpResponse());
+ $this->assertTrue($builder->addContent("Starting stuff"));
+ $this->assertTrue($builder->startElement(
+ "a",
+ array("href" => "http://somewhere")));
+ $this->assertTrue($builder->addContent("Label"));
+ $this->assertTrue($builder->endElement("a"));
+ $this->assertTrue($builder->addContent("Trailing stuff"));
+ }
+
+ function testMultipleLinks() {
+ $a1 = new SimpleAnchorTag(array("href" => "http://somewhere"));
+ $a1->addContent("1");
+
+ $a2 = new SimpleAnchorTag(array("href" => "http://elsewhere"));
+ $a2->addContent("2");
+
+ $page = &new MockSimplePage();
+ $page->expectArgumentsAt(0, "acceptTag", array($a1));
+ $page->expectArgumentsAt(1, "acceptTag", array($a2));
+ $page->expectCallCount("acceptTag", 2);
+
+ $builder = &new PartialSimplePageBuilder();
+ $builder->setReturnReference('_createPage', $page);
+ $builder->setReturnReference('_createParser', new MockSimpleHtmlSaxParser());
+ $builder->SimplePageBuilder();
+
+ $builder->parse(new MockSimpleHttpResponse());
+ $builder->startElement("a", array("href" => "http://somewhere"));
+ $builder->addContent("1");
+ $builder->endElement("a");
+ $builder->addContent("Padding");
+ $builder->startElement("a", array("href" => "http://elsewhere"));
+ $builder->addContent("2");
+ $builder->endElement("a");
+ }
+
+ function testTitle() {
+ $tag = &new SimpleTitleTag(array());
+ $tag->addContent("HereThere");
+
+ $page = &new MockSimplePage();
+ $page->expectArguments("acceptTag", array($tag));
+ $page->expectCallCount("acceptTag", 1);
+
+ $builder = &new PartialSimplePageBuilder();
+ $builder->setReturnReference('_createPage', $page);
+ $builder->setReturnReference('_createParser', new MockSimpleHtmlSaxParser());
+ $builder->SimplePageBuilder();
+
+ $builder->parse(new MockSimpleHttpResponse());
+ $builder->startElement("title", array());
+ $builder->addContent("Here");
+ $builder->addContent("There");
+ $builder->endElement("title");
+ }
+
+ function testForm() {
+ $page = &new MockSimplePage();
+ $page->expectOnce("acceptFormStart", array(new SimpleFormTag(array())));
+ $page->expectOnce("acceptFormEnd", array());
+
+ $builder = &new PartialSimplePageBuilder();
+ $builder->setReturnReference('_createPage', $page);
+ $builder->setReturnReference('_createParser', new MockSimpleHtmlSaxParser());
+ $builder->SimplePageBuilder();
+
+ $builder->parse(new MockSimpleHttpResponse());
+ $builder->startElement("form", array());
+ $builder->addContent("Stuff");
+ $builder->endElement("form");
+ }
+}
+
+class TestOfPageParsing extends UnitTestCase {
+
+ function testParseMechanics() {
+ $parser = &new MockSimpleHtmlSaxParser();
+ $parser->expectOnce('parse', array('stuff'));
+
+ $page = &new MockSimplePage();
+ $page->expectOnce('acceptPageEnd');
+
+ $builder = &new PartialSimplePageBuilder();
+ $builder->setReturnReference('_createPage', $page);
+ $builder->setReturnReference('_createParser', $parser);
+ $builder->SimplePageBuilder();
+
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent', 'stuff');
+ $builder->parse($response);
+ }
+}
+
+class TestOfPageInterface extends UnitTestCase {
+
+ function testInterfaceOnEmptyPage() {
+ $page = &new SimplePage();
+ $this->assertEqual($page->getTransportError(), 'No page fetched yet');
+ $this->assertIdentical($page->getRaw(), false);
+ $this->assertIdentical($page->getHeaders(), false);
+ $this->assertIdentical($page->getMimeType(), false);
+ $this->assertIdentical($page->getResponseCode(), false);
+ $this->assertIdentical($page->getAuthentication(), false);
+ $this->assertIdentical($page->getRealm(), false);
+ $this->assertFalse($page->hasFrames());
+ $this->assertIdentical($page->getUrls(), array());
+ $this->assertIdentical($page->getTitle(), false);
+ }
+}
+
+class TestOfPageHeaders extends UnitTestCase {
+
+ function testUrlAccessor() {
+ $headers = &new MockSimpleHttpHeaders();
+
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getHeaders', $headers);
+ $response->setReturnValue('getMethod', 'POST');
+ $response->setReturnValue('getUrl', new SimpleUrl('here'));
+ $response->setReturnValue('getRequestData', array('a' => 'A'));
+
+ $page = &new SimplePage($response);
+ $this->assertEqual($page->getMethod(), 'POST');
+ $this->assertEqual($page->getUrl(), new SimpleUrl('here'));
+ $this->assertEqual($page->getRequestData(), array('a' => 'A'));
+ }
+
+ function testTransportError() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getError', 'Ouch');
+
+ $page = &new SimplePage($response);
+ $this->assertEqual($page->getTransportError(), 'Ouch');
+ }
+
+ function testHeadersAccessor() {
+ $headers = &new MockSimpleHttpHeaders();
+ $headers->setReturnValue('getRaw', 'My: Headers');
+
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getHeaders', $headers);
+
+ $page = &new SimplePage($response);
+ $this->assertEqual($page->getHeaders(), 'My: Headers');
+ }
+
+ function testMimeAccessor() {
+ $headers = &new MockSimpleHttpHeaders();
+ $headers->setReturnValue('getMimeType', 'text/html');
+
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getHeaders', $headers);
+
+ $page = &new SimplePage($response);
+ $this->assertEqual($page->getMimeType(), 'text/html');
+ }
+
+ function testResponseAccessor() {
+ $headers = &new MockSimpleHttpHeaders();
+ $headers->setReturnValue('getResponseCode', 301);
+
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getHeaders', $headers);
+
+ $page = &new SimplePage($response);
+ $this->assertIdentical($page->getResponseCode(), 301);
+ }
+
+ function testAuthenticationAccessors() {
+ $headers = &new MockSimpleHttpHeaders();
+ $headers->setReturnValue('getAuthentication', 'Basic');
+ $headers->setReturnValue('getRealm', 'Secret stuff');
+
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getHeaders', $headers);
+
+ $page = &new SimplePage($response);
+ $this->assertEqual($page->getAuthentication(), 'Basic');
+ $this->assertEqual($page->getRealm(), 'Secret stuff');
+ }
+}
+
+class TestOfHtmlPage extends UnitTestCase {
+
+ function testRawAccessor() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent', 'Raw HTML');
+
+ $page = &new SimplePage($response);
+ $this->assertEqual($page->getRaw(), 'Raw HTML');
+ }
+
+ function testTextAccessor() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent', '<b>Some</b> &quot;messy&quot; HTML');
+
+ $page = &new SimplePage($response);
+ $this->assertEqual($page->getText(), 'Some "messy" HTML');
+ }
+
+ function testNoLinks() {
+ $page = &new SimplePage(new MockSimpleHttpResponse());
+ $this->assertIdentical($page->getUrls(), array());
+ $this->assertIdentical($page->getUrlsByLabel('Label'), array());
+ }
+
+ function testAddAbsoluteLink() {
+ $link = &new SimpleAnchorTag(array('href' => 'http://somewhere.com'));
+ $link->addContent('Label');
+ $page = &new SimplePage(new MockSimpleHttpResponse());
+ $page->AcceptTag($link);
+ $this->assertEqual(
+ $page->getUrlsByLabel('Label'),
+ array(new SimpleUrl('http://somewhere.com')));
+ }
+
+ function testAddStrictRelativeLink() {
+ $link = &new SimpleAnchorTag(array('href' => './somewhere.php'));
+ $link->addContent('Label');
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getUrl', new SimpleUrl('http://host/'));
+ $page = &new SimplePage($response);
+ $page->AcceptTag($link);
+ $this->assertEqual(
+ $page->getUrlsByLabel('Label'),
+ array(new SimpleUrl('http://host/somewhere.php')));
+ }
+
+ function testAddBareRelativeLink() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getUrl', new SimpleUrl('http://host/'));
+ $page = &new SimplePage($response);
+ $page->AcceptTag(new SimpleAnchorTag(array('href' => 'somewhere.php')));
+ $this->assertIdentical($page->getUrls(), array('http://host/somewhere.php'));
+ }
+
+ function testAddRelativeLinkWithBaseTag() {
+ $link = &new SimpleAnchorTag(array('href' => 'somewhere.php'));
+ $link->addContent('Label');
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getUrl', new SimpleUrl('http://host/'));
+ $page = &new SimplePage($response);
+ $page->AcceptTag($link);
+ $base = &new SimpleBaseTag(array('href' => 'www.lastcraft.com/stuff/'));
+ $page->AcceptTag($base);
+ $this->assertEqual(
+ $page->getUrlsByLabel('Label'),
+ array(new SimpleUrl('www.lastcraft.com/stuff/somewhere.php')));
+ }
+
+ function testAddAbsoluteLinkWithBaseTag() {
+ $link = &new SimpleAnchorTag(array('href' => 'http://here.com/somewhere.php'));
+ $link->addContent('Label');
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getUrl', new SimpleUrl('http://host/'));
+ $page = &new SimplePage($response);
+ $page->AcceptTag($link);
+ $base = &new SimpleBaseTag(array('href' => 'www.lastcraft.com/stuff/'));
+ $page->AcceptTag($base);
+ $this->assertEqual(
+ $page->getUrlsByLabel('Label'),
+ array(new SimpleUrl('http://here.com/somewhere.php')));
+ }
+
+ function testLinkIds() {
+ $link = &new SimpleAnchorTag(array('href' => './somewhere.php', 'id' => 33));
+ $link->addContent('Label');
+
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getUrl', new SimpleUrl('http://host/'));
+
+ $page = &new SimplePage($response);
+ $page->AcceptTag($link);
+
+ $this->assertEqual(
+ $page->getUrlsByLabel('Label'),
+ array(new SimpleUrl('http://host/somewhere.php')));
+ $this->assertFalse($page->getUrlById(0));
+ $this->assertEqual(
+ $page->getUrlById(33),
+ new SimpleUrl('http://host/somewhere.php'));
+ }
+
+ function testFindLinkWithNormalisation() {
+ $link = &new SimpleAnchorTag(array('href' => './somewhere.php', 'id' => 33));
+ $link->addContent(' <em>Long &amp; thin</em> ');
+
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getUrl', new SimpleUrl('http://host/'));
+
+ $page = &new SimplePage($response);
+ $page->AcceptTag($link);
+
+ $this->assertEqual(
+ $page->getUrlsByLabel('Long & thin'),
+ array(new SimpleUrl('http://host/somewhere.php')));
+ }
+
+ function testFindLinkWithImage() {
+ $link = &new SimpleAnchorTag(array('href' => './somewhere.php', 'id' => 33));
+ $link->addContent('<img src="pic.jpg" alt="&lt;A picture&gt;">');
+
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getUrl', new SimpleUrl('http://host/'));
+
+ $page = &new SimplePage($response);
+ $page->AcceptTag($link);
+
+ $this->assertEqual(
+ $page->getUrlsByLabel('<A picture>'),
+ array(new SimpleUrl('http://host/somewhere.php')));
+ }
+
+ function testTitleSetting() {
+ $title = &new SimpleTitleTag(array());
+ $title->addContent('Title');
+ $page = &new SimplePage(new MockSimpleHttpResponse());
+ $page->AcceptTag($title);
+ $this->assertEqual($page->getTitle(), 'Title');
+ }
+
+ function testFramesetAbsence() {
+ $url = new SimpleUrl('here');
+ $response = new MockSimpleHttpResponse();
+ $response->setReturnValue('getUrl', $url);
+ $page = &new SimplePage($response);
+ $this->assertFalse($page->hasFrames());
+ $this->assertIdentical($page->getFrameset(), false);
+ }
+
+ function testHasEmptyFrameset() {
+ $page = &new SimplePage(new MockSimpleHttpResponse());
+ $page->acceptFramesetStart(new SimpleTag('frameset', array()));
+ $page->acceptFramesetEnd();
+ $this->assertTrue($page->hasFrames());
+ $this->assertIdentical($page->getFrameset(), array());
+ }
+
+ function testFramesInPage() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getUrl', new SimpleUrl('http://here'));
+
+ $page = &new SimplePage($response);
+ $page->acceptFrame(new SimpleFrameTag(array('src' => '1.html')));
+ $page->acceptFramesetStart(new SimpleTag('frameset', array()));
+ $page->acceptFrame(new SimpleFrameTag(array('src' => '2.html')));
+ $page->acceptFrame(new SimpleFrameTag(array('src' => '3.html')));
+ $page->acceptFramesetEnd();
+ $page->acceptFrame(new SimpleFrameTag(array('src' => '4.html')));
+
+ $this->assertTrue($page->hasFrames());
+ $this->assertIdentical($page->getFrameset(), array(
+ 1 => new SimpleUrl('http://here/2.html'),
+ 2 => new SimpleUrl('http://here/3.html')));
+ }
+
+ function testNamedFramesInPage() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getUrl', new SimpleUrl('http://here'));
+
+ $page = &new SimplePage($response);
+ $page->acceptFramesetStart(new SimpleTag('frameset', array()));
+ $page->acceptFrame(new SimpleFrameTag(array('src' => '1.html')));
+ $page->acceptFrame(new SimpleFrameTag(array('src' => '2.html', 'name' => 'A')));
+ $page->acceptFrame(new SimpleFrameTag(array('src' => '3.html', 'name' => 'B')));
+ $page->acceptFrame(new SimpleFrameTag(array('src' => '4.html')));
+ $page->acceptFramesetEnd();
+
+ $this->assertTrue($page->hasFrames());
+ $this->assertIdentical($page->getFrameset(), array(
+ 1 => new SimpleUrl('http://here/1.html'),
+ 'A' => new SimpleUrl('http://here/2.html'),
+ 'B' => new SimpleUrl('http://here/3.html'),
+ 4 => new SimpleUrl('http://here/4.html')));
+ }
+
+ function testRelativeFramesRespectBaseTag() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getUrl', new SimpleUrl('http://here.com/'));
+ $page = &new SimplePage($response);
+
+ $base = &new SimpleBaseTag(array('href' => 'https://there.com/stuff/'));
+ $page->AcceptTag($base);
+
+ $page->acceptFramesetStart(new SimpleTag('frameset', array()));
+ $page->acceptFrame(new SimpleFrameTag(array('src' => '1.html')));
+ $page->acceptFramesetEnd();
+ $this->assertIdentical(
+ $page->getFrameset(),
+ array(1 => new SimpleUrl('https://there.com/stuff/1.html')));
+ }
+}
+
+class TestOfFormsCreatedFromEventStream extends UnitTestCase {
+
+ function testFormCanBeSubmitted() {
+ $page = &new SimplePage(new MockSimpleHttpResponse());
+ $page->acceptFormStart(
+ new SimpleFormTag(array('method' => 'GET', 'action' => 'here.php')));
+ $page->AcceptTag(
+ new SimpleSubmitTag(array('type' => 'submit', 'name' => 's')));
+ $page->acceptFormEnd();
+ $form = &$page->getFormBySubmit(new SimpleByLabel('Submit'));
+ $this->assertEqual(
+ $form->submitButton(new SimpleByLabel('Submit')),
+ new SimpleGetEncoding(array('s' => 'Submit')));
+ }
+
+ function testInputFieldCanBeReadBack() {
+ $page = &new SimplePage(new MockSimpleHttpResponse());
+ $page->acceptFormStart(
+ new SimpleFormTag(array("method" => "GET", "action" => "here.php")));
+ $page->AcceptTag(
+ new SimpleTextTag(array("type" => "text", "name" => "a", "value" => "A")));
+ $page->AcceptTag(
+ new SimpleSubmitTag(array("type" => "submit", "name" => "s")));
+ $page->acceptFormEnd();
+ $this->assertEqual($page->getField(new SimpleByName('a')), 'A');
+ }
+
+ function testInputFieldCanBeReadBackByLabel() {
+ $label = &new SimpleLabelTag(array());
+ $page = &new SimplePage(new MockSimpleHttpResponse());
+ $page->acceptFormStart(
+ new SimpleFormTag(array("method" => "GET", "action" => "here.php")));
+ $page->acceptLabelStart($label);
+ $label->addContent('l');
+ $page->AcceptTag(
+ new SimpleTextTag(array("type" => "text", "name" => "a", "value" => "A")));
+ $page->acceptLabelEnd();
+ $page->AcceptTag(
+ new SimpleSubmitTag(array("type" => "submit", "name" => "s")));
+ $page->acceptFormEnd();
+ $this->assertEqual($page->getField(new SimpleByLabel('l')), 'A');
+ }
+}
+
+class TestOfPageScraping extends UnitTestCase {
+
+ function &parse($response) {
+ $builder = &new SimplePageBuilder();
+ $page = &$builder->parse($response);
+ return $page;
+ }
+
+ function testEmptyPage() {
+ $page = &new SimplePage(new MockSimpleHttpResponse());
+ $this->assertIdentical($page->getUrls(), array());
+ $this->assertIdentical($page->getTitle(), false);
+ }
+
+ function testUninterestingPage() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent', '<html><body><p>Stuff</p></body></html>');
+ $page = &$this->parse($response);
+ $this->assertIdentical($page->getUrls(), array());
+ }
+
+ function testLinksPage() {
+ $raw = '<html>';
+ $raw .= '<a href="there.html">There</a>';
+ $raw .= '<a href="http://there.com/that.html" id="0">That page</a>';
+ $raw .= '</html>';
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent', $raw);
+ $response->setReturnValue('getUrl', new SimpleUrl('http://www.here.com/a/index.html'));
+
+ $page = &$this->parse($response);
+ $this->assertIdentical(
+ $page->getUrls(),
+ array('http://www.here.com/a/there.html', 'http://there.com/that.html'));
+ $this->assertIdentical(
+ $page->getUrlsByLabel('There'),
+ array(new SimpleUrl('http://www.here.com/a/there.html')));
+ $this->assertEqual(
+ $page->getUrlById('0'),
+ new SimpleUrl('http://there.com/that.html'));
+ }
+
+ function testTitle() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent', '<html><head><title>Me</title></head></html>');
+ $page = &$this->parse($response);
+ $this->assertEqual($page->getTitle(), 'Me');
+ }
+
+ function testNastyTitle() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue(
+ 'getContent',
+ '<html><head><Title> <b>Me&amp;Me </TITLE></b></head></html>');
+ $page = &$this->parse($response);
+ $this->assertEqual($page->getTitle(), "Me&Me");
+ }
+
+ function testCompleteForm() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><head><form>' .
+ '<input type="text" name="here" value="Hello">' .
+ '</form></head></html>');
+ $page = &$this->parse($response);
+ $this->assertEqual($page->getField(new SimpleByName('here')), "Hello");
+ }
+
+ function testUnclosedForm() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><head><form>' .
+ '<input type="text" name="here" value="Hello">' .
+ '</head></html>');
+ $page = &$this->parse($response);
+ $this->assertEqual($page->getField(new SimpleByName('here')), "Hello");
+ }
+
+ function testEmptyFrameset() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue(
+ 'getContent',
+ '<html><frameset></frameset></html>');
+ $page = &$this->parse($response);
+ $this->assertTrue($page->hasFrames());
+ $this->assertIdentical($page->getFrameset(), array());
+ }
+
+ function testSingleFrame() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue(
+ 'getContent',
+ '<html><frameset><frame src="a.html"></frameset></html>');
+ $response->setReturnValue('getUrl', new SimpleUrl('http://host/'));
+
+ $page = &$this->parse($response);
+ $this->assertTrue($page->hasFrames());
+ $this->assertIdentical(
+ $page->getFrameset(),
+ array(1 => new SimpleUrl('http://host/a.html')));
+ }
+
+ function testSingleFrameInNestedFrameset() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><frameset><frameset>' .
+ '<frame src="a.html">' .
+ '</frameset></frameset></html>');
+ $response->setReturnValue('getUrl', new SimpleUrl('http://host/'));
+
+ $page = &$this->parse($response);
+ $this->assertTrue($page->hasFrames());
+ $this->assertIdentical(
+ $page->getFrameset(),
+ array(1 => new SimpleUrl('http://host/a.html')));
+ }
+
+ function testFrameWithNoSource() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue(
+ 'getContent',
+ '<html><frameset><frame></frameset></html>');
+ $page = &$this->parse($response);
+ $this->assertTrue($page->hasFrames());
+ $this->assertIdentical($page->getFrameset(), array());
+ }
+
+ function testFramesCollectedWithNestedFramesetTags() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><frameset>' .
+ '<frame src="a.html">' .
+ '<frameset><frame src="b.html"></frameset>' .
+ '<frame src="c.html">' .
+ '</frameset></html>');
+ $response->setReturnValue('getUrl', new SimpleUrl('http://host/'));
+
+ $page = &$this->parse($response);
+ $this->assertTrue($page->hasFrames());
+ $this->assertIdentical($page->getFrameset(), array(
+ 1 => new SimpleUrl('http://host/a.html'),
+ 2 => new SimpleUrl('http://host/b.html'),
+ 3 => new SimpleUrl('http://host/c.html')));
+ }
+
+ function testNamedFrames() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><frameset>' .
+ '<frame src="a.html">' .
+ '<frame name="_one" src="b.html">' .
+ '<frame src="c.html">' .
+ '<frame src="d.html" name="_two">' .
+ '</frameset></html>');
+ $response->setReturnValue('getUrl', new SimpleUrl('http://host/'));
+
+ $page = &$this->parse($response);
+ $this->assertTrue($page->hasFrames());
+ $this->assertIdentical($page->getFrameset(), array(
+ 1 => new SimpleUrl('http://host/a.html'),
+ '_one' => new SimpleUrl('http://host/b.html'),
+ 3 => new SimpleUrl('http://host/c.html'),
+ '_two' => new SimpleUrl('http://host/d.html')));
+ }
+
+ function testFindFormByLabel() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue(
+ 'getContent',
+ '<html><head><form><input type="submit"></form></head></html>');
+ $page = &$this->parse($response);
+ $this->assertNull($page->getFormBySubmit(new SimpleByLabel('submit')));
+ $this->assertNull($page->getFormBySubmit(new SimpleByName('submit')));
+ $this->assertIsA(
+ $page->getFormBySubmit(new SimpleByLabel('Submit')),
+ 'SimpleForm');
+ }
+
+ function testConfirmSubmitAttributesAreCaseSensitive() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue(
+ 'getContent',
+ '<html><head><FORM><INPUT TYPE="SUBMIT" NAME="S" VALUE="S"></FORM></head></html>');
+ $page = &$this->parse($response);
+ $this->assertIsA(
+ $page->getFormBySubmit(new SimpleByName('S')),
+ 'SimpleForm');
+ $this->assertIsA(
+ $page->getFormBySubmit(new SimpleByLabel('S')),
+ 'SimpleForm');
+ }
+
+ function testFindFormByImage() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><head><form>' .
+ '<input type="image" id=100 alt="Label" name="me">' .
+ '</form></head></html>');
+ $page = &$this->parse($response);
+ $this->assertIsA(
+ $page->getFormByImage(new SimpleByLabel('Label')),
+ 'SimpleForm');
+ $this->assertIsA(
+ $page->getFormByImage(new SimpleByName('me')),
+ 'SimpleForm');
+ $this->assertIsA(
+ $page->getFormByImage(new SimpleById(100)),
+ 'SimpleForm');
+ }
+
+ function testFindFormByButtonTag() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><head><form>' .
+ '<button type="submit" name="b" value="B">BBB</button>' .
+ '</form></head></html>');
+ $page = &$this->parse($response);
+ $this->assertNull($page->getFormBySubmit(new SimpleByLabel('b')));
+ $this->assertNull($page->getFormBySubmit(new SimpleByLabel('B')));
+ $this->assertIsA(
+ $page->getFormBySubmit(new SimpleByName('b')),
+ 'SimpleForm');
+ $this->assertIsA(
+ $page->getFormBySubmit(new SimpleByLabel('BBB')),
+ 'SimpleForm');
+ }
+
+ function testFindFormById() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue(
+ 'getContent',
+ '<html><head><form id="55"><input type="submit"></form></head></html>');
+ $page = &$this->parse($response);
+ $this->assertNull($page->getFormById(54));
+ $this->assertIsA($page->getFormById(55), 'SimpleForm');
+ }
+
+ function testReadingTextField() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><head><form>' .
+ '<input type="text" name="a">' .
+ '<input type="text" name="b" value="bbb" id=3>' .
+ '</form></head></html>');
+ $page = &$this->parse($response);
+ $this->assertNull($page->getField(new SimpleByName('missing')));
+ $this->assertIdentical($page->getField(new SimpleByName('a')), '');
+ $this->assertIdentical($page->getField(new SimpleByName('b')), 'bbb');
+ }
+
+ function testReadingTextFieldIsCaseInsensitive() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><head><FORM>' .
+ '<INPUT TYPE="TEXT" NAME="a">' .
+ '<INPUT TYPE="TEXT" NAME="b" VALUE="bbb" id=3>' .
+ '</FORM></head></html>');
+ $page = &$this->parse($response);
+ $this->assertNull($page->getField(new SimpleByName('missing')));
+ $this->assertIdentical($page->getField(new SimpleByName('a')), '');
+ $this->assertIdentical($page->getField(new SimpleByName('b')), 'bbb');
+ }
+
+ function testSettingTextField() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><head><form>' .
+ '<input type="text" name="a">' .
+ '<input type="text" name="b" id=3>' .
+ '<input type="submit">' .
+ '</form></head></html>');
+ $page = &$this->parse($response);
+ $this->assertTrue($page->setField(new SimpleByName('a'), 'aaa'));
+ $this->assertEqual($page->getField(new SimpleByName('a')), 'aaa');
+ $this->assertTrue($page->setField(new SimpleById(3), 'bbb'));
+ $this->assertEqual($page->getField(new SimpleBYId(3)), 'bbb');
+ $this->assertFalse($page->setField(new SimpleByName('z'), 'zzz'));
+ $this->assertNull($page->getField(new SimpleByName('z')));
+ }
+
+ function testSettingTextFieldByEnclosingLabel() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><head><form>' .
+ '<label>Stuff' .
+ '<input type="text" name="a" value="A">' .
+ '</label>' .
+ '</form></head></html>');
+ $page = &$this->parse($response);
+ $this->assertEqual($page->getField(new SimpleByName('a')), 'A');
+ $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A');
+ $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'aaa'));
+ $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'aaa');
+ }
+
+ function testGettingTextFieldByEnclosingLabelWithConflictingOtherFields() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><head><form>' .
+ '<label>Stuff' .
+ '<input type="text" name="a" value="A">' .
+ '</label>' .
+ '<input type="text" name="b" value="B">' .
+ '</form></head></html>');
+ $page = &$this->parse($response);
+ $this->assertEqual($page->getField(new SimpleByName('a')), 'A');
+ $this->assertEqual($page->getField(new SimpleByName('b')), 'B');
+ $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A');
+ }
+
+ function testSettingTextFieldByExternalLabel() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><head><form>' .
+ '<label for="aaa">Stuff</label>' .
+ '<input id="aaa" type="text" name="a" value="A">' .
+ '</form></head></html>');
+ $page = &$this->parse($response);
+ $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A');
+ $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'aaa'));
+ $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'aaa');
+ }
+
+ function testReadingTextArea() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><head><form>' .
+ '<textarea name="a">aaa</textarea>' .
+ '<input type="submit">' .
+ '</form></head></html>');
+ $page = &$this->parse($response);
+ $this->assertEqual($page->getField(new SimpleByName('a')), 'aaa');
+ }
+
+ function testSettingTextArea() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><head><form>' .
+ '<textarea name="a">aaa</textarea>' .
+ '<input type="submit">' .
+ '</form></head></html>');
+ $page = &$this->parse($response);
+ $this->assertTrue($page->setField(new SimpleByName('a'), 'AAA'));
+ $this->assertEqual($page->getField(new SimpleByName('a')), 'AAA');
+ }
+
+ function testSettingSelectionField() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><head><form>' .
+ '<select name="a">' .
+ '<option>aaa</option>' .
+ '<option selected>bbb</option>' .
+ '</select>' .
+ '<input type="submit">' .
+ '</form></head></html>');
+ $page = &$this->parse($response);
+ $this->assertEqual($page->getField(new SimpleByName('a')), 'bbb');
+ $this->assertFalse($page->setField(new SimpleByName('a'), 'ccc'));
+ $this->assertTrue($page->setField(new SimpleByName('a'), 'aaa'));
+ $this->assertEqual($page->getField(new SimpleByName('a')), 'aaa');
+ }
+
+ function testSettingSelectionFieldByEnclosingLabel() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><head><form>' .
+ '<label>Stuff' .
+ '<select name="a"><option selected>A</option><option>B</option></select>' .
+ '</label>' .
+ '</form></head></html>');
+ $page = &$this->parse($response);
+ $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A');
+ $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'B'));
+ $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'B');
+ }
+
+ function testSettingRadioButtonByEnclosingLabel() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent',
+ '<html><head><form>' .
+ '<label>A<input type="radio" name="r" value="a" checked></label>' .
+ '<label>B<input type="radio" name="r" value="b"></label>' .
+ '</form></head></html>');
+ $page = &$this->parse($response);
+ $this->assertEqual($page->getField(new SimpleByLabel('A')), 'a');
+ $this->assertTrue($page->setField(new SimpleBylabel('B'), 'b'));
+ $this->assertEqual($page->getField(new SimpleByLabel('B')), 'b');
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/parse_error_test.php b/tests/simpletest/test/parse_error_test.php
new file mode 100755
index 0000000000..372693498c
--- /dev/null
+++ b/tests/simpletest/test/parse_error_test.php
@@ -0,0 +1,9 @@
+<?php
+// $Id: parse_error_test.php,v 1.4 2007/05/08 22:08:06 lastcraft Exp $
+require_once('../unit_tester.php');
+require_once('../reporter.php');
+
+$test = &new TestSuite('This should fail');
+$test->addFile('test_with_parse_error.php');
+$test->run(new HtmlReporter());
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/parser_test.php b/tests/simpletest/test/parser_test.php
new file mode 100755
index 0000000000..7475fc33cf
--- /dev/null
+++ b/tests/simpletest/test/parser_test.php
@@ -0,0 +1,520 @@
+<?php
+// $Id: parser_test.php,v 1.59 2007/04/30 23:39:59 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../parser.php');
+Mock::generate('SimpleHtmlSaxParser');
+Mock::generate('SimpleSaxListener');
+
+class TestOfParallelRegex extends UnitTestCase {
+
+ function testNoPatterns() {
+ $regex = &new ParallelRegex(false);
+ $this->assertFalse($regex->match("Hello", $match));
+ $this->assertEqual($match, "");
+ }
+
+ function testNoSubject() {
+ $regex = &new ParallelRegex(false);
+ $regex->addPattern(".*");
+ $this->assertTrue($regex->match("", $match));
+ $this->assertEqual($match, "");
+ }
+
+ function testMatchAll() {
+ $regex = &new ParallelRegex(false);
+ $regex->addPattern(".*");
+ $this->assertTrue($regex->match("Hello", $match));
+ $this->assertEqual($match, "Hello");
+ }
+
+ function testCaseSensitive() {
+ $regex = &new ParallelRegex(true);
+ $regex->addPattern("abc");
+ $this->assertTrue($regex->match("abcdef", $match));
+ $this->assertEqual($match, "abc");
+ $this->assertTrue($regex->match("AAABCabcdef", $match));
+ $this->assertEqual($match, "abc");
+ }
+
+ function testCaseInsensitive() {
+ $regex = &new ParallelRegex(false);
+ $regex->addPattern("abc");
+ $this->assertTrue($regex->match("abcdef", $match));
+ $this->assertEqual($match, "abc");
+ $this->assertTrue($regex->match("AAABCabcdef", $match));
+ $this->assertEqual($match, "ABC");
+ }
+
+ function testMatchMultiple() {
+ $regex = &new ParallelRegex(true);
+ $regex->addPattern("abc");
+ $regex->addPattern("ABC");
+ $this->assertTrue($regex->match("abcdef", $match));
+ $this->assertEqual($match, "abc");
+ $this->assertTrue($regex->match("AAABCabcdef", $match));
+ $this->assertEqual($match, "ABC");
+ $this->assertFalse($regex->match("Hello", $match));
+ }
+
+ function testPatternLabels() {
+ $regex = &new ParallelRegex(false);
+ $regex->addPattern("abc", "letter");
+ $regex->addPattern("123", "number");
+ $this->assertIdentical($regex->match("abcdef", $match), "letter");
+ $this->assertEqual($match, "abc");
+ $this->assertIdentical($regex->match("0123456789", $match), "number");
+ $this->assertEqual($match, "123");
+ }
+}
+
+class TestOfStateStack extends UnitTestCase {
+
+ function testStartState() {
+ $stack = &new SimpleStateStack("one");
+ $this->assertEqual($stack->getCurrent(), "one");
+ }
+
+ function testExhaustion() {
+ $stack = &new SimpleStateStack("one");
+ $this->assertFalse($stack->leave());
+ }
+
+ function testStateMoves() {
+ $stack = &new SimpleStateStack("one");
+ $stack->enter("two");
+ $this->assertEqual($stack->getCurrent(), "two");
+ $stack->enter("three");
+ $this->assertEqual($stack->getCurrent(), "three");
+ $this->assertTrue($stack->leave());
+ $this->assertEqual($stack->getCurrent(), "two");
+ $stack->enter("third");
+ $this->assertEqual($stack->getCurrent(), "third");
+ $this->assertTrue($stack->leave());
+ $this->assertTrue($stack->leave());
+ $this->assertEqual($stack->getCurrent(), "one");
+ }
+}
+
+class TestParser {
+
+ function accept() {
+ }
+
+ function a() {
+ }
+
+ function b() {
+ }
+}
+Mock::generate('TestParser');
+
+class TestOfLexer extends UnitTestCase {
+
+ function testEmptyPage() {
+ $handler = &new MockTestParser();
+ $handler->expectNever("accept");
+ $handler->setReturnValue("accept", true);
+ $handler->expectNever("accept");
+ $handler->setReturnValue("accept", true);
+ $lexer = &new SimpleLexer($handler);
+ $lexer->addPattern("a+");
+ $this->assertTrue($lexer->parse(""));
+ }
+
+ function testSinglePattern() {
+ $handler = &new MockTestParser();
+ $handler->expectArgumentsAt(0, "accept", array("aaa", LEXER_MATCHED));
+ $handler->expectArgumentsAt(1, "accept", array("x", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(2, "accept", array("a", LEXER_MATCHED));
+ $handler->expectArgumentsAt(3, "accept", array("yyy", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(4, "accept", array("a", LEXER_MATCHED));
+ $handler->expectArgumentsAt(5, "accept", array("x", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(6, "accept", array("aaa", LEXER_MATCHED));
+ $handler->expectArgumentsAt(7, "accept", array("z", LEXER_UNMATCHED));
+ $handler->expectCallCount("accept", 8);
+ $handler->setReturnValue("accept", true);
+ $lexer = &new SimpleLexer($handler);
+ $lexer->addPattern("a+");
+ $this->assertTrue($lexer->parse("aaaxayyyaxaaaz"));
+ }
+
+ function testMultiplePattern() {
+ $handler = &new MockTestParser();
+ $target = array("a", "b", "a", "bb", "x", "b", "a", "xxxxxx", "a", "x");
+ for ($i = 0; $i < count($target); $i++) {
+ $handler->expectArgumentsAt($i, "accept", array($target[$i], '*'));
+ }
+ $handler->expectCallCount("accept", count($target));
+ $handler->setReturnValue("accept", true);
+ $lexer = &new SimpleLexer($handler);
+ $lexer->addPattern("a+");
+ $lexer->addPattern("b+");
+ $this->assertTrue($lexer->parse("ababbxbaxxxxxxax"));
+ }
+}
+
+class TestOfLexerModes extends UnitTestCase {
+
+ function testIsolatedPattern() {
+ $handler = &new MockTestParser();
+ $handler->expectArgumentsAt(0, "a", array("a", LEXER_MATCHED));
+ $handler->expectArgumentsAt(1, "a", array("b", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(2, "a", array("aa", LEXER_MATCHED));
+ $handler->expectArgumentsAt(3, "a", array("bxb", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(4, "a", array("aaa", LEXER_MATCHED));
+ $handler->expectArgumentsAt(5, "a", array("x", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(6, "a", array("aaaa", LEXER_MATCHED));
+ $handler->expectArgumentsAt(7, "a", array("x", LEXER_UNMATCHED));
+ $handler->expectCallCount("a", 8);
+ $handler->setReturnValue("a", true);
+ $lexer = &new SimpleLexer($handler, "a");
+ $lexer->addPattern("a+", "a");
+ $lexer->addPattern("b+", "b");
+ $this->assertTrue($lexer->parse("abaabxbaaaxaaaax"));
+ }
+
+ function testModeChange() {
+ $handler = &new MockTestParser();
+ $handler->expectArgumentsAt(0, "a", array("a", LEXER_MATCHED));
+ $handler->expectArgumentsAt(1, "a", array("b", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(2, "a", array("aa", LEXER_MATCHED));
+ $handler->expectArgumentsAt(3, "a", array("b", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(4, "a", array("aaa", LEXER_MATCHED));
+ $handler->expectArgumentsAt(0, "b", array(":", LEXER_ENTER));
+ $handler->expectArgumentsAt(1, "b", array("a", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(2, "b", array("b", LEXER_MATCHED));
+ $handler->expectArgumentsAt(3, "b", array("a", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(4, "b", array("bb", LEXER_MATCHED));
+ $handler->expectArgumentsAt(5, "b", array("a", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(6, "b", array("bbb", LEXER_MATCHED));
+ $handler->expectArgumentsAt(7, "b", array("a", LEXER_UNMATCHED));
+ $handler->expectCallCount("a", 5);
+ $handler->expectCallCount("b", 8);
+ $handler->setReturnValue("a", true);
+ $handler->setReturnValue("b", true);
+ $lexer = &new SimpleLexer($handler, "a");
+ $lexer->addPattern("a+", "a");
+ $lexer->addEntryPattern(":", "a", "b");
+ $lexer->addPattern("b+", "b");
+ $this->assertTrue($lexer->parse("abaabaaa:ababbabbba"));
+ }
+
+ function testNesting() {
+ $handler = &new MockTestParser();
+ $handler->setReturnValue("a", true);
+ $handler->setReturnValue("b", true);
+ $handler->expectArgumentsAt(0, "a", array("aa", LEXER_MATCHED));
+ $handler->expectArgumentsAt(1, "a", array("b", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(2, "a", array("aa", LEXER_MATCHED));
+ $handler->expectArgumentsAt(3, "a", array("b", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(0, "b", array("(", LEXER_ENTER));
+ $handler->expectArgumentsAt(1, "b", array("bb", LEXER_MATCHED));
+ $handler->expectArgumentsAt(2, "b", array("a", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(3, "b", array("bb", LEXER_MATCHED));
+ $handler->expectArgumentsAt(4, "b", array(")", LEXER_EXIT));
+ $handler->expectArgumentsAt(4, "a", array("aa", LEXER_MATCHED));
+ $handler->expectArgumentsAt(5, "a", array("b", LEXER_UNMATCHED));
+ $handler->expectCallCount("a", 6);
+ $handler->expectCallCount("b", 5);
+ $lexer = &new SimpleLexer($handler, "a");
+ $lexer->addPattern("a+", "a");
+ $lexer->addEntryPattern("(", "a", "b");
+ $lexer->addPattern("b+", "b");
+ $lexer->addExitPattern(")", "b");
+ $this->assertTrue($lexer->parse("aabaab(bbabb)aab"));
+ }
+
+ function testSingular() {
+ $handler = &new MockTestParser();
+ $handler->setReturnValue("a", true);
+ $handler->setReturnValue("b", true);
+ $handler->expectArgumentsAt(0, "a", array("aa", LEXER_MATCHED));
+ $handler->expectArgumentsAt(1, "a", array("aa", LEXER_MATCHED));
+ $handler->expectArgumentsAt(2, "a", array("xx", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(3, "a", array("xx", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(0, "b", array("b", LEXER_SPECIAL));
+ $handler->expectArgumentsAt(1, "b", array("bbb", LEXER_SPECIAL));
+ $handler->expectCallCount("a", 4);
+ $handler->expectCallCount("b", 2);
+ $lexer = &new SimpleLexer($handler, "a");
+ $lexer->addPattern("a+", "a");
+ $lexer->addSpecialPattern("b+", "a", "b");
+ $this->assertTrue($lexer->parse("aabaaxxbbbxx"));
+ }
+
+ function testUnwindTooFar() {
+ $handler = &new MockTestParser();
+ $handler->setReturnValue("a", true);
+ $handler->expectArgumentsAt(0, "a", array("aa", LEXER_MATCHED));
+ $handler->expectArgumentsAt(1, "a", array(")", LEXER_EXIT));
+ $handler->expectCallCount("a", 2);
+ $lexer = &new SimpleLexer($handler, "a");
+ $lexer->addPattern("a+", "a");
+ $lexer->addExitPattern(")", "a");
+ $this->assertFalse($lexer->parse("aa)aa"));
+ }
+}
+
+class TestOfLexerHandlers extends UnitTestCase {
+
+ function testModeMapping() {
+ $handler = &new MockTestParser();
+ $handler->setReturnValue("a", true);
+ $handler->expectArgumentsAt(0, "a", array("aa", LEXER_MATCHED));
+ $handler->expectArgumentsAt(1, "a", array("(", LEXER_ENTER));
+ $handler->expectArgumentsAt(2, "a", array("bb", LEXER_MATCHED));
+ $handler->expectArgumentsAt(3, "a", array("a", LEXER_UNMATCHED));
+ $handler->expectArgumentsAt(4, "a", array("bb", LEXER_MATCHED));
+ $handler->expectArgumentsAt(5, "a", array(")", LEXER_EXIT));
+ $handler->expectArgumentsAt(6, "a", array("b", LEXER_UNMATCHED));
+ $handler->expectCallCount("a", 7);
+ $lexer = &new SimpleLexer($handler, "mode_a");
+ $lexer->addPattern("a+", "mode_a");
+ $lexer->addEntryPattern("(", "mode_a", "mode_b");
+ $lexer->addPattern("b+", "mode_b");
+ $lexer->addExitPattern(")", "mode_b");
+ $lexer->mapHandler("mode_a", "a");
+ $lexer->mapHandler("mode_b", "a");
+ $this->assertTrue($lexer->parse("aa(bbabb)b"));
+ }
+}
+
+class TestOfSimpleHtmlLexer extends UnitTestCase {
+
+ function &createParser() {
+ $parser = &new MockSimpleHtmlSaxParser();
+ $parser->setReturnValue('acceptStartToken', true);
+ $parser->setReturnValue('acceptEndToken', true);
+ $parser->setReturnValue('acceptAttributeToken', true);
+ $parser->setReturnValue('acceptEntityToken', true);
+ $parser->setReturnValue('acceptTextToken', true);
+ $parser->setReturnValue('ignore', true);
+ return $parser;
+ }
+
+ function testNoContent() {
+ $parser = &$this->createParser();
+ $parser->expectNever('acceptStartToken');
+ $parser->expectNever('acceptEndToken');
+ $parser->expectNever('acceptAttributeToken');
+ $parser->expectNever('acceptEntityToken');
+ $parser->expectNever('acceptTextToken');
+ $lexer = &new SimpleHtmlLexer($parser);
+ $this->assertTrue($lexer->parse(''));
+ }
+
+ function testUninteresting() {
+ $parser = &$this->createParser();
+ $parser->expectOnce('acceptTextToken', array('<html></html>', '*'));
+ $lexer = &new SimpleHtmlLexer($parser);
+ $this->assertTrue($lexer->parse('<html></html>'));
+ }
+
+ function testSkipCss() {
+ $parser = &$this->createParser();
+ $parser->expectNever('acceptTextToken');
+ $parser->expectAtLeastOnce('ignore');
+ $lexer = &new SimpleHtmlLexer($parser);
+ $this->assertTrue($lexer->parse("<style>Lot's of styles</style>"));
+ }
+
+ function testSkipJavaScript() {
+ $parser = &$this->createParser();
+ $parser->expectNever('acceptTextToken');
+ $parser->expectAtLeastOnce('ignore');
+ $lexer = &new SimpleHtmlLexer($parser);
+ $this->assertTrue($lexer->parse("<SCRIPT>Javascript code {';:^%^%£$'@\"*(}</SCRIPT>"));
+ }
+
+ function testSkipHtmlComments() {
+ $parser = &$this->createParser();
+ $parser->expectNever('acceptTextToken');
+ $parser->expectAtLeastOnce('ignore');
+ $lexer = &new SimpleHtmlLexer($parser);
+ $this->assertTrue($lexer->parse("<!-- <title>title</title><style>styles</style> -->"));
+ }
+
+ function testTagWithNoAttributes() {
+ $parser = &$this->createParser();
+ $parser->expectAt(0, 'acceptStartToken', array('<title', '*'));
+ $parser->expectAt(1, 'acceptStartToken', array('>', '*'));
+ $parser->expectCallCount('acceptStartToken', 2);
+ $parser->expectOnce('acceptTextToken', array('Hello', '*'));
+ $parser->expectOnce('acceptEndToken', array('</title>', '*'));
+ $lexer = &new SimpleHtmlLexer($parser);
+ $this->assertTrue($lexer->parse('<title>Hello</title>'));
+ }
+
+ function testTagWithAttributes() {
+ $parser = &$this->createParser();
+ $parser->expectOnce('acceptTextToken', array('label', '*'));
+ $parser->expectAt(0, 'acceptStartToken', array('<a', '*'));
+ $parser->expectAt(1, 'acceptStartToken', array('href', '*'));
+ $parser->expectAt(2, 'acceptStartToken', array('>', '*'));
+ $parser->expectCallCount('acceptStartToken', 3);
+ $parser->expectAt(0, 'acceptAttributeToken', array('= "', '*'));
+ $parser->expectAt(1, 'acceptAttributeToken', array('here.html', '*'));
+ $parser->expectAt(2, 'acceptAttributeToken', array('"', '*'));
+ $parser->expectCallCount('acceptAttributeToken', 3);
+ $parser->expectOnce('acceptEndToken', array('</a>', '*'));
+ $lexer = &new SimpleHtmlLexer($parser);
+ $this->assertTrue($lexer->parse('<a href = "here.html">label</a>'));
+ }
+}
+
+class TestOfHtmlSaxParser extends UnitTestCase {
+
+ function &createListener() {
+ $listener = &new MockSimpleSaxListener();
+ $listener->setReturnValue('startElement', true);
+ $listener->setReturnValue('addContent', true);
+ $listener->setReturnValue('endElement', true);
+ return $listener;
+ }
+
+ function testFramesetTag() {
+ $listener = &$this->createListener();
+ $listener->expectOnce('startElement', array('frameset', array()));
+ $listener->expectOnce('addContent', array('Frames'));
+ $listener->expectOnce('endElement', array('frameset'));
+ $parser = &new SimpleHtmlSaxParser($listener);
+ $this->assertTrue($parser->parse('<frameset>Frames</frameset>'));
+ }
+
+ function testTagWithUnquotedAttributes() {
+ $listener = &$this->createListener();
+ $listener->expectOnce(
+ 'startElement',
+ array('input', array('name' => 'a.b.c', 'value' => 'd')));
+ $parser = &new SimpleHtmlSaxParser($listener);
+ $this->assertTrue($parser->parse('<input name=a.b.c value = d>'));
+ }
+
+ function testTagInsideContent() {
+ $listener = &$this->createListener();
+ $listener->expectOnce('startElement', array('a', array()));
+ $listener->expectAt(0, 'addContent', array('<html>'));
+ $listener->expectAt(1, 'addContent', array('</html>'));
+ $parser = &new SimpleHtmlSaxParser($listener);
+ $this->assertTrue($parser->parse('<html><a></a></html>'));
+ }
+
+ function testTagWithInternalContent() {
+ $listener = &$this->createListener();
+ $listener->expectOnce('startElement', array('a', array()));
+ $listener->expectOnce('addContent', array('label'));
+ $listener->expectOnce('endElement', array('a'));
+ $parser = &new SimpleHtmlSaxParser($listener);
+ $this->assertTrue($parser->parse('<a>label</a>'));
+ }
+
+ function testLinkAddress() {
+ $listener = &$this->createListener();
+ $listener->expectOnce('startElement', array('a', array('href' => 'here.html')));
+ $listener->expectOnce('addContent', array('label'));
+ $listener->expectOnce('endElement', array('a'));
+ $parser = &new SimpleHtmlSaxParser($listener);
+ $this->assertTrue($parser->parse("<a href = 'here.html'>label</a>"));
+ }
+
+ function testEncodedAttribute() {
+ $listener = &$this->createListener();
+ $listener->expectOnce('startElement', array('a', array('href' => 'here&there.html')));
+ $listener->expectOnce('addContent', array('label'));
+ $listener->expectOnce('endElement', array('a'));
+ $parser = &new SimpleHtmlSaxParser($listener);
+ $this->assertTrue($parser->parse("<a href = 'here&amp;there.html'>label</a>"));
+ }
+
+ function testTagWithId() {
+ $listener = &$this->createListener();
+ $listener->expectOnce('startElement', array('a', array('id' => '0')));
+ $listener->expectOnce('addContent', array('label'));
+ $listener->expectOnce('endElement', array('a'));
+ $parser = &new SimpleHtmlSaxParser($listener);
+ $this->assertTrue($parser->parse('<a id="0">label</a>'));
+ }
+
+ function testTagWithEmptyAttributes() {
+ $listener = &$this->createListener();
+ $listener->expectOnce(
+ 'startElement',
+ array('option', array('value' => '', 'selected' => '')));
+ $listener->expectOnce('addContent', array('label'));
+ $listener->expectOnce('endElement', array('option'));
+ $parser = &new SimpleHtmlSaxParser($listener);
+ $this->assertTrue($parser->parse('<option value="" selected>label</option>'));
+ }
+
+ function testComplexTagWithLotsOfCaseVariations() {
+ $listener = &$this->createListener();
+ $listener->expectOnce(
+ 'startElement',
+ array('a', array('href' => 'here.html', 'style' => "'cool'")));
+ $listener->expectOnce('addContent', array('label'));
+ $listener->expectOnce('endElement', array('a'));
+ $parser = &new SimpleHtmlSaxParser($listener);
+ $this->assertTrue($parser->parse('<A HREF = \'here.html\' Style="\'cool\'">label</A>'));
+ }
+
+ function testXhtmlSelfClosingTag() {
+ $listener = &$this->createListener();
+ $listener->expectOnce(
+ 'startElement',
+ array('input', array('type' => 'submit', 'name' => 'N', 'value' => 'V')));
+ $parser = &new SimpleHtmlSaxParser($listener);
+ $this->assertTrue($parser->parse('<input type="submit" name="N" value="V" />'));
+ }
+
+ function testNestedFrameInFrameset() {
+ $listener = &$this->createListener();
+ $listener->expectAt(0, 'startElement', array('frameset', array()));
+ $listener->expectAt(1, 'startElement', array('frame', array('src' => 'frame.html')));
+ $listener->expectCallCount('startElement', 2);
+ $listener->expectOnce('addContent', array('<noframes>Hello</noframes>'));
+ $listener->expectOnce('endElement', array('frameset'));
+ $parser = &new SimpleHtmlSaxParser($listener);
+ $this->assertTrue($parser->parse(
+ '<frameset><frame src="frame.html"><noframes>Hello</noframes></frameset>'));
+ }
+}
+
+class TestOfTextExtraction extends UnitTestCase {
+
+ function testSpaceNormalisation() {
+ $this->assertEqual(
+ SimpleHtmlSaxParser::normalise("\nOne\tTwo \nThree\t"),
+ 'One Two Three');
+ }
+
+ function testTagSuppression() {
+ $this->assertEqual(
+ SimpleHtmlSaxParser::normalise('<b>Hello</b>'),
+ 'Hello');
+ }
+
+ function testAdjoiningTagSuppression() {
+ $this->assertEqual(
+ SimpleHtmlSaxParser::normalise('<b>Hello</b><em>Goodbye</em>'),
+ 'HelloGoodbye');
+ }
+
+ function testExtractImageAltTextWithDifferentQuotes() {
+ $this->assertEqual(
+ SimpleHtmlSaxParser::normalise('<img alt="One"><img alt=\'Two\'><img alt=Three>'),
+ 'One Two Three');
+ }
+
+ function testExtractImageAltTextMultipleTimes() {
+ $this->assertEqual(
+ SimpleHtmlSaxParser::normalise('<img alt="One"><img alt="Two"><img alt="Three">'),
+ 'One Two Three');
+ }
+
+ function testHtmlEntityTranslation() {
+ $this->assertEqual(
+ SimpleHtmlSaxParser::normalise('&lt;&gt;&quot;&amp;'),
+ '<>"&');
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/reflection_php4_test.php b/tests/simpletest/test/reflection_php4_test.php
new file mode 100755
index 0000000000..4ccc647f17
--- /dev/null
+++ b/tests/simpletest/test/reflection_php4_test.php
@@ -0,0 +1,61 @@
+<?php
+// $Id: reflection_php4_test.php,v 1.7 2007/04/30 23:39:59 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+
+class AnyOldThing {
+ function aMethod() {
+ }
+}
+
+class AnyOldChildThing extends AnyOldThing { }
+
+class TestOfReflection extends UnitTestCase {
+
+ function testClassExistence() {
+ $reflection = new SimpleReflection('AnyOldThing');
+ $this->assertTrue($reflection->classOrInterfaceExists());
+ $this->assertTrue($reflection->classOrInterfaceExistsSansAutoload());
+ }
+
+ function testClassNonExistence() {
+ $reflection = new SimpleReflection('UnknownThing');
+ $this->assertFalse($reflection->classOrInterfaceExists());
+ $this->assertFalse($reflection->classOrInterfaceExistsSansAutoload());
+ }
+
+ function testDetectionOfInterfacesAlwaysFalse() {
+ $reflection = new SimpleReflection('AnyOldThing');
+ $this->assertFalse($reflection->isAbstract());
+ $this->assertFalse($reflection->isInterface());
+ }
+
+ function testFindingParentClass() {
+ $reflection = new SimpleReflection('AnyOldChildThing');
+ $this->assertEqual(strtolower($reflection->getParent()), 'anyoldthing');
+ }
+
+ function testMethodsListFromClass() {
+ $reflection = new SimpleReflection('AnyOldThing');
+ $methods = $reflection->getMethods();
+ $this->assertEqualIgnoringCase($methods[0], 'aMethod');
+ }
+
+ function testNoInterfacesForPHP4() {
+ $reflection = new SimpleReflection('AnyOldThing');
+ $this->assertEqual(
+ $reflection->getInterfaces(),
+ array());
+ }
+
+ function testMostGeneralPossibleSignature() {
+ $reflection = new SimpleReflection('AnyOldThing');
+ $this->assertEqualIgnoringCase(
+ $reflection->getSignature('aMethod'),
+ 'function &aMethod()');
+ }
+
+ function assertEqualIgnoringCase($a, $b) {
+ return $this->assertEqual(strtolower($a), strtolower($b));
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/reflection_php5_test.php b/tests/simpletest/test/reflection_php5_test.php
new file mode 100755
index 0000000000..51fcc7e604
--- /dev/null
+++ b/tests/simpletest/test/reflection_php5_test.php
@@ -0,0 +1,271 @@
+<?php
+// $Id: reflection_php5_test.php,v 1.21 2007/06/10 02:27:59 tswicegood Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../reflection_php5.php');
+
+class AnyOldLeafClass {
+ function aMethod() { }
+}
+
+abstract class AnyOldClass {
+ function aMethod() { }
+}
+
+class AnyOldLeafClassWithAFinal {
+ final function aMethod() { }
+}
+
+interface AnyOldInterface {
+ function aMethod();
+}
+
+interface AnyOldArgumentInterface {
+ function aMethod(AnyOldInterface $argument);
+}
+
+interface AnyDescendentInterface extends AnyOldInterface {
+}
+
+class AnyOldImplementation implements AnyOldInterface {
+ function aMethod() { }
+ function extraMethod() { }
+}
+
+abstract class AnyAbstractImplementation implements AnyOldInterface {
+}
+
+abstract class AnotherOldAbstractClass {
+ protected abstract function aMethod(AnyOldInterface $argument);
+}
+
+class AnyOldSubclass extends AnyOldImplementation { }
+
+class AnyOldArgumentClass {
+ function aMethod($argument) { }
+}
+
+class AnyOldArgumentImplementation implements AnyOldArgumentInterface {
+ function aMethod(AnyOldInterface $argument) { }
+}
+
+class AnyOldTypeHintedClass implements AnyOldArgumentInterface {
+ function aMethod(AnyOldInterface $argument) { }
+}
+
+class AnyDescendentImplementation implements AnyDescendentInterface {
+ function aMethod() { }
+}
+
+class AnyOldOverloadedClass {
+ function __isset($key) { }
+ function __unset($key) { }
+}
+
+class AnyOldClassWithStaticMethods {
+ static function aStatic() { }
+ static function aStaticWithParameters($arg1, $arg2) { }
+}
+
+abstract class AnyOldAbstractClassWithAbstractMethods {
+ abstract function anAbstract();
+ abstract function anAbstractWithParameter($foo);
+ abstract function anAbstractWithMultipleParameters($foo, $bar);
+}
+
+class TestOfReflection extends UnitTestCase {
+
+ function testClassExistence() {
+ $reflection = new SimpleReflection('AnyOldLeafClass');
+ $this->assertTrue($reflection->classOrInterfaceExists());
+ $this->assertTrue($reflection->classOrInterfaceExistsSansAutoload());
+ $this->assertFalse($reflection->isAbstract());
+ $this->assertFalse($reflection->isInterface());
+ }
+
+ function testClassNonExistence() {
+ $reflection = new SimpleReflection('UnknownThing');
+ $this->assertFalse($reflection->classOrInterfaceExists());
+ $this->assertFalse($reflection->classOrInterfaceExistsSansAutoload());
+ }
+
+ function testDetectionOfAbstractClass() {
+ $reflection = new SimpleReflection('AnyOldClass');
+ $this->assertTrue($reflection->isAbstract());
+ }
+
+ function testDetectionOfFinalMethods() {
+ $reflection = new SimpleReflection('AnyOldClass');
+ $this->assertFalse($reflection->hasFinal());
+ $reflection = new SimpleReflection('AnyOldLeafClassWithAFinal');
+ $this->assertTrue($reflection->hasFinal());
+ }
+
+ function testFindingParentClass() {
+ $reflection = new SimpleReflection('AnyOldSubclass');
+ $this->assertEqual($reflection->getParent(), 'AnyOldImplementation');
+ }
+
+ function testInterfaceExistence() {
+ $reflection = new SimpleReflection('AnyOldInterface');
+ $this->assertTrue($reflection->classOrInterfaceExists());
+ $this->assertTrue($reflection->classOrInterfaceExistsSansAutoload());
+ $this->assertTrue($reflection->isInterface());
+ }
+
+ function testMethodsListFromClass() {
+ $reflection = new SimpleReflection('AnyOldClass');
+ $this->assertIdentical($reflection->getMethods(), array('aMethod'));
+ }
+
+ function testMethodsListFromInterface() {
+ $reflection = new SimpleReflection('AnyOldInterface');
+ $this->assertIdentical($reflection->getMethods(), array('aMethod'));
+ $this->assertIdentical($reflection->getInterfaceMethods(), array('aMethod'));
+ }
+
+ function testMethodsComeFromDescendentInterfacesASWell() {
+ $reflection = new SimpleReflection('AnyDescendentInterface');
+ $this->assertIdentical($reflection->getMethods(), array('aMethod'));
+ }
+
+ function testCanSeparateInterfaceMethodsFromOthers() {
+ $reflection = new SimpleReflection('AnyOldImplementation');
+ $this->assertIdentical($reflection->getMethods(), array('aMethod', 'extraMethod'));
+ $this->assertIdentical($reflection->getInterfaceMethods(), array('aMethod'));
+ }
+
+ function testMethodsComeFromDescendentInterfacesInAbstractClass() {
+ $reflection = new SimpleReflection('AnyAbstractImplementation');
+ $this->assertIdentical($reflection->getMethods(), array('aMethod'));
+ }
+
+ function testInterfaceHasOnlyItselfToImplement() {
+ $reflection = new SimpleReflection('AnyOldInterface');
+ $this->assertEqual(
+ $reflection->getInterfaces(),
+ array('AnyOldInterface'));
+ }
+
+ function testInterfacesListedForClass() {
+ $reflection = new SimpleReflection('AnyOldImplementation');
+ $this->assertEqual(
+ $reflection->getInterfaces(),
+ array('AnyOldInterface'));
+ }
+
+ function testInterfacesListedForSubclass() {
+ $reflection = new SimpleReflection('AnyOldSubclass');
+ $this->assertEqual(
+ $reflection->getInterfaces(),
+ array('AnyOldInterface'));
+ }
+
+ function testNoParameterCreationWhenNoInterface() {
+ $reflection = new SimpleReflection('AnyOldArgumentClass');
+ $function = $reflection->getSignature('aMethod');
+ if (version_compare(phpversion(), '5.0.2', '<=')) {
+ $this->assertEqual('function amethod()', strtolower($function));
+ } else {
+ $this->assertEqual('function aMethod()', $function);
+ }
+ }
+
+ function testParameterCreationWithoutTypeHinting() {
+ $reflection = new SimpleReflection('AnyOldArgumentImplementation');
+ $function = $reflection->getSignature('aMethod');
+ if (version_compare(phpversion(), '5.0.2', '<=')) {
+ $this->assertEqual('function amethod(AnyOldInterface $argument)', $function);
+ } else {
+ $this->assertEqual('function aMethod(AnyOldInterface $argument)', $function);
+ }
+ }
+
+ function testParameterCreationForTypeHinting() {
+ $reflection = new SimpleReflection('AnyOldTypeHintedClass');
+ $function = $reflection->getSignature('aMethod');
+ if (version_compare(phpversion(), '5.0.2', '<=')) {
+ $this->assertEqual('function amethod(AnyOldInterface $argument)', $function);
+ } else {
+ $this->assertEqual('function aMethod(AnyOldInterface $argument)', $function);
+ }
+ }
+
+ function testIssetFunctionSignature() {
+ $reflection = new SimpleReflection('AnyOldOverloadedClass');
+ $function = $reflection->getSignature('__isset');
+ if (version_compare(phpversion(), '5.1.0', '>=')) {
+ $this->assertEqual('function __isset($key)', $function);
+ } else {
+ $this->assertEqual('function __isset()', $function);
+ }
+ }
+
+ function testUnsetFunctionSignature() {
+ $reflection = new SimpleReflection('AnyOldOverloadedClass');
+ $function = $reflection->getSignature('__unset');
+ if (version_compare(phpversion(), '5.1.0', '>=')) {
+ $this->assertEqual('function __unset($key)', $function);
+ } else {
+ $this->assertEqual('function __unset()', $function);
+ }
+ }
+
+ function testProperlyReflectsTheFinalInterfaceWhenObjectImplementsAnExtendedInterface() {
+ $reflection = new SimpleReflection('AnyDescendentImplementation');
+ $interfaces = $reflection->getInterfaces();
+ $this->assertEqual(1, count($interfaces));
+ $this->assertEqual('AnyDescendentInterface', array_shift($interfaces));
+ }
+
+ function testCreatingSignatureForAbstractMethod() {
+ $reflection = new SimpleReflection('AnotherOldAbstractClass');
+ $this->assertEqual($reflection->getSignature('aMethod'), 'function aMethod(AnyOldInterface $argument)');
+ }
+
+ function testCanProperlyGenerateStaticMethodSignatures() {
+ $reflection = new SimpleReflection('AnyOldClassWithStaticMethods');
+ $this->assertEqual('static function aStatic()', $reflection->getSignature('aStatic'));
+ $this->assertEqual(
+ 'static function aStaticWithParameters($arg1, $arg2)',
+ $reflection->getSignature('aStaticWithParameters')
+ );
+ }
+}
+
+class TestOfReflectionWithTypeHints extends UnitTestCase {
+ function skip() {
+ $this->skipIf(version_compare(phpversion(), '5.1.0', '<'), 'Reflection with type hints only tested for PHP 5.1.0 and above');
+ }
+
+ function testParameterCreationForTypeHintingWithArray() {
+ eval('interface AnyOldArrayTypeHintedInterface {
+ function amethod(array $argument);
+ }
+ class AnyOldArrayTypeHintedClass implements AnyOldArrayTypeHintedInterface {
+ function amethod(array $argument) {}
+ }');
+ $reflection = new SimpleReflection('AnyOldArrayTypeHintedClass');
+ $function = $reflection->getSignature('amethod');
+ $this->assertEqual('function amethod(array $argument)', $function);
+ }
+}
+
+class TestOfAbstractsWithAbstractMethods extends UnitTestCase {
+ function testCanProperlyGenerateAbstractMethods() {
+ $reflection = new SimpleReflection('AnyOldAbstractClassWithAbstractMethods');
+ $this->assertEqual(
+ 'function anAbstract()',
+ $reflection->getSignature('anAbstract')
+ );
+ $this->assertEqual(
+ 'function anAbstractWithParameter($foo)',
+ $reflection->getSignature('anAbstractWithParameter')
+ );
+ $this->assertEqual(
+ 'function anAbstractWithMultipleParameters($foo, $bar)',
+ $reflection->getSignature('anAbstractWithMultipleParameters')
+ );
+ }
+}
+
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/remote_test.php b/tests/simpletest/test/remote_test.php
new file mode 100755
index 0000000000..92dda01be7
--- /dev/null
+++ b/tests/simpletest/test/remote_test.php
@@ -0,0 +1,20 @@
+<?php
+// $Id: remote_test.php,v 1.7 2007/04/30 23:39:59 lastcraft Exp $
+require_once('../remote.php');
+require_once('../reporter.php');
+
+// The following URL will depend on your own installation.
+if (isset($_SERVER['SCRIPT_URI'])) {
+ $base_uri = $_SERVER['SCRIPT_URI'];
+} elseif (isset($_SERVER['HTTP_HOST']) && isset($_SERVER['PHP_SELF'])) {
+ $base_uri = 'http://'. $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
+};
+$test_url = str_replace('remote_test.php', 'visual_test.php', $base_uri);
+
+$test = &new TestSuite('Remote tests');
+$test->addTestCase(new RemoteTestCase($test_url . '?xml=yes', $test_url . '?xml=yes&dry=yes'));
+if (SimpleReporter::inCli()) {
+ exit ($test->run(new TextReporter()) ? 0 : 1);
+}
+$test->run(new HtmlReporter());
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/shell_test.php b/tests/simpletest/test/shell_test.php
new file mode 100755
index 0000000000..9e6bf10894
--- /dev/null
+++ b/tests/simpletest/test/shell_test.php
@@ -0,0 +1,38 @@
+<?php
+// $Id: shell_test.php,v 1.11 2007/06/04 18:33:09 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../shell_tester.php');
+
+class TestOfShell extends UnitTestCase {
+
+ function testEcho() {
+ $shell = &new SimpleShell();
+ $this->assertIdentical($shell->execute('echo Hello'), 0);
+ $this->assertPattern('/Hello/', $shell->getOutput());
+ }
+
+ function testBadCommand() {
+ $shell = &new SimpleShell();
+ $this->assertNotEqual($ret = $shell->execute('blurgh! 2>&1'), 0);
+ }
+}
+
+class TestOfShellTesterAndShell extends ShellTestCase {
+
+ function testEcho() {
+ $this->assertTrue($this->execute('echo Hello'));
+ $this->assertExitCode(0);
+ $this->assertoutput('Hello');
+ }
+
+ function testFileExistence() {
+ $this->assertFileExists(dirname(__FILE__) . '/all_tests.php');
+ $this->assertFileNotExists('wibble');
+ }
+
+ function testFilePatterns() {
+ $this->assertFilePattern('/all[_ ]tests/i', dirname(__FILE__) . '/all_tests.php');
+ $this->assertNoFilePattern('/sputnik/i', dirname(__FILE__) . '/all_tests.php');
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/shell_tester_test.php b/tests/simpletest/test/shell_tester_test.php
new file mode 100755
index 0000000000..db90e7ff7f
--- /dev/null
+++ b/tests/simpletest/test/shell_tester_test.php
@@ -0,0 +1,42 @@
+<?php
+// $Id: shell_tester_test.php,v 1.9 2007/04/30 23:39:59 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../shell_tester.php');
+Mock::generate('SimpleShell');
+
+class TestOfShellTestCase extends ShellTestCase {
+ var $_mock_shell = false;
+
+ function &_getShell() {
+ return $this->_mock_shell;
+ }
+
+ function testGenericEquality() {
+ $this->assertEqual('a', 'a');
+ $this->assertNotEqual('a', 'A');
+ }
+
+ function testExitCode() {
+ $this->_mock_shell = &new MockSimpleShell();
+ $this->_mock_shell->setReturnValue('execute', 0);
+ $this->_mock_shell->expectOnce('execute', array('ls'));
+ $this->assertTrue($this->execute('ls'));
+ $this->assertExitCode(0);
+ }
+
+ function testOutput() {
+ $this->_mock_shell = &new MockSimpleShell();
+ $this->_mock_shell->setReturnValue('execute', 0);
+ $this->_mock_shell->setReturnValue('getOutput', "Line 1\nLine 2\n");
+ $this->assertOutput("Line 1\nLine 2\n");
+ }
+
+ function testOutputPatterns() {
+ $this->_mock_shell = &new MockSimpleShell();
+ $this->_mock_shell->setReturnValue('execute', 0);
+ $this->_mock_shell->setReturnValue('getOutput', "Line 1\nLine 2\n");
+ $this->assertOutputPattern('/line/i');
+ $this->assertNoOutputPattern('/line 2/');
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/simpletest_test.php b/tests/simpletest/test/simpletest_test.php
new file mode 100755
index 0000000000..6375eef329
--- /dev/null
+++ b/tests/simpletest/test/simpletest_test.php
@@ -0,0 +1,58 @@
+<?php
+// $Id: simpletest_test.php,v 1.9 2007/04/30 23:39:59 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../simpletest.php');
+
+SimpleTest::ignore('ShouldNeverBeRunEither');
+
+class ShouldNeverBeRun extends UnitTestCase {
+ function testWithNoChanceOfSuccess() {
+ $this->fail('Should be ignored');
+ }
+}
+
+class ShouldNeverBeRunEither extends ShouldNeverBeRun { }
+
+class TestOfStackTrace extends UnitTestCase {
+
+ function testCanFindAssertInTrace() {
+ $trace = new SimpleStackTrace(array('assert'));
+ $this->assertEqual(
+ $trace->traceMethod(array(array(
+ 'file' => '/my_test.php',
+ 'line' => 24,
+ 'function' => 'assertSomething'))),
+ ' at [/my_test.php line 24]');
+ }
+}
+
+class DummyResource { }
+
+class TestOfContext extends UnitTestCase {
+
+ function testCurrentContextIsUnique() {
+ $this->assertReference(
+ SimpleTest::getContext(),
+ SimpleTest::getContext());
+ }
+
+ function testContextHoldsCurrentTestCase() {
+ $context = &SimpleTest::getContext();
+ $this->assertReference($this, $context->getTest());
+ }
+
+ function testResourceIsSingleInstanceWithContext() {
+ $context = &new SimpleTestContext();
+ $this->assertReference(
+ $context->get('DummyResource'),
+ $context->get('DummyResource'));
+ }
+
+ function testClearingContextResetsResources() {
+ $context = &new SimpleTestContext();
+ $resource = &$context->get('DummyResource');
+ $context->clear();
+ $this->assertClone($resource, $context->get('DummyResource'));
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/socket_test.php b/tests/simpletest/test/socket_test.php
new file mode 100755
index 0000000000..497ebe67d7
--- /dev/null
+++ b/tests/simpletest/test/socket_test.php
@@ -0,0 +1,25 @@
+<?php
+// $Id: socket_test.php,v 1.17 2007/05/08 22:08:06 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../socket.php');
+Mock::generate('SimpleSocket');
+
+class TestOfSimpleStickyError extends UnitTestCase {
+
+ function testSettingError() {
+ $error = new SimpleStickyError();
+ $this->assertFalse($error->isError());
+ $error->_setError('Ouch');
+ $this->assertTrue($error->isError());
+ $this->assertEqual($error->getError(), 'Ouch');
+ }
+
+ function testClearingError() {
+ $error = new SimpleStickyError();
+ $error->_setError('Ouch');
+ $this->assertTrue($error->isError());
+ $error->_clearError();
+ $this->assertFalse($error->isError());
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/support/collector/collectable.1 b/tests/simpletest/test/support/collector/collectable.1
new file mode 100755
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/simpletest/test/support/collector/collectable.1
diff --git a/tests/simpletest/test/support/collector/collectable.2 b/tests/simpletest/test/support/collector/collectable.2
new file mode 100755
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/simpletest/test/support/collector/collectable.2
diff --git a/tests/simpletest/test/support/empty_test_file.php b/tests/simpletest/test/support/empty_test_file.php
new file mode 100755
index 0000000000..31e3f7bed6
--- /dev/null
+++ b/tests/simpletest/test/support/empty_test_file.php
@@ -0,0 +1,3 @@
+<?php
+require_once(dirname(__FILE__) . '/../../autorun.php');
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/support/latin1_sample b/tests/simpletest/test/support/latin1_sample
new file mode 100755
index 0000000000..1903525776
--- /dev/null
+++ b/tests/simpletest/test/support/latin1_sample
@@ -0,0 +1 @@
+£¹²³¼½¾@¶øþðßæ«»¢µ \ No newline at end of file
diff --git a/tests/simpletest/test/support/spl_examples.php b/tests/simpletest/test/support/spl_examples.php
new file mode 100755
index 0000000000..091892c25a
--- /dev/null
+++ b/tests/simpletest/test/support/spl_examples.php
@@ -0,0 +1,15 @@
+<?php
+ // $Id: spl_examples.php,v 1.1 2006/02/05 19:35:31 lastcraft Exp $
+
+ class IteratorImplementation implements Iterator {
+ function current() { }
+ function next() { }
+ function key() { }
+ function valid() { }
+ function rewind() { }
+ }
+
+ class IteratorAggregateImplementation implements IteratorAggregate {
+ function getIterator() { }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/support/supplementary_upload_sample.txt b/tests/simpletest/test/support/supplementary_upload_sample.txt
new file mode 100755
index 0000000000..d8aa9e8101
--- /dev/null
+++ b/tests/simpletest/test/support/supplementary_upload_sample.txt
@@ -0,0 +1 @@
+Some more text content \ No newline at end of file
diff --git a/tests/simpletest/test/support/upload_sample.txt b/tests/simpletest/test/support/upload_sample.txt
new file mode 100755
index 0000000000..ec98d7c5e3
--- /dev/null
+++ b/tests/simpletest/test/support/upload_sample.txt
@@ -0,0 +1 @@
+Sample for testing file upload \ No newline at end of file
diff --git a/tests/simpletest/test/tag_test.php b/tests/simpletest/test/tag_test.php
new file mode 100755
index 0000000000..f17782055e
--- /dev/null
+++ b/tests/simpletest/test/tag_test.php
@@ -0,0 +1,554 @@
+<?php
+// $Id: tag_test.php,v 1.69 2007/05/08 22:08:06 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../tag.php');
+require_once(dirname(__FILE__) . '/../encoding.php');
+Mock::generate('SimpleMultipartEncoding');
+
+class TestOfTag extends UnitTestCase {
+
+ function testStartValuesWithoutAdditionalContent() {
+ $tag = new SimpleTitleTag(array('a' => '1', 'b' => ''));
+ $this->assertEqual($tag->getTagName(), 'title');
+ $this->assertIdentical($tag->getAttribute('a'), '1');
+ $this->assertIdentical($tag->getAttribute('b'), '');
+ $this->assertIdentical($tag->getAttribute('c'), false);
+ $this->assertIdentical($tag->getContent(), '');
+ }
+
+ function testTitleContent() {
+ $tag = &new SimpleTitleTag(array());
+ $this->assertTrue($tag->expectEndTag());
+ $tag->addContent('Hello');
+ $tag->addContent('World');
+ $this->assertEqual($tag->getText(), 'HelloWorld');
+ }
+
+ function testMessyTitleContent() {
+ $tag = &new SimpleTitleTag(array());
+ $this->assertTrue($tag->expectEndTag());
+ $tag->addContent('<b>Hello</b>');
+ $tag->addContent('<em>World</em>');
+ $this->assertEqual($tag->getText(), 'HelloWorld');
+ }
+
+ function testTagWithNoEnd() {
+ $tag = &new SimpleTextTag(array());
+ $this->assertFalse($tag->expectEndTag());
+ }
+
+ function testAnchorHref() {
+ $tag = &new SimpleAnchorTag(array('href' => 'http://here/'));
+ $this->assertEqual($tag->getHref(), 'http://here/');
+
+ $tag = &new SimpleAnchorTag(array('href' => ''));
+ $this->assertIdentical($tag->getAttribute('href'), '');
+ $this->assertIdentical($tag->getHref(), '');
+
+ $tag = &new SimpleAnchorTag(array());
+ $this->assertIdentical($tag->getAttribute('href'), false);
+ $this->assertIdentical($tag->getHref(), '');
+ }
+
+ function testIsIdMatchesIdAttribute() {
+ $tag = &new SimpleAnchorTag(array('href' => 'http://here/', 'id' => 7));
+ $this->assertIdentical($tag->getAttribute('id'), '7');
+ $this->assertTrue($tag->isId(7));
+ }
+}
+
+class TestOfWidget extends UnitTestCase {
+
+ function testTextEmptyDefault() {
+ $tag = &new SimpleTextTag(array('type' => 'text'));
+ $this->assertIdentical($tag->getDefault(), '');
+ $this->assertIdentical($tag->getValue(), '');
+ }
+
+ function testSettingOfExternalLabel() {
+ $tag = &new SimpleTextTag(array('type' => 'text'));
+ $tag->setLabel('it');
+ $this->assertTrue($tag->isLabel('it'));
+ }
+
+ function testTextDefault() {
+ $tag = &new SimpleTextTag(array('value' => 'aaa'));
+ $this->assertEqual($tag->getDefault(), 'aaa');
+ $this->assertEqual($tag->getValue(), 'aaa');
+ }
+
+ function testSettingTextValue() {
+ $tag = &new SimpleTextTag(array('value' => 'aaa'));
+ $tag->setValue('bbb');
+ $this->assertEqual($tag->getValue(), 'bbb');
+ $tag->resetValue();
+ $this->assertEqual($tag->getValue(), 'aaa');
+ }
+
+ function testFailToSetHiddenValue() {
+ $tag = &new SimpleTextTag(array('value' => 'aaa', 'type' => 'hidden'));
+ $this->assertFalse($tag->setValue('bbb'));
+ $this->assertEqual($tag->getValue(), 'aaa');
+ }
+
+ function testSubmitDefaults() {
+ $tag = &new SimpleSubmitTag(array('type' => 'submit'));
+ $this->assertIdentical($tag->getName(), false);
+ $this->assertEqual($tag->getValue(), 'Submit');
+ $this->assertFalse($tag->setValue('Cannot set this'));
+ $this->assertEqual($tag->getValue(), 'Submit');
+ $this->assertEqual($tag->getLabel(), 'Submit');
+
+ $encoding = &new MockSimpleMultipartEncoding();
+ $encoding->expectNever('add');
+ $tag->write($encoding);
+ }
+
+ function testPopulatedSubmit() {
+ $tag = &new SimpleSubmitTag(
+ array('type' => 'submit', 'name' => 's', 'value' => 'Ok!'));
+ $this->assertEqual($tag->getName(), 's');
+ $this->assertEqual($tag->getValue(), 'Ok!');
+ $this->assertEqual($tag->getLabel(), 'Ok!');
+
+ $encoding = &new MockSimpleMultipartEncoding();
+ $encoding->expectOnce('add', array('s', 'Ok!'));
+ $tag->write($encoding);
+ }
+
+ function testImageSubmit() {
+ $tag = &new SimpleImageSubmitTag(
+ array('type' => 'image', 'name' => 's', 'alt' => 'Label'));
+ $this->assertEqual($tag->getName(), 's');
+ $this->assertEqual($tag->getLabel(), 'Label');
+
+ $encoding = &new MockSimpleMultipartEncoding();
+ $encoding->expectAt(0, 'add', array('s.x', 20));
+ $encoding->expectAt(1, 'add', array('s.y', 30));
+ $tag->write($encoding, 20, 30);
+ }
+
+ function testImageSubmitTitlePreferredOverAltForLabel() {
+ $tag = &new SimpleImageSubmitTag(
+ array('type' => 'image', 'name' => 's', 'alt' => 'Label', 'title' => 'Title'));
+ $this->assertEqual($tag->getLabel(), 'Title');
+ }
+
+ function testButton() {
+ $tag = &new SimpleButtonTag(
+ array('type' => 'submit', 'name' => 's', 'value' => 'do'));
+ $tag->addContent('I am a button');
+ $this->assertEqual($tag->getName(), 's');
+ $this->assertEqual($tag->getValue(), 'do');
+ $this->assertEqual($tag->getLabel(), 'I am a button');
+
+ $encoding = &new MockSimpleMultipartEncoding();
+ $encoding->expectOnce('add', array('s', 'do'));
+ $tag->write($encoding);
+ }
+}
+
+class TestOfTextArea extends UnitTestCase {
+
+ function testDefault() {
+ $tag = &new SimpleTextAreaTag(array('name' => 'a'));
+ $tag->addContent('Some text');
+ $this->assertEqual($tag->getName(), 'a');
+ $this->assertEqual($tag->getDefault(), 'Some text');
+ }
+
+ function testWrapping() {
+ $tag = &new SimpleTextAreaTag(array('cols' => '10', 'wrap' => 'physical'));
+ $tag->addContent("Lot's of text that should be wrapped");
+ $this->assertEqual(
+ $tag->getDefault(),
+ "Lot's of\r\ntext that\r\nshould be\r\nwrapped");
+ $tag->setValue("New long text\r\nwith two lines");
+ $this->assertEqual(
+ $tag->getValue(),
+ "New long\r\ntext\r\nwith two\r\nlines");
+ }
+
+ function testWrappingRemovesLeadingcariageReturn() {
+ $tag = &new SimpleTextAreaTag(array('cols' => '20', 'wrap' => 'physical'));
+ $tag->addContent("\rStuff");
+ $this->assertEqual($tag->getDefault(), 'Stuff');
+ $tag->setValue("\nNew stuff\n");
+ $this->assertEqual($tag->getValue(), "New stuff\r\n");
+ }
+
+ function testBreaksAreNewlineAndCarriageReturn() {
+ $tag = &new SimpleTextAreaTag(array('cols' => '10'));
+ $tag->addContent("Some\nText\rwith\r\nbreaks");
+ $this->assertEqual($tag->getValue(), "Some\r\nText\r\nwith\r\nbreaks");
+ }
+}
+
+class TestOfCheckbox extends UnitTestCase {
+
+ function testCanSetCheckboxToNamedValueWithBooleanTrue() {
+ $tag = &new SimpleCheckboxTag(array('name' => 'a', 'value' => 'A'));
+ $this->assertEqual($tag->getValue(), false);
+ $tag->setValue(true);
+ $this->assertIdentical($tag->getValue(), 'A');
+ }
+}
+
+class TestOfSelection extends UnitTestCase {
+
+ function testEmpty() {
+ $tag = &new SimpleSelectionTag(array('name' => 'a'));
+ $this->assertIdentical($tag->getValue(), '');
+ }
+
+ function testSingle() {
+ $tag = &new SimpleSelectionTag(array('name' => 'a'));
+ $option = &new SimpleOptionTag(array());
+ $option->addContent('AAA');
+ $tag->addTag($option);
+ $this->assertEqual($tag->getValue(), 'AAA');
+ }
+
+ function testSingleDefault() {
+ $tag = &new SimpleSelectionTag(array('name' => 'a'));
+ $option = &new SimpleOptionTag(array('selected' => ''));
+ $option->addContent('AAA');
+ $tag->addTag($option);
+ $this->assertEqual($tag->getValue(), 'AAA');
+ }
+
+ function testSingleMappedDefault() {
+ $tag = &new SimpleSelectionTag(array('name' => 'a'));
+ $option = &new SimpleOptionTag(array('selected' => '', 'value' => 'aaa'));
+ $option->addContent('AAA');
+ $tag->addTag($option);
+ $this->assertEqual($tag->getValue(), 'aaa');
+ }
+
+ function testStartsWithDefault() {
+ $tag = &new SimpleSelectionTag(array('name' => 'a'));
+ $a = &new SimpleOptionTag(array());
+ $a->addContent('AAA');
+ $tag->addTag($a);
+ $b = &new SimpleOptionTag(array('selected' => ''));
+ $b->addContent('BBB');
+ $tag->addTag($b);
+ $c = &new SimpleOptionTag(array());
+ $c->addContent('CCC');
+ $tag->addTag($c);
+ $this->assertEqual($tag->getValue(), 'BBB');
+ }
+
+ function testSettingOption() {
+ $tag = &new SimpleSelectionTag(array('name' => 'a'));
+ $a = &new SimpleOptionTag(array());
+ $a->addContent('AAA');
+ $tag->addTag($a);
+ $b = &new SimpleOptionTag(array('selected' => ''));
+ $b->addContent('BBB');
+ $tag->addTag($b);
+ $c = &new SimpleOptionTag(array());
+ $c->addContent('CCC');
+ $tag->setValue('AAA');
+ $this->assertEqual($tag->getValue(), 'AAA');
+ }
+
+ function testSettingMappedOption() {
+ $tag = &new SimpleSelectionTag(array('name' => 'a'));
+ $a = &new SimpleOptionTag(array('value' => 'aaa'));
+ $a->addContent('AAA');
+ $tag->addTag($a);
+ $b = &new SimpleOptionTag(array('value' => 'bbb', 'selected' => ''));
+ $b->addContent('BBB');
+ $tag->addTag($b);
+ $c = &new SimpleOptionTag(array('value' => 'ccc'));
+ $c->addContent('CCC');
+ $tag->addTag($c);
+ $tag->setValue('AAA');
+ $this->assertEqual($tag->getValue(), 'aaa');
+ $tag->setValue('ccc');
+ $this->assertEqual($tag->getValue(), 'ccc');
+ }
+
+ function testSelectionDespiteSpuriousWhitespace() {
+ $tag = &new SimpleSelectionTag(array('name' => 'a'));
+ $a = &new SimpleOptionTag(array());
+ $a->addContent(' AAA ');
+ $tag->addTag($a);
+ $b = &new SimpleOptionTag(array('selected' => ''));
+ $b->addContent(' BBB ');
+ $tag->addTag($b);
+ $c = &new SimpleOptionTag(array());
+ $c->addContent(' CCC ');
+ $tag->addTag($c);
+ $this->assertEqual($tag->getValue(), ' BBB ');
+ $tag->setValue('AAA');
+ $this->assertEqual($tag->getValue(), ' AAA ');
+ }
+
+ function testFailToSetIllegalOption() {
+ $tag = &new SimpleSelectionTag(array('name' => 'a'));
+ $a = &new SimpleOptionTag(array());
+ $a->addContent('AAA');
+ $tag->addTag($a);
+ $b = &new SimpleOptionTag(array('selected' => ''));
+ $b->addContent('BBB');
+ $tag->addTag($b);
+ $c = &new SimpleOptionTag(array());
+ $c->addContent('CCC');
+ $tag->addTag($c);
+ $this->assertFalse($tag->setValue('Not present'));
+ $this->assertEqual($tag->getValue(), 'BBB');
+ }
+
+ function testNastyOptionValuesThatLookLikeFalse() {
+ $tag = &new SimpleSelectionTag(array('name' => 'a'));
+ $a = &new SimpleOptionTag(array('value' => '1'));
+ $a->addContent('One');
+ $tag->addTag($a);
+ $b = &new SimpleOptionTag(array('value' => '0'));
+ $b->addContent('Zero');
+ $tag->addTag($b);
+ $this->assertIdentical($tag->getValue(), '1');
+ $tag->setValue('Zero');
+ $this->assertIdentical($tag->getValue(), '0');
+ }
+
+ function testBlankOption() {
+ $tag = &new SimpleSelectionTag(array('name' => 'A'));
+ $a = &new SimpleOptionTag(array());
+ $tag->addTag($a);
+ $b = &new SimpleOptionTag(array());
+ $b->addContent('b');
+ $tag->addTag($b);
+ $this->assertIdentical($tag->getValue(), '');
+ $tag->setValue('b');
+ $this->assertIdentical($tag->getValue(), 'b');
+ $tag->setValue('');
+ $this->assertIdentical($tag->getValue(), '');
+ }
+
+ function testMultipleDefaultWithNoSelections() {
+ $tag = &new MultipleSelectionTag(array('name' => 'a', 'multiple' => ''));
+ $a = &new SimpleOptionTag(array());
+ $a->addContent('AAA');
+ $tag->addTag($a);
+ $b = &new SimpleOptionTag(array());
+ $b->addContent('BBB');
+ $tag->addTag($b);
+ $this->assertIdentical($tag->getDefault(), array());
+ $this->assertIdentical($tag->getValue(), array());
+ }
+
+ function testMultipleDefaultWithSelections() {
+ $tag = &new MultipleSelectionTag(array('name' => 'a', 'multiple' => ''));
+ $a = &new SimpleOptionTag(array('selected' => ''));
+ $a->addContent('AAA');
+ $tag->addTag($a);
+ $b = &new SimpleOptionTag(array('selected' => ''));
+ $b->addContent('BBB');
+ $tag->addTag($b);
+ $this->assertIdentical($tag->getDefault(), array('AAA', 'BBB'));
+ $this->assertIdentical($tag->getValue(), array('AAA', 'BBB'));
+ }
+
+ function testSettingMultiple() {
+ $tag = &new MultipleSelectionTag(array('name' => 'a', 'multiple' => ''));
+ $a = &new SimpleOptionTag(array('selected' => ''));
+ $a->addContent('AAA');
+ $tag->addTag($a);
+ $b = &new SimpleOptionTag(array());
+ $b->addContent('BBB');
+ $tag->addTag($b);
+ $c = &new SimpleOptionTag(array('selected' => '', 'value' => 'ccc'));
+ $c->addContent('CCC');
+ $tag->addTag($c);
+ $this->assertIdentical($tag->getDefault(), array('AAA', 'ccc'));
+ $this->assertTrue($tag->setValue(array('BBB', 'ccc')));
+ $this->assertIdentical($tag->getValue(), array('BBB', 'ccc'));
+ $this->assertTrue($tag->setValue(array()));
+ $this->assertIdentical($tag->getValue(), array());
+ }
+
+ function testFailToSetIllegalOptionsInMultiple() {
+ $tag = &new MultipleSelectionTag(array('name' => 'a', 'multiple' => ''));
+ $a = &new SimpleOptionTag(array('selected' => ''));
+ $a->addContent('AAA');
+ $tag->addTag($a);
+ $b = &new SimpleOptionTag(array());
+ $b->addContent('BBB');
+ $tag->addTag($b);
+ $this->assertFalse($tag->setValue(array('CCC')));
+ $this->assertTrue($tag->setValue(array('AAA', 'BBB')));
+ $this->assertFalse($tag->setValue(array('AAA', 'CCC')));
+ }
+}
+
+class TestOfRadioGroup extends UnitTestCase {
+
+ function testEmptyGroup() {
+ $group = &new SimpleRadioGroup();
+ $this->assertIdentical($group->getDefault(), false);
+ $this->assertIdentical($group->getValue(), false);
+ $this->assertFalse($group->setValue('a'));
+ }
+
+ function testReadingSingleButtonGroup() {
+ $group = &new SimpleRadioGroup();
+ $group->addWidget(new SimpleRadioButtonTag(
+ array('value' => 'A', 'checked' => '')));
+ $this->assertIdentical($group->getDefault(), 'A');
+ $this->assertIdentical($group->getValue(), 'A');
+ }
+
+ function testReadingMultipleButtonGroup() {
+ $group = &new SimpleRadioGroup();
+ $group->addWidget(new SimpleRadioButtonTag(
+ array('value' => 'A')));
+ $group->addWidget(new SimpleRadioButtonTag(
+ array('value' => 'B', 'checked' => '')));
+ $this->assertIdentical($group->getDefault(), 'B');
+ $this->assertIdentical($group->getValue(), 'B');
+ }
+
+ function testFailToSetUnlistedValue() {
+ $group = &new SimpleRadioGroup();
+ $group->addWidget(new SimpleRadioButtonTag(array('value' => 'z')));
+ $this->assertFalse($group->setValue('a'));
+ $this->assertIdentical($group->getValue(), false);
+ }
+
+ function testSettingNewValueClearsTheOldOne() {
+ $group = &new SimpleRadioGroup();
+ $group->addWidget(new SimpleRadioButtonTag(
+ array('value' => 'A')));
+ $group->addWidget(new SimpleRadioButtonTag(
+ array('value' => 'B', 'checked' => '')));
+ $this->assertTrue($group->setValue('A'));
+ $this->assertIdentical($group->getValue(), 'A');
+ }
+
+ function testIsIdMatchesAnyWidgetInSet() {
+ $group = &new SimpleRadioGroup();
+ $group->addWidget(new SimpleRadioButtonTag(
+ array('value' => 'A', 'id' => 'i1')));
+ $group->addWidget(new SimpleRadioButtonTag(
+ array('value' => 'B', 'id' => 'i2')));
+ $this->assertFalse($group->isId('i0'));
+ $this->assertTrue($group->isId('i1'));
+ $this->assertTrue($group->isId('i2'));
+ }
+
+ function testIsLabelMatchesAnyWidgetInSet() {
+ $group = &new SimpleRadioGroup();
+ $button1 = &new SimpleRadioButtonTag(array('value' => 'A'));
+ $button1->setLabel('one');
+ $group->addWidget($button1);
+ $button2 = &new SimpleRadioButtonTag(array('value' => 'B'));
+ $button2->setLabel('two');
+ $group->addWidget($button2);
+ $this->assertFalse($group->isLabel('three'));
+ $this->assertTrue($group->isLabel('one'));
+ $this->assertTrue($group->isLabel('two'));
+ }
+}
+
+class TestOfTagGroup extends UnitTestCase {
+
+ function testReadingMultipleCheckboxGroup() {
+ $group = &new SimpleCheckboxGroup();
+ $group->addWidget(new SimpleCheckboxTag(array('value' => 'A')));
+ $group->addWidget(new SimpleCheckboxTag(
+ array('value' => 'B', 'checked' => '')));
+ $this->assertIdentical($group->getDefault(), 'B');
+ $this->assertIdentical($group->getValue(), 'B');
+ }
+
+ function testReadingMultipleUncheckedItems() {
+ $group = &new SimpleCheckboxGroup();
+ $group->addWidget(new SimpleCheckboxTag(array('value' => 'A')));
+ $group->addWidget(new SimpleCheckboxTag(array('value' => 'B')));
+ $this->assertIdentical($group->getDefault(), false);
+ $this->assertIdentical($group->getValue(), false);
+ }
+
+ function testReadingMultipleCheckedItems() {
+ $group = &new SimpleCheckboxGroup();
+ $group->addWidget(new SimpleCheckboxTag(
+ array('value' => 'A', 'checked' => '')));
+ $group->addWidget(new SimpleCheckboxTag(
+ array('value' => 'B', 'checked' => '')));
+ $this->assertIdentical($group->getDefault(), array('A', 'B'));
+ $this->assertIdentical($group->getValue(), array('A', 'B'));
+ }
+
+ function testSettingSingleValue() {
+ $group = &new SimpleCheckboxGroup();
+ $group->addWidget(new SimpleCheckboxTag(array('value' => 'A')));
+ $group->addWidget(new SimpleCheckboxTag(array('value' => 'B')));
+ $this->assertTrue($group->setValue('A'));
+ $this->assertIdentical($group->getValue(), 'A');
+ $this->assertTrue($group->setValue('B'));
+ $this->assertIdentical($group->getValue(), 'B');
+ }
+
+ function testSettingMultipleValues() {
+ $group = &new SimpleCheckboxGroup();
+ $group->addWidget(new SimpleCheckboxTag(array('value' => 'A')));
+ $group->addWidget(new SimpleCheckboxTag(array('value' => 'B')));
+ $this->assertTrue($group->setValue(array('A', 'B')));
+ $this->assertIdentical($group->getValue(), array('A', 'B'));
+ }
+
+ function testSettingNoValue() {
+ $group = &new SimpleCheckboxGroup();
+ $group->addWidget(new SimpleCheckboxTag(array('value' => 'A')));
+ $group->addWidget(new SimpleCheckboxTag(array('value' => 'B')));
+ $this->assertTrue($group->setValue(false));
+ $this->assertIdentical($group->getValue(), false);
+ }
+
+ function testIsIdMatchesAnyIdInSet() {
+ $group = &new SimpleCheckboxGroup();
+ $group->addWidget(new SimpleCheckboxTag(array('id' => 1, 'value' => 'A')));
+ $group->addWidget(new SimpleCheckboxTag(array('id' => 2, 'value' => 'B')));
+ $this->assertFalse($group->isId(0));
+ $this->assertTrue($group->isId(1));
+ $this->assertTrue($group->isId(2));
+ }
+}
+
+class TestOfUploadWidget extends UnitTestCase {
+
+ function testValueIsFilePath() {
+ $upload = &new SimpleUploadTag(array('name' => 'a'));
+ $upload->setValue(dirname(__FILE__) . '/support/upload_sample.txt');
+ $this->assertEqual($upload->getValue(), dirname(__FILE__) . '/support/upload_sample.txt');
+ }
+
+ function testSubmitsFileContents() {
+ $encoding = &new MockSimpleMultipartEncoding();
+ $encoding->expectOnce('attach', array(
+ 'a',
+ 'Sample for testing file upload',
+ 'upload_sample.txt'));
+ $upload = &new SimpleUploadTag(array('name' => 'a'));
+ $upload->setValue(dirname(__FILE__) . '/support/upload_sample.txt');
+ $upload->write($encoding);
+ }
+}
+
+class TestOfLabelTag extends UnitTestCase {
+
+ function testLabelShouldHaveAnEndTag() {
+ $label = &new SimpleLabelTag(array());
+ $this->assertTrue($label->expectEndTag());
+ }
+
+ function testContentIsTextOnly() {
+ $label = &new SimpleLabelTag(array());
+ $label->addContent('Here <tag>are</tag> words');
+ $this->assertEqual($label->getText(), 'Here are words');
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/test_with_parse_error.php b/tests/simpletest/test/test_with_parse_error.php
new file mode 100755
index 0000000000..be748e4198
--- /dev/null
+++ b/tests/simpletest/test/test_with_parse_error.php
@@ -0,0 +1,8 @@
+<?php
+ // $Id: test_with_parse_error.php,v 1.1 2005/01/24 00:32:14 lastcraft Exp $
+
+ class TestCaseWithParseError extends UnitTestCase {
+ wibble
+ }
+
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/unit_tester_test.php b/tests/simpletest/test/unit_tester_test.php
new file mode 100755
index 0000000000..b1a0a006d3
--- /dev/null
+++ b/tests/simpletest/test/unit_tester_test.php
@@ -0,0 +1,55 @@
+<?php
+// $Id: unit_tester_test.php,v 1.12 2007/05/08 22:08:06 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+
+class ReferenceForTesting {
+}
+
+class TestOfUnitTester extends UnitTestCase {
+
+ function testAssertTrueReturnsAssertionAsBoolean() {
+ $this->assertTrue($this->assertTrue(true));
+ }
+
+ function testAssertFalseReturnsAssertionAsBoolean() {
+ $this->assertTrue($this->assertFalse(false));
+ }
+
+ function testAssertEqualReturnsAssertionAsBoolean() {
+ $this->assertTrue($this->assertEqual(5, 5));
+ }
+
+ function testAssertIdenticalReturnsAssertionAsBoolean() {
+ $this->assertTrue($this->assertIdentical(5, 5));
+ }
+
+ function testCoreAssertionsDoNotThrowErrors() {
+ $this->assertIsA($this, 'UnitTestCase');
+ $this->assertNotA($this, 'WebTestCase');
+ }
+
+ function testReferenceAssertionOnObjects() {
+ $a = &new ReferenceForTesting();
+ $b = &$a;
+ $this->assertReference($a, $b);
+ }
+
+ function testReferenceAssertionOnScalars() {
+ $a = 25;
+ $b = &$a;
+ $this->assertReference($a, $b);
+ }
+
+ function testCloneOnObjects() {
+ $a = &new ReferenceForTesting();
+ $b = &new ReferenceForTesting();
+ $this->assertClone($a, $b);
+ }
+
+ function testCloneOnScalars() {
+ $a = 25;
+ $b = 25;
+ $this->assertClone($a, $b);
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/unit_tests.php b/tests/simpletest/test/unit_tests.php
new file mode 100755
index 0000000000..67aca2edf8
--- /dev/null
+++ b/tests/simpletest/test/unit_tests.php
@@ -0,0 +1,54 @@
+<?php
+// $Id: unit_tests.php,v 1.54 2007/05/21 20:14:56 tswicegood Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../unit_tester.php');
+require_once(dirname(__FILE__) . '/../shell_tester.php');
+require_once(dirname(__FILE__) . '/../mock_objects.php');
+require_once(dirname(__FILE__) . '/../web_tester.php');
+require_once(dirname(__FILE__) . '/../extensions/pear_test_case.php');
+require_once(dirname(__FILE__) . '/../extensions/phpunit_test_case.php');
+
+class UnitTests extends TestSuite {
+ function UnitTests() {
+ $this->TestSuite('Unit tests');
+ $path = dirname(__FILE__);
+ $this->addFile($path . '/errors_test.php');
+ if (version_compare(phpversion(), '5') >= 0) {
+ $this->addFile($path . '/exceptions_test.php');
+ }
+ $this->addFile($path . '/compatibility_test.php');
+ $this->addFile($path . '/simpletest_test.php');
+ $this->addFile($path . '/dumper_test.php');
+ $this->addFile($path . '/expectation_test.php');
+ $this->addFile($path . '/unit_tester_test.php');
+ if (version_compare(phpversion(), '5', '>=')) {
+ $this->addFile($path . '/reflection_php5_test.php');
+ } else {
+ $this->addFile($path . '/reflection_php4_test.php');
+ }
+ $this->addFile($path . '/mock_objects_test.php');
+ if (version_compare(phpversion(), '5', '>=')) {
+ $this->addFile($path . '/interfaces_test.php');
+ }
+ $this->addFile($path . '/collector_test.php');
+ $this->addFile($path . '/adapter_test.php');
+ $this->addFile($path . '/socket_test.php');
+ $this->addFile($path . '/encoding_test.php');
+ $this->addFile($path . '/url_test.php');
+ $this->addFile($path . '/cookies_test.php');
+ $this->addFile($path . '/http_test.php');
+ $this->addFile($path . '/authentication_test.php');
+ $this->addFile($path . '/user_agent_test.php');
+ $this->addFile($path . '/parser_test.php');
+ $this->addFile($path . '/tag_test.php');
+ $this->addFile($path . '/form_test.php');
+ $this->addFile($path . '/page_test.php');
+ $this->addFile($path . '/frames_test.php');
+ $this->addFile($path . '/browser_test.php');
+ $this->addFile($path . '/web_tester_test.php');
+ $this->addFile($path . '/shell_tester_test.php');
+ $this->addFile($path . '/xml_test.php');
+ $this->addFile($path . '/../extensions/testdox/test.php');
+ }
+}
+?>
diff --git a/tests/simpletest/test/url_test.php b/tests/simpletest/test/url_test.php
new file mode 100755
index 0000000000..44ef87780e
--- /dev/null
+++ b/tests/simpletest/test/url_test.php
@@ -0,0 +1,415 @@
+<?php
+// $Id: url_test.php,v 1.27 2007/07/14 11:48:21 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../url.php');
+
+class TestOfUrl extends UnitTestCase {
+
+ function testDefaultUrl() {
+ $url = new SimpleUrl('');
+ $this->assertEqual($url->getScheme(), '');
+ $this->assertEqual($url->getHost(), '');
+ $this->assertEqual($url->getScheme('http'), 'http');
+ $this->assertEqual($url->getHost('localhost'), 'localhost');
+ $this->assertEqual($url->getPath(), '');
+ }
+
+ function testBasicParsing() {
+ $url = new SimpleUrl('https://www.lastcraft.com/test/');
+ $this->assertEqual($url->getScheme(), 'https');
+ $this->assertEqual($url->getHost(), 'www.lastcraft.com');
+ $this->assertEqual($url->getPath(), '/test/');
+ }
+
+ function testRelativeUrls() {
+ $url = new SimpleUrl('../somewhere.php');
+ $this->assertEqual($url->getScheme(), false);
+ $this->assertEqual($url->getHost(), false);
+ $this->assertEqual($url->getPath(), '../somewhere.php');
+ }
+
+ function testParseBareParameter() {
+ $url = new SimpleUrl('?a');
+ $this->assertEqual($url->getPath(), '');
+ $this->assertEqual($url->getEncodedRequest(), '?a');
+ $url->addRequestParameter('x', 'X');
+ $this->assertEqual($url->getEncodedRequest(), '?a=&x=X');
+ }
+
+ function testParseEmptyParameter() {
+ $url = new SimpleUrl('?a=');
+ $this->assertEqual($url->getPath(), '');
+ $this->assertEqual($url->getEncodedRequest(), '?a=');
+ $url->addRequestParameter('x', 'X');
+ $this->assertEqual($url->getEncodedRequest(), '?a=&x=X');
+ }
+
+ function testParseParameterPair() {
+ $url = new SimpleUrl('?a=A');
+ $this->assertEqual($url->getPath(), '');
+ $this->assertEqual($url->getEncodedRequest(), '?a=A');
+ $url->addRequestParameter('x', 'X');
+ $this->assertEqual($url->getEncodedRequest(), '?a=A&x=X');
+ }
+
+ function testParseMultipleParameters() {
+ $url = new SimpleUrl('?a=A&b=B');
+ $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B');
+ $url->addRequestParameter('x', 'X');
+ $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B&x=X');
+ }
+
+ function testParsingParameterMixture() {
+ $url = new SimpleUrl('?a=A&b=&c');
+ $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c');
+ $url->addRequestParameter('x', 'X');
+ $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c=&x=X');
+ }
+
+ function testAddParametersFromScratch() {
+ $url = new SimpleUrl('');
+ $url->addRequestParameter('a', 'A');
+ $this->assertEqual($url->getEncodedRequest(), '?a=A');
+ $url->addRequestParameter('b', 'B');
+ $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B');
+ $url->addRequestParameter('a', 'aaa');
+ $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B&a=aaa');
+ }
+
+ function testClearingParameters() {
+ $url = new SimpleUrl('');
+ $url->addRequestParameter('a', 'A');
+ $url->clearRequest();
+ $this->assertIdentical($url->getEncodedRequest(), '');
+ }
+
+ function testEncodingParameters() {
+ $url = new SimpleUrl('');
+ $url->addRequestParameter('a', '?!"\'#~@[]{}:;<>,./|£$%^&*()_+-=');
+ $this->assertIdentical(
+ $request = $url->getEncodedRequest(),
+ '?a=%3F%21%22%27%23%7E%40%5B%5D%7B%7D%3A%3B%3C%3E%2C.%2F%7C%A3%24%25%5E%26%2A%28%29_%2B-%3D');
+ }
+
+ function testDecodingParameters() {
+ $url = new SimpleUrl('?a=%3F%21%22%27%23%7E%40%5B%5D%7B%7D%3A%3B%3C%3E%2C.%2F%7C%A3%24%25%5E%26%2A%28%29_%2B-%3D');
+ $this->assertEqual(
+ $url->getEncodedRequest(),
+ '?a=' . urlencode('?!"\'#~@[]{}:;<>,./|£$%^&*()_+-='));
+ }
+
+ function testUrlInQueryDoesNotConfuseParsing() {
+ $url = new SimpleUrl('wibble/login.php?url=http://www.google.com/moo/');
+ $this->assertFalse($url->getScheme());
+ $this->assertFalse($url->getHost());
+ $this->assertEqual($url->getPath(), 'wibble/login.php');
+ $this->assertEqual($url->getEncodedRequest(), '?url=http://www.google.com/moo/');
+ }
+
+ function testSettingCordinates() {
+ $url = new SimpleUrl('');
+ $url->setCoordinates('32', '45');
+ $this->assertIdentical($url->getX(), 32);
+ $this->assertIdentical($url->getY(), 45);
+ $this->assertEqual($url->getEncodedRequest(), '');
+ }
+
+ function testParseCordinates() {
+ $url = new SimpleUrl('?32,45');
+ $this->assertIdentical($url->getX(), 32);
+ $this->assertIdentical($url->getY(), 45);
+ }
+
+ function testClearingCordinates() {
+ $url = new SimpleUrl('?32,45');
+ $url->setCoordinates();
+ $this->assertIdentical($url->getX(), false);
+ $this->assertIdentical($url->getY(), false);
+ }
+
+ function testParsingParameterCordinateMixture() {
+ $url = new SimpleUrl('?a=A&b=&c?32,45');
+ $this->assertIdentical($url->getX(), 32);
+ $this->assertIdentical($url->getY(), 45);
+ $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c');
+ }
+
+ function testParsingParameterWithBadCordinates() {
+ $url = new SimpleUrl('?a=A&b=&c?32');
+ $this->assertIdentical($url->getX(), false);
+ $this->assertIdentical($url->getY(), false);
+ $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c?32');
+ }
+
+ function testPageSplitting() {
+ $url = new SimpleUrl('./here/../there/somewhere.php');
+ $this->assertEqual($url->getPath(), './here/../there/somewhere.php');
+ $this->assertEqual($url->getPage(), 'somewhere.php');
+ $this->assertEqual($url->getBasePath(), './here/../there/');
+ }
+
+ function testAbsolutePathPageSplitting() {
+ $url = new SimpleUrl("http://host.com/here/there/somewhere.php");
+ $this->assertEqual($url->getPath(), "/here/there/somewhere.php");
+ $this->assertEqual($url->getPage(), "somewhere.php");
+ $this->assertEqual($url->getBasePath(), "/here/there/");
+ }
+
+ function testSplittingUrlWithNoPageGivesEmptyPage() {
+ $url = new SimpleUrl('/here/there/');
+ $this->assertEqual($url->getPath(), '/here/there/');
+ $this->assertEqual($url->getPage(), '');
+ $this->assertEqual($url->getBasePath(), '/here/there/');
+ }
+
+ function testPathNormalisation() {
+ $this->assertEqual(
+ SimpleUrl::normalisePath('https://host.com/I/am/here/../there/somewhere.php'),
+ 'https://host.com/I/am/there/somewhere.php');
+ }
+
+ // regression test for #1535407
+ function testPathNormalisationWithSinglePeriod() {
+ $this->assertEqual(
+ SimpleUrl::normalisePath('https://host.com/I/am/here/./../there/somewhere.php'),
+ 'https://host.com/I/am/there/somewhere.php');
+ }
+
+ function testUsernameAndPasswordAreUrlDecoded() {
+ $url = new SimpleUrl('http://' . urlencode('test@test') .
+ ':' . urlencode('$!£@*&%') . '@www.lastcraft.com');
+ $this->assertEqual($url->getUsername(), 'test@test');
+ $this->assertEqual($url->getPassword(), '$!£@*&%');
+ }
+
+ function testBlitz() {
+ $this->assertUrl(
+ "https://username:password@www.somewhere.com:243/this/that/here.php?a=1&b=2#anchor",
+ array("https", "username", "password", "www.somewhere.com", 243, "/this/that/here.php", "com", "?a=1&b=2", "anchor"),
+ array("a" => "1", "b" => "2"));
+ $this->assertUrl(
+ "username:password@www.somewhere.com/this/that/here.php?a=1",
+ array(false, "username", "password", "www.somewhere.com", false, "/this/that/here.php", "com", "?a=1", false),
+ array("a" => "1"));
+ $this->assertUrl(
+ "username:password@somewhere.com:243?1,2",
+ array(false, "username", "password", "somewhere.com", 243, "/", "com", "", false),
+ array(),
+ array(1, 2));
+ $this->assertUrl(
+ "https://www.somewhere.com",
+ array("https", false, false, "www.somewhere.com", false, "/", "com", "", false));
+ $this->assertUrl(
+ "username@www.somewhere.com:243#anchor",
+ array(false, "username", false, "www.somewhere.com", 243, "/", "com", "", "anchor"));
+ $this->assertUrl(
+ "/this/that/here.php?a=1&b=2?3,4",
+ array(false, false, false, false, false, "/this/that/here.php", false, "?a=1&b=2", false),
+ array("a" => "1", "b" => "2"),
+ array(3, 4));
+ $this->assertUrl(
+ "username@/here.php?a=1&b=2",
+ array(false, "username", false, false, false, "/here.php", false, "?a=1&b=2", false),
+ array("a" => "1", "b" => "2"));
+ }
+
+ function testAmbiguousHosts() {
+ $this->assertUrl(
+ "tigger",
+ array(false, false, false, false, false, "tigger", false, "", false));
+ $this->assertUrl(
+ "/tigger",
+ array(false, false, false, false, false, "/tigger", false, "", false));
+ $this->assertUrl(
+ "//tigger",
+ array(false, false, false, "tigger", false, "/", false, "", false));
+ $this->assertUrl(
+ "//tigger/",
+ array(false, false, false, "tigger", false, "/", false, "", false));
+ $this->assertUrl(
+ "tigger.com",
+ array(false, false, false, "tigger.com", false, "/", "com", "", false));
+ $this->assertUrl(
+ "me.net/tigger",
+ array(false, false, false, "me.net", false, "/tigger", "net", "", false));
+ }
+
+ function testAsString() {
+ $this->assertPreserved('https://www.here.com');
+ $this->assertPreserved('http://me:secret@www.here.com');
+ $this->assertPreserved('http://here/there');
+ $this->assertPreserved('http://here/there?a=A&b=B');
+ $this->assertPreserved('http://here/there?a=1&a=2');
+ $this->assertPreserved('http://here/there?a=1&a=2?9,8');
+ $this->assertPreserved('http://host?a=1&a=2');
+ $this->assertPreserved('http://host#stuff');
+ $this->assertPreserved('http://me:secret@www.here.com/a/b/c/here.html?a=A?7,6');
+ $this->assertPreserved('http://www.here.com/?a=A__b=B');
+ }
+
+ function assertUrl($raw, $parts, $params = false, $coords = false) {
+ if (! is_array($params)) {
+ $params = array();
+ }
+ $url = new SimpleUrl($raw);
+ $this->assertIdentical($url->getScheme(), $parts[0], "[$raw] scheme -> %s");
+ $this->assertIdentical($url->getUsername(), $parts[1], "[$raw] username -> %s");
+ $this->assertIdentical($url->getPassword(), $parts[2], "[$raw] password -> %s");
+ $this->assertIdentical($url->getHost(), $parts[3], "[$raw] host -> %s");
+ $this->assertIdentical($url->getPort(), $parts[4], "[$raw] port -> %s");
+ $this->assertIdentical($url->getPath(), $parts[5], "[$raw] path -> %s");
+ $this->assertIdentical($url->getTld(), $parts[6], "[$raw] tld -> %s");
+ $this->assertIdentical($url->getEncodedRequest(), $parts[7], "[$raw] encoded -> %s");
+ $this->assertIdentical($url->getFragment(), $parts[8], "[$raw] fragment -> %s");
+ if ($coords) {
+ $this->assertIdentical($url->getX(), $coords[0], "[$raw] x -> %s");
+ $this->assertIdentical($url->getY(), $coords[1], "[$raw] y -> %s");
+ }
+ }
+
+ function testUrlWithTwoSlashesInPath() {
+ $url = new SimpleUrl('/article/categoryedit/insert//');
+ $this->assertEqual($url->getPath(), '/article/categoryedit/insert//');
+ }
+
+ function assertPreserved($string) {
+ $url = new SimpleUrl($string);
+ $this->assertEqual($url->asString(), $string);
+ }
+}
+
+class TestOfAbsoluteUrls extends UnitTestCase {
+
+ function testMakingAbsolute() {
+ $url = new SimpleUrl('../there/somewhere.php');
+ $this->assertEqual($url->getPath(), '../there/somewhere.php');
+ $absolute = $url->makeAbsolute('https://host.com:1234/I/am/here/');
+ $this->assertEqual($absolute->getScheme(), 'https');
+ $this->assertEqual($absolute->getHost(), 'host.com');
+ $this->assertEqual($absolute->getPort(), 1234);
+ $this->assertEqual($absolute->getPath(), '/I/am/there/somewhere.php');
+ }
+
+ function testMakingAnEmptyUrlAbsolute() {
+ $url = new SimpleUrl('');
+ $this->assertEqual($url->getPath(), '');
+ $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html');
+ $this->assertEqual($absolute->getScheme(), 'http');
+ $this->assertEqual($absolute->getHost(), 'host.com');
+ $this->assertEqual($absolute->getPath(), '/I/am/here/page.html');
+ }
+
+ function testMakingAnEmptyUrlAbsoluteWithMissingPageName() {
+ $url = new SimpleUrl('');
+ $this->assertEqual($url->getPath(), '');
+ $absolute = $url->makeAbsolute('http://host.com/I/am/here/');
+ $this->assertEqual($absolute->getScheme(), 'http');
+ $this->assertEqual($absolute->getHost(), 'host.com');
+ $this->assertEqual($absolute->getPath(), '/I/am/here/');
+ }
+
+ function testMakingAShortQueryUrlAbsolute() {
+ $url = new SimpleUrl('?a#b');
+ $this->assertEqual($url->getPath(), '');
+ $absolute = $url->makeAbsolute('http://host.com/I/am/here/');
+ $this->assertEqual($absolute->getScheme(), 'http');
+ $this->assertEqual($absolute->getHost(), 'host.com');
+ $this->assertEqual($absolute->getPath(), '/I/am/here/');
+ $this->assertEqual($absolute->getEncodedRequest(), '?a');
+ $this->assertEqual($absolute->getFragment(), 'b');
+ }
+
+ function testMakingADirectoryUrlAbsolute() {
+ $url = new SimpleUrl('hello/');
+ $this->assertEqual($url->getPath(), 'hello/');
+ $this->assertEqual($url->getBasePath(), 'hello/');
+ $this->assertEqual($url->getPage(), '');
+ $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html');
+ $this->assertEqual($absolute->getPath(), '/I/am/here/hello/');
+ }
+
+ function testMakingARootUrlAbsolute() {
+ $url = new SimpleUrl('/');
+ $this->assertEqual($url->getPath(), '/');
+ $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html');
+ $this->assertEqual($absolute->getPath(), '/');
+ }
+
+ function testMakingARootPageUrlAbsolute() {
+ $url = new SimpleUrl('/here.html');
+ $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html');
+ $this->assertEqual($absolute->getPath(), '/here.html');
+ }
+
+ function testCarryAuthenticationFromRootPage() {
+ $url = new SimpleUrl('here.html');
+ $absolute = $url->makeAbsolute('http://test:secret@host.com/');
+ $this->assertEqual($absolute->getPath(), '/here.html');
+ $this->assertEqual($absolute->getUsername(), 'test');
+ $this->assertEqual($absolute->getPassword(), 'secret');
+ }
+
+ function testMakingCoordinateUrlAbsolute() {
+ $url = new SimpleUrl('?1,2');
+ $this->assertEqual($url->getPath(), '');
+ $absolute = $url->makeAbsolute('http://host.com/I/am/here/');
+ $this->assertEqual($absolute->getScheme(), 'http');
+ $this->assertEqual($absolute->getHost(), 'host.com');
+ $this->assertEqual($absolute->getPath(), '/I/am/here/');
+ $this->assertEqual($absolute->getX(), 1);
+ $this->assertEqual($absolute->getY(), 2);
+ }
+
+ function testMakingAbsoluteAppendedPath() {
+ $url = new SimpleUrl('./there/somewhere.php');
+ $absolute = $url->makeAbsolute('https://host.com/here/');
+ $this->assertEqual($absolute->getPath(), '/here/there/somewhere.php');
+ }
+
+ function testMakingAbsoluteBadlyFormedAppendedPath() {
+ $url = new SimpleUrl('there/somewhere.php');
+ $absolute = $url->makeAbsolute('https://host.com/here/');
+ $this->assertEqual($absolute->getPath(), '/here/there/somewhere.php');
+ }
+
+ function testMakingAbsoluteHasNoEffectWhenAlreadyAbsolute() {
+ $url = new SimpleUrl('https://test:secret@www.lastcraft.com:321/stuff/?a=1#f');
+ $absolute = $url->makeAbsolute('http://host.com/here/');
+ $this->assertEqual($absolute->getScheme(), 'https');
+ $this->assertEqual($absolute->getUsername(), 'test');
+ $this->assertEqual($absolute->getPassword(), 'secret');
+ $this->assertEqual($absolute->getHost(), 'www.lastcraft.com');
+ $this->assertEqual($absolute->getPort(), 321);
+ $this->assertEqual($absolute->getPath(), '/stuff/');
+ $this->assertEqual($absolute->getEncodedRequest(), '?a=1');
+ $this->assertEqual($absolute->getFragment(), 'f');
+ }
+
+ function testMakingAbsoluteCarriesAuthenticationWhenAlreadyAbsolute() {
+ $url = new SimpleUrl('https://www.lastcraft.com');
+ $absolute = $url->makeAbsolute('http://test:secret@host.com/here/');
+ $this->assertEqual($absolute->getHost(), 'www.lastcraft.com');
+ $this->assertEqual($absolute->getUsername(), 'test');
+ $this->assertEqual($absolute->getPassword(), 'secret');
+ }
+
+ function testMakingHostOnlyAbsoluteDoesNotCarryAnyOtherInformation() {
+ $url = new SimpleUrl('http://www.lastcraft.com');
+ $absolute = $url->makeAbsolute('https://host.com:81/here/');
+ $this->assertEqual($absolute->getScheme(), 'http');
+ $this->assertEqual($absolute->getHost(), 'www.lastcraft.com');
+ $this->assertIdentical($absolute->getPort(), false);
+ $this->assertEqual($absolute->getPath(), '/');
+ }
+}
+
+class TestOfFrameUrl extends UnitTestCase {
+
+ function testTargetAttachment() {
+ $url = new SimpleUrl('http://www.site.com/home.html');
+ $this->assertIdentical($url->getTarget(), false);
+ $url->setTarget('A frame');
+ $this->assertIdentical($url->getTarget(), 'A frame');
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/user_agent_test.php b/tests/simpletest/test/user_agent_test.php
new file mode 100755
index 0000000000..8f532311d6
--- /dev/null
+++ b/tests/simpletest/test/user_agent_test.php
@@ -0,0 +1,358 @@
+<?php
+// $Id: user_agent_test.php,v 1.33 2007/05/08 22:08:06 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../user_agent.php');
+require_once(dirname(__FILE__) . '/../authentication.php');
+require_once(dirname(__FILE__) . '/../http.php');
+require_once(dirname(__FILE__) . '/../encoding.php');
+Mock::generate('SimpleHttpRequest');
+Mock::generate('SimpleHttpResponse');
+Mock::generate('SimpleHttpHeaders');
+Mock::generatePartial('SimpleUserAgent', 'MockRequestUserAgent', array('_createHttpRequest'));
+
+class TestOfFetchingUrlParameters extends UnitTestCase {
+
+ function setUp() {
+ $this->_headers = &new MockSimpleHttpHeaders();
+
+ $this->_response = &new MockSimpleHttpResponse();
+ $this->_response->setReturnValue('isError', false);
+ $this->_response->setReturnReference('getHeaders', new MockSimpleHttpHeaders());
+
+ $this->_request = &new MockSimpleHttpRequest();
+ $this->_request->setReturnReference('fetch', $this->_response);
+ }
+
+ function testGetRequestWithoutIncidentGivesNoErrors() {
+ $url = new SimpleUrl('http://test:secret@this.com/page.html');
+ $url->addRequestParameters(array('a' => 'A', 'b' => 'B'));
+
+ $agent = &new MockRequestUserAgent();
+ $agent->setReturnReference('_createHttpRequest', $this->_request);
+ $agent->SimpleUserAgent();
+
+ $response = &$agent->fetchResponse(
+ new SimpleUrl('http://test:secret@this.com/page.html'),
+ new SimpleGetEncoding(array('a' => 'A', 'b' => 'B')));
+ $this->assertFalse($response->isError());
+ }
+}
+
+class TestOfAdditionalHeaders extends UnitTestCase {
+
+ function testAdditionalHeaderAddedToRequest() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnReference('getHeaders', new MockSimpleHttpHeaders());
+
+ $request = &new MockSimpleHttpRequest();
+ $request->setReturnReference('fetch', $response);
+ $request->expectOnce(
+ 'addHeaderLine',
+ array('User-Agent: SimpleTest'));
+
+ $agent = &new MockRequestUserAgent();
+ $agent->setReturnReference('_createHttpRequest', $request);
+ $agent->SimpleUserAgent();
+ $agent->addHeader('User-Agent: SimpleTest');
+ $response = &$agent->fetchResponse(new SimpleUrl('http://this.host/'), new SimpleGetEncoding());
+ }
+}
+
+class TestOfBrowserCookies extends UnitTestCase {
+
+ function &_createStandardResponse() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue("isError", false);
+ $response->setReturnValue("getContent", "stuff");
+ $response->setReturnReference("getHeaders", new MockSimpleHttpHeaders());
+ return $response;
+ }
+
+ function &_createCookieSite($header_lines) {
+ $headers = &new SimpleHttpHeaders($header_lines);
+
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue("isError", false);
+ $response->setReturnReference("getHeaders", $headers);
+ $response->setReturnValue("getContent", "stuff");
+
+ $request = &new MockSimpleHttpRequest();
+ $request->setReturnReference("fetch", $response);
+ return $request;
+ }
+
+ function &_createMockedRequestUserAgent(&$request) {
+ $agent = &new MockRequestUserAgent();
+ $agent->setReturnReference('_createHttpRequest', $request);
+ $agent->SimpleUserAgent();
+ return $agent;
+ }
+
+ function testCookieJarIsSentToRequest() {
+ $jar = new SimpleCookieJar();
+ $jar->setCookie('a', 'A');
+
+ $request = &new MockSimpleHttpRequest();
+ $request->setReturnReference('fetch', $this->_createStandardResponse());
+ $request->expectOnce('readCookiesFromJar', array($jar, '*'));
+
+ $agent = &$this->_createMockedRequestUserAgent($request);
+ $agent->setCookie('a', 'A');
+ $agent->fetchResponse(
+ new SimpleUrl('http://this.com/this/path/page.html'),
+ new SimpleGetEncoding());
+ }
+
+ function testNoCookieJarIsSentToRequestWhenCookiesAreDisabled() {
+ $request = &new MockSimpleHttpRequest();
+ $request->setReturnReference('fetch', $this->_createStandardResponse());
+ $request->expectNever('readCookiesFromJar');
+
+ $agent = &$this->_createMockedRequestUserAgent($request);
+ $agent->setCookie('a', 'A');
+ $agent->ignoreCookies();
+ $agent->fetchResponse(
+ new SimpleUrl('http://this.com/this/path/page.html'),
+ new SimpleGetEncoding());
+ }
+
+ function testReadingNewCookie() {
+ $request = &$this->_createCookieSite('Set-cookie: a=AAAA');
+ $agent = &$this->_createMockedRequestUserAgent($request);
+ $agent->fetchResponse(
+ new SimpleUrl('http://this.com/this/path/page.html'),
+ new SimpleGetEncoding());
+ $this->assertEqual($agent->getCookieValue("this.com", "this/path/", "a"), "AAAA");
+ }
+
+ function testIgnoringNewCookieWhenCookiesDisabled() {
+ $request = &$this->_createCookieSite('Set-cookie: a=AAAA');
+ $agent = &$this->_createMockedRequestUserAgent($request);
+ $agent->ignoreCookies();
+ $agent->fetchResponse(
+ new SimpleUrl('http://this.com/this/path/page.html'),
+ new SimpleGetEncoding());
+ $this->assertIdentical($agent->getCookieValue("this.com", "this/path/", "a"), false);
+ }
+
+ function testOverwriteCookieThatAlreadyExists() {
+ $request = &$this->_createCookieSite('Set-cookie: a=AAAA');
+ $agent = &$this->_createMockedRequestUserAgent($request);
+ $agent->setCookie('a', 'A');
+ $agent->fetchResponse(
+ new SimpleUrl('http://this.com/this/path/page.html'),
+ new SimpleGetEncoding());
+ $this->assertEqual($agent->getCookieValue("this.com", "this/path/", "a"), "AAAA");
+ }
+
+ function testClearCookieBySettingExpiry() {
+ $request = &$this->_createCookieSite('Set-cookie: a=b');
+ $agent = &$this->_createMockedRequestUserAgent($request);
+
+ $agent->setCookie("a", "A", "this/path/", "Wed, 25-Dec-02 04:24:21 GMT");
+ $agent->fetchResponse(
+ new SimpleUrl('http://this.com/this/path/page.html'),
+ new SimpleGetEncoding());
+ $this->assertIdentical(
+ $agent->getCookieValue("this.com", "this/path/", "a"),
+ "b");
+ $agent->restart("Wed, 25-Dec-02 04:24:20 GMT");
+ $this->assertIdentical(
+ $agent->getCookieValue("this.com", "this/path/", "a"),
+ false);
+ }
+
+ function testAgeingAndClearing() {
+ $request = &$this->_createCookieSite('Set-cookie: a=A; expires=Wed, 25-Dec-02 04:24:21 GMT; path=/this/path');
+ $agent = &$this->_createMockedRequestUserAgent($request);
+
+ $agent->fetchResponse(
+ new SimpleUrl('http://this.com/this/path/page.html'),
+ new SimpleGetEncoding());
+ $agent->restart("Wed, 25-Dec-02 04:24:20 GMT");
+ $this->assertIdentical(
+ $agent->getCookieValue("this.com", "this/path/", "a"),
+ "A");
+ $agent->ageCookies(2);
+ $agent->restart("Wed, 25-Dec-02 04:24:20 GMT");
+ $this->assertIdentical(
+ $agent->getCookieValue("this.com", "this/path/", "a"),
+ false);
+ }
+
+ function testReadingIncomingAndSettingNewCookies() {
+ $request = &$this->_createCookieSite('Set-cookie: a=AAA');
+ $agent = &$this->_createMockedRequestUserAgent($request);
+
+ $this->assertNull($agent->getBaseCookieValue("a", false));
+ $agent->fetchResponse(
+ new SimpleUrl('http://this.com/this/path/page.html'),
+ new SimpleGetEncoding());
+ $agent->setCookie("b", "BBB", "this.com", "this/path/");
+ $this->assertEqual(
+ $agent->getBaseCookieValue("a", new SimpleUrl('http://this.com/this/path/page.html')),
+ "AAA");
+ $this->assertEqual(
+ $agent->getBaseCookieValue("b", new SimpleUrl('http://this.com/this/path/page.html')),
+ "BBB");
+ }
+}
+
+class TestOfHttpRedirects extends UnitTestCase {
+
+ function &createRedirect($content, $redirect) {
+ $headers = &new MockSimpleHttpHeaders();
+ $headers->setReturnValue('isRedirect', (boolean)$redirect);
+ $headers->setReturnValue('getLocation', $redirect);
+
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('getContent', $content);
+ $response->setReturnReference('getHeaders', $headers);
+
+ $request = &new MockSimpleHttpRequest();
+ $request->setReturnReference('fetch', $response);
+ return $request;
+ }
+
+ function testDisabledRedirects() {
+ $agent = &new MockRequestUserAgent();
+ $agent->setReturnReference(
+ '_createHttpRequest',
+ $this->createRedirect('stuff', 'there.html'));
+ $agent->expectOnce('_createHttpRequest');
+ $agent->SimpleUserAgent();
+
+ $agent->setMaximumRedirects(0);
+ $response = &$agent->fetchResponse(new SimpleUrl('here.html'), new SimpleGetEncoding());
+ $this->assertEqual($response->getContent(), 'stuff');
+ }
+
+ function testSingleRedirect() {
+ $agent = &new MockRequestUserAgent();
+ $agent->setReturnReferenceAt(
+ 0,
+ '_createHttpRequest',
+ $this->createRedirect('first', 'two.html'));
+ $agent->setReturnReferenceAt(
+ 1,
+ '_createHttpRequest',
+ $this->createRedirect('second', 'three.html'));
+ $agent->expectCallCount('_createHttpRequest', 2);
+ $agent->SimpleUserAgent();
+
+ $agent->setMaximumRedirects(1);
+ $response = &$agent->fetchResponse(new SimpleUrl('one.html'), new SimpleGetEncoding());
+ $this->assertEqual($response->getContent(), 'second');
+ }
+
+ function testDoubleRedirect() {
+ $agent = &new MockRequestUserAgent();
+ $agent->setReturnReferenceAt(
+ 0,
+ '_createHttpRequest',
+ $this->createRedirect('first', 'two.html'));
+ $agent->setReturnReferenceAt(
+ 1,
+ '_createHttpRequest',
+ $this->createRedirect('second', 'three.html'));
+ $agent->setReturnReferenceAt(
+ 2,
+ '_createHttpRequest',
+ $this->createRedirect('third', 'four.html'));
+ $agent->expectCallCount('_createHttpRequest', 3);
+ $agent->SimpleUserAgent();
+
+ $agent->setMaximumRedirects(2);
+ $response = &$agent->fetchResponse(new SimpleUrl('one.html'), new SimpleGetEncoding());
+ $this->assertEqual($response->getContent(), 'third');
+ }
+
+ function testSuccessAfterRedirect() {
+ $agent = &new MockRequestUserAgent();
+ $agent->setReturnReferenceAt(
+ 0,
+ '_createHttpRequest',
+ $this->createRedirect('first', 'two.html'));
+ $agent->setReturnReferenceAt(
+ 1,
+ '_createHttpRequest',
+ $this->createRedirect('second', false));
+ $agent->setReturnReferenceAt(
+ 2,
+ '_createHttpRequest',
+ $this->createRedirect('third', 'four.html'));
+ $agent->expectCallCount('_createHttpRequest', 2);
+ $agent->SimpleUserAgent();
+
+ $agent->setMaximumRedirects(2);
+ $response = &$agent->fetchResponse(new SimpleUrl('one.html'), new SimpleGetEncoding());
+ $this->assertEqual($response->getContent(), 'second');
+ }
+
+ function testRedirectChangesPostToGet() {
+ $agent = &new MockRequestUserAgent();
+ $agent->setReturnReferenceAt(
+ 0,
+ '_createHttpRequest',
+ $this->createRedirect('first', 'two.html'));
+ $agent->expectArgumentsAt(0, '_createHttpRequest', array('*', new IsAExpectation('SimplePostEncoding')));
+ $agent->setReturnReferenceAt(
+ 1,
+ '_createHttpRequest',
+ $this->createRedirect('second', 'three.html'));
+ $agent->expectArgumentsAt(1, '_createHttpRequest', array('*', new IsAExpectation('SimpleGetEncoding')));
+ $agent->expectCallCount('_createHttpRequest', 2);
+ $agent->SimpleUserAgent();
+ $agent->setMaximumRedirects(1);
+ $response = &$agent->fetchResponse(new SimpleUrl('one.html'), new SimplePostEncoding());
+ }
+}
+
+class TestOfBadHosts extends UnitTestCase {
+
+ function &_createSimulatedBadHost() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnValue('isError', true);
+ $response->setReturnValue('getError', 'Bad socket');
+ $response->setReturnValue('getContent', false);
+
+ $request = &new MockSimpleHttpRequest();
+ $request->setReturnReference('fetch', $response);
+ return $request;
+ }
+
+ function testUntestedHost() {
+ $request = &$this->_createSimulatedBadHost();
+
+ $agent = &new MockRequestUserAgent();
+ $agent->setReturnReference('_createHttpRequest', $request);
+ $agent->SimpleUserAgent();
+
+ $response = &$agent->fetchResponse(
+ new SimpleUrl('http://this.host/this/path/page.html'),
+ new SimpleGetEncoding());
+ $this->assertTrue($response->isError());
+ }
+}
+
+class TestOfAuthorisation extends UnitTestCase {
+
+ function testAuthenticateHeaderAdded() {
+ $response = &new MockSimpleHttpResponse();
+ $response->setReturnReference('getHeaders', new MockSimpleHttpHeaders());
+
+ $request = &new MockSimpleHttpRequest();
+ $request->setReturnReference('fetch', $response);
+ $request->expectOnce(
+ 'addHeaderLine',
+ array('Authorization: Basic ' . base64_encode('test:secret')));
+
+ $agent = &new MockRequestUserAgent();
+ $agent->setReturnReference('_createHttpRequest', $request);
+ $agent->SimpleUserAgent();
+ $response = &$agent->fetchResponse(
+ new SimpleUrl('http://test:secret@this.host'),
+ new SimpleGetEncoding());
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/visual_test.php b/tests/simpletest/test/visual_test.php
new file mode 100755
index 0000000000..0a3f3dffb2
--- /dev/null
+++ b/tests/simpletest/test/visual_test.php
@@ -0,0 +1,495 @@
+<?php
+ // $Id: visual_test.php,v 1.46 2007/07/04 00:42:05 lastcraft Exp $
+
+ // NOTE:
+ // Some of these tests are designed to fail! Do not be alarmed.
+ // ----------------
+
+ // The following tests are a bit hacky. Whilst Kent Beck tried to
+ // build a unit tester with a unit tester, I am not that brave.
+ // Instead I have just hacked together odd test scripts until
+ // I have enough of a tester to procede more formally.
+ //
+ // The proper tests start in all_tests.php
+ require_once('../unit_tester.php');
+ require_once('../shell_tester.php');
+ require_once('../mock_objects.php');
+ require_once('../reporter.php');
+ require_once('../xml.php');
+
+ class TestDisplayClass {
+ var $_a;
+
+ function TestDisplayClass($a) {
+ $this->_a = $a;
+ }
+ }
+
+ class PassingUnitTestCaseOutput extends UnitTestCase {
+
+ function testOfResults() {
+ $this->pass('Pass');
+ }
+
+ function testTrue() {
+ $this->assertTrue(true);
+ }
+
+ function testFalse() {
+ $this->assertFalse(false);
+ }
+
+ function testExpectation() {
+ $expectation = &new EqualExpectation(25, 'My expectation message: %s');
+ $this->assert($expectation, 25, 'My assert message : %s');
+ }
+
+ function testNull() {
+ $this->assertNull(null, "%s -> Pass");
+ $this->assertNotNull(false, "%s -> Pass");
+ }
+
+ function testType() {
+ $this->assertIsA("hello", "string", "%s -> Pass");
+ $this->assertIsA($this, "PassingUnitTestCaseOutput", "%s -> Pass");
+ $this->assertIsA($this, "UnitTestCase", "%s -> Pass");
+ }
+
+ function testTypeEquality() {
+ $this->assertEqual("0", 0, "%s -> Pass");
+ }
+
+ function testNullEquality() {
+ $this->assertNotEqual(null, 1, "%s -> Pass");
+ $this->assertNotEqual(1, null, "%s -> Pass");
+ }
+
+ function testIntegerEquality() {
+ $this->assertNotEqual(1, 2, "%s -> Pass");
+ }
+
+ function testStringEquality() {
+ $this->assertEqual("a", "a", "%s -> Pass");
+ $this->assertNotEqual("aa", "ab", "%s -> Pass");
+ }
+
+ function testHashEquality() {
+ $this->assertEqual(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "A"), "%s -> Pass");
+ }
+
+ function testWithin() {
+ $this->assertWithinMargin(5, 5.4, 0.5, "%s -> Pass");
+ }
+
+ function testOutside() {
+ $this->assertOutsideMargin(5, 5.6, 0.5, "%s -> Pass");
+ }
+
+ function testStringIdentity() {
+ $a = "fred";
+ $b = $a;
+ $this->assertIdentical($a, $b, "%s -> Pass");
+ }
+
+ function testTypeIdentity() {
+ $a = "0";
+ $b = 0;
+ $this->assertNotIdentical($a, $b, "%s -> Pass");
+ }
+
+ function testNullIdentity() {
+ $this->assertNotIdentical(null, 1, "%s -> Pass");
+ $this->assertNotIdentical(1, null, "%s -> Pass");
+ }
+
+ function testHashIdentity() {
+ }
+
+ function testObjectEquality() {
+ $this->assertEqual(new TestDisplayClass(4), new TestDisplayClass(4), "%s -> Pass");
+ $this->assertNotEqual(new TestDisplayClass(4), new TestDisplayClass(5), "%s -> Pass");
+ }
+
+ function testObjectIndentity() {
+ $this->assertIdentical(new TestDisplayClass(false), new TestDisplayClass(false), "%s -> Pass");
+ $this->assertNotIdentical(new TestDisplayClass(false), new TestDisplayClass(0), "%s -> Pass");
+ }
+
+ function testReference() {
+ $a = "fred";
+ $b = &$a;
+ $this->assertReference($a, $b, "%s -> Pass");
+ }
+
+ function testCloneOnDifferentObjects() {
+ $a = "fred";
+ $b = $a;
+ $c = "Hello";
+ $this->assertClone($a, $b, "%s -> Pass");
+ }
+
+ function testPatterns() {
+ $this->assertPattern('/hello/i', "Hello there", "%s -> Pass");
+ $this->assertNoPattern('/hello/', "Hello there", "%s -> Pass");
+ }
+
+ function testLongStrings() {
+ $text = "";
+ for ($i = 0; $i < 10; $i++) {
+ $text .= "0123456789";
+ }
+ $this->assertEqual($text, $text);
+ }
+ }
+
+ class FailingUnitTestCaseOutput extends UnitTestCase {
+
+ function testOfResults() {
+ $this->fail('Fail'); // Fail.
+ }
+
+ function testTrue() {
+ $this->assertTrue(false); // Fail.
+ }
+
+ function testFalse() {
+ $this->assertFalse(true); // Fail.
+ }
+
+ function testExpectation() {
+ $expectation = &new EqualExpectation(25, 'My expectation message: %s');
+ $this->assert($expectation, 24, 'My assert message : %s'); // Fail.
+ }
+
+ function testNull() {
+ $this->assertNull(false, "%s -> Fail"); // Fail.
+ $this->assertNotNull(null, "%s -> Fail"); // Fail.
+ }
+
+ function testType() {
+ $this->assertIsA(14, "string", "%s -> Fail"); // Fail.
+ $this->assertIsA(14, "TestOfUnitTestCaseOutput", "%s -> Fail"); // Fail.
+ $this->assertIsA($this, "TestReporter", "%s -> Fail"); // Fail.
+ }
+
+ function testTypeEquality() {
+ $this->assertNotEqual("0", 0, "%s -> Fail"); // Fail.
+ }
+
+ function testNullEquality() {
+ $this->assertEqual(null, 1, "%s -> Fail"); // Fail.
+ $this->assertEqual(1, null, "%s -> Fail"); // Fail.
+ }
+
+ function testIntegerEquality() {
+ $this->assertEqual(1, 2, "%s -> Fail"); // Fail.
+ }
+
+ function testStringEquality() {
+ $this->assertNotEqual("a", "a", "%s -> Fail"); // Fail.
+ $this->assertEqual("aa", "ab", "%s -> Fail"); // Fail.
+ }
+
+ function testHashEquality() {
+ $this->assertEqual(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "Z"), "%s -> Fail");
+ }
+
+ function testWithin() {
+ $this->assertWithinMargin(5, 5.6, 0.5, "%s -> Fail"); // Fail.
+ }
+
+ function testOutside() {
+ $this->assertOutsideMargin(5, 5.4, 0.5, "%s -> Fail"); // Fail.
+ }
+
+ function testStringIdentity() {
+ $a = "fred";
+ $b = $a;
+ $this->assertNotIdentical($a, $b, "%s -> Fail"); // Fail.
+ }
+
+ function testTypeIdentity() {
+ $a = "0";
+ $b = 0;
+ $this->assertIdentical($a, $b, "%s -> Fail"); // Fail.
+ }
+
+ function testNullIdentity() {
+ $this->assertIdentical(null, 1, "%s -> Fail"); // Fail.
+ $this->assertIdentical(1, null, "%s -> Fail"); // Fail.
+ }
+
+ function testHashIdentity() {
+ $this->assertIdentical(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "A"), "%s -> fail"); // Fail.
+ }
+
+ function testObjectEquality() {
+ $this->assertNotEqual(new TestDisplayClass(4), new TestDisplayClass(4), "%s -> Fail"); // Fail.
+ $this->assertEqual(new TestDisplayClass(4), new TestDisplayClass(5), "%s -> Fail"); // Fail.
+ }
+
+ function testObjectIndentity() {
+ $this->assertNotIdentical(new TestDisplayClass(false), new TestDisplayClass(false), "%s -> Fail"); // Fail.
+ $this->assertIdentical(new TestDisplayClass(false), new TestDisplayClass(0), "%s -> Fail"); // Fail.
+ }
+
+ function testReference() {
+ $a = "fred";
+ $b = &$a;
+ $this->assertClone($a, $b, "%s -> Fail"); // Fail.
+ }
+
+ function testCloneOnDifferentObjects() {
+ $a = "fred";
+ $b = $a;
+ $c = "Hello";
+ $this->assertClone($a, $c, "%s -> Fail"); // Fail.
+ }
+
+ function testPatterns() {
+ $this->assertPattern('/hello/', "Hello there", "%s -> Fail"); // Fail.
+ $this->assertNoPattern('/hello/i', "Hello there", "%s -> Fail"); // Fail.
+ }
+
+ function testLongStrings() {
+ $text = "";
+ for ($i = 0; $i < 10; $i++) {
+ $text .= "0123456789";
+ }
+ $this->assertEqual($text . $text, $text . "a" . $text); // Fail.
+ }
+ }
+
+ class Dummy {
+ function Dummy() {
+ }
+
+ function a() {
+ }
+ }
+ Mock::generate('Dummy');
+
+ class TestOfMockObjectsOutput extends UnitTestCase {
+
+ function testCallCounts() {
+ $dummy = &new MockDummy();
+ $dummy->expectCallCount('a', 1, 'My message: %s');
+ $dummy->a();
+ $dummy->a();
+ }
+
+ function testMinimumCallCounts() {
+ $dummy = &new MockDummy();
+ $dummy->expectMinimumCallCount('a', 2, 'My message: %s');
+ $dummy->a();
+ $dummy->a();
+ }
+
+ function testEmptyMatching() {
+ $dummy = &new MockDummy();
+ $dummy->expectArguments('a', array());
+ $dummy->a();
+ $dummy->a(null); // Fail.
+ }
+
+ function testEmptyMatchingWithCustomMessage() {
+ $dummy = &new MockDummy();
+ $dummy->expectArguments('a', array(), 'My expectation message: %s');
+ $dummy->a();
+ $dummy->a(null); // Fail.
+ }
+
+ function testNullMatching() {
+ $dummy = &new MockDummy();
+ $dummy->expectArguments('a', array(null));
+ $dummy->a(null);
+ $dummy->a(); // Fail.
+ }
+
+ function testBooleanMatching() {
+ $dummy = &new MockDummy();
+ $dummy->expectArguments('a', array(true, false));
+ $dummy->a(true, false);
+ $dummy->a(true, true); // Fail.
+ }
+
+ function testIntegerMatching() {
+ $dummy = &new MockDummy();
+ $dummy->expectArguments('a', array(32, 33));
+ $dummy->a(32, 33);
+ $dummy->a(32, 34); // Fail.
+ }
+
+ function testFloatMatching() {
+ $dummy = &new MockDummy();
+ $dummy->expectArguments('a', array(3.2, 3.3));
+ $dummy->a(3.2, 3.3);
+ $dummy->a(3.2, 3.4); // Fail.
+ }
+
+ function testStringMatching() {
+ $dummy = &new MockDummy();
+ $dummy->expectArguments('a', array('32', '33'));
+ $dummy->a('32', '33');
+ $dummy->a('32', '34'); // Fail.
+ }
+
+ function testEmptyMatchingWithCustomExpectationMessage() {
+ $dummy = &new MockDummy();
+ $dummy->expectArguments(
+ 'a',
+ array(new EqualExpectation('A', 'My part expectation message: %s')),
+ 'My expectation message: %s');
+ $dummy->a('A');
+ $dummy->a('B'); // Fail.
+ }
+
+ function testArrayMatching() {
+ $dummy = &new MockDummy();
+ $dummy->expectArguments('a', array(array(32), array(33)));
+ $dummy->a(array(32), array(33));
+ $dummy->a(array(32), array('33')); // Fail.
+ }
+
+ function testObjectMatching() {
+ $a = new Dummy();
+ $a->a = 'a';
+ $b = new Dummy();
+ $b->b = 'b';
+ $dummy = &new MockDummy();
+ $dummy->expectArguments('a', array($a, $b));
+ $dummy->a($a, $b);
+ $dummy->a($a, $a); // Fail.
+ }
+
+ function testBigList() {
+ $dummy = &new MockDummy();
+ $dummy->expectArguments('a', array(false, 0, 1, 1.0));
+ $dummy->a(false, 0, 1, 1.0);
+ $dummy->a(true, false, 2, 2.0); // Fail.
+ }
+ }
+
+ class TestOfPastBugs extends UnitTestCase {
+
+ function testMixedTypes() {
+ $this->assertEqual(array(), null, "%s -> Pass");
+ $this->assertIdentical(array(), null, "%s -> Fail"); // Fail.
+ }
+
+ function testMockWildcards() {
+ $dummy = &new MockDummy();
+ $dummy->expectArguments('a', array('*', array(33)));
+ $dummy->a(array(32), array(33));
+ $dummy->a(array(32), array('33')); // Fail.
+ }
+ }
+
+ class TestOfVisualShell extends ShellTestCase {
+
+ function testDump() {
+ $this->execute('ls');
+ $this->dumpOutput();
+ $this->execute('dir');
+ $this->dumpOutput();
+ }
+
+ function testDumpOfList() {
+ $this->execute('ls');
+ $this->dump($this->getOutputAsList());
+ }
+ }
+
+ class PassesAsWellReporter extends HtmlReporter {
+
+ function _getCss() {
+ return parent::_getCss() . ' .pass { color: darkgreen; }';
+ }
+
+ function paintPass($message) {
+ parent::paintPass($message);
+ print "<span class=\"pass\">Pass</span>: ";
+ $breadcrumb = $this->getTestList();
+ array_shift($breadcrumb);
+ print implode(" -&gt; ", $breadcrumb);
+ print " -&gt; " . htmlentities($message) . "<br />\n";
+ }
+
+ function paintSignal($type, &$payload) {
+ print "<span class=\"fail\">$type</span>: ";
+ $breadcrumb = $this->getTestList();
+ array_shift($breadcrumb);
+ print implode(" -&gt; ", $breadcrumb);
+ print " -&gt; " . htmlentities(serialize($payload)) . "<br />\n";
+ }
+ }
+
+ class TestOfSkippingNoMatterWhat extends UnitTestCase {
+ function skip() {
+ $this->skipIf(true, 'Always skipped -> %s');
+ }
+
+ function testFail() {
+ $this->fail('This really shouldn\'t have happened');
+ }
+ }
+
+ class TestOfSkippingOrElse extends UnitTestCase {
+ function skip() {
+ $this->skipUnless(false, 'Always skipped -> %s');
+ }
+
+ function testFail() {
+ $this->fail('This really shouldn\'t have happened');
+ }
+ }
+
+ class TestOfSkippingTwiceOver extends UnitTestCase {
+ function skip() {
+ $this->skipIf(true, 'First reason -> %s');
+ $this->skipIf(true, 'Second reason -> %s');
+ }
+
+ function testFail() {
+ $this->fail('This really shouldn\'t have happened');
+ }
+ }
+
+ class TestThatShouldNotBeSkipped extends UnitTestCase {
+ function skip() {
+ $this->skipIf(false);
+ $this->skipUnless(true);
+ }
+
+ function testFail() {
+ $this->fail('We should see this message');
+ }
+
+ function testPass() {
+ $this->pass('We should see this message');
+ }
+ }
+
+ $test = &new TestSuite('Visual test with 46 passes, 47 fails and 0 exceptions');
+ $test->addTestCase(new PassingUnitTestCaseOutput());
+ $test->addTestCase(new FailingUnitTestCaseOutput());
+ $test->addTestCase(new TestOfMockObjectsOutput());
+ $test->addTestCase(new TestOfPastBugs());
+ $test->addTestCase(new TestOfVisualShell());
+ $test->addTestCase(new TestOfSkippingNoMatterWhat());
+ $test->addTestCase(new TestOfSkippingOrElse());
+ $test->addTestCase(new TestOfSkippingTwiceOver());
+ $test->addTestCase(new TestThatShouldNotBeSkipped());
+
+ if (isset($_GET['xml']) || in_array('xml', (isset($argv) ? $argv : array()))) {
+ $reporter = &new XmlReporter();
+ } elseif (TextReporter::inCli()) {
+ $reporter = &new TextReporter();
+ } else {
+ $reporter = &new PassesAsWellReporter();
+ }
+ if (isset($_GET['dry']) || in_array('dry', (isset($argv) ? $argv : array()))) {
+ $reporter->makeDry();
+ }
+ exit ($test->run($reporter) ? 0 : 1);
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/web_tester_test.php b/tests/simpletest/test/web_tester_test.php
new file mode 100755
index 0000000000..2d3c341640
--- /dev/null
+++ b/tests/simpletest/test/web_tester_test.php
@@ -0,0 +1,156 @@
+<?php
+// $Id: web_tester_test.php,v 1.16 2007/05/08 22:08:06 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../web_tester.php');
+
+class TestOfFieldExpectation extends UnitTestCase {
+
+ function testStringMatchingIsCaseSensitive() {
+ $expectation = new FieldExpectation('a');
+ $this->assertTrue($expectation->test('a'));
+ $this->assertTrue($expectation->test(array('a')));
+ $this->assertFalse($expectation->test('A'));
+ }
+
+ function testMatchesInteger() {
+ $expectation = new FieldExpectation('1');
+ $this->assertTrue($expectation->test('1'));
+ $this->assertTrue($expectation->test(1));
+ $this->assertTrue($expectation->test(array('1')));
+ $this->assertTrue($expectation->test(array(1)));
+ }
+
+ function testNonStringFailsExpectation() {
+ $expectation = new FieldExpectation('a');
+ $this->assertFalse($expectation->test(null));
+ }
+
+ function testUnsetFieldCanBeTestedFor() {
+ $expectation = new FieldExpectation(false);
+ $this->assertTrue($expectation->test(false));
+ }
+
+ function testMultipleValuesCanBeInAnyOrder() {
+ $expectation = new FieldExpectation(array('a', 'b'));
+ $this->assertTrue($expectation->test(array('a', 'b')));
+ $this->assertTrue($expectation->test(array('b', 'a')));
+ $this->assertFalse($expectation->test(array('a', 'a')));
+ $this->assertFalse($expectation->test('a'));
+ }
+
+ function testSingleItemCanBeArrayOrString() {
+ $expectation = new FieldExpectation(array('a'));
+ $this->assertTrue($expectation->test(array('a')));
+ $this->assertTrue($expectation->test('a'));
+ }
+}
+
+class TestOfHeaderExpectations extends UnitTestCase {
+
+ function testExpectingOnlyTheHeaderName() {
+ $expectation = new HttpHeaderExpectation('a');
+ $this->assertIdentical($expectation->test(false), false);
+ $this->assertIdentical($expectation->test('a: A'), true);
+ $this->assertIdentical($expectation->test('A: A'), true);
+ $this->assertIdentical($expectation->test('a: B'), true);
+ $this->assertIdentical($expectation->test(' a : A '), true);
+ }
+
+ function testHeaderValueAsWell() {
+ $expectation = new HttpHeaderExpectation('a', 'A');
+ $this->assertIdentical($expectation->test(false), false);
+ $this->assertIdentical($expectation->test('a: A'), true);
+ $this->assertIdentical($expectation->test('A: A'), true);
+ $this->assertIdentical($expectation->test('A: a'), false);
+ $this->assertIdentical($expectation->test('a: B'), false);
+ $this->assertIdentical($expectation->test(' a : A '), true);
+ $this->assertIdentical($expectation->test(' a : AB '), false);
+ }
+
+ function testHeaderValueWithColons() {
+ $expectation = new HttpHeaderExpectation('a', 'A:B:C');
+ $this->assertIdentical($expectation->test('a: A'), false);
+ $this->assertIdentical($expectation->test('a: A:B'), false);
+ $this->assertIdentical($expectation->test('a: A:B:C'), true);
+ $this->assertIdentical($expectation->test('a: A:B:C:D'), false);
+ }
+
+ function testMultilineSearch() {
+ $expectation = new HttpHeaderExpectation('a', 'A');
+ $this->assertIdentical($expectation->test("aa: A\r\nb: B\r\nc: C"), false);
+ $this->assertIdentical($expectation->test("aa: A\r\na: A\r\nb: B"), true);
+ }
+
+ function testMultilineSearchWithPadding() {
+ $expectation = new HttpHeaderExpectation('a', ' A ');
+ $this->assertIdentical($expectation->test("aa:A\r\nb:B\r\nc:C"), false);
+ $this->assertIdentical($expectation->test("aa:A\r\na:A\r\nb:B"), true);
+ }
+
+ function testPatternMatching() {
+ $expectation = new HttpHeaderExpectation('a', new PatternExpectation('/A/'));
+ $this->assertIdentical($expectation->test('a: A'), true);
+ $this->assertIdentical($expectation->test('A: A'), true);
+ $this->assertIdentical($expectation->test('A: a'), false);
+ $this->assertIdentical($expectation->test('a: B'), false);
+ $this->assertIdentical($expectation->test(' a : A '), true);
+ $this->assertIdentical($expectation->test(' a : AB '), true);
+ }
+
+ function testCaseInsensitivePatternMatching() {
+ $expectation = new HttpHeaderExpectation('a', new PatternExpectation('/A/i'));
+ $this->assertIdentical($expectation->test('a: a'), true);
+ $this->assertIdentical($expectation->test('a: B'), false);
+ $this->assertIdentical($expectation->test(' a : A '), true);
+ $this->assertIdentical($expectation->test(' a : BAB '), true);
+ $this->assertIdentical($expectation->test(' a : bab '), true);
+ }
+
+ function testUnwantedHeader() {
+ $expectation = new NoHttpHeaderExpectation('a');
+ $this->assertIdentical($expectation->test(''), true);
+ $this->assertIdentical($expectation->test('stuff'), true);
+ $this->assertIdentical($expectation->test('b: B'), true);
+ $this->assertIdentical($expectation->test('a: A'), false);
+ $this->assertIdentical($expectation->test('A: A'), false);
+ }
+
+ function testMultilineUnwantedSearch() {
+ $expectation = new NoHttpHeaderExpectation('a');
+ $this->assertIdentical($expectation->test("aa:A\r\nb:B\r\nc:C"), true);
+ $this->assertIdentical($expectation->test("aa:A\r\na:A\r\nb:B"), false);
+ }
+
+ function testLocationHeaderSplitsCorrectly() {
+ $expectation = new HttpHeaderExpectation('Location', 'http://here/');
+ $this->assertIdentical($expectation->test('Location: http://here/'), true);
+ }
+}
+
+class TestOfTextExpectations extends UnitTestCase {
+
+ function testMatchingSubString() {
+ $expectation = new TextExpectation('wanted');
+ $this->assertIdentical($expectation->test(''), false);
+ $this->assertIdentical($expectation->test('Wanted'), false);
+ $this->assertIdentical($expectation->test('wanted'), true);
+ $this->assertIdentical($expectation->test('the wanted text is here'), true);
+ }
+
+ function testNotMatchingSubString() {
+ $expectation = new NoTextExpectation('wanted');
+ $this->assertIdentical($expectation->test(''), true);
+ $this->assertIdentical($expectation->test('Wanted'), true);
+ $this->assertIdentical($expectation->test('wanted'), false);
+ $this->assertIdentical($expectation->test('the wanted text is here'), false);
+ }
+}
+
+class TestOfGenericAssertionsInWebTester extends WebTestCase {
+
+ function testEquality() {
+ $this->assertEqual('a', 'a');
+ $this->assertNotEqual('a', 'A');
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test/xml_test.php b/tests/simpletest/test/xml_test.php
new file mode 100755
index 0000000000..0d2bb3e346
--- /dev/null
+++ b/tests/simpletest/test/xml_test.php
@@ -0,0 +1,187 @@
+<?php
+// $Id: xml_test.php,v 1.23 2007/05/08 22:08:06 lastcraft Exp $
+require_once(dirname(__FILE__) . '/../autorun.php');
+require_once(dirname(__FILE__) . '/../xml.php');
+Mock::generate('SimpleScorer');
+
+if (! function_exists('xml_parser_create')) {
+ SimpleTest::ignore('TestOfXmlStructureParsing');
+ SimpleTest::ignore('TestOfXmlResultsParsing');
+}
+
+class TestOfNestingTags extends UnitTestCase {
+ function testGroupSize() {
+ $nesting = new NestingGroupTag(array('SIZE' => 2));
+ $this->assertEqual($nesting->getSize(), 2);
+ }
+}
+
+class TestOfXmlStructureParsing extends UnitTestCase {
+ function testValidXml() {
+ $listener = &new MockSimpleScorer();
+ $listener->expectNever('paintGroupStart');
+ $listener->expectNever('paintGroupEnd');
+ $listener->expectNever('paintCaseStart');
+ $listener->expectNever('paintCaseEnd');
+ $parser = &new SimpleTestXmlParser($listener);
+ $this->assertTrue($parser->parse("<?xml version=\"1.0\"?>\n"));
+ $this->assertTrue($parser->parse("<run>\n"));
+ $this->assertTrue($parser->parse("</run>\n"));
+ }
+
+ function testEmptyGroup() {
+ $listener = &new MockSimpleScorer();
+ $listener->expectOnce('paintGroupStart', array('a_group', 7));
+ $listener->expectOnce('paintGroupEnd', array('a_group'));
+ $parser = &new SimpleTestXmlParser($listener);
+ $parser->parse("<?xml version=\"1.0\"?>\n");
+ $parser->parse("<run>\n");
+ $this->assertTrue($parser->parse("<group size=\"7\">\n"));
+ $this->assertTrue($parser->parse("<name>a_group</name>\n"));
+ $this->assertTrue($parser->parse("</group>\n"));
+ $parser->parse("</run>\n");
+ }
+
+ function testEmptyCase() {
+ $listener = &new MockSimpleScorer();
+ $listener->expectOnce('paintCaseStart', array('a_case'));
+ $listener->expectOnce('paintCaseEnd', array('a_case'));
+ $parser = &new SimpleTestXmlParser($listener);
+ $parser->parse("<?xml version=\"1.0\"?>\n");
+ $parser->parse("<run>\n");
+ $this->assertTrue($parser->parse("<case>\n"));
+ $this->assertTrue($parser->parse("<name>a_case</name>\n"));
+ $this->assertTrue($parser->parse("</case>\n"));
+ $parser->parse("</run>\n");
+ }
+
+ function testEmptyMethod() {
+ $listener = &new MockSimpleScorer();
+ $listener->expectOnce('paintCaseStart', array('a_case'));
+ $listener->expectOnce('paintCaseEnd', array('a_case'));
+ $listener->expectOnce('paintMethodStart', array('a_method'));
+ $listener->expectOnce('paintMethodEnd', array('a_method'));
+ $parser = &new SimpleTestXmlParser($listener);
+ $parser->parse("<?xml version=\"1.0\"?>\n");
+ $parser->parse("<run>\n");
+ $parser->parse("<case>\n");
+ $parser->parse("<name>a_case</name>\n");
+ $this->assertTrue($parser->parse("<test>\n"));
+ $this->assertTrue($parser->parse("<name>a_method</name>\n"));
+ $this->assertTrue($parser->parse("</test>\n"));
+ $parser->parse("</case>\n");
+ $parser->parse("</run>\n");
+ }
+
+ function testNestedGroup() {
+ $listener = &new MockSimpleScorer();
+ $listener->expectArgumentsAt(0, 'paintGroupStart', array('a_group', 7));
+ $listener->expectArgumentsAt(1, 'paintGroupStart', array('b_group', 3));
+ $listener->expectCallCount('paintGroupStart', 2);
+ $listener->expectArgumentsAt(0, 'paintGroupEnd', array('b_group'));
+ $listener->expectArgumentsAt(1, 'paintGroupEnd', array('a_group'));
+ $listener->expectCallCount('paintGroupEnd', 2);
+
+ $parser = &new SimpleTestXmlParser($listener);
+ $parser->parse("<?xml version=\"1.0\"?>\n");
+ $parser->parse("<run>\n");
+
+ $this->assertTrue($parser->parse("<group size=\"7\">\n"));
+ $this->assertTrue($parser->parse("<name>a_group</name>\n"));
+ $this->assertTrue($parser->parse("<group size=\"3\">\n"));
+ $this->assertTrue($parser->parse("<name>b_group</name>\n"));
+ $this->assertTrue($parser->parse("</group>\n"));
+ $this->assertTrue($parser->parse("</group>\n"));
+ $parser->parse("</run>\n");
+ }
+}
+
+class AnyOldSignal {
+ var $stuff = true;
+}
+
+class TestOfXmlResultsParsing extends UnitTestCase {
+
+ function sendValidStart(&$parser) {
+ $parser->parse("<?xml version=\"1.0\"?>\n");
+ $parser->parse("<run>\n");
+ $parser->parse("<case>\n");
+ $parser->parse("<name>a_case</name>\n");
+ $parser->parse("<test>\n");
+ $parser->parse("<name>a_method</name>\n");
+ }
+
+ function sendValidEnd(&$parser) {
+ $parser->parse("</test>\n");
+ $parser->parse("</case>\n");
+ $parser->parse("</run>\n");
+ }
+
+ function testPass() {
+ $listener = &new MockSimpleScorer();
+ $listener->expectOnce('paintPass', array('a_message'));
+ $parser = &new SimpleTestXmlParser($listener);
+ $this->sendValidStart($parser);
+ $this->assertTrue($parser->parse("<pass>a_message</pass>\n"));
+ $this->sendValidEnd($parser);
+ }
+
+ function testFail() {
+ $listener = &new MockSimpleScorer();
+ $listener->expectOnce('paintFail', array('a_message'));
+ $parser = &new SimpleTestXmlParser($listener);
+ $this->sendValidStart($parser);
+ $this->assertTrue($parser->parse("<fail>a_message</fail>\n"));
+ $this->sendValidEnd($parser);
+ }
+
+ function testException() {
+ $listener = &new MockSimpleScorer();
+ $listener->expectOnce('paintError', array('a_message'));
+ $parser = &new SimpleTestXmlParser($listener);
+ $this->sendValidStart($parser);
+ $this->assertTrue($parser->parse("<exception>a_message</exception>\n"));
+ $this->sendValidEnd($parser);
+ }
+
+ function testSkip() {
+ $listener = &new MockSimpleScorer();
+ $listener->expectOnce('paintSkip', array('a_message'));
+ $parser = &new SimpleTestXmlParser($listener);
+ $this->sendValidStart($parser);
+ $this->assertTrue($parser->parse("<skip>a_message</skip>\n"));
+ $this->sendValidEnd($parser);
+ }
+
+ function testSignal() {
+ $signal = new AnyOldSignal();
+ $signal->stuff = "Hello";
+ $listener = &new MockSimpleScorer();
+ $listener->expectOnce('paintSignal', array('a_signal', $signal));
+ $parser = &new SimpleTestXmlParser($listener);
+ $this->sendValidStart($parser);
+ $this->assertTrue($parser->parse(
+ "<signal type=\"a_signal\"><![CDATA[" .
+ serialize($signal) . "]]></signal>\n"));
+ $this->sendValidEnd($parser);
+ }
+
+ function testMessage() {
+ $listener = &new MockSimpleScorer();
+ $listener->expectOnce('paintMessage', array('a_message'));
+ $parser = &new SimpleTestXmlParser($listener);
+ $this->sendValidStart($parser);
+ $this->assertTrue($parser->parse("<message>a_message</message>\n"));
+ $this->sendValidEnd($parser);
+ }
+
+ function testFormattedMessage() {
+ $listener = &new MockSimpleScorer();
+ $listener->expectOnce('paintFormattedMessage', array("\na\tmessage\n"));
+ $parser = &new SimpleTestXmlParser($listener);
+ $this->sendValidStart($parser);
+ $this->assertTrue($parser->parse("<formatted><![CDATA[\na\tmessage\n]]></formatted>\n"));
+ $this->sendValidEnd($parser);
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/simpletest/test_case.php b/tests/simpletest/test_case.php
new file mode 100755
index 0000000000..0a5d608420
--- /dev/null
+++ b/tests/simpletest/test_case.php
@@ -0,0 +1,669 @@
+<?php
+ /**
+ * Base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: test_case.php,v 1.44 2007/06/09 08:38:09 pachanga Exp $
+ */
+
+ /**#@+
+ * Includes SimpleTest files and defined the root constant
+ * for dependent libraries.
+ */
+ require_once(dirname(__FILE__) . '/invoker.php');
+ require_once(dirname(__FILE__) . '/errors.php');
+ require_once(dirname(__FILE__) . '/compatibility.php');
+ require_once(dirname(__FILE__) . '/scorer.php');
+ require_once(dirname(__FILE__) . '/expectation.php');
+ require_once(dirname(__FILE__) . '/dumper.php');
+ require_once(dirname(__FILE__) . '/simpletest.php');
+ if (version_compare(phpversion(), '5') >= 0) {
+ require_once(dirname(__FILE__) . '/exceptions.php');
+ require_once(dirname(__FILE__) . '/reflection_php5.php');
+ } else {
+ require_once(dirname(__FILE__) . '/reflection_php4.php');
+ }
+ if (! defined('SIMPLE_TEST')) {
+ /**
+ * @ignore
+ */
+ define('SIMPLE_TEST', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+ }
+ /**#@-*/
+
+ /**
+ * Basic test case. This is the smallest unit of a test
+ * suite. It searches for
+ * all methods that start with the the string "test" and
+ * runs them. Working test cases extend this class.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class SimpleTestCase {
+ var $_label = false;
+ var $_reporter;
+ var $_observers;
+ var $_should_skip = false;
+
+ /**
+ * Sets up the test with no display.
+ * @param string $label If no test name is given then
+ * the class name is used.
+ * @access public
+ */
+ function SimpleTestCase($label = false) {
+ if ($label) {
+ $this->_label = $label;
+ }
+ }
+
+ /**
+ * Accessor for the test name for subclasses.
+ * @return string Name of the test.
+ * @access public
+ */
+ function getLabel() {
+ return $this->_label ? $this->_label : get_class($this);
+ }
+
+ /**
+ * This is a placeholder for skipping tests. In this
+ * method you place skipIf() and skipUnless() calls to
+ * set the skipping state.
+ * @access public
+ */
+ function skip() {
+ }
+
+ /**
+ * Will issue a message to the reporter and tell the test
+ * case to skip if the incoming flag is true.
+ * @param string $should_skip Condition causing the tests to be skipped.
+ * @param string $message Text of skip condition.
+ * @access public
+ */
+ function skipIf($should_skip, $message = '%s') {
+ if ($should_skip && ! $this->_should_skip) {
+ $this->_should_skip = true;
+ $message = sprintf($message, 'Skipping [' . get_class($this) . ']');
+ $this->_reporter->paintSkip($message . $this->getAssertionLine());
+ }
+ }
+
+ /**
+ * Will issue a message to the reporter and tell the test
+ * case to skip if the incoming flag is false.
+ * @param string $shouldnt_skip Condition causing the tests to be run.
+ * @param string $message Text of skip condition.
+ * @access public
+ */
+ function skipUnless($shouldnt_skip, $message = false) {
+ $this->skipIf(! $shouldnt_skip, $message);
+ }
+
+ /**
+ * Used to invoke the single tests.
+ * @return SimpleInvoker Individual test runner.
+ * @access public
+ */
+ function &createInvoker() {
+ $invoker = &new SimpleErrorTrappingInvoker(new SimpleInvoker($this));
+ if (version_compare(phpversion(), '5') >= 0) {
+ $invoker = &new SimpleExceptionTrappingInvoker($invoker);
+ }
+ return $invoker;
+ }
+
+ /**
+ * Uses reflection to run every method within itself
+ * starting with the string "test" unless a method
+ * is specified.
+ * @param SimpleReporter $reporter Current test reporter.
+ * @return boolean True if all tests passed.
+ * @access public
+ */
+ function run(&$reporter) {
+ $context = &SimpleTest::getContext();
+ $context->setTest($this);
+ $context->setReporter($reporter);
+ $this->_reporter = &$reporter;
+ $started = false;
+ foreach ($this->getTests() as $method) {
+ if ($reporter->shouldInvoke($this->getLabel(), $method)) {
+ $this->skip();
+ if ($this->_should_skip) {
+ break;
+ }
+ if (! $started) {
+ $reporter->paintCaseStart($this->getLabel());
+ $started = true;
+ }
+ $invoker = &$this->_reporter->createInvoker($this->createInvoker());
+ $invoker->before($method);
+ $invoker->invoke($method);
+ $invoker->after($method);
+ }
+ }
+ if ($started) {
+ $reporter->paintCaseEnd($this->getLabel());
+ }
+ unset($this->_reporter);
+ return $reporter->getStatus();
+ }
+
+ /**
+ * Gets a list of test names. Normally that will
+ * be all internal methods that start with the
+ * name "test". This method should be overridden
+ * if you want a different rule.
+ * @return array List of test names.
+ * @access public
+ */
+ function getTests() {
+ $methods = array();
+ foreach (get_class_methods(get_class($this)) as $method) {
+ if ($this->_isTest($method)) {
+ $methods[] = $method;
+ }
+ }
+ return $methods;
+ }
+
+ /**
+ * Tests to see if the method is a test that should
+ * be run. Currently any method that starts with 'test'
+ * is a candidate unless it is the constructor.
+ * @param string $method Method name to try.
+ * @return boolean True if test method.
+ * @access protected
+ */
+ function _isTest($method) {
+ if (strtolower(substr($method, 0, 4)) == 'test') {
+ return ! SimpleTestCompatibility::isA($this, strtolower($method));
+ }
+ return false;
+ }
+
+ /**
+ * Announces the start of the test.
+ * @param string $method Test method just started.
+ * @access public
+ */
+ function before($method) {
+ $this->_reporter->paintMethodStart($method);
+ $this->_observers = array();
+ }
+
+ /**
+ * Sets up unit test wide variables at the start
+ * of each test method. To be overridden in
+ * actual user test cases.
+ * @access public
+ */
+ function setUp() {
+ }
+
+ /**
+ * Clears the data set in the setUp() method call.
+ * To be overridden by the user in actual user test cases.
+ * @access public
+ */
+ function tearDown() {
+ }
+
+ /**
+ * Announces the end of the test. Includes private clean up.
+ * @param string $method Test method just finished.
+ * @access public
+ */
+ function after($method) {
+ for ($i = 0; $i < count($this->_observers); $i++) {
+ $this->_observers[$i]->atTestEnd($method, $this);
+ }
+ $this->_reporter->paintMethodEnd($method);
+ }
+
+ /**
+ * Sets up an observer for the test end.
+ * @param object $observer Must have atTestEnd()
+ * method.
+ * @access public
+ */
+ function tell(&$observer) {
+ $this->_observers[] = &$observer;
+ }
+
+ /**
+ * @deprecated
+ */
+ function pass($message = "Pass") {
+ if (! isset($this->_reporter)) {
+ trigger_error('Can only make assertions within test methods');
+ }
+ $this->_reporter->paintPass(
+ $message . $this->getAssertionLine());
+ return true;
+ }
+
+ /**
+ * Sends a fail event with a message.
+ * @param string $message Message to send.
+ * @access public
+ */
+ function fail($message = "Fail") {
+ if (! isset($this->_reporter)) {
+ trigger_error('Can only make assertions within test methods');
+ }
+ $this->_reporter->paintFail(
+ $message . $this->getAssertionLine());
+ return false;
+ }
+
+ /**
+ * Formats a PHP error and dispatches it to the
+ * reporter.
+ * @param integer $severity PHP error code.
+ * @param string $message Text of error.
+ * @param string $file File error occoured in.
+ * @param integer $line Line number of error.
+ * @access public
+ */
+ function error($severity, $message, $file, $line) {
+ if (! isset($this->_reporter)) {
+ trigger_error('Can only make assertions within test methods');
+ }
+ $this->_reporter->paintError(
+ "Unexpected PHP error [$message] severity [$severity] in [$file line $line]");
+ }
+
+ /**
+ * Formats an exception and dispatches it to the
+ * reporter.
+ * @param Exception $exception Object thrown.
+ * @access public
+ */
+ function exception($exception) {
+ $this->_reporter->paintException($exception);
+ }
+
+ /**
+ * @deprecated
+ */
+ function signal($type, &$payload) {
+ if (! isset($this->_reporter)) {
+ trigger_error('Can only make assertions within test methods');
+ }
+ $this->_reporter->paintSignal($type, $payload);
+ }
+
+ /**
+ * Runs an expectation directly, for extending the
+ * tests with new expectation classes.
+ * @param SimpleExpectation $expectation Expectation subclass.
+ * @param mixed $compare Value to compare.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assert(&$expectation, $compare, $message = '%s') {
+ if ($expectation->test($compare)) {
+ return $this->pass(sprintf(
+ $message,
+ $expectation->overlayMessage($compare, $this->_reporter->getDumper())));
+ } else {
+ return $this->fail(sprintf(
+ $message,
+ $expectation->overlayMessage($compare, $this->_reporter->getDumper())));
+ }
+ }
+
+ /**
+ * @deprecated
+ */
+ function assertExpectation(&$expectation, $compare, $message = '%s') {
+ return $this->assert($expectation, $compare, $message);
+ }
+
+ /**
+ * Uses a stack trace to find the line of an assertion.
+ * @return string Line number of first assert*
+ * method embedded in format string.
+ * @access public
+ */
+ function getAssertionLine() {
+ $trace = new SimpleStackTrace(array('assert', 'expect', 'pass', 'fail', 'skip'));
+ return $trace->traceMethod();
+ }
+
+ /**
+ * Sends a formatted dump of a variable to the
+ * test suite for those emergency debugging
+ * situations.
+ * @param mixed $variable Variable to display.
+ * @param string $message Message to display.
+ * @return mixed The original variable.
+ * @access public
+ */
+ function dump($variable, $message = false) {
+ $dumper = $this->_reporter->getDumper();
+ $formatted = $dumper->dump($variable);
+ if ($message) {
+ $formatted = $message . "\n" . $formatted;
+ }
+ $this->_reporter->paintFormattedMessage($formatted);
+ return $variable;
+ }
+
+ /**
+ * @deprecated
+ */
+ function sendMessage($message) {
+ $this->_reporter->PaintMessage($message);
+ }
+
+ /**
+ * Accessor for the number of subtests.
+ * @return integer Number of test cases.
+ * @access public
+ * @static
+ */
+ function getSize() {
+ return 1;
+ }
+ }
+
+ /**
+ * Helps to extract test cases automatically from a file.
+ */
+ class SimpleFileLoader {
+
+ /**
+ * Builds a test suite from a library of test cases.
+ * The new suite is composed into this one.
+ * @param string $test_file File name of library with
+ * test case classes.
+ * @return TestSuite The new test suite.
+ * @access public
+ */
+ function &load($test_file) {
+ $existing_classes = get_declared_classes();
+ include_once($test_file);
+ $classes = $this->selectRunnableTests(
+ array_diff(get_declared_classes(), $existing_classes));
+ $suite = &$this->createSuiteFromClasses($test_file, $classes);
+ return $suite;
+ }
+
+ /**
+ * Calculates the incoming test cases. Skips abstract
+ * and ignored classes.
+ * @param array $candidates Candidate classes.
+ * @return array New classes which are test
+ * cases that shouldn't be ignored.
+ * @access public
+ */
+ function selectRunnableTests($candidates) {
+ $classes = array();
+ foreach ($candidates as $class) {
+ if (TestSuite::getBaseTestCase($class)) {
+ $reflection = new SimpleReflection($class);
+ if ($reflection->isAbstract()) {
+ SimpleTest::ignore($class);
+ }
+ $classes[] = $class;
+ }
+ }
+ return $classes;
+ }
+
+ /**
+ * Builds a test suite from a class list.
+ * @param string $title Title of new group.
+ * @param array $classes Test classes.
+ * @return TestSuite Group loaded with the new
+ * test cases.
+ * @access public
+ */
+ function &createSuiteFromClasses($title, $classes) {
+ if (count($classes) == 0) {
+ $suite = &new BadTestSuite($title, "No runnable test cases in [$title]");
+ return $suite;
+ }
+ SimpleTest::ignoreParentsIfIgnored($classes);
+ $suite = &new TestSuite($title);
+ foreach ($classes as $class) {
+ if (! SimpleTest::isIgnored($class)) {
+ $suite->addTestClass($class);
+ }
+ }
+ return $suite;
+ }
+ }
+
+ /**
+ * This is a composite test class for combining
+ * test cases and other RunnableTest classes into
+ * a group test.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class TestSuite {
+ var $_label;
+ var $_test_cases;
+
+ /**
+ * Sets the name of the test suite.
+ * @param string $label Name sent at the start and end
+ * of the test.
+ * @access public
+ */
+ function TestSuite($label = false) {
+ $this->_label = $label;
+ $this->_test_cases = array();
+ }
+
+ /**
+ * Accessor for the test name for subclasses. If the suite
+ * wraps a single test case the label defaults to the name of that test.
+ * @return string Name of the test.
+ * @access public
+ */
+ function getLabel() {
+ if (! $this->_label) {
+ return ($this->getSize() == 1) ?
+ get_class($this->_test_cases[0]) : get_class($this);
+ } else {
+ return $this->_label;
+ }
+ }
+
+ /**
+ * @deprecated
+ */
+ function addTestCase(&$test_case) {
+ $this->_test_cases[] = &$test_case;
+ }
+
+ /**
+ * @deprecated
+ */
+ function addTestClass($class) {
+ if (TestSuite::getBaseTestCase($class) == 'testsuite') {
+ $this->_test_cases[] = &new $class();
+ } else {
+ $this->_test_cases[] = $class;
+ }
+ }
+
+ /**
+ * Adds a test into the suite by instance or class. The class will
+ * be instantiated if it's a test suite.
+ * @param SimpleTestCase $test_case Suite or individual test
+ * case implementing the
+ * runnable test interface.
+ * @access public
+ */
+ function add(&$test_case) {
+ if (! is_string($test_case)) {
+ $this->_test_cases[] = &$test_case;
+ } elseif (TestSuite::getBaseTestCase($class) == 'testsuite') {
+ $this->_test_cases[] = &new $class();
+ } else {
+ $this->_test_cases[] = $class;
+ }
+ }
+
+ /**
+ * @deprecated
+ */
+ function addTestFile($test_file) {
+ $this->addFile($test_file);
+ }
+
+ /**
+ * Builds a test suite from a library of test cases.
+ * The new suite is composed into this one.
+ * @param string $test_file File name of library with
+ * test case classes.
+ * @access public
+ */
+ function addFile($test_file) {
+ $extractor = new SimpleFileLoader();
+ $this->add($extractor->load($test_file));
+ }
+
+ /**
+ * Delegates to a visiting collector to add test
+ * files.
+ * @param string $path Path to scan from.
+ * @param SimpleCollector $collector Directory scanner.
+ * @access public
+ */
+ function collect($path, &$collector) {
+ $collector->collect($this, $path);
+ }
+
+ /**
+ * Invokes run() on all of the held test cases, instantiating
+ * them if necessary.
+ * @param SimpleReporter $reporter Current test reporter.
+ * @access public
+ */
+ function run(&$reporter) {
+ $reporter->paintGroupStart($this->getLabel(), $this->getSize());
+ for ($i = 0, $count = count($this->_test_cases); $i < $count; $i++) {
+ if (is_string($this->_test_cases[$i])) {
+ $class = $this->_test_cases[$i];
+ $test = &new $class();
+ $test->run($reporter);
+ unset($test);
+ } else {
+ $this->_test_cases[$i]->run($reporter);
+ }
+ }
+ $reporter->paintGroupEnd($this->getLabel());
+ return $reporter->getStatus();
+ }
+
+ /**
+ * Number of contained test cases.
+ * @return integer Total count of cases in the group.
+ * @access public
+ */
+ function getSize() {
+ $count = 0;
+ foreach ($this->_test_cases as $case) {
+ if (is_string($case)) {
+ $count++;
+ } else {
+ $count += $case->getSize();
+ }
+ }
+ return $count;
+ }
+
+ /**
+ * Test to see if a class is derived from the
+ * SimpleTestCase class.
+ * @param string $class Class name.
+ * @access public
+ * @static
+ */
+ function getBaseTestCase($class) {
+ while ($class = get_parent_class($class)) {
+ $class = strtolower($class);
+ if ($class == 'simpletestcase' || $class == 'testsuite') {
+ return $class;
+ }
+ }
+ return false;
+ }
+ }
+
+ /**
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @deprecated
+ */
+ class GroupTest extends TestSuite { }
+
+ /**
+ * This is a failing group test for when a test suite hasn't
+ * loaded properly.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class BadTestSuite {
+ var $_label;
+ var $_error;
+
+ /**
+ * Sets the name of the test suite and error message.
+ * @param string $label Name sent at the start and end
+ * of the test.
+ * @access public
+ */
+ function BadTestSuite($label, $error) {
+ $this->_label = $label;
+ $this->_error = $error;
+ }
+
+ /**
+ * Accessor for the test name for subclasses.
+ * @return string Name of the test.
+ * @access public
+ */
+ function getLabel() {
+ return $this->_label;
+ }
+
+ /**
+ * Sends a single error to the reporter.
+ * @param SimpleReporter $reporter Current test reporter.
+ * @access public
+ */
+ function run(&$reporter) {
+ $reporter->paintGroupStart($this->getLabel(), $this->getSize());
+ $reporter->paintFail('Bad TestSuite [' . $this->getLabel() .
+ '] with error [' . $this->_error . ']');
+ $reporter->paintGroupEnd($this->getLabel());
+ return $reporter->getStatus();
+ }
+
+ /**
+ * Number of contained test cases. Always zero.
+ * @return integer Total count of cases in the group.
+ * @access public
+ */
+ function getSize() {
+ return 0;
+ }
+ }
+
+ /**
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @deprecated
+ */
+ class BadGroupTest extends BadTestSuite { }
+?> \ No newline at end of file
diff --git a/tests/simpletest/unit_tester.php b/tests/simpletest/unit_tester.php
new file mode 100755
index 0000000000..82188fa7d4
--- /dev/null
+++ b/tests/simpletest/unit_tester.php
@@ -0,0 +1,417 @@
+<?php
+ /**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: unit_tester.php,v 1.41 2007/07/04 00:42:05 lastcraft Exp $
+ */
+
+ /**#@+
+ * include other SimpleTest class files
+ */
+ require_once(dirname(__FILE__) . '/test_case.php');
+ require_once(dirname(__FILE__) . '/dumper.php');
+ /**#@-*/
+
+ /**
+ * Standard unit test class for day to day testing
+ * of PHP code XP style. Adds some useful standard
+ * assertions.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class UnitTestCase extends SimpleTestCase {
+
+ /**
+ * Creates an empty test case. Should be subclassed
+ * with test methods for a functional test case.
+ * @param string $label Name of test case. Will use
+ * the class name if none specified.
+ * @access public
+ */
+ function UnitTestCase($label = false) {
+ if (! $label) {
+ $label = get_class($this);
+ }
+ $this->SimpleTestCase($label);
+ }
+
+ /**
+ * Called from within the test methods to register
+ * passes and failures.
+ * @param boolean $result Pass on true.
+ * @param string $message Message to display describing
+ * the test state.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertTrue($result, $message = false) {
+ return $this->assert(new TrueExpectation(), $result, $message);
+ }
+
+ /**
+ * Will be true on false and vice versa. False
+ * is the PHP definition of false, so that null,
+ * empty strings, zero and an empty array all count
+ * as false.
+ * @param boolean $result Pass on false.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertFalse($result, $message = '%s') {
+ return $this->assert(new FalseExpectation(), $result, $message);
+ }
+
+ /**
+ * Will be true if the value is null.
+ * @param null $value Supposedly null value.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertNull($value, $message = '%s') {
+ $dumper = &new SimpleDumper();
+ $message = sprintf(
+ $message,
+ '[' . $dumper->describeValue($value) . '] should be null');
+ return $this->assertTrue(! isset($value), $message);
+ }
+
+ /**
+ * Will be true if the value is set.
+ * @param mixed $value Supposedly set value.
+ * @param string $message Message to display.
+ * @return boolean True on pass.
+ * @access public
+ */
+ function assertNotNull($value, $message = '%s') {
+ $dumper = &new SimpleDumper();
+ $message = sprintf(
+ $message,
+ '[' . $dumper->describeValue($value) . '] should not be null');
+ return $this->assertTrue(isset($value), $message);
+ }
+
+ /**
+ * Type and class test. Will pass if class
+ * matches the type name or is a subclass or
+ * if not an object, but the type is correct.
+ * @param mixed $object Object to test.
+ * @param string $type Type name as string.
+ * @param string $message Message to display.
+ * @return boolean True on pass.
+ * @access public
+ */
+ function assertIsA($object, $type, $message = '%s') {
+ return $this->assert(
+ new IsAExpectation($type),
+ $object,
+ $message);
+ }
+
+ /**
+ * Type and class mismatch test. Will pass if class
+ * name or underling type does not match the one
+ * specified.
+ * @param mixed $object Object to test.
+ * @param string $type Type name as string.
+ * @param string $message Message to display.
+ * @return boolean True on pass.
+ * @access public
+ */
+ function assertNotA($object, $type, $message = '%s') {
+ return $this->assert(
+ new NotAExpectation($type),
+ $object,
+ $message);
+ }
+
+ /**
+ * Will trigger a pass if the two parameters have
+ * the same value only. Otherwise a fail.
+ * @param mixed $first Value to compare.
+ * @param mixed $second Value to compare.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertEqual($first, $second, $message = '%s') {
+ return $this->assert(
+ new EqualExpectation($first),
+ $second,
+ $message);
+ }
+
+ /**
+ * Will trigger a pass if the two parameters have
+ * a different value. Otherwise a fail.
+ * @param mixed $first Value to compare.
+ * @param mixed $second Value to compare.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertNotEqual($first, $second, $message = '%s') {
+ return $this->assert(
+ new NotEqualExpectation($first),
+ $second,
+ $message);
+ }
+
+ /**
+ * Will trigger a pass if the if the first parameter
+ * is near enough to the second by the margin.
+ * @param mixed $first Value to compare.
+ * @param mixed $second Value to compare.
+ * @param mixed $margin Fuzziness of match.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertWithinMargin($first, $second, $margin, $message = '%s') {
+ return $this->assert(
+ new WithinMarginExpectation($first, $margin),
+ $second,
+ $message);
+ }
+
+ /**
+ * Will trigger a pass if the two parameters differ
+ * by more than the margin.
+ * @param mixed $first Value to compare.
+ * @param mixed $second Value to compare.
+ * @param mixed $margin Fuzziness of match.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertOutsideMargin($first, $second, $margin, $message = '%s') {
+ return $this->assert(
+ new OutsideMarginExpectation($first, $margin),
+ $second,
+ $message);
+ }
+
+ /**
+ * Will trigger a pass if the two parameters have
+ * the same value and same type. Otherwise a fail.
+ * @param mixed $first Value to compare.
+ * @param mixed $second Value to compare.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertIdentical($first, $second, $message = '%s') {
+ return $this->assert(
+ new IdenticalExpectation($first),
+ $second,
+ $message);
+ }
+
+ /**
+ * Will trigger a pass if the two parameters have
+ * the different value or different type.
+ * @param mixed $first Value to compare.
+ * @param mixed $second Value to compare.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertNotIdentical($first, $second, $message = '%s') {
+ return $this->assert(
+ new NotIdenticalExpectation($first),
+ $second,
+ $message);
+ }
+
+ /**
+ * Will trigger a pass if both parameters refer
+ * to the same object. Fail otherwise.
+ * @param mixed $first Object reference to check.
+ * @param mixed $second Hopefully the same object.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertReference(&$first, &$second, $message = '%s') {
+ $dumper = &new SimpleDumper();
+ $message = sprintf(
+ $message,
+ '[' . $dumper->describeValue($first) .
+ '] and [' . $dumper->describeValue($second) .
+ '] should reference the same object');
+ return $this->assertTrue(
+ SimpleTestCompatibility::isReference($first, $second),
+ $message);
+ }
+
+ /**
+ * Will trigger a pass if both parameters refer
+ * to different objects. Fail otherwise. The objects
+ * have to be identical though.
+ * @param mixed $first Object reference to check.
+ * @param mixed $second Hopefully not the same object.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertClone(&$first, &$second, $message = '%s') {
+ $dumper = &new SimpleDumper();
+ $message = sprintf(
+ $message,
+ '[' . $dumper->describeValue($first) .
+ '] and [' . $dumper->describeValue($second) .
+ '] should not be the same object');
+ $identical = &new IdenticalExpectation($first);
+ return $this->assertTrue(
+ $identical->test($second) &&
+ ! SimpleTestCompatibility::isReference($first, $second),
+ $message);
+ }
+
+ /**
+ * @deprecated
+ */
+ function assertCopy(&$first, &$second, $message = "%s") {
+ $dumper = &new SimpleDumper();
+ $message = sprintf(
+ $message,
+ "[" . $dumper->describeValue($first) .
+ "] and [" . $dumper->describeValue($second) .
+ "] should not be the same object");
+ return $this->assertFalse(
+ SimpleTestCompatibility::isReference($first, $second),
+ $message);
+ }
+
+ /**
+ * Will trigger a pass if the Perl regex pattern
+ * is found in the subject. Fail otherwise.
+ * @param string $pattern Perl regex to look for including
+ * the regex delimiters.
+ * @param string $subject String to search in.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertPattern($pattern, $subject, $message = '%s') {
+ return $this->assert(
+ new PatternExpectation($pattern),
+ $subject,
+ $message);
+ }
+
+ /**
+ * @deprecated
+ */
+ function assertWantedPattern($pattern, $subject, $message = '%s') {
+ return $this->assertPattern($pattern, $subject, $message);
+ }
+
+ /**
+ * Will trigger a pass if the perl regex pattern
+ * is not present in subject. Fail if found.
+ * @param string $pattern Perl regex to look for including
+ * the regex delimiters.
+ * @param string $subject String to search in.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertNoPattern($pattern, $subject, $message = '%s') {
+ return $this->assert(
+ new NoPatternExpectation($pattern),
+ $subject,
+ $message);
+ }
+
+ /**
+ * @deprecated
+ */
+ function assertNoUnwantedPattern($pattern, $subject, $message = '%s') {
+ return $this->assertNoPattern($pattern, $subject, $message);
+ }
+
+ /**
+ * @deprecated
+ */
+ function swallowErrors() {
+ $context = &SimpleTest::getContext();
+ $queue = &$context->get('SimpleErrorQueue');
+ $queue->clear();
+ }
+
+ /**
+ * @deprecated
+ */
+ function assertNoErrors($message = '%s') {
+ $context = &SimpleTest::getContext();
+ $queue = &$context->get('SimpleErrorQueue');
+ return $queue->assertNoErrors($message);
+ }
+
+ /**
+ * @deprecated
+ */
+ function assertError($expected = false, $message = '%s') {
+ $context = &SimpleTest::getContext();
+ $queue = &$context->get('SimpleErrorQueue');
+ return $queue->assertError($this->_coerceExpectation($expected), $message);
+ }
+
+ /**
+ * Prepares for an error. If the error mismatches it
+ * passes through, otherwise it is swallowed. Any
+ * left over errors trigger failures.
+ * @param SimpleExpectation/string $expected The error to match.
+ * @param string $message Message on failure.
+ * @access public
+ */
+ function expectError($expected = false, $message = '%s') {
+ $context = &SimpleTest::getContext();
+ $queue = &$context->get('SimpleErrorQueue');
+ $queue->expectError($this->_coerceExpectation($expected), $message);
+ }
+
+ /**
+ * Prepares for an exception. If the error mismatches it
+ * passes through, otherwise it is swallowed. Any
+ * left over errors trigger failures.
+ * @param SimpleExpectation/Exception $expected The error to match.
+ * @param string $message Message on failure.
+ * @access public
+ */
+ function expectException($expected = false, $message = '%s') {
+ $context = &SimpleTest::getContext();
+ $queue = &$context->get('SimpleExceptionTrap');
+ $queue->expectException($expected, $message . $this->getAssertionLine());
+ }
+
+ /**
+ * Creates an equality expectation if the
+ * object/value is not already some type
+ * of expectation.
+ * @param mixed $expected Expected value.
+ * @return SimpleExpectation Expectation object.
+ * @access private
+ */
+ function _coerceExpectation($expected) {
+ if ($expected == false) {
+ return new TrueExpectation();
+ }
+ if (SimpleTestCompatibility::isA($expected, 'SimpleExpectation')) {
+ return $expected;
+ }
+ return new EqualExpectation(
+ is_string($expected) ? str_replace('%', '%%', $expected) : $expected);
+ }
+
+ /**
+ * @deprecated
+ */
+ function assertErrorPattern($pattern, $message = '%s') {
+ return $this->assertError(new PatternExpectation($pattern), $message);
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/url.php b/tests/simpletest/url.php
new file mode 100755
index 0000000000..c25b097a98
--- /dev/null
+++ b/tests/simpletest/url.php
@@ -0,0 +1,526 @@
+<?php
+ /**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage WebTester
+ * @version $Id: url.php,v 1.32 2007/07/16 18:13:23 lastcraft Exp $
+ */
+
+ /**#@+
+ * include other SimpleTest class files
+ */
+ require_once(dirname(__FILE__) . '/encoding.php');
+ /**#@-*/
+
+ /**
+ * URL parser to replace parse_url() PHP function which
+ * got broken in PHP 4.3.0. Adds some browser specific
+ * functionality such as expandomatics.
+ * Guesses a bit trying to separate the host from
+ * the path and tries to keep a raw, possibly unparsable,
+ * request string as long as possible.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleUrl {
+ var $_scheme;
+ var $_username;
+ var $_password;
+ var $_host;
+ var $_port;
+ var $_path;
+ var $_request;
+ var $_fragment;
+ var $_x;
+ var $_y;
+ var $_target;
+ var $_raw = false;
+
+ /**
+ * Constructor. Parses URL into sections.
+ * @param string $url Incoming URL.
+ * @access public
+ */
+ function SimpleUrl($url = '') {
+ list($x, $y) = $this->_chompCoordinates($url);
+ $this->setCoordinates($x, $y);
+ $this->_scheme = $this->_chompScheme($url);
+ list($this->_username, $this->_password) = $this->_chompLogin($url);
+ $this->_host = $this->_chompHost($url);
+ $this->_port = false;
+ if (preg_match('/(.*?):(.*)/', $this->_host, $host_parts)) {
+ $this->_host = $host_parts[1];
+ $this->_port = (integer)$host_parts[2];
+ }
+ $this->_path = $this->_chompPath($url);
+ $this->_request = $this->_parseRequest($this->_chompRequest($url));
+ $this->_fragment = (strncmp($url, "#", 1) == 0 ? substr($url, 1) : false);
+ $this->_target = false;
+ }
+
+ /**
+ * Extracts the X, Y coordinate pair from an image map.
+ * @param string $url URL so far. The coordinates will be
+ * removed.
+ * @return array X, Y as a pair of integers.
+ * @access private
+ */
+ function _chompCoordinates(&$url) {
+ if (preg_match('/(.*)\?(\d+),(\d+)$/', $url, $matches)) {
+ $url = $matches[1];
+ return array((integer)$matches[2], (integer)$matches[3]);
+ }
+ return array(false, false);
+ }
+
+ /**
+ * Extracts the scheme part of an incoming URL.
+ * @param string $url URL so far. The scheme will be
+ * removed.
+ * @return string Scheme part or false.
+ * @access private
+ */
+ function _chompScheme(&$url) {
+ if (preg_match('/^([^\/:]*):(\/\/)(.*)/', $url, $matches)) {
+ $url = $matches[2] . $matches[3];
+ return $matches[1];
+ }
+ return false;
+ }
+
+ /**
+ * Extracts the username and password from the
+ * incoming URL. The // prefix will be reattached
+ * to the URL after the doublet is extracted.
+ * @param string $url URL so far. The username and
+ * password are removed.
+ * @return array Two item list of username and
+ * password. Will urldecode() them.
+ * @access private
+ */
+ function _chompLogin(&$url) {
+ $prefix = '';
+ if (preg_match('/^(\/\/)(.*)/', $url, $matches)) {
+ $prefix = $matches[1];
+ $url = $matches[2];
+ }
+ if (preg_match('/(.*?)@(.*)/', $url, $matches)) {
+ $url = $prefix . $matches[2];
+ $parts = split(":", $matches[1]);
+ return array(
+ urldecode($parts[0]),
+ isset($parts[1]) ? urldecode($parts[1]) : false);
+ }
+ $url = $prefix . $url;
+ return array(false, false);
+ }
+
+ /**
+ * Extracts the host part of an incoming URL.
+ * Includes the port number part. Will extract
+ * the host if it starts with // or it has
+ * a top level domain or it has at least two
+ * dots.
+ * @param string $url URL so far. The host will be
+ * removed.
+ * @return string Host part guess or false.
+ * @access private
+ */
+ function _chompHost(&$url) {
+ if (preg_match('/^(\/\/)(.*?)(\/.*|\?.*|#.*|$)/', $url, $matches)) {
+ $url = $matches[3];
+ return $matches[2];
+ }
+ if (preg_match('/(.*?)(\.\.\/|\.\/|\/|\?|#|$)(.*)/', $url, $matches)) {
+ $tlds = SimpleUrl::getAllTopLevelDomains();
+ if (preg_match('/[a-z0-9\-]+\.(' . $tlds . ')/i', $matches[1])) {
+ $url = $matches[2] . $matches[3];
+ return $matches[1];
+ } elseif (preg_match('/[a-z0-9\-]+\.[a-z0-9\-]+\.[a-z0-9\-]+/i', $matches[1])) {
+ $url = $matches[2] . $matches[3];
+ return $matches[1];
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Extracts the path information from the incoming
+ * URL. Strips this path from the URL.
+ * @param string $url URL so far. The host will be
+ * removed.
+ * @return string Path part or '/'.
+ * @access private
+ */
+ function _chompPath(&$url) {
+ if (preg_match('/(.*?)(\?|#|$)(.*)/', $url, $matches)) {
+ $url = $matches[2] . $matches[3];
+ return ($matches[1] ? $matches[1] : '');
+ }
+ return '';
+ }
+
+ /**
+ * Strips off the request data.
+ * @param string $url URL so far. The request will be
+ * removed.
+ * @return string Raw request part.
+ * @access private
+ */
+ function _chompRequest(&$url) {
+ if (preg_match('/\?(.*?)(#|$)(.*)/', $url, $matches)) {
+ $url = $matches[2] . $matches[3];
+ return $matches[1];
+ }
+ return '';
+ }
+
+ /**
+ * Breaks the request down into an object.
+ * @param string $raw Raw request.
+ * @return SimpleFormEncoding Parsed data.
+ * @access private
+ */
+ function _parseRequest($raw) {
+ $this->_raw = $raw;
+ $request = new SimpleGetEncoding();
+ foreach (split("&", $raw) as $pair) {
+ if (preg_match('/(.*?)=(.*)/', $pair, $matches)) {
+ $request->add($matches[1], urldecode($matches[2]));
+ } elseif ($pair) {
+ $request->add($pair, '');
+ }
+ }
+ return $request;
+ }
+
+ /**
+ * Accessor for protocol part.
+ * @param string $default Value to use if not present.
+ * @return string Scheme name, e.g "http".
+ * @access public
+ */
+ function getScheme($default = false) {
+ return $this->_scheme ? $this->_scheme : $default;
+ }
+
+ /**
+ * Accessor for user name.
+ * @return string Username preceding host.
+ * @access public
+ */
+ function getUsername() {
+ return $this->_username;
+ }
+
+ /**
+ * Accessor for password.
+ * @return string Password preceding host.
+ * @access public
+ */
+ function getPassword() {
+ return $this->_password;
+ }
+
+ /**
+ * Accessor for hostname and port.
+ * @param string $default Value to use if not present.
+ * @return string Hostname only.
+ * @access public
+ */
+ function getHost($default = false) {
+ return $this->_host ? $this->_host : $default;
+ }
+
+ /**
+ * Accessor for top level domain.
+ * @return string Last part of host.
+ * @access public
+ */
+ function getTld() {
+ $path_parts = pathinfo($this->getHost());
+ return (isset($path_parts['extension']) ? $path_parts['extension'] : false);
+ }
+
+ /**
+ * Accessor for port number.
+ * @return integer TCP/IP port number.
+ * @access public
+ */
+ function getPort() {
+ return $this->_port;
+ }
+
+ /**
+ * Accessor for path.
+ * @return string Full path including leading slash if implied.
+ * @access public
+ */
+ function getPath() {
+ if (! $this->_path && $this->_host) {
+ return '/';
+ }
+ return $this->_path;
+ }
+
+ /**
+ * Accessor for page if any. This may be a
+ * directory name if ambiguious.
+ * @return Page name.
+ * @access public
+ */
+ function getPage() {
+ if (! preg_match('/([^\/]*?)$/', $this->getPath(), $matches)) {
+ return false;
+ }
+ return $matches[1];
+ }
+
+ /**
+ * Gets the path to the page.
+ * @return string Path less the page.
+ * @access public
+ */
+ function getBasePath() {
+ if (! preg_match('/(.*\/)[^\/]*?$/', $this->getPath(), $matches)) {
+ return false;
+ }
+ return $matches[1];
+ }
+
+ /**
+ * Accessor for fragment at end of URL after the "#".
+ * @return string Part after "#".
+ * @access public
+ */
+ function getFragment() {
+ return $this->_fragment;
+ }
+
+ /**
+ * Sets image coordinates. Set to false to clear
+ * them.
+ * @param integer $x Horizontal position.
+ * @param integer $y Vertical position.
+ * @access public
+ */
+ function setCoordinates($x = false, $y = false) {
+ if (($x === false) || ($y === false)) {
+ $this->_x = $this->_y = false;
+ return;
+ }
+ $this->_x = (integer)$x;
+ $this->_y = (integer)$y;
+ }
+
+ /**
+ * Accessor for horizontal image coordinate.
+ * @return integer X value.
+ * @access public
+ */
+ function getX() {
+ return $this->_x;
+ }
+
+ /**
+ * Accessor for vertical image coordinate.
+ * @return integer Y value.
+ * @access public
+ */
+ function getY() {
+ return $this->_y;
+ }
+
+ /**
+ * Accessor for current request parameters
+ * in URL string form. Will return teh original request
+ * if at all possible even if it doesn't make much
+ * sense.
+ * @return string Form is string "?a=1&b=2", etc.
+ * @access public
+ */
+ function getEncodedRequest() {
+ if ($this->_raw) {
+ $encoded = $this->_raw;
+ } else {
+ $encoded = $this->_request->asUrlRequest();
+ }
+ if ($encoded) {
+ return '?' . preg_replace('/^\?/', '', $encoded);
+ }
+ return '';
+ }
+
+ /**
+ * Adds an additional parameter to the request.
+ * @param string $key Name of parameter.
+ * @param string $value Value as string.
+ * @access public
+ */
+ function addRequestParameter($key, $value) {
+ $this->_raw = false;
+ $this->_request->add($key, $value);
+ }
+
+ /**
+ * Adds additional parameters to the request.
+ * @param hash/SimpleFormEncoding $parameters Additional
+ * parameters.
+ * @access public
+ */
+ function addRequestParameters($parameters) {
+ $this->_raw = false;
+ $this->_request->merge($parameters);
+ }
+
+ /**
+ * Clears down all parameters.
+ * @access public
+ */
+ function clearRequest() {
+ $this->_raw = false;
+ $this->_request = &new SimpleGetEncoding();
+ }
+
+ /**
+ * Gets the frame target if present. Although
+ * not strictly part of the URL specification it
+ * acts as similarily to the browser.
+ * @return boolean/string Frame name or false if none.
+ * @access public
+ */
+ function getTarget() {
+ return $this->_target;
+ }
+
+ /**
+ * Attaches a frame target.
+ * @param string $frame Name of frame.
+ * @access public
+ */
+ function setTarget($frame) {
+ $this->_raw = false;
+ $this->_target = $frame;
+ }
+
+ /**
+ * Renders the URL back into a string.
+ * @return string URL in canonical form.
+ * @access public
+ */
+ function asString() {
+ $scheme = $identity = $host = $path = $encoded = $fragment = '';
+ if ($this->_username && $this->_password) {
+ $identity = $this->_username . ':' . $this->_password . '@';
+ }
+ if ($this->getHost()) {
+ $scheme = $this->getScheme() ? $this->getScheme() : 'http';
+ $host = $this->getHost();
+ }
+ if (substr($this->_path, 0, 1) == '/') {
+ $path = $this->normalisePath($this->_path);
+ }
+ $encoded = $this->getEncodedRequest();
+ $fragment = $this->getFragment() ? '#'. $this->getFragment() : '';
+ $coords = $this->getX() === false ? '' : '?' . $this->getX() . ',' . $this->getY();
+ return "$scheme://$identity$host$path$encoded$fragment$coords";
+ }
+
+ /**
+ * Replaces unknown sections to turn a relative
+ * URL into an absolute one. The base URL can
+ * be either a string or a SimpleUrl object.
+ * @param string/SimpleUrl $base Base URL.
+ * @access public
+ */
+ function makeAbsolute($base) {
+ if (! is_object($base)) {
+ $base = new SimpleUrl($base);
+ }
+ if ($this->getHost()) {
+ $scheme = $this->getScheme();
+ $host = $this->getHost();
+ $port = $this->getPort() ? ':' . $this->getPort() : '';
+ $identity = $this->getIdentity() ? $this->getIdentity() . '@' : '';
+ if (! $identity) {
+ $identity = $base->getIdentity() ? $base->getIdentity() . '@' : '';
+ }
+ } else {
+ $scheme = $base->getScheme();
+ $host = $base->getHost();
+ $port = $base->getPort() ? ':' . $base->getPort() : '';
+ $identity = $base->getIdentity() ? $base->getIdentity() . '@' : '';
+ }
+ $path = $this->normalisePath($this->_extractAbsolutePath($base));
+ $encoded = $this->getEncodedRequest();
+ $fragment = $this->getFragment() ? '#'. $this->getFragment() : '';
+ $coords = $this->getX() === false ? '' : '?' . $this->getX() . ',' . $this->getY();
+ return new SimpleUrl("$scheme://$identity$host$port$path$encoded$fragment$coords");
+ }
+
+ /**
+ * Replaces unknown sections of the path with base parts
+ * to return a complete absolute one.
+ * @param string/SimpleUrl $base Base URL.
+ * @param string Absolute path.
+ * @access private
+ */
+ function _extractAbsolutePath($base) {
+ if ($this->getHost()) {
+ return $this->_path;
+ }
+ if (! $this->_isRelativePath($this->_path)) {
+ return $this->_path;
+ }
+ if ($this->_path) {
+ return $base->getBasePath() . $this->_path;
+ }
+ return $base->getPath();
+ }
+
+ /**
+ * Simple test to see if a path part is relative.
+ * @param string $path Path to test.
+ * @return boolean True if starts with a "/".
+ * @access private
+ */
+ function _isRelativePath($path) {
+ return (substr($path, 0, 1) != '/');
+ }
+
+ /**
+ * Extracts the username and password for use in rendering
+ * a URL.
+ * @return string/boolean Form of username:password or false.
+ * @access public
+ */
+ function getIdentity() {
+ if ($this->_username && $this->_password) {
+ return $this->_username . ':' . $this->_password;
+ }
+ return false;
+ }
+
+ /**
+ * Replaces . and .. sections of the path.
+ * @param string $path Unoptimised path.
+ * @return string Path with dots removed if possible.
+ * @access public
+ */
+ function normalisePath($path) {
+ $path = preg_replace('|/\./|', '/', $path);
+ return preg_replace('|/[^/]+/\.\./|', '/', $path);
+ }
+
+ /**
+ * A pipe seperated list of all TLDs that result in two part
+ * domain names.
+ * @return string Pipe separated list.
+ * @access public
+ * @static
+ */
+ function getAllTopLevelDomains() {
+ return 'com|edu|net|org|gov|mil|int|biz|info|name|pro|aero|coop|museum';
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/user_agent.php b/tests/simpletest/user_agent.php
new file mode 100755
index 0000000000..da60a24327
--- /dev/null
+++ b/tests/simpletest/user_agent.php
@@ -0,0 +1,333 @@
+<?php
+ /**
+ * Base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage WebTester
+ * @version $Id: user_agent.php,v 1.55 2005/12/07 18:04:58 lastcraft Exp $
+ */
+
+ /**#@+
+ * include other SimpleTest class files
+ */
+ require_once(dirname(__FILE__) . '/cookies.php');
+ require_once(dirname(__FILE__) . '/http.php');
+ require_once(dirname(__FILE__) . '/encoding.php');
+ require_once(dirname(__FILE__) . '/authentication.php');
+ /**#@-*/
+
+ if (! defined('DEFAULT_MAX_REDIRECTS')) {
+ define('DEFAULT_MAX_REDIRECTS', 3);
+ }
+
+ if (! defined('DEFAULT_CONNECTION_TIMEOUT')) {
+ define('DEFAULT_CONNECTION_TIMEOUT', 15);
+ }
+
+ /**
+ * Fetches web pages whilst keeping track of
+ * cookies and authentication.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class SimpleUserAgent {
+ var $_cookie_jar;
+ var $_cookies_enabled = true;
+ var $_authenticator;
+ var $_max_redirects = DEFAULT_MAX_REDIRECTS;
+ var $_proxy = false;
+ var $_proxy_username = false;
+ var $_proxy_password = false;
+ var $_connection_timeout = DEFAULT_CONNECTION_TIMEOUT;
+ var $_additional_headers = array();
+
+ /**
+ * Starts with no cookies, realms or proxies.
+ * @access public
+ */
+ function SimpleUserAgent() {
+ $this->_cookie_jar = &new SimpleCookieJar();
+ $this->_authenticator = &new SimpleAuthenticator();
+ }
+
+ /**
+ * Removes expired and temporary cookies as if
+ * the browser was closed and re-opened. Authorisation
+ * has to be obtained again as well.
+ * @param string/integer $date Time when session restarted.
+ * If omitted then all persistent
+ * cookies are kept.
+ * @access public
+ */
+ function restart($date = false) {
+ $this->_cookie_jar->restartSession($date);
+ $this->_authenticator->restartSession();
+ }
+
+ /**
+ * Adds a header to every fetch.
+ * @param string $header Header line to add to every
+ * request until cleared.
+ * @access public
+ */
+ function addHeader($header) {
+ $this->_additional_headers[] = $header;
+ }
+
+ /**
+ * Ages the cookies by the specified time.
+ * @param integer $interval Amount in seconds.
+ * @access public
+ */
+ function ageCookies($interval) {
+ $this->_cookie_jar->agePrematurely($interval);
+ }
+
+ /**
+ * Sets an additional cookie. If a cookie has
+ * the same name and path it is replaced.
+ * @param string $name Cookie key.
+ * @param string $value Value of cookie.
+ * @param string $host Host upon which the cookie is valid.
+ * @param string $path Cookie path if not host wide.
+ * @param string $expiry Expiry date.
+ * @access public
+ */
+ function setCookie($name, $value, $host = false, $path = '/', $expiry = false) {
+ $this->_cookie_jar->setCookie($name, $value, $host, $path, $expiry);
+ }
+
+ /**
+ * Reads the most specific cookie value from the
+ * browser cookies.
+ * @param string $host Host to search.
+ * @param string $path Applicable path.
+ * @param string $name Name of cookie to read.
+ * @return string False if not present, else the
+ * value as a string.
+ * @access public
+ */
+ function getCookieValue($host, $path, $name) {
+ return $this->_cookie_jar->getCookieValue($host, $path, $name);
+ }
+
+ /**
+ * Reads the current cookies within the base URL.
+ * @param string $name Key of cookie to find.
+ * @param SimpleUrl $base Base URL to search from.
+ * @return string/boolean Null if there is no base URL, false
+ * if the cookie is not set.
+ * @access public
+ */
+ function getBaseCookieValue($name, $base) {
+ if (! $base) {
+ return null;
+ }
+ return $this->getCookieValue($base->getHost(), $base->getPath(), $name);
+ }
+
+ /**
+ * Switches off cookie sending and recieving.
+ * @access public
+ */
+ function ignoreCookies() {
+ $this->_cookies_enabled = false;
+ }
+
+ /**
+ * Switches back on the cookie sending and recieving.
+ * @access public
+ */
+ function useCookies() {
+ $this->_cookies_enabled = true;
+ }
+
+ /**
+ * Sets the socket timeout for opening a connection.
+ * @param integer $timeout Maximum time in seconds.
+ * @access public
+ */
+ function setConnectionTimeout($timeout) {
+ $this->_connection_timeout = $timeout;
+ }
+
+ /**
+ * Sets the maximum number of redirects before
+ * a page will be loaded anyway.
+ * @param integer $max Most hops allowed.
+ * @access public
+ */
+ function setMaximumRedirects($max) {
+ $this->_max_redirects = $max;
+ }
+
+ /**
+ * Sets proxy to use on all requests for when
+ * testing from behind a firewall. Set URL
+ * to false to disable.
+ * @param string $proxy Proxy URL.
+ * @param string $username Proxy username for authentication.
+ * @param string $password Proxy password for authentication.
+ * @access public
+ */
+ function useProxy($proxy, $username, $password) {
+ if (! $proxy) {
+ $this->_proxy = false;
+ return;
+ }
+ if ((strncmp($proxy, 'http://', 7) != 0) && (strncmp($proxy, 'https://', 8) != 0)) {
+ $proxy = 'http://'. $proxy;
+ }
+ $this->_proxy = &new SimpleUrl($proxy);
+ $this->_proxy_username = $username;
+ $this->_proxy_password = $password;
+ }
+
+ /**
+ * Test to see if the redirect limit is passed.
+ * @param integer $redirects Count so far.
+ * @return boolean True if over.
+ * @access private
+ */
+ function _isTooManyRedirects($redirects) {
+ return ($redirects > $this->_max_redirects);
+ }
+
+ /**
+ * Sets the identity for the current realm.
+ * @param string $host Host to which realm applies.
+ * @param string $realm Full name of realm.
+ * @param string $username Username for realm.
+ * @param string $password Password for realm.
+ * @access public
+ */
+ function setIdentity($host, $realm, $username, $password) {
+ $this->_authenticator->setIdentityForRealm($host, $realm, $username, $password);
+ }
+
+ /**
+ * Fetches a URL as a response object. Will keep trying if redirected.
+ * It will also collect authentication realm information.
+ * @param string/SimpleUrl $url Target to fetch.
+ * @param SimpleEncoding $encoding Additional parameters for request.
+ * @return SimpleHttpResponse Hopefully the target page.
+ * @access public
+ */
+ function &fetchResponse($url, $encoding) {
+ if ($encoding->getMethod() != 'POST') {
+ $url->addRequestParameters($encoding);
+ $encoding->clear();
+ }
+ $response = &$this->_fetchWhileRedirected($url, $encoding);
+ if ($headers = $response->getHeaders()) {
+ if ($headers->isChallenge()) {
+ $this->_authenticator->addRealm(
+ $url,
+ $headers->getAuthentication(),
+ $headers->getRealm());
+ }
+ }
+ return $response;
+ }
+
+ /**
+ * Fetches the page until no longer redirected or
+ * until the redirect limit runs out.
+ * @param SimpleUrl $url Target to fetch.
+ * @param SimpelFormEncoding $encoding Additional parameters for request.
+ * @return SimpleHttpResponse Hopefully the target page.
+ * @access private
+ */
+ function &_fetchWhileRedirected($url, $encoding) {
+ $redirects = 0;
+ do {
+ $response = &$this->_fetch($url, $encoding);
+ if ($response->isError()) {
+ return $response;
+ }
+ $headers = $response->getHeaders();
+ $location = new SimpleUrl($headers->getLocation());
+ $url = $location->makeAbsolute($url);
+ if ($this->_cookies_enabled) {
+ $headers->writeCookiesToJar($this->_cookie_jar, $url);
+ }
+ if (! $headers->isRedirect()) {
+ break;
+ }
+ $encoding = new SimpleGetEncoding();
+ } while (! $this->_isTooManyRedirects(++$redirects));
+ return $response;
+ }
+
+ /**
+ * Actually make the web request.
+ * @param SimpleUrl $url Target to fetch.
+ * @param SimpleFormEncoding $encoding Additional parameters for request.
+ * @return SimpleHttpResponse Headers and hopefully content.
+ * @access protected
+ */
+ function &_fetch($url, $encoding) {
+ $request = &$this->_createRequest($url, $encoding);
+ $response = &$request->fetch($this->_connection_timeout);
+ return $response;
+ }
+
+ /**
+ * Creates a full page request.
+ * @param SimpleUrl $url Target to fetch as url object.
+ * @param SimpleFormEncoding $encoding POST/GET parameters.
+ * @return SimpleHttpRequest New request.
+ * @access private
+ */
+ function &_createRequest($url, $encoding) {
+ $request = &$this->_createHttpRequest($url, $encoding);
+ $this->_addAdditionalHeaders($request);
+ if ($this->_cookies_enabled) {
+ $request->readCookiesFromJar($this->_cookie_jar, $url);
+ }
+ $this->_authenticator->addHeaders($request, $url);
+ return $request;
+ }
+
+ /**
+ * Builds the appropriate HTTP request object.
+ * @param SimpleUrl $url Target to fetch as url object.
+ * @param SimpleFormEncoding $parameters POST/GET parameters.
+ * @return SimpleHttpRequest New request object.
+ * @access protected
+ */
+ function &_createHttpRequest($url, $encoding) {
+ $request = &new SimpleHttpRequest($this->_createRoute($url), $encoding);
+ return $request;
+ }
+
+ /**
+ * Sets up either a direct route or via a proxy.
+ * @param SimpleUrl $url Target to fetch as url object.
+ * @return SimpleRoute Route to take to fetch URL.
+ * @access protected
+ */
+ function &_createRoute($url) {
+ if ($this->_proxy) {
+ $route = &new SimpleProxyRoute(
+ $url,
+ $this->_proxy,
+ $this->_proxy_username,
+ $this->_proxy_password);
+ } else {
+ $route = &new SimpleRoute($url);
+ }
+ return $route;
+ }
+
+ /**
+ * Adds additional manual headers.
+ * @param SimpleHttpRequest $request Outgoing request.
+ * @access private
+ */
+ function _addAdditionalHeaders(&$request) {
+ foreach ($this->_additional_headers as $header) {
+ $request->addHeaderLine($header);
+ }
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/web_tester.php b/tests/simpletest/web_tester.php
new file mode 100755
index 0000000000..2e24d50599
--- /dev/null
+++ b/tests/simpletest/web_tester.php
@@ -0,0 +1,1541 @@
+<?php
+ /**
+ * Base include file for SimpleTest.
+ * @package SimpleTest
+ * @subpackage WebTester
+ * @version $Id: web_tester.php,v 1.118 2006/11/20 19:17:06 lastcraft Exp $
+ */
+
+ /**#@+
+ * include other SimpleTest class files
+ */
+ require_once(dirname(__FILE__) . '/test_case.php');
+ require_once(dirname(__FILE__) . '/browser.php');
+ require_once(dirname(__FILE__) . '/page.php');
+ require_once(dirname(__FILE__) . '/expectation.php');
+ /**#@-*/
+
+ /**
+ * Test for an HTML widget value match.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class FieldExpectation extends SimpleExpectation {
+ var $_value;
+
+ /**
+ * Sets the field value to compare against.
+ * @param mixed $value Test value to match. Can be an
+ * expectation for say pattern matching.
+ * @param string $message Optiona message override. Can use %s as
+ * a placeholder for the original message.
+ * @access public
+ */
+ function FieldExpectation($value, $message = '%s') {
+ $this->SimpleExpectation($message);
+ if (is_array($value)) {
+ sort($value);
+ }
+ $this->_value = $value;
+ }
+
+ /**
+ * Tests the expectation. True if it matches
+ * a string value or an array value in any order.
+ * @param mixed $compare Comparison value. False for
+ * an unset field.
+ * @return boolean True if correct.
+ * @access public
+ */
+ function test($compare) {
+ if ($this->_value === false) {
+ return ($compare === false);
+ }
+ if ($this->_isSingle($this->_value)) {
+ return $this->_testSingle($compare);
+ }
+ if (is_array($this->_value)) {
+ return $this->_testMultiple($compare);
+ }
+ return false;
+ }
+
+ /**
+ * Tests for valid field comparisons with a single option.
+ * @param mixed $value Value to type check.
+ * @return boolean True if integer, string or float.
+ * @access private
+ */
+ function _isSingle($value) {
+ return is_string($value) || is_integer($value) || is_float($value);
+ }
+
+ /**
+ * String comparison for simple field with a single option.
+ * @param mixed $compare String to test against.
+ * @returns boolean True if matching.
+ * @access private
+ */
+ function _testSingle($compare) {
+ if (is_array($compare) && count($compare) == 1) {
+ $compare = $compare[0];
+ }
+ if (! $this->_isSingle($compare)) {
+ return false;
+ }
+ return ($this->_value == $compare);
+ }
+
+ /**
+ * List comparison for multivalue field.
+ * @param mixed $compare List in any order to test against.
+ * @returns boolean True if matching.
+ * @access private
+ */
+ function _testMultiple($compare) {
+ if (is_string($compare)) {
+ $compare = array($compare);
+ }
+ if (! is_array($compare)) {
+ return false;
+ }
+ sort($compare);
+ return ($this->_value === $compare);
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ $dumper = &$this->_getDumper();
+ if (is_array($compare)) {
+ sort($compare);
+ }
+ if ($this->test($compare)) {
+ return "Field expectation [" . $dumper->describeValue($this->_value) . "]";
+ } else {
+ return "Field expectation [" . $dumper->describeValue($this->_value) .
+ "] fails with [" .
+ $dumper->describeValue($compare) . "] " .
+ $dumper->describeDifference($this->_value, $compare);
+ }
+ }
+ }
+
+ /**
+ * Test for a specific HTTP header within a header block.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class HttpHeaderExpectation extends SimpleExpectation {
+ var $_expected_header;
+ var $_expected_value;
+
+ /**
+ * Sets the field and value to compare against.
+ * @param string $header Case insenstive trimmed header name.
+ * @param mixed $value Optional value to compare. If not
+ * given then any value will match. If
+ * an expectation object then that will
+ * be used instead.
+ * @param string $message Optiona message override. Can use %s as
+ * a placeholder for the original message.
+ */
+ function HttpHeaderExpectation($header, $value = false, $message = '%s') {
+ $this->SimpleExpectation($message);
+ $this->_expected_header = $this->_normaliseHeader($header);
+ $this->_expected_value = $value;
+ }
+
+ /**
+ * Accessor for aggregated object.
+ * @return mixed Expectation set in constructor.
+ * @access protected
+ */
+ function _getExpectation() {
+ return $this->_expected_value;
+ }
+
+ /**
+ * Removes whitespace at ends and case variations.
+ * @param string $header Name of header.
+ * @param string Trimmed and lowecased header
+ * name.
+ * @access private
+ */
+ function _normaliseHeader($header) {
+ return strtolower(trim($header));
+ }
+
+ /**
+ * Tests the expectation. True if it matches
+ * a string value or an array value in any order.
+ * @param mixed $compare Raw header block to search.
+ * @return boolean True if header present.
+ * @access public
+ */
+ function test($compare) {
+ return is_string($this->_findHeader($compare));
+ }
+
+ /**
+ * Searches the incoming result. Will extract the matching
+ * line as text.
+ * @param mixed $compare Raw header block to search.
+ * @return string Matching header line.
+ * @access protected
+ */
+ function _findHeader($compare) {
+ $lines = split("\r\n", $compare);
+ foreach ($lines as $line) {
+ if ($this->_testHeaderLine($line)) {
+ return $line;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Compares a single header line against the expectation.
+ * @param string $line A single line to compare.
+ * @return boolean True if matched.
+ * @access private
+ */
+ function _testHeaderLine($line) {
+ if (count($parsed = split(':', $line, 2)) < 2) {
+ return false;
+ }
+ list($header, $value) = $parsed;
+ if ($this->_normaliseHeader($header) != $this->_expected_header) {
+ return false;
+ }
+ return $this->_testHeaderValue($value, $this->_expected_value);
+ }
+
+ /**
+ * Tests the value part of the header.
+ * @param string $value Value to test.
+ * @param mixed $expected Value to test against.
+ * @return boolean True if matched.
+ * @access protected
+ */
+ function _testHeaderValue($value, $expected) {
+ if ($expected === false) {
+ return true;
+ }
+ if (SimpleExpectation::isExpectation($expected)) {
+ return $expected->test(trim($value));
+ }
+ return (trim($value) == trim($expected));
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Raw header block to search.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ if (SimpleExpectation::isExpectation($this->_expected_value)) {
+ $message = $this->_expected_value->overlayMessage($compare, $this->_getDumper());
+ } else {
+ $message = $this->_expected_header .
+ ($this->_expected_value ? ': ' . $this->_expected_value : '');
+ }
+ if (is_string($line = $this->_findHeader($compare))) {
+ return "Searching for header [$message] found [$line]";
+ } else {
+ return "Failed to find header [$message]";
+ }
+ }
+ }
+
+ /**
+ * Test for a specific HTTP header within a header block that
+ * should not be found.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class NoHttpHeaderExpectation extends HttpHeaderExpectation {
+ var $_expected_header;
+ var $_expected_value;
+
+ /**
+ * Sets the field and value to compare against.
+ * @param string $unwanted Case insenstive trimmed header name.
+ * @param string $message Optiona message override. Can use %s as
+ * a placeholder for the original message.
+ */
+ function NoHttpHeaderExpectation($unwanted, $message = '%s') {
+ $this->HttpHeaderExpectation($unwanted, false, $message);
+ }
+
+ /**
+ * Tests that the unwanted header is not found.
+ * @param mixed $compare Raw header block to search.
+ * @return boolean True if header present.
+ * @access public
+ */
+ function test($compare) {
+ return ($this->_findHeader($compare) === false);
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Raw header block to search.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ $expectation = $this->_getExpectation();
+ if (is_string($line = $this->_findHeader($compare))) {
+ return "Found unwanted header [$expectation] with [$line]";
+ } else {
+ return "Did not find unwanted header [$expectation]";
+ }
+ }
+ }
+
+ /**
+ * Test for a text substring.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class TextExpectation extends SimpleExpectation {
+ var $_substring;
+
+ /**
+ * Sets the value to compare against.
+ * @param string $substring Text to search for.
+ * @param string $message Customised message on failure.
+ * @access public
+ */
+ function TextExpectation($substring, $message = '%s') {
+ $this->SimpleExpectation($message);
+ $this->_substring = $substring;
+ }
+
+ /**
+ * Accessor for the substring.
+ * @return string Text to match.
+ * @access protected
+ */
+ function _getSubstring() {
+ return $this->_substring;
+ }
+
+ /**
+ * Tests the expectation. True if the text contains the
+ * substring.
+ * @param string $compare Comparison value.
+ * @return boolean True if correct.
+ * @access public
+ */
+ function test($compare) {
+ return (strpos($compare, $this->_substring) !== false);
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param mixed $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ if ($this->test($compare)) {
+ return $this->_describeTextMatch($this->_getSubstring(), $compare);
+ } else {
+ $dumper = &$this->_getDumper();
+ return "Text [" . $this->_getSubstring() .
+ "] not detected in [" .
+ $dumper->describeValue($compare) . "]";
+ }
+ }
+
+ /**
+ * Describes a pattern match including the string
+ * found and it's position.
+ * @param string $substring Text to search for.
+ * @param string $subject Subject to search.
+ * @access protected
+ */
+ function _describeTextMatch($substring, $subject) {
+ $position = strpos($subject, $substring);
+ $dumper = &$this->_getDumper();
+ return "Text [$substring] detected at character [$position] in [" .
+ $dumper->describeValue($subject) . "] in region [" .
+ $dumper->clipString($subject, 100, $position) . "]";
+ }
+ }
+
+ /**
+ * Fail if a substring is detected within the
+ * comparison text.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class NoTextExpectation extends TextExpectation {
+
+ /**
+ * Sets the reject pattern
+ * @param string $substring Text to search for.
+ * @param string $message Customised message on failure.
+ * @access public
+ */
+ function NoTextExpectation($substring, $message = '%s') {
+ $this->TextExpectation($substring, $message);
+ }
+
+ /**
+ * Tests the expectation. False if the substring appears
+ * in the text.
+ * @param string $compare Comparison value.
+ * @return boolean True if correct.
+ * @access public
+ */
+ function test($compare) {
+ return ! parent::test($compare);
+ }
+
+ /**
+ * Returns a human readable test message.
+ * @param string $compare Comparison value.
+ * @return string Description of success
+ * or failure.
+ * @access public
+ */
+ function testMessage($compare) {
+ if ($this->test($compare)) {
+ $dumper = &$this->_getDumper();
+ return "Text [" . $this->_getSubstring() .
+ "] not detected in [" .
+ $dumper->describeValue($compare) . "]";
+ } else {
+ return $this->_describeTextMatch($this->_getSubstring(), $compare);
+ }
+ }
+ }
+
+ /**
+ * Test case for testing of web pages. Allows
+ * fetching of pages, parsing of HTML and
+ * submitting forms.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+ class WebTestCase extends SimpleTestCase {
+ var $_browser;
+ var $_ignore_errors = false;
+
+ /**
+ * Creates an empty test case. Should be subclassed
+ * with test methods for a functional test case.
+ * @param string $label Name of test case. Will use
+ * the class name if none specified.
+ * @access public
+ */
+ function WebTestCase($label = false) {
+ $this->SimpleTestCase($label);
+ }
+
+ /**
+ * Announces the start of the test.
+ * @param string $method Test method just started.
+ * @access public
+ */
+ function before($method) {
+ parent::before($method);
+ $this->setBrowser($this->createBrowser());
+ }
+
+ /**
+ * Announces the end of the test. Includes private clean up.
+ * @param string $method Test method just finished.
+ * @access public
+ */
+ function after($method) {
+ $this->unsetBrowser();
+ parent::after($method);
+ }
+
+ /**
+ * Gets a current browser reference for setting
+ * special expectations or for detailed
+ * examination of page fetches.
+ * @return SimpleBrowser Current test browser object.
+ * @access public
+ */
+ function &getBrowser() {
+ return $this->_browser;
+ }
+
+ /**
+ * Gets a current browser reference for setting
+ * special expectations or for detailed
+ * examination of page fetches.
+ * @param SimpleBrowser $browser New test browser object.
+ * @access public
+ */
+ function setBrowser(&$browser) {
+ return $this->_browser = &$browser;
+ }
+
+ /**
+ * Clears the current browser reference to help the
+ * PHP garbage collector.
+ * @access public
+ */
+ function unsetBrowser() {
+ unset($this->_browser);
+ }
+
+ /**
+ * Creates a new default web browser object.
+ * Will be cleared at the end of the test method.
+ * @return TestBrowser New browser.
+ * @access public
+ */
+ function &createBrowser() {
+ $browser = &new SimpleBrowser();
+ return $browser;
+ }
+
+ /**
+ * Gets the last response error.
+ * @return string Last low level HTTP error.
+ * @access public
+ */
+ function getTransportError() {
+ return $this->_browser->getTransportError();
+ }
+
+ /**
+ * Accessor for the currently selected URL.
+ * @return string Current location or false if
+ * no page yet fetched.
+ * @access public
+ */
+ function getUrl() {
+ return $this->_browser->getUrl();
+ }
+
+ /**
+ * Dumps the current request for debugging.
+ * @access public
+ */
+ function showRequest() {
+ $this->dump($this->_browser->getRequest());
+ }
+
+ /**
+ * Dumps the current HTTP headers for debugging.
+ * @access public
+ */
+ function showHeaders() {
+ $this->dump($this->_browser->getHeaders());
+ }
+
+ /**
+ * Dumps the current HTML source for debugging.
+ * @access public
+ */
+ function showSource() {
+ $this->dump($this->_browser->getContent());
+ }
+
+ /**
+ * Dumps the visible text only for debugging.
+ * @access public
+ */
+ function showText() {
+ $this->dump(wordwrap($this->_browser->getContentAsText(), 80));
+ }
+
+ /**
+ * Simulates the closing and reopening of the browser.
+ * Temporary cookies will be discarded and timed
+ * cookies will be expired if later than the
+ * specified time.
+ * @param string/integer $date Time when session restarted.
+ * If ommitted then all persistent
+ * cookies are kept. Time is either
+ * Cookie format string or timestamp.
+ * @access public
+ */
+ function restart($date = false) {
+ if ($date === false) {
+ $date = time();
+ }
+ $this->_browser->restart($date);
+ }
+
+ /**
+ * Moves cookie expiry times back into the past.
+ * Useful for testing timeouts and expiries.
+ * @param integer $interval Amount to age in seconds.
+ * @access public
+ */
+ function ageCookies($interval) {
+ $this->_browser->ageCookies($interval);
+ }
+
+ /**
+ * Disables frames support. Frames will not be fetched
+ * and the frameset page will be used instead.
+ * @access public
+ */
+ function ignoreFrames() {
+ $this->_browser->ignoreFrames();
+ }
+
+ /**
+ * Switches off cookie sending and recieving.
+ * @access public
+ */
+ function ignoreCookies() {
+ $this->_browser->ignoreCookies();
+ }
+
+ /**
+ * Skips errors for the next request only. You might
+ * want to confirm that a page is unreachable for
+ * example.
+ * @access public
+ */
+ function ignoreErrors() {
+ $this->_ignore_errors = true;
+ }
+
+ /**
+ * Issues a fail if there is a transport error anywhere
+ * in the current frameset. Only one such error is
+ * reported.
+ * @param string/boolean $result HTML or failure.
+ * @return string/boolean $result Passes through result.
+ * @access private
+ */
+ function _failOnError($result) {
+ if (! $this->_ignore_errors) {
+ if ($error = $this->_browser->getTransportError()) {
+ $this->fail($error);
+ }
+ }
+ $this->_ignore_errors = false;
+ return $result;
+ }
+
+ /**
+ * Adds a header to every fetch.
+ * @param string $header Header line to add to every
+ * request until cleared.
+ * @access public
+ */
+ function addHeader($header) {
+ $this->_browser->addHeader($header);
+ }
+
+ /**
+ * Sets the maximum number of redirects before
+ * the web page is loaded regardless.
+ * @param integer $max Maximum hops.
+ * @access public
+ */
+ function setMaximumRedirects($max) {
+ if (! $this->_browser) {
+ trigger_error(
+ 'Can only set maximum redirects in a test method, setUp() or tearDown()');
+ }
+ $this->_browser->setMaximumRedirects($max);
+ }
+
+ /**
+ * Sets the socket timeout for opening a connection and
+ * receiving at least one byte of information.
+ * @param integer $timeout Maximum time in seconds.
+ * @access public
+ */
+ function setConnectionTimeout($timeout) {
+ $this->_browser->setConnectionTimeout($timeout);
+ }
+
+ /**
+ * Sets proxy to use on all requests for when
+ * testing from behind a firewall. Set URL
+ * to false to disable.
+ * @param string $proxy Proxy URL.
+ * @param string $username Proxy username for authentication.
+ * @param string $password Proxy password for authentication.
+ * @access public
+ */
+ function useProxy($proxy, $username = false, $password = false) {
+ $this->_browser->useProxy($proxy, $username, $password);
+ }
+
+ /**
+ * Fetches a page into the page buffer. If
+ * there is no base for the URL then the
+ * current base URL is used. After the fetch
+ * the base URL reflects the new location.
+ * @param string $url URL to fetch.
+ * @param hash $parameters Optional additional GET data.
+ * @return boolean/string Raw page on success.
+ * @access public
+ */
+ function get($url, $parameters = false) {
+ return $this->_failOnError($this->_browser->get($url, $parameters));
+ }
+
+ /**
+ * Fetches a page by POST into the page buffer.
+ * If there is no base for the URL then the
+ * current base URL is used. After the fetch
+ * the base URL reflects the new location.
+ * @param string $url URL to fetch.
+ * @param hash $parameters Optional additional GET data.
+ * @return boolean/string Raw page on success.
+ * @access public
+ */
+ function post($url, $parameters = false) {
+ return $this->_failOnError($this->_browser->post($url, $parameters));
+ }
+
+ /**
+ * Does a HTTP HEAD fetch, fetching only the page
+ * headers. The current base URL is unchanged by this.
+ * @param string $url URL to fetch.
+ * @param hash $parameters Optional additional GET data.
+ * @return boolean True on success.
+ * @access public
+ */
+ function head($url, $parameters = false) {
+ return $this->_failOnError($this->_browser->head($url, $parameters));
+ }
+
+ /**
+ * Equivalent to hitting the retry button on the
+ * browser. Will attempt to repeat the page fetch.
+ * @return boolean True if fetch succeeded.
+ * @access public
+ */
+ function retry() {
+ return $this->_failOnError($this->_browser->retry());
+ }
+
+ /**
+ * Equivalent to hitting the back button on the
+ * browser.
+ * @return boolean True if history entry and
+ * fetch succeeded.
+ * @access public
+ */
+ function back() {
+ return $this->_failOnError($this->_browser->back());
+ }
+
+ /**
+ * Equivalent to hitting the forward button on the
+ * browser.
+ * @return boolean True if history entry and
+ * fetch succeeded.
+ * @access public
+ */
+ function forward() {
+ return $this->_failOnError($this->_browser->forward());
+ }
+
+ /**
+ * Retries a request after setting the authentication
+ * for the current realm.
+ * @param string $username Username for realm.
+ * @param string $password Password for realm.
+ * @return boolean/string HTML on successful fetch. Note
+ * that authentication may still have
+ * failed.
+ * @access public
+ */
+ function authenticate($username, $password) {
+ return $this->_failOnError(
+ $this->_browser->authenticate($username, $password));
+ }
+
+ /**
+ * Gets the cookie value for the current browser context.
+ * @param string $name Name of cookie.
+ * @return string Value of cookie or false if unset.
+ * @access public
+ */
+ function getCookie($name) {
+ return $this->_browser->getCurrentCookieValue($name);
+ }
+
+ /**
+ * Sets a cookie in the current browser.
+ * @param string $name Name of cookie.
+ * @param string $value Cookie value.
+ * @param string $host Host upon which the cookie is valid.
+ * @param string $path Cookie path if not host wide.
+ * @param string $expiry Expiry date.
+ * @access public
+ */
+ function setCookie($name, $value, $host = false, $path = '/', $expiry = false) {
+ $this->_browser->setCookie($name, $value, $host, $path, $expiry);
+ }
+
+ /**
+ * Accessor for current frame focus. Will be
+ * false if no frame has focus.
+ * @return integer/string/boolean Label if any, otherwise
+ * the position in the frameset
+ * or false if none.
+ * @access public
+ */
+ function getFrameFocus() {
+ return $this->_browser->getFrameFocus();
+ }
+
+ /**
+ * Sets the focus by index. The integer index starts from 1.
+ * @param integer $choice Chosen frame.
+ * @return boolean True if frame exists.
+ * @access public
+ */
+ function setFrameFocusByIndex($choice) {
+ return $this->_browser->setFrameFocusByIndex($choice);
+ }
+
+ /**
+ * Sets the focus by name.
+ * @param string $name Chosen frame.
+ * @return boolean True if frame exists.
+ * @access public
+ */
+ function setFrameFocus($name) {
+ return $this->_browser->setFrameFocus($name);
+ }
+
+ /**
+ * Clears the frame focus. All frames will be searched
+ * for content.
+ * @access public
+ */
+ function clearFrameFocus() {
+ return $this->_browser->clearFrameFocus();
+ }
+
+ /**
+ * Clicks a visible text item. Will first try buttons,
+ * then links and then images.
+ * @param string $label Visible text or alt text.
+ * @return string/boolean Raw page or false.
+ * @access public
+ */
+ function click($label) {
+ return $this->_failOnError($this->_browser->click($label));
+ }
+
+ /**
+ * Checks for a click target.
+ * @param string $label Visible text or alt text.
+ * @return boolean True if click target.
+ * @access public
+ */
+ function assertClickable($label, $message = '%s') {
+ return $this->assertTrue(
+ $this->_browser->isClickable($label),
+ sprintf($message, "Click target [$label] should exist"));
+ }
+
+ /**
+ * Clicks the submit button by label. The owning
+ * form will be submitted by this.
+ * @param string $label Button label. An unlabeled
+ * button can be triggered by 'Submit'.
+ * @param hash $additional Additional form values.
+ * @return boolean/string Page on success, else false.
+ * @access public
+ */
+ function clickSubmit($label = 'Submit', $additional = false) {
+ return $this->_failOnError(
+ $this->_browser->clickSubmit($label, $additional));
+ }
+
+ /**
+ * Clicks the submit button by name attribute. The owning
+ * form will be submitted by this.
+ * @param string $name Name attribute of button.
+ * @param hash $additional Additional form values.
+ * @return boolean/string Page on success.
+ * @access public
+ */
+ function clickSubmitByName($name, $additional = false) {
+ return $this->_failOnError(
+ $this->_browser->clickSubmitByName($name, $additional));
+ }
+
+ /**
+ * Clicks the submit button by ID attribute. The owning
+ * form will be submitted by this.
+ * @param string $id ID attribute of button.
+ * @param hash $additional Additional form values.
+ * @return boolean/string Page on success.
+ * @access public
+ */
+ function clickSubmitById($id, $additional = false) {
+ return $this->_failOnError(
+ $this->_browser->clickSubmitById($id, $additional));
+ }
+
+ /**
+ * Checks for a valid button label.
+ * @param string $label Visible text.
+ * @return boolean True if click target.
+ * @access public
+ */
+ function assertSubmit($label, $message = '%s') {
+ return $this->assertTrue(
+ $this->_browser->isSubmit($label),
+ sprintf($message, "Submit button [$label] should exist"));
+ }
+
+ /**
+ * Clicks the submit image by some kind of label. Usually
+ * the alt tag or the nearest equivalent. The owning
+ * form will be submitted by this. Clicking outside of
+ * the boundary of the coordinates will result in
+ * a failure.
+ * @param string $label Alt attribute of button.
+ * @param integer $x X-coordinate of imaginary click.
+ * @param integer $y Y-coordinate of imaginary click.
+ * @param hash $additional Additional form values.
+ * @return boolean/string Page on success.
+ * @access public
+ */
+ function clickImage($label, $x = 1, $y = 1, $additional = false) {
+ return $this->_failOnError(
+ $this->_browser->clickImage($label, $x, $y, $additional));
+ }
+
+ /**
+ * Clicks the submit image by the name. Usually
+ * the alt tag or the nearest equivalent. The owning
+ * form will be submitted by this. Clicking outside of
+ * the boundary of the coordinates will result in
+ * a failure.
+ * @param string $name Name attribute of button.
+ * @param integer $x X-coordinate of imaginary click.
+ * @param integer $y Y-coordinate of imaginary click.
+ * @param hash $additional Additional form values.
+ * @return boolean/string Page on success.
+ * @access public
+ */
+ function clickImageByName($name, $x = 1, $y = 1, $additional = false) {
+ return $this->_failOnError(
+ $this->_browser->clickImageByName($name, $x, $y, $additional));
+ }
+
+ /**
+ * Clicks the submit image by ID attribute. The owning
+ * form will be submitted by this. Clicking outside of
+ * the boundary of the coordinates will result in
+ * a failure.
+ * @param integer/string $id ID attribute of button.
+ * @param integer $x X-coordinate of imaginary click.
+ * @param integer $y Y-coordinate of imaginary click.
+ * @param hash $additional Additional form values.
+ * @return boolean/string Page on success.
+ * @access public
+ */
+ function clickImageById($id, $x = 1, $y = 1, $additional = false) {
+ return $this->_failOnError(
+ $this->_browser->clickImageById($id, $x, $y, $additional));
+ }
+
+ /**
+ * Checks for a valid image with atht alt text or title.
+ * @param string $label Visible text.
+ * @return boolean True if click target.
+ * @access public
+ */
+ function assertImage($label, $message = '%s') {
+ return $this->assertTrue(
+ $this->_browser->isImage($label),
+ sprintf($message, "Image with text [$label] should exist"));
+ }
+
+ /**
+ * Submits a form by the ID.
+ * @param string $id Form ID. No button information
+ * is submitted this way.
+ * @return boolean/string Page on success.
+ * @access public
+ */
+ function submitFormById($id) {
+ return $this->_failOnError($this->_browser->submitFormById($id));
+ }
+
+ /**
+ * Follows a link by name. Will click the first link
+ * found with this link text by default, or a later
+ * one if an index is given. Match is case insensitive
+ * with normalised space.
+ * @param string $label Text between the anchor tags.
+ * @param integer $index Link position counting from zero.
+ * @return boolean/string Page on success.
+ * @access public
+ */
+ function clickLink($label, $index = 0) {
+ return $this->_failOnError($this->_browser->clickLink($label, $index));
+ }
+
+ /**
+ * Follows a link by id attribute.
+ * @param string $id ID attribute value.
+ * @return boolean/string Page on success.
+ * @access public
+ */
+ function clickLinkById($id) {
+ return $this->_failOnError($this->_browser->clickLinkById($id));
+ }
+
+ /**
+ * Tests for the presence of a link label. Match is
+ * case insensitive with normalised space.
+ * @param string $label Text between the anchor tags.
+ * @param mixed $expected Expected URL or expectation object.
+ * @param string $message Message to display. Default
+ * can be embedded with %s.
+ * @return boolean True if link present.
+ * @access public
+ */
+ function assertLink($label, $expected = true, $message = '%s') {
+ $url = $this->_browser->getLink($label);
+ if ($expected === true) {
+ return $this->assertTrue($url !== false, sprintf($message, "Link [$label] should exist"));
+ }
+ if (! SimpleExpectation::isExpectation($expected)) {
+ $expected = new IdenticalExpectation($expected);
+ }
+ return $this->assert($expected, $url->asString(), sprintf($message, "Link [$label] should match"));
+ }
+
+ /**
+ * Tests for the non-presence of a link label. Match is
+ * case insensitive with normalised space.
+ * @param string/integer $label Text between the anchor tags
+ * or ID attribute.
+ * @param string $message Message to display. Default
+ * can be embedded with %s.
+ * @return boolean True if link missing.
+ * @access public
+ */
+ function assertNoLink($label, $message = '%s') {
+ return $this->assertTrue(
+ $this->_browser->getLink($label) === false,
+ sprintf($message, "Link [$label] should not exist"));
+ }
+
+ /**
+ * Tests for the presence of a link id attribute.
+ * @param string $id Id attribute value.
+ * @param mixed $expected Expected URL or expectation object.
+ * @param string $message Message to display. Default
+ * can be embedded with %s.
+ * @return boolean True if link present.
+ * @access public
+ */
+ function assertLinkById($id, $expected = true, $message = '%s') {
+ $url = $this->_browser->getLinkById($id);
+ if ($expected === true) {
+ return $this->assertTrue($url !== false, sprintf($message, "Link ID [$id] should exist"));
+ }
+ if (! SimpleExpectation::isExpectation($expected)) {
+ $expected = new IdenticalExpectation($expected);
+ }
+ return $this->assert($expected, $url->asString(), sprintf($message, "Link ID [$id] should match"));
+ }
+
+ /**
+ * Tests for the non-presence of a link label. Match is
+ * case insensitive with normalised space.
+ * @param string $id Id attribute value.
+ * @param string $message Message to display. Default
+ * can be embedded with %s.
+ * @return boolean True if link missing.
+ * @access public
+ */
+ function assertNoLinkById($id, $message = '%s') {
+ return $this->assertTrue(
+ $this->_browser->getLinkById($id) === false,
+ sprintf($message, "Link ID [$id] should not exist"));
+ }
+
+ /**
+ * Sets all form fields with that label, or name if there
+ * is no label attached.
+ * @param string $name Name of field in forms.
+ * @param string $value New value of field.
+ * @return boolean True if field exists, otherwise false.
+ * @access public
+ */
+ function setField($label, $value) {
+ return $this->_browser->setField($label, $value);
+ }
+
+ /**
+ * Sets all form fields with that name.
+ * @param string $name Name of field in forms.
+ * @param string $value New value of field.
+ * @return boolean True if field exists, otherwise false.
+ * @access public
+ */
+ function setFieldByName($name, $value) {
+ return $this->_browser->setFieldByName($name, $value);
+ }
+
+ /**
+ * Sets all form fields with that name.
+ * @param string/integer $id Id of field in forms.
+ * @param string $value New value of field.
+ * @return boolean True if field exists, otherwise false.
+ * @access public
+ */
+ function setFieldById($id, $value) {
+ return $this->_browser->setFieldById($id, $value);
+ }
+
+ /**
+ * Confirms that the form element is currently set
+ * to the expected value. A missing form will always
+ * fail. If no value is given then only the existence
+ * of the field is checked.
+ * @param string $name Name of field in forms.
+ * @param mixed $expected Expected string/array value or
+ * false for unset fields.
+ * @param string $message Message to display. Default
+ * can be embedded with %s.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertField($label, $expected = true, $message = '%s') {
+ $value = $this->_browser->getField($label);
+ return $this->_assertFieldValue($label, $value, $expected, $message);
+ }
+
+ /**
+ * Confirms that the form element is currently set
+ * to the expected value. A missing form element will always
+ * fail. If no value is given then only the existence
+ * of the field is checked.
+ * @param string $name Name of field in forms.
+ * @param mixed $expected Expected string/array value or
+ * false for unset fields.
+ * @param string $message Message to display. Default
+ * can be embedded with %s.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertFieldByName($name, $expected = true, $message = '%s') {
+ $value = $this->_browser->getFieldByName($name);
+ return $this->_assertFieldValue($name, $value, $expected, $message);
+ }
+
+ /**
+ * Confirms that the form element is currently set
+ * to the expected value. A missing form will always
+ * fail. If no ID is given then only the existence
+ * of the field is checked.
+ * @param string/integer $id Name of field in forms.
+ * @param mixed $expected Expected string/array value or
+ * false for unset fields.
+ * @param string $message Message to display. Default
+ * can be embedded with %s.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertFieldById($id, $expected = true, $message = '%s') {
+ $value = $this->_browser->getFieldById($id);
+ return $this->_assertFieldValue($id, $value, $expected, $message);
+ }
+
+ /**
+ * Tests the field value against the expectation.
+ * @param string $identifier Name, ID or label.
+ * @param mixed $value Current field value.
+ * @param mixed $expected Expected value to match.
+ * @param string $message Failure message.
+ * @return boolean True if pass
+ * @access protected
+ */
+ function _assertFieldValue($identifier, $value, $expected, $message) {
+ if ($expected === true) {
+ return $this->assertTrue(
+ isset($value),
+ sprintf($message, "Field [$identifier] should exist"));
+ }
+ if (! SimpleExpectation::isExpectation($expected)) {
+ $identifier = str_replace('%', '%%', $identifier);
+ $expected = new FieldExpectation(
+ $expected,
+ "Field [$identifier] should match with [%s]");
+ }
+ return $this->assert($expected, $value, $message);
+ }
+
+ /**
+ * Checks the response code against a list
+ * of possible values.
+ * @param array $responses Possible responses for a pass.
+ * @param string $message Message to display. Default
+ * can be embedded with %s.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertResponse($responses, $message = '%s') {
+ $responses = (is_array($responses) ? $responses : array($responses));
+ $code = $this->_browser->getResponseCode();
+ $message = sprintf($message, "Expecting response in [" .
+ implode(", ", $responses) . "] got [$code]");
+ return $this->assertTrue(in_array($code, $responses), $message);
+ }
+
+ /**
+ * Checks the mime type against a list
+ * of possible values.
+ * @param array $types Possible mime types for a pass.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertMime($types, $message = '%s') {
+ $types = (is_array($types) ? $types : array($types));
+ $type = $this->_browser->getMimeType();
+ $message = sprintf($message, "Expecting mime type in [" .
+ implode(", ", $types) . "] got [$type]");
+ return $this->assertTrue(in_array($type, $types), $message);
+ }
+
+ /**
+ * Attempt to match the authentication type within
+ * the security realm we are currently matching.
+ * @param string $authentication Usually basic.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertAuthentication($authentication = false, $message = '%s') {
+ if (! $authentication) {
+ $message = sprintf($message, "Expected any authentication type, got [" .
+ $this->_browser->getAuthentication() . "]");
+ return $this->assertTrue(
+ $this->_browser->getAuthentication(),
+ $message);
+ } else {
+ $message = sprintf($message, "Expected authentication [$authentication] got [" .
+ $this->_browser->getAuthentication() . "]");
+ return $this->assertTrue(
+ strtolower($this->_browser->getAuthentication()) == strtolower($authentication),
+ $message);
+ }
+ }
+
+ /**
+ * Checks that no authentication is necessary to view
+ * the desired page.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertNoAuthentication($message = '%s') {
+ $message = sprintf($message, "Expected no authentication type, got [" .
+ $this->_browser->getAuthentication() . "]");
+ return $this->assertFalse($this->_browser->getAuthentication(), $message);
+ }
+
+ /**
+ * Attempts to match the current security realm.
+ * @param string $realm Name of security realm.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertRealm($realm, $message = '%s') {
+ if (! SimpleExpectation::isExpectation($realm)) {
+ $realm = new EqualExpectation($realm);
+ }
+ return $this->assert(
+ $realm,
+ $this->_browser->getRealm(),
+ "Expected realm -> $message");
+ }
+
+ /**
+ * Checks each header line for the required value. If no
+ * value is given then only an existence check is made.
+ * @param string $header Case insensitive header name.
+ * @param mixed $value Case sensitive trimmed string to
+ * match against. An expectation object
+ * can be used for pattern matching.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertHeader($header, $value = false, $message = '%s') {
+ return $this->assert(
+ new HttpHeaderExpectation($header, $value),
+ $this->_browser->getHeaders(),
+ $message);
+ }
+
+ /**
+ * @deprecated
+ */
+ function assertHeaderPattern($header, $pattern, $message = '%s') {
+ return $this->assert(
+ new HttpHeaderExpectation($header, new PatternExpectation($pattern)),
+ $this->_browser->getHeaders(),
+ $message);
+ }
+
+ /**
+ * Confirms that the header type has not been received.
+ * Only the landing page is checked. If you want to check
+ * redirect pages, then you should limit redirects so
+ * as to capture the page you want.
+ * @param string $header Case insensitive header name.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertNoHeader($header, $message = '%s') {
+ return $this->assert(
+ new NoHttpHeaderExpectation($header),
+ $this->_browser->getHeaders(),
+ $message);
+ }
+
+ /**
+ * @deprecated
+ */
+ function assertNoUnwantedHeader($header, $message = '%s') {
+ return $this->assertNoHeader($header, $message);
+ }
+
+ /**
+ * Tests the text between the title tags.
+ * @param string/SimpleExpectation $title Expected title.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertTitle($title = false, $message = '%s') {
+ if (! SimpleExpectation::isExpectation($title)) {
+ $title = new EqualExpectation($title);
+ }
+ return $this->assert($title, $this->_browser->getTitle(), $message);
+ }
+
+ /**
+ * Will trigger a pass if the text is found in the plain
+ * text form of the page.
+ * @param string $text Text to look for.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertText($text, $message = '%s') {
+ return $this->assert(
+ new TextExpectation($text),
+ $this->_browser->getContentAsText(),
+ $message);
+ }
+
+ /**
+ * @deprecated
+ */
+ function assertWantedText($text, $message = '%s') {
+ return $this->assertText($text, $message);
+ }
+
+ /**
+ * Will trigger a pass if the text is not found in the plain
+ * text form of the page.
+ * @param string $text Text to look for.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertNoText($text, $message = '%s') {
+ return $this->assert(
+ new NoTextExpectation($text),
+ $this->_browser->getContentAsText(),
+ $message);
+ }
+
+ /**
+ * @deprecated
+ */
+ function assertNoUnwantedText($text, $message = '%s') {
+ return $this->assertNoText($text, $message);
+ }
+
+ /**
+ * Will trigger a pass if the Perl regex pattern
+ * is found in the raw content.
+ * @param string $pattern Perl regex to look for including
+ * the regex delimiters.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertPattern($pattern, $message = '%s') {
+ return $this->assert(
+ new PatternExpectation($pattern),
+ $this->_browser->getContent(),
+ $message);
+ }
+
+ /**
+ * @deprecated
+ */
+ function assertWantedPattern($pattern, $message = '%s') {
+ return $this->assertPattern($pattern, $message);
+ }
+
+ /**
+ * Will trigger a pass if the perl regex pattern
+ * is not present in raw content.
+ * @param string $pattern Perl regex to look for including
+ * the regex delimiters.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertNoPattern($pattern, $message = '%s') {
+ return $this->assert(
+ new NoPatternExpectation($pattern),
+ $this->_browser->getContent(),
+ $message);
+ }
+
+ /**
+ * @deprecated
+ */
+ function assertNoUnwantedPattern($pattern, $message = '%s') {
+ return $this->assertNoPattern($pattern, $message);
+ }
+
+ /**
+ * Checks that a cookie is set for the current page
+ * and optionally checks the value.
+ * @param string $name Name of cookie to test.
+ * @param string $expected Expected value as a string or
+ * false if any value will do.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertCookie($name, $expected = false, $message = '%s') {
+ $value = $this->getCookie($name);
+ if (! $expected) {
+ return $this->assertTrue(
+ $value,
+ sprintf($message, "Expecting cookie [$name]"));
+ }
+ if (! SimpleExpectation::isExpectation($expected)) {
+ $expected = new EqualExpectation($expected);
+ }
+ return $this->assert($expected, $value, "Expecting cookie [$name] -> $message");
+ }
+
+ /**
+ * Checks that no cookie is present or that it has
+ * been successfully cleared.
+ * @param string $name Name of cookie to test.
+ * @param string $message Message to display.
+ * @return boolean True if pass.
+ * @access public
+ */
+ function assertNoCookie($name, $message = '%s') {
+ return $this->assertTrue(
+ $this->getCookie($name) === false,
+ sprintf($message, "Not expecting cookie [$name]"));
+ }
+
+ /**
+ * Called from within the test methods to register
+ * passes and failures.
+ * @param boolean $result Pass on true.
+ * @param string $message Message to display describing
+ * the test state.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertTrue($result, $message = false) {
+ return $this->assert(new TrueExpectation(), $result, $message);
+ }
+
+ /**
+ * Will be true on false and vice versa. False
+ * is the PHP definition of false, so that null,
+ * empty strings, zero and an empty array all count
+ * as false.
+ * @param boolean $result Pass on false.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertFalse($result, $message = '%s') {
+ return $this->assert(new FalseExpectation(), $result, $message);
+ }
+
+ /**
+ * Will trigger a pass if the two parameters have
+ * the same value only. Otherwise a fail. This
+ * is for testing hand extracted text, etc.
+ * @param mixed $first Value to compare.
+ * @param mixed $second Value to compare.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertEqual($first, $second, $message = '%s') {
+ return $this->assert(
+ new EqualExpectation($first),
+ $second,
+ $message);
+ }
+
+ /**
+ * Will trigger a pass if the two parameters have
+ * a different value. Otherwise a fail. This
+ * is for testing hand extracted text, etc.
+ * @param mixed $first Value to compare.
+ * @param mixed $second Value to compare.
+ * @param string $message Message to display.
+ * @return boolean True on pass
+ * @access public
+ */
+ function assertNotEqual($first, $second, $message = '%s') {
+ return $this->assert(
+ new NotEqualExpectation($first),
+ $second,
+ $message);
+ }
+
+ /**
+ * Uses a stack trace to find the line of an assertion.
+ * @return string Line number of first assert*
+ * method embedded in format string.
+ * @access public
+ */
+ function getAssertionLine() {
+ $trace = new SimpleStackTrace(array('assert', 'click', 'pass', 'fail'));
+ return $trace->traceMethod();
+ }
+ }
+?> \ No newline at end of file
diff --git a/tests/simpletest/xml.php b/tests/simpletest/xml.php
new file mode 100755
index 0000000000..e64caa9ff7
--- /dev/null
+++ b/tests/simpletest/xml.php
@@ -0,0 +1,647 @@
+<?php
+ /**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage UnitTester
+ * @version $Id: xml.php,v 1.24 2006/11/21 01:20:18 lastcraft Exp $
+ */
+
+ /**#@+
+ * include other SimpleTest class files
+ */
+ require_once(dirname(__FILE__) . '/scorer.php');
+ /**#@-*/
+
+ /**
+ * Creates the XML needed for remote communication
+ * by SimpleTest.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class XmlReporter extends SimpleReporter {
+ var $_indent;
+ var $_namespace;
+
+ /**
+ * Sets up indentation and namespace.
+ * @param string $namespace Namespace to add to each tag.
+ * @param string $indent Indenting to add on each nesting.
+ * @access public
+ */
+ function XmlReporter($namespace = false, $indent = ' ') {
+ $this->SimpleReporter();
+ $this->_namespace = ($namespace ? $namespace . ':' : '');
+ $this->_indent = $indent;
+ }
+
+ /**
+ * Calculates the pretty printing indent level
+ * from the current level of nesting.
+ * @param integer $offset Extra indenting level.
+ * @return string Leading space.
+ * @access protected
+ */
+ function _getIndent($offset = 0) {
+ return str_repeat(
+ $this->_indent,
+ count($this->getTestList()) + $offset);
+ }
+
+ /**
+ * Converts character string to parsed XML
+ * entities string.
+ * @param string text Unparsed character data.
+ * @return string Parsed character data.
+ * @access public
+ */
+ function toParsedXml($text) {
+ return str_replace(
+ array('&', '<', '>', '"', '\''),
+ array('&amp;', '&lt;', '&gt;', '&quot;', '&apos;'),
+ $text);
+ }
+
+ /**
+ * Paints the start of a group test.
+ * @param string $test_name Name of test that is starting.
+ * @param integer $size Number of test cases starting.
+ * @access public
+ */
+ function paintGroupStart($test_name, $size) {
+ parent::paintGroupStart($test_name, $size);
+ print $this->_getIndent();
+ print "<" . $this->_namespace . "group size=\"$size\">\n";
+ print $this->_getIndent(1);
+ print "<" . $this->_namespace . "name>" .
+ $this->toParsedXml($test_name) .
+ "</" . $this->_namespace . "name>\n";
+ }
+
+ /**
+ * Paints the end of a group test.
+ * @param string $test_name Name of test that is ending.
+ * @access public
+ */
+ function paintGroupEnd($test_name) {
+ print $this->_getIndent();
+ print "</" . $this->_namespace . "group>\n";
+ parent::paintGroupEnd($test_name);
+ }
+
+ /**
+ * Paints the start of a test case.
+ * @param string $test_name Name of test that is starting.
+ * @access public
+ */
+ function paintCaseStart($test_name) {
+ parent::paintCaseStart($test_name);
+ print $this->_getIndent();
+ print "<" . $this->_namespace . "case>\n";
+ print $this->_getIndent(1);
+ print "<" . $this->_namespace . "name>" .
+ $this->toParsedXml($test_name) .
+ "</" . $this->_namespace . "name>\n";
+ }
+
+ /**
+ * Paints the end of a test case.
+ * @param string $test_name Name of test that is ending.
+ * @access public
+ */
+ function paintCaseEnd($test_name) {
+ print $this->_getIndent();
+ print "</" . $this->_namespace . "case>\n";
+ parent::paintCaseEnd($test_name);
+ }
+
+ /**
+ * Paints the start of a test method.
+ * @param string $test_name Name of test that is starting.
+ * @access public
+ */
+ function paintMethodStart($test_name) {
+ parent::paintMethodStart($test_name);
+ print $this->_getIndent();
+ print "<" . $this->_namespace . "test>\n";
+ print $this->_getIndent(1);
+ print "<" . $this->_namespace . "name>" .
+ $this->toParsedXml($test_name) .
+ "</" . $this->_namespace . "name>\n";
+ }
+
+ /**
+ * Paints the end of a test method.
+ * @param string $test_name Name of test that is ending.
+ * @param integer $progress Number of test cases ending.
+ * @access public
+ */
+ function paintMethodEnd($test_name) {
+ print $this->_getIndent();
+ print "</" . $this->_namespace . "test>\n";
+ parent::paintMethodEnd($test_name);
+ }
+
+ /**
+ * Paints pass as XML.
+ * @param string $message Message to encode.
+ * @access public
+ */
+ function paintPass($message) {
+ parent::paintPass($message);
+ print $this->_getIndent(1);
+ print "<" . $this->_namespace . "pass>";
+ print $this->toParsedXml($message);
+ print "</" . $this->_namespace . "pass>\n";
+ }
+
+ /**
+ * Paints failure as XML.
+ * @param string $message Message to encode.
+ * @access public
+ */
+ function paintFail($message) {
+ parent::paintFail($message);
+ print $this->_getIndent(1);
+ print "<" . $this->_namespace . "fail>";
+ print $this->toParsedXml($message);
+ print "</" . $this->_namespace . "fail>\n";
+ }
+
+ /**
+ * Paints error as XML.
+ * @param string $message Message to encode.
+ * @access public
+ */
+ function paintError($message) {
+ parent::paintError($message);
+ print $this->_getIndent(1);
+ print "<" . $this->_namespace . "exception>";
+ print $this->toParsedXml($message);
+ print "</" . $this->_namespace . "exception>\n";
+ }
+
+ /**
+ * Paints exception as XML.
+ * @param Exception $exception Exception to encode.
+ * @access public
+ */
+ function paintException($exception) {
+ parent::paintException($exception);
+ print $this->_getIndent(1);
+ print "<" . $this->_namespace . "exception>";
+ $message = 'Unexpected exception of type [' . get_class($exception) .
+ '] with message ['. $exception->getMessage() .
+ '] in ['. $exception->getFile() .
+ ' line ' . $exception->getLine() . ']';
+ print $this->toParsedXml($message);
+ print "</" . $this->_namespace . "exception>\n";
+ }
+
+ /**
+ * Paints the skipping message and tag.
+ * @param string $message Text to display in skip tag.
+ * @access public
+ */
+ function paintSkip($message) {
+ parent::paintSkip($message);
+ print $this->_getIndent(1);
+ print "<" . $this->_namespace . "skip>";
+ print $this->toParsedXml($message);
+ print "</" . $this->_namespace . "skip>\n";
+ }
+
+ /**
+ * Paints a simple supplementary message.
+ * @param string $message Text to display.
+ * @access public
+ */
+ function paintMessage($message) {
+ parent::paintMessage($message);
+ print $this->_getIndent(1);
+ print "<" . $this->_namespace . "message>";
+ print $this->toParsedXml($message);
+ print "</" . $this->_namespace . "message>\n";
+ }
+
+ /**
+ * Paints a formatted ASCII message such as a
+ * variable dump.
+ * @param string $message Text to display.
+ * @access public
+ */
+ function paintFormattedMessage($message) {
+ parent::paintFormattedMessage($message);
+ print $this->_getIndent(1);
+ print "<" . $this->_namespace . "formatted>";
+ print "<![CDATA[$message]]>";
+ print "</" . $this->_namespace . "formatted>\n";
+ }
+
+ /**
+ * Serialises the event object.
+ * @param string $type Event type as text.
+ * @param mixed $payload Message or object.
+ * @access public
+ */
+ function paintSignal($type, &$payload) {
+ parent::paintSignal($type, $payload);
+ print $this->_getIndent(1);
+ print "<" . $this->_namespace . "signal type=\"$type\">";
+ print "<![CDATA[" . serialize($payload) . "]]>";
+ print "</" . $this->_namespace . "signal>\n";
+ }
+
+ /**
+ * Paints the test document header.
+ * @param string $test_name First test top level
+ * to start.
+ * @access public
+ * @abstract
+ */
+ function paintHeader($test_name) {
+ if (! SimpleReporter::inCli()) {
+ header('Content-type: text/xml');
+ }
+ print "<?xml version=\"1.0\"";
+ if ($this->_namespace) {
+ print " xmlns:" . $this->_namespace .
+ "=\"www.lastcraft.com/SimpleTest/Beta3/Report\"";
+ }
+ print "?>\n";
+ print "<" . $this->_namespace . "run>\n";
+ }
+
+ /**
+ * Paints the test document footer.
+ * @param string $test_name The top level test.
+ * @access public
+ * @abstract
+ */
+ function paintFooter($test_name) {
+ print "</" . $this->_namespace . "run>\n";
+ }
+ }
+
+ /**
+ * Accumulator for incoming tag. Holds the
+ * incoming test structure information for
+ * later dispatch to the reporter.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class NestingXmlTag {
+ var $_name;
+ var $_attributes;
+
+ /**
+ * Sets the basic test information except
+ * the name.
+ * @param hash $attributes Name value pairs.
+ * @access public
+ */
+ function NestingXmlTag($attributes) {
+ $this->_name = false;
+ $this->_attributes = $attributes;
+ }
+
+ /**
+ * Sets the test case/method name.
+ * @param string $name Name of test.
+ * @access public
+ */
+ function setName($name) {
+ $this->_name = $name;
+ }
+
+ /**
+ * Accessor for name.
+ * @return string Name of test.
+ * @access public
+ */
+ function getName() {
+ return $this->_name;
+ }
+
+ /**
+ * Accessor for attributes.
+ * @return hash All attributes.
+ * @access protected
+ */
+ function _getAttributes() {
+ return $this->_attributes;
+ }
+ }
+
+ /**
+ * Accumulator for incoming method tag. Holds the
+ * incoming test structure information for
+ * later dispatch to the reporter.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class NestingMethodTag extends NestingXmlTag {
+
+ /**
+ * Sets the basic test information except
+ * the name.
+ * @param hash $attributes Name value pairs.
+ * @access public
+ */
+ function NestingMethodTag($attributes) {
+ $this->NestingXmlTag($attributes);
+ }
+
+ /**
+ * Signals the appropriate start event on the
+ * listener.
+ * @param SimpleReporter $listener Target for events.
+ * @access public
+ */
+ function paintStart(&$listener) {
+ $listener->paintMethodStart($this->getName());
+ }
+
+ /**
+ * Signals the appropriate end event on the
+ * listener.
+ * @param SimpleReporter $listener Target for events.
+ * @access public
+ */
+ function paintEnd(&$listener) {
+ $listener->paintMethodEnd($this->getName());
+ }
+ }
+
+ /**
+ * Accumulator for incoming case tag. Holds the
+ * incoming test structure information for
+ * later dispatch to the reporter.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class NestingCaseTag extends NestingXmlTag {
+
+ /**
+ * Sets the basic test information except
+ * the name.
+ * @param hash $attributes Name value pairs.
+ * @access public
+ */
+ function NestingCaseTag($attributes) {
+ $this->NestingXmlTag($attributes);
+ }
+
+ /**
+ * Signals the appropriate start event on the
+ * listener.
+ * @param SimpleReporter $listener Target for events.
+ * @access public
+ */
+ function paintStart(&$listener) {
+ $listener->paintCaseStart($this->getName());
+ }
+
+ /**
+ * Signals the appropriate end event on the
+ * listener.
+ * @param SimpleReporter $listener Target for events.
+ * @access public
+ */
+ function paintEnd(&$listener) {
+ $listener->paintCaseEnd($this->getName());
+ }
+ }
+
+ /**
+ * Accumulator for incoming group tag. Holds the
+ * incoming test structure information for
+ * later dispatch to the reporter.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class NestingGroupTag extends NestingXmlTag {
+
+ /**
+ * Sets the basic test information except
+ * the name.
+ * @param hash $attributes Name value pairs.
+ * @access public
+ */
+ function NestingGroupTag($attributes) {
+ $this->NestingXmlTag($attributes);
+ }
+
+ /**
+ * Signals the appropriate start event on the
+ * listener.
+ * @param SimpleReporter $listener Target for events.
+ * @access public
+ */
+ function paintStart(&$listener) {
+ $listener->paintGroupStart($this->getName(), $this->getSize());
+ }
+
+ /**
+ * Signals the appropriate end event on the
+ * listener.
+ * @param SimpleReporter $listener Target for events.
+ * @access public
+ */
+ function paintEnd(&$listener) {
+ $listener->paintGroupEnd($this->getName());
+ }
+
+ /**
+ * The size in the attributes.
+ * @return integer Value of size attribute or zero.
+ * @access public
+ */
+ function getSize() {
+ $attributes = $this->_getAttributes();
+ if (isset($attributes['SIZE'])) {
+ return (integer)$attributes['SIZE'];
+ }
+ return 0;
+ }
+ }
+
+ /**
+ * Parser for importing the output of the XmlReporter.
+ * Dispatches that output to another reporter.
+ * @package SimpleTest
+ * @subpackage UnitTester
+ */
+ class SimpleTestXmlParser {
+ var $_listener;
+ var $_expat;
+ var $_tag_stack;
+ var $_in_content_tag;
+ var $_content;
+ var $_attributes;
+
+ /**
+ * Loads a listener with the SimpleReporter
+ * interface.
+ * @param SimpleReporter $listener Listener of tag events.
+ * @access public
+ */
+ function SimpleTestXmlParser(&$listener) {
+ $this->_listener = &$listener;
+ $this->_expat = &$this->_createParser();
+ $this->_tag_stack = array();
+ $this->_in_content_tag = false;
+ $this->_content = '';
+ $this->_attributes = array();
+ }
+
+ /**
+ * Parses a block of XML sending the results to
+ * the listener.
+ * @param string $chunk Block of text to read.
+ * @return boolean True if valid XML.
+ * @access public
+ */
+ function parse($chunk) {
+ if (! xml_parse($this->_expat, $chunk)) {
+ trigger_error('XML parse error with ' .
+ xml_error_string(xml_get_error_code($this->_expat)));
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Sets up expat as the XML parser.
+ * @return resource Expat handle.
+ * @access protected
+ */
+ function &_createParser() {
+ $expat = xml_parser_create();
+ xml_set_object($expat, $this);
+ xml_set_element_handler($expat, '_startElement', '_endElement');
+ xml_set_character_data_handler($expat, '_addContent');
+ xml_set_default_handler($expat, '_default');
+ return $expat;
+ }
+
+ /**
+ * Opens a new test nesting level.
+ * @return NestedXmlTag The group, case or method tag
+ * to start.
+ * @access private
+ */
+ function _pushNestingTag($nested) {
+ array_unshift($this->_tag_stack, $nested);
+ }
+
+ /**
+ * Accessor for current test structure tag.
+ * @return NestedXmlTag The group, case or method tag
+ * being parsed.
+ * @access private
+ */
+ function &_getCurrentNestingTag() {
+ return $this->_tag_stack[0];
+ }
+
+ /**
+ * Ends a nesting tag.
+ * @return NestedXmlTag The group, case or method tag
+ * just finished.
+ * @access private
+ */
+ function _popNestingTag() {
+ return array_shift($this->_tag_stack);
+ }
+
+ /**
+ * Test if tag is a leaf node with only text content.
+ * @param string $tag XML tag name.
+ * @return @boolean True if leaf, false if nesting.
+ * @private
+ */
+ function _isLeaf($tag) {
+ return in_array($tag, array(
+ 'NAME', 'PASS', 'FAIL', 'EXCEPTION', 'SKIP', 'MESSAGE', 'FORMATTED', 'SIGNAL'));
+ }
+
+ /**
+ * Handler for start of event element.
+ * @param resource $expat Parser handle.
+ * @param string $tag Element name.
+ * @param hash $attributes Name value pairs.
+ * Attributes without content
+ * are marked as true.
+ * @access protected
+ */
+ function _startElement($expat, $tag, $attributes) {
+ $this->_attributes = $attributes;
+ if ($tag == 'GROUP') {
+ $this->_pushNestingTag(new NestingGroupTag($attributes));
+ } elseif ($tag == 'CASE') {
+ $this->_pushNestingTag(new NestingCaseTag($attributes));
+ } elseif ($tag == 'TEST') {
+ $this->_pushNestingTag(new NestingMethodTag($attributes));
+ } elseif ($this->_isLeaf($tag)) {
+ $this->_in_content_tag = true;
+ $this->_content = '';
+ }
+ }
+
+ /**
+ * End of element event.
+ * @param resource $expat Parser handle.
+ * @param string $tag Element name.
+ * @access protected
+ */
+ function _endElement($expat, $tag) {
+ $this->_in_content_tag = false;
+ if (in_array($tag, array('GROUP', 'CASE', 'TEST'))) {
+ $nesting_tag = $this->_popNestingTag();
+ $nesting_tag->paintEnd($this->_listener);
+ } elseif ($tag == 'NAME') {
+ $nesting_tag = &$this->_getCurrentNestingTag();
+ $nesting_tag->setName($this->_content);
+ $nesting_tag->paintStart($this->_listener);
+ } elseif ($tag == 'PASS') {
+ $this->_listener->paintPass($this->_content);
+ } elseif ($tag == 'FAIL') {
+ $this->_listener->paintFail($this->_content);
+ } elseif ($tag == 'EXCEPTION') {
+ $this->_listener->paintError($this->_content);
+ } elseif ($tag == 'SKIP') {
+ $this->_listener->paintSkip($this->_content);
+ } elseif ($tag == 'SIGNAL') {
+ $this->_listener->paintSignal(
+ $this->_attributes['TYPE'],
+ unserialize($this->_content));
+ } elseif ($tag == 'MESSAGE') {
+ $this->_listener->paintMessage($this->_content);
+ } elseif ($tag == 'FORMATTED') {
+ $this->_listener->paintFormattedMessage($this->_content);
+ }
+ }
+
+ /**
+ * Content between start and end elements.
+ * @param resource $expat Parser handle.
+ * @param string $text Usually output messages.
+ * @access protected
+ */
+ function _addContent($expat, $text) {
+ if ($this->_in_content_tag) {
+ $this->_content .= $text;
+ }
+ return true;
+ }
+
+ /**
+ * XML and Doctype handler. Discards all such content.
+ * @param resource $expat Parser handle.
+ * @param string $default Text of default content.
+ * @access protected
+ */
+ function _default($expat, $default) {
+ }
+ }
+?>